summaryrefslogtreecommitdiff
path: root/addons/web/static
diff options
context:
space:
mode:
authorAaron Bohy <aab@odoo.com>2016-04-08 14:53:34 +0200
committerGéry Debongnie <ged@odoo.com>2016-04-21 15:21:39 +0200
commit977db823c7c84e9edc7c8cf8384eb9cf47275b3a (patch)
treec3312f745baf11d51f976a60d6e285480f557d4c /addons/web/static
parente1bfd3fbda97ac7a64a585b07be161d5be606cf9 (diff)
[REF] web: stop duplicating web
Avoid duplicating web addon in enterprise by extracting a common basis. Enterprise features stay in enterprise, but use that common basis. Mainly: - JS refactoring and linting - Conversion of .sass into .less split into multiple files - Templates cleaning and DOM simplification - Re-generation of web.pot, and update of .po files
Diffstat (limited to 'addons/web/static')
-rw-r--r--addons/web/static/lib/bootstrap/css/bootstrap-theme.css587
-rw-r--r--addons/web/static/lib/bootstrap/css/bootstrap-theme.css.map1
-rw-r--r--addons/web/static/lib/bootstrap/css/bootstrap-theme.min.css5
-rw-r--r--addons/web/static/lib/bootstrap/css/bootstrap.css.map1
-rw-r--r--addons/web/static/lib/bootstrap/css/bootstrap.min.css5
-rw-r--r--[-rwxr-xr-x]addons/web/static/lib/nvd3/d3.v3.js0
-rw-r--r--addons/web/static/lib/py.js/.hg_archival.txt5
-rw-r--r--addons/web/static/src/css/data_export.css89
-rw-r--r--addons/web/static/src/css/full.css12
-rw-r--r--addons/web/static/src/css/ie.css29
-rw-r--r--addons/web/static/src/img/down-arrow.pngbin125 -> 0 bytes
-rw-r--r--addons/web/static/src/js/abstract_web_client.js245
-rw-r--r--addons/web/static/src/js/action_manager.js212
-rw-r--r--addons/web/static/src/js/apps.js173
-rw-r--r--addons/web/static/src/js/boot.js1
-rw-r--r--addons/web/static/src/js/compatibility.js4
-rw-r--r--addons/web/static/src/js/control_panel.js51
-rw-r--r--addons/web/static/src/js/framework/ajax.js17
-rw-r--r--addons/web/static/src/js/framework/core.js16
-rw-r--r--addons/web/static/src/js/framework/crash_manager.js17
-rw-r--r--addons/web/static/src/js/framework/data.js12
-rw-r--r--addons/web/static/src/js/framework/misc.js64
-rw-r--r--addons/web/static/src/js/framework/model.js6
-rw-r--r--addons/web/static/src/js/framework/session.js2
-rw-r--r--addons/web/static/src/js/framework/utils.js1
-rw-r--r--addons/web/static/src/js/framework/view.js36
-rw-r--r--addons/web/static/src/js/framework/widget.js2
-rw-r--r--addons/web/static/src/js/menu.js6
-rw-r--r--addons/web/static/src/js/view_manager.js142
-rw-r--r--addons/web/static/src/js/views/form_common.js75
-rw-r--r--addons/web/static/src/js/views/form_relational_widgets.js426
-rw-r--r--addons/web/static/src/js/views/form_upgrade_widgets.js101
-rw-r--r--addons/web/static/src/js/views/form_view.js439
-rw-r--r--addons/web/static/src/js/views/form_widgets.js848
-rw-r--r--addons/web/static/src/js/views/graph_view.js26
-rw-r--r--addons/web/static/src/js/views/graph_widget.js1
-rw-r--r--addons/web/static/src/js/views/list_view.js543
-rw-r--r--addons/web/static/src/js/views/list_view_editable.js41
-rw-r--r--addons/web/static/src/js/views/pivot_view.js100
-rw-r--r--addons/web/static/src/js/views/search_filters.js33
-rw-r--r--addons/web/static/src/js/views/search_inputs.js3
-rw-r--r--addons/web/static/src/js/views/search_menus.js68
-rw-r--r--addons/web/static/src/js/views/search_view.js480
-rw-r--r--addons/web/static/src/js/views/tree_view.js22
-rw-r--r--addons/web/static/src/js/web_client.js223
-rw-r--r--addons/web/static/src/js/widgets/auto_complete.js220
-rw-r--r--addons/web/static/src/js/widgets/change_password.js2
-rw-r--r--addons/web/static/src/js/widgets/data_export.js608
-rw-r--r--addons/web/static/src/js/widgets/debug_manager.js845
-rw-r--r--addons/web/static/src/js/widgets/loading.js3
-rw-r--r--addons/web/static/src/js/widgets/pager.js76
-rw-r--r--addons/web/static/src/js/widgets/sidebar.js37
-rw-r--r--addons/web/static/src/js/widgets/switch_company_menu.js79
-rw-r--r--addons/web/static/src/js/widgets/user_menu.js100
-rw-r--r--addons/web/static/src/less/bootstrap_overridden.less103
-rw-r--r--addons/web/static/src/less/control_panel.less74
-rw-r--r--addons/web/static/src/less/control_panel_layout.less70
-rw-r--r--addons/web/static/src/less/data_export.less107
-rw-r--r--addons/web/static/src/less/datepicker.less59
-rw-r--r--addons/web/static/src/less/debug_manager.less8
-rw-r--r--addons/web/static/src/less/dropdown.less79
-rw-r--r--addons/web/static/src/less/dropdown_extra.less63
-rw-r--r--addons/web/static/src/less/enterprise_compatibility.less467
-rw-r--r--addons/web/static/src/less/fonts.less37
-rw-r--r--addons/web/static/src/less/form_view.less468
-rw-r--r--addons/web/static/src/less/form_view_extra.less265
-rw-r--r--addons/web/static/src/less/form_view_layout.less298
-rw-r--r--addons/web/static/src/less/form_view_layout_extra.less125
-rw-r--r--addons/web/static/src/less/graph_view.less18
-rw-r--r--addons/web/static/src/less/list_view.less220
-rw-r--r--addons/web/static/src/less/modal.less6
-rw-r--r--addons/web/static/src/less/navbar.less14
-rw-r--r--addons/web/static/src/less/pivot_view.less79
-rw-r--r--addons/web/static/src/less/progress_bar.less36
-rw-r--r--addons/web/static/src/less/search_view.less209
-rw-r--r--addons/web/static/src/less/search_view_extra.less44
-rw-r--r--addons/web/static/src/less/tooltip.less57
-rw-r--r--addons/web/static/src/less/tree_view.less50
-rw-r--r--addons/web/static/src/less/utils.less45
-rw-r--r--addons/web/static/src/less/variables.less40
-rw-r--r--addons/web/static/src/less/views.less72
-rw-r--r--addons/web/static/src/less/views_extra.less33
-rw-r--r--addons/web/static/src/less/webclient.less (renamed from addons/web/static/src/less/notification.less)40
-rw-r--r--addons/web/static/src/less/webclient_extra.less65
-rw-r--r--addons/web/static/src/less/webclient_layout.less156
-rw-r--r--addons/web/static/src/xml/base.xml1561
-rw-r--r--addons/web/static/src/xml/base_common.xml6
-rw-r--r--addons/web/static/test/list-editable.js2
-rw-r--r--addons/web/static/test/list.js1
-rw-r--r--addons/web/static/test/menu.js2
-rw-r--r--addons/web/static/test/search.js52
-rw-r--r--addons/web/static/test/x2many.js272
92 files changed, 7173 insertions, 5270 deletions
diff --git a/addons/web/static/lib/bootstrap/css/bootstrap-theme.css b/addons/web/static/lib/bootstrap/css/bootstrap-theme.css
deleted file mode 100644
index c19cd5c4ba7..00000000000
--- a/addons/web/static/lib/bootstrap/css/bootstrap-theme.css
+++ /dev/null
@@ -1,587 +0,0 @@
-/*!
- * Bootstrap v3.3.5 (http://getbootstrap.com)
- * Copyright 2011-2015 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- */
-.btn-default,
-.btn-primary,
-.btn-success,
-.btn-info,
-.btn-warning,
-.btn-danger {
- text-shadow: 0 -1px 0 rgba(0, 0, 0, .2);
- -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);
- box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);
-}
-.btn-default:active,
-.btn-primary:active,
-.btn-success:active,
-.btn-info:active,
-.btn-warning:active,
-.btn-danger:active,
-.btn-default.active,
-.btn-primary.active,
-.btn-success.active,
-.btn-info.active,
-.btn-warning.active,
-.btn-danger.active {
- -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
- box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
-}
-.btn-default.disabled,
-.btn-primary.disabled,
-.btn-success.disabled,
-.btn-info.disabled,
-.btn-warning.disabled,
-.btn-danger.disabled,
-.btn-default[disabled],
-.btn-primary[disabled],
-.btn-success[disabled],
-.btn-info[disabled],
-.btn-warning[disabled],
-.btn-danger[disabled],
-fieldset[disabled] .btn-default,
-fieldset[disabled] .btn-primary,
-fieldset[disabled] .btn-success,
-fieldset[disabled] .btn-info,
-fieldset[disabled] .btn-warning,
-fieldset[disabled] .btn-danger {
- -webkit-box-shadow: none;
- box-shadow: none;
-}
-.btn-default .badge,
-.btn-primary .badge,
-.btn-success .badge,
-.btn-info .badge,
-.btn-warning .badge,
-.btn-danger .badge {
- text-shadow: none;
-}
-.btn:active,
-.btn.active {
- background-image: none;
-}
-.btn-default {
- text-shadow: 0 1px 0 #fff;
- background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%);
- background-image: -o-linear-gradient(top, #fff 0%, #e0e0e0 100%);
- background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#e0e0e0));
- background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);
- filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
- background-repeat: repeat-x;
- border-color: #dbdbdb;
- border-color: #ccc;
-}
-.btn-default:hover,
-.btn-default:focus {
- background-color: #e0e0e0;
- background-position: 0 -15px;
-}
-.btn-default:active,
-.btn-default.active {
- background-color: #e0e0e0;
- border-color: #dbdbdb;
-}
-.btn-default.disabled,
-.btn-default[disabled],
-fieldset[disabled] .btn-default,
-.btn-default.disabled:hover,
-.btn-default[disabled]:hover,
-fieldset[disabled] .btn-default:hover,
-.btn-default.disabled:focus,
-.btn-default[disabled]:focus,
-fieldset[disabled] .btn-default:focus,
-.btn-default.disabled.focus,
-.btn-default[disabled].focus,
-fieldset[disabled] .btn-default.focus,
-.btn-default.disabled:active,
-.btn-default[disabled]:active,
-fieldset[disabled] .btn-default:active,
-.btn-default.disabled.active,
-.btn-default[disabled].active,
-fieldset[disabled] .btn-default.active {
- background-color: #e0e0e0;
- background-image: none;
-}
-.btn-primary {
- background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%);
- background-image: -o-linear-gradient(top, #337ab7 0%, #265a88 100%);
- background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#265a88));
- background-image: linear-gradient(to bottom, #337ab7 0%, #265a88 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);
- filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
- background-repeat: repeat-x;
- border-color: #245580;
-}
-.btn-primary:hover,
-.btn-primary:focus {
- background-color: #265a88;
- background-position: 0 -15px;
-}
-.btn-primary:active,
-.btn-primary.active {
- background-color: #265a88;
- border-color: #245580;
-}
-.btn-primary.disabled,
-.btn-primary[disabled],
-fieldset[disabled] .btn-primary,
-.btn-primary.disabled:hover,
-.btn-primary[disabled]:hover,
-fieldset[disabled] .btn-primary:hover,
-.btn-primary.disabled:focus,
-.btn-primary[disabled]:focus,
-fieldset[disabled] .btn-primary:focus,
-.btn-primary.disabled.focus,
-.btn-primary[disabled].focus,
-fieldset[disabled] .btn-primary.focus,
-.btn-primary.disabled:active,
-.btn-primary[disabled]:active,
-fieldset[disabled] .btn-primary:active,
-.btn-primary.disabled.active,
-.btn-primary[disabled].active,
-fieldset[disabled] .btn-primary.active {
- background-color: #265a88;
- background-image: none;
-}
-.btn-success {
- background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);
- background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%);
- background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#419641));
- background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);
- filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
- background-repeat: repeat-x;
- border-color: #3e8f3e;
-}
-.btn-success:hover,
-.btn-success:focus {
- background-color: #419641;
- background-position: 0 -15px;
-}
-.btn-success:active,
-.btn-success.active {
- background-color: #419641;
- border-color: #3e8f3e;
-}
-.btn-success.disabled,
-.btn-success[disabled],
-fieldset[disabled] .btn-success,
-.btn-success.disabled:hover,
-.btn-success[disabled]:hover,
-fieldset[disabled] .btn-success:hover,
-.btn-success.disabled:focus,
-.btn-success[disabled]:focus,
-fieldset[disabled] .btn-success:focus,
-.btn-success.disabled.focus,
-.btn-success[disabled].focus,
-fieldset[disabled] .btn-success.focus,
-.btn-success.disabled:active,
-.btn-success[disabled]:active,
-fieldset[disabled] .btn-success:active,
-.btn-success.disabled.active,
-.btn-success[disabled].active,
-fieldset[disabled] .btn-success.active {
- background-color: #419641;
- background-image: none;
-}
-.btn-info {
- background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);
- background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);
- background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2aabd2));
- background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);
- filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
- background-repeat: repeat-x;
- border-color: #28a4c9;
-}
-.btn-info:hover,
-.btn-info:focus {
- background-color: #2aabd2;
- background-position: 0 -15px;
-}
-.btn-info:active,
-.btn-info.active {
- background-color: #2aabd2;
- border-color: #28a4c9;
-}
-.btn-info.disabled,
-.btn-info[disabled],
-fieldset[disabled] .btn-info,
-.btn-info.disabled:hover,
-.btn-info[disabled]:hover,
-fieldset[disabled] .btn-info:hover,
-.btn-info.disabled:focus,
-.btn-info[disabled]:focus,
-fieldset[disabled] .btn-info:focus,
-.btn-info.disabled.focus,
-.btn-info[disabled].focus,
-fieldset[disabled] .btn-info.focus,
-.btn-info.disabled:active,
-.btn-info[disabled]:active,
-fieldset[disabled] .btn-info:active,
-.btn-info.disabled.active,
-.btn-info[disabled].active,
-fieldset[disabled] .btn-info.active {
- background-color: #2aabd2;
- background-image: none;
-}
-.btn-warning {
- background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);
- background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);
- background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#eb9316));
- background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);
- filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
- background-repeat: repeat-x;
- border-color: #e38d13;
-}
-.btn-warning:hover,
-.btn-warning:focus {
- background-color: #eb9316;
- background-position: 0 -15px;
-}
-.btn-warning:active,
-.btn-warning.active {
- background-color: #eb9316;
- border-color: #e38d13;
-}
-.btn-warning.disabled,
-.btn-warning[disabled],
-fieldset[disabled] .btn-warning,
-.btn-warning.disabled:hover,
-.btn-warning[disabled]:hover,
-fieldset[disabled] .btn-warning:hover,
-.btn-warning.disabled:focus,
-.btn-warning[disabled]:focus,
-fieldset[disabled] .btn-warning:focus,
-.btn-warning.disabled.focus,
-.btn-warning[disabled].focus,
-fieldset[disabled] .btn-warning.focus,
-.btn-warning.disabled:active,
-.btn-warning[disabled]:active,
-fieldset[disabled] .btn-warning:active,
-.btn-warning.disabled.active,
-.btn-warning[disabled].active,
-fieldset[disabled] .btn-warning.active {
- background-color: #eb9316;
- background-image: none;
-}
-.btn-danger {
- background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);
- background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);
- background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c12e2a));
- background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);
- filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
- background-repeat: repeat-x;
- border-color: #b92c28;
-}
-.btn-danger:hover,
-.btn-danger:focus {
- background-color: #c12e2a;
- background-position: 0 -15px;
-}
-.btn-danger:active,
-.btn-danger.active {
- background-color: #c12e2a;
- border-color: #b92c28;
-}
-.btn-danger.disabled,
-.btn-danger[disabled],
-fieldset[disabled] .btn-danger,
-.btn-danger.disabled:hover,
-.btn-danger[disabled]:hover,
-fieldset[disabled] .btn-danger:hover,
-.btn-danger.disabled:focus,
-.btn-danger[disabled]:focus,
-fieldset[disabled] .btn-danger:focus,
-.btn-danger.disabled.focus,
-.btn-danger[disabled].focus,
-fieldset[disabled] .btn-danger.focus,
-.btn-danger.disabled:active,
-.btn-danger[disabled]:active,
-fieldset[disabled] .btn-danger:active,
-.btn-danger.disabled.active,
-.btn-danger[disabled].active,
-fieldset[disabled] .btn-danger.active {
- background-color: #c12e2a;
- background-image: none;
-}
-.thumbnail,
-.img-thumbnail {
- -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
- box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
-}
-.dropdown-menu > li > a:hover,
-.dropdown-menu > li > a:focus {
- background-color: #e8e8e8;
- background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
- background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
- background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));
- background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);
- background-repeat: repeat-x;
-}
-.dropdown-menu > .active > a,
-.dropdown-menu > .active > a:hover,
-.dropdown-menu > .active > a:focus {
- background-color: #2e6da4;
- background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
- background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
- background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));
- background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);
- background-repeat: repeat-x;
-}
-.navbar-default {
- background-image: -webkit-linear-gradient(top, #fff 0%, #f8f8f8 100%);
- background-image: -o-linear-gradient(top, #fff 0%, #f8f8f8 100%);
- background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#f8f8f8));
- background-image: linear-gradient(to bottom, #fff 0%, #f8f8f8 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);
- filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
- background-repeat: repeat-x;
- border-radius: 4px;
- -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);
- box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);
-}
-.navbar-default .navbar-nav > .open > a,
-.navbar-default .navbar-nav > .active > a {
- background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);
- background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);
- background-image: -webkit-gradient(linear, left top, left bottom, from(#dbdbdb), to(#e2e2e2));
- background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);
- background-repeat: repeat-x;
- -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075);
- box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075);
-}
-.navbar-brand,
-.navbar-nav > li > a {
- text-shadow: 0 1px 0 rgba(255, 255, 255, .25);
-}
-.navbar-inverse {
- background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%);
- background-image: -o-linear-gradient(top, #3c3c3c 0%, #222 100%);
- background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222));
- background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);
- filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
- background-repeat: repeat-x;
- border-radius: 4px;
-}
-.navbar-inverse .navbar-nav > .open > a,
-.navbar-inverse .navbar-nav > .active > a {
- background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%);
- background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%);
- background-image: -webkit-gradient(linear, left top, left bottom, from(#080808), to(#0f0f0f));
- background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);
- background-repeat: repeat-x;
- -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25);
- box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25);
-}
-.navbar-inverse .navbar-brand,
-.navbar-inverse .navbar-nav > li > a {
- text-shadow: 0 -1px 0 rgba(0, 0, 0, .25);
-}
-.navbar-static-top,
-.navbar-fixed-top,
-.navbar-fixed-bottom {
- border-radius: 0;
-}
-@media (max-width: 767px) {
- .navbar .navbar-nav .open .dropdown-menu > .active > a,
- .navbar .navbar-nav .open .dropdown-menu > .active > a:hover,
- .navbar .navbar-nav .open .dropdown-menu > .active > a:focus {
- color: #fff;
- background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
- background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
- background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));
- background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);
- background-repeat: repeat-x;
- }
-}
-.alert {
- text-shadow: 0 1px 0 rgba(255, 255, 255, .2);
- -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);
- box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);
-}
-.alert-success {
- background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);
- background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);
- background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc));
- background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);
- background-repeat: repeat-x;
- border-color: #b2dba1;
-}
-.alert-info {
- background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);
- background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);
- background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0));
- background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);
- background-repeat: repeat-x;
- border-color: #9acfea;
-}
-.alert-warning {
- background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);
- background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);
- background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0));
- background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);
- background-repeat: repeat-x;
- border-color: #f5e79e;
-}
-.alert-danger {
- background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);
- background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);
- background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3));
- background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);
- background-repeat: repeat-x;
- border-color: #dca7a7;
-}
-.progress {
- background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);
- background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);
- background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5));
- background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);
- background-repeat: repeat-x;
-}
-.progress-bar {
- background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%);
- background-image: -o-linear-gradient(top, #337ab7 0%, #286090 100%);
- background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#286090));
- background-image: linear-gradient(to bottom, #337ab7 0%, #286090 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);
- background-repeat: repeat-x;
-}
-.progress-bar-success {
- background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);
- background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%);
- background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#449d44));
- background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);
- background-repeat: repeat-x;
-}
-.progress-bar-info {
- background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);
- background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);
- background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#31b0d5));
- background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);
- background-repeat: repeat-x;
-}
-.progress-bar-warning {
- background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);
- background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);
- background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#ec971f));
- background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);
- background-repeat: repeat-x;
-}
-.progress-bar-danger {
- background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);
- background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%);
- background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c9302c));
- background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);
- background-repeat: repeat-x;
-}
-.progress-bar-striped {
- background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
- background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
- background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
-}
-.list-group {
- border-radius: 4px;
- -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
- box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
-}
-.list-group-item.active,
-.list-group-item.active:hover,
-.list-group-item.active:focus {
- text-shadow: 0 -1px 0 #286090;
- background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%);
- background-image: -o-linear-gradient(top, #337ab7 0%, #2b669a 100%);
- background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2b669a));
- background-image: linear-gradient(to bottom, #337ab7 0%, #2b669a 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);
- background-repeat: repeat-x;
- border-color: #2b669a;
-}
-.list-group-item.active .badge,
-.list-group-item.active:hover .badge,
-.list-group-item.active:focus .badge {
- text-shadow: none;
-}
-.panel {
- -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .05);
- box-shadow: 0 1px 2px rgba(0, 0, 0, .05);
-}
-.panel-default > .panel-heading {
- background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
- background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
- background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));
- background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);
- background-repeat: repeat-x;
-}
-.panel-primary > .panel-heading {
- background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
- background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
- background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));
- background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);
- background-repeat: repeat-x;
-}
-.panel-success > .panel-heading {
- background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);
- background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);
- background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#d0e9c6));
- background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);
- background-repeat: repeat-x;
-}
-.panel-info > .panel-heading {
- background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);
- background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);
- background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#c4e3f3));
- background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);
- background-repeat: repeat-x;
-}
-.panel-warning > .panel-heading {
- background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);
- background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);
- background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#faf2cc));
- background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);
- background-repeat: repeat-x;
-}
-.panel-danger > .panel-heading {
- background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);
- background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%);
- background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#ebcccc));
- background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);
- background-repeat: repeat-x;
-}
-.well {
- background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);
- background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);
- background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#f5f5f5));
- background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);
- background-repeat: repeat-x;
- border-color: #dcdcdc;
- -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1);
- box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1);
-}
-/*# sourceMappingURL=bootstrap-theme.css.map */
diff --git a/addons/web/static/lib/bootstrap/css/bootstrap-theme.css.map b/addons/web/static/lib/bootstrap/css/bootstrap-theme.css.map
deleted file mode 100644
index 753531147d9..00000000000
--- a/addons/web/static/lib/bootstrap/css/bootstrap-theme.css.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["bootstrap-theme.css","less/theme.less","less/mixins/vendor-prefixes.less","less/mixins/gradients.less","less/mixins/reset-filter.less"],"names":[],"mappings":"AAAA;;;;GAIG;ACeH;;;;;;EAME,yCAAA;EC2CA,4FAAA;EACQ,oFAAA;CFvDT;ACgBC;;;;;;;;;;;;ECsCA,yDAAA;EACQ,iDAAA;CFxCT;ACMC;;;;;;;;;;;;;;;;;;ECiCA,yBAAA;EACQ,iBAAA;CFnBT;AC/BD;;;;;;EAuBI,kBAAA;CDgBH;ACyBC;;EAEE,uBAAA;CDvBH;AC4BD;EErEI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EAEA,uHAAA;ECnBF,oEAAA;EH4CA,4BAAA;EACA,sBAAA;EAuC2C,0BAAA;EAA2B,mBAAA;CDjBvE;ACpBC;;EAEE,0BAAA;EACA,6BAAA;CDsBH;ACnBC;;EAEE,0BAAA;EACA,sBAAA;CDqBH;ACfG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACA,uBAAA;CD6BL;ACbD;EEtEI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EAEA,uHAAA;ECnBF,oEAAA;EH4CA,4BAAA;EACA,sBAAA;CD8DD;AC5DC;;EAEE,0BAAA;EACA,6BAAA;CD8DH;AC3DC;;EAEE,0BAAA;EACA,sBAAA;CD6DH;ACvDG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACA,uBAAA;CDqEL;ACpDD;EEvEI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EAEA,uHAAA;ECnBF,oEAAA;EH4CA,4BAAA;EACA,sBAAA;CDsGD;ACpGC;;EAEE,0BAAA;EACA,6BAAA;CDsGH;ACnGC;;EAEE,0BAAA;EACA,sBAAA;CDqGH;AC/FG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACA,uBAAA;CD6GL;AC3FD;EExEI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EAEA,uHAAA;ECnBF,oEAAA;EH4CA,4BAAA;EACA,sBAAA;CD8ID;AC5IC;;EAEE,0BAAA;EACA,6BAAA;CD8IH;AC3IC;;EAEE,0BAAA;EACA,sBAAA;CD6IH;ACvIG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACA,uBAAA;CDqJL;AClID;EEzEI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EAEA,uHAAA;ECnBF,oEAAA;EH4CA,4BAAA;EACA,sBAAA;CDsLD;ACpLC;;EAEE,0BAAA;EACA,6BAAA;CDsLH;ACnLC;;EAEE,0BAAA;EACA,sBAAA;CDqLH;AC/KG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACA,uBAAA;CD6LL;ACzKD;EE1EI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EAEA,uHAAA;ECnBF,oEAAA;EH4CA,4BAAA;EACA,sBAAA;CD8ND;AC5NC;;EAEE,0BAAA;EACA,6BAAA;CD8NH;AC3NC;;EAEE,0BAAA;EACA,sBAAA;CD6NH;ACvNG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACA,uBAAA;CDqOL;AC1MD;;EClCE,mDAAA;EACQ,2CAAA;CFgPT;ACrMD;;EE3FI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;EF0FF,0BAAA;CD2MD;ACzMD;;;EEhGI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;EFgGF,0BAAA;CD+MD;ACtMD;EE7GI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;ECnBF,oEAAA;EH+HA,mBAAA;ECjEA,4FAAA;EACQ,oFAAA;CF8QT;ACjND;;EE7GI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;ED2CF,yDAAA;EACQ,iDAAA;CFwRT;AC9MD;;EAEE,+CAAA;CDgND;AC5MD;EEhII,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;ECnBF,oEAAA;EHkJA,mBAAA;CDkND;ACrND;;EEhII,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;ED2CF,wDAAA;EACQ,gDAAA;CF+ST;AC/ND;;EAYI,0CAAA;CDuNH;AClND;;;EAGE,iBAAA;CDoND;AC/LD;EAfI;;;IAGE,YAAA;IE7JF,yEAAA;IACA,oEAAA;IACA,8FAAA;IAAA,uEAAA;IACA,4BAAA;IACA,uHAAA;GH+WD;CACF;AC3MD;EACE,8CAAA;EC3HA,2FAAA;EACQ,mFAAA;CFyUT;ACnMD;EEtLI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;EF8KF,sBAAA;CD+MD;AC1MD;EEvLI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;EF8KF,sBAAA;CDuND;ACjND;EExLI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;EF8KF,sBAAA;CD+ND;ACxND;EEzLI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;EF8KF,sBAAA;CDuOD;ACxND;EEjMI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CH4ZH;ACrND;EE3MI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CHmaH;AC3ND;EE5MI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CH0aH;ACjOD;EE7MI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CHibH;ACvOD;EE9MI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CHwbH;AC7OD;EE/MI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CH+bH;AChPD;EElLI,8MAAA;EACA,yMAAA;EACA,sMAAA;CHqaH;AC5OD;EACE,mBAAA;EC9KA,mDAAA;EACQ,2CAAA;CF6ZT;AC7OD;;;EAGE,8BAAA;EEnOE,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;EFiOF,sBAAA;CDmPD;ACxPD;;;EAQI,kBAAA;CDqPH;AC3OD;ECnME,kDAAA;EACQ,0CAAA;CFibT;ACrOD;EE5PI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CHoeH;AC3OD;EE7PI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CH2eH;ACjPD;EE9PI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CHkfH;ACvPD;EE/PI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CHyfH;AC7PD;EEhQI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CHggBH;ACnQD;EEjQI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CHugBH;ACnQD;EExQI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;EFsQF,sBAAA;EC3NA,0FAAA;EACQ,kFAAA;CFqeT","file":"bootstrap-theme.css","sourcesContent":["/*!\n * Bootstrap v3.3.5 (http://getbootstrap.com)\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.btn-default:active,\n.btn-primary:active,\n.btn-success:active,\n.btn-info:active,\n.btn-warning:active,\n.btn-danger:active,\n.btn-default.active,\n.btn-primary.active,\n.btn-success.active,\n.btn-info.active,\n.btn-warning.active,\n.btn-danger.active {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-default.disabled,\n.btn-primary.disabled,\n.btn-success.disabled,\n.btn-info.disabled,\n.btn-warning.disabled,\n.btn-danger.disabled,\n.btn-default[disabled],\n.btn-primary[disabled],\n.btn-success[disabled],\n.btn-info[disabled],\n.btn-warning[disabled],\n.btn-danger[disabled],\nfieldset[disabled] .btn-default,\nfieldset[disabled] .btn-primary,\nfieldset[disabled] .btn-success,\nfieldset[disabled] .btn-info,\nfieldset[disabled] .btn-warning,\nfieldset[disabled] .btn-danger {\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-default .badge,\n.btn-primary .badge,\n.btn-success .badge,\n.btn-info .badge,\n.btn-warning .badge,\n.btn-danger .badge {\n text-shadow: none;\n}\n.btn:active,\n.btn.active {\n background-image: none;\n}\n.btn-default {\n background-image: -webkit-linear-gradient(top, #ffffff 0%, #e0e0e0 100%);\n background-image: -o-linear-gradient(top, #ffffff 0%, #e0e0e0 100%);\n background-image: linear-gradient(to bottom, #ffffff 0%, #e0e0e0 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #dbdbdb;\n text-shadow: 0 1px 0 #fff;\n border-color: #ccc;\n}\n.btn-default:hover,\n.btn-default:focus {\n background-color: #e0e0e0;\n background-position: 0 -15px;\n}\n.btn-default:active,\n.btn-default.active {\n background-color: #e0e0e0;\n border-color: #dbdbdb;\n}\n.btn-default.disabled,\n.btn-default[disabled],\nfieldset[disabled] .btn-default,\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus,\n.btn-default.disabled:active,\n.btn-default[disabled]:active,\nfieldset[disabled] .btn-default:active,\n.btn-default.disabled.active,\n.btn-default[disabled].active,\nfieldset[disabled] .btn-default.active {\n background-color: #e0e0e0;\n background-image: none;\n}\n.btn-primary {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #265a88 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #265a88 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #245580;\n}\n.btn-primary:hover,\n.btn-primary:focus {\n background-color: #265a88;\n background-position: 0 -15px;\n}\n.btn-primary:active,\n.btn-primary.active {\n background-color: #265a88;\n border-color: #245580;\n}\n.btn-primary.disabled,\n.btn-primary[disabled],\nfieldset[disabled] .btn-primary,\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus,\n.btn-primary.disabled:active,\n.btn-primary[disabled]:active,\nfieldset[disabled] .btn-primary:active,\n.btn-primary.disabled.active,\n.btn-primary[disabled].active,\nfieldset[disabled] .btn-primary.active {\n background-color: #265a88;\n background-image: none;\n}\n.btn-success {\n background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);\n background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%);\n background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #3e8f3e;\n}\n.btn-success:hover,\n.btn-success:focus {\n background-color: #419641;\n background-position: 0 -15px;\n}\n.btn-success:active,\n.btn-success.active {\n background-color: #419641;\n border-color: #3e8f3e;\n}\n.btn-success.disabled,\n.btn-success[disabled],\nfieldset[disabled] .btn-success,\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus,\n.btn-success.disabled:active,\n.btn-success[disabled]:active,\nfieldset[disabled] .btn-success:active,\n.btn-success.disabled.active,\n.btn-success[disabled].active,\nfieldset[disabled] .btn-success.active {\n background-color: #419641;\n background-image: none;\n}\n.btn-info {\n background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #28a4c9;\n}\n.btn-info:hover,\n.btn-info:focus {\n background-color: #2aabd2;\n background-position: 0 -15px;\n}\n.btn-info:active,\n.btn-info.active {\n background-color: #2aabd2;\n border-color: #28a4c9;\n}\n.btn-info.disabled,\n.btn-info[disabled],\nfieldset[disabled] .btn-info,\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus,\n.btn-info.disabled:active,\n.btn-info[disabled]:active,\nfieldset[disabled] .btn-info:active,\n.btn-info.disabled.active,\n.btn-info[disabled].active,\nfieldset[disabled] .btn-info.active {\n background-color: #2aabd2;\n background-image: none;\n}\n.btn-warning {\n background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #e38d13;\n}\n.btn-warning:hover,\n.btn-warning:focus {\n background-color: #eb9316;\n background-position: 0 -15px;\n}\n.btn-warning:active,\n.btn-warning.active {\n background-color: #eb9316;\n border-color: #e38d13;\n}\n.btn-warning.disabled,\n.btn-warning[disabled],\nfieldset[disabled] .btn-warning,\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus,\n.btn-warning.disabled:active,\n.btn-warning[disabled]:active,\nfieldset[disabled] .btn-warning:active,\n.btn-warning.disabled.active,\n.btn-warning[disabled].active,\nfieldset[disabled] .btn-warning.active {\n background-color: #eb9316;\n background-image: none;\n}\n.btn-danger {\n background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #b92c28;\n}\n.btn-danger:hover,\n.btn-danger:focus {\n background-color: #c12e2a;\n background-position: 0 -15px;\n}\n.btn-danger:active,\n.btn-danger.active {\n background-color: #c12e2a;\n border-color: #b92c28;\n}\n.btn-danger.disabled,\n.btn-danger[disabled],\nfieldset[disabled] .btn-danger,\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus,\n.btn-danger.disabled:active,\n.btn-danger[disabled]:active,\nfieldset[disabled] .btn-danger:active,\n.btn-danger.disabled.active,\n.btn-danger[disabled].active,\nfieldset[disabled] .btn-danger.active {\n background-color: #c12e2a;\n background-image: none;\n}\n.thumbnail,\n.img-thumbnail {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n background-color: #e8e8e8;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n background-color: #2e6da4;\n}\n.navbar-default {\n background-image: -webkit-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n background-image: -o-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n background-image: linear-gradient(to bottom, #ffffff 0%, #f8f8f8 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .active > a {\n background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);\n -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.25);\n}\n.navbar-inverse {\n background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222222 100%);\n background-image: -o-linear-gradient(top, #3c3c3c 0%, #222222 100%);\n background-image: linear-gradient(to bottom, #3c3c3c 0%, #222222 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n border-radius: 4px;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .active > a {\n background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);\n -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n}\n.navbar-inverse .navbar-brand,\n.navbar-inverse .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n@media (max-width: 767px) {\n .navbar .navbar-nav .open .dropdown-menu > .active > a,\n .navbar .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #fff;\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n }\n}\n.alert {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.2);\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.alert-success {\n background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);\n border-color: #b2dba1;\n}\n.alert-info {\n background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);\n border-color: #9acfea;\n}\n.alert-warning {\n background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);\n border-color: #f5e79e;\n}\n.alert-danger {\n background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);\n border-color: #dca7a7;\n}\n.progress {\n background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);\n}\n.progress-bar {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #286090 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #286090 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);\n}\n.progress-bar-success {\n background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);\n}\n.progress-bar-info {\n background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);\n}\n.progress-bar-warning {\n background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);\n}\n.progress-bar-danger {\n background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);\n}\n.progress-bar-striped {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.list-group {\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 #286090;\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2b669a 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);\n border-color: #2b669a;\n}\n.list-group-item.active .badge,\n.list-group-item.active:hover .badge,\n.list-group-item.active:focus .badge {\n text-shadow: none;\n}\n.panel {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.panel-default > .panel-heading {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n}\n.panel-primary > .panel-heading {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n}\n.panel-success > .panel-heading {\n background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);\n}\n.panel-info > .panel-heading {\n background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);\n}\n.panel-warning > .panel-heading {\n background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);\n}\n.panel-danger > .panel-heading {\n background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);\n}\n.well {\n background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);\n border-color: #dcdcdc;\n -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n}\n/*# sourceMappingURL=bootstrap-theme.css.map */","/*!\n * Bootstrap v3.3.5 (http://getbootstrap.com)\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\n//\n// Load core variables and mixins\n// --------------------------------------------------\n\n@import \"variables.less\";\n@import \"mixins.less\";\n\n\n//\n// Buttons\n// --------------------------------------------------\n\n// Common styles\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0,0,0,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 1px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n // Reset the shadow\n &:active,\n &.active {\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n .box-shadow(none);\n }\n\n .badge {\n text-shadow: none;\n }\n}\n\n// Mixin for generating new styles\n.btn-styles(@btn-color: #555) {\n #gradient > .vertical(@start-color: @btn-color; @end-color: darken(@btn-color, 12%));\n .reset-filter(); // Disable gradients for IE9 because filter bleeds through rounded corners; see https://github.com/twbs/bootstrap/issues/10620\n background-repeat: repeat-x;\n border-color: darken(@btn-color, 14%);\n\n &:hover,\n &:focus {\n background-color: darken(@btn-color, 12%);\n background-position: 0 -15px;\n }\n\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n border-color: darken(@btn-color, 14%);\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n &,\n &:hover,\n &:focus,\n &.focus,\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n background-image: none;\n }\n }\n}\n\n// Common styles\n.btn {\n // Remove the gradient for the pressed/active state\n &:active,\n &.active {\n background-image: none;\n }\n}\n\n// Apply the mixin to the buttons\n.btn-default { .btn-styles(@btn-default-bg); text-shadow: 0 1px 0 #fff; border-color: #ccc; }\n.btn-primary { .btn-styles(@btn-primary-bg); }\n.btn-success { .btn-styles(@btn-success-bg); }\n.btn-info { .btn-styles(@btn-info-bg); }\n.btn-warning { .btn-styles(@btn-warning-bg); }\n.btn-danger { .btn-styles(@btn-danger-bg); }\n\n\n//\n// Images\n// --------------------------------------------------\n\n.thumbnail,\n.img-thumbnail {\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n\n\n//\n// Dropdowns\n// --------------------------------------------------\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-hover-bg; @end-color: darken(@dropdown-link-hover-bg, 5%));\n background-color: darken(@dropdown-link-hover-bg, 5%);\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n background-color: darken(@dropdown-link-active-bg, 5%);\n}\n\n\n//\n// Navbar\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n #gradient > .vertical(@start-color: lighten(@navbar-default-bg, 10%); @end-color: @navbar-default-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n border-radius: @navbar-border-radius;\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 5px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: darken(@navbar-default-link-active-bg, 5%); @end-color: darken(@navbar-default-link-active-bg, 2%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.075));\n }\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255,255,255,.25);\n}\n\n// Inverted navbar\n.navbar-inverse {\n #gradient > .vertical(@start-color: lighten(@navbar-inverse-bg, 10%); @end-color: @navbar-inverse-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered; see https://github.com/twbs/bootstrap/issues/10257\n border-radius: @navbar-border-radius;\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: @navbar-inverse-link-active-bg; @end-color: lighten(@navbar-inverse-link-active-bg, 2.5%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.25));\n }\n\n .navbar-brand,\n .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0,0,0,.25);\n }\n}\n\n// Undo rounded corners in static and fixed navbars\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n\n// Fix active state of dropdown items in collapsed mode\n@media (max-width: @grid-float-breakpoint-max) {\n .navbar .navbar-nav .open .dropdown-menu > .active > a {\n &,\n &:hover,\n &:focus {\n color: #fff;\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n }\n }\n}\n\n\n//\n// Alerts\n// --------------------------------------------------\n\n// Common styles\n.alert {\n text-shadow: 0 1px 0 rgba(255,255,255,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.25), 0 1px 2px rgba(0,0,0,.05);\n .box-shadow(@shadow);\n}\n\n// Mixin for generating new styles\n.alert-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 7.5%));\n border-color: darken(@color, 15%);\n}\n\n// Apply the mixin to the alerts\n.alert-success { .alert-styles(@alert-success-bg); }\n.alert-info { .alert-styles(@alert-info-bg); }\n.alert-warning { .alert-styles(@alert-warning-bg); }\n.alert-danger { .alert-styles(@alert-danger-bg); }\n\n\n//\n// Progress bars\n// --------------------------------------------------\n\n// Give the progress background some depth\n.progress {\n #gradient > .vertical(@start-color: darken(@progress-bg, 4%); @end-color: @progress-bg)\n}\n\n// Mixin for generating new styles\n.progress-bar-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 10%));\n}\n\n// Apply the mixin to the progress bars\n.progress-bar { .progress-bar-styles(@progress-bar-bg); }\n.progress-bar-success { .progress-bar-styles(@progress-bar-success-bg); }\n.progress-bar-info { .progress-bar-styles(@progress-bar-info-bg); }\n.progress-bar-warning { .progress-bar-styles(@progress-bar-warning-bg); }\n.progress-bar-danger { .progress-bar-styles(@progress-bar-danger-bg); }\n\n// Reset the striped class because our mixins don't do multiple gradients and\n// the above custom styles override the new `.progress-bar-striped` in v3.2.0.\n.progress-bar-striped {\n #gradient > .striped();\n}\n\n\n//\n// List groups\n// --------------------------------------------------\n\n.list-group {\n border-radius: @border-radius-base;\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 darken(@list-group-active-bg, 10%);\n #gradient > .vertical(@start-color: @list-group-active-bg; @end-color: darken(@list-group-active-bg, 7.5%));\n border-color: darken(@list-group-active-border, 7.5%);\n\n .badge {\n text-shadow: none;\n }\n}\n\n\n//\n// Panels\n// --------------------------------------------------\n\n// Common styles\n.panel {\n .box-shadow(0 1px 2px rgba(0,0,0,.05));\n}\n\n// Mixin for generating new styles\n.panel-heading-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 5%));\n}\n\n// Apply the mixin to the panel headings only\n.panel-default > .panel-heading { .panel-heading-styles(@panel-default-heading-bg); }\n.panel-primary > .panel-heading { .panel-heading-styles(@panel-primary-heading-bg); }\n.panel-success > .panel-heading { .panel-heading-styles(@panel-success-heading-bg); }\n.panel-info > .panel-heading { .panel-heading-styles(@panel-info-heading-bg); }\n.panel-warning > .panel-heading { .panel-heading-styles(@panel-warning-heading-bg); }\n.panel-danger > .panel-heading { .panel-heading-styles(@panel-danger-heading-bg); }\n\n\n//\n// Wells\n// --------------------------------------------------\n\n.well {\n #gradient > .vertical(@start-color: darken(@well-bg, 5%); @end-color: @well-bg);\n border-color: darken(@well-bg, 10%);\n @shadow: inset 0 1px 3px rgba(0,0,0,.05), 0 1px 0 rgba(255,255,255,.1);\n .box-shadow(@shadow);\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They will be removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility){\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: @color;\n opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n }\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n","// Gradients\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-repeat: repeat-x;\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n"]} \ No newline at end of file
diff --git a/addons/web/static/lib/bootstrap/css/bootstrap-theme.min.css b/addons/web/static/lib/bootstrap/css/bootstrap-theme.min.css
deleted file mode 100644
index 61358b13d04..00000000000
--- a/addons/web/static/lib/bootstrap/css/bootstrap-theme.min.css
+++ /dev/null
@@ -1,5 +0,0 @@
-/*!
- * Bootstrap v3.3.5 (http://getbootstrap.com)
- * Copyright 2011-2015 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- */.btn-danger,.btn-default,.btn-info,.btn-primary,.btn-success,.btn-warning{text-shadow:0 -1px 0 rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-primary.active,.btn-primary:active,.btn-success.active,.btn-success:active,.btn-warning.active,.btn-warning:active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-danger.disabled,.btn-danger[disabled],.btn-default.disabled,.btn-default[disabled],.btn-info.disabled,.btn-info[disabled],.btn-primary.disabled,.btn-primary[disabled],.btn-success.disabled,.btn-success[disabled],.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-danger,fieldset[disabled] .btn-default,fieldset[disabled] .btn-info,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-success,fieldset[disabled] .btn-warning{-webkit-box-shadow:none;box-shadow:none}.btn-danger .badge,.btn-default .badge,.btn-info .badge,.btn-primary .badge,.btn-success .badge,.btn-warning .badge{text-shadow:none}.btn.active,.btn:active{background-image:none}.btn-default{text-shadow:0 1px 0 #fff;background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-o-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e0e0e0));background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#dbdbdb;border-color:#ccc}.btn-default:focus,.btn-default:hover{background-color:#e0e0e0;background-position:0 -15px}.btn-default.active,.btn-default:active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-o-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#265a88));background-image:linear-gradient(to bottom,#337ab7 0,#265a88 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#245580}.btn-primary:focus,.btn-primary:hover{background-color:#265a88;background-position:0 -15px}.btn-primary.active,.btn-primary:active{background-color:#265a88;border-color:#245580}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#265a88;background-image:none}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#419641));background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#3e8f3e}.btn-success:focus,.btn-success:hover{background-color:#419641;background-position:0 -15px}.btn-success.active,.btn-success:active{background-color:#419641;border-color:#3e8f3e}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#419641;background-image:none}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#2aabd2));background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:focus,.btn-info:hover{background-color:#2aabd2;background-position:0 -15px}.btn-info.active,.btn-info:active{background-color:#2aabd2;border-color:#28a4c9}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#2aabd2;background-image:none}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#eb9316));background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:focus,.btn-warning:hover{background-color:#eb9316;background-position:0 -15px}.btn-warning.active,.btn-warning:active{background-color:#eb9316;border-color:#e38d13}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#eb9316;background-image:none}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c12e2a));background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:focus,.btn-danger:hover{background-color:#c12e2a;background-position:0 -15px}.btn-danger.active,.btn-danger:active{background-color:#c12e2a;border-color:#b92c28}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#c12e2a;background-image:none}.img-thumbnail,.thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{background-color:#e8e8e8;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{background-color:#2e6da4;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-o-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#f8f8f8));background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-o-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dbdbdb),to(#e2e2e2));background-image:linear-gradient(to bottom,#dbdbdb 0,#e2e2e2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-o-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#3c3c3c),to(#222));background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-o-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#080808),to(#0f0f0f));background-image:linear-gradient(to bottom,#080808 0,#0f0f0f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-fixed-bottom,.navbar-fixed-top,.navbar-static-top{border-radius:0}@media (max-width:767px){.navbar .navbar-nav .open .dropdown-menu>.active>a,.navbar .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}}.alert{text-shadow:0 1px 0 rgba(255,255,255,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#c8e5bc));background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);background-repeat:repeat-x;border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#b9def0));background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);background-repeat:repeat-x;border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#f8efc0));background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);background-repeat:repeat-x;border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-o-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#e7c3c3));background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);background-repeat:repeat-x;border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f5f5f5));background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x}.progress-bar{background-image:-webkit-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-o-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#286090));background-image:linear-gradient(to bottom,#337ab7 0,#286090 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);background-repeat:repeat-x}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#449d44));background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);background-repeat:repeat-x}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#31b0d5));background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);background-repeat:repeat-x}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#ec971f));background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);background-repeat:repeat-x}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c9302c));background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);background-repeat:repeat-x}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{text-shadow:0 -1px 0 #286090;background-image:-webkit-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2b669a));background-image:linear-gradient(to bottom,#337ab7 0,#2b669a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);background-repeat:repeat-x;border-color:#2b669a}.list-group-item.active .badge,.list-group-item.active:focus .badge,.list-group-item.active:hover .badge{text-shadow:none}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#d0e9c6));background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);background-repeat:repeat-x}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#c4e3f3));background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);background-repeat:repeat-x}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#faf2cc));background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);background-repeat:repeat-x}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-o-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#ebcccc));background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);background-repeat:repeat-x}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#e8e8e8),to(#f5f5f5));background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x;border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)} \ No newline at end of file
diff --git a/addons/web/static/lib/bootstrap/css/bootstrap.css.map b/addons/web/static/lib/bootstrap/css/bootstrap.css.map
deleted file mode 100644
index 9f60ed2b1bd..00000000000
--- a/addons/web/static/lib/bootstrap/css/bootstrap.css.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["bootstrap.css","less/normalize.less","less/print.less","less/glyphicons.less","less/scaffolding.less","less/mixins/vendor-prefixes.less","less/mixins/tab-focus.less","less/mixins/image.less","less/type.less","less/mixins/text-emphasis.less","less/mixins/background-variant.less","less/mixins/text-overflow.less","less/code.less","less/grid.less","less/mixins/grid.less","less/mixins/grid-framework.less","less/tables.less","less/mixins/table-row.less","less/forms.less","less/mixins/forms.less","less/buttons.less","less/mixins/buttons.less","less/mixins/opacity.less","less/component-animations.less","less/dropdowns.less","less/mixins/nav-divider.less","less/mixins/reset-filter.less","less/button-groups.less","less/mixins/border-radius.less","less/input-groups.less","less/navs.less","less/navbar.less","less/mixins/nav-vertical-align.less","less/utilities.less","less/breadcrumbs.less","less/pagination.less","less/mixins/pagination.less","less/pager.less","less/labels.less","less/mixins/labels.less","less/badges.less","less/jumbotron.less","less/thumbnails.less","less/alerts.less","less/mixins/alerts.less","less/progress-bars.less","less/mixins/gradients.less","less/mixins/progress-bar.less","less/media.less","less/list-group.less","less/mixins/list-group.less","less/panels.less","less/mixins/panels.less","less/responsive-embed.less","less/wells.less","less/close.less","less/modals.less","less/tooltip.less","less/mixins/reset-text.less","less/popovers.less","less/carousel.less","less/mixins/clearfix.less","less/mixins/center-block.less","less/mixins/hide-text.less","less/responsive-utilities.less","less/mixins/responsive-visibility.less"],"names":[],"mappings":"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,iBAAA;CHsR9C;AGrRmC;EAAW,iBAAA;CHwR9C;AGvRmC;EAAW,iBAAA;CH0R9C;AGzRmC;EAAW,iBAAA;CH4R9C;AG3RmC;EAAW,iBAAA;CH8R9C;AG7RmC;EAAW,iBAAA;CHgS9C;AG/RmC;EAAW,iBAAA;CHkS9C;AGjSmC;EAAW,iBAAA;CHoS9C;AGnSmC;EAAW,iBAAA;CHsS9C;AGrSmC;EAAW,iBAAA;CHwS9C;AGvSmC;EAAW,iBAAA;CH0S9C;AGzSmC;EAAW,iBAAA;CH4S9C;AG3SmC;EAAW,iBAAA;CH8S9C;AG7SmC;EAAW,iBAAA;CHgT9C;AG/SmC;EAAW,iBAAA;CHkT9C;AGjTmC;EAAW,iBAAA;CHoT9C;AGnTmC;EAAW,iBAAA;CHsT9C;AGrTmC;EAAW,iBAAA;CHwT9C;AGvTmC;EAAW,iBAAA;CH0T9C;AGzTmC;EAAW,iBAAA;CH4T9C;AG3TmC;EAAW,iBAAA;CH8T9C;AG7TmC;EAAW,iBAAA;CHgU9C;AG/TmC;EAAW,iBAAA;CHkU9C;AGjUmC;EAAW,iBAAA;CHoU9C;AGnUmC;EAAW,iBAAA;CHsU9C;AGrUmC;EAAW,iBAAA;CHwU9C;AGvUmC;EAAW,iBAAA;CH0U9C;AGzUmC;EAAW,iBAAA;CH4U9C;AG3UmC;EAAW,iBAAA;CH8U9C;AG7UmC;EAAW,iBAAA;CHgV9C;AG/UmC;EAAW,iBAAA;CHkV9C;AGjVmC;EAAW,iBAAA;CHoV9C;AGnVmC;EAAW,iBAAA;CHsV9C;AGrVmC;EAAW,iBAAA;CHwV9C;AGvVmC;EAAW,iBAAA;CH0V9C;AGzVmC;EAAW,iBAAA;CH4V9C;AG3VmC;EAAW,iBAAA;CH8V9C;AG7VmC;EAAW,iBAAA;CHgW9C;AG/VmC;EAAW,iBAAA;CHkW9C;AGjWmC;EAAW,iBAAA;CHoW9C;AGnWmC;EAAW,iBAAA;CHsW9C;AGrWmC;EAAW,iBAAA;CHwW9C;AGvWmC;EAAW,iBAAA;CH0W9C;AGzWmC;EAAW,iBAAA;CH4W9C;AG3WmC;EAAW,iBAAA;CH8W9C;AG7WmC;EAAW,iBAAA;CHgX9C;AG/WmC;EAAW,iBAAA;CHkX9C;AGjXmC;EAAW,iBAAA;CHoX9C;AGnXmC;EAAW,iBAAA;CHsX9C;AGrXmC;EAAW,iBAAA;CHwX9C;AGvXmC;EAAW,iBAAA;CH0X9C;AGzXmC;EAAW,iBAAA;CH4X9C;AG3XmC;EAAW,iBAAA;CH8X9C;AG7XmC;EAAW,iBAAA;CHgY9C;AG/XmC;EAAW,iBAAA;CHkY9C;AGjYmC;EAAW,iBAAA;CHoY9C;AGnYmC;EAAW,iBAAA;CHsY9C;AGrYmC;EAAW,iBAAA;CHwY9C;AGvYmC;EAAW,iBAAA;CH0Y9C;AGzYmC;EAAW,iBAAA;CH4Y9C;AG3YmC;EAAW,iBAAA;CH8Y9C;AG7YmC;EAAW,iBAAA;CHgZ9C;AG/YmC;EAAW,iBAAA;CHkZ9C;AGjZmC;EAAW,iBAAA;CHoZ9C;AGnZmC;EAAW,iBAAA;CHsZ9C;AGrZmC;EAAW,iBAAA;CHwZ9C;AGvZmC;EAAW,iBAAA;CH0Z9C;AGzZmC;EAAW,iBAAA;CH4Z9C;AG3ZmC;EAAW,iBAAA;CH8Z9C;AG7ZmC;EAAW,iBAAA;CHga9C;AG/ZmC;EAAW,iBAAA;CHka9C;AGjamC;EAAW,iBAAA;CHoa9C;AGnamC;EAAW,iBAAA;CHsa9C;AGramC;EAAW,iBAAA;CHwa9C;AGvamC;EAAW,iBAAA;CH0a9C;AGzamC;EAAW,iBAAA;CH4a9C;AG3amC;EAAW,iBAAA;CH8a9C;AG7amC;EAAW,iBAAA;CHgb9C;AG/amC;EAAW,iBAAA;CHkb9C;AGjbmC;EAAW,iBAAA;CHob9C;AGnbmC;EAAW,iBAAA;CHsb9C;AGrbmC;EAAW,iBAAA;CHwb9C;AGvbmC;EAAW,iBAAA;CH0b9C;AGzbmC;EAAW,iBAAA;CH4b9C;AG3bmC;EAAW,iBAAA;CH8b9C;AG7bmC;EAAW,iBAAA;CHgc9C;AG/bmC;EAAW,iBAAA;CHkc9C;AGjcmC;EAAW,iBAAA;CHoc9C;AGncmC;EAAW,iBAAA;CHsc9C;AGrcmC;EAAW,iBAAA;CHwc9C;AGvcmC;EAAW,iBAAA;CH0c9C;AGzcmC;EAAW,iBAAA;CH4c9C;AG3cmC;EAAW,iBAAA;CH8c9C;AG7cmC;EAAW,iBAAA;CHgd9C;AG/cmC;EAAW,iBAAA;CHkd9C;AGjdmC;EAAW,iBAAA;CHod9C;AGndmC;EAAW,iBAAA;CHsd9C;AGrdmC;EAAW,iBAAA;CHwd9C;AGvdmC;EAAW,iBAAA;CH0d9C;AGzdmC;EAAW,iBAAA;CH4d9C;AG3dmC;EAAW,iBAAA;CH8d9C;AG7dmC;EAAW,iBAAA;CHge9C;AG/dmC;EAAW,iBAAA;CHke9C;AGjemC;EAAW,iBAAA;CHoe9C;AGnemC;EAAW,iBAAA;CHse9C;AGremC;EAAW,iBAAA;CHwe9C;AGvemC;EAAW,iBAAA;CH0e9C;AGzemC;EAAW,iBAAA;CH4e9C;AG3emC;EAAW,iBAAA;CH8e9C;AG7emC;EAAW,iBAAA;CHgf9C;AG/emC;EAAW,iBAAA;CHkf9C;AGjfmC;EAAW,iBAAA;CHof9C;AGnfmC;EAAW,iBAAA;CHsf9C;AGrfmC;EAAW,iBAAA;CHwf9C;AGvfmC;EAAW,iBAAA;CH0f9C;AGzfmC;EAAW,iBAAA;CH4f9C;AG3fmC;EAAW,iBAAA;CH8f9C;AG7fmC;EAAW,iBAAA;CHggB9C;AG/fmC;EAAW,iBAAA;CHkgB9C;AGjgBmC;EAAW,iBAAA;CHogB9C;AGngBmC;EAAW,iBAAA;CHsgB9C;AGrgBmC;EAAW,iBAAA;CHwgB9C;AGvgBmC;EAAW,iBAAA;CH0gB9C;AGzgBmC;EAAW,iBAAA;CH4gB9C;AG3gBmC;EAAW,iBAAA;CH8gB9C;AG7gBmC;EAAW,iBAAA;CHghB9C;AG/gBmC;EAAW,iBAAA;CHkhB9C;AGjhBmC;EAAW,iBAAA;CHohB9C;AGnhBmC;EAAW,iBAAA;CHshB9C;AGrhBmC;EAAW,iBAAA;CHwhB9C;AGvhBmC;EAAW,iBAAA;CH0hB9C;AGzhBmC;EAAW,iBAAA;CH4hB9C;AG3hBmC;EAAW,iBAAA;CH8hB9C;AG7hBmC;EAAW,iBAAA;CHgiB9C;AG/hBmC;EAAW,iBAAA;CHkiB9C;AGjiBmC;EAAW,iBAAA;CHoiB9C;AGniBmC;EAAW,iBAAA;CHsiB9C;AGriBmC;EAAW,iBAAA;CHwiB9C;AGviBmC;EAAW,iBAAA;CH0iB9C;AGziBmC;EAAW,iBAAA;CH4iB9C;AG3iBmC;EAAW,iBAAA;CH8iB9C;AG7iBmC;EAAW,iBAAA;CHgjB9C;AG/iBmC;EAAW,iBAAA;CHkjB9C;AGjjBmC;EAAW,iBAAA;CHojB9C;AGnjBmC;EAAW,iBAAA;CHsjB9C;AGrjBmC;EAAW,iBAAA;CHwjB9C;AGvjBmC;EAAW,iBAAA;CH0jB9C;AGzjBmC;EAAW,iBAAA;CH4jB9C;AG3jBmC;EAAW,iBAAA;CH8jB9C;AG7jBmC;EAAW,iBAAA;CHgkB9C;AG/jBmC;EAAW,iBAAA;CHkkB9C;AGjkBmC;EAAW,iBAAA;CHokB9C;AGnkBmC;EAAW,iBAAA;CHskB9C;AGrkBmC;EAAW,iBAAA;CHwkB9C;AGvkBmC;EAAW,iBAAA;CH0kB9C;AGzkBmC;EAAW,iBAAA;CH4kB9C;AG3kBmC;EAAW,iBAAA;CH8kB9C;AG7kBmC;EAAW,iBAAA;CHglB9C;AG/kBmC;EAAW,iBAAA;CHklB9C;AGjlBmC;EAAW,iBAAA;CHolB9C;AGnlBmC;EAAW,iBAAA;CHslB9C;AGrlBmC;EAAW,iBAAA;CHwlB9C;AGvlBmC;EAAW,iBAAA;CH0lB9C;AGzlBmC;EAAW,iBAAA;CH4lB9C;AG3lBmC;EAAW,iBAAA;CH8lB9C;AG7lBmC;EAAW,iBAAA;CHgmB9C;AG/lBmC;EAAW,iBAAA;CHkmB9C;AGjmBmC;EAAW,iBAAA;CHomB9C;AGnmBmC;EAAW,iBAAA;CHsmB9C;AGrmBmC;EAAW,iBAAA;CHwmB9C;AGvmBmC;EAAW,iBAAA;CH0mB9C;AGzmBmC;EAAW,iBAAA;CH4mB9C;AG3mBmC;EAAW,iBAAA;CH8mB9C;AG7mBmC;EAAW,iBAAA;CHgnB9C;AG/mBmC;EAAW,iBAAA;CHknB9C;AGjnBmC;EAAW,iBAAA;CHonB9C;AGnnBmC;EAAW,iBAAA;CHsnB9C;AGrnBmC;EAAW,iBAAA;CHwnB9C;AGvnBmC;EAAW,iBAAA;CH0nB9C;AGznBmC;EAAW,iBAAA;CH4nB9C;AG3nBmC;EAAW,iBAAA;CH8nB9C;AG7nBmC;EAAW,iBAAA;CHgoB9C;AG/nBmC;EAAW,iBAAA;CHkoB9C;AGjoBmC;EAAW,iBAAA;CHooB9C;AGnoBmC;EAAW,iBAAA;CHsoB9C;AGroBmC;EAAW,iBAAA;CHwoB9C;AG/nBmC;EAAW,iBAAA;CHkoB9C;AGjoBmC;EAAW,iBAAA;CHooB9C;AGnoBmC;EAAW,iBAAA;CHsoB9C;AGroBmC;EAAW,iBAAA;CHwoB9C;AGvoBmC;EAAW,iBAAA;CH0oB9C;AGzoBmC;EAAW,iBAAA;CH4oB9C;AG3oBmC;EAAW,iBAAA;CH8oB9C;AG7oBmC;EAAW,iBAAA;CHgpB9C;AG/oBmC;EAAW,iBAAA;CHkpB9C;AGjpBmC;EAAW,iBAAA;CHopB9C;AGnpBmC;EAAW,iBAAA;CHspB9C;AGrpBmC;EAAW,iBAAA;CHwpB9C;AGvpBmC;EAAW,iBAAA;CH0pB9C;AGzpBmC;EAAW,iBAAA;CH4pB9C;AG3pBmC;EAAW,iBAAA;CH8pB9C;AG7pBmC;EAAW,iBAAA;CHgqB9C;AG/pBmC;EAAW,iBAAA;CHkqB9C;AGjqBmC;EAAW,iBAAA;CHoqB9C;AGnqBmC;EAAW,iBAAA;CHsqB9C;AGrqBmC;EAAW,iBAAA;CHwqB9C;AGvqBmC;EAAW,iBAAA;CH0qB9C;AGzqBmC;EAAW,iBAAA;CH4qB9C;AG3qBmC;EAAW,iBAAA;CH8qB9C;AG7qBmC;EAAW,iBAAA;CHgrB9C;AG/qBmC;EAAW,iBAAA;CHkrB9C;AGjrBmC;EAAW,iBAAA;CHorB9C;AGnrBmC;EAAW,iBAAA;CHsrB9C;AGrrBmC;EAAW,iBAAA;CHwrB9C;AGvrBmC;EAAW,iBAAA;CH0rB9C;AGzrBmC;EAAW,iBAAA;CH4rB9C;AG3rBmC;EAAW,iBAAA;CH8rB9C;AG7rBmC;EAAW,iBAAA;CHgsB9C;AG/rBmC;EAAW,iBAAA;CHksB9C;AGjsBmC;EAAW,iBAAA;CHosB9C;AGnsBmC;EAAW,iBAAA;CHssB9C;AGrsBmC;EAAW,iBAAA;CHwsB9C;AGvsBmC;EAAW,iBAAA;CH0sB9C;AGzsBmC;EAAW,iBAAA;CH4sB9C;AG3sBmC;EAAW,iBAAA;CH8sB9C;AG7sBmC;EAAW,iBAAA;CHgtB9C;AG/sBmC;EAAW,iBAAA;CHktB9C;AGjtBmC;EAAW,iBAAA;CHotB9C;AGntBmC;EAAW,iBAAA;CHstB9C;AGrtBmC;EAAW,iBAAA;CHwtB9C;AGvtBmC;EAAW,iBAAA;CH0tB9C;AGztBmC;EA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DH;AezkDC;EACE,oBAAA;Cf2kDH;Ae5kDC;EACE,WAAA;Cf8kDH;Ae/kDC;EACE,oBAAA;CfilDH;AellDC;EACE,mBAAA;CfolDH;AehlDC;EACE,YAAA;CfklDH;AelmDC;EACE,WAAA;CfomDH;AermDC;EACE,mBAAA;CfumDH;AexmDC;EACE,mBAAA;Cf0mDH;Ae3mDC;EACE,UAAA;Cf6mDH;Ae9mDC;EACE,mBAAA;CfgnDH;AejnDC;EACE,mBAAA;CfmnDH;AepnDC;EACE,UAAA;CfsnDH;AevnDC;EACE,mBAAA;CfynDH;Ae1nDC;EACE,mBAAA;Cf4nDH;Ae7nDC;EACE,UAAA;Cf+nDH;AehoDC;EACE,mBAAA;CfkoDH;AenoDC;EACE,kBAAA;CfqoDH;AejoDC;EACE,WAAA;CfmoDH;AernDC;EACE,kBAAA;CfunDH;AexnDC;EACE,0BAAA;Cf0nDH;Ae3nDC;EACE,0BAAA;Cf6nDH;Ae9nDC;EACE,iBAAA;CfgoDH;AejoDC;EACE,0BAAA;CfmoDH;AepoDC;EACE,0BAAA;CfsoDH;AevoDC;EACE,iBAAA;CfyoDH;Ae1oDC;EACE,0BAAA;Cf4oDH;Ae7oDC;EACE,0BAAA;Cf+oDH;AehpDC;EACE,iBAAA;CfkpDH;AenpDC;EACE,0BAAA;CfqpDH;AetpDC;EACE,yBAAA;CfwpDH;AezpDC;EACE,gBAAA;Cf2pDH;Aa3pDD;EElCI;IACE,YAAA;GfgsDH;EezrDD;IACE,YAAA;Gf2rDD;Ee5rDD;IACE,oBAAA;Gf8rDD;Ee/rDD;IACE,oBAAA;GfisDD;EelsDD;IACE,WAAA;GfosDD;EersDD;IACE,oBAAA;GfusDD;EexsDD;IACE,oBAAA;Gf0sDD;Ee3sDD;IACE,WAAA;Gf6sDD;Ee9sDD;IACE,oBAAA;GfgtDD;EejtDD;IACE,oBAAA;GfmtDD;EeptDD;IACE,WAAA;GfstDD;EevtDD;IACE,oBAAA;GfytDD;Ee1tDD;IACE,mBAAA;Gf4tDD;Ee9sDD;IACE,YAAA;GfgtDD;EejtDD;IACE,oBAAA;GfmtDD;EeptDD;IACE,oBAAA;GfstDD;EevtDD;IACE,WAAA;GfytDD;Ee1tDD;IACE,oBAAA;Gf4tDD;Ee7tDD;IACE,oBAAA;Gf+tDD;EehuDD;IACE,WAAA;GfkuDD;EenuDD;IACE,oBAAA;GfquDD;EetuDD;IACE,oBAAA;GfwuDD;EezuDD;IACE,WAAA;Gf2uDD;Ee5uDD;IACE,oBAAA;Gf8uDD;Ee/uDD;IACE,mBAAA;GfivDD;Ee7uDD;IACE,YAAA;Gf+uDD;Ee/vDD;IACE,WAAA;GfiwDD;EelwDD;IACE,mBAAA;GfowDD;EerwDD;IACE,mBAAA;GfuwDD;EexwDD;IACE,UAAA;Gf0wDD;Ee3wDD;IACE,mBAAA;Gf6wDD;Ee9wDD;IACE,mBAAA;GfgxDD;EejxDD;IACE,UAAA;GfmxDD;EepxDD;IACE,mBAAA;GfsxDD;EevxDD;IACE,mBAAA;GfyxDD;Ee1xDD;IACE,UAAA;Gf4xDD;Ee7xDD;IACE,mBAAA;Gf+xDD;EehyDD;IACE,kBAAA;GfkyDD;Ee9xDD;IACE,WAAA;GfgyDD;EelxDD;IACE,kBAAA;GfoxDD;EerxDD;IACE,0BAAA;GfuxDD;EexxDD;IACE,0BAAA;Gf0xDD;Ee3xDD;IACE,iBAAA;Gf6xDD;Ee9xDD;IACE,0BAAA;GfgyDD;EejyDD;IACE,0BAAA;GfmyDD;EepyDD;IACE,iBAAA;GfsyDD;EevyDD;IACE,0BAAA;GfyyDD;Ee1yDD;IACE,0BAAA;Gf4yDD;Ee7yDD;IACE,iBAAA;Gf+yDD;EehzDD;IACE,0BAAA;GfkzDD;EenzDD;IACE,yBAAA;GfqzDD;EetzDD;IACE,gBAAA;GfwzDD;CACF;AahzDD;EE3CI;IACE,YAAA;Gf81DH;Eev1DD;IACE,YAAA;Gfy1DD;Ee11DD;IACE,oBAAA;Gf41DD;Ee71DD;IACE,oBAAA;Gf+1DD;Eeh2DD;IACE,WAAA;Gfk2DD;Een2DD;IACE,oBAAA;Gfq2DD;Eet2DD;IACE,oBAAA;Gfw2DD;Eez2DD;IACE,WAAA;Gf22DD;Ee52DD;IACE,oBAAA;Gf82DD;Ee/2DD;IACE,oBAAA;Gfi3DD;Eel3DD;IACE,WAAA;Gfo3DD;Eer3DD;IACE,oBAAA;Gfu3DD;Eex3DD;IACE,mBAAA;Gf03DD;Ee52DD;IACE,YAAA;Gf82DD;Ee/2DD;IACE,oBAAA;Gfi3DD;Eel3DD;IACE,oBAAA;Gfo3DD;Eer3DD;IACE,WAAA;Gfu3DD;Eex3DD;IACE,oBAAA;Gf03DD;Ee33DD;IACE,oBAAA;Gf63DD;Ee93DD;IACE,WAAA;Gfg4DD;Eej4DD;IACE,oBAAA;Gfm4DD;Eep4DD;IACE,oBAAA;Gfs4DD;Eev4DD;IACE,WAAA;Gfy4DD;Ee14DD;IACE,oBAAA;Gf44DD;Ee74DD;IACE,mBAAA;Gf+4DD;Ee34DD;IACE,YAAA;Gf64DD;Ee75DD;IACE,WAAA;Gf+5DD;Eeh6DD;IACE,mBAAA;Gfk6DD;Een6DD;IACE,mBAAA;Gfq6DD;Eet6DD;IACE,UAAA;Gfw6DD;Eez6DD;IACE,mBAAA;Gf26DD;Ee56DD;IACE,mBAAA;Gf86DD;Ee/6DD;IACE,UAAA;Gfi7DD;Eel7DD;IACE,mBAAA;Gfo7DD;Eer7DD;IACE,mBAAA;Gfu7DD;Eex7DD;IACE,UAAA;Gf07DD;Ee37DD;IACE,mBAAA;Gf67DD;Ee97DD;IACE,kBAAA;Gfg8DD;Ee57DD;IACE,WAAA;Gf87DD;Eeh7DD;IACE,kBAAA;Gfk7DD;Een7DD;IACE,0BAAA;Gfq7DD;Eet7DD;IACE,0BAAA;Gfw7DD;Eez7DD;IACE,iBAAA;Gf27DD;Ee57DD;IACE,0BAAA;Gf87DD;Ee/7DD;IACE,0BAAA;Gfi8DD;Eel8DD;IACE,iBAAA;Gfo8DD;Eer8DD;IACE,0BAAA;Gfu8DD;Eex8DD;IACE,0BAAA;Gf08DD;Ee38DD;IACE,iBAAA;Gf68DD;Ee98DD;IACE,0BAAA;Gfg9DD;Eej9DD;IACE,yBAAA;Gfm9DD;Eep9DD;IACE,gBAAA;Gfs9DD;CACF;Aa38DD;EE9CI;IACE,YAAA;Gf4/DH;Eer/DD;IACE,YAAA;Gfu/DD;Eex/DD;IACE,oBAAA;Gf0/DD;Ee3/DD;IACE,oBAAA;Gf6/DD;Ee9/DD;IACE,WAAA;GfggED;EejgED;IACE,oBAAA;GfmgED;EepgED;IACE,oBAAA;GfsgED;EevgED;IACE,WAAA;GfygED;Ee1gED;IACE,oBAAA;Gf4gED;Ee7gED;IACE,oBAAA;Gf+gED;EehhED;IACE,WAAA;GfkhED;EenhED;IACE,oBAAA;GfqhED;EethED;IACE,mBAAA;GfwhED;Ee1gED;IACE,YAAA;Gf4gED;Ee7gED;IACE,oBAAA;Gf+gED;EehhED;IACE,oBAAA;GfkhED;EenhED;IACE,WAAA;GfqhED;EethED;IACE,oBAAA;GfwhED;EezhED;IACE,oBAAA;Gf2hED;Ee5hED;IACE,WAAA;Gf8hED;Ee/hED;IACE,oBAAA;GfiiED;EeliED;IACE,oBAAA;GfoiED;EeriED;IACE,WAAA;GfuiED;EexiED;IACE,oBAAA;Gf0iED;Ee3iED;IACE,mBAAA;Gf6iED;EeziED;IACE,YAAA;Gf2iED;Ee3jED;IACE,WAAA;Gf6jED;Ee9jED;IACE,mBAAA;GfgkED;EejkED;IACE,mBAAA;GfmkED;EepkED;IACE,UAAA;GfskED;EevkED;IACE,mBAAA;GfykED;Ee1kED;IACE,mBAAA;Gf4kED;Ee7kED;IACE,UAAA;Gf+kED;EehlED;IACE,mBAAA;GfklED;EenlED;IACE,mBAAA;GfqlED;EetlED;IACE,UAAA;GfwlED;EezlED;IACE,mBAAA;Gf2lED;Ee5lED;IACE,kBAAA;Gf8lED;Ee1lED;IACE,WAAA;Gf4lED;Ee9kED;IACE,kBAAA;GfglED;EejlED;IACE,0BAAA;GfmlED;EeplED;IACE,0BAAA;GfslED;EevlED;IACE,iBAAA;GfylED;Ee1lED;IACE,0BAAA;Gf4lED;Ee7lED;IACE,0BAAA;Gf+lED;EehmED;IACE,iBAAA;GfkmED;EenmED;IACE,0BAAA;GfqmED;EetmED;IACE,0BAAA;GfwmED;EezmED;IACE,iBAAA;Gf2mED;Ee5mED;IACE,0BAAA;Gf8mED;Ee/mED;IACE,yBAAA;GfinED;EelnED;IACE,gBAAA;GfonED;CACF;AgBxrED;EACE,8BAAA;ChB0rED;AgBxrED;EACE,iBAAA;EACA,oBAAA;EACA,eAAA;EACA,iBAAA;ChB0rED;AgBxrED;EACE,iBAAA;ChB0rED;AgBprED;EACE,YAAA;EACA,gBAAA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","file":"bootstrap.css","sourcesContent":["/*!\n * Bootstrap v3.3.5 (http://getbootstrap.com)\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\nhtml {\n font-family: sans-serif;\n -ms-text-size-adjust: 100%;\n -webkit-text-size-adjust: 100%;\n}\nbody {\n margin: 0;\n}\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block;\n vertical-align: baseline;\n}\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n[hidden],\ntemplate {\n display: none;\n}\na {\n background-color: transparent;\n}\na:active,\na:hover {\n outline: 0;\n}\nabbr[title] {\n border-bottom: 1px dotted;\n}\nb,\nstrong {\n font-weight: bold;\n}\ndfn {\n font-style: italic;\n}\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\nmark {\n background: #ff0;\n color: #000;\n}\nsmall {\n font-size: 80%;\n}\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\nsup {\n top: -0.5em;\n}\nsub {\n bottom: -0.25em;\n}\nimg {\n border: 0;\n}\nsvg:not(:root) {\n overflow: hidden;\n}\nfigure {\n margin: 1em 40px;\n}\nhr {\n box-sizing: content-box;\n height: 0;\n}\npre {\n overflow: auto;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit;\n font: inherit;\n margin: 0;\n}\nbutton {\n overflow: visible;\n}\nbutton,\nselect {\n text-transform: none;\n}\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button;\n cursor: pointer;\n}\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\ninput {\n line-height: normal;\n}\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box;\n padding: 0;\n}\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\ninput[type=\"search\"] {\n -webkit-appearance: textfield;\n box-sizing: content-box;\n}\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\nlegend {\n border: 0;\n padding: 0;\n}\ntextarea {\n overflow: auto;\n}\noptgroup {\n font-weight: bold;\n}\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\ntd,\nth {\n padding: 0;\n}\n/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n@media print {\n *,\n *:before,\n *:after {\n background: transparent !important;\n color: #000 !important;\n box-shadow: none !important;\n text-shadow: none !important;\n }\n a,\n a:visited {\n text-decoration: underline;\n }\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n thead {\n display: table-header-group;\n }\n tr,\n img {\n page-break-inside: avoid;\n }\n img {\n max-width: 100% !important;\n }\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n h2,\n h3 {\n page-break-after: avoid;\n }\n .navbar {\n display: none;\n }\n .btn > .caret,\n .dropup > .btn > .caret {\n border-top-color: #000 !important;\n }\n .label {\n border: 1px solid #000;\n }\n .table {\n border-collapse: collapse !important;\n }\n .table td,\n .table th {\n background-color: #fff !important;\n }\n .table-bordered th,\n .table-bordered td {\n border: 1px solid #ddd !important;\n }\n}\n@font-face {\n font-family: 'Glyphicons Halflings';\n src: url('../fonts/glyphicons-halflings-regular.eot');\n src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg');\n}\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: 'Glyphicons Halflings';\n font-style: normal;\n font-weight: normal;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n.glyphicon-asterisk:before {\n content: \"\\2a\";\n}\n.glyphicon-plus:before {\n content: \"\\2b\";\n}\n.glyphicon-euro:before,\n.glyphicon-eur:before {\n content: \"\\20ac\";\n}\n.glyphicon-minus:before {\n content: \"\\2212\";\n}\n.glyphicon-cloud:before {\n content: \"\\2601\";\n}\n.glyphicon-envelope:before {\n content: \"\\2709\";\n}\n.glyphicon-pencil:before {\n content: \"\\270f\";\n}\n.glyphicon-glass:before {\n content: \"\\e001\";\n}\n.glyphicon-music:before {\n content: \"\\e002\";\n}\n.glyphicon-search:before {\n content: \"\\e003\";\n}\n.glyphicon-heart:before {\n content: \"\\e005\";\n}\n.glyphicon-star:before {\n content: \"\\e006\";\n}\n.glyphicon-star-empty:before {\n content: \"\\e007\";\n}\n.glyphicon-user:before {\n content: \"\\e008\";\n}\n.glyphicon-film:before {\n content: \"\\e009\";\n}\n.glyphicon-th-large:before {\n content: \"\\e010\";\n}\n.glyphicon-th:before {\n content: \"\\e011\";\n}\n.glyphicon-th-list:before {\n content: \"\\e012\";\n}\n.glyphicon-ok:before {\n content: \"\\e013\";\n}\n.glyphicon-remove:before {\n content: \"\\e014\";\n}\n.glyphicon-zoom-in:before {\n content: \"\\e015\";\n}\n.glyphicon-zoom-out:before {\n content: \"\\e016\";\n}\n.glyphicon-off:before {\n content: \"\\e017\";\n}\n.glyphicon-signal:before {\n content: \"\\e018\";\n}\n.glyphicon-cog:before {\n content: \"\\e019\";\n}\n.glyphicon-trash:before {\n content: \"\\e020\";\n}\n.glyphicon-home:before {\n content: \"\\e021\";\n}\n.glyphicon-file:before {\n content: \"\\e022\";\n}\n.glyphicon-time:before {\n content: \"\\e023\";\n}\n.glyphicon-road:before {\n content: \"\\e024\";\n}\n.glyphicon-download-alt:before {\n content: \"\\e025\";\n}\n.glyphicon-download:before {\n content: \"\\e026\";\n}\n.glyphicon-upload:before {\n content: \"\\e027\";\n}\n.glyphicon-inbox:before {\n content: \"\\e028\";\n}\n.glyphicon-play-circle:before {\n content: \"\\e029\";\n}\n.glyphicon-repeat:before {\n content: \"\\e030\";\n}\n.glyphicon-refresh:before {\n content: \"\\e031\";\n}\n.glyphicon-list-alt:before {\n content: \"\\e032\";\n}\n.glyphicon-lock:before {\n content: \"\\e033\";\n}\n.glyphicon-flag:before {\n content: \"\\e034\";\n}\n.glyphicon-headphones:before {\n content: \"\\e035\";\n}\n.glyphicon-volume-off:before {\n content: \"\\e036\";\n}\n.glyphicon-volume-down:before {\n content: \"\\e037\";\n}\n.glyphicon-volume-up:before {\n content: \"\\e038\";\n}\n.glyphicon-qrcode:before {\n content: \"\\e039\";\n}\n.glyphicon-barcode:before {\n content: \"\\e040\";\n}\n.glyphicon-tag:before {\n content: \"\\e041\";\n}\n.glyphicon-tags:before {\n content: \"\\e042\";\n}\n.glyphicon-book:before {\n content: \"\\e043\";\n}\n.glyphicon-bookmark:before {\n content: \"\\e044\";\n}\n.glyphicon-print:before {\n content: \"\\e045\";\n}\n.glyphicon-camera:before {\n content: \"\\e046\";\n}\n.glyphicon-font:before {\n content: \"\\e047\";\n}\n.glyphicon-bold:before {\n content: \"\\e048\";\n}\n.glyphicon-italic:before {\n content: \"\\e049\";\n}\n.glyphicon-text-height:before {\n content: \"\\e050\";\n}\n.glyphicon-text-width:before {\n content: \"\\e051\";\n}\n.glyphicon-align-left:before {\n content: \"\\e052\";\n}\n.glyphicon-align-center:before {\n content: \"\\e053\";\n}\n.glyphicon-align-right:before {\n content: \"\\e054\";\n}\n.glyphicon-align-justify:before {\n content: \"\\e055\";\n}\n.glyphicon-list:before {\n content: \"\\e056\";\n}\n.glyphicon-indent-left:before {\n content: \"\\e057\";\n}\n.glyphicon-indent-right:before {\n content: \"\\e058\";\n}\n.glyphicon-facetime-video:before {\n content: \"\\e059\";\n}\n.glyphicon-picture:before {\n content: \"\\e060\";\n}\n.glyphicon-map-marker:before {\n content: \"\\e062\";\n}\n.glyphicon-adjust:before {\n content: \"\\e063\";\n}\n.glyphicon-tint:before {\n content: \"\\e064\";\n}\n.glyphicon-edit:before {\n content: \"\\e065\";\n}\n.glyphicon-share:before {\n content: \"\\e066\";\n}\n.glyphicon-check:before {\n content: \"\\e067\";\n}\n.glyphicon-move:before {\n content: \"\\e068\";\n}\n.glyphicon-step-backward:before {\n content: \"\\e069\";\n}\n.glyphicon-fast-backward:before {\n content: \"\\e070\";\n}\n.glyphicon-backward:before {\n content: \"\\e071\";\n}\n.glyphicon-play:before {\n content: \"\\e072\";\n}\n.glyphicon-pause:before {\n content: \"\\e073\";\n}\n.glyphicon-stop:before {\n content: \"\\e074\";\n}\n.glyphicon-forward:before {\n content: \"\\e075\";\n}\n.glyphicon-fast-forward:before {\n content: \"\\e076\";\n}\n.glyphicon-step-forward:before {\n content: \"\\e077\";\n}\n.glyphicon-eject:before {\n content: \"\\e078\";\n}\n.glyphicon-chevron-left:before {\n content: \"\\e079\";\n}\n.glyphicon-chevron-right:before {\n content: \"\\e080\";\n}\n.glyphicon-plus-sign:before {\n content: \"\\e081\";\n}\n.glyphicon-minus-sign:before {\n content: \"\\e082\";\n}\n.glyphicon-remove-sign:before {\n content: \"\\e083\";\n}\n.glyphicon-ok-sign:before {\n content: \"\\e084\";\n}\n.glyphicon-question-sign:before {\n content: \"\\e085\";\n}\n.glyphicon-info-sign:before {\n content: \"\\e086\";\n}\n.glyphicon-screenshot:before {\n content: \"\\e087\";\n}\n.glyphicon-remove-circle:before {\n content: \"\\e088\";\n}\n.glyphicon-ok-circle:before {\n content: \"\\e089\";\n}\n.glyphicon-ban-circle:before {\n content: \"\\e090\";\n}\n.glyphicon-arrow-left:before {\n content: \"\\e091\";\n}\n.glyphicon-arrow-right:before {\n content: \"\\e092\";\n}\n.glyphicon-arrow-up:before {\n content: \"\\e093\";\n}\n.glyphicon-arrow-down:before {\n content: \"\\e094\";\n}\n.glyphicon-share-alt:before {\n content: \"\\e095\";\n}\n.glyphicon-resize-full:before {\n content: \"\\e096\";\n}\n.glyphicon-resize-small:before {\n content: \"\\e097\";\n}\n.glyphicon-exclamation-sign:before {\n content: \"\\e101\";\n}\n.glyphicon-gift:before {\n content: \"\\e102\";\n}\n.glyphicon-leaf:before {\n content: \"\\e103\";\n}\n.glyphicon-fire:before {\n content: \"\\e104\";\n}\n.glyphicon-eye-open:before {\n content: \"\\e105\";\n}\n.glyphicon-eye-close:before {\n content: \"\\e106\";\n}\n.glyphicon-warning-sign:before {\n content: \"\\e107\";\n}\n.glyphicon-plane:before {\n content: \"\\e108\";\n}\n.glyphicon-calendar:before {\n content: \"\\e109\";\n}\n.glyphicon-random:before {\n content: \"\\e110\";\n}\n.glyphicon-comment:before {\n content: \"\\e111\";\n}\n.glyphicon-magnet:before {\n content: \"\\e112\";\n}\n.glyphicon-chevron-up:before {\n content: \"\\e113\";\n}\n.glyphicon-chevron-down:before {\n content: \"\\e114\";\n}\n.glyphicon-retweet:before {\n content: \"\\e115\";\n}\n.glyphicon-shopping-cart:before {\n content: \"\\e116\";\n}\n.glyphicon-folder-close:before {\n content: \"\\e117\";\n}\n.glyphicon-folder-open:before {\n content: \"\\e118\";\n}\n.glyphicon-resize-vertical:before {\n content: \"\\e119\";\n}\n.glyphicon-resize-horizontal:before {\n content: \"\\e120\";\n}\n.glyphicon-hdd:before {\n content: \"\\e121\";\n}\n.glyphicon-bullhorn:before {\n content: \"\\e122\";\n}\n.glyphicon-bell:before {\n content: \"\\e123\";\n}\n.glyphicon-certificate:before {\n content: \"\\e124\";\n}\n.glyphicon-thumbs-up:before {\n content: \"\\e125\";\n}\n.glyphicon-thumbs-down:before {\n content: \"\\e126\";\n}\n.glyphicon-hand-right:before {\n content: \"\\e127\";\n}\n.glyphicon-hand-left:before {\n content: \"\\e128\";\n}\n.glyphicon-hand-up:before {\n content: \"\\e129\";\n}\n.glyphicon-hand-down:before {\n content: \"\\e130\";\n}\n.glyphicon-circle-arrow-right:before {\n content: \"\\e131\";\n}\n.glyphicon-circle-arrow-left:before {\n content: \"\\e132\";\n}\n.glyphicon-circle-arrow-up:before {\n content: \"\\e133\";\n}\n.glyphicon-circle-arrow-down:before {\n content: \"\\e134\";\n}\n.glyphicon-globe:before {\n content: \"\\e135\";\n}\n.glyphicon-wrench:before {\n content: \"\\e136\";\n}\n.glyphicon-tasks:before {\n content: \"\\e137\";\n}\n.glyphicon-filter:before {\n content: \"\\e138\";\n}\n.glyphicon-briefcase:before {\n content: \"\\e139\";\n}\n.glyphicon-fullscreen:before {\n content: \"\\e140\";\n}\n.glyphicon-dashboard:before {\n content: \"\\e141\";\n}\n.glyphicon-paperclip:before {\n content: \"\\e142\";\n}\n.glyphicon-heart-empty:before {\n content: \"\\e143\";\n}\n.glyphicon-link:before {\n content: \"\\e144\";\n}\n.glyphicon-phone:before {\n content: \"\\e145\";\n}\n.glyphicon-pushpin:before {\n content: \"\\e146\";\n}\n.glyphicon-usd:before {\n content: \"\\e148\";\n}\n.glyphicon-gbp:before {\n content: \"\\e149\";\n}\n.glyphicon-sort:before {\n content: \"\\e150\";\n}\n.glyphicon-sort-by-alphabet:before {\n content: \"\\e151\";\n}\n.glyphicon-sort-by-alphabet-alt:before {\n content: \"\\e152\";\n}\n.glyphicon-sort-by-order:before {\n content: \"\\e153\";\n}\n.glyphicon-sort-by-order-alt:before {\n content: \"\\e154\";\n}\n.glyphicon-sort-by-attributes:before {\n content: \"\\e155\";\n}\n.glyphicon-sort-by-attributes-alt:before {\n content: \"\\e156\";\n}\n.glyphicon-unchecked:before {\n content: \"\\e157\";\n}\n.glyphicon-expand:before {\n content: \"\\e158\";\n}\n.glyphicon-collapse-down:before {\n content: \"\\e159\";\n}\n.glyphicon-collapse-up:before {\n content: \"\\e160\";\n}\n.glyphicon-log-in:before {\n content: \"\\e161\";\n}\n.glyphicon-flash:before {\n content: \"\\e162\";\n}\n.glyphicon-log-out:before {\n content: \"\\e163\";\n}\n.glyphicon-new-window:before {\n content: \"\\e164\";\n}\n.glyphicon-record:before {\n content: \"\\e165\";\n}\n.glyphicon-save:before {\n content: \"\\e166\";\n}\n.glyphicon-open:before {\n content: \"\\e167\";\n}\n.glyphicon-saved:before {\n content: \"\\e168\";\n}\n.glyphicon-import:before {\n content: \"\\e169\";\n}\n.glyphicon-export:before {\n content: \"\\e170\";\n}\n.glyphicon-send:before {\n content: \"\\e171\";\n}\n.glyphicon-floppy-disk:before {\n content: \"\\e172\";\n}\n.glyphicon-floppy-saved:before {\n content: \"\\e173\";\n}\n.glyphicon-floppy-remove:before {\n content: \"\\e174\";\n}\n.glyphicon-floppy-save:before {\n content: \"\\e175\";\n}\n.glyphicon-floppy-open:before {\n content: \"\\e176\";\n}\n.glyphicon-credit-card:before {\n content: \"\\e177\";\n}\n.glyphicon-transfer:before {\n content: \"\\e178\";\n}\n.glyphicon-cutlery:before {\n content: \"\\e179\";\n}\n.glyphicon-header:before {\n content: \"\\e180\";\n}\n.glyphicon-compressed:before {\n content: \"\\e181\";\n}\n.glyphicon-earphone:before {\n content: \"\\e182\";\n}\n.glyphicon-phone-alt:before {\n content: \"\\e183\";\n}\n.glyphicon-tower:before {\n content: \"\\e184\";\n}\n.glyphicon-stats:before {\n content: \"\\e185\";\n}\n.glyphicon-sd-video:before {\n content: \"\\e186\";\n}\n.glyphicon-hd-video:before {\n content: \"\\e187\";\n}\n.glyphicon-subtitles:before {\n content: \"\\e188\";\n}\n.glyphicon-sound-stereo:before {\n content: \"\\e189\";\n}\n.glyphicon-sound-dolby:before {\n content: \"\\e190\";\n}\n.glyphicon-sound-5-1:before {\n content: \"\\e191\";\n}\n.glyphicon-sound-6-1:before {\n content: \"\\e192\";\n}\n.glyphicon-sound-7-1:before {\n content: \"\\e193\";\n}\n.glyphicon-copyright-mark:before {\n content: \"\\e194\";\n}\n.glyphicon-registration-mark:before {\n content: \"\\e195\";\n}\n.glyphicon-cloud-download:before {\n content: \"\\e197\";\n}\n.glyphicon-cloud-upload:before {\n content: \"\\e198\";\n}\n.glyphicon-tree-conifer:before {\n content: \"\\e199\";\n}\n.glyphicon-tree-deciduous:before {\n content: \"\\e200\";\n}\n.glyphicon-cd:before {\n content: \"\\e201\";\n}\n.glyphicon-save-file:before {\n content: \"\\e202\";\n}\n.glyphicon-open-file:before {\n content: \"\\e203\";\n}\n.glyphicon-level-up:before {\n content: \"\\e204\";\n}\n.glyphicon-copy:before {\n content: \"\\e205\";\n}\n.glyphicon-paste:before {\n content: \"\\e206\";\n}\n.glyphicon-alert:before {\n content: \"\\e209\";\n}\n.glyphicon-equalizer:before {\n content: \"\\e210\";\n}\n.glyphicon-king:before {\n content: \"\\e211\";\n}\n.glyphicon-queen:before {\n content: \"\\e212\";\n}\n.glyphicon-pawn:before {\n content: \"\\e213\";\n}\n.glyphicon-bishop:before {\n content: \"\\e214\";\n}\n.glyphicon-knight:before {\n content: \"\\e215\";\n}\n.glyphicon-baby-formula:before {\n content: \"\\e216\";\n}\n.glyphicon-tent:before {\n content: \"\\26fa\";\n}\n.glyphicon-blackboard:before {\n content: \"\\e218\";\n}\n.glyphicon-bed:before {\n content: \"\\e219\";\n}\n.glyphicon-apple:before {\n content: \"\\f8ff\";\n}\n.glyphicon-erase:before {\n content: \"\\e221\";\n}\n.glyphicon-hourglass:before {\n content: \"\\231b\";\n}\n.glyphicon-lamp:before {\n content: \"\\e223\";\n}\n.glyphicon-duplicate:before {\n content: \"\\e224\";\n}\n.glyphicon-piggy-bank:before {\n content: \"\\e225\";\n}\n.glyphicon-scissors:before {\n content: \"\\e226\";\n}\n.glyphicon-bitcoin:before {\n content: \"\\e227\";\n}\n.glyphicon-btc:before {\n content: \"\\e227\";\n}\n.glyphicon-xbt:before {\n content: \"\\e227\";\n}\n.glyphicon-yen:before {\n content: \"\\00a5\";\n}\n.glyphicon-jpy:before {\n content: \"\\00a5\";\n}\n.glyphicon-ruble:before {\n content: \"\\20bd\";\n}\n.glyphicon-rub:before {\n content: \"\\20bd\";\n}\n.glyphicon-scale:before {\n content: \"\\e230\";\n}\n.glyphicon-ice-lolly:before {\n content: \"\\e231\";\n}\n.glyphicon-ice-lolly-tasted:before {\n content: \"\\e232\";\n}\n.glyphicon-education:before {\n content: \"\\e233\";\n}\n.glyphicon-option-horizontal:before {\n content: \"\\e234\";\n}\n.glyphicon-option-vertical:before {\n content: \"\\e235\";\n}\n.glyphicon-menu-hamburger:before {\n content: \"\\e236\";\n}\n.glyphicon-modal-window:before {\n content: \"\\e237\";\n}\n.glyphicon-oil:before {\n content: \"\\e238\";\n}\n.glyphicon-grain:before {\n content: \"\\e239\";\n}\n.glyphicon-sunglasses:before {\n content: \"\\e240\";\n}\n.glyphicon-text-size:before {\n content: \"\\e241\";\n}\n.glyphicon-text-color:before {\n content: \"\\e242\";\n}\n.glyphicon-text-background:before {\n content: \"\\e243\";\n}\n.glyphicon-object-align-top:before {\n content: \"\\e244\";\n}\n.glyphicon-object-align-bottom:before {\n content: \"\\e245\";\n}\n.glyphicon-object-align-horizontal:before {\n content: \"\\e246\";\n}\n.glyphicon-object-align-left:before {\n content: \"\\e247\";\n}\n.glyphicon-object-align-vertical:before {\n content: \"\\e248\";\n}\n.glyphicon-object-align-right:before {\n content: \"\\e249\";\n}\n.glyphicon-triangle-right:before {\n content: \"\\e250\";\n}\n.glyphicon-triangle-left:before {\n content: \"\\e251\";\n}\n.glyphicon-triangle-bottom:before {\n content: \"\\e252\";\n}\n.glyphicon-triangle-top:before {\n content: \"\\e253\";\n}\n.glyphicon-console:before {\n content: \"\\e254\";\n}\n.glyphicon-superscript:before {\n content: \"\\e255\";\n}\n.glyphicon-subscript:before {\n content: \"\\e256\";\n}\n.glyphicon-menu-left:before {\n content: \"\\e257\";\n}\n.glyphicon-menu-right:before {\n content: \"\\e258\";\n}\n.glyphicon-menu-down:before {\n content: \"\\e259\";\n}\n.glyphicon-menu-up:before {\n content: \"\\e260\";\n}\n* {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\n*:before,\n*:after {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\nbody {\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 14px;\n line-height: 1.42857143;\n color: #333333;\n background-color: #ffffff;\n}\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\na {\n color: #337ab7;\n text-decoration: none;\n}\na:hover,\na:focus {\n color: #23527c;\n text-decoration: underline;\n}\na:focus {\n outline: thin dotted;\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\nfigure {\n margin: 0;\n}\nimg {\n vertical-align: middle;\n}\n.img-responsive,\n.thumbnail > img,\n.thumbnail a > img,\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n display: block;\n max-width: 100%;\n height: auto;\n}\n.img-rounded {\n border-radius: 6px;\n}\n.img-thumbnail {\n padding: 4px;\n line-height: 1.42857143;\n background-color: #ffffff;\n border: 1px solid #dddddd;\n border-radius: 4px;\n -webkit-transition: all 0.2s ease-in-out;\n -o-transition: all 0.2s ease-in-out;\n transition: all 0.2s ease-in-out;\n display: inline-block;\n max-width: 100%;\n height: auto;\n}\n.img-circle {\n border-radius: 50%;\n}\nhr {\n margin-top: 20px;\n margin-bottom: 20px;\n border: 0;\n border-top: 1px solid #eeeeee;\n}\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n border: 0;\n}\n.sr-only-focusable:active,\n.sr-only-focusable:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n}\n[role=\"button\"] {\n cursor: pointer;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n font-family: inherit;\n font-weight: 500;\n line-height: 1.1;\n color: inherit;\n}\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small,\n.h1 small,\n.h2 small,\n.h3 small,\n.h4 small,\n.h5 small,\n.h6 small,\nh1 .small,\nh2 .small,\nh3 .small,\nh4 .small,\nh5 .small,\nh6 .small,\n.h1 .small,\n.h2 .small,\n.h3 .small,\n.h4 .small,\n.h5 .small,\n.h6 .small {\n font-weight: normal;\n line-height: 1;\n color: #777777;\n}\nh1,\n.h1,\nh2,\n.h2,\nh3,\n.h3 {\n margin-top: 20px;\n margin-bottom: 10px;\n}\nh1 small,\n.h1 small,\nh2 small,\n.h2 small,\nh3 small,\n.h3 small,\nh1 .small,\n.h1 .small,\nh2 .small,\n.h2 .small,\nh3 .small,\n.h3 .small {\n font-size: 65%;\n}\nh4,\n.h4,\nh5,\n.h5,\nh6,\n.h6 {\n margin-top: 10px;\n margin-bottom: 10px;\n}\nh4 small,\n.h4 small,\nh5 small,\n.h5 small,\nh6 small,\n.h6 small,\nh4 .small,\n.h4 .small,\nh5 .small,\n.h5 .small,\nh6 .small,\n.h6 .small {\n font-size: 75%;\n}\nh1,\n.h1 {\n font-size: 36px;\n}\nh2,\n.h2 {\n font-size: 30px;\n}\nh3,\n.h3 {\n font-size: 24px;\n}\nh4,\n.h4 {\n font-size: 18px;\n}\nh5,\n.h5 {\n font-size: 14px;\n}\nh6,\n.h6 {\n font-size: 12px;\n}\np {\n margin: 0 0 10px;\n}\n.lead {\n margin-bottom: 20px;\n font-size: 16px;\n font-weight: 300;\n line-height: 1.4;\n}\n@media (min-width: 768px) {\n .lead {\n font-size: 21px;\n }\n}\nsmall,\n.small {\n font-size: 85%;\n}\nmark,\n.mark {\n background-color: #fcf8e3;\n padding: .2em;\n}\n.text-left {\n text-align: left;\n}\n.text-right {\n text-align: right;\n}\n.text-center {\n text-align: center;\n}\n.text-justify {\n text-align: justify;\n}\n.text-nowrap {\n white-space: nowrap;\n}\n.text-lowercase {\n text-transform: lowercase;\n}\n.text-uppercase {\n text-transform: uppercase;\n}\n.text-capitalize {\n text-transform: capitalize;\n}\n.text-muted {\n color: #777777;\n}\n.text-primary {\n color: #337ab7;\n}\na.text-primary:hover,\na.text-primary:focus {\n color: #286090;\n}\n.text-success {\n color: #3c763d;\n}\na.text-success:hover,\na.text-success:focus {\n color: #2b542c;\n}\n.text-info {\n color: #31708f;\n}\na.text-info:hover,\na.text-info:focus {\n color: #245269;\n}\n.text-warning {\n color: #8a6d3b;\n}\na.text-warning:hover,\na.text-warning:focus {\n color: #66512c;\n}\n.text-danger {\n color: #a94442;\n}\na.text-danger:hover,\na.text-danger:focus {\n color: #843534;\n}\n.bg-primary {\n color: #fff;\n background-color: #337ab7;\n}\na.bg-primary:hover,\na.bg-primary:focus {\n background-color: #286090;\n}\n.bg-success {\n background-color: #dff0d8;\n}\na.bg-success:hover,\na.bg-success:focus {\n background-color: #c1e2b3;\n}\n.bg-info {\n background-color: #d9edf7;\n}\na.bg-info:hover,\na.bg-info:focus {\n background-color: #afd9ee;\n}\n.bg-warning {\n background-color: #fcf8e3;\n}\na.bg-warning:hover,\na.bg-warning:focus {\n background-color: #f7ecb5;\n}\n.bg-danger {\n background-color: #f2dede;\n}\na.bg-danger:hover,\na.bg-danger:focus {\n background-color: #e4b9b9;\n}\n.page-header {\n padding-bottom: 9px;\n margin: 40px 0 20px;\n border-bottom: 1px solid #eeeeee;\n}\nul,\nol {\n margin-top: 0;\n margin-bottom: 10px;\n}\nul ul,\nol ul,\nul ol,\nol ol {\n margin-bottom: 0;\n}\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n.list-inline {\n padding-left: 0;\n list-style: none;\n margin-left: -5px;\n}\n.list-inline > li {\n display: inline-block;\n padding-left: 5px;\n padding-right: 5px;\n}\ndl {\n margin-top: 0;\n margin-bottom: 20px;\n}\ndt,\ndd {\n line-height: 1.42857143;\n}\ndt {\n font-weight: bold;\n}\ndd {\n margin-left: 0;\n}\n@media (min-width: 768px) {\n .dl-horizontal dt {\n float: left;\n width: 160px;\n clear: left;\n text-align: right;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .dl-horizontal dd {\n margin-left: 180px;\n }\n}\nabbr[title],\nabbr[data-original-title] {\n cursor: help;\n border-bottom: 1px dotted #777777;\n}\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\nblockquote {\n padding: 10px 20px;\n margin: 0 0 20px;\n font-size: 17.5px;\n border-left: 5px solid #eeeeee;\n}\nblockquote p:last-child,\nblockquote ul:last-child,\nblockquote ol:last-child {\n margin-bottom: 0;\n}\nblockquote footer,\nblockquote small,\nblockquote .small {\n display: block;\n font-size: 80%;\n line-height: 1.42857143;\n color: #777777;\n}\nblockquote footer:before,\nblockquote small:before,\nblockquote .small:before {\n content: '\\2014 \\00A0';\n}\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n border-right: 5px solid #eeeeee;\n border-left: 0;\n text-align: right;\n}\n.blockquote-reverse footer:before,\nblockquote.pull-right footer:before,\n.blockquote-reverse small:before,\nblockquote.pull-right small:before,\n.blockquote-reverse .small:before,\nblockquote.pull-right .small:before {\n content: '';\n}\n.blockquote-reverse footer:after,\nblockquote.pull-right footer:after,\n.blockquote-reverse small:after,\nblockquote.pull-right small:after,\n.blockquote-reverse .small:after,\nblockquote.pull-right .small:after {\n content: '\\00A0 \\2014';\n}\naddress {\n margin-bottom: 20px;\n font-style: normal;\n line-height: 1.42857143;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n}\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: #c7254e;\n background-color: #f9f2f4;\n border-radius: 4px;\n}\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: #ffffff;\n background-color: #333333;\n border-radius: 3px;\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\nkbd kbd {\n padding: 0;\n font-size: 100%;\n font-weight: bold;\n box-shadow: none;\n}\npre {\n display: block;\n padding: 9.5px;\n margin: 0 0 10px;\n font-size: 13px;\n line-height: 1.42857143;\n word-break: break-all;\n word-wrap: break-word;\n color: #333333;\n background-color: #f5f5f5;\n border: 1px solid #cccccc;\n border-radius: 4px;\n}\npre code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n}\n.pre-scrollable {\n max-height: 340px;\n overflow-y: scroll;\n}\n.container {\n margin-right: auto;\n margin-left: auto;\n padding-left: 15px;\n padding-right: 15px;\n}\n@media (min-width: 768px) {\n .container {\n width: 750px;\n }\n}\n@media (min-width: 992px) {\n .container {\n width: 970px;\n }\n}\n@media (min-width: 1200px) {\n .container {\n width: 1170px;\n }\n}\n.container-fluid {\n margin-right: auto;\n margin-left: auto;\n padding-left: 15px;\n padding-right: 15px;\n}\n.row {\n margin-left: -15px;\n margin-right: -15px;\n}\n.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {\n position: relative;\n min-height: 1px;\n padding-left: 15px;\n padding-right: 15px;\n}\n.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {\n float: left;\n}\n.col-xs-12 {\n width: 100%;\n}\n.col-xs-11 {\n width: 91.66666667%;\n}\n.col-xs-10 {\n width: 83.33333333%;\n}\n.col-xs-9 {\n width: 75%;\n}\n.col-xs-8 {\n width: 66.66666667%;\n}\n.col-xs-7 {\n width: 58.33333333%;\n}\n.col-xs-6 {\n width: 50%;\n}\n.col-xs-5 {\n width: 41.66666667%;\n}\n.col-xs-4 {\n width: 33.33333333%;\n}\n.col-xs-3 {\n width: 25%;\n}\n.col-xs-2 {\n width: 16.66666667%;\n}\n.col-xs-1 {\n width: 8.33333333%;\n}\n.col-xs-pull-12 {\n right: 100%;\n}\n.col-xs-pull-11 {\n right: 91.66666667%;\n}\n.col-xs-pull-10 {\n right: 83.33333333%;\n}\n.col-xs-pull-9 {\n right: 75%;\n}\n.col-xs-pull-8 {\n right: 66.66666667%;\n}\n.col-xs-pull-7 {\n right: 58.33333333%;\n}\n.col-xs-pull-6 {\n right: 50%;\n}\n.col-xs-pull-5 {\n right: 41.66666667%;\n}\n.col-xs-pull-4 {\n right: 33.33333333%;\n}\n.col-xs-pull-3 {\n right: 25%;\n}\n.col-xs-pull-2 {\n right: 16.66666667%;\n}\n.col-xs-pull-1 {\n right: 8.33333333%;\n}\n.col-xs-pull-0 {\n right: auto;\n}\n.col-xs-push-12 {\n left: 100%;\n}\n.col-xs-push-11 {\n left: 91.66666667%;\n}\n.col-xs-push-10 {\n left: 83.33333333%;\n}\n.col-xs-push-9 {\n left: 75%;\n}\n.col-xs-push-8 {\n left: 66.66666667%;\n}\n.col-xs-push-7 {\n left: 58.33333333%;\n}\n.col-xs-push-6 {\n left: 50%;\n}\n.col-xs-push-5 {\n left: 41.66666667%;\n}\n.col-xs-push-4 {\n left: 33.33333333%;\n}\n.col-xs-push-3 {\n left: 25%;\n}\n.col-xs-push-2 {\n left: 16.66666667%;\n}\n.col-xs-push-1 {\n left: 8.33333333%;\n}\n.col-xs-push-0 {\n left: auto;\n}\n.col-xs-offset-12 {\n margin-left: 100%;\n}\n.col-xs-offset-11 {\n margin-left: 91.66666667%;\n}\n.col-xs-offset-10 {\n margin-left: 83.33333333%;\n}\n.col-xs-offset-9 {\n margin-left: 75%;\n}\n.col-xs-offset-8 {\n margin-left: 66.66666667%;\n}\n.col-xs-offset-7 {\n margin-left: 58.33333333%;\n}\n.col-xs-offset-6 {\n margin-left: 50%;\n}\n.col-xs-offset-5 {\n margin-left: 41.66666667%;\n}\n.col-xs-offset-4 {\n margin-left: 33.33333333%;\n}\n.col-xs-offset-3 {\n margin-left: 25%;\n}\n.col-xs-offset-2 {\n margin-left: 16.66666667%;\n}\n.col-xs-offset-1 {\n margin-left: 8.33333333%;\n}\n.col-xs-offset-0 {\n margin-left: 0%;\n}\n@media (min-width: 768px) {\n .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {\n float: left;\n }\n .col-sm-12 {\n width: 100%;\n }\n .col-sm-11 {\n width: 91.66666667%;\n }\n .col-sm-10 {\n width: 83.33333333%;\n }\n .col-sm-9 {\n width: 75%;\n }\n .col-sm-8 {\n width: 66.66666667%;\n }\n .col-sm-7 {\n width: 58.33333333%;\n }\n .col-sm-6 {\n width: 50%;\n }\n .col-sm-5 {\n width: 41.66666667%;\n }\n .col-sm-4 {\n width: 33.33333333%;\n }\n .col-sm-3 {\n width: 25%;\n }\n .col-sm-2 {\n width: 16.66666667%;\n }\n .col-sm-1 {\n width: 8.33333333%;\n }\n .col-sm-pull-12 {\n right: 100%;\n }\n .col-sm-pull-11 {\n right: 91.66666667%;\n }\n .col-sm-pull-10 {\n right: 83.33333333%;\n }\n .col-sm-pull-9 {\n right: 75%;\n }\n .col-sm-pull-8 {\n right: 66.66666667%;\n }\n .col-sm-pull-7 {\n right: 58.33333333%;\n }\n .col-sm-pull-6 {\n right: 50%;\n }\n .col-sm-pull-5 {\n right: 41.66666667%;\n }\n .col-sm-pull-4 {\n right: 33.33333333%;\n }\n .col-sm-pull-3 {\n right: 25%;\n }\n .col-sm-pull-2 {\n right: 16.66666667%;\n }\n .col-sm-pull-1 {\n right: 8.33333333%;\n }\n .col-sm-pull-0 {\n right: auto;\n }\n .col-sm-push-12 {\n left: 100%;\n }\n .col-sm-push-11 {\n left: 91.66666667%;\n }\n .col-sm-push-10 {\n left: 83.33333333%;\n }\n .col-sm-push-9 {\n left: 75%;\n }\n .col-sm-push-8 {\n left: 66.66666667%;\n }\n .col-sm-push-7 {\n left: 58.33333333%;\n }\n .col-sm-push-6 {\n left: 50%;\n }\n .col-sm-push-5 {\n left: 41.66666667%;\n }\n .col-sm-push-4 {\n left: 33.33333333%;\n }\n .col-sm-push-3 {\n left: 25%;\n }\n .col-sm-push-2 {\n left: 16.66666667%;\n }\n .col-sm-push-1 {\n left: 8.33333333%;\n }\n .col-sm-push-0 {\n left: auto;\n }\n .col-sm-offset-12 {\n margin-left: 100%;\n }\n .col-sm-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-sm-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-sm-offset-9 {\n margin-left: 75%;\n }\n .col-sm-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-sm-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-sm-offset-6 {\n margin-left: 50%;\n }\n .col-sm-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-sm-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-sm-offset-3 {\n margin-left: 25%;\n }\n .col-sm-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-sm-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-sm-offset-0 {\n margin-left: 0%;\n }\n}\n@media (min-width: 992px) {\n .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 {\n float: left;\n }\n .col-md-12 {\n width: 100%;\n }\n .col-md-11 {\n width: 91.66666667%;\n }\n .col-md-10 {\n width: 83.33333333%;\n }\n .col-md-9 {\n width: 75%;\n }\n .col-md-8 {\n width: 66.66666667%;\n }\n .col-md-7 {\n width: 58.33333333%;\n }\n .col-md-6 {\n width: 50%;\n }\n .col-md-5 {\n width: 41.66666667%;\n }\n .col-md-4 {\n width: 33.33333333%;\n }\n .col-md-3 {\n width: 25%;\n }\n .col-md-2 {\n width: 16.66666667%;\n }\n .col-md-1 {\n width: 8.33333333%;\n }\n .col-md-pull-12 {\n right: 100%;\n }\n .col-md-pull-11 {\n right: 91.66666667%;\n }\n .col-md-pull-10 {\n right: 83.33333333%;\n }\n .col-md-pull-9 {\n right: 75%;\n }\n .col-md-pull-8 {\n right: 66.66666667%;\n }\n .col-md-pull-7 {\n right: 58.33333333%;\n }\n .col-md-pull-6 {\n right: 50%;\n }\n .col-md-pull-5 {\n right: 41.66666667%;\n }\n .col-md-pull-4 {\n right: 33.33333333%;\n }\n .col-md-pull-3 {\n right: 25%;\n }\n .col-md-pull-2 {\n right: 16.66666667%;\n }\n .col-md-pull-1 {\n right: 8.33333333%;\n }\n .col-md-pull-0 {\n right: auto;\n }\n .col-md-push-12 {\n left: 100%;\n }\n .col-md-push-11 {\n left: 91.66666667%;\n }\n .col-md-push-10 {\n left: 83.33333333%;\n }\n .col-md-push-9 {\n left: 75%;\n }\n .col-md-push-8 {\n left: 66.66666667%;\n }\n .col-md-push-7 {\n left: 58.33333333%;\n }\n .col-md-push-6 {\n left: 50%;\n }\n .col-md-push-5 {\n left: 41.66666667%;\n }\n .col-md-push-4 {\n left: 33.33333333%;\n }\n .col-md-push-3 {\n left: 25%;\n }\n .col-md-push-2 {\n left: 16.66666667%;\n }\n .col-md-push-1 {\n left: 8.33333333%;\n }\n .col-md-push-0 {\n left: auto;\n }\n .col-md-offset-12 {\n margin-left: 100%;\n }\n .col-md-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-md-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-md-offset-9 {\n margin-left: 75%;\n }\n .col-md-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-md-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-md-offset-6 {\n margin-left: 50%;\n }\n .col-md-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-md-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-md-offset-3 {\n margin-left: 25%;\n }\n .col-md-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-md-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-md-offset-0 {\n margin-left: 0%;\n }\n}\n@media (min-width: 1200px) {\n .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {\n float: left;\n }\n .col-lg-12 {\n width: 100%;\n }\n .col-lg-11 {\n width: 91.66666667%;\n }\n .col-lg-10 {\n width: 83.33333333%;\n }\n .col-lg-9 {\n width: 75%;\n }\n .col-lg-8 {\n width: 66.66666667%;\n }\n .col-lg-7 {\n width: 58.33333333%;\n }\n .col-lg-6 {\n width: 50%;\n }\n .col-lg-5 {\n width: 41.66666667%;\n }\n .col-lg-4 {\n width: 33.33333333%;\n }\n .col-lg-3 {\n width: 25%;\n }\n .col-lg-2 {\n width: 16.66666667%;\n }\n .col-lg-1 {\n width: 8.33333333%;\n }\n .col-lg-pull-12 {\n right: 100%;\n }\n .col-lg-pull-11 {\n right: 91.66666667%;\n }\n .col-lg-pull-10 {\n right: 83.33333333%;\n }\n .col-lg-pull-9 {\n right: 75%;\n }\n .col-lg-pull-8 {\n right: 66.66666667%;\n }\n .col-lg-pull-7 {\n right: 58.33333333%;\n }\n .col-lg-pull-6 {\n right: 50%;\n }\n .col-lg-pull-5 {\n right: 41.66666667%;\n }\n .col-lg-pull-4 {\n right: 33.33333333%;\n }\n .col-lg-pull-3 {\n right: 25%;\n }\n .col-lg-pull-2 {\n right: 16.66666667%;\n }\n .col-lg-pull-1 {\n right: 8.33333333%;\n }\n .col-lg-pull-0 {\n right: auto;\n }\n .col-lg-push-12 {\n left: 100%;\n }\n .col-lg-push-11 {\n left: 91.66666667%;\n }\n .col-lg-push-10 {\n left: 83.33333333%;\n }\n .col-lg-push-9 {\n left: 75%;\n }\n .col-lg-push-8 {\n left: 66.66666667%;\n }\n .col-lg-push-7 {\n left: 58.33333333%;\n }\n .col-lg-push-6 {\n left: 50%;\n }\n .col-lg-push-5 {\n left: 41.66666667%;\n }\n .col-lg-push-4 {\n left: 33.33333333%;\n }\n .col-lg-push-3 {\n left: 25%;\n }\n .col-lg-push-2 {\n left: 16.66666667%;\n }\n .col-lg-push-1 {\n left: 8.33333333%;\n }\n .col-lg-push-0 {\n left: auto;\n }\n .col-lg-offset-12 {\n margin-left: 100%;\n }\n .col-lg-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-lg-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-lg-offset-9 {\n margin-left: 75%;\n }\n .col-lg-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-lg-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-lg-offset-6 {\n margin-left: 50%;\n }\n .col-lg-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-lg-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-lg-offset-3 {\n margin-left: 25%;\n }\n .col-lg-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-lg-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-lg-offset-0 {\n margin-left: 0%;\n }\n}\ntable {\n background-color: transparent;\n}\ncaption {\n padding-top: 8px;\n padding-bottom: 8px;\n color: #777777;\n text-align: left;\n}\nth {\n text-align: left;\n}\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: 20px;\n}\n.table > thead > tr > th,\n.table > tbody > tr > th,\n.table > tfoot > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > td,\n.table > tfoot > tr > td {\n padding: 8px;\n line-height: 1.42857143;\n vertical-align: top;\n border-top: 1px solid #dddddd;\n}\n.table > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid #dddddd;\n}\n.table > caption + thead > tr:first-child > th,\n.table > colgroup + thead > tr:first-child > th,\n.table > thead:first-child > tr:first-child > th,\n.table > caption + thead > tr:first-child > td,\n.table > colgroup + thead > tr:first-child > td,\n.table > thead:first-child > tr:first-child > td {\n border-top: 0;\n}\n.table > tbody + tbody {\n border-top: 2px solid #dddddd;\n}\n.table .table {\n background-color: #ffffff;\n}\n.table-condensed > thead > tr > th,\n.table-condensed > tbody > tr > th,\n.table-condensed > tfoot > tr > th,\n.table-condensed > thead > tr > td,\n.table-condensed > tbody > tr > td,\n.table-condensed > tfoot > tr > td {\n padding: 5px;\n}\n.table-bordered {\n border: 1px solid #dddddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > tbody > tr > td,\n.table-bordered > tfoot > tr > td {\n border: 1px solid #dddddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n border-bottom-width: 2px;\n}\n.table-striped > tbody > tr:nth-of-type(odd) {\n background-color: #f9f9f9;\n}\n.table-hover > tbody > tr:hover {\n background-color: #f5f5f5;\n}\ntable col[class*=\"col-\"] {\n position: static;\n float: none;\n display: table-column;\n}\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n position: static;\n float: none;\n display: table-cell;\n}\n.table > thead > tr > td.active,\n.table > tbody > tr > td.active,\n.table > tfoot > tr > td.active,\n.table > thead > tr > th.active,\n.table > tbody > tr > th.active,\n.table > tfoot > tr > th.active,\n.table > thead > tr.active > td,\n.table > tbody > tr.active > td,\n.table > tfoot > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr.active > th,\n.table > tfoot > tr.active > th {\n background-color: #f5f5f5;\n}\n.table-hover > tbody > tr > td.active:hover,\n.table-hover > tbody > tr > th.active:hover,\n.table-hover > tbody > tr.active:hover > td,\n.table-hover > tbody > tr:hover > .active,\n.table-hover > tbody > tr.active:hover > th {\n background-color: #e8e8e8;\n}\n.table > thead > tr > td.success,\n.table > tbody > tr > td.success,\n.table > tfoot > tr > td.success,\n.table > thead > tr > th.success,\n.table > tbody > tr > th.success,\n.table > tfoot > tr > th.success,\n.table > thead > tr.success > td,\n.table > tbody > tr.success > td,\n.table > tfoot > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr.success > th,\n.table > tfoot > tr.success > th {\n background-color: #dff0d8;\n}\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n background-color: #d0e9c6;\n}\n.table > thead > tr > td.info,\n.table > tbody > tr > td.info,\n.table > tfoot > tr > td.info,\n.table > thead > tr > th.info,\n.table > tbody > tr > th.info,\n.table > tfoot > tr > th.info,\n.table > thead > tr.info > td,\n.table > tbody > tr.info > td,\n.table > tfoot > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr.info > th,\n.table > tfoot > tr.info > th {\n background-color: #d9edf7;\n}\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n background-color: #c4e3f3;\n}\n.table > thead > tr > td.warning,\n.table > tbody > tr > td.warning,\n.table > tfoot > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > tbody > tr > th.warning,\n.table > tfoot > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > tbody > tr.warning > td,\n.table > tfoot > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr.warning > th {\n background-color: #fcf8e3;\n}\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n background-color: #faf2cc;\n}\n.table > thead > tr > td.danger,\n.table > tbody > tr > td.danger,\n.table > tfoot > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > tbody > tr > th.danger,\n.table > tfoot > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > tbody > tr.danger > td,\n.table > tfoot > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr.danger > th {\n background-color: #f2dede;\n}\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n background-color: #ebcccc;\n}\n.table-responsive {\n overflow-x: auto;\n min-height: 0.01%;\n}\n@media screen and (max-width: 767px) {\n .table-responsive {\n width: 100%;\n margin-bottom: 15px;\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid #dddddd;\n }\n .table-responsive > .table {\n margin-bottom: 0;\n }\n .table-responsive > .table > thead > tr > th,\n .table-responsive > .table > tbody > tr > th,\n .table-responsive > .table > tfoot > tr > th,\n .table-responsive > .table > thead > tr > td,\n .table-responsive > .table > tbody > tr > td,\n .table-responsive > .table > tfoot > tr > td {\n white-space: nowrap;\n }\n .table-responsive > .table-bordered {\n border: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:first-child,\n .table-responsive > .table-bordered > tbody > tr > th:first-child,\n .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n .table-responsive > .table-bordered > thead > tr > td:first-child,\n .table-responsive > .table-bordered > tbody > tr > td:first-child,\n .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:last-child,\n .table-responsive > .table-bordered > tbody > tr > th:last-child,\n .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n .table-responsive > .table-bordered > thead > tr > td:last-child,\n .table-responsive > .table-bordered > tbody > tr > td:last-child,\n .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n }\n .table-responsive > .table-bordered > tbody > tr:last-child > th,\n .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n .table-responsive > .table-bordered > tbody > tr:last-child > td,\n .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n border-bottom: 0;\n }\n}\nfieldset {\n padding: 0;\n margin: 0;\n border: 0;\n min-width: 0;\n}\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: 20px;\n font-size: 21px;\n line-height: inherit;\n color: #333333;\n border: 0;\n border-bottom: 1px solid #e5e5e5;\n}\nlabel {\n display: inline-block;\n max-width: 100%;\n margin-bottom: 5px;\n font-weight: bold;\n}\ninput[type=\"search\"] {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9;\n line-height: normal;\n}\ninput[type=\"file\"] {\n display: block;\n}\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\nselect[multiple],\nselect[size] {\n height: auto;\n}\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n outline: thin dotted;\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\noutput {\n display: block;\n padding-top: 7px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555555;\n}\n.form-control {\n display: block;\n width: 100%;\n height: 34px;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555555;\n background-color: #ffffff;\n background-image: none;\n border: 1px solid #cccccc;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n}\n.form-control:focus {\n border-color: #66afe9;\n outline: 0;\n -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n}\n.form-control::-moz-placeholder {\n color: #999999;\n opacity: 1;\n}\n.form-control:-ms-input-placeholder {\n color: #999999;\n}\n.form-control::-webkit-input-placeholder {\n color: #999999;\n}\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n background-color: #eeeeee;\n opacity: 1;\n}\n.form-control[disabled],\nfieldset[disabled] .form-control {\n cursor: not-allowed;\n}\ntextarea.form-control {\n height: auto;\n}\ninput[type=\"search\"] {\n -webkit-appearance: none;\n}\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n input[type=\"date\"].form-control,\n input[type=\"time\"].form-control,\n input[type=\"datetime-local\"].form-control,\n input[type=\"month\"].form-control {\n line-height: 34px;\n }\n input[type=\"date\"].input-sm,\n input[type=\"time\"].input-sm,\n input[type=\"datetime-local\"].input-sm,\n input[type=\"month\"].input-sm,\n .input-group-sm input[type=\"date\"],\n .input-group-sm input[type=\"time\"],\n .input-group-sm input[type=\"datetime-local\"],\n .input-group-sm input[type=\"month\"] {\n line-height: 30px;\n }\n input[type=\"date\"].input-lg,\n input[type=\"time\"].input-lg,\n input[type=\"datetime-local\"].input-lg,\n input[type=\"month\"].input-lg,\n .input-group-lg input[type=\"date\"],\n .input-group-lg input[type=\"time\"],\n .input-group-lg input[type=\"datetime-local\"],\n .input-group-lg input[type=\"month\"] {\n line-height: 46px;\n }\n}\n.form-group {\n margin-bottom: 15px;\n}\n.radio,\n.checkbox {\n position: relative;\n display: block;\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.radio label,\n.checkbox label {\n min-height: 20px;\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: normal;\n cursor: pointer;\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n position: absolute;\n margin-left: -20px;\n margin-top: 4px \\9;\n}\n.radio + .radio,\n.checkbox + .checkbox {\n margin-top: -5px;\n}\n.radio-inline,\n.checkbox-inline {\n position: relative;\n display: inline-block;\n padding-left: 20px;\n margin-bottom: 0;\n vertical-align: middle;\n font-weight: normal;\n cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n margin-top: 0;\n margin-left: 10px;\n}\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\ninput[type=\"radio\"].disabled,\ninput[type=\"checkbox\"].disabled,\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"] {\n cursor: not-allowed;\n}\n.radio-inline.disabled,\n.checkbox-inline.disabled,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox-inline {\n cursor: not-allowed;\n}\n.radio.disabled label,\n.checkbox.disabled label,\nfieldset[disabled] .radio label,\nfieldset[disabled] .checkbox label {\n cursor: not-allowed;\n}\n.form-control-static {\n padding-top: 7px;\n padding-bottom: 7px;\n margin-bottom: 0;\n min-height: 34px;\n}\n.form-control-static.input-lg,\n.form-control-static.input-sm {\n padding-left: 0;\n padding-right: 0;\n}\n.input-sm {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-sm {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-sm,\nselect[multiple].input-sm {\n height: auto;\n}\n.form-group-sm .form-control {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.form-group-sm select.form-control {\n height: 30px;\n line-height: 30px;\n}\n.form-group-sm textarea.form-control,\n.form-group-sm select[multiple].form-control {\n height: auto;\n}\n.form-group-sm .form-control-static {\n height: 30px;\n min-height: 32px;\n padding: 6px 10px;\n font-size: 12px;\n line-height: 1.5;\n}\n.input-lg {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-lg {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-lg,\nselect[multiple].input-lg {\n height: auto;\n}\n.form-group-lg .form-control {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.form-group-lg select.form-control {\n height: 46px;\n line-height: 46px;\n}\n.form-group-lg textarea.form-control,\n.form-group-lg select[multiple].form-control {\n height: auto;\n}\n.form-group-lg .form-control-static {\n height: 46px;\n min-height: 38px;\n padding: 11px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n}\n.has-feedback {\n position: relative;\n}\n.has-feedback .form-control {\n padding-right: 42.5px;\n}\n.form-control-feedback {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2;\n display: block;\n width: 34px;\n height: 34px;\n line-height: 34px;\n text-align: center;\n pointer-events: none;\n}\n.input-lg + .form-control-feedback,\n.input-group-lg + .form-control-feedback,\n.form-group-lg .form-control + .form-control-feedback {\n width: 46px;\n height: 46px;\n line-height: 46px;\n}\n.input-sm + .form-control-feedback,\n.input-group-sm + .form-control-feedback,\n.form-group-sm .form-control + .form-control-feedback {\n width: 30px;\n height: 30px;\n line-height: 30px;\n}\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline,\n.has-success.radio label,\n.has-success.checkbox label,\n.has-success.radio-inline label,\n.has-success.checkbox-inline label {\n color: #3c763d;\n}\n.has-success .form-control {\n border-color: #3c763d;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-success .form-control:focus {\n border-color: #2b542c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n}\n.has-success .input-group-addon {\n color: #3c763d;\n border-color: #3c763d;\n background-color: #dff0d8;\n}\n.has-success .form-control-feedback {\n color: #3c763d;\n}\n.has-warning .help-block,\n.has-warning .control-label,\n.has-warning .radio,\n.has-warning .checkbox,\n.has-warning .radio-inline,\n.has-warning .checkbox-inline,\n.has-warning.radio label,\n.has-warning.checkbox label,\n.has-warning.radio-inline label,\n.has-warning.checkbox-inline label {\n color: #8a6d3b;\n}\n.has-warning .form-control {\n border-color: #8a6d3b;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-warning .form-control:focus {\n border-color: #66512c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n}\n.has-warning .input-group-addon {\n color: #8a6d3b;\n border-color: #8a6d3b;\n background-color: #fcf8e3;\n}\n.has-warning .form-control-feedback {\n color: #8a6d3b;\n}\n.has-error .help-block,\n.has-error .control-label,\n.has-error .radio,\n.has-error .checkbox,\n.has-error .radio-inline,\n.has-error .checkbox-inline,\n.has-error.radio label,\n.has-error.checkbox label,\n.has-error.radio-inline label,\n.has-error.checkbox-inline label {\n color: #a94442;\n}\n.has-error .form-control {\n border-color: #a94442;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-error .form-control:focus {\n border-color: #843534;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n}\n.has-error .input-group-addon {\n color: #a94442;\n border-color: #a94442;\n background-color: #f2dede;\n}\n.has-error .form-control-feedback {\n color: #a94442;\n}\n.has-feedback label ~ .form-control-feedback {\n top: 25px;\n}\n.has-feedback label.sr-only ~ .form-control-feedback {\n top: 0;\n}\n.help-block {\n display: block;\n margin-top: 5px;\n margin-bottom: 10px;\n color: #737373;\n}\n@media (min-width: 768px) {\n .form-inline .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .form-inline .form-control-static {\n display: inline-block;\n }\n .form-inline .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .form-inline .input-group .input-group-addon,\n .form-inline .input-group .input-group-btn,\n .form-inline .input-group .form-control {\n width: auto;\n }\n .form-inline .input-group > .form-control {\n width: 100%;\n }\n .form-inline .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio,\n .form-inline .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio label,\n .form-inline .checkbox label {\n padding-left: 0;\n }\n .form-inline .radio input[type=\"radio\"],\n .form-inline .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .form-inline .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n margin-top: 0;\n margin-bottom: 0;\n padding-top: 7px;\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n min-height: 27px;\n}\n.form-horizontal .form-group {\n margin-left: -15px;\n margin-right: -15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .control-label {\n text-align: right;\n margin-bottom: 0;\n padding-top: 7px;\n }\n}\n.form-horizontal .has-feedback .form-control-feedback {\n right: 15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-lg .control-label {\n padding-top: 14.333333px;\n font-size: 18px;\n }\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-sm .control-label {\n padding-top: 6px;\n font-size: 12px;\n }\n}\n.btn {\n display: inline-block;\n margin-bottom: 0;\n font-weight: normal;\n text-align: center;\n vertical-align: middle;\n touch-action: manipulation;\n cursor: pointer;\n background-image: none;\n border: 1px solid transparent;\n white-space: nowrap;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n border-radius: 4px;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n.btn:focus,\n.btn:active:focus,\n.btn.active:focus,\n.btn.focus,\n.btn:active.focus,\n.btn.active.focus {\n outline: thin dotted;\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n.btn:hover,\n.btn:focus,\n.btn.focus {\n color: #333333;\n text-decoration: none;\n}\n.btn:active,\n.btn.active {\n outline: 0;\n background-image: none;\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n cursor: not-allowed;\n opacity: 0.65;\n filter: alpha(opacity=65);\n -webkit-box-shadow: none;\n box-shadow: none;\n}\na.btn.disabled,\nfieldset[disabled] a.btn {\n pointer-events: none;\n}\n.btn-default {\n color: #333333;\n background-color: #ffffff;\n border-color: #cccccc;\n}\n.btn-default:focus,\n.btn-default.focus {\n color: #333333;\n background-color: #e6e6e6;\n border-color: #8c8c8c;\n}\n.btn-default:hover {\n color: #333333;\n background-color: #e6e6e6;\n border-color: #adadad;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n color: #333333;\n background-color: #e6e6e6;\n border-color: #adadad;\n}\n.btn-default:active:hover,\n.btn-default.active:hover,\n.open > .dropdown-toggle.btn-default:hover,\n.btn-default:active:focus,\n.btn-default.active:focus,\n.open > .dropdown-toggle.btn-default:focus,\n.btn-default:active.focus,\n.btn-default.active.focus,\n.open > .dropdown-toggle.btn-default.focus {\n color: #333333;\n background-color: #d4d4d4;\n border-color: #8c8c8c;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n background-image: none;\n}\n.btn-default.disabled,\n.btn-default[disabled],\nfieldset[disabled] .btn-default,\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus,\n.btn-default.disabled:active,\n.btn-default[disabled]:active,\nfieldset[disabled] .btn-default:active,\n.btn-default.disabled.active,\n.btn-default[disabled].active,\nfieldset[disabled] .btn-default.active {\n background-color: #ffffff;\n border-color: #cccccc;\n}\n.btn-default .badge {\n color: #ffffff;\n background-color: #333333;\n}\n.btn-primary {\n color: #ffffff;\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary:focus,\n.btn-primary.focus {\n color: #ffffff;\n background-color: #286090;\n border-color: #122b40;\n}\n.btn-primary:hover {\n color: #ffffff;\n background-color: #286090;\n border-color: #204d74;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n color: #ffffff;\n background-color: #286090;\n border-color: #204d74;\n}\n.btn-primary:active:hover,\n.btn-primary.active:hover,\n.open > .dropdown-toggle.btn-primary:hover,\n.btn-primary:active:focus,\n.btn-primary.active:focus,\n.open > .dropdown-toggle.btn-primary:focus,\n.btn-primary:active.focus,\n.btn-primary.active.focus,\n.open > .dropdown-toggle.btn-primary.focus {\n color: #ffffff;\n background-color: #204d74;\n border-color: #122b40;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n background-image: none;\n}\n.btn-primary.disabled,\n.btn-primary[disabled],\nfieldset[disabled] .btn-primary,\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus,\n.btn-primary.disabled:active,\n.btn-primary[disabled]:active,\nfieldset[disabled] .btn-primary:active,\n.btn-primary.disabled.active,\n.btn-primary[disabled].active,\nfieldset[disabled] .btn-primary.active {\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary .badge {\n color: #337ab7;\n background-color: #ffffff;\n}\n.btn-success {\n color: #ffffff;\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success:focus,\n.btn-success.focus {\n color: #ffffff;\n background-color: #449d44;\n border-color: #255625;\n}\n.btn-success:hover {\n color: #ffffff;\n background-color: #449d44;\n border-color: #398439;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n color: #ffffff;\n background-color: #449d44;\n border-color: #398439;\n}\n.btn-success:active:hover,\n.btn-success.active:hover,\n.open > .dropdown-toggle.btn-success:hover,\n.btn-success:active:focus,\n.btn-success.active:focus,\n.open > .dropdown-toggle.btn-success:focus,\n.btn-success:active.focus,\n.btn-success.active.focus,\n.open > .dropdown-toggle.btn-success.focus {\n color: #ffffff;\n background-color: #398439;\n border-color: #255625;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n background-image: none;\n}\n.btn-success.disabled,\n.btn-success[disabled],\nfieldset[disabled] .btn-success,\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus,\n.btn-success.disabled:active,\n.btn-success[disabled]:active,\nfieldset[disabled] .btn-success:active,\n.btn-success.disabled.active,\n.btn-success[disabled].active,\nfieldset[disabled] .btn-success.active {\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success .badge {\n color: #5cb85c;\n background-color: #ffffff;\n}\n.btn-info {\n color: #ffffff;\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info:focus,\n.btn-info.focus {\n color: #ffffff;\n background-color: #31b0d5;\n border-color: #1b6d85;\n}\n.btn-info:hover {\n color: #ffffff;\n background-color: #31b0d5;\n border-color: #269abc;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n color: #ffffff;\n background-color: #31b0d5;\n border-color: #269abc;\n}\n.btn-info:active:hover,\n.btn-info.active:hover,\n.open > .dropdown-toggle.btn-info:hover,\n.btn-info:active:focus,\n.btn-info.active:focus,\n.open > .dropdown-toggle.btn-info:focus,\n.btn-info:active.focus,\n.btn-info.active.focus,\n.open > .dropdown-toggle.btn-info.focus {\n color: #ffffff;\n background-color: #269abc;\n border-color: #1b6d85;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n background-image: none;\n}\n.btn-info.disabled,\n.btn-info[disabled],\nfieldset[disabled] .btn-info,\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus,\n.btn-info.disabled:active,\n.btn-info[disabled]:active,\nfieldset[disabled] .btn-info:active,\n.btn-info.disabled.active,\n.btn-info[disabled].active,\nfieldset[disabled] .btn-info.active {\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info .badge {\n color: #5bc0de;\n background-color: #ffffff;\n}\n.btn-warning {\n color: #ffffff;\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning:focus,\n.btn-warning.focus {\n color: #ffffff;\n background-color: #ec971f;\n border-color: #985f0d;\n}\n.btn-warning:hover {\n color: #ffffff;\n background-color: #ec971f;\n border-color: #d58512;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n color: #ffffff;\n background-color: #ec971f;\n border-color: #d58512;\n}\n.btn-warning:active:hover,\n.btn-warning.active:hover,\n.open > .dropdown-toggle.btn-warning:hover,\n.btn-warning:active:focus,\n.btn-warning.active:focus,\n.open > .dropdown-toggle.btn-warning:focus,\n.btn-warning:active.focus,\n.btn-warning.active.focus,\n.open > .dropdown-toggle.btn-warning.focus {\n color: #ffffff;\n background-color: #d58512;\n border-color: #985f0d;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n background-image: none;\n}\n.btn-warning.disabled,\n.btn-warning[disabled],\nfieldset[disabled] .btn-warning,\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus,\n.btn-warning.disabled:active,\n.btn-warning[disabled]:active,\nfieldset[disabled] .btn-warning:active,\n.btn-warning.disabled.active,\n.btn-warning[disabled].active,\nfieldset[disabled] .btn-warning.active {\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning .badge {\n color: #f0ad4e;\n background-color: #ffffff;\n}\n.btn-danger {\n color: #ffffff;\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger:focus,\n.btn-danger.focus {\n color: #ffffff;\n background-color: #c9302c;\n border-color: #761c19;\n}\n.btn-danger:hover {\n color: #ffffff;\n background-color: #c9302c;\n border-color: #ac2925;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n color: #ffffff;\n background-color: #c9302c;\n border-color: #ac2925;\n}\n.btn-danger:active:hover,\n.btn-danger.active:hover,\n.open > .dropdown-toggle.btn-danger:hover,\n.btn-danger:active:focus,\n.btn-danger.active:focus,\n.open > .dropdown-toggle.btn-danger:focus,\n.btn-danger:active.focus,\n.btn-danger.active.focus,\n.open > .dropdown-toggle.btn-danger.focus {\n color: #ffffff;\n background-color: #ac2925;\n border-color: #761c19;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n background-image: none;\n}\n.btn-danger.disabled,\n.btn-danger[disabled],\nfieldset[disabled] .btn-danger,\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus,\n.btn-danger.disabled:active,\n.btn-danger[disabled]:active,\nfieldset[disabled] .btn-danger:active,\n.btn-danger.disabled.active,\n.btn-danger[disabled].active,\nfieldset[disabled] .btn-danger.active {\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger .badge {\n color: #d9534f;\n background-color: #ffffff;\n}\n.btn-link {\n color: #337ab7;\n font-weight: normal;\n border-radius: 0;\n}\n.btn-link,\n.btn-link:active,\n.btn-link.active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n background-color: transparent;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n border-color: transparent;\n}\n.btn-link:hover,\n.btn-link:focus {\n color: #23527c;\n text-decoration: underline;\n background-color: transparent;\n}\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n color: #777777;\n text-decoration: none;\n}\n.btn-lg,\n.btn-group-lg > .btn {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.btn-sm,\n.btn-group-sm > .btn {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-xs,\n.btn-group-xs > .btn {\n padding: 1px 5px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-block {\n display: block;\n width: 100%;\n}\n.btn-block + .btn-block {\n margin-top: 5px;\n}\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n width: 100%;\n}\n.fade {\n opacity: 0;\n -webkit-transition: opacity 0.15s linear;\n -o-transition: opacity 0.15s linear;\n transition: opacity 0.15s linear;\n}\n.fade.in {\n opacity: 1;\n}\n.collapse {\n display: none;\n}\n.collapse.in {\n display: block;\n}\ntr.collapse.in {\n display: table-row;\n}\ntbody.collapse.in {\n display: table-row-group;\n}\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n -webkit-transition-property: height, visibility;\n transition-property: height, visibility;\n -webkit-transition-duration: 0.35s;\n transition-duration: 0.35s;\n -webkit-transition-timing-function: ease;\n transition-timing-function: ease;\n}\n.caret {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: 4px dashed;\n border-top: 4px solid \\9;\n border-right: 4px solid transparent;\n border-left: 4px solid transparent;\n}\n.dropup,\n.dropdown {\n position: relative;\n}\n.dropdown-toggle:focus {\n outline: 0;\n}\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n display: none;\n float: left;\n min-width: 160px;\n padding: 5px 0;\n margin: 2px 0 0;\n list-style: none;\n font-size: 14px;\n text-align: left;\n background-color: #ffffff;\n border: 1px solid #cccccc;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 4px;\n -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n background-clip: padding-box;\n}\n.dropdown-menu.pull-right {\n right: 0;\n left: auto;\n}\n.dropdown-menu .divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.dropdown-menu > li > a {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: normal;\n line-height: 1.42857143;\n color: #333333;\n white-space: nowrap;\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n text-decoration: none;\n color: #262626;\n background-color: #f5f5f5;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n color: #ffffff;\n text-decoration: none;\n outline: 0;\n background-color: #337ab7;\n}\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n color: #777777;\n}\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n text-decoration: none;\n background-color: transparent;\n background-image: none;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n cursor: not-allowed;\n}\n.open > .dropdown-menu {\n display: block;\n}\n.open > a {\n outline: 0;\n}\n.dropdown-menu-right {\n left: auto;\n right: 0;\n}\n.dropdown-menu-left {\n left: 0;\n right: auto;\n}\n.dropdown-header {\n display: block;\n padding: 3px 20px;\n font-size: 12px;\n line-height: 1.42857143;\n color: #777777;\n white-space: nowrap;\n}\n.dropdown-backdrop {\n position: fixed;\n left: 0;\n right: 0;\n bottom: 0;\n top: 0;\n z-index: 990;\n}\n.pull-right > .dropdown-menu {\n right: 0;\n left: auto;\n}\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n border-top: 0;\n border-bottom: 4px dashed;\n border-bottom: 4px solid \\9;\n content: \"\";\n}\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 2px;\n}\n@media (min-width: 768px) {\n .navbar-right .dropdown-menu {\n left: auto;\n right: 0;\n }\n .navbar-right .dropdown-menu-left {\n left: 0;\n right: auto;\n }\n}\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle;\n}\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n position: relative;\n float: left;\n}\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus,\n.btn-group > .btn:active,\n.btn-group-vertical > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn.active {\n z-index: 2;\n}\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n margin-left: -1px;\n}\n.btn-toolbar {\n margin-left: -5px;\n}\n.btn-toolbar .btn,\n.btn-toolbar .btn-group,\n.btn-toolbar .input-group {\n float: left;\n}\n.btn-toolbar > .btn,\n.btn-toolbar > .btn-group,\n.btn-toolbar > .input-group {\n margin-left: 5px;\n}\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n.btn-group > .btn:first-child {\n margin-left: 0;\n}\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group > .btn-group {\n float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0;\n}\n.btn-group > .btn + .dropdown-toggle {\n padding-left: 8px;\n padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n padding-left: 12px;\n padding-right: 12px;\n}\n.btn-group.open .dropdown-toggle {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-group.open .dropdown-toggle.btn-link {\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn .caret {\n margin-left: 0;\n}\n.btn-lg .caret {\n border-width: 5px 5px 0;\n border-bottom-width: 0;\n}\n.dropup .btn-lg .caret {\n border-width: 0 5px 5px;\n}\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group,\n.btn-group-vertical > .btn-group > .btn {\n display: block;\n float: none;\n width: 100%;\n max-width: 100%;\n}\n.btn-group-vertical > .btn-group > .btn {\n float: none;\n}\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n}\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n border-top-right-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n border-bottom-left-radius: 4px;\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n}\n.btn-group-justified > .btn,\n.btn-group-justified > .btn-group {\n float: none;\n display: table-cell;\n width: 1%;\n}\n.btn-group-justified > .btn-group .btn {\n width: 100%;\n}\n.btn-group-justified > .btn-group .dropdown-menu {\n left: auto;\n}\n[data-toggle=\"buttons\"] > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn input[type=\"checkbox\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n}\n.input-group {\n position: relative;\n display: table;\n border-collapse: separate;\n}\n.input-group[class*=\"col-\"] {\n float: none;\n padding-left: 0;\n padding-right: 0;\n}\n.input-group .form-control {\n position: relative;\n z-index: 2;\n float: left;\n width: 100%;\n margin-bottom: 0;\n}\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-group-lg > .form-control,\nselect.input-group-lg > .input-group-addon,\nselect.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn,\nselect[multiple].input-group-lg > .form-control,\nselect[multiple].input-group-lg > .input-group-addon,\nselect[multiple].input-group-lg > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-group-sm > .form-control,\nselect.input-group-sm > .input-group-addon,\nselect.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn,\nselect[multiple].input-group-sm > .form-control,\nselect[multiple].input-group-sm > .input-group-addon,\nselect[multiple].input-group-sm > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: table-cell;\n}\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.input-group-addon,\n.input-group-btn {\n width: 1%;\n white-space: nowrap;\n vertical-align: middle;\n}\n.input-group-addon {\n padding: 6px 12px;\n font-size: 14px;\n font-weight: normal;\n line-height: 1;\n color: #555555;\n text-align: center;\n background-color: #eeeeee;\n border: 1px solid #cccccc;\n border-radius: 4px;\n}\n.input-group-addon.input-sm {\n padding: 5px 10px;\n font-size: 12px;\n border-radius: 3px;\n}\n.input-group-addon.input-lg {\n padding: 10px 16px;\n font-size: 18px;\n border-radius: 6px;\n}\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n margin-top: 0;\n}\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.input-group-addon:first-child {\n border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.input-group-addon:last-child {\n border-left: 0;\n}\n.input-group-btn {\n position: relative;\n font-size: 0;\n white-space: nowrap;\n}\n.input-group-btn > .btn {\n position: relative;\n}\n.input-group-btn > .btn + .btn {\n margin-left: -1px;\n}\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:focus,\n.input-group-btn > .btn:active {\n z-index: 2;\n}\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group {\n margin-right: -1px;\n}\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group {\n z-index: 2;\n margin-left: -1px;\n}\n.nav {\n margin-bottom: 0;\n padding-left: 0;\n list-style: none;\n}\n.nav > li {\n position: relative;\n display: block;\n}\n.nav > li > a {\n position: relative;\n display: block;\n padding: 10px 15px;\n}\n.nav > li > a:hover,\n.nav > li > a:focus {\n text-decoration: none;\n background-color: #eeeeee;\n}\n.nav > li.disabled > a {\n color: #777777;\n}\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n color: #777777;\n text-decoration: none;\n background-color: transparent;\n cursor: not-allowed;\n}\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n background-color: #eeeeee;\n border-color: #337ab7;\n}\n.nav .nav-divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.nav > li > a > img {\n max-width: none;\n}\n.nav-tabs {\n border-bottom: 1px solid #dddddd;\n}\n.nav-tabs > li {\n float: left;\n margin-bottom: -1px;\n}\n.nav-tabs > li > a {\n margin-right: 2px;\n line-height: 1.42857143;\n border: 1px solid transparent;\n border-radius: 4px 4px 0 0;\n}\n.nav-tabs > li > a:hover {\n border-color: #eeeeee #eeeeee #dddddd;\n}\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:hover,\n.nav-tabs > li.active > a:focus {\n color: #555555;\n background-color: #ffffff;\n border: 1px solid #dddddd;\n border-bottom-color: transparent;\n cursor: default;\n}\n.nav-tabs.nav-justified {\n width: 100%;\n border-bottom: 0;\n}\n.nav-tabs.nav-justified > li {\n float: none;\n}\n.nav-tabs.nav-justified > li > a {\n text-align: center;\n margin-bottom: 5px;\n}\n.nav-tabs.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-tabs.nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs.nav-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs.nav-justified > .active > a,\n.nav-tabs.nav-justified > .active > a:hover,\n.nav-tabs.nav-justified > .active > a:focus {\n border: 1px solid #dddddd;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li > a {\n border-bottom: 1px solid #dddddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs.nav-justified > .active > a,\n .nav-tabs.nav-justified > .active > a:hover,\n .nav-tabs.nav-justified > .active > a:focus {\n border-bottom-color: #ffffff;\n }\n}\n.nav-pills > li {\n float: left;\n}\n.nav-pills > li > a {\n border-radius: 4px;\n}\n.nav-pills > li + li {\n margin-left: 2px;\n}\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:hover,\n.nav-pills > li.active > a:focus {\n color: #ffffff;\n background-color: #337ab7;\n}\n.nav-stacked > li {\n float: none;\n}\n.nav-stacked > li + li {\n margin-top: 2px;\n margin-left: 0;\n}\n.nav-justified {\n width: 100%;\n}\n.nav-justified > li {\n float: none;\n}\n.nav-justified > li > a {\n text-align: center;\n margin-bottom: 5px;\n}\n.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs-justified {\n border-bottom: 0;\n}\n.nav-tabs-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs-justified > .active > a,\n.nav-tabs-justified > .active > a:hover,\n.nav-tabs-justified > .active > a:focus {\n border: 1px solid #dddddd;\n}\n@media (min-width: 768px) {\n .nav-tabs-justified > li > a {\n border-bottom: 1px solid #dddddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs-justified > .active > a,\n .nav-tabs-justified > .active > a:hover,\n .nav-tabs-justified > .active > a:focus {\n border-bottom-color: #ffffff;\n }\n}\n.tab-content > .tab-pane {\n display: none;\n}\n.tab-content > .active {\n display: block;\n}\n.nav-tabs .dropdown-menu {\n margin-top: -1px;\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.navbar {\n position: relative;\n min-height: 50px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n}\n@media (min-width: 768px) {\n .navbar {\n border-radius: 4px;\n }\n}\n@media (min-width: 768px) {\n .navbar-header {\n float: left;\n }\n}\n.navbar-collapse {\n overflow-x: visible;\n padding-right: 15px;\n padding-left: 15px;\n border-top: 1px solid transparent;\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);\n -webkit-overflow-scrolling: touch;\n}\n.navbar-collapse.in {\n overflow-y: auto;\n}\n@media (min-width: 768px) {\n .navbar-collapse {\n width: auto;\n border-top: 0;\n box-shadow: none;\n }\n .navbar-collapse.collapse {\n display: block !important;\n height: auto !important;\n padding-bottom: 0;\n overflow: visible !important;\n }\n .navbar-collapse.in {\n overflow-y: visible;\n }\n .navbar-fixed-top .navbar-collapse,\n .navbar-static-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n padding-left: 0;\n padding-right: 0;\n }\n}\n.navbar-fixed-top .navbar-collapse,\n.navbar-fixed-bottom .navbar-collapse {\n max-height: 340px;\n}\n@media (max-device-width: 480px) and (orientation: landscape) {\n .navbar-fixed-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n max-height: 200px;\n }\n}\n.container > .navbar-header,\n.container-fluid > .navbar-header,\n.container > .navbar-collapse,\n.container-fluid > .navbar-collapse {\n margin-right: -15px;\n margin-left: -15px;\n}\n@media (min-width: 768px) {\n .container > .navbar-header,\n .container-fluid > .navbar-header,\n .container > .navbar-collapse,\n .container-fluid > .navbar-collapse {\n margin-right: 0;\n margin-left: 0;\n }\n}\n.navbar-static-top {\n z-index: 1000;\n border-width: 0 0 1px;\n}\n@media (min-width: 768px) {\n .navbar-static-top {\n border-radius: 0;\n }\n}\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n position: fixed;\n right: 0;\n left: 0;\n z-index: 1030;\n}\n@media (min-width: 768px) {\n .navbar-fixed-top,\n .navbar-fixed-bottom {\n border-radius: 0;\n }\n}\n.navbar-fixed-top {\n top: 0;\n border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n bottom: 0;\n margin-bottom: 0;\n border-width: 1px 0 0;\n}\n.navbar-brand {\n float: left;\n padding: 15px 15px;\n font-size: 18px;\n line-height: 20px;\n height: 50px;\n}\n.navbar-brand:hover,\n.navbar-brand:focus {\n text-decoration: none;\n}\n.navbar-brand > img {\n display: block;\n}\n@media (min-width: 768px) {\n .navbar > .container .navbar-brand,\n .navbar > .container-fluid .navbar-brand {\n margin-left: -15px;\n }\n}\n.navbar-toggle {\n position: relative;\n float: right;\n margin-right: 15px;\n padding: 9px 10px;\n margin-top: 8px;\n margin-bottom: 8px;\n background-color: transparent;\n background-image: none;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.navbar-toggle:focus {\n outline: 0;\n}\n.navbar-toggle .icon-bar {\n display: block;\n width: 22px;\n height: 2px;\n border-radius: 1px;\n}\n.navbar-toggle .icon-bar + .icon-bar {\n margin-top: 4px;\n}\n@media (min-width: 768px) {\n .navbar-toggle {\n display: none;\n }\n}\n.navbar-nav {\n margin: 7.5px -15px;\n}\n.navbar-nav > li > a {\n padding-top: 10px;\n padding-bottom: 10px;\n line-height: 20px;\n}\n@media (max-width: 767px) {\n .navbar-nav .open .dropdown-menu {\n position: static;\n float: none;\n width: auto;\n margin-top: 0;\n background-color: transparent;\n border: 0;\n box-shadow: none;\n }\n .navbar-nav .open .dropdown-menu > li > a,\n .navbar-nav .open .dropdown-menu .dropdown-header {\n padding: 5px 15px 5px 25px;\n }\n .navbar-nav .open .dropdown-menu > li > a {\n line-height: 20px;\n }\n .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-nav .open .dropdown-menu > li > a:focus {\n background-image: none;\n }\n}\n@media (min-width: 768px) {\n .navbar-nav {\n float: left;\n margin: 0;\n }\n .navbar-nav > li {\n float: left;\n }\n .navbar-nav > li > a {\n padding-top: 15px;\n padding-bottom: 15px;\n }\n}\n.navbar-form {\n margin-left: -15px;\n margin-right: -15px;\n padding: 10px 15px;\n border-top: 1px solid transparent;\n border-bottom: 1px solid transparent;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n margin-top: 8px;\n margin-bottom: 8px;\n}\n@media (min-width: 768px) {\n .navbar-form .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .navbar-form .form-control-static {\n display: inline-block;\n }\n .navbar-form .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .navbar-form .input-group .input-group-addon,\n .navbar-form .input-group .input-group-btn,\n .navbar-form .input-group .form-control {\n width: auto;\n }\n .navbar-form .input-group > .form-control {\n width: 100%;\n }\n .navbar-form .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio,\n .navbar-form .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio label,\n .navbar-form .checkbox label {\n padding-left: 0;\n }\n .navbar-form .radio input[type=\"radio\"],\n .navbar-form .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .navbar-form .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n@media (max-width: 767px) {\n .navbar-form .form-group {\n margin-bottom: 5px;\n }\n .navbar-form .form-group:last-child {\n margin-bottom: 0;\n }\n}\n@media (min-width: 768px) {\n .navbar-form {\n width: auto;\n border: 0;\n margin-left: 0;\n margin-right: 0;\n padding-top: 0;\n padding-bottom: 0;\n -webkit-box-shadow: none;\n box-shadow: none;\n }\n}\n.navbar-nav > li > .dropdown-menu {\n margin-top: 0;\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n margin-bottom: 0;\n border-top-right-radius: 4px;\n border-top-left-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.navbar-btn {\n margin-top: 8px;\n margin-bottom: 8px;\n}\n.navbar-btn.btn-sm {\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.navbar-btn.btn-xs {\n margin-top: 14px;\n margin-bottom: 14px;\n}\n.navbar-text {\n margin-top: 15px;\n margin-bottom: 15px;\n}\n@media (min-width: 768px) {\n .navbar-text {\n float: left;\n margin-left: 15px;\n margin-right: 15px;\n }\n}\n@media (min-width: 768px) {\n .navbar-left {\n float: left !important;\n }\n .navbar-right {\n float: right !important;\n margin-right: -15px;\n }\n .navbar-right ~ .navbar-right {\n margin-right: 0;\n }\n}\n.navbar-default {\n background-color: #f8f8f8;\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-brand {\n color: #777777;\n}\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n color: #5e5e5e;\n background-color: transparent;\n}\n.navbar-default .navbar-text {\n color: #777777;\n}\n.navbar-default .navbar-nav > li > a {\n color: #777777;\n}\n.navbar-default .navbar-nav > li > a:hover,\n.navbar-default .navbar-nav > li > a:focus {\n color: #333333;\n background-color: transparent;\n}\n.navbar-default .navbar-nav > .active > a,\n.navbar-default .navbar-nav > .active > a:hover,\n.navbar-default .navbar-nav > .active > a:focus {\n color: #555555;\n background-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .disabled > a,\n.navbar-default .navbar-nav > .disabled > a:hover,\n.navbar-default .navbar-nav > .disabled > a:focus {\n color: #cccccc;\n background-color: transparent;\n}\n.navbar-default .navbar-toggle {\n border-color: #dddddd;\n}\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n background-color: #dddddd;\n}\n.navbar-default .navbar-toggle .icon-bar {\n background-color: #888888;\n}\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .open > a:hover,\n.navbar-default .navbar-nav > .open > a:focus {\n background-color: #e7e7e7;\n color: #555555;\n}\n@media (max-width: 767px) {\n .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n color: #777777;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #333333;\n background-color: transparent;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #555555;\n background-color: #e7e7e7;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #cccccc;\n background-color: transparent;\n }\n}\n.navbar-default .navbar-link {\n color: #777777;\n}\n.navbar-default .navbar-link:hover {\n color: #333333;\n}\n.navbar-default .btn-link {\n color: #777777;\n}\n.navbar-default .btn-link:hover,\n.navbar-default .btn-link:focus {\n color: #333333;\n}\n.navbar-default .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-default .btn-link:hover,\n.navbar-default .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-default .btn-link:focus {\n color: #cccccc;\n}\n.navbar-inverse {\n background-color: #222222;\n border-color: #080808;\n}\n.navbar-inverse .navbar-brand {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n color: #ffffff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-text {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n color: #ffffff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-nav > .active > a,\n.navbar-inverse .navbar-nav > .active > a:hover,\n.navbar-inverse .navbar-nav > .active > a:focus {\n color: #ffffff;\n background-color: #080808;\n}\n.navbar-inverse .navbar-nav > .disabled > a,\n.navbar-inverse .navbar-nav > .disabled > a:hover,\n.navbar-inverse .navbar-nav > .disabled > a:focus {\n color: #444444;\n background-color: transparent;\n}\n.navbar-inverse .navbar-toggle {\n border-color: #333333;\n}\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n background-color: #333333;\n}\n.navbar-inverse .navbar-toggle .icon-bar {\n background-color: #ffffff;\n}\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n border-color: #101010;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .open > a:hover,\n.navbar-inverse .navbar-nav > .open > a:focus {\n background-color: #080808;\n color: #ffffff;\n}\n@media (max-width: 767px) {\n .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n border-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu .divider {\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n color: #9d9d9d;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #ffffff;\n background-color: transparent;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #ffffff;\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #444444;\n background-color: transparent;\n }\n}\n.navbar-inverse .navbar-link {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-link:hover {\n color: #ffffff;\n}\n.navbar-inverse .btn-link {\n color: #9d9d9d;\n}\n.navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link:focus {\n color: #ffffff;\n}\n.navbar-inverse .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-inverse .btn-link:focus {\n color: #444444;\n}\n.breadcrumb {\n padding: 8px 15px;\n margin-bottom: 20px;\n list-style: none;\n background-color: #f5f5f5;\n border-radius: 4px;\n}\n.breadcrumb > li {\n display: inline-block;\n}\n.breadcrumb > li + li:before {\n content: \"/\\00a0\";\n padding: 0 5px;\n color: #cccccc;\n}\n.breadcrumb > .active {\n color: #777777;\n}\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: 20px 0;\n border-radius: 4px;\n}\n.pagination > li {\n display: inline;\n}\n.pagination > li > a,\n.pagination > li > span {\n position: relative;\n float: left;\n padding: 6px 12px;\n line-height: 1.42857143;\n text-decoration: none;\n color: #337ab7;\n background-color: #ffffff;\n border: 1px solid #dddddd;\n margin-left: -1px;\n}\n.pagination > li:first-child > a,\n.pagination > li:first-child > span {\n margin-left: 0;\n border-bottom-left-radius: 4px;\n border-top-left-radius: 4px;\n}\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n border-bottom-right-radius: 4px;\n border-top-right-radius: 4px;\n}\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n z-index: 3;\n color: #23527c;\n background-color: #eeeeee;\n border-color: #dddddd;\n}\n.pagination > .active > a,\n.pagination > .active > span,\n.pagination > .active > a:hover,\n.pagination > .active > span:hover,\n.pagination > .active > a:focus,\n.pagination > .active > span:focus {\n z-index: 2;\n color: #ffffff;\n background-color: #337ab7;\n border-color: #337ab7;\n cursor: default;\n}\n.pagination > .disabled > span,\n.pagination > .disabled > span:hover,\n.pagination > .disabled > span:focus,\n.pagination > .disabled > a,\n.pagination > .disabled > a:hover,\n.pagination > .disabled > a:focus {\n color: #777777;\n background-color: #ffffff;\n border-color: #dddddd;\n cursor: not-allowed;\n}\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n}\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n border-bottom-left-radius: 6px;\n border-top-left-radius: 6px;\n}\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n border-bottom-right-radius: 6px;\n border-top-right-radius: 6px;\n}\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n}\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n border-bottom-left-radius: 3px;\n border-top-left-radius: 3px;\n}\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n border-bottom-right-radius: 3px;\n border-top-right-radius: 3px;\n}\n.pager {\n padding-left: 0;\n margin: 20px 0;\n list-style: none;\n text-align: center;\n}\n.pager li {\n display: inline;\n}\n.pager li > a,\n.pager li > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: #ffffff;\n border: 1px solid #dddddd;\n border-radius: 15px;\n}\n.pager li > a:hover,\n.pager li > a:focus {\n text-decoration: none;\n background-color: #eeeeee;\n}\n.pager .next > a,\n.pager .next > span {\n float: right;\n}\n.pager .previous > a,\n.pager .previous > span {\n float: left;\n}\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n color: #777777;\n background-color: #ffffff;\n cursor: not-allowed;\n}\n.label {\n display: inline;\n padding: .2em .6em .3em;\n font-size: 75%;\n font-weight: bold;\n line-height: 1;\n color: #ffffff;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: .25em;\n}\na.label:hover,\na.label:focus {\n color: #ffffff;\n text-decoration: none;\n cursor: pointer;\n}\n.label:empty {\n display: none;\n}\n.btn .label {\n position: relative;\n top: -1px;\n}\n.label-default {\n background-color: #777777;\n}\n.label-default[href]:hover,\n.label-default[href]:focus {\n background-color: #5e5e5e;\n}\n.label-primary {\n background-color: #337ab7;\n}\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n background-color: #286090;\n}\n.label-success {\n background-color: #5cb85c;\n}\n.label-success[href]:hover,\n.label-success[href]:focus {\n background-color: #449d44;\n}\n.label-info {\n background-color: #5bc0de;\n}\n.label-info[href]:hover,\n.label-info[href]:focus {\n background-color: #31b0d5;\n}\n.label-warning {\n background-color: #f0ad4e;\n}\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n background-color: #ec971f;\n}\n.label-danger {\n background-color: #d9534f;\n}\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n background-color: #c9302c;\n}\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: 12px;\n font-weight: bold;\n color: #ffffff;\n line-height: 1;\n vertical-align: middle;\n white-space: nowrap;\n text-align: center;\n background-color: #777777;\n border-radius: 10px;\n}\n.badge:empty {\n display: none;\n}\n.btn .badge {\n position: relative;\n top: -1px;\n}\n.btn-xs .badge,\n.btn-group-xs > .btn .badge {\n top: 0;\n padding: 1px 5px;\n}\na.badge:hover,\na.badge:focus {\n color: #ffffff;\n text-decoration: none;\n cursor: pointer;\n}\n.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n color: #337ab7;\n background-color: #ffffff;\n}\n.list-group-item > .badge {\n float: right;\n}\n.list-group-item > .badge + .badge {\n margin-right: 5px;\n}\n.nav-pills > li > a > .badge {\n margin-left: 3px;\n}\n.jumbotron {\n padding-top: 30px;\n padding-bottom: 30px;\n margin-bottom: 30px;\n color: inherit;\n background-color: #eeeeee;\n}\n.jumbotron h1,\n.jumbotron .h1 {\n color: inherit;\n}\n.jumbotron p {\n margin-bottom: 15px;\n font-size: 21px;\n font-weight: 200;\n}\n.jumbotron > hr {\n border-top-color: #d5d5d5;\n}\n.container .jumbotron,\n.container-fluid .jumbotron {\n border-radius: 6px;\n}\n.jumbotron .container {\n max-width: 100%;\n}\n@media screen and (min-width: 768px) {\n .jumbotron {\n padding-top: 48px;\n padding-bottom: 48px;\n }\n .container .jumbotron,\n .container-fluid .jumbotron {\n padding-left: 60px;\n padding-right: 60px;\n }\n .jumbotron h1,\n .jumbotron .h1 {\n font-size: 63px;\n }\n}\n.thumbnail {\n display: block;\n padding: 4px;\n margin-bottom: 20px;\n line-height: 1.42857143;\n background-color: #ffffff;\n border: 1px solid #dddddd;\n border-radius: 4px;\n -webkit-transition: border 0.2s ease-in-out;\n -o-transition: border 0.2s ease-in-out;\n transition: border 0.2s ease-in-out;\n}\n.thumbnail > img,\n.thumbnail a > img {\n margin-left: auto;\n margin-right: auto;\n}\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n border-color: #337ab7;\n}\n.thumbnail .caption {\n padding: 9px;\n color: #333333;\n}\n.alert {\n padding: 15px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.alert h4 {\n margin-top: 0;\n color: inherit;\n}\n.alert .alert-link {\n font-weight: bold;\n}\n.alert > p,\n.alert > ul {\n margin-bottom: 0;\n}\n.alert > p + p {\n margin-top: 5px;\n}\n.alert-dismissable,\n.alert-dismissible {\n padding-right: 35px;\n}\n.alert-dismissable .close,\n.alert-dismissible .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit;\n}\n.alert-success {\n background-color: #dff0d8;\n border-color: #d6e9c6;\n color: #3c763d;\n}\n.alert-success hr {\n border-top-color: #c9e2b3;\n}\n.alert-success .alert-link {\n color: #2b542c;\n}\n.alert-info {\n background-color: #d9edf7;\n border-color: #bce8f1;\n color: #31708f;\n}\n.alert-info hr {\n border-top-color: #a6e1ec;\n}\n.alert-info .alert-link {\n color: #245269;\n}\n.alert-warning {\n background-color: #fcf8e3;\n border-color: #faebcc;\n color: #8a6d3b;\n}\n.alert-warning hr {\n border-top-color: #f7e1b5;\n}\n.alert-warning .alert-link {\n color: #66512c;\n}\n.alert-danger {\n background-color: #f2dede;\n border-color: #ebccd1;\n color: #a94442;\n}\n.alert-danger hr {\n border-top-color: #e4b9c0;\n}\n.alert-danger .alert-link {\n color: #843534;\n}\n@-webkit-keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n@keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n.progress {\n overflow: hidden;\n height: 20px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n.progress-bar {\n float: left;\n width: 0%;\n height: 100%;\n font-size: 12px;\n line-height: 20px;\n color: #ffffff;\n text-align: center;\n background-color: #337ab7;\n -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n -webkit-transition: width 0.6s ease;\n -o-transition: width 0.6s ease;\n transition: width 0.6s ease;\n}\n.progress-striped .progress-bar,\n.progress-bar-striped {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-size: 40px 40px;\n}\n.progress.active .progress-bar,\n.progress-bar.active {\n -webkit-animation: progress-bar-stripes 2s linear infinite;\n -o-animation: progress-bar-stripes 2s linear infinite;\n animation: progress-bar-stripes 2s linear infinite;\n}\n.progress-bar-success {\n background-color: #5cb85c;\n}\n.progress-striped .progress-bar-success {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-info {\n background-color: #5bc0de;\n}\n.progress-striped .progress-bar-info {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-warning {\n background-color: #f0ad4e;\n}\n.progress-striped .progress-bar-warning {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-danger {\n background-color: #d9534f;\n}\n.progress-striped .progress-bar-danger {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.media {\n margin-top: 15px;\n}\n.media:first-child {\n margin-top: 0;\n}\n.media,\n.media-body {\n zoom: 1;\n overflow: hidden;\n}\n.media-body {\n width: 10000px;\n}\n.media-object {\n display: block;\n}\n.media-object.img-thumbnail {\n max-width: none;\n}\n.media-right,\n.media > .pull-right {\n padding-left: 10px;\n}\n.media-left,\n.media > .pull-left {\n padding-right: 10px;\n}\n.media-left,\n.media-right,\n.media-body {\n display: table-cell;\n vertical-align: top;\n}\n.media-middle {\n vertical-align: middle;\n}\n.media-bottom {\n vertical-align: bottom;\n}\n.media-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.media-list {\n padding-left: 0;\n list-style: none;\n}\n.list-group {\n margin-bottom: 20px;\n padding-left: 0;\n}\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n margin-bottom: -1px;\n background-color: #ffffff;\n border: 1px solid #dddddd;\n}\n.list-group-item:first-child {\n border-top-right-radius: 4px;\n border-top-left-radius: 4px;\n}\n.list-group-item:last-child {\n margin-bottom: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\na.list-group-item,\nbutton.list-group-item {\n color: #555555;\n}\na.list-group-item .list-group-item-heading,\nbutton.list-group-item .list-group-item-heading {\n color: #333333;\n}\na.list-group-item:hover,\nbutton.list-group-item:hover,\na.list-group-item:focus,\nbutton.list-group-item:focus {\n text-decoration: none;\n color: #555555;\n background-color: #f5f5f5;\n}\nbutton.list-group-item {\n width: 100%;\n text-align: left;\n}\n.list-group-item.disabled,\n.list-group-item.disabled:hover,\n.list-group-item.disabled:focus {\n background-color: #eeeeee;\n color: #777777;\n cursor: not-allowed;\n}\n.list-group-item.disabled .list-group-item-heading,\n.list-group-item.disabled:hover .list-group-item-heading,\n.list-group-item.disabled:focus .list-group-item-heading {\n color: inherit;\n}\n.list-group-item.disabled .list-group-item-text,\n.list-group-item.disabled:hover .list-group-item-text,\n.list-group-item.disabled:focus .list-group-item-text {\n color: #777777;\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n z-index: 2;\n color: #ffffff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.list-group-item.active .list-group-item-heading,\n.list-group-item.active:hover .list-group-item-heading,\n.list-group-item.active:focus .list-group-item-heading,\n.list-group-item.active .list-group-item-heading > small,\n.list-group-item.active:hover .list-group-item-heading > small,\n.list-group-item.active:focus .list-group-item-heading > small,\n.list-group-item.active .list-group-item-heading > .small,\n.list-group-item.active:hover .list-group-item-heading > .small,\n.list-group-item.active:focus .list-group-item-heading > .small {\n color: inherit;\n}\n.list-group-item.active .list-group-item-text,\n.list-group-item.active:hover .list-group-item-text,\n.list-group-item.active:focus .list-group-item-text {\n color: #c7ddef;\n}\n.list-group-item-success {\n color: #3c763d;\n background-color: #dff0d8;\n}\na.list-group-item-success,\nbutton.list-group-item-success {\n color: #3c763d;\n}\na.list-group-item-success .list-group-item-heading,\nbutton.list-group-item-success .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-success:hover,\nbutton.list-group-item-success:hover,\na.list-group-item-success:focus,\nbutton.list-group-item-success:focus {\n color: #3c763d;\n background-color: #d0e9c6;\n}\na.list-group-item-success.active,\nbutton.list-group-item-success.active,\na.list-group-item-success.active:hover,\nbutton.list-group-item-success.active:hover,\na.list-group-item-success.active:focus,\nbutton.list-group-item-success.active:focus {\n color: #fff;\n background-color: #3c763d;\n border-color: #3c763d;\n}\n.list-group-item-info {\n color: #31708f;\n background-color: #d9edf7;\n}\na.list-group-item-info,\nbutton.list-group-item-info {\n color: #31708f;\n}\na.list-group-item-info .list-group-item-heading,\nbutton.list-group-item-info .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-info:hover,\nbutton.list-group-item-info:hover,\na.list-group-item-info:focus,\nbutton.list-group-item-info:focus {\n color: #31708f;\n background-color: #c4e3f3;\n}\na.list-group-item-info.active,\nbutton.list-group-item-info.active,\na.list-group-item-info.active:hover,\nbutton.list-group-item-info.active:hover,\na.list-group-item-info.active:focus,\nbutton.list-group-item-info.active:focus {\n color: #fff;\n background-color: #31708f;\n border-color: #31708f;\n}\n.list-group-item-warning {\n color: #8a6d3b;\n background-color: #fcf8e3;\n}\na.list-group-item-warning,\nbutton.list-group-item-warning {\n color: #8a6d3b;\n}\na.list-group-item-warning .list-group-item-heading,\nbutton.list-group-item-warning .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-warning:hover,\nbutton.list-group-item-warning:hover,\na.list-group-item-warning:focus,\nbutton.list-group-item-warning:focus {\n color: #8a6d3b;\n background-color: #faf2cc;\n}\na.list-group-item-warning.active,\nbutton.list-group-item-warning.active,\na.list-group-item-warning.active:hover,\nbutton.list-group-item-warning.active:hover,\na.list-group-item-warning.active:focus,\nbutton.list-group-item-warning.active:focus {\n color: #fff;\n background-color: #8a6d3b;\n border-color: #8a6d3b;\n}\n.list-group-item-danger {\n color: #a94442;\n background-color: #f2dede;\n}\na.list-group-item-danger,\nbutton.list-group-item-danger {\n color: #a94442;\n}\na.list-group-item-danger .list-group-item-heading,\nbutton.list-group-item-danger .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-danger:hover,\nbutton.list-group-item-danger:hover,\na.list-group-item-danger:focus,\nbutton.list-group-item-danger:focus {\n color: #a94442;\n background-color: #ebcccc;\n}\na.list-group-item-danger.active,\nbutton.list-group-item-danger.active,\na.list-group-item-danger.active:hover,\nbutton.list-group-item-danger.active:hover,\na.list-group-item-danger.active:focus,\nbutton.list-group-item-danger.active:focus {\n color: #fff;\n background-color: #a94442;\n border-color: #a94442;\n}\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n.panel {\n margin-bottom: 20px;\n background-color: #ffffff;\n border: 1px solid transparent;\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.panel-body {\n padding: 15px;\n}\n.panel-heading {\n padding: 10px 15px;\n border-bottom: 1px solid transparent;\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel-heading > .dropdown .dropdown-toggle {\n color: inherit;\n}\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: 16px;\n color: inherit;\n}\n.panel-title > a,\n.panel-title > small,\n.panel-title > .small,\n.panel-title > small > a,\n.panel-title > .small > a {\n color: inherit;\n}\n.panel-footer {\n padding: 10px 15px;\n background-color: #f5f5f5;\n border-top: 1px solid #dddddd;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .list-group,\n.panel > .panel-collapse > .list-group {\n margin-bottom: 0;\n}\n.panel > .list-group .list-group-item,\n.panel > .panel-collapse > .list-group .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n}\n.panel > .list-group:first-child .list-group-item:first-child,\n.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {\n border-top: 0;\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel > .list-group:last-child .list-group-item:last-child,\n.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {\n border-bottom: 0;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child {\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.panel-heading + .list-group .list-group-item:first-child {\n border-top-width: 0;\n}\n.list-group + .panel-footer {\n border-top-width: 0;\n}\n.panel > .table,\n.panel > .table-responsive > .table,\n.panel > .panel-collapse > .table {\n margin-bottom: 0;\n}\n.panel > .table caption,\n.panel > .table-responsive > .table caption,\n.panel > .panel-collapse > .table caption {\n padding-left: 15px;\n padding-right: 15px;\n}\n.panel > .table:first-child,\n.panel > .table-responsive:first-child > .table:first-child {\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {\n border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {\n border-top-right-radius: 3px;\n}\n.panel > .table:last-child,\n.panel > .table-responsive:last-child > .table:last-child {\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {\n border-bottom-left-radius: 3px;\n border-bottom-right-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {\n border-bottom-right-radius: 3px;\n}\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive,\n.panel > .table + .panel-body,\n.panel > .table-responsive + .panel-body {\n border-top: 1px solid #dddddd;\n}\n.panel > .table > tbody:first-child > tr:first-child th,\n.panel > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n}\n.panel > .table-bordered,\n.panel > .table-responsive > .table-bordered {\n border: 0;\n}\n.panel > .table-bordered > thead > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,\n.panel > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-bordered > thead > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,\n.panel > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-bordered > tfoot > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n}\n.panel > .table-bordered > thead > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,\n.panel > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-bordered > thead > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,\n.panel > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-bordered > tfoot > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n}\n.panel > .table-bordered > thead > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,\n.panel > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-bordered > thead > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,\n.panel > .table-bordered > tbody > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {\n border-bottom: 0;\n}\n.panel > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-bordered > tfoot > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {\n border-bottom: 0;\n}\n.panel > .table-responsive {\n border: 0;\n margin-bottom: 0;\n}\n.panel-group {\n margin-bottom: 20px;\n}\n.panel-group .panel {\n margin-bottom: 0;\n border-radius: 4px;\n}\n.panel-group .panel + .panel {\n margin-top: 5px;\n}\n.panel-group .panel-heading {\n border-bottom: 0;\n}\n.panel-group .panel-heading + .panel-collapse > .panel-body,\n.panel-group .panel-heading + .panel-collapse > .list-group {\n border-top: 1px solid #dddddd;\n}\n.panel-group .panel-footer {\n border-top: 0;\n}\n.panel-group .panel-footer + .panel-collapse .panel-body {\n border-bottom: 1px solid #dddddd;\n}\n.panel-default {\n border-color: #dddddd;\n}\n.panel-default > .panel-heading {\n color: #333333;\n background-color: #f5f5f5;\n border-color: #dddddd;\n}\n.panel-default > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #dddddd;\n}\n.panel-default > .panel-heading .badge {\n color: #f5f5f5;\n background-color: #333333;\n}\n.panel-default > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #dddddd;\n}\n.panel-primary {\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading {\n color: #ffffff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #337ab7;\n}\n.panel-primary > .panel-heading .badge {\n color: #337ab7;\n background-color: #ffffff;\n}\n.panel-primary > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #337ab7;\n}\n.panel-success {\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #d6e9c6;\n}\n.panel-success > .panel-heading .badge {\n color: #dff0d8;\n background-color: #3c763d;\n}\n.panel-success > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #d6e9c6;\n}\n.panel-info {\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading {\n color: #31708f;\n background-color: #d9edf7;\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #bce8f1;\n}\n.panel-info > .panel-heading .badge {\n color: #d9edf7;\n background-color: #31708f;\n}\n.panel-info > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #bce8f1;\n}\n.panel-warning {\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #faebcc;\n}\n.panel-warning > .panel-heading .badge {\n color: #fcf8e3;\n background-color: #8a6d3b;\n}\n.panel-warning > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #faebcc;\n}\n.panel-danger {\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading {\n color: #a94442;\n background-color: #f2dede;\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ebccd1;\n}\n.panel-danger > .panel-heading .badge {\n color: #f2dede;\n background-color: #a94442;\n}\n.panel-danger > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ebccd1;\n}\n.embed-responsive {\n position: relative;\n display: block;\n height: 0;\n padding: 0;\n overflow: hidden;\n}\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n height: 100%;\n width: 100%;\n border: 0;\n}\n.embed-responsive-16by9 {\n padding-bottom: 56.25%;\n}\n.embed-responsive-4by3 {\n padding-bottom: 75%;\n}\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border: 1px solid #e3e3e3;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.well blockquote {\n border-color: #ddd;\n border-color: rgba(0, 0, 0, 0.15);\n}\n.well-lg {\n padding: 24px;\n border-radius: 6px;\n}\n.well-sm {\n padding: 9px;\n border-radius: 3px;\n}\n.close {\n float: right;\n font-size: 21px;\n font-weight: bold;\n line-height: 1;\n color: #000000;\n text-shadow: 0 1px 0 #ffffff;\n opacity: 0.2;\n filter: alpha(opacity=20);\n}\n.close:hover,\n.close:focus {\n color: #000000;\n text-decoration: none;\n cursor: pointer;\n opacity: 0.5;\n filter: alpha(opacity=50);\n}\nbutton.close {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n}\n.modal-open {\n overflow: hidden;\n}\n.modal {\n display: none;\n overflow: hidden;\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1050;\n -webkit-overflow-scrolling: touch;\n outline: 0;\n}\n.modal.fade .modal-dialog {\n -webkit-transform: translate(0, -25%);\n -ms-transform: translate(0, -25%);\n -o-transform: translate(0, -25%);\n transform: translate(0, -25%);\n -webkit-transition: -webkit-transform 0.3s ease-out;\n -moz-transition: -moz-transform 0.3s ease-out;\n -o-transition: -o-transform 0.3s ease-out;\n transition: transform 0.3s ease-out;\n}\n.modal.in .modal-dialog {\n -webkit-transform: translate(0, 0);\n -ms-transform: translate(0, 0);\n -o-transform: translate(0, 0);\n transform: translate(0, 0);\n}\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n.modal-content {\n position: relative;\n background-color: #ffffff;\n border: 1px solid #999999;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n background-clip: padding-box;\n outline: 0;\n}\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1040;\n background-color: #000000;\n}\n.modal-backdrop.fade {\n opacity: 0;\n filter: alpha(opacity=0);\n}\n.modal-backdrop.in {\n opacity: 0.5;\n filter: alpha(opacity=50);\n}\n.modal-header {\n padding: 15px;\n border-bottom: 1px solid #e5e5e5;\n min-height: 16.42857143px;\n}\n.modal-header .close {\n margin-top: -2px;\n}\n.modal-title {\n margin: 0;\n line-height: 1.42857143;\n}\n.modal-body {\n position: relative;\n padding: 15px;\n}\n.modal-footer {\n padding: 15px;\n text-align: right;\n border-top: 1px solid #e5e5e5;\n}\n.modal-footer .btn + .btn {\n margin-left: 5px;\n margin-bottom: 0;\n}\n.modal-footer .btn-group .btn + .btn {\n margin-left: -1px;\n}\n.modal-footer .btn-block + .btn-block {\n margin-left: 0;\n}\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n@media (min-width: 768px) {\n .modal-dialog {\n width: 600px;\n margin: 30px auto;\n }\n .modal-content {\n -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n }\n .modal-sm {\n width: 300px;\n }\n}\n@media (min-width: 992px) {\n .modal-lg {\n width: 900px;\n }\n}\n.tooltip {\n position: absolute;\n z-index: 1070;\n display: block;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-style: normal;\n font-weight: normal;\n letter-spacing: normal;\n line-break: auto;\n line-height: 1.42857143;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n white-space: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n font-size: 12px;\n opacity: 0;\n filter: alpha(opacity=0);\n}\n.tooltip.in {\n opacity: 0.9;\n filter: alpha(opacity=90);\n}\n.tooltip.top {\n margin-top: -3px;\n padding: 5px 0;\n}\n.tooltip.right {\n margin-left: 3px;\n padding: 0 5px;\n}\n.tooltip.bottom {\n margin-top: 3px;\n padding: 5px 0;\n}\n.tooltip.left {\n margin-left: -3px;\n padding: 0 5px;\n}\n.tooltip-inner {\n max-width: 200px;\n padding: 3px 8px;\n color: #ffffff;\n text-align: center;\n background-color: #000000;\n border-radius: 4px;\n}\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.tooltip.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000000;\n}\n.tooltip.top-left .tooltip-arrow {\n bottom: 0;\n right: 5px;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000000;\n}\n.tooltip.top-right .tooltip-arrow {\n bottom: 0;\n left: 5px;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000000;\n}\n.tooltip.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -5px;\n border-width: 5px 5px 5px 0;\n border-right-color: #000000;\n}\n.tooltip.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -5px;\n border-width: 5px 0 5px 5px;\n border-left-color: #000000;\n}\n.tooltip.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000000;\n}\n.tooltip.bottom-left .tooltip-arrow {\n top: 0;\n right: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000000;\n}\n.tooltip.bottom-right .tooltip-arrow {\n top: 0;\n left: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000000;\n}\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1060;\n display: none;\n max-width: 276px;\n padding: 1px;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-style: normal;\n font-weight: normal;\n letter-spacing: normal;\n line-break: auto;\n line-height: 1.42857143;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n white-space: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n font-size: 14px;\n background-color: #ffffff;\n background-clip: padding-box;\n border: 1px solid #cccccc;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n}\n.popover.top {\n margin-top: -10px;\n}\n.popover.right {\n margin-left: 10px;\n}\n.popover.bottom {\n margin-top: 10px;\n}\n.popover.left {\n margin-left: -10px;\n}\n.popover-title {\n margin: 0;\n padding: 8px 14px;\n font-size: 14px;\n background-color: #f7f7f7;\n border-bottom: 1px solid #ebebeb;\n border-radius: 5px 5px 0 0;\n}\n.popover-content {\n padding: 9px 14px;\n}\n.popover > .arrow,\n.popover > .arrow:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.popover > .arrow {\n border-width: 11px;\n}\n.popover > .arrow:after {\n border-width: 10px;\n content: \"\";\n}\n.popover.top > .arrow {\n left: 50%;\n margin-left: -11px;\n border-bottom-width: 0;\n border-top-color: #999999;\n border-top-color: rgba(0, 0, 0, 0.25);\n bottom: -11px;\n}\n.popover.top > .arrow:after {\n content: \" \";\n bottom: 1px;\n margin-left: -10px;\n border-bottom-width: 0;\n border-top-color: #ffffff;\n}\n.popover.right > .arrow {\n top: 50%;\n left: -11px;\n margin-top: -11px;\n border-left-width: 0;\n border-right-color: #999999;\n border-right-color: rgba(0, 0, 0, 0.25);\n}\n.popover.right > .arrow:after {\n content: \" \";\n left: 1px;\n bottom: -10px;\n border-left-width: 0;\n border-right-color: #ffffff;\n}\n.popover.bottom > .arrow {\n left: 50%;\n margin-left: -11px;\n border-top-width: 0;\n border-bottom-color: #999999;\n border-bottom-color: rgba(0, 0, 0, 0.25);\n top: -11px;\n}\n.popover.bottom > .arrow:after {\n content: \" \";\n top: 1px;\n margin-left: -10px;\n border-top-width: 0;\n border-bottom-color: #ffffff;\n}\n.popover.left > .arrow {\n top: 50%;\n right: -11px;\n margin-top: -11px;\n border-right-width: 0;\n border-left-color: #999999;\n border-left-color: rgba(0, 0, 0, 0.25);\n}\n.popover.left > .arrow:after {\n content: \" \";\n right: 1px;\n border-right-width: 0;\n border-left-color: #ffffff;\n bottom: -10px;\n}\n.carousel {\n position: relative;\n}\n.carousel-inner {\n position: relative;\n overflow: hidden;\n width: 100%;\n}\n.carousel-inner > .item {\n display: none;\n position: relative;\n -webkit-transition: 0.6s ease-in-out left;\n -o-transition: 0.6s ease-in-out left;\n transition: 0.6s ease-in-out left;\n}\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n line-height: 1;\n}\n@media all and (transform-3d), (-webkit-transform-3d) {\n .carousel-inner > .item {\n -webkit-transition: -webkit-transform 0.6s ease-in-out;\n -moz-transition: -moz-transform 0.6s ease-in-out;\n -o-transition: -o-transform 0.6s ease-in-out;\n transition: transform 0.6s ease-in-out;\n -webkit-backface-visibility: hidden;\n -moz-backface-visibility: hidden;\n backface-visibility: hidden;\n -webkit-perspective: 1000px;\n -moz-perspective: 1000px;\n perspective: 1000px;\n }\n .carousel-inner > .item.next,\n .carousel-inner > .item.active.right {\n -webkit-transform: translate3d(100%, 0, 0);\n transform: translate3d(100%, 0, 0);\n left: 0;\n }\n .carousel-inner > .item.prev,\n .carousel-inner > .item.active.left {\n -webkit-transform: translate3d(-100%, 0, 0);\n transform: translate3d(-100%, 0, 0);\n left: 0;\n }\n .carousel-inner > .item.next.left,\n .carousel-inner > .item.prev.right,\n .carousel-inner > .item.active {\n -webkit-transform: translate3d(0, 0, 0);\n transform: translate3d(0, 0, 0);\n left: 0;\n }\n}\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n display: block;\n}\n.carousel-inner > .active {\n left: 0;\n}\n.carousel-inner > .next,\n.carousel-inner > .prev {\n position: absolute;\n top: 0;\n width: 100%;\n}\n.carousel-inner > .next {\n left: 100%;\n}\n.carousel-inner > .prev {\n left: -100%;\n}\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n left: 0;\n}\n.carousel-inner > .active.left {\n left: -100%;\n}\n.carousel-inner > .active.right {\n left: 100%;\n}\n.carousel-control {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n width: 15%;\n opacity: 0.5;\n filter: alpha(opacity=50);\n font-size: 20px;\n color: #ffffff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n.carousel-control.left {\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);\n}\n.carousel-control.right {\n left: auto;\n right: 0;\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);\n}\n.carousel-control:hover,\n.carousel-control:focus {\n outline: 0;\n color: #ffffff;\n text-decoration: none;\n opacity: 0.9;\n filter: alpha(opacity=90);\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-left,\n.carousel-control .glyphicon-chevron-right {\n position: absolute;\n top: 50%;\n margin-top: -10px;\n z-index: 5;\n display: inline-block;\n}\n.carousel-control .icon-prev,\n.carousel-control .glyphicon-chevron-left {\n left: 50%;\n margin-left: -10px;\n}\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-right {\n right: 50%;\n margin-right: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n width: 20px;\n height: 20px;\n line-height: 1;\n font-family: serif;\n}\n.carousel-control .icon-prev:before {\n content: '\\2039';\n}\n.carousel-control .icon-next:before {\n content: '\\203a';\n}\n.carousel-indicators {\n position: absolute;\n bottom: 10px;\n left: 50%;\n z-index: 15;\n width: 60%;\n margin-left: -30%;\n padding-left: 0;\n list-style: none;\n text-align: center;\n}\n.carousel-indicators li {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin: 1px;\n text-indent: -999px;\n border: 1px solid #ffffff;\n border-radius: 10px;\n cursor: pointer;\n background-color: #000 \\9;\n background-color: rgba(0, 0, 0, 0);\n}\n.carousel-indicators .active {\n margin: 0;\n width: 12px;\n height: 12px;\n background-color: #ffffff;\n}\n.carousel-caption {\n position: absolute;\n left: 15%;\n right: 15%;\n bottom: 20px;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: #ffffff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n.carousel-caption .btn {\n text-shadow: none;\n}\n@media screen and (min-width: 768px) {\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-prev,\n .carousel-control .icon-next {\n width: 30px;\n height: 30px;\n margin-top: -15px;\n font-size: 30px;\n }\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .icon-prev {\n margin-left: -15px;\n }\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-next {\n margin-right: -15px;\n }\n .carousel-caption {\n left: 20%;\n right: 20%;\n padding-bottom: 30px;\n }\n .carousel-indicators {\n bottom: 20px;\n }\n}\n.clearfix:before,\n.clearfix:after,\n.dl-horizontal dd:before,\n.dl-horizontal dd:after,\n.container:before,\n.container:after,\n.container-fluid:before,\n.container-fluid:after,\n.row:before,\n.row:after,\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after,\n.btn-toolbar:before,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after,\n.nav:before,\n.nav:after,\n.navbar:before,\n.navbar:after,\n.navbar-header:before,\n.navbar-header:after,\n.navbar-collapse:before,\n.navbar-collapse:after,\n.pager:before,\n.pager:after,\n.panel-body:before,\n.panel-body:after,\n.modal-footer:before,\n.modal-footer:after {\n content: \" \";\n display: table;\n}\n.clearfix:after,\n.dl-horizontal dd:after,\n.container:after,\n.container-fluid:after,\n.row:after,\n.form-horizontal .form-group:after,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:after,\n.nav:after,\n.navbar:after,\n.navbar-header:after,\n.navbar-collapse:after,\n.pager:after,\n.panel-body:after,\n.modal-footer:after {\n clear: both;\n}\n.center-block {\n display: block;\n margin-left: auto;\n margin-right: auto;\n}\n.pull-right {\n float: right !important;\n}\n.pull-left {\n float: left !important;\n}\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n.hidden {\n display: none !important;\n}\n.affix {\n position: fixed;\n}\n@-ms-viewport {\n width: device-width;\n}\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n display: none !important;\n}\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n display: none !important;\n}\n@media (max-width: 767px) {\n .visible-xs {\n display: block !important;\n }\n table.visible-xs {\n display: table !important;\n }\n tr.visible-xs {\n display: table-row !important;\n }\n th.visible-xs,\n td.visible-xs {\n display: table-cell !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-block {\n display: block !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline {\n display: inline !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm {\n display: block !important;\n }\n table.visible-sm {\n display: table !important;\n }\n tr.visible-sm {\n display: table-row !important;\n }\n th.visible-sm,\n td.visible-sm {\n display: table-cell !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-block {\n display: block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline {\n display: inline !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md {\n display: block !important;\n }\n table.visible-md {\n display: table !important;\n }\n tr.visible-md {\n display: table-row !important;\n }\n th.visible-md,\n td.visible-md {\n display: table-cell !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-block {\n display: block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline {\n display: inline !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg {\n display: block !important;\n }\n table.visible-lg {\n display: table !important;\n }\n tr.visible-lg {\n display: table-row !important;\n }\n th.visible-lg,\n td.visible-lg {\n display: table-cell !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-block {\n display: block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline {\n display: inline !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline-block {\n display: inline-block !important;\n }\n}\n@media (max-width: 767px) {\n .hidden-xs {\n display: none !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .hidden-sm {\n display: none !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .hidden-md {\n display: none !important;\n }\n}\n@media (min-width: 1200px) {\n .hidden-lg {\n display: none !important;\n }\n}\n.visible-print {\n display: none !important;\n}\n@media print {\n .visible-print {\n display: block !important;\n }\n table.visible-print {\n display: table !important;\n }\n tr.visible-print {\n display: table-row !important;\n }\n th.visible-print,\n td.visible-print {\n display: table-cell !important;\n }\n}\n.visible-print-block {\n display: none !important;\n}\n@media print {\n .visible-print-block {\n display: block !important;\n }\n}\n.visible-print-inline {\n display: none !important;\n}\n@media print {\n .visible-print-inline {\n display: inline !important;\n }\n}\n.visible-print-inline-block {\n display: none !important;\n}\n@media print {\n .visible-print-inline-block {\n display: inline-block !important;\n }\n}\n@media print {\n .hidden-print {\n display: none !important;\n }\n}\n/*# sourceMappingURL=bootstrap.css.map */","/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\n\n//\n// 1. Set default font family to sans-serif.\n// 2. Prevent iOS and IE text size adjust after device orientation change,\n// without disabling user zoom.\n//\n\nhtml {\n font-family: sans-serif; // 1\n -ms-text-size-adjust: 100%; // 2\n -webkit-text-size-adjust: 100%; // 2\n}\n\n//\n// Remove default margin.\n//\n\nbody {\n margin: 0;\n}\n\n// HTML5 display definitions\n// ==========================================================================\n\n//\n// Correct `block` display not defined for any HTML5 element in IE 8/9.\n// Correct `block` display not defined for `details` or `summary` in IE 10/11\n// and Firefox.\n// Correct `block` display not defined for `main` in IE 11.\n//\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\n\n//\n// 1. Correct `inline-block` display not defined in IE 8/9.\n// 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.\n//\n\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block; // 1\n vertical-align: baseline; // 2\n}\n\n//\n// Prevent modern browsers from displaying `audio` without controls.\n// Remove excess height in iOS 5 devices.\n//\n\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n\n//\n// Address `[hidden]` styling not present in IE 8/9/10.\n// Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22.\n//\n\n[hidden],\ntemplate {\n display: none;\n}\n\n// Links\n// ==========================================================================\n\n//\n// Remove the gray background color from active links in IE 10.\n//\n\na {\n background-color: transparent;\n}\n\n//\n// Improve readability of focused elements when they are also in an\n// active/hover state.\n//\n\na:active,\na:hover {\n outline: 0;\n}\n\n// Text-level semantics\n// ==========================================================================\n\n//\n// Address styling not present in IE 8/9/10/11, Safari, and Chrome.\n//\n\nabbr[title] {\n border-bottom: 1px dotted;\n}\n\n//\n// Address style set to `bolder` in Firefox 4+, Safari, and Chrome.\n//\n\nb,\nstrong {\n font-weight: bold;\n}\n\n//\n// Address styling not present in Safari and Chrome.\n//\n\ndfn {\n font-style: italic;\n}\n\n//\n// Address variable `h1` font-size and margin within `section` and `article`\n// contexts in Firefox 4+, Safari, and Chrome.\n//\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n//\n// Address styling not present in IE 8/9.\n//\n\nmark {\n background: #ff0;\n color: #000;\n}\n\n//\n// Address inconsistent and variable font size in all browsers.\n//\n\nsmall {\n font-size: 80%;\n}\n\n//\n// Prevent `sub` and `sup` affecting `line-height` in all browsers.\n//\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsup {\n top: -0.5em;\n}\n\nsub {\n bottom: -0.25em;\n}\n\n// Embedded content\n// ==========================================================================\n\n//\n// Remove border when inside `a` element in IE 8/9/10.\n//\n\nimg {\n border: 0;\n}\n\n//\n// Correct overflow not hidden in IE 9/10/11.\n//\n\nsvg:not(:root) {\n overflow: hidden;\n}\n\n// Grouping content\n// ==========================================================================\n\n//\n// Address margin not present in IE 8/9 and Safari.\n//\n\nfigure {\n margin: 1em 40px;\n}\n\n//\n// Address differences between Firefox and other browsers.\n//\n\nhr {\n box-sizing: content-box;\n height: 0;\n}\n\n//\n// Contain overflow in all browsers.\n//\n\npre {\n overflow: auto;\n}\n\n//\n// Address odd `em`-unit font size rendering in all browsers.\n//\n\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\n\n// Forms\n// ==========================================================================\n\n//\n// Known limitation: by default, Chrome and Safari on OS X allow very limited\n// styling of `select`, unless a `border` property is set.\n//\n\n//\n// 1. Correct color not being inherited.\n// Known issue: affects color of disabled elements.\n// 2. Correct font properties not being inherited.\n// 3. Address margins set differently in Firefox 4+, Safari, and Chrome.\n//\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit; // 1\n font: inherit; // 2\n margin: 0; // 3\n}\n\n//\n// Address `overflow` set to `hidden` in IE 8/9/10/11.\n//\n\nbutton {\n overflow: visible;\n}\n\n//\n// Address inconsistent `text-transform` inheritance for `button` and `select`.\n// All other form control elements do not inherit `text-transform` values.\n// Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.\n// Correct `select` style inheritance in Firefox.\n//\n\nbutton,\nselect {\n text-transform: none;\n}\n\n//\n// 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n// and `video` controls.\n// 2. Correct inability to style clickable `input` types in iOS.\n// 3. Improve usability and consistency of cursor style between image-type\n// `input` and others.\n//\n\nbutton,\nhtml input[type=\"button\"], // 1\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button; // 2\n cursor: pointer; // 3\n}\n\n//\n// Re-set default cursor for disabled elements.\n//\n\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\n\n//\n// Remove inner padding and border in Firefox 4+.\n//\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\n\n//\n// Address Firefox 4+ setting `line-height` on `input` using `!important` in\n// the UA stylesheet.\n//\n\ninput {\n line-height: normal;\n}\n\n//\n// It's recommended that you don't attempt to style these elements.\n// Firefox's implementation doesn't respect box-sizing, padding, or width.\n//\n// 1. Address box sizing set to `content-box` in IE 8/9/10.\n// 2. Remove excess padding in IE 8/9/10.\n//\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box; // 1\n padding: 0; // 2\n}\n\n//\n// Fix the cursor style for Chrome's increment/decrement buttons. For certain\n// `font-size` values of the `input`, it causes the cursor style of the\n// decrement button to change from `default` to `text`.\n//\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n//\n// 1. Address `appearance` set to `searchfield` in Safari and Chrome.\n// 2. Address `box-sizing` set to `border-box` in Safari and Chrome.\n//\n\ninput[type=\"search\"] {\n -webkit-appearance: textfield; // 1\n box-sizing: content-box; //2\n}\n\n//\n// Remove inner padding and search cancel button in Safari and Chrome on OS X.\n// Safari (but not Chrome) clips the cancel button when the search input has\n// padding (and `textfield` appearance).\n//\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n//\n// Define consistent border, margin, and padding.\n//\n\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\n\n//\n// 1. Correct `color` not being inherited in IE 8/9/10/11.\n// 2. Remove padding so people aren't caught out if they zero out fieldsets.\n//\n\nlegend {\n border: 0; // 1\n padding: 0; // 2\n}\n\n//\n// Remove default vertical scrollbar in IE 8/9/10/11.\n//\n\ntextarea {\n overflow: auto;\n}\n\n//\n// Don't inherit the `font-weight` (applied by a rule above).\n// NOTE: the default cannot safely be changed in Chrome and Safari on OS X.\n//\n\noptgroup {\n font-weight: bold;\n}\n\n// Tables\n// ==========================================================================\n\n//\n// Remove most spacing between table cells.\n//\n\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n\ntd,\nth {\n padding: 0;\n}\n","/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n\n// ==========================================================================\n// Print styles.\n// Inlined to avoid the additional HTTP request: h5bp.com/r\n// ==========================================================================\n\n@media print {\n *,\n *:before,\n *:after {\n background: transparent !important;\n color: #000 !important; // Black prints faster: h5bp.com/s\n box-shadow: none !important;\n text-shadow: none !important;\n }\n\n a,\n a:visited {\n text-decoration: underline;\n }\n\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n\n // Don't show links that are fragment identifiers,\n // or use the `javascript:` pseudo protocol\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n\n thead {\n display: table-header-group; // h5bp.com/t\n }\n\n tr,\n img {\n page-break-inside: avoid;\n }\n\n img {\n max-width: 100% !important;\n }\n\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n\n h2,\n h3 {\n page-break-after: avoid;\n }\n\n // Bootstrap specific changes start\n\n // Bootstrap components\n .navbar {\n display: none;\n }\n .btn,\n .dropup > .btn {\n > .caret {\n border-top-color: #000 !important;\n }\n }\n .label {\n border: 1px solid #000;\n }\n\n .table {\n border-collapse: collapse !important;\n\n td,\n th {\n background-color: #fff !important;\n }\n }\n .table-bordered {\n th,\n td {\n border: 1px solid #ddd !important;\n }\n }\n\n // Bootstrap specific changes end\n}\n","//\n// Glyphicons for Bootstrap\n//\n// Since icons are fonts, they can be placed anywhere text is placed and are\n// thus automatically sized to match the surrounding child. To use, create an\n// inline element with the appropriate classes, like so:\n//\n// <a href=\"#\"><span class=\"glyphicon glyphicon-star\"></span> Star</a>\n\n// Import the fonts\n@font-face {\n font-family: 'Glyphicons Halflings';\n src: url('@{icon-font-path}@{icon-font-name}.eot');\n src: url('@{icon-font-path}@{icon-font-name}.eot?#iefix') format('embedded-opentype'),\n url('@{icon-font-path}@{icon-font-name}.woff2') format('woff2'),\n url('@{icon-font-path}@{icon-font-name}.woff') format('woff'),\n url('@{icon-font-path}@{icon-font-name}.ttf') format('truetype'),\n url('@{icon-font-path}@{icon-font-name}.svg#@{icon-font-svg-id}') format('svg');\n}\n\n// Catchall baseclass\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: 'Glyphicons Halflings';\n font-style: normal;\n font-weight: normal;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n// Individual icons\n.glyphicon-asterisk { &:before { content: \"\\2a\"; } }\n.glyphicon-plus { &:before { content: \"\\2b\"; } }\n.glyphicon-euro,\n.glyphicon-eur { &:before { content: \"\\20ac\"; } }\n.glyphicon-minus { &:before { content: \"\\2212\"; } }\n.glyphicon-cloud { &:before { content: \"\\2601\"; } }\n.glyphicon-envelope { &:before { content: \"\\2709\"; } }\n.glyphicon-pencil { &:before { content: \"\\270f\"; } }\n.glyphicon-glass { &:before { content: \"\\e001\"; } }\n.glyphicon-music { &:before { content: \"\\e002\"; } }\n.glyphicon-search { &:before { content: \"\\e003\"; } }\n.glyphicon-heart { &:before { content: \"\\e005\"; } }\n.glyphicon-star { &:before { content: \"\\e006\"; } }\n.glyphicon-star-empty { &:before { content: \"\\e007\"; } }\n.glyphicon-user { &:before { content: \"\\e008\"; } }\n.glyphicon-film { &:before { content: \"\\e009\"; } }\n.glyphicon-th-large { &:before { content: \"\\e010\"; } }\n.glyphicon-th { &:before { content: \"\\e011\"; } }\n.glyphicon-th-list { &:before { content: \"\\e012\"; } }\n.glyphicon-ok { &:before { content: \"\\e013\"; } }\n.glyphicon-remove { &:before { content: \"\\e014\"; } }\n.glyphicon-zoom-in { &:before { content: \"\\e015\"; } }\n.glyphicon-zoom-out { &:before { content: \"\\e016\"; } }\n.glyphicon-off { &:before { content: \"\\e017\"; } }\n.glyphicon-signal { &:before { content: \"\\e018\"; } }\n.glyphicon-cog { &:before { content: \"\\e019\"; } }\n.glyphicon-trash { &:before { content: \"\\e020\"; } }\n.glyphicon-home { &:before { content: \"\\e021\"; } }\n.glyphicon-file { &:before { content: \"\\e022\"; } }\n.glyphicon-time { &:before { content: \"\\e023\"; } }\n.glyphicon-road { &:before { content: \"\\e024\"; } }\n.glyphicon-download-alt { &:before { content: \"\\e025\"; } }\n.glyphicon-download { &:before { content: \"\\e026\"; } }\n.glyphicon-upload { &:before { content: \"\\e027\"; } }\n.glyphicon-inbox { &:before { content: \"\\e028\"; } }\n.glyphicon-play-circle { &:before { content: \"\\e029\"; } }\n.glyphicon-repeat { &:before { content: \"\\e030\"; } }\n.glyphicon-refresh { &:before { content: \"\\e031\"; } }\n.glyphicon-list-alt { &:before { content: \"\\e032\"; } }\n.glyphicon-lock { &:before { content: \"\\e033\"; } }\n.glyphicon-flag { &:before { content: \"\\e034\"; } }\n.glyphicon-headphones { &:before { content: \"\\e035\"; } }\n.glyphicon-volume-off { &:before { content: \"\\e036\"; } }\n.glyphicon-volume-down { &:before { content: \"\\e037\"; } }\n.glyphicon-volume-up { &:before { content: \"\\e038\"; } }\n.glyphicon-qrcode { &:before { content: \"\\e039\"; } }\n.glyphicon-barcode { &:before { content: \"\\e040\"; } }\n.glyphicon-tag { &:before { content: \"\\e041\"; } }\n.glyphicon-tags { &:before { content: \"\\e042\"; } }\n.glyphicon-book { &:before { content: \"\\e043\"; } }\n.glyphicon-bookmark { &:before { content: \"\\e044\"; } }\n.glyphicon-print { &:before { content: \"\\e045\"; } }\n.glyphicon-camera { &:before { content: \"\\e046\"; } }\n.glyphicon-font { &:before { content: \"\\e047\"; } }\n.glyphicon-bold { &:before { content: \"\\e048\"; } }\n.glyphicon-italic { &:before { content: \"\\e049\"; } }\n.glyphicon-text-height { &:before { content: \"\\e050\"; } }\n.glyphicon-text-width { &:before { content: \"\\e051\"; } }\n.glyphicon-align-left { &:before { content: \"\\e052\"; } }\n.glyphicon-align-center { &:before { content: \"\\e053\"; } }\n.glyphicon-align-right { &:before { content: \"\\e054\"; } }\n.glyphicon-align-justify { &:before { content: \"\\e055\"; } }\n.glyphicon-list { &:before { content: \"\\e056\"; } }\n.glyphicon-indent-left { &:before { content: \"\\e057\"; } }\n.glyphicon-indent-right { &:before { content: \"\\e058\"; } }\n.glyphicon-facetime-video { &:before { content: \"\\e059\"; } }\n.glyphicon-picture { &:before { content: \"\\e060\"; } }\n.glyphicon-map-marker { &:before { content: \"\\e062\"; } }\n.glyphicon-adjust { &:before { content: \"\\e063\"; } }\n.glyphicon-tint { &:before { content: \"\\e064\"; } }\n.glyphicon-edit { &:before { content: \"\\e065\"; } }\n.glyphicon-share { &:before { content: \"\\e066\"; } }\n.glyphicon-check { &:before { content: \"\\e067\"; } }\n.glyphicon-move { &:before { content: \"\\e068\"; } }\n.glyphicon-step-backward { &:before { content: \"\\e069\"; } }\n.glyphicon-fast-backward { &:before { content: \"\\e070\"; } }\n.glyphicon-backward { &:before { content: \"\\e071\"; } }\n.glyphicon-play { &:before { content: \"\\e072\"; } }\n.glyphicon-pause { &:before { content: \"\\e073\"; } }\n.glyphicon-stop { &:before { content: \"\\e074\"; } }\n.glyphicon-forward { &:before { content: \"\\e075\"; } }\n.glyphicon-fast-forward { &:before { content: \"\\e076\"; } }\n.glyphicon-step-forward { &:before { content: \"\\e077\"; } }\n.glyphicon-eject { &:before { content: \"\\e078\"; } }\n.glyphicon-chevron-left { &:before { content: \"\\e079\"; } }\n.glyphicon-chevron-right { &:before { content: \"\\e080\"; } }\n.glyphicon-plus-sign { &:before { content: \"\\e081\"; } }\n.glyphicon-minus-sign { &:before { content: \"\\e082\"; } }\n.glyphicon-remove-sign { &:before { content: \"\\e083\"; } }\n.glyphicon-ok-sign { &:before { content: \"\\e084\"; } }\n.glyphicon-question-sign { &:before { content: \"\\e085\"; } }\n.glyphicon-info-sign { &:before { content: \"\\e086\"; } }\n.glyphicon-screenshot { &:before { content: \"\\e087\"; } }\n.glyphicon-remove-circle { &:before { content: \"\\e088\"; } }\n.glyphicon-ok-circle { &:before { content: \"\\e089\"; } }\n.glyphicon-ban-circle { &:before { content: \"\\e090\"; } }\n.glyphicon-arrow-left { &:before { content: \"\\e091\"; } }\n.glyphicon-arrow-right { &:before { content: \"\\e092\"; } }\n.glyphicon-arrow-up { &:before { content: \"\\e093\"; } }\n.glyphicon-arrow-down { &:before { content: \"\\e094\"; } }\n.glyphicon-share-alt { &:before { content: \"\\e095\"; } }\n.glyphicon-resize-full { &:before { content: \"\\e096\"; } }\n.glyphicon-resize-small { &:before { content: \"\\e097\"; } }\n.glyphicon-exclamation-sign { &:before { content: \"\\e101\"; } }\n.glyphicon-gift { &:before { content: \"\\e102\"; } }\n.glyphicon-leaf { &:before { content: \"\\e103\"; } }\n.glyphicon-fire { &:before { content: \"\\e104\"; } }\n.glyphicon-eye-open { &:before { content: \"\\e105\"; } }\n.glyphicon-eye-close { &:before { content: \"\\e106\"; } }\n.glyphicon-warning-sign { &:before { content: \"\\e107\"; } }\n.glyphicon-plane { &:before { content: \"\\e108\"; } }\n.glyphicon-calendar { &:before { content: \"\\e109\"; } }\n.glyphicon-random { &:before { content: \"\\e110\"; } }\n.glyphicon-comment { &:before { content: \"\\e111\"; } }\n.glyphicon-magnet { &:before { content: \"\\e112\"; } }\n.glyphicon-chevron-up { &:before { content: \"\\e113\"; } }\n.glyphicon-chevron-down { &:before { content: \"\\e114\"; } }\n.glyphicon-retweet { &:before { content: \"\\e115\"; } }\n.glyphicon-shopping-cart { &:before { content: \"\\e116\"; } }\n.glyphicon-folder-close { &:before { content: \"\\e117\"; } }\n.glyphicon-folder-open { &:before { content: \"\\e118\"; } }\n.glyphicon-resize-vertical { &:before { content: \"\\e119\"; } }\n.glyphicon-resize-horizontal { &:before { content: \"\\e120\"; } }\n.glyphicon-hdd { &:before { content: \"\\e121\"; } }\n.glyphicon-bullhorn { &:before { content: \"\\e122\"; } }\n.glyphicon-bell { &:before { content: \"\\e123\"; } }\n.glyphicon-certificate { &:before { content: \"\\e124\"; } }\n.glyphicon-thumbs-up { &:before { content: \"\\e125\"; } }\n.glyphicon-thumbs-down { &:before { content: \"\\e126\"; } }\n.glyphicon-hand-right { &:before { content: \"\\e127\"; } }\n.glyphicon-hand-left { &:before { content: \"\\e128\"; } }\n.glyphicon-hand-up { &:before { content: \"\\e129\"; } }\n.glyphicon-hand-down { &:before { content: \"\\e130\"; } }\n.glyphicon-circle-arrow-right { &:before { content: \"\\e131\"; } }\n.glyphicon-circle-arrow-left { &:before { content: \"\\e132\"; } }\n.glyphicon-circle-arrow-up { &:before { content: \"\\e133\"; } }\n.glyphicon-circle-arrow-down { &:before { content: \"\\e134\"; } }\n.glyphicon-globe { &:before { content: \"\\e135\"; } }\n.glyphicon-wrench { &:before { content: \"\\e136\"; } }\n.glyphicon-tasks { &:before { content: \"\\e137\"; } }\n.glyphicon-filter { &:before { content: \"\\e138\"; } }\n.glyphicon-briefcase { &:before { content: \"\\e139\"; } }\n.glyphicon-fullscreen { &:before { content: \"\\e140\"; } }\n.glyphicon-dashboard { &:before { content: \"\\e141\"; } }\n.glyphicon-paperclip { &:before { content: \"\\e142\"; } }\n.glyphicon-heart-empty { &:before { content: \"\\e143\"; } }\n.glyphicon-link { &:before { content: \"\\e144\"; } }\n.glyphicon-phone { &:before { content: \"\\e145\"; } }\n.glyphicon-pushpin { &:before { content: \"\\e146\"; } }\n.glyphicon-usd { &:before { content: \"\\e148\"; } }\n.glyphicon-gbp { &:before { content: \"\\e149\"; } }\n.glyphicon-sort { &:before { content: \"\\e150\"; } }\n.glyphicon-sort-by-alphabet { &:before { content: \"\\e151\"; } }\n.glyphicon-sort-by-alphabet-alt { &:before { content: \"\\e152\"; } }\n.glyphicon-sort-by-order { &:before { content: \"\\e153\"; } }\n.glyphicon-sort-by-order-alt { &:before { content: \"\\e154\"; } }\n.glyphicon-sort-by-attributes { &:before { content: \"\\e155\"; } }\n.glyphicon-sort-by-attributes-alt { &:before { content: \"\\e156\"; } }\n.glyphicon-unchecked { &:before { content: \"\\e157\"; } }\n.glyphicon-expand { &:before { content: \"\\e158\"; } }\n.glyphicon-collapse-down { &:before { content: \"\\e159\"; } }\n.glyphicon-collapse-up { &:before { content: \"\\e160\"; } }\n.glyphicon-log-in { &:before { content: \"\\e161\"; } }\n.glyphicon-flash { &:before { content: \"\\e162\"; } }\n.glyphicon-log-out { &:before { content: \"\\e163\"; } }\n.glyphicon-new-window { &:before { content: \"\\e164\"; } }\n.glyphicon-record { &:before { content: \"\\e165\"; } }\n.glyphicon-save { &:before { content: \"\\e166\"; } }\n.glyphicon-open { &:before { content: \"\\e167\"; } }\n.glyphicon-saved { &:before { content: \"\\e168\"; } }\n.glyphicon-import { &:before { content: \"\\e169\"; } }\n.glyphicon-export { &:before { content: \"\\e170\"; } }\n.glyphicon-send { &:before { content: \"\\e171\"; } }\n.glyphicon-floppy-disk { &:before { content: \"\\e172\"; } }\n.glyphicon-floppy-saved { &:before { content: \"\\e173\"; } }\n.glyphicon-floppy-remove { &:before { content: \"\\e174\"; } }\n.glyphicon-floppy-save { &:before { content: \"\\e175\"; } }\n.glyphicon-floppy-open { &:before { content: \"\\e176\"; } }\n.glyphicon-credit-card { &:before { content: \"\\e177\"; } }\n.glyphicon-transfer { &:before { content: \"\\e178\"; } }\n.glyphicon-cutlery { &:before { content: \"\\e179\"; } }\n.glyphicon-header { &:before { content: \"\\e180\"; } }\n.glyphicon-compressed { &:before { content: \"\\e181\"; } }\n.glyphicon-earphone { &:before { content: \"\\e182\"; } }\n.glyphicon-phone-alt { &:before { content: \"\\e183\"; } }\n.glyphicon-tower { &:before { content: \"\\e184\"; } }\n.glyphicon-stats { &:before { content: \"\\e185\"; } }\n.glyphicon-sd-video { &:before { content: \"\\e186\"; } }\n.glyphicon-hd-video { &:before { content: \"\\e187\"; } }\n.glyphicon-subtitles { &:before { content: \"\\e188\"; } }\n.glyphicon-sound-stereo { &:before { content: \"\\e189\"; } }\n.glyphicon-sound-dolby { &:before { content: \"\\e190\"; } }\n.glyphicon-sound-5-1 { &:before { content: \"\\e191\"; } }\n.glyphicon-sound-6-1 { &:before { content: \"\\e192\"; } }\n.glyphicon-sound-7-1 { &:before { content: \"\\e193\"; } }\n.glyphicon-copyright-mark { &:before { content: \"\\e194\"; } }\n.glyphicon-registration-mark { &:before { content: \"\\e195\"; } }\n.glyphicon-cloud-download { &:before { content: \"\\e197\"; } }\n.glyphicon-cloud-upload { &:before { content: \"\\e198\"; } }\n.glyphicon-tree-conifer { &:before { content: \"\\e199\"; } }\n.glyphicon-tree-deciduous { &:before { content: \"\\e200\"; } }\n.glyphicon-cd { &:before { content: \"\\e201\"; } }\n.glyphicon-save-file { &:before { content: \"\\e202\"; } }\n.glyphicon-open-file { &:before { content: \"\\e203\"; } }\n.glyphicon-level-up { &:before { content: \"\\e204\"; } }\n.glyphicon-copy { &:before { content: \"\\e205\"; } }\n.glyphicon-paste { &:before { content: \"\\e206\"; } }\n// The following 2 Glyphicons are omitted for the time being because\n// they currently use Unicode codepoints that are outside the\n// Basic Multilingual Plane (BMP). Older buggy versions of WebKit can't handle\n// non-BMP codepoints in CSS string escapes, and thus can't display these two icons.\n// Notably, the bug affects some older versions of the Android Browser.\n// More info: https://github.com/twbs/bootstrap/issues/10106\n// .glyphicon-door { &:before { content: \"\\1f6aa\"; } }\n// .glyphicon-key { &:before { content: \"\\1f511\"; } }\n.glyphicon-alert { &:before { content: \"\\e209\"; } }\n.glyphicon-equalizer { &:before { content: \"\\e210\"; } }\n.glyphicon-king { &:before { content: \"\\e211\"; } }\n.glyphicon-queen { &:before { content: \"\\e212\"; } }\n.glyphicon-pawn { &:before { content: \"\\e213\"; } }\n.glyphicon-bishop { &:before { content: \"\\e214\"; } }\n.glyphicon-knight { &:before { content: \"\\e215\"; } }\n.glyphicon-baby-formula { &:before { content: \"\\e216\"; } }\n.glyphicon-tent { &:before { content: \"\\26fa\"; } }\n.glyphicon-blackboard { &:before { content: \"\\e218\"; } }\n.glyphicon-bed { &:before { content: \"\\e219\"; } }\n.glyphicon-apple { &:before { content: \"\\f8ff\"; } }\n.glyphicon-erase { &:before { content: \"\\e221\"; } }\n.glyphicon-hourglass { &:before { content: \"\\231b\"; } }\n.glyphicon-lamp { &:before { content: \"\\e223\"; } }\n.glyphicon-duplicate { &:before { content: \"\\e224\"; } }\n.glyphicon-piggy-bank { &:before { content: \"\\e225\"; } }\n.glyphicon-scissors { &:before { content: \"\\e226\"; } }\n.glyphicon-bitcoin { &:before { content: \"\\e227\"; } }\n.glyphicon-btc { &:before { content: \"\\e227\"; } }\n.glyphicon-xbt { &:before { content: \"\\e227\"; } }\n.glyphicon-yen { &:before { content: \"\\00a5\"; } }\n.glyphicon-jpy { &:before { content: \"\\00a5\"; } }\n.glyphicon-ruble { &:before { content: \"\\20bd\"; } }\n.glyphicon-rub { &:before { content: \"\\20bd\"; } }\n.glyphicon-scale { &:before { content: \"\\e230\"; } }\n.glyphicon-ice-lolly { &:before { content: \"\\e231\"; } }\n.glyphicon-ice-lolly-tasted { &:before { content: \"\\e232\"; } }\n.glyphicon-education { &:before { content: \"\\e233\"; } }\n.glyphicon-option-horizontal { &:before { content: \"\\e234\"; } }\n.glyphicon-option-vertical { &:before { content: \"\\e235\"; } }\n.glyphicon-menu-hamburger { &:before { content: \"\\e236\"; } }\n.glyphicon-modal-window { &:before { content: \"\\e237\"; } }\n.glyphicon-oil { &:before { content: \"\\e238\"; } }\n.glyphicon-grain { &:before { content: \"\\e239\"; } }\n.glyphicon-sunglasses { &:before { content: \"\\e240\"; } }\n.glyphicon-text-size { &:before { content: \"\\e241\"; } }\n.glyphicon-text-color { &:before { content: \"\\e242\"; } }\n.glyphicon-text-background { &:before { content: \"\\e243\"; } }\n.glyphicon-object-align-top { &:before { content: \"\\e244\"; } }\n.glyphicon-object-align-bottom { &:before { content: \"\\e245\"; } }\n.glyphicon-object-align-horizontal{ &:before { content: \"\\e246\"; } }\n.glyphicon-object-align-left { &:before { content: \"\\e247\"; } }\n.glyphicon-object-align-vertical { &:before { content: \"\\e248\"; } }\n.glyphicon-object-align-right { &:before { content: \"\\e249\"; } }\n.glyphicon-triangle-right { &:before { content: \"\\e250\"; } }\n.glyphicon-triangle-left { &:before { content: \"\\e251\"; } }\n.glyphicon-triangle-bottom { &:before { content: \"\\e252\"; } }\n.glyphicon-triangle-top { &:before { content: \"\\e253\"; } }\n.glyphicon-console { &:before { content: \"\\e254\"; } }\n.glyphicon-superscript { &:before { content: \"\\e255\"; } }\n.glyphicon-subscript { &:before { content: \"\\e256\"; } }\n.glyphicon-menu-left { &:before { content: \"\\e257\"; } }\n.glyphicon-menu-right { &:before { content: \"\\e258\"; } }\n.glyphicon-menu-down { &:before { content: \"\\e259\"; } }\n.glyphicon-menu-up { &:before { content: \"\\e260\"; } }\n","//\n// Scaffolding\n// --------------------------------------------------\n\n\n// Reset the box-sizing\n//\n// Heads up! This reset may cause conflicts with some third-party widgets.\n// For recommendations on resolving such conflicts, see\n// http://getbootstrap.com/getting-started/#third-box-sizing\n* {\n .box-sizing(border-box);\n}\n*:before,\n*:after {\n .box-sizing(border-box);\n}\n\n\n// Body reset\n\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0,0,0,0);\n}\n\nbody {\n font-family: @font-family-base;\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @text-color;\n background-color: @body-bg;\n}\n\n// Reset fonts for relevant elements\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\n\n// Links\n\na {\n color: @link-color;\n text-decoration: none;\n\n &:hover,\n &:focus {\n color: @link-hover-color;\n text-decoration: @link-hover-decoration;\n }\n\n &:focus {\n .tab-focus();\n }\n}\n\n\n// Figures\n//\n// We reset this here because previously Normalize had no `figure` margins. This\n// ensures we don't break anyone's use of the element.\n\nfigure {\n margin: 0;\n}\n\n\n// Images\n\nimg {\n vertical-align: middle;\n}\n\n// Responsive images (ensure images don't scale beyond their parents)\n.img-responsive {\n .img-responsive();\n}\n\n// Rounded corners\n.img-rounded {\n border-radius: @border-radius-large;\n}\n\n// Image thumbnails\n//\n// Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`.\n.img-thumbnail {\n padding: @thumbnail-padding;\n line-height: @line-height-base;\n background-color: @thumbnail-bg;\n border: 1px solid @thumbnail-border;\n border-radius: @thumbnail-border-radius;\n .transition(all .2s ease-in-out);\n\n // Keep them at most 100% wide\n .img-responsive(inline-block);\n}\n\n// Perfect circle\n.img-circle {\n border-radius: 50%; // set radius in percents\n}\n\n\n// Horizontal rules\n\nhr {\n margin-top: @line-height-computed;\n margin-bottom: @line-height-computed;\n border: 0;\n border-top: 1px solid @hr-border;\n}\n\n\n// Only display content to screen readers\n//\n// See: http://a11yproject.com/posts/how-to-hide-content/\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0,0,0,0);\n border: 0;\n}\n\n// Use in conjunction with .sr-only to only display content when it's focused.\n// Useful for \"Skip to main content\" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n// Credit: HTML5 Boilerplate\n\n.sr-only-focusable {\n &:active,\n &:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n }\n}\n\n\n// iOS \"clickable elements\" fix for role=\"button\"\n//\n// Fixes \"clickability\" issue (and more generally, the firing of events such as focus as well)\n// for traditionally non-focusable elements with role=\"button\"\n// see https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n\n[role=\"button\"] {\n cursor: pointer;\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They will be removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility){\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: @color;\n opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n }\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n","// WebKit-style focus\n\n.tab-focus() {\n // Default\n outline: thin dotted;\n // WebKit\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n","// Image Mixins\n// - Responsive image\n// - Retina image\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n.img-responsive(@display: block) {\n display: @display;\n max-width: 100%; // Part 1: Set a maximum relative to the parent\n height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching\n}\n\n\n// Retina image\n//\n// Short retina mixin for setting background-image and -size. Note that the\n// spelling of `min--moz-device-pixel-ratio` is intentional.\n.img-retina(@file-1x; @file-2x; @width-1x; @height-1x) {\n background-image: url(\"@{file-1x}\");\n\n @media\n only screen and (-webkit-min-device-pixel-ratio: 2),\n only screen and ( min--moz-device-pixel-ratio: 2),\n only screen and ( -o-min-device-pixel-ratio: 2/1),\n only screen and ( min-device-pixel-ratio: 2),\n only screen and ( min-resolution: 192dpi),\n only screen and ( min-resolution: 2dppx) {\n background-image: url(\"@{file-2x}\");\n background-size: @width-1x @height-1x;\n }\n}\n","//\n// Typography\n// --------------------------------------------------\n\n\n// Headings\n// -------------------------\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n font-family: @headings-font-family;\n font-weight: @headings-font-weight;\n line-height: @headings-line-height;\n color: @headings-color;\n\n small,\n .small {\n font-weight: normal;\n line-height: 1;\n color: @headings-small-color;\n }\n}\n\nh1, .h1,\nh2, .h2,\nh3, .h3 {\n margin-top: @line-height-computed;\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 65%;\n }\n}\nh4, .h4,\nh5, .h5,\nh6, .h6 {\n margin-top: (@line-height-computed / 2);\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 75%;\n }\n}\n\nh1, .h1 { font-size: @font-size-h1; }\nh2, .h2 { font-size: @font-size-h2; }\nh3, .h3 { font-size: @font-size-h3; }\nh4, .h4 { font-size: @font-size-h4; }\nh5, .h5 { font-size: @font-size-h5; }\nh6, .h6 { font-size: @font-size-h6; }\n\n\n// Body text\n// -------------------------\n\np {\n margin: 0 0 (@line-height-computed / 2);\n}\n\n.lead {\n margin-bottom: @line-height-computed;\n font-size: floor((@font-size-base * 1.15));\n font-weight: 300;\n line-height: 1.4;\n\n @media (min-width: @screen-sm-min) {\n font-size: (@font-size-base * 1.5);\n }\n}\n\n\n// Emphasis & misc\n// -------------------------\n\n// Ex: (12px small font / 14px base font) * 100% = about 85%\nsmall,\n.small {\n font-size: floor((100% * @font-size-small / @font-size-base));\n}\n\nmark,\n.mark {\n background-color: @state-warning-bg;\n padding: .2em;\n}\n\n// Alignment\n.text-left { text-align: left; }\n.text-right { text-align: right; }\n.text-center { text-align: center; }\n.text-justify { text-align: justify; }\n.text-nowrap { white-space: nowrap; }\n\n// Transformation\n.text-lowercase { text-transform: lowercase; }\n.text-uppercase { text-transform: uppercase; }\n.text-capitalize { text-transform: capitalize; }\n\n// Contextual colors\n.text-muted {\n color: @text-muted;\n}\n.text-primary {\n .text-emphasis-variant(@brand-primary);\n}\n.text-success {\n .text-emphasis-variant(@state-success-text);\n}\n.text-info {\n .text-emphasis-variant(@state-info-text);\n}\n.text-warning {\n .text-emphasis-variant(@state-warning-text);\n}\n.text-danger {\n .text-emphasis-variant(@state-danger-text);\n}\n\n// Contextual backgrounds\n// For now we'll leave these alongside the text classes until v4 when we can\n// safely shift things around (per SemVer rules).\n.bg-primary {\n // Given the contrast here, this is the only class to have its color inverted\n // automatically.\n color: #fff;\n .bg-variant(@brand-primary);\n}\n.bg-success {\n .bg-variant(@state-success-bg);\n}\n.bg-info {\n .bg-variant(@state-info-bg);\n}\n.bg-warning {\n .bg-variant(@state-warning-bg);\n}\n.bg-danger {\n .bg-variant(@state-danger-bg);\n}\n\n\n// Page header\n// -------------------------\n\n.page-header {\n padding-bottom: ((@line-height-computed / 2) - 1);\n margin: (@line-height-computed * 2) 0 @line-height-computed;\n border-bottom: 1px solid @page-header-border-color;\n}\n\n\n// Lists\n// -------------------------\n\n// Unordered and Ordered lists\nul,\nol {\n margin-top: 0;\n margin-bottom: (@line-height-computed / 2);\n ul,\n ol {\n margin-bottom: 0;\n }\n}\n\n// List options\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n\n// Inline turns list items into inline-block\n.list-inline {\n .list-unstyled();\n margin-left: -5px;\n\n > li {\n display: inline-block;\n padding-left: 5px;\n padding-right: 5px;\n }\n}\n\n// Description Lists\ndl {\n margin-top: 0; // Remove browser default\n margin-bottom: @line-height-computed;\n}\ndt,\ndd {\n line-height: @line-height-base;\n}\ndt {\n font-weight: bold;\n}\ndd {\n margin-left: 0; // Undo browser default\n}\n\n// Horizontal description lists\n//\n// Defaults to being stacked without any of the below styles applied, until the\n// grid breakpoint is reached (default of ~768px).\n\n.dl-horizontal {\n dd {\n &:extend(.clearfix all); // Clear the floated `dt` if an empty `dd` is present\n }\n\n @media (min-width: @grid-float-breakpoint) {\n dt {\n float: left;\n width: (@dl-horizontal-offset - 20);\n clear: left;\n text-align: right;\n .text-overflow();\n }\n dd {\n margin-left: @dl-horizontal-offset;\n }\n }\n}\n\n\n// Misc\n// -------------------------\n\n// Abbreviations and acronyms\nabbr[title],\n// Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257\nabbr[data-original-title] {\n cursor: help;\n border-bottom: 1px dotted @abbr-border-color;\n}\n.initialism {\n font-size: 90%;\n .text-uppercase();\n}\n\n// Blockquotes\nblockquote {\n padding: (@line-height-computed / 2) @line-height-computed;\n margin: 0 0 @line-height-computed;\n font-size: @blockquote-font-size;\n border-left: 5px solid @blockquote-border-color;\n\n p,\n ul,\n ol {\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n // Note: Deprecated small and .small as of v3.1.0\n // Context: https://github.com/twbs/bootstrap/issues/11660\n footer,\n small,\n .small {\n display: block;\n font-size: 80%; // back to default font-size\n line-height: @line-height-base;\n color: @blockquote-small-color;\n\n &:before {\n content: '\\2014 \\00A0'; // em dash, nbsp\n }\n }\n}\n\n// Opposite alignment of blockquote\n//\n// Heads up: `blockquote.pull-right` has been deprecated as of v3.1.0.\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n border-right: 5px solid @blockquote-border-color;\n border-left: 0;\n text-align: right;\n\n // Account for citation\n footer,\n small,\n .small {\n &:before { content: ''; }\n &:after {\n content: '\\00A0 \\2014'; // nbsp, em dash\n }\n }\n}\n\n// Addresses\naddress {\n margin-bottom: @line-height-computed;\n font-style: normal;\n line-height: @line-height-base;\n}\n","// Typography\n\n.text-emphasis-variant(@color) {\n color: @color;\n a&:hover,\n a&:focus {\n color: darken(@color, 10%);\n }\n}\n","// Contextual backgrounds\n\n.bg-variant(@color) {\n background-color: @color;\n a&:hover,\n a&:focus {\n background-color: darken(@color, 10%);\n }\n}\n","// Text overflow\n// Requires inline-block or block for proper styling\n\n.text-overflow() {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n","//\n// Code (inline and block)\n// --------------------------------------------------\n\n\n// Inline and block code styles\ncode,\nkbd,\npre,\nsamp {\n font-family: @font-family-monospace;\n}\n\n// Inline code\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: @code-color;\n background-color: @code-bg;\n border-radius: @border-radius-base;\n}\n\n// User input typically entered via keyboard\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: @kbd-color;\n background-color: @kbd-bg;\n border-radius: @border-radius-small;\n box-shadow: inset 0 -1px 0 rgba(0,0,0,.25);\n\n kbd {\n padding: 0;\n font-size: 100%;\n font-weight: bold;\n box-shadow: none;\n }\n}\n\n// Blocks of code\npre {\n display: block;\n padding: ((@line-height-computed - 1) / 2);\n margin: 0 0 (@line-height-computed / 2);\n font-size: (@font-size-base - 1); // 14px to 13px\n line-height: @line-height-base;\n word-break: break-all;\n word-wrap: break-word;\n color: @pre-color;\n background-color: @pre-bg;\n border: 1px solid @pre-border-color;\n border-radius: @border-radius-base;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n max-height: @pre-scrollable-max-height;\n overflow-y: scroll;\n}\n","//\n// Grid system\n// --------------------------------------------------\n\n\n// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n.container {\n .container-fixed();\n\n @media (min-width: @screen-sm-min) {\n width: @container-sm;\n }\n @media (min-width: @screen-md-min) {\n width: @container-md;\n }\n @media (min-width: @screen-lg-min) {\n width: @container-lg;\n }\n}\n\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but without any defined\n// width for fluid, full width layouts.\n\n.container-fluid {\n .container-fixed();\n}\n\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n.row {\n .make-row();\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n.make-grid-columns();\n\n\n// Extra small grid\n//\n// Columns, offsets, pushes, and pulls for extra small devices like\n// smartphones.\n\n.make-grid(xs);\n\n\n// Small grid\n//\n// Columns, offsets, pushes, and pulls for the small device range, from phones\n// to tablets.\n\n@media (min-width: @screen-sm-min) {\n .make-grid(sm);\n}\n\n\n// Medium grid\n//\n// Columns, offsets, pushes, and pulls for the desktop device range.\n\n@media (min-width: @screen-md-min) {\n .make-grid(md);\n}\n\n\n// Large grid\n//\n// Columns, offsets, pushes, and pulls for the large desktop device range.\n\n@media (min-width: @screen-lg-min) {\n .make-grid(lg);\n}\n","// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n// Centered container element\n.container-fixed(@gutter: @grid-gutter-width) {\n margin-right: auto;\n margin-left: auto;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n &:extend(.clearfix all);\n}\n\n// Creates a wrapper for a series of columns\n.make-row(@gutter: @grid-gutter-width) {\n margin-left: ceil((@gutter / -2));\n margin-right: floor((@gutter / -2));\n &:extend(.clearfix all);\n}\n\n// Generate the extra small columns\n.make-xs-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n float: left;\n width: percentage((@columns / @grid-columns));\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n}\n.make-xs-column-offset(@columns) {\n margin-left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-push(@columns) {\n left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-pull(@columns) {\n right: percentage((@columns / @grid-columns));\n}\n\n// Generate the small columns\n.make-sm-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-sm-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-offset(@columns) {\n @media (min-width: @screen-sm-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-push(@columns) {\n @media (min-width: @screen-sm-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-pull(@columns) {\n @media (min-width: @screen-sm-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n// Generate the medium columns\n.make-md-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-md-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-offset(@columns) {\n @media (min-width: @screen-md-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-push(@columns) {\n @media (min-width: @screen-md-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-pull(@columns) {\n @media (min-width: @screen-md-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n// Generate the large columns\n.make-lg-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-lg-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-offset(@columns) {\n @media (min-width: @screen-lg-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-push(@columns) {\n @media (min-width: @screen-lg-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-pull(@columns) {\n @media (min-width: @screen-lg-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n","// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `@grid-columns`.\n\n.make-grid-columns() {\n // Common styles for all sizes of grid columns, widths 1-12\n .col(@index) { // initial\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general; \"=<\" isn't a typo\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n position: relative;\n // Prevent columns from collapsing when empty\n min-height: 1px;\n // Inner gutter via padding\n padding-left: ceil((@grid-gutter-width / 2));\n padding-right: floor((@grid-gutter-width / 2));\n }\n }\n .col(1); // kickstart it\n}\n\n.float-grid-columns(@class) {\n .col(@index) { // initial\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n float: left;\n }\n }\n .col(1); // kickstart it\n}\n\n.calc-grid-column(@index, @class, @type) when (@type = width) and (@index > 0) {\n .col-@{class}-@{index} {\n width: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index > 0) {\n .col-@{class}-push-@{index} {\n left: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index = 0) {\n .col-@{class}-push-0 {\n left: auto;\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index > 0) {\n .col-@{class}-pull-@{index} {\n right: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index = 0) {\n .col-@{class}-pull-0 {\n right: auto;\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = offset) {\n .col-@{class}-offset-@{index} {\n margin-left: percentage((@index / @grid-columns));\n }\n}\n\n// Basic looping in LESS\n.loop-grid-columns(@index, @class, @type) when (@index >= 0) {\n .calc-grid-column(@index, @class, @type);\n // next iteration\n .loop-grid-columns((@index - 1), @class, @type);\n}\n\n// Create grid for specific class\n.make-grid(@class) {\n .float-grid-columns(@class);\n .loop-grid-columns(@grid-columns, @class, width);\n .loop-grid-columns(@grid-columns, @class, pull);\n .loop-grid-columns(@grid-columns, @class, push);\n .loop-grid-columns(@grid-columns, @class, offset);\n}\n","//\n// Tables\n// --------------------------------------------------\n\n\ntable {\n background-color: @table-bg;\n}\ncaption {\n padding-top: @table-cell-padding;\n padding-bottom: @table-cell-padding;\n color: @text-muted;\n text-align: left;\n}\nth {\n text-align: left;\n}\n\n\n// Baseline styles\n\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: @line-height-computed;\n // Cells\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-cell-padding;\n line-height: @line-height-base;\n vertical-align: top;\n border-top: 1px solid @table-border-color;\n }\n }\n }\n // Bottom align for column headings\n > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid @table-border-color;\n }\n // Remove top border from thead by default\n > caption + thead,\n > colgroup + thead,\n > thead:first-child {\n > tr:first-child {\n > th,\n > td {\n border-top: 0;\n }\n }\n }\n // Account for multiple tbody instances\n > tbody + tbody {\n border-top: 2px solid @table-border-color;\n }\n\n // Nesting\n .table {\n background-color: @body-bg;\n }\n}\n\n\n// Condensed table w/ half padding\n\n.table-condensed {\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-condensed-cell-padding;\n }\n }\n }\n}\n\n\n// Bordered version\n//\n// Add borders all around the table and between all the columns.\n\n.table-bordered {\n border: 1px solid @table-border-color;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n border: 1px solid @table-border-color;\n }\n }\n }\n > thead > tr {\n > th,\n > td {\n border-bottom-width: 2px;\n }\n }\n}\n\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n > tbody > tr:nth-of-type(odd) {\n background-color: @table-bg-accent;\n }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n > tbody > tr:hover {\n background-color: @table-bg-hover;\n }\n}\n\n\n// Table cell sizing\n//\n// Reset default table behavior\n\ntable col[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n float: none;\n display: table-column;\n}\ntable {\n td,\n th {\n &[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n float: none;\n display: table-cell;\n }\n }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested tables.\n\n// Generate the contextual variants\n.table-row-variant(active; @table-bg-active);\n.table-row-variant(success; @state-success-bg);\n.table-row-variant(info; @state-info-bg);\n.table-row-variant(warning; @state-warning-bg);\n.table-row-variant(danger; @state-danger-bg);\n\n\n// Responsive tables\n//\n// Wrap your tables in `.table-responsive` and we'll make them mobile friendly\n// by enabling horizontal scrolling. Only applies <768px. Everything above that\n// will display normally.\n\n.table-responsive {\n overflow-x: auto;\n min-height: 0.01%; // Workaround for IE9 bug (see https://github.com/twbs/bootstrap/issues/14837)\n\n @media screen and (max-width: @screen-xs-max) {\n width: 100%;\n margin-bottom: (@line-height-computed * 0.75);\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid @table-border-color;\n\n // Tighten up spacing\n > .table {\n margin-bottom: 0;\n\n // Ensure the content doesn't wrap\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n white-space: nowrap;\n }\n }\n }\n }\n\n // Special overrides for the bordered tables\n > .table-bordered {\n border: 0;\n\n // Nuke the appropriate borders so that the parent can handle them\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n }\n }\n\n // Only nuke the last row's bottom-border in `tbody` and `tfoot` since\n // chances are there will be only one `tr` in a `thead` and that would\n // remove the border altogether.\n > tbody,\n > tfoot {\n > tr:last-child {\n > th,\n > td {\n border-bottom: 0;\n }\n }\n }\n\n }\n }\n}\n","// Tables\n\n.table-row-variant(@state; @background) {\n // Exact selectors below required to override `.table-striped` and prevent\n // inheritance to nested tables.\n .table > thead > tr,\n .table > tbody > tr,\n .table > tfoot > tr {\n > td.@{state},\n > th.@{state},\n &.@{state} > td,\n &.@{state} > th {\n background-color: @background;\n }\n }\n\n // Hover states for `.table-hover`\n // Note: this is not available for cells or rows within `thead` or `tfoot`.\n .table-hover > tbody > tr {\n > td.@{state}:hover,\n > th.@{state}:hover,\n &.@{state}:hover > td,\n &:hover > .@{state},\n &.@{state}:hover > th {\n background-color: darken(@background, 5%);\n }\n }\n}\n","//\n// Forms\n// --------------------------------------------------\n\n\n// Normalize non-controls\n//\n// Restyle and baseline non-control form elements.\n\nfieldset {\n padding: 0;\n margin: 0;\n border: 0;\n // Chrome and Firefox set a `min-width: min-content;` on fieldsets,\n // so we reset that to ensure it behaves more like a standard block element.\n // See https://github.com/twbs/bootstrap/issues/12359.\n min-width: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: @line-height-computed;\n font-size: (@font-size-base * 1.5);\n line-height: inherit;\n color: @legend-color;\n border: 0;\n border-bottom: 1px solid @legend-border-color;\n}\n\nlabel {\n display: inline-block;\n max-width: 100%; // Force IE8 to wrap long content (see https://github.com/twbs/bootstrap/issues/13141)\n margin-bottom: 5px;\n font-weight: bold;\n}\n\n\n// Normalize form controls\n//\n// While most of our form styles require extra classes, some basic normalization\n// is required to ensure optimum display with or without those classes to better\n// address browser inconsistencies.\n\n// Override content-box in Normalize (* isn't specific enough)\ninput[type=\"search\"] {\n .box-sizing(border-box);\n}\n\n// Position radios and checkboxes better\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9; // IE8-9\n line-height: normal;\n}\n\ninput[type=\"file\"] {\n display: block;\n}\n\n// Make range inputs behave like textual form controls\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\n\n// Make multiple select elements height not fixed\nselect[multiple],\nselect[size] {\n height: auto;\n}\n\n// Focus for file, radio, and checkbox\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n .tab-focus();\n}\n\n// Adjust output element\noutput {\n display: block;\n padding-top: (@padding-base-vertical + 1);\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @input-color;\n}\n\n\n// Common form controls\n//\n// Shared size and type resets for form controls. Apply `.form-control` to any\n// of the following form controls:\n//\n// select\n// textarea\n// input[type=\"text\"]\n// input[type=\"password\"]\n// input[type=\"datetime\"]\n// input[type=\"datetime-local\"]\n// input[type=\"date\"]\n// input[type=\"month\"]\n// input[type=\"time\"]\n// input[type=\"week\"]\n// input[type=\"number\"]\n// input[type=\"email\"]\n// input[type=\"url\"]\n// input[type=\"search\"]\n// input[type=\"tel\"]\n// input[type=\"color\"]\n\n.form-control {\n display: block;\n width: 100%;\n height: @input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border)\n padding: @padding-base-vertical @padding-base-horizontal;\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @input-color;\n background-color: @input-bg;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid @input-border;\n border-radius: @input-border-radius; // Note: This has no effect on <select>s in some browsers, due to the limited stylability of <select>s in CSS.\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.075));\n .transition(~\"border-color ease-in-out .15s, box-shadow ease-in-out .15s\");\n\n // Customize the `:focus` state to imitate native WebKit styles.\n .form-control-focus();\n\n // Placeholder\n .placeholder();\n\n // Disabled and read-only inputs\n //\n // HTML5 says that controls under a fieldset > legend:first-child won't be\n // disabled if the fieldset is disabled. Due to implementation difficulty, we\n // don't honor that edge case; we style them as disabled anyway.\n &[disabled],\n &[readonly],\n fieldset[disabled] & {\n background-color: @input-bg-disabled;\n opacity: 1; // iOS fix for unreadable disabled content; see https://github.com/twbs/bootstrap/issues/11655\n }\n\n &[disabled],\n fieldset[disabled] & {\n cursor: @cursor-disabled;\n }\n\n // Reset height for `textarea`s\n textarea& {\n height: auto;\n }\n}\n\n\n// Search inputs in iOS\n//\n// This overrides the extra rounded corners on search inputs in iOS so that our\n// `.form-control` class can properly style them. Note that this cannot simply\n// be added to `.form-control` as it's not specific enough. For details, see\n// https://github.com/twbs/bootstrap/issues/11586.\n\ninput[type=\"search\"] {\n -webkit-appearance: none;\n}\n\n\n// Special styles for iOS temporal inputs\n//\n// In Mobile Safari, setting `display: block` on temporal inputs causes the\n// text within the input to become vertically misaligned. As a workaround, we\n// set a pixel line-height that matches the given height of the input, but only\n// for Safari. See https://bugs.webkit.org/show_bug.cgi?id=139848\n//\n// Note that as of 8.3, iOS doesn't support `datetime` or `week`.\n\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n input[type=\"date\"],\n input[type=\"time\"],\n input[type=\"datetime-local\"],\n input[type=\"month\"] {\n &.form-control {\n line-height: @input-height-base;\n }\n\n &.input-sm,\n .input-group-sm & {\n line-height: @input-height-small;\n }\n\n &.input-lg,\n .input-group-lg & {\n line-height: @input-height-large;\n }\n }\n}\n\n\n// Form groups\n//\n// Designed to help with the organization and spacing of vertical forms. For\n// horizontal forms, use the predefined grid classes.\n\n.form-group {\n margin-bottom: @form-group-margin-bottom;\n}\n\n\n// Checkboxes and radios\n//\n// Indent the labels to position radios/checkboxes as hanging controls.\n\n.radio,\n.checkbox {\n position: relative;\n display: block;\n margin-top: 10px;\n margin-bottom: 10px;\n\n label {\n min-height: @line-height-computed; // Ensure the input doesn't jump when there is no text\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: normal;\n cursor: pointer;\n }\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n position: absolute;\n margin-left: -20px;\n margin-top: 4px \\9;\n}\n\n.radio + .radio,\n.checkbox + .checkbox {\n margin-top: -5px; // Move up sibling radios or checkboxes for tighter spacing\n}\n\n// Radios and checkboxes on same line\n.radio-inline,\n.checkbox-inline {\n position: relative;\n display: inline-block;\n padding-left: 20px;\n margin-bottom: 0;\n vertical-align: middle;\n font-weight: normal;\n cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n margin-top: 0;\n margin-left: 10px; // space out consecutive inline controls\n}\n\n// Apply same disabled cursor tweak as for inputs\n// Some special care is needed because <label>s don't inherit their parent's `cursor`.\n//\n// Note: Neither radios nor checkboxes can be readonly.\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n &[disabled],\n &.disabled,\n fieldset[disabled] & {\n cursor: @cursor-disabled;\n }\n}\n// These classes are used directly on <label>s\n.radio-inline,\n.checkbox-inline {\n &.disabled,\n fieldset[disabled] & {\n cursor: @cursor-disabled;\n }\n}\n// These classes are used on elements with <label> descendants\n.radio,\n.checkbox {\n &.disabled,\n fieldset[disabled] & {\n label {\n cursor: @cursor-disabled;\n }\n }\n}\n\n\n// Static form control text\n//\n// Apply class to a `p` element to make any string of text align with labels in\n// a horizontal form layout.\n\n.form-control-static {\n // Size it appropriately next to real form controls\n padding-top: (@padding-base-vertical + 1);\n padding-bottom: (@padding-base-vertical + 1);\n // Remove default margin from `p`\n margin-bottom: 0;\n min-height: (@line-height-computed + @font-size-base);\n\n &.input-lg,\n &.input-sm {\n padding-left: 0;\n padding-right: 0;\n }\n}\n\n\n// Form control sizing\n//\n// Build on `.form-control` with modifier classes to decrease or increase the\n// height and font-size of form controls.\n//\n// The `.form-group-* form-control` variations are sadly duplicated to avoid the\n// issue documented in https://github.com/twbs/bootstrap/issues/15074.\n\n.input-sm {\n .input-size(@input-height-small; @padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @input-border-radius-small);\n}\n.form-group-sm {\n .form-control {\n height: @input-height-small;\n padding: @padding-small-vertical @padding-small-horizontal;\n font-size: @font-size-small;\n line-height: @line-height-small;\n border-radius: @input-border-radius-small;\n }\n select.form-control {\n height: @input-height-small;\n line-height: @input-height-small;\n }\n textarea.form-control,\n select[multiple].form-control {\n height: auto;\n }\n .form-control-static {\n height: @input-height-small;\n min-height: (@line-height-computed + @font-size-small);\n padding: (@padding-small-vertical + 1) @padding-small-horizontal;\n font-size: @font-size-small;\n line-height: @line-height-small;\n }\n}\n\n.input-lg {\n .input-size(@input-height-large; @padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @input-border-radius-large);\n}\n.form-group-lg {\n .form-control {\n height: @input-height-large;\n padding: @padding-large-vertical @padding-large-horizontal;\n font-size: @font-size-large;\n line-height: @line-height-large;\n border-radius: @input-border-radius-large;\n }\n select.form-control {\n height: @input-height-large;\n line-height: @input-height-large;\n }\n textarea.form-control,\n select[multiple].form-control {\n height: auto;\n }\n .form-control-static {\n height: @input-height-large;\n min-height: (@line-height-computed + @font-size-large);\n padding: (@padding-large-vertical + 1) @padding-large-horizontal;\n font-size: @font-size-large;\n line-height: @line-height-large;\n }\n}\n\n\n// Form control feedback states\n//\n// Apply contextual and semantic states to individual form controls.\n\n.has-feedback {\n // Enable absolute positioning\n position: relative;\n\n // Ensure icons don't overlap text\n .form-control {\n padding-right: (@input-height-base * 1.25);\n }\n}\n// Feedback icon (requires .glyphicon classes)\n.form-control-feedback {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2; // Ensure icon is above input groups\n display: block;\n width: @input-height-base;\n height: @input-height-base;\n line-height: @input-height-base;\n text-align: center;\n pointer-events: none;\n}\n.input-lg + .form-control-feedback,\n.input-group-lg + .form-control-feedback,\n.form-group-lg .form-control + .form-control-feedback {\n width: @input-height-large;\n height: @input-height-large;\n line-height: @input-height-large;\n}\n.input-sm + .form-control-feedback,\n.input-group-sm + .form-control-feedback,\n.form-group-sm .form-control + .form-control-feedback {\n width: @input-height-small;\n height: @input-height-small;\n line-height: @input-height-small;\n}\n\n// Feedback states\n.has-success {\n .form-control-validation(@state-success-text; @state-success-text; @state-success-bg);\n}\n.has-warning {\n .form-control-validation(@state-warning-text; @state-warning-text; @state-warning-bg);\n}\n.has-error {\n .form-control-validation(@state-danger-text; @state-danger-text; @state-danger-bg);\n}\n\n// Reposition feedback icon if input has visible label above\n.has-feedback label {\n\n & ~ .form-control-feedback {\n top: (@line-height-computed + 5); // Height of the `label` and its margin\n }\n &.sr-only ~ .form-control-feedback {\n top: 0;\n }\n}\n\n\n// Help text\n//\n// Apply to any element you wish to create light text for placement immediately\n// below a form control. Use for general help, formatting, or instructional text.\n\n.help-block {\n display: block; // account for any element using help-block\n margin-top: 5px;\n margin-bottom: 10px;\n color: lighten(@text-color, 25%); // lighten the text some for contrast\n}\n\n\n// Inline forms\n//\n// Make forms appear inline(-block) by adding the `.form-inline` class. Inline\n// forms begin stacked on extra small (mobile) devices and then go inline when\n// viewports reach <768px.\n//\n// Requires wrapping inputs and labels with `.form-group` for proper display of\n// default HTML form controls and our custom form controls (e.g., input groups).\n//\n// Heads up! This is mixin-ed into `.navbar-form` in navbars.less.\n\n.form-inline {\n\n // Kick in the inline\n @media (min-width: @screen-sm-min) {\n // Inline-block all the things for \"inline\"\n .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n\n // In navbar-form, allow folks to *not* use `.form-group`\n .form-control {\n display: inline-block;\n width: auto; // Prevent labels from stacking above inputs in `.form-group`\n vertical-align: middle;\n }\n\n // Make static controls behave like regular ones\n .form-control-static {\n display: inline-block;\n }\n\n .input-group {\n display: inline-table;\n vertical-align: middle;\n\n .input-group-addon,\n .input-group-btn,\n .form-control {\n width: auto;\n }\n }\n\n // Input groups need that 100% width though\n .input-group > .form-control {\n width: 100%;\n }\n\n .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n\n // Remove default margin on radios/checkboxes that were used for stacking, and\n // then undo the floating of radios and checkboxes to match.\n .radio,\n .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n\n label {\n padding-left: 0;\n }\n }\n .radio input[type=\"radio\"],\n .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n\n // Re-override the feedback icon.\n .has-feedback .form-control-feedback {\n top: 0;\n }\n }\n}\n\n\n// Horizontal forms\n//\n// Horizontal forms are built on grid classes and allow you to create forms with\n// labels on the left and inputs on the right.\n\n.form-horizontal {\n\n // Consistent vertical alignment of radios and checkboxes\n //\n // Labels also get some reset styles, but that is scoped to a media query below.\n .radio,\n .checkbox,\n .radio-inline,\n .checkbox-inline {\n margin-top: 0;\n margin-bottom: 0;\n padding-top: (@padding-base-vertical + 1); // Default padding plus a border\n }\n // Account for padding we're adding to ensure the alignment and of help text\n // and other content below items\n .radio,\n .checkbox {\n min-height: (@line-height-computed + (@padding-base-vertical + 1));\n }\n\n // Make form groups behave like rows\n .form-group {\n .make-row();\n }\n\n // Reset spacing and right align labels, but scope to media queries so that\n // labels on narrow viewports stack the same as a default form example.\n @media (min-width: @screen-sm-min) {\n .control-label {\n text-align: right;\n margin-bottom: 0;\n padding-top: (@padding-base-vertical + 1); // Default padding plus a border\n }\n }\n\n // Validation states\n //\n // Reposition the icon because it's now within a grid column and columns have\n // `position: relative;` on them. Also accounts for the grid gutter padding.\n .has-feedback .form-control-feedback {\n right: floor((@grid-gutter-width / 2));\n }\n\n // Form group sizes\n //\n // Quick utility class for applying `.input-lg` and `.input-sm` styles to the\n // inputs and labels within a `.form-group`.\n .form-group-lg {\n @media (min-width: @screen-sm-min) {\n .control-label {\n padding-top: ((@padding-large-vertical * @line-height-large) + 1);\n font-size: @font-size-large;\n }\n }\n }\n .form-group-sm {\n @media (min-width: @screen-sm-min) {\n .control-label {\n padding-top: (@padding-small-vertical + 1);\n font-size: @font-size-small;\n }\n }\n }\n}\n","// Form validation states\n//\n// Used in forms.less to generate the form validation CSS for warnings, errors,\n// and successes.\n\n.form-control-validation(@text-color: #555; @border-color: #ccc; @background-color: #f5f5f5) {\n // Color the label and help text\n .help-block,\n .control-label,\n .radio,\n .checkbox,\n .radio-inline,\n .checkbox-inline,\n &.radio label,\n &.checkbox label,\n &.radio-inline label,\n &.checkbox-inline label {\n color: @text-color;\n }\n // Set the border and box shadow on specific inputs to match\n .form-control {\n border-color: @border-color;\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work\n &:focus {\n border-color: darken(@border-color, 10%);\n @shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten(@border-color, 20%);\n .box-shadow(@shadow);\n }\n }\n // Set validation states also for addons\n .input-group-addon {\n color: @text-color;\n border-color: @border-color;\n background-color: @background-color;\n }\n // Optional feedback icon\n .form-control-feedback {\n color: @text-color;\n }\n}\n\n\n// Form control focus state\n//\n// Generate a customized focus state and for any input with the specified color,\n// which defaults to the `@input-border-focus` variable.\n//\n// We highly encourage you to not customize the default value, but instead use\n// this to tweak colors on an as-needed basis. This aesthetic change is based on\n// WebKit's default styles, but applicable to a wider range of browsers. Its\n// usability and accessibility should be taken into account with any change.\n//\n// Example usage: change the default blue border and shadow to white for better\n// contrast against a dark gray background.\n.form-control-focus(@color: @input-border-focus) {\n @color-rgba: rgba(red(@color), green(@color), blue(@color), .6);\n &:focus {\n border-color: @color;\n outline: 0;\n .box-shadow(~\"inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px @{color-rgba}\");\n }\n}\n\n// Form control sizing\n//\n// Relative text size, padding, and border-radii changes for form controls. For\n// horizontal sizing, wrap controls in the predefined grid classes. `<select>`\n// element gets special love because it's special, and that's a fact!\n.input-size(@input-height; @padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n height: @input-height;\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n border-radius: @border-radius;\n\n select& {\n height: @input-height;\n line-height: @input-height;\n }\n\n textarea&,\n select[multiple]& {\n height: auto;\n }\n}\n","//\n// Buttons\n// --------------------------------------------------\n\n\n// Base styles\n// --------------------------------------------------\n\n.btn {\n display: inline-block;\n margin-bottom: 0; // For input.btn\n font-weight: @btn-font-weight;\n text-align: center;\n vertical-align: middle;\n touch-action: manipulation;\n cursor: pointer;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid transparent;\n white-space: nowrap;\n .button-size(@padding-base-vertical; @padding-base-horizontal; @font-size-base; @line-height-base; @btn-border-radius-base);\n .user-select(none);\n\n &,\n &:active,\n &.active {\n &:focus,\n &.focus {\n .tab-focus();\n }\n }\n\n &:hover,\n &:focus,\n &.focus {\n color: @btn-default-color;\n text-decoration: none;\n }\n\n &:active,\n &.active {\n outline: 0;\n background-image: none;\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n cursor: @cursor-disabled;\n .opacity(.65);\n .box-shadow(none);\n }\n\n a& {\n &.disabled,\n fieldset[disabled] & {\n pointer-events: none; // Future-proof disabling of clicks on `<a>` elements\n }\n }\n}\n\n\n// Alternate buttons\n// --------------------------------------------------\n\n.btn-default {\n .button-variant(@btn-default-color; @btn-default-bg; @btn-default-border);\n}\n.btn-primary {\n .button-variant(@btn-primary-color; @btn-primary-bg; @btn-primary-border);\n}\n// Success appears as green\n.btn-success {\n .button-variant(@btn-success-color; @btn-success-bg; @btn-success-border);\n}\n// Info appears as blue-green\n.btn-info {\n .button-variant(@btn-info-color; @btn-info-bg; @btn-info-border);\n}\n// Warning appears as orange\n.btn-warning {\n .button-variant(@btn-warning-color; @btn-warning-bg; @btn-warning-border);\n}\n// Danger and error appear as red\n.btn-danger {\n .button-variant(@btn-danger-color; @btn-danger-bg; @btn-danger-border);\n}\n\n\n// Link buttons\n// -------------------------\n\n// Make a button look and behave like a link\n.btn-link {\n color: @link-color;\n font-weight: normal;\n border-radius: 0;\n\n &,\n &:active,\n &.active,\n &[disabled],\n fieldset[disabled] & {\n background-color: transparent;\n .box-shadow(none);\n }\n &,\n &:hover,\n &:focus,\n &:active {\n border-color: transparent;\n }\n &:hover,\n &:focus {\n color: @link-hover-color;\n text-decoration: @link-hover-decoration;\n background-color: transparent;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @btn-link-disabled-color;\n text-decoration: none;\n }\n }\n}\n\n\n// Button Sizes\n// --------------------------------------------------\n\n.btn-lg {\n // line-height: ensure even-numbered height of button next to large input\n .button-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @btn-border-radius-large);\n}\n.btn-sm {\n // line-height: ensure proper height of button next to small input\n .button-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @btn-border-radius-small);\n}\n.btn-xs {\n .button-size(@padding-xs-vertical; @padding-xs-horizontal; @font-size-small; @line-height-small; @btn-border-radius-small);\n}\n\n\n// Block button\n// --------------------------------------------------\n\n.btn-block {\n display: block;\n width: 100%;\n}\n\n// Vertically space out multiple block buttons\n.btn-block + .btn-block {\n margin-top: 5px;\n}\n\n// Specificity overrides\ninput[type=\"submit\"],\ninput[type=\"reset\"],\ninput[type=\"button\"] {\n &.btn-block {\n width: 100%;\n }\n}\n","// Button variants\n//\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\n\n.button-variant(@color; @background; @border) {\n color: @color;\n background-color: @background;\n border-color: @border;\n\n &:focus,\n &.focus {\n color: @color;\n background-color: darken(@background, 10%);\n border-color: darken(@border, 25%);\n }\n &:hover {\n color: @color;\n background-color: darken(@background, 10%);\n border-color: darken(@border, 12%);\n }\n &:active,\n &.active,\n .open > .dropdown-toggle& {\n color: @color;\n background-color: darken(@background, 10%);\n border-color: darken(@border, 12%);\n\n &:hover,\n &:focus,\n &.focus {\n color: @color;\n background-color: darken(@background, 17%);\n border-color: darken(@border, 25%);\n }\n }\n &:active,\n &.active,\n .open > .dropdown-toggle& {\n background-image: none;\n }\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n &,\n &:hover,\n &:focus,\n &.focus,\n &:active,\n &.active {\n background-color: @background;\n border-color: @border;\n }\n }\n\n .badge {\n color: @background;\n background-color: @color;\n }\n}\n\n// Button sizes\n.button-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n border-radius: @border-radius;\n}\n","// Opacity\n\n.opacity(@opacity) {\n opacity: @opacity;\n // IE8 filter\n @opacity-ie: (@opacity * 100);\n filter: ~\"alpha(opacity=@{opacity-ie})\";\n}\n","//\n// Component animations\n// --------------------------------------------------\n\n// Heads up!\n//\n// We don't use the `.opacity()` mixin here since it causes a bug with text\n// fields in IE7-8. Source: https://github.com/twbs/bootstrap/pull/3552.\n\n.fade {\n opacity: 0;\n .transition(opacity .15s linear);\n &.in {\n opacity: 1;\n }\n}\n\n.collapse {\n display: none;\n\n &.in { display: block; }\n tr&.in { display: table-row; }\n tbody&.in { display: table-row-group; }\n}\n\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n .transition-property(~\"height, visibility\");\n .transition-duration(.35s);\n .transition-timing-function(ease);\n}\n","//\n// Dropdown menus\n// --------------------------------------------------\n\n\n// Dropdown arrow/caret\n.caret {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: @caret-width-base dashed;\n border-top: @caret-width-base solid ~\"\\9\"; // IE8\n border-right: @caret-width-base solid transparent;\n border-left: @caret-width-base solid transparent;\n}\n\n// The dropdown wrapper (div)\n.dropup,\n.dropdown {\n position: relative;\n}\n\n// Prevent the focus on the dropdown toggle when closing dropdowns\n.dropdown-toggle:focus {\n outline: 0;\n}\n\n// The dropdown menu (ul)\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: @zindex-dropdown;\n display: none; // none by default, but block on \"open\" of the menu\n float: left;\n min-width: 160px;\n padding: 5px 0;\n margin: 2px 0 0; // override default ul\n list-style: none;\n font-size: @font-size-base;\n text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)\n background-color: @dropdown-bg;\n border: 1px solid @dropdown-fallback-border; // IE8 fallback\n border: 1px solid @dropdown-border;\n border-radius: @border-radius-base;\n .box-shadow(0 6px 12px rgba(0,0,0,.175));\n background-clip: padding-box;\n\n // Aligns the dropdown menu to right\n //\n // Deprecated as of 3.1.0 in favor of `.dropdown-menu-[dir]`\n &.pull-right {\n right: 0;\n left: auto;\n }\n\n // Dividers (basically an hr) within the dropdown\n .divider {\n .nav-divider(@dropdown-divider-bg);\n }\n\n // Links within the dropdown menu\n > li > a {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: normal;\n line-height: @line-height-base;\n color: @dropdown-link-color;\n white-space: nowrap; // prevent links from randomly breaking onto new lines\n }\n}\n\n// Hover/Focus state\n.dropdown-menu > li > a {\n &:hover,\n &:focus {\n text-decoration: none;\n color: @dropdown-link-hover-color;\n background-color: @dropdown-link-hover-bg;\n }\n}\n\n// Active state\n.dropdown-menu > .active > a {\n &,\n &:hover,\n &:focus {\n color: @dropdown-link-active-color;\n text-decoration: none;\n outline: 0;\n background-color: @dropdown-link-active-bg;\n }\n}\n\n// Disabled state\n//\n// Gray out text and ensure the hover/focus state remains gray\n\n.dropdown-menu > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @dropdown-link-disabled-color;\n }\n\n // Nuke hover/focus effects\n &:hover,\n &:focus {\n text-decoration: none;\n background-color: transparent;\n background-image: none; // Remove CSS gradient\n .reset-filter();\n cursor: @cursor-disabled;\n }\n}\n\n// Open state for the dropdown\n.open {\n // Show the menu\n > .dropdown-menu {\n display: block;\n }\n\n // Remove the outline when :focus is triggered\n > a {\n outline: 0;\n }\n}\n\n// Menu positioning\n//\n// Add extra class to `.dropdown-menu` to flip the alignment of the dropdown\n// menu with the parent.\n.dropdown-menu-right {\n left: auto; // Reset the default from `.dropdown-menu`\n right: 0;\n}\n// With v3, we enabled auto-flipping if you have a dropdown within a right\n// aligned nav component. To enable the undoing of that, we provide an override\n// to restore the default dropdown menu alignment.\n//\n// This is only for left-aligning a dropdown menu within a `.navbar-right` or\n// `.pull-right` nav component.\n.dropdown-menu-left {\n left: 0;\n right: auto;\n}\n\n// Dropdown section headers\n.dropdown-header {\n display: block;\n padding: 3px 20px;\n font-size: @font-size-small;\n line-height: @line-height-base;\n color: @dropdown-header-color;\n white-space: nowrap; // as with > li > a\n}\n\n// Backdrop to catch body clicks on mobile, etc.\n.dropdown-backdrop {\n position: fixed;\n left: 0;\n right: 0;\n bottom: 0;\n top: 0;\n z-index: (@zindex-dropdown - 10);\n}\n\n// Right aligned dropdowns\n.pull-right > .dropdown-menu {\n right: 0;\n left: auto;\n}\n\n// Allow for dropdowns to go bottom up (aka, dropup-menu)\n//\n// Just add .dropup after the standard .dropdown class and you're set, bro.\n// TODO: abstract this so that the navbar fixed styles are not placed here?\n\n.dropup,\n.navbar-fixed-bottom .dropdown {\n // Reverse the caret\n .caret {\n border-top: 0;\n border-bottom: @caret-width-base dashed;\n border-bottom: @caret-width-base solid ~\"\\9\"; // IE8\n content: \"\";\n }\n // Different positioning for bottom up menu\n .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 2px;\n }\n}\n\n\n// Component alignment\n//\n// Reiterate per navbar.less and the modified component alignment there.\n\n@media (min-width: @grid-float-breakpoint) {\n .navbar-right {\n .dropdown-menu {\n .dropdown-menu-right();\n }\n // Necessary for overrides of the default right aligned menu.\n // Will remove come v4 in all likelihood.\n .dropdown-menu-left {\n .dropdown-menu-left();\n }\n }\n}\n","// Horizontal dividers\n//\n// Dividers (basically an hr) within dropdowns and nav lists\n\n.nav-divider(@color: #e5e5e5) {\n height: 1px;\n margin: ((@line-height-computed / 2) - 1) 0;\n overflow: hidden;\n background-color: @color;\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n","//\n// Button groups\n// --------------------------------------------------\n\n// Make the div behave like a button\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle; // match .btn alignment given font-size hack above\n > .btn {\n position: relative;\n float: left;\n // Bring the \"active\" button to the front\n &:hover,\n &:focus,\n &:active,\n &.active {\n z-index: 2;\n }\n }\n}\n\n// Prevent double borders when buttons are next to each other\n.btn-group {\n .btn + .btn,\n .btn + .btn-group,\n .btn-group + .btn,\n .btn-group + .btn-group {\n margin-left: -1px;\n }\n}\n\n// Optional: Group multiple button groups together for a toolbar\n.btn-toolbar {\n margin-left: -5px; // Offset the first child's margin\n &:extend(.clearfix all);\n\n .btn,\n .btn-group,\n .input-group {\n float: left;\n }\n > .btn,\n > .btn-group,\n > .input-group {\n margin-left: 5px;\n }\n}\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n\n// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match\n.btn-group > .btn:first-child {\n margin-left: 0;\n &:not(:last-child):not(.dropdown-toggle) {\n .border-right-radius(0);\n }\n}\n// Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n .border-left-radius(0);\n}\n\n// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group)\n.btn-group > .btn-group {\n float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) {\n > .btn:last-child,\n > .dropdown-toggle {\n .border-right-radius(0);\n }\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n .border-left-radius(0);\n}\n\n// On active and open, don't show outline\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0;\n}\n\n\n// Sizing\n//\n// Remix the default button sizing classes into new ones for easier manipulation.\n\n.btn-group-xs > .btn { &:extend(.btn-xs); }\n.btn-group-sm > .btn { &:extend(.btn-sm); }\n.btn-group-lg > .btn { &:extend(.btn-lg); }\n\n\n// Split button dropdowns\n// ----------------------\n\n// Give the line between buttons some depth\n.btn-group > .btn + .dropdown-toggle {\n padding-left: 8px;\n padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n padding-left: 12px;\n padding-right: 12px;\n}\n\n// The clickable button for toggling the menu\n// Remove the gradient and set the same inset shadow as the :active state\n.btn-group.open .dropdown-toggle {\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n\n // Show no shadow for `.btn-link` since it has no other button styles.\n &.btn-link {\n .box-shadow(none);\n }\n}\n\n\n// Reposition the caret\n.btn .caret {\n margin-left: 0;\n}\n// Carets in other button sizes\n.btn-lg .caret {\n border-width: @caret-width-large @caret-width-large 0;\n border-bottom-width: 0;\n}\n// Upside down carets for .dropup\n.dropup .btn-lg .caret {\n border-width: 0 @caret-width-large @caret-width-large;\n}\n\n\n// Vertical button groups\n// ----------------------\n\n.btn-group-vertical {\n > .btn,\n > .btn-group,\n > .btn-group > .btn {\n display: block;\n float: none;\n width: 100%;\n max-width: 100%;\n }\n\n // Clear floats so dropdown menus can be properly placed\n > .btn-group {\n &:extend(.clearfix all);\n > .btn {\n float: none;\n }\n }\n\n > .btn + .btn,\n > .btn + .btn-group,\n > .btn-group + .btn,\n > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n }\n}\n\n.btn-group-vertical > .btn {\n &:not(:first-child):not(:last-child) {\n border-radius: 0;\n }\n &:first-child:not(:last-child) {\n border-top-right-radius: @btn-border-radius-base;\n .border-bottom-radius(0);\n }\n &:last-child:not(:first-child) {\n border-bottom-left-radius: @btn-border-radius-base;\n .border-top-radius(0);\n }\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) {\n > .btn:last-child,\n > .dropdown-toggle {\n .border-bottom-radius(0);\n }\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n .border-top-radius(0);\n}\n\n\n// Justified button groups\n// ----------------------\n\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n > .btn,\n > .btn-group {\n float: none;\n display: table-cell;\n width: 1%;\n }\n > .btn-group .btn {\n width: 100%;\n }\n\n > .btn-group .dropdown-menu {\n left: auto;\n }\n}\n\n\n// Checkbox and radio options\n//\n// In order to support the browser's form validation feedback, powered by the\n// `required` attribute, we have to \"hide\" the inputs via `clip`. We cannot use\n// `display: none;` or `visibility: hidden;` as that also hides the popover.\n// Simply visually hiding the inputs via `opacity` would leave them clickable in\n// certain cases which is prevented by using `clip` and `pointer-events`.\n// This way, we ensure a DOM element is visible to position the popover from.\n//\n// See https://github.com/twbs/bootstrap/pull/12794 and\n// https://github.com/twbs/bootstrap/pull/14559 for more information.\n\n[data-toggle=\"buttons\"] {\n > .btn,\n > .btn-group > .btn {\n input[type=\"radio\"],\n input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0,0,0,0);\n pointer-events: none;\n }\n }\n}\n","// Single side border-radius\n\n.border-top-radius(@radius) {\n border-top-right-radius: @radius;\n border-top-left-radius: @radius;\n}\n.border-right-radius(@radius) {\n border-bottom-right-radius: @radius;\n border-top-right-radius: @radius;\n}\n.border-bottom-radius(@radius) {\n border-bottom-right-radius: @radius;\n border-bottom-left-radius: @radius;\n}\n.border-left-radius(@radius) {\n border-bottom-left-radius: @radius;\n border-top-left-radius: @radius;\n}\n","//\n// Input groups\n// --------------------------------------------------\n\n// Base styles\n// -------------------------\n.input-group {\n position: relative; // For dropdowns\n display: table;\n border-collapse: separate; // prevent input groups from inheriting border styles from table cells when placed within a table\n\n // Undo padding and float of grid classes\n &[class*=\"col-\"] {\n float: none;\n padding-left: 0;\n padding-right: 0;\n }\n\n .form-control {\n // Ensure that the input is always above the *appended* addon button for\n // proper border colors.\n position: relative;\n z-index: 2;\n\n // IE9 fubars the placeholder attribute in text inputs and the arrows on\n // select elements in input groups. To fix it, we float the input. Details:\n // https://github.com/twbs/bootstrap/issues/11561#issuecomment-28936855\n float: left;\n\n width: 100%;\n margin-bottom: 0;\n }\n}\n\n// Sizing options\n//\n// Remix the default form control sizing classes into new ones for easier\n// manipulation.\n\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n .input-lg();\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n .input-sm();\n}\n\n\n// Display as table-cell\n// -------------------------\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: table-cell;\n\n &:not(:first-child):not(:last-child) {\n border-radius: 0;\n }\n}\n// Addon and addon wrapper for buttons\n.input-group-addon,\n.input-group-btn {\n width: 1%;\n white-space: nowrap;\n vertical-align: middle; // Match the inputs\n}\n\n// Text input groups\n// -------------------------\n.input-group-addon {\n padding: @padding-base-vertical @padding-base-horizontal;\n font-size: @font-size-base;\n font-weight: normal;\n line-height: 1;\n color: @input-color;\n text-align: center;\n background-color: @input-group-addon-bg;\n border: 1px solid @input-group-addon-border-color;\n border-radius: @border-radius-base;\n\n // Sizing\n &.input-sm {\n padding: @padding-small-vertical @padding-small-horizontal;\n font-size: @font-size-small;\n border-radius: @border-radius-small;\n }\n &.input-lg {\n padding: @padding-large-vertical @padding-large-horizontal;\n font-size: @font-size-large;\n border-radius: @border-radius-large;\n }\n\n // Nuke default margins from checkboxes and radios to vertically center within.\n input[type=\"radio\"],\n input[type=\"checkbox\"] {\n margin-top: 0;\n }\n}\n\n// Reset rounded corners\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n .border-right-radius(0);\n}\n.input-group-addon:first-child {\n border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n .border-left-radius(0);\n}\n.input-group-addon:last-child {\n border-left: 0;\n}\n\n// Button input groups\n// -------------------------\n.input-group-btn {\n position: relative;\n // Jankily prevent input button groups from wrapping with `white-space` and\n // `font-size` in combination with `inline-block` on buttons.\n font-size: 0;\n white-space: nowrap;\n\n // Negative margin for spacing, position for bringing hovered/focused/actived\n // element above the siblings.\n > .btn {\n position: relative;\n + .btn {\n margin-left: -1px;\n }\n // Bring the \"active\" button to the front\n &:hover,\n &:focus,\n &:active {\n z-index: 2;\n }\n }\n\n // Negative margin to only have a 1px border between the two\n &:first-child {\n > .btn,\n > .btn-group {\n margin-right: -1px;\n }\n }\n &:last-child {\n > .btn,\n > .btn-group {\n z-index: 2;\n margin-left: -1px;\n }\n }\n}\n","//\n// Navs\n// --------------------------------------------------\n\n\n// Base class\n// --------------------------------------------------\n\n.nav {\n margin-bottom: 0;\n padding-left: 0; // Override default ul/ol\n list-style: none;\n &:extend(.clearfix all);\n\n > li {\n position: relative;\n display: block;\n\n > a {\n position: relative;\n display: block;\n padding: @nav-link-padding;\n &:hover,\n &:focus {\n text-decoration: none;\n background-color: @nav-link-hover-bg;\n }\n }\n\n // Disabled state sets text to gray and nukes hover/tab effects\n &.disabled > a {\n color: @nav-disabled-link-color;\n\n &:hover,\n &:focus {\n color: @nav-disabled-link-hover-color;\n text-decoration: none;\n background-color: transparent;\n cursor: @cursor-disabled;\n }\n }\n }\n\n // Open dropdowns\n .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @nav-link-hover-bg;\n border-color: @link-color;\n }\n }\n\n // Nav dividers (deprecated with v3.0.1)\n //\n // This should have been removed in v3 with the dropping of `.nav-list`, but\n // we missed it. We don't currently support this anywhere, but in the interest\n // of maintaining backward compatibility in case you use it, it's deprecated.\n .nav-divider {\n .nav-divider();\n }\n\n // Prevent IE8 from misplacing imgs\n //\n // See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989\n > li > a > img {\n max-width: none;\n }\n}\n\n\n// Tabs\n// -------------------------\n\n// Give the tabs something to sit on\n.nav-tabs {\n border-bottom: 1px solid @nav-tabs-border-color;\n > li {\n float: left;\n // Make the list-items overlay the bottom border\n margin-bottom: -1px;\n\n // Actual tabs (as links)\n > a {\n margin-right: 2px;\n line-height: @line-height-base;\n border: 1px solid transparent;\n border-radius: @border-radius-base @border-radius-base 0 0;\n &:hover {\n border-color: @nav-tabs-link-hover-border-color @nav-tabs-link-hover-border-color @nav-tabs-border-color;\n }\n }\n\n // Active state, and its :hover to override normal :hover\n &.active > a {\n &,\n &:hover,\n &:focus {\n color: @nav-tabs-active-link-hover-color;\n background-color: @nav-tabs-active-link-hover-bg;\n border: 1px solid @nav-tabs-active-link-hover-border-color;\n border-bottom-color: transparent;\n cursor: default;\n }\n }\n }\n // pulling this in mainly for less shorthand\n &.nav-justified {\n .nav-justified();\n .nav-tabs-justified();\n }\n}\n\n\n// Pills\n// -------------------------\n.nav-pills {\n > li {\n float: left;\n\n // Links rendered as pills\n > a {\n border-radius: @nav-pills-border-radius;\n }\n + li {\n margin-left: 2px;\n }\n\n // Active state\n &.active > a {\n &,\n &:hover,\n &:focus {\n color: @nav-pills-active-link-hover-color;\n background-color: @nav-pills-active-link-hover-bg;\n }\n }\n }\n}\n\n\n// Stacked pills\n.nav-stacked {\n > li {\n float: none;\n + li {\n margin-top: 2px;\n margin-left: 0; // no need for this gap between nav items\n }\n }\n}\n\n\n// Nav variations\n// --------------------------------------------------\n\n// Justified nav links\n// -------------------------\n\n.nav-justified {\n width: 100%;\n\n > li {\n float: none;\n > a {\n text-align: center;\n margin-bottom: 5px;\n }\n }\n\n > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n }\n\n @media (min-width: @screen-sm-min) {\n > li {\n display: table-cell;\n width: 1%;\n > a {\n margin-bottom: 0;\n }\n }\n }\n}\n\n// Move borders to anchors instead of bottom of list\n//\n// Mixin for adding on top the shared `.nav-justified` styles for our tabs\n.nav-tabs-justified {\n border-bottom: 0;\n\n > li > a {\n // Override margin from .nav-tabs\n margin-right: 0;\n border-radius: @border-radius-base;\n }\n\n > .active > a,\n > .active > a:hover,\n > .active > a:focus {\n border: 1px solid @nav-tabs-justified-link-border-color;\n }\n\n @media (min-width: @screen-sm-min) {\n > li > a {\n border-bottom: 1px solid @nav-tabs-justified-link-border-color;\n border-radius: @border-radius-base @border-radius-base 0 0;\n }\n > .active > a,\n > .active > a:hover,\n > .active > a:focus {\n border-bottom-color: @nav-tabs-justified-active-link-border-color;\n }\n }\n}\n\n\n// Tabbable tabs\n// -------------------------\n\n// Hide tabbable panes to start, show them when `.active`\n.tab-content {\n > .tab-pane {\n display: none;\n }\n > .active {\n display: block;\n }\n}\n\n\n// Dropdowns\n// -------------------------\n\n// Specific dropdowns\n.nav-tabs .dropdown-menu {\n // make dropdown border overlap tab border\n margin-top: -1px;\n // Remove the top rounded corners here since there is a hard edge above the menu\n .border-top-radius(0);\n}\n","//\n// Navbars\n// --------------------------------------------------\n\n\n// Wrapper and base class\n//\n// Provide a static navbar from which we expand to create full-width, fixed, and\n// other navbar variations.\n\n.navbar {\n position: relative;\n min-height: @navbar-height; // Ensure a navbar always shows (e.g., without a .navbar-brand in collapsed mode)\n margin-bottom: @navbar-margin-bottom;\n border: 1px solid transparent;\n\n // Prevent floats from breaking the navbar\n &:extend(.clearfix all);\n\n @media (min-width: @grid-float-breakpoint) {\n border-radius: @navbar-border-radius;\n }\n}\n\n\n// Navbar heading\n//\n// Groups `.navbar-brand` and `.navbar-toggle` into a single component for easy\n// styling of responsive aspects.\n\n.navbar-header {\n &:extend(.clearfix all);\n\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n }\n}\n\n\n// Navbar collapse (body)\n//\n// Group your navbar content into this for easy collapsing and expanding across\n// various device sizes. By default, this content is collapsed when <768px, but\n// will expand past that for a horizontal display.\n//\n// To start (on mobile devices) the navbar links, forms, and buttons are stacked\n// vertically and include a `max-height` to overflow in case you have too much\n// content for the user's viewport.\n\n.navbar-collapse {\n overflow-x: visible;\n padding-right: @navbar-padding-horizontal;\n padding-left: @navbar-padding-horizontal;\n border-top: 1px solid transparent;\n box-shadow: inset 0 1px 0 rgba(255,255,255,.1);\n &:extend(.clearfix all);\n -webkit-overflow-scrolling: touch;\n\n &.in {\n overflow-y: auto;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n width: auto;\n border-top: 0;\n box-shadow: none;\n\n &.collapse {\n display: block !important;\n height: auto !important;\n padding-bottom: 0; // Override default setting\n overflow: visible !important;\n }\n\n &.in {\n overflow-y: visible;\n }\n\n // Undo the collapse side padding for navbars with containers to ensure\n // alignment of right-aligned contents.\n .navbar-fixed-top &,\n .navbar-static-top &,\n .navbar-fixed-bottom & {\n padding-left: 0;\n padding-right: 0;\n }\n }\n}\n\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n .navbar-collapse {\n max-height: @navbar-collapse-max-height;\n\n @media (max-device-width: @screen-xs-min) and (orientation: landscape) {\n max-height: 200px;\n }\n }\n}\n\n\n// Both navbar header and collapse\n//\n// When a container is present, change the behavior of the header and collapse.\n\n.container,\n.container-fluid {\n > .navbar-header,\n > .navbar-collapse {\n margin-right: -@navbar-padding-horizontal;\n margin-left: -@navbar-padding-horizontal;\n\n @media (min-width: @grid-float-breakpoint) {\n margin-right: 0;\n margin-left: 0;\n }\n }\n}\n\n\n//\n// Navbar alignment options\n//\n// Display the navbar across the entirety of the page or fixed it to the top or\n// bottom of the page.\n\n// Static top (unfixed, but 100% wide) navbar\n.navbar-static-top {\n z-index: @zindex-navbar;\n border-width: 0 0 1px;\n\n @media (min-width: @grid-float-breakpoint) {\n border-radius: 0;\n }\n}\n\n// Fix the top/bottom navbars when screen real estate supports it\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n position: fixed;\n right: 0;\n left: 0;\n z-index: @zindex-navbar-fixed;\n\n // Undo the rounded corners\n @media (min-width: @grid-float-breakpoint) {\n border-radius: 0;\n }\n}\n.navbar-fixed-top {\n top: 0;\n border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n bottom: 0;\n margin-bottom: 0; // override .navbar defaults\n border-width: 1px 0 0;\n}\n\n\n// Brand/project name\n\n.navbar-brand {\n float: left;\n padding: @navbar-padding-vertical @navbar-padding-horizontal;\n font-size: @font-size-large;\n line-height: @line-height-computed;\n height: @navbar-height;\n\n &:hover,\n &:focus {\n text-decoration: none;\n }\n\n > img {\n display: block;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n .navbar > .container &,\n .navbar > .container-fluid & {\n margin-left: -@navbar-padding-horizontal;\n }\n }\n}\n\n\n// Navbar toggle\n//\n// Custom button for toggling the `.navbar-collapse`, powered by the collapse\n// JavaScript plugin.\n\n.navbar-toggle {\n position: relative;\n float: right;\n margin-right: @navbar-padding-horizontal;\n padding: 9px 10px;\n .navbar-vertical-align(34px);\n background-color: transparent;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid transparent;\n border-radius: @border-radius-base;\n\n // We remove the `outline` here, but later compensate by attaching `:hover`\n // styles to `:focus`.\n &:focus {\n outline: 0;\n }\n\n // Bars\n .icon-bar {\n display: block;\n width: 22px;\n height: 2px;\n border-radius: 1px;\n }\n .icon-bar + .icon-bar {\n margin-top: 4px;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n display: none;\n }\n}\n\n\n// Navbar nav links\n//\n// Builds on top of the `.nav` components with its own modifier class to make\n// the nav the full height of the horizontal nav (above 768px).\n\n.navbar-nav {\n margin: (@navbar-padding-vertical / 2) -@navbar-padding-horizontal;\n\n > li > a {\n padding-top: 10px;\n padding-bottom: 10px;\n line-height: @line-height-computed;\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display when collapsed\n .open .dropdown-menu {\n position: static;\n float: none;\n width: auto;\n margin-top: 0;\n background-color: transparent;\n border: 0;\n box-shadow: none;\n > li > a,\n .dropdown-header {\n padding: 5px 15px 5px 25px;\n }\n > li > a {\n line-height: @line-height-computed;\n &:hover,\n &:focus {\n background-image: none;\n }\n }\n }\n }\n\n // Uncollapse the nav\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n margin: 0;\n\n > li {\n float: left;\n > a {\n padding-top: @navbar-padding-vertical;\n padding-bottom: @navbar-padding-vertical;\n }\n }\n }\n}\n\n\n// Navbar form\n//\n// Extension of the `.form-inline` with some extra flavor for optimum display in\n// our navbars.\n\n.navbar-form {\n margin-left: -@navbar-padding-horizontal;\n margin-right: -@navbar-padding-horizontal;\n padding: 10px @navbar-padding-horizontal;\n border-top: 1px solid transparent;\n border-bottom: 1px solid transparent;\n @shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);\n .box-shadow(@shadow);\n\n // Mixin behavior for optimum display\n .form-inline();\n\n .form-group {\n @media (max-width: @grid-float-breakpoint-max) {\n margin-bottom: 5px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n }\n\n // Vertically center in expanded, horizontal navbar\n .navbar-vertical-align(@input-height-base);\n\n // Undo 100% width for pull classes\n @media (min-width: @grid-float-breakpoint) {\n width: auto;\n border: 0;\n margin-left: 0;\n margin-right: 0;\n padding-top: 0;\n padding-bottom: 0;\n .box-shadow(none);\n }\n}\n\n\n// Dropdown menus\n\n// Menu position and menu carets\n.navbar-nav > li > .dropdown-menu {\n margin-top: 0;\n .border-top-radius(0);\n}\n// Menu position and menu caret support for dropups via extra dropup class\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n margin-bottom: 0;\n .border-top-radius(@navbar-border-radius);\n .border-bottom-radius(0);\n}\n\n\n// Buttons in navbars\n//\n// Vertically center a button within a navbar (when *not* in a form).\n\n.navbar-btn {\n .navbar-vertical-align(@input-height-base);\n\n &.btn-sm {\n .navbar-vertical-align(@input-height-small);\n }\n &.btn-xs {\n .navbar-vertical-align(22);\n }\n}\n\n\n// Text in navbars\n//\n// Add a class to make any element properly align itself vertically within the navbars.\n\n.navbar-text {\n .navbar-vertical-align(@line-height-computed);\n\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n margin-left: @navbar-padding-horizontal;\n margin-right: @navbar-padding-horizontal;\n }\n}\n\n\n// Component alignment\n//\n// Repurpose the pull utilities as their own navbar utilities to avoid specificity\n// issues with parents and chaining. Only do this when the navbar is uncollapsed\n// though so that navbar contents properly stack and align in mobile.\n//\n// Declared after the navbar components to ensure more specificity on the margins.\n\n@media (min-width: @grid-float-breakpoint) {\n .navbar-left { .pull-left(); }\n .navbar-right {\n .pull-right();\n margin-right: -@navbar-padding-horizontal;\n\n ~ .navbar-right {\n margin-right: 0;\n }\n }\n}\n\n\n// Alternate navbars\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n background-color: @navbar-default-bg;\n border-color: @navbar-default-border;\n\n .navbar-brand {\n color: @navbar-default-brand-color;\n &:hover,\n &:focus {\n color: @navbar-default-brand-hover-color;\n background-color: @navbar-default-brand-hover-bg;\n }\n }\n\n .navbar-text {\n color: @navbar-default-color;\n }\n\n .navbar-nav {\n > li > a {\n color: @navbar-default-link-color;\n\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n background-color: @navbar-default-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-active-color;\n background-color: @navbar-default-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n background-color: @navbar-default-link-disabled-bg;\n }\n }\n }\n\n .navbar-toggle {\n border-color: @navbar-default-toggle-border-color;\n &:hover,\n &:focus {\n background-color: @navbar-default-toggle-hover-bg;\n }\n .icon-bar {\n background-color: @navbar-default-toggle-icon-bar-bg;\n }\n }\n\n .navbar-collapse,\n .navbar-form {\n border-color: @navbar-default-border;\n }\n\n // Dropdown menu items\n .navbar-nav {\n // Remove background color from open dropdown\n > .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @navbar-default-link-active-bg;\n color: @navbar-default-link-active-color;\n }\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display when collapsed\n .open .dropdown-menu {\n > li > a {\n color: @navbar-default-link-color;\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n background-color: @navbar-default-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-active-color;\n background-color: @navbar-default-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n background-color: @navbar-default-link-disabled-bg;\n }\n }\n }\n }\n }\n\n\n // Links in navbars\n //\n // Add a class to ensure links outside the navbar nav are colored correctly.\n\n .navbar-link {\n color: @navbar-default-link-color;\n &:hover {\n color: @navbar-default-link-hover-color;\n }\n }\n\n .btn-link {\n color: @navbar-default-link-color;\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n }\n }\n }\n}\n\n// Inverse navbar\n\n.navbar-inverse {\n background-color: @navbar-inverse-bg;\n border-color: @navbar-inverse-border;\n\n .navbar-brand {\n color: @navbar-inverse-brand-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-brand-hover-color;\n background-color: @navbar-inverse-brand-hover-bg;\n }\n }\n\n .navbar-text {\n color: @navbar-inverse-color;\n }\n\n .navbar-nav {\n > li > a {\n color: @navbar-inverse-link-color;\n\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n background-color: @navbar-inverse-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-active-color;\n background-color: @navbar-inverse-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n background-color: @navbar-inverse-link-disabled-bg;\n }\n }\n }\n\n // Darken the responsive nav toggle\n .navbar-toggle {\n border-color: @navbar-inverse-toggle-border-color;\n &:hover,\n &:focus {\n background-color: @navbar-inverse-toggle-hover-bg;\n }\n .icon-bar {\n background-color: @navbar-inverse-toggle-icon-bar-bg;\n }\n }\n\n .navbar-collapse,\n .navbar-form {\n border-color: darken(@navbar-inverse-bg, 7%);\n }\n\n // Dropdowns\n .navbar-nav {\n > .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @navbar-inverse-link-active-bg;\n color: @navbar-inverse-link-active-color;\n }\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display\n .open .dropdown-menu {\n > .dropdown-header {\n border-color: @navbar-inverse-border;\n }\n .divider {\n background-color: @navbar-inverse-border;\n }\n > li > a {\n color: @navbar-inverse-link-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n background-color: @navbar-inverse-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-active-color;\n background-color: @navbar-inverse-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n background-color: @navbar-inverse-link-disabled-bg;\n }\n }\n }\n }\n }\n\n .navbar-link {\n color: @navbar-inverse-link-color;\n &:hover {\n color: @navbar-inverse-link-hover-color;\n }\n }\n\n .btn-link {\n color: @navbar-inverse-link-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n }\n }\n }\n}\n","// Navbar vertical align\n//\n// Vertically center elements in the navbar.\n// Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin.\n\n.navbar-vertical-align(@element-height) {\n margin-top: ((@navbar-height - @element-height) / 2);\n margin-bottom: ((@navbar-height - @element-height) / 2);\n}\n","//\n// Utility classes\n// --------------------------------------------------\n\n\n// Floats\n// -------------------------\n\n.clearfix {\n .clearfix();\n}\n.center-block {\n .center-block();\n}\n.pull-right {\n float: right !important;\n}\n.pull-left {\n float: left !important;\n}\n\n\n// Toggling content\n// -------------------------\n\n// Note: Deprecated .hide in favor of .hidden or .sr-only (as appropriate) in v3.0.1\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n .text-hide();\n}\n\n\n// Hide from screenreaders and browsers\n//\n// Credit: HTML5 Boilerplate\n\n.hidden {\n display: none !important;\n}\n\n\n// For Affix plugin\n// -------------------------\n\n.affix {\n position: fixed;\n}\n","//\n// Breadcrumbs\n// --------------------------------------------------\n\n\n.breadcrumb {\n padding: @breadcrumb-padding-vertical @breadcrumb-padding-horizontal;\n margin-bottom: @line-height-computed;\n list-style: none;\n background-color: @breadcrumb-bg;\n border-radius: @border-radius-base;\n\n > li {\n display: inline-block;\n\n + li:before {\n content: \"@{breadcrumb-separator}\\00a0\"; // Unicode space added since inline-block means non-collapsing white-space\n padding: 0 5px;\n color: @breadcrumb-color;\n }\n }\n\n > .active {\n color: @breadcrumb-active-color;\n }\n}\n","//\n// Pagination (multiple pages)\n// --------------------------------------------------\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: @line-height-computed 0;\n border-radius: @border-radius-base;\n\n > li {\n display: inline; // Remove list-style and block-level defaults\n > a,\n > span {\n position: relative;\n float: left; // Collapse white-space\n padding: @padding-base-vertical @padding-base-horizontal;\n line-height: @line-height-base;\n text-decoration: none;\n color: @pagination-color;\n background-color: @pagination-bg;\n border: 1px solid @pagination-border;\n margin-left: -1px;\n }\n &:first-child {\n > a,\n > span {\n margin-left: 0;\n .border-left-radius(@border-radius-base);\n }\n }\n &:last-child {\n > a,\n > span {\n .border-right-radius(@border-radius-base);\n }\n }\n }\n\n > li > a,\n > li > span {\n &:hover,\n &:focus {\n z-index: 3;\n color: @pagination-hover-color;\n background-color: @pagination-hover-bg;\n border-color: @pagination-hover-border;\n }\n }\n\n > .active > a,\n > .active > span {\n &,\n &:hover,\n &:focus {\n z-index: 2;\n color: @pagination-active-color;\n background-color: @pagination-active-bg;\n border-color: @pagination-active-border;\n cursor: default;\n }\n }\n\n > .disabled {\n > span,\n > span:hover,\n > span:focus,\n > a,\n > a:hover,\n > a:focus {\n color: @pagination-disabled-color;\n background-color: @pagination-disabled-bg;\n border-color: @pagination-disabled-border;\n cursor: @cursor-disabled;\n }\n }\n}\n\n// Sizing\n// --------------------------------------------------\n\n// Large\n.pagination-lg {\n .pagination-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large);\n}\n\n// Small\n.pagination-sm {\n .pagination-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small);\n}\n","// Pagination\n\n.pagination-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n > li {\n > a,\n > span {\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n }\n &:first-child {\n > a,\n > span {\n .border-left-radius(@border-radius);\n }\n }\n &:last-child {\n > a,\n > span {\n .border-right-radius(@border-radius);\n }\n }\n }\n}\n","//\n// Pager pagination\n// --------------------------------------------------\n\n\n.pager {\n padding-left: 0;\n margin: @line-height-computed 0;\n list-style: none;\n text-align: center;\n &:extend(.clearfix all);\n li {\n display: inline;\n > a,\n > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: @pager-bg;\n border: 1px solid @pager-border;\n border-radius: @pager-border-radius;\n }\n\n > a:hover,\n > a:focus {\n text-decoration: none;\n background-color: @pager-hover-bg;\n }\n }\n\n .next {\n > a,\n > span {\n float: right;\n }\n }\n\n .previous {\n > a,\n > span {\n float: left;\n }\n }\n\n .disabled {\n > a,\n > a:hover,\n > a:focus,\n > span {\n color: @pager-disabled-color;\n background-color: @pager-bg;\n cursor: @cursor-disabled;\n }\n }\n}\n","//\n// Labels\n// --------------------------------------------------\n\n.label {\n display: inline;\n padding: .2em .6em .3em;\n font-size: 75%;\n font-weight: bold;\n line-height: 1;\n color: @label-color;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: .25em;\n\n // Add hover effects, but only for links\n a& {\n &:hover,\n &:focus {\n color: @label-link-hover-color;\n text-decoration: none;\n cursor: pointer;\n }\n }\n\n // Empty labels collapse automatically (not available in IE8)\n &:empty {\n display: none;\n }\n\n // Quick fix for labels in buttons\n .btn & {\n position: relative;\n top: -1px;\n }\n}\n\n// Colors\n// Contextual variations (linked labels get darker on :hover)\n\n.label-default {\n .label-variant(@label-default-bg);\n}\n\n.label-primary {\n .label-variant(@label-primary-bg);\n}\n\n.label-success {\n .label-variant(@label-success-bg);\n}\n\n.label-info {\n .label-variant(@label-info-bg);\n}\n\n.label-warning {\n .label-variant(@label-warning-bg);\n}\n\n.label-danger {\n .label-variant(@label-danger-bg);\n}\n","// Labels\n\n.label-variant(@color) {\n background-color: @color;\n\n &[href] {\n &:hover,\n &:focus {\n background-color: darken(@color, 10%);\n }\n }\n}\n","//\n// Badges\n// --------------------------------------------------\n\n\n// Base class\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: @font-size-small;\n font-weight: @badge-font-weight;\n color: @badge-color;\n line-height: @badge-line-height;\n vertical-align: middle;\n white-space: nowrap;\n text-align: center;\n background-color: @badge-bg;\n border-radius: @badge-border-radius;\n\n // Empty badges collapse automatically (not available in IE8)\n &:empty {\n display: none;\n }\n\n // Quick fix for badges in buttons\n .btn & {\n position: relative;\n top: -1px;\n }\n\n .btn-xs &,\n .btn-group-xs > .btn & {\n top: 0;\n padding: 1px 5px;\n }\n\n // Hover state, but only for links\n a& {\n &:hover,\n &:focus {\n color: @badge-link-hover-color;\n text-decoration: none;\n cursor: pointer;\n }\n }\n\n // Account for badges in navs\n .list-group-item.active > &,\n .nav-pills > .active > a > & {\n color: @badge-active-color;\n background-color: @badge-active-bg;\n }\n\n .list-group-item > & {\n float: right;\n }\n\n .list-group-item > & + & {\n margin-right: 5px;\n }\n\n .nav-pills > li > a > & {\n margin-left: 3px;\n }\n}\n","//\n// Jumbotron\n// --------------------------------------------------\n\n\n.jumbotron {\n padding-top: @jumbotron-padding;\n padding-bottom: @jumbotron-padding;\n margin-bottom: @jumbotron-padding;\n color: @jumbotron-color;\n background-color: @jumbotron-bg;\n\n h1,\n .h1 {\n color: @jumbotron-heading-color;\n }\n\n p {\n margin-bottom: (@jumbotron-padding / 2);\n font-size: @jumbotron-font-size;\n font-weight: 200;\n }\n\n > hr {\n border-top-color: darken(@jumbotron-bg, 10%);\n }\n\n .container &,\n .container-fluid & {\n border-radius: @border-radius-large; // Only round corners at higher resolutions if contained in a container\n }\n\n .container {\n max-width: 100%;\n }\n\n @media screen and (min-width: @screen-sm-min) {\n padding-top: (@jumbotron-padding * 1.6);\n padding-bottom: (@jumbotron-padding * 1.6);\n\n .container &,\n .container-fluid & {\n padding-left: (@jumbotron-padding * 2);\n padding-right: (@jumbotron-padding * 2);\n }\n\n h1,\n .h1 {\n font-size: @jumbotron-heading-font-size;\n }\n }\n}\n","//\n// Thumbnails\n// --------------------------------------------------\n\n\n// Mixin and adjust the regular image class\n.thumbnail {\n display: block;\n padding: @thumbnail-padding;\n margin-bottom: @line-height-computed;\n line-height: @line-height-base;\n background-color: @thumbnail-bg;\n border: 1px solid @thumbnail-border;\n border-radius: @thumbnail-border-radius;\n .transition(border .2s ease-in-out);\n\n > img,\n a > img {\n &:extend(.img-responsive);\n margin-left: auto;\n margin-right: auto;\n }\n\n // Add a hover state for linked versions only\n a&:hover,\n a&:focus,\n a&.active {\n border-color: @link-color;\n }\n\n // Image captions\n .caption {\n padding: @thumbnail-caption-padding;\n color: @thumbnail-caption-color;\n }\n}\n","//\n// Alerts\n// --------------------------------------------------\n\n\n// Base styles\n// -------------------------\n\n.alert {\n padding: @alert-padding;\n margin-bottom: @line-height-computed;\n border: 1px solid transparent;\n border-radius: @alert-border-radius;\n\n // Headings for larger alerts\n h4 {\n margin-top: 0;\n // Specified for the h4 to prevent conflicts of changing @headings-color\n color: inherit;\n }\n\n // Provide class for links that match alerts\n .alert-link {\n font-weight: @alert-link-font-weight;\n }\n\n // Improve alignment and spacing of inner content\n > p,\n > ul {\n margin-bottom: 0;\n }\n\n > p + p {\n margin-top: 5px;\n }\n}\n\n// Dismissible alerts\n//\n// Expand the right padding and account for the close button's positioning.\n\n.alert-dismissable, // The misspelled .alert-dismissable was deprecated in 3.2.0.\n.alert-dismissible {\n padding-right: (@alert-padding + 20);\n\n // Adjust close link position\n .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit;\n }\n}\n\n// Alternate styles\n//\n// Generate contextual modifier classes for colorizing the alert.\n\n.alert-success {\n .alert-variant(@alert-success-bg; @alert-success-border; @alert-success-text);\n}\n\n.alert-info {\n .alert-variant(@alert-info-bg; @alert-info-border; @alert-info-text);\n}\n\n.alert-warning {\n .alert-variant(@alert-warning-bg; @alert-warning-border; @alert-warning-text);\n}\n\n.alert-danger {\n .alert-variant(@alert-danger-bg; @alert-danger-border; @alert-danger-text);\n}\n","// Alerts\n\n.alert-variant(@background; @border; @text-color) {\n background-color: @background;\n border-color: @border;\n color: @text-color;\n\n hr {\n border-top-color: darken(@border, 5%);\n }\n .alert-link {\n color: darken(@text-color, 10%);\n }\n}\n","//\n// Progress bars\n// --------------------------------------------------\n\n\n// Bar animations\n// -------------------------\n\n// WebKit\n@-webkit-keyframes progress-bar-stripes {\n from { background-position: 40px 0; }\n to { background-position: 0 0; }\n}\n\n// Spec and IE10+\n@keyframes progress-bar-stripes {\n from { background-position: 40px 0; }\n to { background-position: 0 0; }\n}\n\n\n// Bar itself\n// -------------------------\n\n// Outer container\n.progress {\n overflow: hidden;\n height: @line-height-computed;\n margin-bottom: @line-height-computed;\n background-color: @progress-bg;\n border-radius: @progress-border-radius;\n .box-shadow(inset 0 1px 2px rgba(0,0,0,.1));\n}\n\n// Bar of progress\n.progress-bar {\n float: left;\n width: 0%;\n height: 100%;\n font-size: @font-size-small;\n line-height: @line-height-computed;\n color: @progress-bar-color;\n text-align: center;\n background-color: @progress-bar-bg;\n .box-shadow(inset 0 -1px 0 rgba(0,0,0,.15));\n .transition(width .6s ease);\n}\n\n// Striped bars\n//\n// `.progress-striped .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar-striped` class, which you just add to an existing\n// `.progress-bar`.\n.progress-striped .progress-bar,\n.progress-bar-striped {\n #gradient > .striped();\n background-size: 40px 40px;\n}\n\n// Call animation for the active one\n//\n// `.progress.active .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar.active` approach.\n.progress.active .progress-bar,\n.progress-bar.active {\n .animation(progress-bar-stripes 2s linear infinite);\n}\n\n\n// Variations\n// -------------------------\n\n.progress-bar-success {\n .progress-bar-variant(@progress-bar-success-bg);\n}\n\n.progress-bar-info {\n .progress-bar-variant(@progress-bar-info-bg);\n}\n\n.progress-bar-warning {\n .progress-bar-variant(@progress-bar-warning-bg);\n}\n\n.progress-bar-danger {\n .progress-bar-variant(@progress-bar-danger-bg);\n}\n","// Gradients\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-repeat: repeat-x;\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n","// Progress bars\n\n.progress-bar-variant(@color) {\n background-color: @color;\n\n // Deprecated parent class requirement as of v3.2.0\n .progress-striped & {\n #gradient > .striped();\n }\n}\n",".media {\n // Proper spacing between instances of .media\n margin-top: 15px;\n\n &:first-child {\n margin-top: 0;\n }\n}\n\n.media,\n.media-body {\n zoom: 1;\n overflow: hidden;\n}\n\n.media-body {\n width: 10000px;\n}\n\n.media-object {\n display: block;\n\n // Fix collapse in webkit from max-width: 100% and display: table-cell.\n &.img-thumbnail {\n max-width: none;\n }\n}\n\n.media-right,\n.media > .pull-right {\n padding-left: 10px;\n}\n\n.media-left,\n.media > .pull-left {\n padding-right: 10px;\n}\n\n.media-left,\n.media-right,\n.media-body {\n display: table-cell;\n vertical-align: top;\n}\n\n.media-middle {\n vertical-align: middle;\n}\n\n.media-bottom {\n vertical-align: bottom;\n}\n\n// Reset margins on headings for tighter default spacing\n.media-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n\n// Media list variation\n//\n// Undo default ul/ol styles\n.media-list {\n padding-left: 0;\n list-style: none;\n}\n","//\n// List groups\n// --------------------------------------------------\n\n\n// Base class\n//\n// Easily usable on <ul>, <ol>, or <div>.\n\n.list-group {\n // No need to set list-style: none; since .list-group-item is block level\n margin-bottom: 20px;\n padding-left: 0; // reset padding because ul and ol\n}\n\n\n// Individual list items\n//\n// Use on `li`s or `div`s within the `.list-group` parent.\n\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n // Place the border on the list items and negative margin up for better styling\n margin-bottom: -1px;\n background-color: @list-group-bg;\n border: 1px solid @list-group-border;\n\n // Round the first and last items\n &:first-child {\n .border-top-radius(@list-group-border-radius);\n }\n &:last-child {\n margin-bottom: 0;\n .border-bottom-radius(@list-group-border-radius);\n }\n}\n\n\n// Interactive list items\n//\n// Use anchor or button elements instead of `li`s or `div`s to create interactive items.\n// Includes an extra `.active` modifier class for showing selected items.\n\na.list-group-item,\nbutton.list-group-item {\n color: @list-group-link-color;\n\n .list-group-item-heading {\n color: @list-group-link-heading-color;\n }\n\n // Hover state\n &:hover,\n &:focus {\n text-decoration: none;\n color: @list-group-link-hover-color;\n background-color: @list-group-hover-bg;\n }\n}\n\nbutton.list-group-item {\n width: 100%;\n text-align: left;\n}\n\n.list-group-item {\n // Disabled state\n &.disabled,\n &.disabled:hover,\n &.disabled:focus {\n background-color: @list-group-disabled-bg;\n color: @list-group-disabled-color;\n cursor: @cursor-disabled;\n\n // Force color to inherit for custom content\n .list-group-item-heading {\n color: inherit;\n }\n .list-group-item-text {\n color: @list-group-disabled-text-color;\n }\n }\n\n // Active class on item itself, not parent\n &.active,\n &.active:hover,\n &.active:focus {\n z-index: 2; // Place active items above their siblings for proper border styling\n color: @list-group-active-color;\n background-color: @list-group-active-bg;\n border-color: @list-group-active-border;\n\n // Force color to inherit for custom content\n .list-group-item-heading,\n .list-group-item-heading > small,\n .list-group-item-heading > .small {\n color: inherit;\n }\n .list-group-item-text {\n color: @list-group-active-text-color;\n }\n }\n}\n\n\n// Contextual variants\n//\n// Add modifier classes to change text and background color on individual items.\n// Organizationally, this must come after the `:hover` states.\n\n.list-group-item-variant(success; @state-success-bg; @state-success-text);\n.list-group-item-variant(info; @state-info-bg; @state-info-text);\n.list-group-item-variant(warning; @state-warning-bg; @state-warning-text);\n.list-group-item-variant(danger; @state-danger-bg; @state-danger-text);\n\n\n// Custom content options\n//\n// Extra classes for creating well-formatted content within `.list-group-item`s.\n\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n","// List Groups\n\n.list-group-item-variant(@state; @background; @color) {\n .list-group-item-@{state} {\n color: @color;\n background-color: @background;\n\n a&,\n button& {\n color: @color;\n\n .list-group-item-heading {\n color: inherit;\n }\n\n &:hover,\n &:focus {\n color: @color;\n background-color: darken(@background, 5%);\n }\n &.active,\n &.active:hover,\n &.active:focus {\n color: #fff;\n background-color: @color;\n border-color: @color;\n }\n }\n }\n}\n","//\n// Panels\n// --------------------------------------------------\n\n\n// Base class\n.panel {\n margin-bottom: @line-height-computed;\n background-color: @panel-bg;\n border: 1px solid transparent;\n border-radius: @panel-border-radius;\n .box-shadow(0 1px 1px rgba(0,0,0,.05));\n}\n\n// Panel contents\n.panel-body {\n padding: @panel-body-padding;\n &:extend(.clearfix all);\n}\n\n// Optional heading\n.panel-heading {\n padding: @panel-heading-padding;\n border-bottom: 1px solid transparent;\n .border-top-radius((@panel-border-radius - 1));\n\n > .dropdown .dropdown-toggle {\n color: inherit;\n }\n}\n\n// Within heading, strip any `h*` tag of its default margins for spacing.\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: ceil((@font-size-base * 1.125));\n color: inherit;\n\n > a,\n > small,\n > .small,\n > small > a,\n > .small > a {\n color: inherit;\n }\n}\n\n// Optional footer (stays gray in every modifier class)\n.panel-footer {\n padding: @panel-footer-padding;\n background-color: @panel-footer-bg;\n border-top: 1px solid @panel-inner-border;\n .border-bottom-radius((@panel-border-radius - 1));\n}\n\n\n// List groups in panels\n//\n// By default, space out list group content from panel headings to account for\n// any kind of custom content between the two.\n\n.panel {\n > .list-group,\n > .panel-collapse > .list-group {\n margin-bottom: 0;\n\n .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n }\n\n // Add border top radius for first one\n &:first-child {\n .list-group-item:first-child {\n border-top: 0;\n .border-top-radius((@panel-border-radius - 1));\n }\n }\n\n // Add border bottom radius for last one\n &:last-child {\n .list-group-item:last-child {\n border-bottom: 0;\n .border-bottom-radius((@panel-border-radius - 1));\n }\n }\n }\n > .panel-heading + .panel-collapse > .list-group {\n .list-group-item:first-child {\n .border-top-radius(0);\n }\n }\n}\n// Collapse space between when there's no additional content.\n.panel-heading + .list-group {\n .list-group-item:first-child {\n border-top-width: 0;\n }\n}\n.list-group + .panel-footer {\n border-top-width: 0;\n}\n\n// Tables in panels\n//\n// Place a non-bordered `.table` within a panel (not within a `.panel-body`) and\n// watch it go full width.\n\n.panel {\n > .table,\n > .table-responsive > .table,\n > .panel-collapse > .table {\n margin-bottom: 0;\n\n caption {\n padding-left: @panel-body-padding;\n padding-right: @panel-body-padding;\n }\n }\n // Add border top radius for first one\n > .table:first-child,\n > .table-responsive:first-child > .table:first-child {\n .border-top-radius((@panel-border-radius - 1));\n\n > thead:first-child,\n > tbody:first-child {\n > tr:first-child {\n border-top-left-radius: (@panel-border-radius - 1);\n border-top-right-radius: (@panel-border-radius - 1);\n\n td:first-child,\n th:first-child {\n border-top-left-radius: (@panel-border-radius - 1);\n }\n td:last-child,\n th:last-child {\n border-top-right-radius: (@panel-border-radius - 1);\n }\n }\n }\n }\n // Add border bottom radius for last one\n > .table:last-child,\n > .table-responsive:last-child > .table:last-child {\n .border-bottom-radius((@panel-border-radius - 1));\n\n > tbody:last-child,\n > tfoot:last-child {\n > tr:last-child {\n border-bottom-left-radius: (@panel-border-radius - 1);\n border-bottom-right-radius: (@panel-border-radius - 1);\n\n td:first-child,\n th:first-child {\n border-bottom-left-radius: (@panel-border-radius - 1);\n }\n td:last-child,\n th:last-child {\n border-bottom-right-radius: (@panel-border-radius - 1);\n }\n }\n }\n }\n > .panel-body + .table,\n > .panel-body + .table-responsive,\n > .table + .panel-body,\n > .table-responsive + .panel-body {\n border-top: 1px solid @table-border-color;\n }\n > .table > tbody:first-child > tr:first-child th,\n > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n }\n > .table-bordered,\n > .table-responsive > .table-bordered {\n border: 0;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n }\n }\n > thead,\n > tbody {\n > tr:first-child {\n > td,\n > th {\n border-bottom: 0;\n }\n }\n }\n > tbody,\n > tfoot {\n > tr:last-child {\n > td,\n > th {\n border-bottom: 0;\n }\n }\n }\n }\n > .table-responsive {\n border: 0;\n margin-bottom: 0;\n }\n}\n\n\n// Collapsable panels (aka, accordion)\n//\n// Wrap a series of panels in `.panel-group` to turn them into an accordion with\n// the help of our collapse JavaScript plugin.\n\n.panel-group {\n margin-bottom: @line-height-computed;\n\n // Tighten up margin so it's only between panels\n .panel {\n margin-bottom: 0;\n border-radius: @panel-border-radius;\n\n + .panel {\n margin-top: 5px;\n }\n }\n\n .panel-heading {\n border-bottom: 0;\n\n + .panel-collapse > .panel-body,\n + .panel-collapse > .list-group {\n border-top: 1px solid @panel-inner-border;\n }\n }\n\n .panel-footer {\n border-top: 0;\n + .panel-collapse .panel-body {\n border-bottom: 1px solid @panel-inner-border;\n }\n }\n}\n\n\n// Contextual variations\n.panel-default {\n .panel-variant(@panel-default-border; @panel-default-text; @panel-default-heading-bg; @panel-default-border);\n}\n.panel-primary {\n .panel-variant(@panel-primary-border; @panel-primary-text; @panel-primary-heading-bg; @panel-primary-border);\n}\n.panel-success {\n .panel-variant(@panel-success-border; @panel-success-text; @panel-success-heading-bg; @panel-success-border);\n}\n.panel-info {\n .panel-variant(@panel-info-border; @panel-info-text; @panel-info-heading-bg; @panel-info-border);\n}\n.panel-warning {\n .panel-variant(@panel-warning-border; @panel-warning-text; @panel-warning-heading-bg; @panel-warning-border);\n}\n.panel-danger {\n .panel-variant(@panel-danger-border; @panel-danger-text; @panel-danger-heading-bg; @panel-danger-border);\n}\n","// Panels\n\n.panel-variant(@border; @heading-text-color; @heading-bg-color; @heading-border) {\n border-color: @border;\n\n & > .panel-heading {\n color: @heading-text-color;\n background-color: @heading-bg-color;\n border-color: @heading-border;\n\n + .panel-collapse > .panel-body {\n border-top-color: @border;\n }\n .badge {\n color: @heading-bg-color;\n background-color: @heading-text-color;\n }\n }\n & > .panel-footer {\n + .panel-collapse > .panel-body {\n border-bottom-color: @border;\n }\n }\n}\n","// Embeds responsive\n//\n// Credit: Nicolas Gallagher and SUIT CSS.\n\n.embed-responsive {\n position: relative;\n display: block;\n height: 0;\n padding: 0;\n overflow: hidden;\n\n .embed-responsive-item,\n iframe,\n embed,\n object,\n video {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n height: 100%;\n width: 100%;\n border: 0;\n }\n}\n\n// Modifier class for 16:9 aspect ratio\n.embed-responsive-16by9 {\n padding-bottom: 56.25%;\n}\n\n// Modifier class for 4:3 aspect ratio\n.embed-responsive-4by3 {\n padding-bottom: 75%;\n}\n","//\n// Wells\n// --------------------------------------------------\n\n\n// Base class\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: @well-bg;\n border: 1px solid @well-border;\n border-radius: @border-radius-base;\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.05));\n blockquote {\n border-color: #ddd;\n border-color: rgba(0,0,0,.15);\n }\n}\n\n// Sizes\n.well-lg {\n padding: 24px;\n border-radius: @border-radius-large;\n}\n.well-sm {\n padding: 9px;\n border-radius: @border-radius-small;\n}\n","//\n// Close icons\n// --------------------------------------------------\n\n\n.close {\n float: right;\n font-size: (@font-size-base * 1.5);\n font-weight: @close-font-weight;\n line-height: 1;\n color: @close-color;\n text-shadow: @close-text-shadow;\n .opacity(.2);\n\n &:hover,\n &:focus {\n color: @close-color;\n text-decoration: none;\n cursor: pointer;\n .opacity(.5);\n }\n\n // Additional properties for button version\n // iOS requires the button element instead of an anchor tag.\n // If you want the anchor version, it requires `href=\"#\"`.\n // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n button& {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n }\n}\n","//\n// Modals\n// --------------------------------------------------\n\n// .modal-open - body class for killing the scroll\n// .modal - container to scroll within\n// .modal-dialog - positioning shell for the actual modal\n// .modal-content - actual modal w/ bg and corners and shit\n\n// Kill the scroll on the body\n.modal-open {\n overflow: hidden;\n}\n\n// Container that the modal scrolls within\n.modal {\n display: none;\n overflow: hidden;\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: @zindex-modal;\n -webkit-overflow-scrolling: touch;\n\n // Prevent Chrome on Windows from adding a focus outline. For details, see\n // https://github.com/twbs/bootstrap/pull/10951.\n outline: 0;\n\n // When fading in the modal, animate it to slide down\n &.fade .modal-dialog {\n .translate(0, -25%);\n .transition-transform(~\"0.3s ease-out\");\n }\n &.in .modal-dialog { .translate(0, 0) }\n}\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n\n// Shell div to position the modal with bottom padding\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n\n// Actual modal\n.modal-content {\n position: relative;\n background-color: @modal-content-bg;\n border: 1px solid @modal-content-fallback-border-color; //old browsers fallback (ie8 etc)\n border: 1px solid @modal-content-border-color;\n border-radius: @border-radius-large;\n .box-shadow(0 3px 9px rgba(0,0,0,.5));\n background-clip: padding-box;\n // Remove focus outline from opened modal\n outline: 0;\n}\n\n// Modal background\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: @zindex-modal-background;\n background-color: @modal-backdrop-bg;\n // Fade for backdrop\n &.fade { .opacity(0); }\n &.in { .opacity(@modal-backdrop-opacity); }\n}\n\n// Modal header\n// Top section of the modal w/ title and dismiss\n.modal-header {\n padding: @modal-title-padding;\n border-bottom: 1px solid @modal-header-border-color;\n min-height: (@modal-title-padding + @modal-title-line-height);\n}\n// Close icon\n.modal-header .close {\n margin-top: -2px;\n}\n\n// Title text within header\n.modal-title {\n margin: 0;\n line-height: @modal-title-line-height;\n}\n\n// Modal body\n// Where all modal content resides (sibling of .modal-header and .modal-footer)\n.modal-body {\n position: relative;\n padding: @modal-inner-padding;\n}\n\n// Footer (for actions)\n.modal-footer {\n padding: @modal-inner-padding;\n text-align: right; // right align buttons\n border-top: 1px solid @modal-footer-border-color;\n &:extend(.clearfix all); // clear it in case folks use .pull-* classes on buttons\n\n // Properly space out buttons\n .btn + .btn {\n margin-left: 5px;\n margin-bottom: 0; // account for input[type=\"submit\"] which gets the bottom margin like all other inputs\n }\n // but override that for button groups\n .btn-group .btn + .btn {\n margin-left: -1px;\n }\n // and override it for block buttons as well\n .btn-block + .btn-block {\n margin-left: 0;\n }\n}\n\n// Measure scrollbar width for padding body during modal show/hide\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n\n// Scale up the modal\n@media (min-width: @screen-sm-min) {\n // Automatically set modal's width for larger viewports\n .modal-dialog {\n width: @modal-md;\n margin: 30px auto;\n }\n .modal-content {\n .box-shadow(0 5px 15px rgba(0,0,0,.5));\n }\n\n // Modal sizes\n .modal-sm { width: @modal-sm; }\n}\n\n@media (min-width: @screen-md-min) {\n .modal-lg { width: @modal-lg; }\n}\n","//\n// Tooltips\n// --------------------------------------------------\n\n\n// Base class\n.tooltip {\n position: absolute;\n z-index: @zindex-tooltip;\n display: block;\n // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.\n // So reset our font and text properties to avoid inheriting weird values.\n .reset-text();\n font-size: @font-size-small;\n\n .opacity(0);\n\n &.in { .opacity(@tooltip-opacity); }\n &.top { margin-top: -3px; padding: @tooltip-arrow-width 0; }\n &.right { margin-left: 3px; padding: 0 @tooltip-arrow-width; }\n &.bottom { margin-top: 3px; padding: @tooltip-arrow-width 0; }\n &.left { margin-left: -3px; padding: 0 @tooltip-arrow-width; }\n}\n\n// Wrapper for the tooltip content\n.tooltip-inner {\n max-width: @tooltip-max-width;\n padding: 3px 8px;\n color: @tooltip-color;\n text-align: center;\n background-color: @tooltip-bg;\n border-radius: @border-radius-base;\n}\n\n// Arrows\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n// Note: Deprecated .top-left, .top-right, .bottom-left, and .bottom-right as of v3.3.1\n.tooltip {\n &.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.top-left .tooltip-arrow {\n bottom: 0;\n right: @tooltip-arrow-width;\n margin-bottom: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.top-right .tooltip-arrow {\n bottom: 0;\n left: @tooltip-arrow-width;\n margin-bottom: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width @tooltip-arrow-width 0;\n border-right-color: @tooltip-arrow-color;\n }\n &.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-left-color: @tooltip-arrow-color;\n }\n &.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n &.bottom-left .tooltip-arrow {\n top: 0;\n right: @tooltip-arrow-width;\n margin-top: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n &.bottom-right .tooltip-arrow {\n top: 0;\n left: @tooltip-arrow-width;\n margin-top: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n}\n",".reset-text() {\n font-family: @font-family-base;\n // We deliberately do NOT reset font-size.\n font-style: normal;\n font-weight: normal;\n letter-spacing: normal;\n line-break: auto;\n line-height: @line-height-base;\n text-align: left; // Fallback for where `start` is not supported\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n white-space: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n}\n","//\n// Popovers\n// --------------------------------------------------\n\n\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: @zindex-popover;\n display: none;\n max-width: @popover-max-width;\n padding: 1px;\n // Our parent element can be arbitrary since popovers are by default inserted as a sibling of their target element.\n // So reset our font and text properties to avoid inheriting weird values.\n .reset-text();\n font-size: @font-size-base;\n\n background-color: @popover-bg;\n background-clip: padding-box;\n border: 1px solid @popover-fallback-border-color;\n border: 1px solid @popover-border-color;\n border-radius: @border-radius-large;\n .box-shadow(0 5px 10px rgba(0,0,0,.2));\n\n // Offset the popover to account for the popover arrow\n &.top { margin-top: -@popover-arrow-width; }\n &.right { margin-left: @popover-arrow-width; }\n &.bottom { margin-top: @popover-arrow-width; }\n &.left { margin-left: -@popover-arrow-width; }\n}\n\n.popover-title {\n margin: 0; // reset heading margin\n padding: 8px 14px;\n font-size: @font-size-base;\n background-color: @popover-title-bg;\n border-bottom: 1px solid darken(@popover-title-bg, 5%);\n border-radius: (@border-radius-large - 1) (@border-radius-large - 1) 0 0;\n}\n\n.popover-content {\n padding: 9px 14px;\n}\n\n// Arrows\n//\n// .arrow is outer, .arrow:after is inner\n\n.popover > .arrow {\n &,\n &:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n }\n}\n.popover > .arrow {\n border-width: @popover-arrow-outer-width;\n}\n.popover > .arrow:after {\n border-width: @popover-arrow-width;\n content: \"\";\n}\n\n.popover {\n &.top > .arrow {\n left: 50%;\n margin-left: -@popover-arrow-outer-width;\n border-bottom-width: 0;\n border-top-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-top-color: @popover-arrow-outer-color;\n bottom: -@popover-arrow-outer-width;\n &:after {\n content: \" \";\n bottom: 1px;\n margin-left: -@popover-arrow-width;\n border-bottom-width: 0;\n border-top-color: @popover-arrow-color;\n }\n }\n &.right > .arrow {\n top: 50%;\n left: -@popover-arrow-outer-width;\n margin-top: -@popover-arrow-outer-width;\n border-left-width: 0;\n border-right-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-right-color: @popover-arrow-outer-color;\n &:after {\n content: \" \";\n left: 1px;\n bottom: -@popover-arrow-width;\n border-left-width: 0;\n border-right-color: @popover-arrow-color;\n }\n }\n &.bottom > .arrow {\n left: 50%;\n margin-left: -@popover-arrow-outer-width;\n border-top-width: 0;\n border-bottom-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-bottom-color: @popover-arrow-outer-color;\n top: -@popover-arrow-outer-width;\n &:after {\n content: \" \";\n top: 1px;\n margin-left: -@popover-arrow-width;\n border-top-width: 0;\n border-bottom-color: @popover-arrow-color;\n }\n }\n\n &.left > .arrow {\n top: 50%;\n right: -@popover-arrow-outer-width;\n margin-top: -@popover-arrow-outer-width;\n border-right-width: 0;\n border-left-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-left-color: @popover-arrow-outer-color;\n &:after {\n content: \" \";\n right: 1px;\n border-right-width: 0;\n border-left-color: @popover-arrow-color;\n bottom: -@popover-arrow-width;\n }\n }\n}\n","//\n// Carousel\n// --------------------------------------------------\n\n\n// Wrapper for the slide container and indicators\n.carousel {\n position: relative;\n}\n\n.carousel-inner {\n position: relative;\n overflow: hidden;\n width: 100%;\n\n > .item {\n display: none;\n position: relative;\n .transition(.6s ease-in-out left);\n\n // Account for jankitude on images\n > img,\n > a > img {\n &:extend(.img-responsive);\n line-height: 1;\n }\n\n // WebKit CSS3 transforms for supported devices\n @media all and (transform-3d), (-webkit-transform-3d) {\n .transition-transform(~'0.6s ease-in-out');\n .backface-visibility(~'hidden');\n .perspective(1000px);\n\n &.next,\n &.active.right {\n .translate3d(100%, 0, 0);\n left: 0;\n }\n &.prev,\n &.active.left {\n .translate3d(-100%, 0, 0);\n left: 0;\n }\n &.next.left,\n &.prev.right,\n &.active {\n .translate3d(0, 0, 0);\n left: 0;\n }\n }\n }\n\n > .active,\n > .next,\n > .prev {\n display: block;\n }\n\n > .active {\n left: 0;\n }\n\n > .next,\n > .prev {\n position: absolute;\n top: 0;\n width: 100%;\n }\n\n > .next {\n left: 100%;\n }\n > .prev {\n left: -100%;\n }\n > .next.left,\n > .prev.right {\n left: 0;\n }\n\n > .active.left {\n left: -100%;\n }\n > .active.right {\n left: 100%;\n }\n\n}\n\n// Left/right controls for nav\n// ---------------------------\n\n.carousel-control {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n width: @carousel-control-width;\n .opacity(@carousel-control-opacity);\n font-size: @carousel-control-font-size;\n color: @carousel-control-color;\n text-align: center;\n text-shadow: @carousel-text-shadow;\n // We can't have this transition here because WebKit cancels the carousel\n // animation if you trip this while in the middle of another animation.\n\n // Set gradients for backgrounds\n &.left {\n #gradient > .horizontal(@start-color: rgba(0,0,0,.5); @end-color: rgba(0,0,0,.0001));\n }\n &.right {\n left: auto;\n right: 0;\n #gradient > .horizontal(@start-color: rgba(0,0,0,.0001); @end-color: rgba(0,0,0,.5));\n }\n\n // Hover/focus state\n &:hover,\n &:focus {\n outline: 0;\n color: @carousel-control-color;\n text-decoration: none;\n .opacity(.9);\n }\n\n // Toggles\n .icon-prev,\n .icon-next,\n .glyphicon-chevron-left,\n .glyphicon-chevron-right {\n position: absolute;\n top: 50%;\n margin-top: -10px;\n z-index: 5;\n display: inline-block;\n }\n .icon-prev,\n .glyphicon-chevron-left {\n left: 50%;\n margin-left: -10px;\n }\n .icon-next,\n .glyphicon-chevron-right {\n right: 50%;\n margin-right: -10px;\n }\n .icon-prev,\n .icon-next {\n width: 20px;\n height: 20px;\n line-height: 1;\n font-family: serif;\n }\n\n\n .icon-prev {\n &:before {\n content: '\\2039';// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039)\n }\n }\n .icon-next {\n &:before {\n content: '\\203a';// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A)\n }\n }\n}\n\n// Optional indicator pips\n//\n// Add an unordered list with the following class and add a list item for each\n// slide your carousel holds.\n\n.carousel-indicators {\n position: absolute;\n bottom: 10px;\n left: 50%;\n z-index: 15;\n width: 60%;\n margin-left: -30%;\n padding-left: 0;\n list-style: none;\n text-align: center;\n\n li {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin: 1px;\n text-indent: -999px;\n border: 1px solid @carousel-indicator-border-color;\n border-radius: 10px;\n cursor: pointer;\n\n // IE8-9 hack for event handling\n //\n // Internet Explorer 8-9 does not support clicks on elements without a set\n // `background-color`. We cannot use `filter` since that's not viewed as a\n // background color by the browser. Thus, a hack is needed.\n // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Internet_Explorer\n //\n // For IE8, we set solid black as it doesn't support `rgba()`. For IE9, we\n // set alpha transparency for the best results possible.\n background-color: #000 \\9; // IE8\n background-color: rgba(0,0,0,0); // IE9\n }\n .active {\n margin: 0;\n width: 12px;\n height: 12px;\n background-color: @carousel-indicator-active-bg;\n }\n}\n\n// Optional captions\n// -----------------------------\n// Hidden by default for smaller viewports\n.carousel-caption {\n position: absolute;\n left: 15%;\n right: 15%;\n bottom: 20px;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: @carousel-caption-color;\n text-align: center;\n text-shadow: @carousel-text-shadow;\n & .btn {\n text-shadow: none; // No shadow for button elements in carousel-caption\n }\n}\n\n\n// Scale up controls for tablets and up\n@media screen and (min-width: @screen-sm-min) {\n\n // Scale up the controls a smidge\n .carousel-control {\n .glyphicon-chevron-left,\n .glyphicon-chevron-right,\n .icon-prev,\n .icon-next {\n width: 30px;\n height: 30px;\n margin-top: -15px;\n font-size: 30px;\n }\n .glyphicon-chevron-left,\n .icon-prev {\n margin-left: -15px;\n }\n .glyphicon-chevron-right,\n .icon-next {\n margin-right: -15px;\n }\n }\n\n // Show and left align the captions\n .carousel-caption {\n left: 20%;\n right: 20%;\n padding-bottom: 30px;\n }\n\n // Move up the indicators\n .carousel-indicators {\n bottom: 20px;\n }\n}\n","// Clearfix\n//\n// For modern browsers\n// 1. The space content is one way to avoid an Opera bug when the\n// contenteditable attribute is included anywhere else in the document.\n// Otherwise it causes space to appear at the top and bottom of elements\n// that are clearfixed.\n// 2. The use of `table` rather than `block` is only necessary if using\n// `:before` to contain the top-margins of child elements.\n//\n// Source: http://nicolasgallagher.com/micro-clearfix-hack/\n\n.clearfix() {\n &:before,\n &:after {\n content: \" \"; // 1\n display: table; // 2\n }\n &:after {\n clear: both;\n }\n}\n","// Center-align a block level element\n\n.center-block() {\n display: block;\n margin-left: auto;\n margin-right: auto;\n}\n","// CSS image replacement\n//\n// Heads up! v3 launched with only `.hide-text()`, but per our pattern for\n// mixins being reused as classes with the same name, this doesn't hold up. As\n// of v3.0.1 we have added `.text-hide()` and deprecated `.hide-text()`.\n//\n// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757\n\n// Deprecated as of v3.0.1 (will be removed in v4)\n.hide-text() {\n font: ~\"0/0\" a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n\n// New mixin to use as of v3.0.1\n.text-hide() {\n .hide-text();\n}\n","//\n// Responsive: Utility classes\n// --------------------------------------------------\n\n\n// IE10 in Windows (Phone) 8\n//\n// Support for responsive views via media queries is kind of borked in IE10, for\n// Surface/desktop in split view and for Windows Phone 8. This particular fix\n// must be accompanied by a snippet of JavaScript to sniff the user agent and\n// apply some conditional CSS to *only* the Surface/desktop Windows 8. Look at\n// our Getting Started page for more information on this bug.\n//\n// For more information, see the following:\n//\n// Issue: https://github.com/twbs/bootstrap/issues/10497\n// Docs: http://getbootstrap.com/getting-started/#support-ie10-width\n// Source: http://timkadlec.com/2013/01/windows-phone-8-and-device-width/\n// Source: http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/\n\n@-ms-viewport {\n width: device-width;\n}\n\n\n// Visibility utilities\n// Note: Deprecated .visible-xs, .visible-sm, .visible-md, and .visible-lg as of v3.2.0\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n .responsive-invisibility();\n}\n\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n display: none !important;\n}\n\n.visible-xs {\n @media (max-width: @screen-xs-max) {\n .responsive-visibility();\n }\n}\n.visible-xs-block {\n @media (max-width: @screen-xs-max) {\n display: block !important;\n }\n}\n.visible-xs-inline {\n @media (max-width: @screen-xs-max) {\n display: inline !important;\n }\n}\n.visible-xs-inline-block {\n @media (max-width: @screen-xs-max) {\n display: inline-block !important;\n }\n}\n\n.visible-sm {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n .responsive-visibility();\n }\n}\n.visible-sm-block {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: block !important;\n }\n}\n.visible-sm-inline {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: inline !important;\n }\n}\n.visible-sm-inline-block {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: inline-block !important;\n }\n}\n\n.visible-md {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n .responsive-visibility();\n }\n}\n.visible-md-block {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: block !important;\n }\n}\n.visible-md-inline {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: inline !important;\n }\n}\n.visible-md-inline-block {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: inline-block !important;\n }\n}\n\n.visible-lg {\n @media (min-width: @screen-lg-min) {\n .responsive-visibility();\n }\n}\n.visible-lg-block {\n @media (min-width: @screen-lg-min) {\n display: block !important;\n }\n}\n.visible-lg-inline {\n @media (min-width: @screen-lg-min) {\n display: inline !important;\n }\n}\n.visible-lg-inline-block {\n @media (min-width: @screen-lg-min) {\n display: inline-block !important;\n }\n}\n\n.hidden-xs {\n @media (max-width: @screen-xs-max) {\n .responsive-invisibility();\n }\n}\n.hidden-sm {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n .responsive-invisibility();\n }\n}\n.hidden-md {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n .responsive-invisibility();\n }\n}\n.hidden-lg {\n @media (min-width: @screen-lg-min) {\n .responsive-invisibility();\n }\n}\n\n\n// Print utilities\n//\n// Media queries are placed on the inside to be mixin-friendly.\n\n// Note: Deprecated .visible-print as of v3.2.0\n.visible-print {\n .responsive-invisibility();\n\n @media print {\n .responsive-visibility();\n }\n}\n.visible-print-block {\n display: none !important;\n\n @media print {\n display: block !important;\n }\n}\n.visible-print-inline {\n display: none !important;\n\n @media print {\n display: inline !important;\n }\n}\n.visible-print-inline-block {\n display: none !important;\n\n @media print {\n display: inline-block !important;\n }\n}\n\n.hidden-print {\n @media print {\n .responsive-invisibility();\n }\n}\n","// Responsive utilities\n\n//\n// More easily include all the states for responsive-utilities.less.\n.responsive-visibility() {\n display: block !important;\n table& { display: table !important; }\n tr& { display: table-row !important; }\n th&,\n td& { display: table-cell !important; }\n}\n\n.responsive-invisibility() {\n display: none !important;\n}\n"]} \ No newline at end of file
diff --git a/addons/web/static/lib/bootstrap/css/bootstrap.min.css b/addons/web/static/lib/bootstrap/css/bootstrap.min.css
deleted file mode 100644
index d65c66b1ba2..00000000000
--- a/addons/web/static/lib/bootstrap/css/bootstrap.min.css
+++ /dev/null
@@ -1,5 +0,0 @@
-/*!
- * Bootstrap v3.3.5 (http://getbootstrap.com)
- * Copyright 2011-2015 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:14.33px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:3;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:2;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{min-height:16.43px;padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;filter:alpha(opacity=0);opacity:0;line-break:auto}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);line-break:auto}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000\9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}} \ No newline at end of file
diff --git a/addons/web/static/lib/nvd3/d3.v3.js b/addons/web/static/lib/nvd3/d3.v3.js
index e4d8664329e..e4d8664329e 100755..100644
--- a/addons/web/static/lib/nvd3/d3.v3.js
+++ b/addons/web/static/lib/nvd3/d3.v3.js
diff --git a/addons/web/static/lib/py.js/.hg_archival.txt b/addons/web/static/lib/py.js/.hg_archival.txt
deleted file mode 100644
index 94f4a9ad6e8..00000000000
--- a/addons/web/static/lib/py.js/.hg_archival.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-repo: 076b192d0d8ab2b92d1dbcfa3da055382f30eaea
-node: 7ee0bc7b4e9138f485cdc9ec791961d8ef452f17
-branch: default
-latesttag: 0.7
-latesttagdistance: 11
diff --git a/addons/web/static/src/css/data_export.css b/addons/web/static/src/css/data_export.css
deleted file mode 100644
index b9b885cd8e9..00000000000
--- a/addons/web/static/src/css/data_export.css
+++ /dev/null
@@ -1,89 +0,0 @@
-.openerp .oe_export {
- width: 100%;
-}
-/* Customize according bootstrap3 */
-.openerp .oe_export label {
- font-weight: normal;
-}
-/* End of customize */
-.openerp .oe_export_row tr{
- background-color: #FFFFFF;
- font-size: 0.8em;
- height: 22px;
-}
-
-.openerp tr.ui-selected td {
- background-color: #CCCCCC;
-}
-
-.openerp .oe_export_requiredfield {
- background-color: #D2D2FF;
-}
-
-.openerp .oe_export_readonlyfield{
- background-color: #999999;
-}
-
-.openerp .oe_export_row:hover{
- background-color: #F3F3F3;
-}
-
-.openerp .oe_export_fields_selector_left {
- width: 50%;
-}
-
-.openerp div#left_field_panel {
- overflow: scroll;
- width: 100%;
- height: 400px;
- border: solid #999999 1px;
-}
-.openerp div#left_field_panel table {
- width: 100%;
-}
-
-.openerp .oe_export_fields_selector_center {
- text-align: center;
-}
-.openerp .oe_export_fields_selector_center button {
- white-space: nowrap;
-}
-
-.openerp .oe_export_fields_selector_right {
- width: 45%;
- height: 400px;
-}
-
-.openerp .oe_export_fields_selector_right select{
- width: 100%;
- height: 100%;
-}
-
-.openerp .oe_export_tree_header{
- border: 0.5px solid #E3E3E3;
- text-align: left;
- white-space: nowrap;
- padding: 4px 5px;
- background: url(/web/static/src/img/header.gif);
-}
-
-
-.openerp table.tree_grid{
- border: 1px solid #E3E3E3;
- text-align: left;
- white-space: nowrap;
- background-color:#E3E3E3;
- border-collapse: collapse;
- width: 100%;
-}
-
-.openerp table.tree_grid a:hover {
- color: blue;
- border: none;
-}
-
-.openerp table.tree_grid a {
- color: #5F5C5C;
- border: none;
- display: block;
-}
diff --git a/addons/web/static/src/css/full.css b/addons/web/static/src/css/full.css
deleted file mode 100644
index 2692792d46d..00000000000
--- a/addons/web/static/src/css/full.css
+++ /dev/null
@@ -1,12 +0,0 @@
-/* This css contains the styling specific to the 'normal mode'. (as opposite to the embedded mode) */
-/* In embedded mode [1], this stylesheet won't be loaded. */
-
-/* [1] The web client features an embedded mode in which the webclient */
-/* or a part of it can be started in any element of any webpage host. */
-
-body {
- padding: 0;
- margin: 0;
- overflow-y: scroll;
- height: 100%;
-}
diff --git a/addons/web/static/src/css/ie.css b/addons/web/static/src/css/ie.css
deleted file mode 100644
index a547120033e..00000000000
--- a/addons/web/static/src/css/ie.css
+++ /dev/null
@@ -1,29 +0,0 @@
-/** base */
-.openerp .oe_form label + .oe_form_field.oe_form_field_one2many {
- display: block;
-}
-.openerp .oe_leftbar > div > div > div > div.oe_secondary_menus_container {
- position: static;
-}
-.openerp .oe_application > div > .oe_view_manager > .oe_view_manager_wrapper > div > .oe_view_manager_body {
- position: static;
-}
-
-/** web_calendar */
-.fc .ui-draggable-dragging .fc-event-bg, /* TODO: something nicer like .fc-opacity */
-.fc-select-helper .fc-event-bg {
- display: none; /* for IE6/7/8. nested opacity filters while dragging don't work */
-}
-
-/** web_graph */
-.openerp svg:not(:root) { /* width and height are not take in consideration */
- overflow: visible;
-}
-.graph_main_content.graph_chart_mode > div > svg {
- min-height: 521px;
-}
-
-/** web_kanban */
-.openerp .oe_kanban_column_cards {
- min-height: 80px;
-}
diff --git a/addons/web/static/src/img/down-arrow.png b/addons/web/static/src/img/down-arrow.png
deleted file mode 100644
index 0f473e13e84..00000000000
--- a/addons/web/static/src/img/down-arrow.png
+++ /dev/null
Binary files differ
diff --git a/addons/web/static/src/js/abstract_web_client.js b/addons/web/static/src/js/abstract_web_client.js
new file mode 100644
index 00000000000..31aa0d6f3dd
--- /dev/null
+++ b/addons/web/static/src/js/abstract_web_client.js
@@ -0,0 +1,245 @@
+odoo.define('web.AbstractWebClient', function (require) {
+"use strict";
+
+var ActionManager = require('web.ActionManager');
+var core = require('web.core');
+var crash_manager = require('web.crash_manager');
+var Loading = require('web.Loading');
+var NotificationManager = require('web.notification').NotificationManager;
+var session = require('web.session');
+var utils = require('web.utils');
+var Widget = require('web.Widget');
+
+var _t = core._t;
+
+var WebClient = Widget.extend({
+ custom_events: {
+ notification: function (e) {
+ if(this.notification_manager) {
+ this.notification_manager.notify(e.data.title, e.data.message, e.data.sticky);
+ }
+ },
+ warning: function (e) {
+ if(this.notification_manager) {
+ this.notification_manager.warn(e.data.title, e.data.message, e.data.sticky);
+ }
+ },
+ clear_uncommitted_changes: function (e) {
+ this.clear_uncommitted_changes().then(e.data.callback);
+ },
+ },
+ init: function(parent, client_options) {
+ this.client_options = {};
+ this._super(parent);
+ this.origin = undefined;
+ if (client_options) {
+ _.extend(this.client_options, client_options);
+ }
+ this._current_state = null;
+ this.menu_dm = new utils.DropMisordered();
+ this.action_mutex = new utils.Mutex();
+ this.set('title_part', {"zopenerp": "Odoo"});
+ },
+ start: function() {
+ var self = this;
+
+ this.on("change:title_part", this, this._title_changed);
+ this._title_changed();
+
+ return session.session_bind(this.origin)
+ .then(function () {
+ self.bind_events();
+ return $.when(
+ self.set_action_manager(),
+ self.set_notification_manager(),
+ self.set_loading()
+ );
+ }).then(function () {
+ if (session.session_is_valid()) {
+ return self.show_application();
+ } else {
+ // database manager needs the webclient to keep going even
+ // though it has no valid session
+ return $.when();
+ }
+ }).then(function () {
+ if (self.client_options.action) {
+ self.do_action(self.client_options.action);
+ delete(self.client_options.action);
+ }
+ core.bus.trigger('web_client_ready');
+ });
+ },
+ bind_events: function() {
+ var self = this;
+ $('.oe_systray').show();
+ this.$el.on('mouseenter', '.oe_systray > div:not([data-toggle=tooltip])', function() {
+ $(this).attr('data-toggle', 'tooltip').tooltip().trigger('mouseenter');
+ });
+ this.$el.on('click', '.oe_dropdown_toggle', function(ev) {
+ ev.preventDefault();
+ var $toggle = $(this);
+ var doc_width = $(document).width();
+ var $menu = $toggle.siblings('.oe_dropdown_menu');
+ $menu = $menu.size() >= 1 ? $menu : $toggle.find('.oe_dropdown_menu');
+ var state = $menu.is('.oe_opened');
+ setTimeout(function() {
+ // Do not alter propagation
+ $toggle.add($menu).toggleClass('oe_opened', !state);
+ if (!state) {
+ // Move $menu if outside window's edge
+ var offset = $menu.offset();
+ var menu_width = $menu.width();
+ var x = doc_width - offset.left - menu_width - 2;
+ if (x < 0) {
+ $menu.offset({ left: offset.left + x }).width(menu_width);
+ }
+ }
+ }, 0);
+ });
+ core.bus.on('click', this, function(ev) {
+ $('.tooltip').remove();
+ if (!$(ev.target).is('input[type=file]')) {
+ self.$('.oe_dropdown_menu.oe_opened, .oe_dropdown_toggle.oe_opened').removeClass('oe_opened');
+ }
+ });
+ core.bus.on('set_full_screen', this, function (full_screen) {
+ this.set_content_full_screen(full_screen);
+ });
+ core.bus.on('connection_lost', this, this.on_connection_lost);
+ core.bus.on('connection_restored', this, this.on_connection_restored);
+
+ // crash manager integration
+ session.on('error', crash_manager, crash_manager.rpc_error);
+ window.onerror = function (message, file, line, col, error) {
+ var traceback = error ? error.stack : '';
+ crash_manager.show_error({
+ type: _t("Client Error"),
+ message: message,
+ data: {debug: file + ':' + line + "\n" + _t('Traceback:') + "\n" + traceback}
+ });
+ };
+ },
+ set_action_manager: function() {
+ this.action_manager = new ActionManager(this, {webclient: this});
+ return this.action_manager.appendTo(this.$('.o_main_content'));
+ },
+ set_notification_manager: function() {
+ this.notification_manager = new NotificationManager(this);
+ return this.notification_manager.appendTo(this.$el);
+ },
+ set_loading: function() {
+ this.loading = new Loading(this);
+ return this.loading.appendTo(this.$el);
+ },
+ show_application: function() {
+ },
+ clear_uncommitted_changes: function() {
+ var def = $.Deferred().resolve();
+ core.bus.trigger('clear_uncommitted_changes', function chain_callbacks(callback) {
+ def = def.then(callback);
+ });
+ return def;
+ },
+ destroy_content: function() {
+ _.each(_.clone(this.getChildren()), function(el) {
+ el.destroy();
+ });
+ this.$el.children().remove();
+ },
+ // --------------------------------------------------------------
+ // Window title handling
+ // --------------------------------------------------------------
+ /**
+ Sets the first part of the title of the window, dedicated to the current action.
+ */
+ set_title: function(title) {
+ this.set_title_part("action", title);
+ },
+ /**
+ Sets an arbitrary part of the title of the window. Title parts are identified by strings. Each time
+ a title part is changed, all parts are gathered, ordered by alphabetical order and displayed in the
+ title of the window separated by '-'.
+ */
+ set_title_part: function(part, title) {
+ var tmp = _.clone(this.get("title_part"));
+ tmp[part] = title;
+ this.set("title_part", tmp);
+ },
+ _title_changed: function() {
+ var parts = _.sortBy(_.keys(this.get("title_part")), function(x) { return x; });
+ var tmp = "";
+ _.each(parts, function(part) {
+ var str = this.get("title_part")[part];
+ if (str) {
+ tmp = tmp ? tmp + " - " + str : str;
+ }
+ }, this);
+ document.title = tmp;
+ },
+ // --------------------------------------------------------------
+ // do_*
+ // --------------------------------------------------------------
+ /**
+ * When do_action is performed on the WebClient, forward it to the main ActionManager
+ * This allows to widgets that are not inside the ActionManager to perform do_action
+ */
+ do_action: function() {
+ return this.action_manager.do_action.apply(this, arguments);
+ },
+ do_reload: function() {
+ var self = this;
+ return this.session.session_reload().then(function () {
+ session.load_modules(true).then(
+ self.menu.proxy('do_reload'));
+ });
+ },
+ do_push_state: function(state) {
+ if ('title' in state) {
+ this.set_title(state.title);
+ delete state.title;
+ }
+ var url = '#' + $.param(state);
+ this._current_state = $.deparam($.param(state), false); // stringify all values
+ $.bbq.pushState(url);
+ this.trigger('state_pushed', state);
+ },
+ // --------------------------------------------------------------
+ // Connection notifications
+ // --------------------------------------------------------------
+ on_connection_lost: function () {
+ this.connection_notification = this.notification_manager.notify(
+ _t('Connection lost'),
+ _t('Trying to reconnect...'),
+ true
+ );
+ },
+ on_connection_restored: function () {
+ if (this.connection_notification) {
+ this.connection_notification.destroy();
+ this.notification_manager.notify(
+ _t('Connection restored'),
+ _t('You are back online'),
+ false
+ );
+ this.connection_notification = false;
+ }
+ },
+ // --------------------------------------------------------------
+ // Scrolltop handling
+ // --------------------------------------------------------------
+ get_scrollTop: function () {
+ },
+ //--------------------------------------------------------------
+ // Misc.
+ //--------------------------------------------------------------
+ set_content_full_screen: function(fullscreen) {
+ $(document.body).css('overflow-y', fullscreen ? 'hidden' : 'scroll');
+ this.$('.oe_webclient').toggleClass(
+ 'oe_content_full_screen', fullscreen);
+ },
+});
+
+return WebClient;
+
+});
diff --git a/addons/web/static/src/js/action_manager.js b/addons/web/static/src/js/action_manager.js
index 359b174a28d..be5e6c6c996 100644
--- a/addons/web/static/src/js/action_manager.js
+++ b/addons/web/static/src/js/action_manager.js
@@ -23,24 +23,17 @@ var Action = core.Class.extend({
this.title = action.display_name || action.name;
},
/**
- * Not implemented for client actions
- * @return {Deferred} a rejected Deferred
- */
- appendTo: function() {
- return $.Deferred().reject();
- },
- /**
* This method should restore this previously loaded action
- * Calls on_reverse_breadcrumb callback if defined
+ * Calls on_reverse_breadcrumb_callback if defined
* @return {Deferred} resolved when widget is enabled
*/
restore: function() {
- if (this.on_reverse_breadcrumb) {
- return this.on_reverse_breadcrumb();
+ if (this.on_reverse_breadcrumb_callback) {
+ return this.on_reverse_breadcrumb_callback();
}
},
/**
- * Not implemented for functions
+ * There is nothing to detach in the case of a client function
*/
detach: function() {
},
@@ -50,11 +43,16 @@ var Action = core.Class.extend({
destroy: function() {
},
/**
- * Sets the on_reverse_breadcrumb callback to be called when coming back to that action
- * @param {Function} [on_reverse_breadcrumb] the callback
+ * Sets the on_reverse_breadcrumb_callback to be called when coming back to that action
+ * @param {Function} [callback] the callback
+ */
+ set_on_reverse_breadcrumb: function(callback) {
+ this.on_reverse_breadcrumb_callback = callback;
+ },
+ /**
+ * Not implemented for client actions
*/
- set_on_reverse_breadcrumb: function(on_reverse_breadcrumb) {
- this.on_reverse_breadcrumb = on_reverse_breadcrumb;
+ set_scrollTop: function() {
},
/**
* Stores the DOM fragment of the action
@@ -65,8 +63,10 @@ var Action = core.Class.extend({
},
/**
* Not implemented for client actions
+ * @return {int} the number of pixels the webclient is scrolled when leaving the action
*/
- set_is_in_DOM: function() {
+ get_scrollTop: function() {
+ return 0;
},
/**
* @return {Object} the description of the action
@@ -113,16 +113,6 @@ var WidgetAction = Action.extend({
});
},
/**
- * Wraps the action's widget in a container and appends it to el
- * @param {DocumentFragment} [el] where to append the widget
- * @return {Deferred} resolved when the widget is appended
- */
- appendTo: function(el) {
- this.$client_action_container = $('<div>').addClass('oe_client_action');
- this.$client_action_container.appendTo(el);
- return this.widget.appendTo(this.$client_action_container);
- },
- /**
* Restores WidgetAction by calling do_show on its widget
*/
restore: function() {
@@ -132,18 +122,20 @@ var WidgetAction = Action.extend({
});
},
/**
- * Detaches the client action's container from the DOM
- * @return {jQuery} the action's container
+ * Detaches the action's widget from the DOM
+ * @return the widget's $el
*/
detach: function() {
- return this.$client_action_container.detach();
+ // Hack to remove badly inserted nvd3 tooltips ; should be removed when upgrading nvd3 lib
+ $('body > .nvtooltip').remove();
+
+ return framework.detach([{widget: this.widget}]);
},
/**
* Destroys the widget
*/
destroy: function() {
this.widget.destroy();
- this.detach();
},
});
/**
@@ -151,14 +143,6 @@ var WidgetAction = Action.extend({
*/
var ViewManagerAction = WidgetAction.extend({
/**
- * Appends the action's widget to el
- * @param {DocumentFragment} [el] where to append the widget
- * @return {Deferred} resolved when the widget is appended
- */
- appendTo: function(el) {
- return this.widget.appendTo(el);
- },
- /**
* Restores a ViewManagerAction
* Switches to the requested view by calling select_view on the ViewManager
* @param {int} [view_index] the index of the view to select
@@ -170,27 +154,27 @@ var ViewManagerAction = WidgetAction.extend({
});
},
/**
- * Sets is_in_DOM on this.widget
- * @param {Boolean} [is_in_DOM] true iff the widget is attached in the DOM
+ * Sets the on_reverse_breadcrumb_callback and the scrollTop to apply when
+ * coming back to that action
+ * @param {Function} [callback] the callback
+ * @param {int} [scrollTop] the number of pixels to scroll
*/
- set_is_in_DOM: function(is_in_DOM) {
- this.widget.is_in_DOM = is_in_DOM;
+ set_on_reverse_breadcrumb: function(callback, scrollTop) {
+ this._super(callback);
+ this.set_scrollTop(scrollTop);
},
/**
- * Detaches the view_manager from the DOM
- * @return {jQuery} the view_manager's $el
+ * Sets the scroll position of the widgets's active_view
+ * @param {int} [scrollTop] the number of pixels to scroll
*/
- detach: function() {
- // Hack to remove badly inserted nvd3 tooltips ; should be removed when upgrading nvd3 lib
- $('body > .nvtooltip').remove();
-
- return this.widget.$el.detach();
+ set_scrollTop: function(scrollTop) {
+ this.widget.active_view.controller.set_scrollTop(scrollTop);
},
/**
- * Destroys the widget
+ * @return {int} the number of pixels the webclient is scrolled when leaving the action
*/
- destroy: function() {
- this.widget.destroy();
+ get_scrollTop: function() {
+ return this.widget.active_view.controller.get_scrollTop();
},
/**
* @return {Array} array of Objects that will be interpreted to display the breadcrumbs
@@ -214,13 +198,31 @@ var ViewManagerAction = WidgetAction.extend({
});
var ActionManager = Widget.extend({
- template: "ActionManager",
- init: function(parent) {
+ template: 'ActionManager',
+ /**
+ * Called each time the action manager is attached into the DOM
+ */
+ on_attach_callback: function() {
+ this.is_in_DOM = true;
+ if (this.inner_widget && this.inner_widget.on_attach_callback) {
+ this.inner_widget.on_attach_callback();
+ }
+ },
+ /**
+ * Called each time the action manager is detached from the DOM
+ */
+ on_detach_callback: function() {
+ this.is_in_DOM = false;
+ if (this.inner_widget && this.inner_widget.on_detach_callback) {
+ this.inner_widget.on_detach_callback();
+ }
+ },
+ init: function(parent, options) {
this._super(parent);
this.action_stack = [];
this.inner_action = null;
this.inner_widget = null;
- this.webclient = parent;
+ this.webclient = options && options.webclient;
this.dialog = null;
this.dialog_widget = null;
this.on('history_back', this, this.proxy('history_back'));
@@ -236,8 +238,15 @@ var ActionManager = Widget.extend({
this.select_action(action, index);
}, 200, true));
- // Append the main control panel to the DOM (inside the ActionManager jQuery element)
- this.main_control_panel.appendTo(this.$el);
+ // Listen to event "DOM_updated" to restore the scroll position
+ core.bus.on('DOM_updated', this, function() {
+ if (this.inner_action) {
+ this.trigger_up('scrollTo', {offset: this.inner_action.get_scrollTop() || 0});
+ }
+ });
+
+ // Insert the main control panel into the DOM
+ return this.main_control_panel.insertBefore(this.$el);
},
dialog_stop: function (reason) {
if (this.dialog) {
@@ -256,9 +265,9 @@ var ActionManager = Widget.extend({
*/
push_action: function(widget, action_descr, options) {
var self = this;
- var old_widget = this.inner_widget;
- var old_action = this.inner_action;
var old_action_stack = this.action_stack;
+ var old_action = this.inner_action;
+ var old_widget = this.inner_widget;
options = options || {};
// Empty action_stack if requested
@@ -277,8 +286,8 @@ var ActionManager = Widget.extend({
}
// Set on_reverse_breadcrumb callback on previous inner_action
- if (old_action) {
- old_action.set_on_reverse_breadcrumb(options.on_reverse_breadcrumb);
+ if (this.webclient && old_action) {
+ old_action.set_on_reverse_breadcrumb(options.on_reverse_breadcrumb, this.webclient.get_scrollTop());
}
// Update action_stack (must be done before appendTo to properly
@@ -295,25 +304,19 @@ var ActionManager = Widget.extend({
// render the inner_widget in a fragment, and append it to the
// document only when it's ready
var new_widget_fragment = document.createDocumentFragment();
- return $.when(this.inner_action.appendTo(new_widget_fragment)).done(function() {
+ return $.when(this.inner_widget.appendTo(new_widget_fragment)).done(function() {
// Detach the fragment of the previous action and store it within the action
if (old_action) {
old_action.set_fragment(old_action.detach());
- old_action.set_is_in_DOM(false);
}
if (!widget.need_control_panel) {
// Hide the main ControlPanel for widgets that do not use it
self.main_control_panel.do_hide();
}
-
- framework.append(self.$el, new_widget_fragment, true);
- self.inner_action.set_is_in_DOM(true);
-
- // Hide the old_widget as it will be removed from the DOM when it
- // is destroyed
- if (old_widget) {
- old_widget.do_hide();
- }
+ framework.append(self.$el, new_widget_fragment, {
+ in_DOM: self.is_in_DOM,
+ callbacks: [{widget: self.inner_widget}],
+ });
if (options.clear_breadcrumbs) {
self.clear_action_stack(old_action_stack);
}
@@ -325,6 +328,11 @@ var ActionManager = Widget.extend({
self.inner_widget = old_widget;
});
},
+ set_scrollTop: function(scrollTop) {
+ if (this.inner_action) {
+ this.inner_action.set_scrollTop(scrollTop);
+ }
+ },
get_breadcrumbs: function () {
return _.flatten(_.map(this.action_stack, function (action) {
return action.get_breadcrumbs();
@@ -368,7 +376,9 @@ var ActionManager = Widget.extend({
},
select_action: function(action, index) {
var self = this;
- return this.webclient.clear_uncommitted_changes().then(function() {
+ var def = this.webclient && this.webclient.clear_uncommitted_changes() || $.when();
+
+ return def.then(function() {
// Set the new inner_action/widget and update the action stack
var old_action = self.inner_action;
var action_index = self.action_stack.indexOf(action);
@@ -376,19 +386,21 @@ var ActionManager = Widget.extend({
self.inner_action = action;
self.inner_widget = action.widget;
- // Hide the ControlPanel if the widget doesn't use it
- if (!self.inner_widget.need_control_panel) {
- self.main_control_panel.do_hide();
- }
-
return $.when(action.restore(index)).done(function() {
+ // Hide the ControlPanel if the widget doesn't use it
+ if (!self.inner_widget.need_control_panel) {
+ self.main_control_panel.do_hide();
+ }
+ // Attach the DOM of the action and restore the scroll position only if necessary
if (action !== old_action) {
// Clear the action stack (this also removes the current action from the DOM)
self.clear_action_stack(to_destroy);
// Append the fragment of the action to restore to self.$el
- framework.append(self.$el, action.get_fragment(), true);
- self.inner_action.set_is_in_DOM(true);
+ framework.append(self.$el, action.get_fragment(), {
+ in_DOM: self.is_in_DOM,
+ callbacks: [{widget: action.widget}],
+ });
}
});
}).fail(function() {
@@ -406,7 +418,7 @@ var ActionManager = Widget.extend({
}
},
do_push_state: function(state) {
- if (!this.webclient || !this.webclient.do_push_state || this.dialog) {
+ if (!this.webclient || this.dialog) {
return;
}
state = state || {};
@@ -491,13 +503,6 @@ var ActionManager = Widget.extend({
res_id: state.id,
view_type: state.view_type,
});
- $.when(action_loaded || null).done(function() {
- self.webclient.menu.is_bound.done(function() {
- if (self.inner_action && self.inner_action.get_action_descr().id) {
- self.webclient.menu.open_action(self.inner_action.get_action_descr().id);
- }
- });
- });
}
}
} else if (state.model && state.id) {
@@ -524,9 +529,9 @@ var ActionManager = Widget.extend({
});
}
- $.when(action_loaded || null).done(function() {
+ return $.when(action_loaded || null).done(function() {
if (self.inner_widget && self.inner_widget.do_load_state) {
- self.inner_widget.do_load_state(state, warm);
+ return self.inner_widget.do_load_state(state, warm);
}
});
},
@@ -628,7 +633,9 @@ var ActionManager = Widget.extend({
});
}
- return this[type](action, options);
+ return $.when(this[type](action, options)).then(function() {
+ return action;
+ });
},
null_action: function() {
this.dialog_stop();
@@ -645,6 +652,7 @@ var ActionManager = Widget.extend({
* @return {*}
*/
ir_actions_common: function(executor, options) {
+ var self = this;
if (executor.action.target === 'new') {
var pre_dialog = (this.dialog && !this.dialog.isDestroyed()) ? this.dialog : null;
if (pre_dialog){
@@ -693,13 +701,16 @@ var ActionManager = Widget.extend({
this.dialog_widget.set_cp_bus(new core.Bus());
}
this.dialog_widget.setParent(this.dialog);
- this.dialog.open();
-
- return this.dialog_widget.appendTo(this.dialog.$el);
+
+ var fragment = document.createDocumentFragment();
+ return this.dialog_widget.appendTo(fragment).then(function() {
+ self.dialog.open().$el.append(fragment);
+ if(options.state && self.dialog_widget.do_load_state) {
+ return self.dialog_widget.do_load_state(options.state);
+ }
+ }).then(function () { return executor.action; });
}
- // Clear uncommitted changes on the current inner widget if there is one
- var self = this;
- var def = (this.inner_widget && this.webclient.clear_uncommitted_changes()) || $.when();
+ var def = this.inner_action && this.webclient && this.webclient.clear_uncommitted_changes() || $.when();
return def.then(function() {
self.dialog_stop(executor.action);
return self.push_action(executor.widget(), executor.action, options);
@@ -764,11 +775,11 @@ var ActionManager = Widget.extend({
},
ir_actions_server: function (action, options) {
var self = this;
- this.rpc('/web/action/run', {
+ return this.rpc('/web/action/run', {
action_id: action.id,
context: action.context || {}
- }).done(function (action) {
- self.do_action(action, options);
+ }).then(function (action) {
+ return self.do_action(action, options);
});
},
ir_actions_report_xml: function(action, options) {
@@ -818,6 +829,7 @@ var ActionManager = Widget.extend({
if (action.target === 'self') {
framework.redirect(url);
+ return $.Deferred(); // The action is finished only when the redirection is done
} else {
window.open(url, '_blank');
}
diff --git a/addons/web/static/src/js/apps.js b/addons/web/static/src/js/apps.js
index 156fe9e10b7..5dd5b576fc4 100644
--- a/addons/web/static/src/js/apps.js
+++ b/addons/web/static/src/js/apps.js
@@ -1,4 +1,4 @@
-odoo.define('base.apps', function (require) {
+odoo.define('web.Apps', function (require) {
"use strict";
var core = require('web.core');
@@ -9,10 +9,9 @@ var web_client = require('web.web_client');
var Widget = require('web.Widget');
var _t = core._t;
-var qweb = core.qweb;
var apps_client = null;
-
+var qweb = core.qweb;
var Apps = Widget.extend({
template: 'EmptyComponent',
@@ -106,92 +105,98 @@ var Apps = Widget.extend({
}
},
- start: function() {
+ _on_update_count: function(m) {
var self = this;
- return self.get_client().
- done(function(client) {
- self.client = client;
-
- var qs = (session.debug ? 'debug&' : '') + 'db=' + client.dbname;
- var u = client.origin + '/apps/embed/client?' + qs;
- var css = {width: '100%', height: '400px'};
- self.$ifr = $('<iframe>').attr('src', u);
-
- $(window).on("message.apps", self.proxy('_on_message'));
-
- self.on('message:ready', self, function(m) {
- var w = this.$ifr[0].contentWindow;
- var act = {
- type: 'ir.actions.client',
- tag: this.remote_action_tag,
- params: _.extend({}, this.params, {
- db: this.session.db,
- origin: this.session.origin,
- })
- };
- w.postMessage({type:'action', action: act}, client.origin);
+ var count = m.count;
+ var get_upd_menu_id = function() {
+ if (_.isUndefined(self._upd_menu_id)) {
+ var IMD = new Model('ir.model.data');
+ return IMD.call('get_object_reference', ['base', 'menu_module_updates']).then(function(r) {
+ var mid = r[1];
+ if(r[0] !== 'ir.ui.menu') {
+ // invalid reference, return null
+ mid = null;
+ }
+ self._upd_menu_id = mid;
+ return mid;
});
+ } else {
+ return $.Deferred().resolve(self._upd_menu_id).promise();
+ }
+ };
- self.on('message:set_height', self, function(m) {
- this.$ifr.height(m.height);
- });
+ $.when(get_upd_menu_id()).done(function(menu_id) {
+ if (_.isNull(menu_id)) {
+ return;
+ }
+ var $menu = web_client.menu.$secondary_menus.find(_.str.sprintf('a[data-menu=%s]', menu_id));
+ if ($menu.length === 0) {
+ return;
+ }
+ if (_.isUndefined(count)) {
+ count = 0;
+ }
+ var needupdate = $menu.find('#menu_counter');
+ if (needupdate && needupdate.length !== 0) {
+ if (count > 0) {
+ needupdate.text(count);
+ } else {
+ needupdate.remove();
+ }
+ } else if (count > 0) {
+ $menu.append(qweb.render("Menu.needaction_counter", {widget: {needaction_counter: count}}));
+ }
+ });
+ },
- self.on('message:update_count', self, function(m) {
- var count = m.count;
- var get_upd_menu_id = function() {
- if (_.isUndefined(self._upd_menu_id)) {
- var IMD = new Model('ir.model.data');
- return IMD.call('get_object_reference', ['base', 'menu_module_updates']).then(function(r) {
- var mid = r[1];
- if(r[0] !== 'ir.ui.menu') {
- // invalid reference, return null
- mid = null;
- }
- self._upd_menu_id = mid;
- return mid;
- });
- } else {
- return $.Deferred().resolve(self._upd_menu_id).promise();
- }
- };
-
- $.when(get_upd_menu_id()).done(function(menu_id) {
- if (_.isNull(menu_id)) {
- return;
- }
- var $menu = web_client.menu.$secondary_menus.find(_.str.sprintf('a[data-menu=%s]', menu_id));
- if ($menu.length === 0) {
- return;
- }
- if (_.isUndefined(count)) {
- count = 0;
- }
- var needupdate = $menu.find('#menu_counter');
- if (needupdate && needupdate.length !== 0) {
- if (count > 0) {
- needupdate.text(count);
- } else {
- needupdate.remove();
- }
- } else if (count > 0) {
- $menu.append(qweb.render("Menu.needaction_counter", {widget: {needaction_counter: count}}));
- }
- });
- });
+ start: function() {
+ var self = this;
+ var def = $.Deferred();
+ self.get_client().then(function(client) {
+ self.client = client;
+
+ var qs = (session.debug ? 'debug&' : '') + 'db=' + client.dbname;
+ var u = client.origin + '/apps/embed/client?' + qs;
+ var css = {width: '100%', height: '400px'};
+ self.$ifr = $('<iframe>').attr('src', u);
+
+ $(window).on("message.apps", self.proxy('_on_message'));
+
+ self.on('message:ready', self, function(m) {
+ var w = this.$ifr[0].contentWindow;
+ var act = {
+ type: 'ir.actions.client',
+ tag: this.remote_action_tag,
+ params: _.extend({}, this.params, {
+ db: this.session.db,
+ origin: this.session.origin,
+ })
+ };
+ w.postMessage({type:'action', action: act}, client.origin);
+ });
- self.on('message:blockUI', self, function() { framework.blockUI(); });
- self.on('message:unblockUI', self, function() { framework.unblockUI(); });
- self.on('message:warn', self, function(m) {self.do_warn(m.title, m.message, m.sticky); });
-
- self.$ifr.appendTo(self.$el).css(css).addClass('apps-client');
- }).
- fail(function(client) {
- self.do_warn(_t('Odoo Apps will be available soon'), _t('Showing locally available modules'), true);
- self.rpc('/web/action/load', {action_id: self.failback_action_id}).done(function(action) {
- self.do_action(action);
- web_client.menu.open_action(action.id);
- });
+ self.on('message:set_height', self, function(m) {
+ this.$ifr.height(m.height);
+ });
+
+ self.on('message:update_count', self, self._on_update_count);
+
+ self.on('message:blockUI', self, function() { framework.blockUI(); });
+ self.on('message:unblockUI', self, function() { framework.unblockUI(); });
+ self.on('message:warn', self, function(m) {self.do_warn(m.title, m.message, m.sticky); });
+
+ self.$ifr.appendTo(self.$el).css(css).addClass('apps-client');
+
+ def.resolve();
+ }, function() {
+ self.do_warn(_t('Odoo Apps will be available soon'), _t('Showing locally available modules'), true);
+ return session.rpc('/web/action/load', {action_id: self.failback_action_id}).then(function(action) {
+ return self.do_action(action);
+ }).always(function () {
+ def.reject();
});
+ });
+ return def;
},
});
@@ -202,4 +207,6 @@ var AppsUpdates = Apps.extend({
core.action_registry.add("apps", Apps);
core.action_registry.add("apps.updates", AppsUpdates);
+return Apps;
+
});
diff --git a/addons/web/static/src/js/boot.js b/addons/web/static/src/js/boot.js
index 34abca7ef03..666520b263d 100644
--- a/addons/web/static/src/js/boot.js
+++ b/addons/web/static/src/js/boot.js
@@ -199,7 +199,6 @@
process_jobs: function (jobs, services) {
var job;
var require;
- var time;
function process_job (job) {
var require = make_require(job);
diff --git a/addons/web/static/src/js/compatibility.js b/addons/web/static/src/js/compatibility.js
index 5532c8c388e..7fa2d4733db 100644
--- a/addons/web/static/src/js/compatibility.js
+++ b/addons/web/static/src/js/compatibility.js
@@ -22,7 +22,6 @@ var form_relational = require('web.form_relational'); // necessary
var form_widgets = require('web.form_widgets'); // necessary
var framework = require('web.framework');
var ListView = require('web.ListView');
-var Menu = require('web.Menu');
var Model = require('web.DataModel');
var pyeval = require('web.pyeval');
var Registry = require('web.Registry');
@@ -96,7 +95,6 @@ openerp.web.FormView = FormView;
openerp.web.json_node_to_xml = utils.json_node_to_xml;
openerp.web.ListView = ListView;
-openerp.web.Menu = Menu;
openerp.web.Model = Model;
openerp.web.normalize_format = time.strftime_to_moment_format;
openerp.web.py_eval = pyeval.py_eval;
@@ -208,7 +206,7 @@ ListView.include({
}).value();
}
- return this._super(data);
+ return this._super();
},
/**
* Returns the style for the provided record in the current view (from the
diff --git a/addons/web/static/src/js/control_panel.js b/addons/web/static/src/js/control_panel.js
index 5e2cc36a6a1..3a233564368 100644
--- a/addons/web/static/src/js/control_panel.js
+++ b/addons/web/static/src/js/control_panel.js
@@ -54,17 +54,15 @@ var ControlPanel = Widget.extend({
* @return {jQuery.Deferred}
*/
start: function() {
- this.$title_col = this.$('.oe-cp-title');
-
// Exposed jQuery nodesets
this.nodes = {
- $breadcrumbs: this.$('.oe-view-title'),
- $buttons: this.$('.oe-cp-buttons'),
- $pager: this.$('.oe-cp-pager'),
- $searchview: this.$('.oe-cp-search-view'),
- $searchview_buttons: this.$('.oe-search-options'),
- $sidebar: this.$('.oe-cp-sidebar'),
- $switch_buttons: this.$('.oe-cp-switch-buttons'),
+ $breadcrumbs: this.$('.breadcrumb'),
+ $buttons: this.$('.o_cp_buttons'),
+ $pager: this.$('.o_cp_pager'),
+ $searchview: this.$('.o_cp_searchview'),
+ $searchview_buttons: this.$('.o_search_options'),
+ $sidebar: this.$('.o_cp_sidebar'),
+ $switch_buttons: this.$('.o_cp_switch_buttons'),
};
// By default, hide the ControlPanel and remove its contents from the DOM
@@ -120,7 +118,7 @@ var ControlPanel = Widget.extend({
// Update the searchview and switch buttons
this._update_search_view(status.searchview, status.search_view_hidden);
- if (status.active_view_selector) {
+ if (status.active_view_selector) {
this._update_switch_buttons(status.active_view_selector);
}
}
@@ -182,22 +180,25 @@ var ControlPanel = Widget.extend({
*/
_render_breadcrumbs: function (breadcrumbs) {
var self = this;
-
return breadcrumbs.map(function (bc, index) {
- return make_breadcrumb(bc, index === breadcrumbs.length - 1);
+ return self._render_breadcrumbs_li(bc, index, breadcrumbs.length);
});
-
- function make_breadcrumb (bc, is_last) {
- var $bc = $('<li>')
- .append(is_last ? _.escape(bc.title) : $('<a>').text(bc.title))
- .toggleClass('active', is_last);
- if (!is_last) {
- $bc.click(function () {
- self.trigger("on_breadcrumb_click", bc.action, bc.index);
- });
- }
- return $bc;
+ },
+ /**
+ * Private function that renders a breadcrumbs' li Jquery element
+ */
+ _render_breadcrumbs_li: function (bc, index, length) {
+ var self = this;
+ var is_last = (index === length-1);
+ var $bc = $('<li>')
+ .append(is_last ? _.escape(bc.title) : $('<a>').text(bc.title))
+ .toggleClass('active', is_last);
+ if (!is_last) {
+ $bc.click(function () {
+ self.trigger("on_breadcrumb_click", bc.action, bc.index);
+ });
}
+ return $bc;
},
/**
* Private function that updates the SearchView's visibility and extend the
@@ -211,8 +212,10 @@ var ControlPanel = Widget.extend({
// have been appended to a jQuery node not in the DOM at SearchView initialization
searchview.$buttons = this.nodes.$searchview_buttons;
searchview.toggle_visibility(!is_hidden);
- this.$title_col.toggleClass('col-md-6', !is_hidden).toggleClass('col-md-12', is_hidden);
}
+
+ this.nodes.$searchview.toggle(!is_hidden);
+ this.$el.toggleClass('o_breadcrumb_full', !!is_hidden);
},
});
diff --git a/addons/web/static/src/js/framework/ajax.js b/addons/web/static/src/js/framework/ajax.js
index 869e0214ad9..0301cd4e96c 100644
--- a/addons/web/static/src/js/framework/ajax.js
+++ b/addons/web/static/src/js/framework/ajax.js
@@ -2,8 +2,8 @@ odoo.define('web.ajax', function (require) {
"use strict";
var core = require('web.core');
-var time = require('web.time');
var utils = require('web.utils');
+var time = require('web.time');
function genericJsonRpc (fct_name, params, fct) {
var data = {
@@ -14,6 +14,7 @@ function genericJsonRpc (fct_name, params, fct) {
};
var xhr = fct(data);
var result = xhr.pipe(function(result) {
+ core.bus.trigger('rpc:result', data, result);
if (result.error !== undefined) {
if (result.error.data.arguments[0] !== "bus.Bus not available in test mode") {
console.error("Server application error", JSON.stringify(result.error));
@@ -42,7 +43,7 @@ function jsonRpc(url, fct_name, params, settings) {
contentType: 'application/json'
}));
});
-};
+}
function jsonpRpc(url, fct_name, params, settings) {
settings = settings || {};
@@ -116,7 +117,7 @@ function jsonpRpc(url, fct_name, params, settings) {
return deferred;
}
});
-};
+}
// helper
function realSetTimeout (fct, millis) {
@@ -140,7 +141,7 @@ function loadCSS(url) {
'type': 'text/css'
}));
}
-};
+}
function loadJS(url) {
var def = $.Deferred();
@@ -165,7 +166,7 @@ function loadJS(url) {
head.appendChild(script);
}
return def;
-};
+}
/**
* Cooperative file download implementation, for ajaxy APIs.
@@ -301,7 +302,7 @@ function post (controller_url, data) {
var Def = $.Deferred();
var postData = new FormData();
-
+
$.each(data, function(i,val) {
postData.append(i, val);
});
@@ -311,7 +312,7 @@ function post (controller_url, data) {
var xhr = new XMLHttpRequest();
if(xhr.upload) xhr.upload.addEventListener('progress', progressHandler(Def), false);
-
+
var ajaxDef = $.ajax(controller_url, {
xhr: function() {return xhr;},
data: postData,
@@ -324,8 +325,6 @@ function post (controller_url, data) {
return Def;
}
-
-
var loadXML = (function () {
var loading = false;
var urls = [];
diff --git a/addons/web/static/src/js/framework/core.js b/addons/web/static/src/js/framework/core.js
index 30138102663..f9ab78f1c8e 100644
--- a/addons/web/static/src/js/framework/core.js
+++ b/addons/web/static/src/js/framework/core.js
@@ -177,20 +177,16 @@ return {
_lt: _lt,
// registries
- view_registry: new Registry(),
- crash_registry: new Registry(),
action_registry : new Registry(),
- form_widget_registry: new Registry(),
- form_tag_registry: new Registry(),
+ crash_registry: new Registry(),
form_custom_registry: new Registry(),
+ form_tag_registry: new Registry(),
+ form_widget_registry: new Registry(),
list_widget_registry: new Registry(),
- search_widgets_registry: new Registry(),
- search_filters_registry: new Registry(),
-
- // necessary to make the kanban view compatible between
- // community and enterprise edition
one2many_view_registry: new Registry(),
-
+ search_filters_registry: new Registry(),
+ search_widgets_registry: new Registry(),
+ view_registry: new Registry(),
};
diff --git a/addons/web/static/src/js/framework/crash_manager.js b/addons/web/static/src/js/framework/crash_manager.js
index 4ab40f456bc..99d949ac311 100644
--- a/addons/web/static/src/js/framework/crash_manager.js
+++ b/addons/web/static/src/js/framework/crash_manager.js
@@ -40,22 +40,17 @@ var CrashManager = core.Class.extend({
if (!this.active) {
return;
}
- if (this.$indicator){
+ if (this.connection_lost) {
return;
}
if (error.code == -32098) {
- $.blockUI({ message: '' , overlayCSS: {'z-index': 9999, backgroundColor: '#FFFFFF', opacity: 0.0, cursor: 'wait'}});
- this.$indicator = $('<div class="oe_indicator">' + _t("Trying to reconnect... ") + '<i class="fa fa-refresh"></i></div>');
- this.$indicator.prependTo("body");
- var timeinterval = setInterval(function(){
+ core.bus.trigger('connection_lost');
+ this.connection_lost = true;
+ var timeinterval = setInterval(function() {
ajax.jsonRpc('/web/webclient/version_info').then(function() {
clearInterval(timeinterval);
- self.$indicator.html(_t("You are back online"));
- self.$indicator.delay(2000).fadeOut('slow',function(){
- $(this).remove();
- self.$indicator.remove();
- });
- $.unblockUI();
+ core.bus.trigger('connection_restored');
+ self.connection_lost = false;
});
}, 2000);
return;
diff --git a/addons/web/static/src/js/framework/data.js b/addons/web/static/src/js/framework/data.js
index a1b8e1602e9..592e402d927 100644
--- a/addons/web/static/src/js/framework/data.js
+++ b/addons/web/static/src/js/framework/data.js
@@ -320,6 +320,7 @@ var DataSet = Class.extend(mixins.PropertiesMixin, {
this.index = null;
this._sort = [];
this._model = new Model(model, context);
+ this.orderer = new utils.DropMisordered();
},
previous: function () {
this.index -= 1;
@@ -408,10 +409,11 @@ var DataSet = Class.extend(mixins.PropertiesMixin, {
read_slice: function (fields, options) {
var self = this;
options = options || {};
- return this._model.query(fields)
+ var query = this._model.query(fields)
.limit(options.limit || false)
.offset(options.offset || 0)
- .all().done(function (records) {
+ .all();
+ return this.orderer.add(query).done(function (records) {
self.ids = _(records).pluck('id');
});
},
@@ -761,12 +763,6 @@ var BufferedDataSet = DataSetStatic.extend({
_.extend(cached.from_read, options.from_read);
_.extend(cached.changes, options.changes);
_.extend(cached.readonly_fields, options.readonly_fields);
- // discard values from cached.changes that are in cached.from_read
- _.each(cached.changes, function (v, k) {
- if (cached.from_read[k] === v) {
- delete cached.changes[k];
- }
- });
if (options.to_create !== undefined) cached.to_create = options.to_create;
if (options.to_delete !== undefined) cached.to_delete = options.to_delete;
}
diff --git a/addons/web/static/src/js/framework/misc.js b/addons/web/static/src/js/framework/misc.js
index b8c5e5e927e..73345df94c0 100644
--- a/addons/web/static/src/js/framework/misc.js
+++ b/addons/web/static/src/js/framework/misc.js
@@ -211,6 +211,16 @@ if ('nv' in window) {
nv.tooltip.cleanup = function () {
$('.nvtooltip').remove();
};
+
+ // monkey patch nvd3 to prevent it to display a tooltip (position: absolute) with
+ // a negative `top`; with this patch the highest tooltip's position is still in the
+ // graph
+ var originalCalcTooltipPosition = nv.tooltip.calcTooltipPosition;
+ nv.tooltip.calcTooltipPosition = function () {
+ var container = originalCalcTooltipPosition.apply(this, arguments);
+ container.style.top = container.style.top.split('px')[0] < 0 ? 0 + 'px' : container.style.top;
+ return container;
+ };
}
// Bootstrap customization
@@ -303,11 +313,18 @@ $.extend( proto, {
});
/**
- * Private function that triggers an event on core.bus
+ * Private function to notify that something has been attached in the DOM
* @param {htmlString or Element or Array or jQuery} [content] the content that
* has been attached in the DOM
+ * @params {Array} [callbacks] array of {widget: w, callback_args: args} such
+ * that on_attach_callback() will be called on each w with arguments args
*/
-function _notify (content) {
+function _notify (content, callbacks) {
+ _.each(callbacks, function(c) {
+ if (c.widget && c.widget.on_attach_callback) {
+ c.widget.on_attach_callback(c.callback_args);
+ }
+ });
core.bus.trigger('DOM_updated', content);
}
/**
@@ -315,12 +332,14 @@ function _notify (content) {
* @param {jQuery} [$target] the node where content will be appended
* @param {htmlString or Element or Array or jQuery} [content] DOM element,
* array of elements, HTML string or jQuery object to append to $target
- * @param {jQuery} [trigger] true to trigger an event, false otherwise
+ * @param {Boolean} [options.in_DOM] true if $target is in the DOM
+ * @param {Array} [options.callbacks] array of objects describing the callbacks
+ * to perform (see _notify for a complete description)
*/
-function append ($target, content, trigger) {
+function append ($target, content, options) {
$target.append(content);
- if (trigger) {
- _notify(content);
+ if (options && options.in_DOM) {
+ _notify(content, options.callbacks);
}
}
/**
@@ -328,13 +347,37 @@ function append ($target, content, trigger) {
* @param {jQuery} [$target] the node where content will be prepended
* @param {htmlString or Element or Array or jQuery} [content] DOM element,
* array of elements, HTML string or jQuery object to prepend to $target
- * @param {jQuery} [trigger] true to trigger an event, false otherwise
+ * @param {Boolean} [options.in_DOM] true if $target is in the DOM
+ * @param {Array} [options.callbacks] array of objects describing the callbacks
+ * to perform (see _notify for a complete description)
*/
-function prepend ($target, content, trigger) {
+function prepend ($target, content, options) {
$target.prepend(content);
- if (trigger) {
- _notify(content);
+ if (options && options.in_DOM) {
+ _notify(content, options.callbacks);
+ }
+}
+
+/**
+ * Detaches widgets from the DOM and performs their on_detach_callback()
+ * @param {Array} [to_detach] array of {widget: w, callback_args: args} such
+ * that w.$el will be detached and w.on_detach_callback(args) will be called
+ * @param {jQuery} [options.$to_detach] if given, detached instead of widgets' $el
+ * @return {jQuery} the detached elements
+ */
+function detach (to_detach, options) {
+ _.each(to_detach, function(d) {
+ if (d.widget.on_detach_callback) {
+ d.widget.on_detach_callback(d.callback_args);
+ }
+ });
+ var $to_detach = options && options.$to_detach;
+ if (!$to_detach) {
+ $to_detach = $(_.map(to_detach, function(d) {
+ return d.widget.el;
+ }));
}
+ return $to_detach.detach();
}
/**
@@ -358,6 +401,7 @@ return {
redirect: redirect,
append: append,
prepend: prepend,
+ detach: detach,
getPosition: getPosition,
};
diff --git a/addons/web/static/src/js/framework/model.js b/addons/web/static/src/js/framework/model.js
index fc1422d799a..dd516bb61ba 100644
--- a/addons/web/static/src/js/framework/model.js
+++ b/addons/web/static/src/js/framework/model.js
@@ -6,14 +6,12 @@ var session = require('web.session');
var Model = Class.extend({
/**
- new openerp.web.Model([session,] model_name[, context[, domain]])
+ new openerp.web.Model(name[, context[, domain]])
@constructs instance.web.Model
@extends instance.web.Class
- @param {openerp.web.Session} [session] The session object used to communicate with
- the server.
- @param {String} model_name name of the OpenERP model this object is bound to
+ @param {String} name name of the OpenERP model this object is bound to
@param {Object} [context]
@param {Array} [domain]
*/
diff --git a/addons/web/static/src/js/framework/session.js b/addons/web/static/src/js/framework/session.js
index 71819cc6b7a..8a9269b8dff 100644
--- a/addons/web/static/src/js/framework/session.js
+++ b/addons/web/static/src/js/framework/session.js
@@ -236,7 +236,7 @@ var Session = core.Class.extend(mixins.EventDispatcherMixin, {
return d;
},
load_qweb: function(mods) {
- this.qweb_mutex.exec(function() {
+ this.qweb_mutex.exec(function () {
return $.get('/web/webclient/qweb?mods=' + mods).then(function (doc) {
if (!doc) { return; }
qweb.add_template(doc);
diff --git a/addons/web/static/src/js/framework/utils.js b/addons/web/static/src/js/framework/utils.js
index d50647090d6..8d8d8dab6ee 100644
--- a/addons/web/static/src/js/framework/utils.js
+++ b/addons/web/static/src/js/framework/utils.js
@@ -423,7 +423,6 @@ function swap(array, elem1, elem2) {
array[i1] = elem2;
}
-
return {
divmod: divmod,
modf: modf,
diff --git a/addons/web/static/src/js/framework/view.js b/addons/web/static/src/js/framework/view.js
index fbbede916e5..d2cc73a4b71 100644
--- a/addons/web/static/src/js/framework/view.js
+++ b/addons/web/static/src/js/framework/view.js
@@ -27,6 +27,8 @@ var View = Widget.extend({
// multi_record is used to distinguish views displaying a single record
// (e.g. FormView) from those that display several records (e.g. ListView)
multi_record: true,
+ // indicates whether or not the view is mobile-friendly
+ mobile_friendly: false,
// icon is the font-awesome icon to display in the view switcher
icon: 'fa-question',
// whether or not the view requires the model's fields to render itself
@@ -45,11 +47,8 @@ var View = Widget.extend({
* @return {Deferred}
*/
start: function() {
- // add css classes that reflect the (absence of) access rights
- this.$el.addClass('oe_view')
- .toggleClass('oe_cannot_create', !this.is_action_enabled('create'))
- .toggleClass('oe_cannot_edit', !this.is_action_enabled('edit'))
- .toggleClass('oe_cannot_delete', !this.is_action_enabled('delete'));
+ // add classname that reflect the (absence of) access rights
+ this.$el.toggleClass('o_cannot_create', !this.is_action_enabled('create'));
return this._super().then(this.trigger.bind(this, 'view_loaded'));
},
/**
@@ -76,7 +75,7 @@ var View = Widget.extend({
// response handler
var handler = function (action) {
- if (action && action.constructor == Object) {
+ if (action && action.constructor === Object) {
// filter out context keys that are specific to the current action.
// Wrong default_* and search_default_* values will no give the expected result
// Wrong group_by values will simply fail and forbid rendering of the destination view
@@ -106,7 +105,7 @@ var View = Widget.extend({
if (action_data.special === 'cancel') {
return handler({"type":"ir.actions.act_window_close"});
- } else if (action_data.type=="object") {
+ } else if (action_data.type === "object") {
var args = [[record_id]];
if (action_data.args) {
try {
@@ -122,7 +121,7 @@ var View = Widget.extend({
return dataset.call_button(action_data.name, args).then(handler).then(function () {
core.bus.trigger('do_reload_needaction');
});
- } else if (action_data.type=="action") {
+ } else if (action_data.type === "action") {
return data_manager.load_action(action_data.name, _.extend(pyeval.eval('context', context), {
active_model: dataset.model,
active_ids: dataset.ids,
@@ -144,27 +143,24 @@ var View = Widget.extend({
do_load_state: function (state, warm) {
},
/**
- * This function should render the buttons of the view, set this.$buttons to
- * the produced jQuery element and define some listeners on it.
- * This function should be called after start().
+ * This function should render the action buttons of the view.
+ * It should be called after start().
* @param {jQuery} [$node] a jQuery node where the rendered buttons should be inserted
* $node may be undefined, in which case the View can insert the buttons somewhere else
*/
render_buttons: function($node) {
},
/**
- * This function should instantiate and render the sidebar of the view, set this.sidebar to
- * the instantiated Sidebar Widget and possibly add custom items in it.
- * This function should be called after start().
+ * This function should render the sidebar of the view.
+ * It should be called after start().
* @param {jQuery} [$node] a jQuery node where the sidebar should be inserted
* $node may be undefined, in which case the View can insert the sidebar somewhere else
*/
render_sidebar: function($node) {
},
/**
- * This function should render the pager of the view, set this.$pager to
- * the produced jQuery element and define some listeners on it.
- * This function should be called after start().
+ * This function should render the pager of the view.
+ * It should be called after start().
* @param {jQuery} [$node] a jQuery node where the pager should be inserted
* $node may be undefined, in which case the View can insert the pager somewhere else
*/
@@ -200,6 +196,12 @@ var View = Widget.extend({
get_context: function () {
return {};
},
+ set_scrollTop: function(scrollTop) {
+ this.scrollTop = scrollTop;
+ },
+ get_scrollTop: function() {
+ return this.scrollTop;
+ }
});
return View;
diff --git a/addons/web/static/src/js/framework/widget.js b/addons/web/static/src/js/framework/widget.js
index a6b189dc832..25a30ae6511 100644
--- a/addons/web/static/src/js/framework/widget.js
+++ b/addons/web/static/src/js/framework/widget.js
@@ -32,7 +32,7 @@ var mixins = core.mixins;
* },
* start: function() {
* // stuff you want to make after the rendering, `this.$el` holds a correct value
- * this.$el.find(".my_button").click(/* an example of event binding * /);
+ * this.$(".my_button").click(/* an example of event binding * /);
*
* // if you have some asynchronous operations, it's a good idea to return
* // a promise in start()
diff --git a/addons/web/static/src/js/menu.js b/addons/web/static/src/js/menu.js
index 4d8671595bd..c244305b7aa 100644
--- a/addons/web/static/src/js/menu.js
+++ b/addons/web/static/src/js/menu.js
@@ -15,7 +15,7 @@ var Menu = Widget.extend({
this.data = {data:{children:[]}};
this.on("menu_bound", this, function() {
// launch the fetch of needaction counters, asynchronous
- var $all_menus = self.$el.parents('body').find('.oe_webclient').find('[data-menu]');
+ var $all_menus = self.$el.parents('.o_web_client').find('.o_sub_menu').find('[data-menu]');
var all_menu_ids = _.map($all_menus, function (menu) {return parseInt($(menu).attr('data-menu'), 10);});
if (!_.isEmpty(all_menu_ids)) {
this.do_load_needaction(all_menu_ids);
@@ -34,7 +34,7 @@ var Menu = Widget.extend({
},
bind_menu: function() {
var self = this;
- this.$secondary_menus = this.$el.parents().find('.oe_secondary_menus_container');
+ this.$secondary_menus = this.$el.parents().find('.o_sub_menu');
this.$secondary_menus.on('click', 'a[data-menu]', this.on_menu_click);
this.$el.on('click', 'a[data-menu]', function (event) {
event.preventDefault();
@@ -160,7 +160,7 @@ var Menu = Widget.extend({
$sub_menu.show();
// Hide/Show the leftbar menu depending of the presence of sub-items
- this.$secondary_menus.parent('.oe_leftbar').toggle(!!$sub_menu.children().length);
+ this.$secondary_menus.toggle(!!$sub_menu.children().length);
// Activate current menu item and show parents
this.$secondary_menus.find('.active').removeClass('active');
diff --git a/addons/web/static/src/js/view_manager.js b/addons/web/static/src/js/view_manager.js
index 0dfab67b4ea..6a8a162e144 100644
--- a/addons/web/static/src/js/view_manager.js
+++ b/addons/web/static/src/js/view_manager.js
@@ -14,7 +14,25 @@ var QWeb = core.qweb;
var _t = core._t;
var ViewManager = Widget.extend(ControlPanelMixin, {
- template: "ViewManager",
+ className: "o_view_manager_content",
+ /**
+ * Called each time the view manager is attached into the DOM
+ */
+ on_attach_callback: function() {
+ this.is_in_DOM = true;
+ if (this.active_view && this.active_view.controller.on_attach_callback) {
+ this.active_view.controller.on_attach_callback();
+ }
+ },
+ /**
+ * Called each time the view manager is detached from the DOM
+ */
+ on_detach_callback: function() {
+ this.is_in_DOM = false;
+ if (this.active_view && this.active_view.controller.on_detach_callback) {
+ this.active_view.controller.on_detach_callback();
+ }
+ },
/**
* @param {Object} [dataset]
* @param {Array} [views] List of [view_id, view_type[, fields_view]]
@@ -34,12 +52,11 @@ var ViewManager = Widget.extend(ControlPanelMixin, {
this.active_view = null;
this.registry = core.view_registry;
this.title = this.action.name;
- this.is_in_DOM = false; // used to know if the view manager is attached in the DOM
_.each(views, function (view) {
var view_type = view[1] || view.view_type;
var View = self.registry.get(view_type);
if (!View) {
- console.error("View type", "'"+view[1]+"'", "is not present in the view registry.");
+ console.error("View type", "'"+view_type+"'", "is not present in the view registry.");
return;
}
var view_label = View.prototype.display_name;
@@ -48,9 +65,9 @@ var ViewManager = Widget.extend(ControlPanelMixin, {
button_label: _.str.sprintf(_t('%(view_type)s view'), {'view_type': (view_label || view_type)}),
controller: null,
fields_view: view[2] || view.fields_view,
- embedded_view: view.embedded_view,
icon: View.prototype.icon,
label: view_label,
+ mobile_friendly: View.prototype.mobile_friendly,
multi_record: View.prototype.multi_record,
options: view.options || {},
require_fields: View.prototype.require_fields,
@@ -81,12 +98,7 @@ var ViewManager = Widget.extend(ControlPanelMixin, {
view.options = _.extend({
action: self.action,
}, self.flags, self.flags[view.type], view.options);
- view.$container = self.$(".oe-view-manager-view-" + view.type);
});
-
- this.$el.addClass("oe_view_manager_" + ((this.action && this.action.target) || 'current'));
-
- this.control_elements = {};
if (this.flags.search_view) {
this.search_view_loaded = this.setup_search_view();
}
@@ -224,33 +236,40 @@ var ViewManager = Widget.extend(ControlPanelMixin, {
var view_control_elements = this.render_view_control_elements();
// Show the view
- this.active_view.$container.show();
return $.when(view_controller.do_show(view_options)).done(function () {
// Prepare the ControlPanel content and update it
var cp_status = {
- active_view_selector: '.oe-cp-switch-' + self.active_view.type,
+ active_view_selector: '.o_cp_switch_' + self.active_view.type,
breadcrumbs: self.action_manager && self.action_manager.get_breadcrumbs(),
- cp_content: _.extend({}, self.control_elements, view_control_elements),
+ cp_content: _.extend({}, self.searchview_elements, view_control_elements),
hidden: self.flags.headless,
searchview: self.searchview,
search_view_hidden: view_controller.searchable === false || view_controller.searchview_hidden,
};
self.update_control_panel(cp_status);
- if (old_view) {
- // Detach the old view but not ui-autocomplete elements to let
- // jquery-ui garbage-collect them
- old_view.$container.contents().not('.ui-autocomplete').detach();
-
- // Hide old view (at first rendering, there is no view to hide)
- if (self.active_view !== old_view) {
- if (old_view.controller) old_view.controller.do_hide();
- if (old_view.$container) old_view.$container.hide();
+ // Detach the old view and store it
+ if (old_view && old_view !== self.active_view) {
+ // Store the scroll position
+ if (self.action_manager && self.action_manager.webclient) {
+ old_view.controller.set_scrollTop(self.action_manager.webclient.get_scrollTop());
}
+ // Do not detach ui-autocomplete elements to let jquery-ui garbage-collect them
+ var $to_detach = self.$el.contents().not('.ui-autocomplete');
+ old_view.$fragment = framework.detach([{widget: old_view.controller}], {$to_detach: $to_detach});
}
- // Append the view fragment to its $container
- framework.append(self.active_view.$container, view_fragment, self.is_in_DOM);
+ // If the user switches from a multi-record to a mono-record view,
+ // the action manager should be scrolled to the top.
+ if (old_view && old_view.controller.multi_record === true && view_controller.multi_record === false) {
+ view_controller.set_scrollTop(0);
+ }
+
+ // Append the view fragment to self.$el
+ framework.append(self.$el, view_fragment, {
+ in_DOM: self.is_in_DOM,
+ callbacks: [{widget: view_controller}],
+ });
});
},
create_view: function(view, view_options) {
@@ -282,39 +301,50 @@ var ViewManager = Widget.extend(ControlPanelMixin, {
return this.switch_mode(view_type);
},
/**
- * Renders the switch buttons and adds listeners on them but does not append them to the DOM
- * Sets $switch_buttons in control_elements to send to the ControlPanel
- * @param {Object} [src] the source requesting the switch_buttons
- * @param {Array} [views] the array of views
+ * Renders the switch buttons for multi- and mono-record views and adds
+ * listeners on them, but does not append them to the DOM
+ * Sets switch_buttons.$mono and switch_buttons.$multi to send to the ControlPanel
*/
render_switch_buttons: function() {
- if (this.flags.views_switcher && this.view_order.length > 1) {
- var self = this;
+ var self = this;
- // Render switch buttons but do not append them to the DOM as this will
- // be done later, simultaneously to all other ControlPanel elements
- this.control_elements.$switch_buttons = $(QWeb.render('ViewManager.switch-buttons', {views: self.view_order}));
+ // Partition the views according to their multi-/mono-record status
+ var views = _.partition(this.view_order, function(view) {
+ return view.multi_record === true;
+ });
+ var multi_record_views = views[0];
+ var mono_record_views = views[1];
- // Create bootstrap tooltips
- _.each(this.views, function(view) {
- self.control_elements.$switch_buttons.siblings('.oe-cp-switch-' + view.type).tooltip();
- });
+ // Inner function to render and prepare switch_buttons
+ var _render_switch_buttons = function(views) {
+ if (views.length > 1) {
+ var $switch_buttons = $(QWeb.render('ViewManager.switch-buttons', {views: views}));
+ // Create bootstrap tooltips
+ _.each(views, function(view) {
+ $switch_buttons.filter('.o_cp_switch_' + view.type).tooltip();
+ });
+ // Add onclick event listener
+ $switch_buttons.filter('button').click(_.debounce(function(event) {
+ var view_type = $(event.target).data('view-type');
+ self.switch_mode(view_type);
+ }, 200, true));
+ return $switch_buttons;
+ }
+ };
- // Add onclick event listener
- this.control_elements.$switch_buttons.siblings('button').click(_.debounce(function(event) {
- var view_type = $(event.target).data('view-type');
- self.switch_mode(view_type);
- }, 200, true));
- }
+ // Render switch buttons but do not append them to the DOM as this will
+ // be done later, simultaneously to all other ControlPanel elements
+ this.switch_buttons = {};
+ this.switch_buttons.$multi = _render_switch_buttons(multi_record_views);
+ this.switch_buttons.$mono = _render_switch_buttons(mono_record_views);
},
/**
- * Renders the control elements (buttons, sidebar, pager) of the current view
- * This must be done when active_search is resolved (for KanbanViews)
+ * Renders the control elements (buttons, sidebar, pager) of the current view.
* Fills this.active_view.control_elements dictionnary with the rendered
- * elements and the adequate view switcher, to send to the ControlPanel
+ * elements and the adequate view switcher, to send to the ControlPanel.
* Warning: it should be called before calling do_show on the view as the
* sidebar is extended to listen on the load_record event triggered as soon
- * as do_show is done (the sidebar should thus be instantiated before)
+ * as do_show is done (the sidebar should thus be instantiated before).
*/
render_view_control_elements: function() {
if (!this.active_view.control_elements) {
@@ -335,6 +365,15 @@ var ViewManager = Widget.extend(ControlPanelMixin, {
elements = _.mapObject(elements, function($node) {
return $node && $node.contents();
});
+ // Use the adequate view switcher (mono- or multi-record)
+ if (this.switch_buttons) {
+ if (this.active_view.multi_record) {
+ elements.$switch_buttons = this.switch_buttons.$multi;
+ } else {
+ elements.$switch_buttons = this.switch_buttons.$mono;
+ }
+ }
+
// Store the rendered elements in the active_view to allow restoring them later
this.active_view.control_elements = elements;
}
@@ -342,10 +381,7 @@ var ViewManager = Widget.extend(ControlPanelMixin, {
},
/**
* Sets up the current viewmanager's search view.
- * Sets $searchview and $searchview_buttons in control_elements to send to the ControlPanel
- *
- * @param {Number|false} view_id the view to use or false for a default one
- * @returns {jQuery.Deferred} search view startup deferred
+ * Sets $searchview and $searchview_buttons in searchview_elements to send to the ControlPanel
*/
setup_search_view: function() {
var self = this;
@@ -361,6 +397,7 @@ var ViewManager = Widget.extend(ControlPanelMixin, {
search_defaults[match[1]] = value;
}
});
+
var options = {
hidden: this.flags.search_view === false,
disable_custom_filters: this.flags.search_disable_custom_filters,
@@ -374,8 +411,9 @@ var ViewManager = Widget.extend(ControlPanelMixin, {
this.searchview.on('search_data', this, this.search.bind(this));
return $.when(this.searchview.appendTo($("<div>"))).done(function() {
- self.control_elements.$searchview = self.searchview.$el;
- self.control_elements.$searchview_buttons = self.searchview.$buttons.contents();
+ self.searchview_elements = {};
+ self.searchview_elements.$searchview = self.searchview.$el;
+ self.searchview_elements.$searchview_buttons = self.searchview.$buttons.contents();
});
},
/**
diff --git a/addons/web/static/src/js/views/form_common.js b/addons/web/static/src/js/views/form_common.js
index 1c86a86c1ec..b3d078dbc1a 100644
--- a/addons/web/static/src/js/views/form_common.js
+++ b/addons/web/static/src/js/views/form_common.js
@@ -215,7 +215,7 @@ var CompletionFieldMixin = {
self._search_create_popup("search", data);
});
},
- classname: 'oe_m2o_dropdown_option'
+ classname: 'o_m2o_dropdown_option'
});
}
// quick create
@@ -228,7 +228,7 @@ var CompletionFieldMixin = {
action: function() {
self._quick_create(search_val);
},
- classname: 'oe_m2o_dropdown_option'
+ classname: 'o_m2o_dropdown_option'
});
}
// create...
@@ -238,14 +238,14 @@ var CompletionFieldMixin = {
action: function() {
self._search_create_popup("form", undefined, self._create_context(search_val));
},
- classname: 'oe_m2o_dropdown_option'
+ classname: 'o_m2o_dropdown_option'
});
}
else if (values.length === 0) {
values.push({
label: _t("No results to show..."),
action: function() {},
- classname: 'oe_m2o_dropdown_option'
+ classname: 'o_m2o_dropdown_option'
});
}
@@ -275,7 +275,7 @@ var CompletionFieldMixin = {
// all search/create popup handling
_search_create_popup: function(view, ids, context) {
var self = this;
- new SelectCreateDialog(this, {
+ new SelectCreateDialog(this, _.extend({}, (this.options || {}), {
res_model: self.field.relation,
domain: self.build_domain(),
context: new data.CompoundContext(self.build_context(), context || {}),
@@ -287,7 +287,7 @@ var CompletionFieldMixin = {
self.add_id(element_ids[0]);
self.focus();
}
- }).open();
+ })).open();
},
/**
* To implement.
@@ -474,7 +474,7 @@ var FormWidget = Widget.extend(InvisibilityChangerMixin, {
debug: session.debug,
widget: widget
});
- },
+ }
}, options || {});
//only show tooltip if we are in debug or if we have a help to show, otherwise it will display
//as empty
@@ -666,16 +666,16 @@ var AbstractField = FormWidget.extend(FieldInterface, {
this._check_css_flags();
});
- this.$translate = $(); // Enterprise compatibility
+ this.$translate = (_t.database.multi_lang && this.field.translate) ? $('<button/>', {
+ type: 'button',
+ }).addClass('o_field_translate fa fa-globe btn btn-link') : $();
},
+
renderElement: function() {
var self = this;
this._super();
- if (this.field.translate && this.view) {
- this.$el.addClass('oe_form_field_translatable');
- this.$el.find('.oe_field_translate').click(this.on_translate);
- }
- this.$label = this.view ? this.view.$el.find('label[for=' + this.id_for_label + ']') : $();
+ this.$el.addClass('o_form_field');
+ this.$label = this.view ? this.view.$('label[for=' + this.id_for_label + ']') : $();
this.do_attach_tooltip(this, this.$label[0] || this.$el);
if (session.debug) {
this.$label.off('dblclick').on('dblclick', function() {
@@ -707,16 +707,23 @@ var AbstractField = FormWidget.extend(FieldInterface, {
});
this.render_value();
this._toggle_label();
+
+ if (this.view) {
+ this.$translate
+ .insertAfter(this.$el)
+ .on('click', _.bind(this.on_translate, this));
+ }
},
_toggle_label: function() {
var empty = this.get('effective_readonly') && this.is_false();
+ this.$label.toggleClass('o_form_label_empty', empty).toggleClass('o_form_label_false', this.get('effective_readonly') && this.get('value') === false);
this.$el.toggleClass('o_form_field_empty', empty);
},
/**
* Private. Do not use.
*/
_set_required: function() {
- this.$el.toggleClass('oe_form_required', this.get("required"));
+ this.$el.toggleClass('o_form_required', this.get("required"));
},
set_value: function(value_) {
this.set({'value': value_});
@@ -752,10 +759,11 @@ var AbstractField = FormWidget.extend(FieldInterface, {
return this.get('value') === false;
},
_check_css_flags: function() {
- if (this.field.translate) {
- this.$el.find('.oe_field_translate').toggle(this.field_manager.get('actual_mode') !== "create");
- }
- this.$el.toggleClass('oe_form_invalid', !this.disable_utility_classes && !!this.field_manager.get('display_invalid_fields') && !this.is_valid());
+ var show_translate = (!this.get('effective_readonly') && this.field_manager.get('actual_mode') !== "create");
+ this.$translate.toggleClass('o_translate_active', !!show_translate);
+
+ this.$el.add(this.$label)
+ .toggleClass('o_form_invalid', !this.disable_utility_classes && !!this.field_manager.get('display_invalid_fields') && !this.is_valid());
},
focus: function() {
return false;
@@ -770,11 +778,10 @@ var AbstractField = FormWidget.extend(FieldInterface, {
self.do_action(r);
});
},
-
- set_dimensions: function (height, width) {
+ set_dimensions: function(height, width) {
this.$el.css({
width: width,
- minHeight: height
+ height: height,
});
},
commit_value: function() {
@@ -802,7 +809,7 @@ var ViewDialog = Dialog.extend({ // FIXME should use ViewManager
options.dialogClass = options.dialogClass || '';
options.dialogClass += ' o_act_window';
- this._super(parent, _.clone(options));
+ this._super(parent, $.extend(true, {}, options));
this.res_model = options.res_model || null;
this.res_id = options.res_id || null;
@@ -864,7 +871,7 @@ var FormViewDialog = ViewDialog.extend({
];
if(!readonly) {
- options.buttons.splice(0, 0, {text: _t("Save") + ((multi_select)? " " + _t(" & Close") : ""), classes: "btn-primary o_formdialog_save", click: function() { // o_formdialog_save class for web_tests!
+ options.buttons.splice(0, 0, {text: _t("Save") + ((multi_select)? " " + _t(" & Close") : ""), classes: "btn-primary", click: function() {
self.view_form.onchanges_mutex.def.then(function() {
if (!self.view_form.warning_displayed) {
$.when(self.view_form.save()).done(function() {
@@ -923,6 +930,7 @@ var FormViewDialog = ViewDialog.extend({
var fragment = document.createDocumentFragment();
self.view_form.appendTo(fragment).then(function () {
self.view_form.do_show().then(function() {
+ self.view_form.autofocus();
_super().$el.append(fragment);
});
});
@@ -941,7 +949,7 @@ var SelectCreateListView = ListView.extend({
this.popup.close();
},
do_select: function(ids, records) {
- this._super(ids, records);
+ this._super.apply(this, arguments);
this.popup.on_click_element(ids);
}
});
@@ -1022,7 +1030,7 @@ var SelectCreateDialog = ViewDialog.extend({
_.extend({'deletable': false,
'selectable': !self.options.disable_multiple_selection,
'import_enabled': false,
- '$buttons': self.$footer,
+ '$buttons': self.$buttons,
'disable_editable_mode': true,
'pager': true,
}, self.options.list_view_options || {}));
@@ -1030,6 +1038,9 @@ var SelectCreateDialog = ViewDialog.extend({
e.cancel = true;
});
self.view_list.popup = self;
+ self.view_list.on('list_view_loaded', self, function() {
+ this.on_view_list_loaded();
+ });
var buttons = [
{text: _t("Cancel"), classes: "btn-default o_form_button_cancel", close: true}
@@ -1076,6 +1087,7 @@ var SelectCreateDialog = ViewDialog.extend({
this.close();
return new FormViewDialog(this.__parentedParent, this.options).open();
},
+ on_view_list_loaded: function() {},
});
var DomainEditorDialog = SelectCreateDialog.extend({
@@ -1095,11 +1107,11 @@ var DomainEditorDialog = SelectCreateDialog.extend({
},
get_domain: function (selected_ids) {
- var group_domain = [],
- domain;
- if (this.$('input.oe_list_record_selector').prop('checked')) {
+ var group_domain = [];
+ var domain;
+ if (this.$('.o_list_record_selector input').prop('checked')) {
if (this.view_list.grouped) {
- var group_domain = _.chain(_.values(this.view_list.groups.children))
+ group_domain = _.chain(_.values(this.view_list.groups.children))
.filter(function (child) { return child.records.length; })
.map(function (c) { return c.datagroup.domain;})
.value();
@@ -1118,6 +1130,11 @@ var DomainEditorDialog = SelectCreateDialog.extend({
}
return this.dataset.domain.concat(group_domain).concat(domain || []);
},
+
+ on_view_list_loaded: function() {
+ this.$('.o_list_record_selector input').prop('checked', true);
+ this.$footer.find(".o_selectcreatepopup_search_select").prop('disabled', false);
+ },
});
return {
diff --git a/addons/web/static/src/js/views/form_relational_widgets.js b/addons/web/static/src/js/views/form_relational_widgets.js
index fc852108035..8e64599f470 100644
--- a/addons/web/static/src/js/views/form_relational_widgets.js
+++ b/addons/web/static/src/js/views/form_relational_widgets.js
@@ -6,7 +6,6 @@ var core = require('web.core');
var data = require('web.data');
var Dialog = require('web.Dialog');
var common = require('web.form_common');
-var FormView = require('web.FormView');
var ListView = require('web.ListView');
var Model = require('web.DataModel');
var session = require('web.session');
@@ -56,16 +55,15 @@ var FieldMany2One = common.AbstractField.extend(common.CompletionFieldMixin, com
events: {
'keydown input': function (e) {
switch (e.which) {
- case $.ui.keyCode.UP:
- case $.ui.keyCode.DOWN:
- e.stopPropagation();
+ case $.ui.keyCode.UP:
+ case $.ui.keyCode.DOWN:
+ e.stopPropagation();
}
},
},
init: function(field_manager, node) {
this._super(field_manager, node);
common.CompletionFieldMixin.init.call(this);
- this.set({'value': false});
this.display_value = {};
this.display_value_backup = {};
this.last_search = [];
@@ -91,8 +89,9 @@ var FieldMany2One = common.AbstractField.extend(common.CompletionFieldMixin, com
common.ReinitializeFieldMixin.initialize_field.call(this);
},
initialize_content: function() {
- if (!this.get("effective_readonly"))
+ if (!this.get("effective_readonly")) {
this.render_editable();
+ }
},
destroy_content: function () {
if (this.$dropdown) {
@@ -125,16 +124,15 @@ var FieldMany2One = common.AbstractField.extend(common.CompletionFieldMixin, com
},
render_editable: function() {
var self = this;
- this.$input = this.$el.find("input");
+ this.$input = this.$("input");
this.init_error_displayer();
-
self.$input.on('focus', function() {
self.hide_error_displayer();
});
- this.$dropdown = this.$el.find(".oe_m2o_drop_down_button");
- this.$follow_button = $(".oe_m2o_cm_button", this.$el);
+ this.$dropdown = this.$(".o_dropdown_button");
+ this.$follow_button = this.$(".o_external_button");
this.$follow_button.click(function(ev) {
ev.preventDefault();
@@ -177,8 +175,7 @@ var FieldMany2One = common.AbstractField.extend(common.CompletionFieldMixin, com
};
this.$input.keydown(input_changed);
this.$input.change(input_changed);
- this.$dropdown.click(function() {
- self.$input.focus();
+ this.$input.on('click', function() {
if (self.$input.autocomplete("widget").is(":visible")) {
self.$input.autocomplete("close");
} else {
@@ -298,7 +295,6 @@ var FieldMany2One = common.AbstractField.extend(common.CompletionFieldMixin, com
});
// set position for list of suggestions box
this.$input.autocomplete( "option", "position", { my : "left top", at: "left bottom" } );
- this.$input.autocomplete("widget").openerpClass();
// used to correct a bug when selecting an element by pushing 'enter' in an editable list
this.$input.keyup(function(e) {
if (e.which === 13) { // ENTER
@@ -311,7 +307,7 @@ var FieldMany2One = common.AbstractField.extend(common.CompletionFieldMixin, com
},
render_value: function(no_recurse) {
var self = this;
- if (! this.get("value")) {
+ if (!this.get("value")) {
this.display_string("");
return;
}
@@ -320,7 +316,7 @@ var FieldMany2One = common.AbstractField.extend(common.CompletionFieldMixin, com
this.display_string(display);
return;
}
- if (! no_recurse) {
+ if (!no_recurse) {
var dataset = new data.DataSetStatic(this, this.field.relation, self.build_context());
var def = this.alive(dataset.name_get([self.get("value")])).done(function(data) {
if (!data[0]) {
@@ -341,38 +337,33 @@ var FieldMany2One = common.AbstractField.extend(common.CompletionFieldMixin, com
}
},
display_string: function(str) {
- var self = this;
if (!this.get("effective_readonly")) {
this.$input.val(str.split("\n")[0]);
this.current_display = this.$input.val();
- if (this.is_false()) {
- this.$('.oe_m2o_cm_button').css({'display':'none'});
- } else {
- this.$('.oe_m2o_cm_button').css({'display':'inline'});
- }
+ this.$follow_button.toggle(!this.is_false());
+ this.$el.toggleClass('o_with_button', !!this.$follow_button && this.$follow_button.length > 0 && !this.is_false());
} else {
- var lines = _.escape(str).split("\n");
- var link = "";
- var follow = "";
- link = lines[0];
- follow = _.rest(lines).join("<br />");
- if (follow)
- link += "<br />";
- var $link = this.$el.find('.oe_form_uri')
- .unbind('click')
- .html(link);
- if (! this.options.no_open)
- $link.click(function () {
- var context = self.build_context().eval();
- var model_obj = new Model(self.field.relation);
- model_obj.call('get_formview_action', [self.get("value"), context]).then(function(action){
- self.do_action(action);
- });
- return false;
- });
- $(".oe_form_m2o_follow", this.$el).html(follow);
+ this.$el.html(_.escape(str).split("\n").join("<br/>"));
+ // Define callback to perform when clicking on the field
+ if (!this.options.no_open) {
+ // Remove potential previously added event handler
+ this.$el.off('click');
+ // Ensure that the callback is performed only once even with multiple clicks
+ var execute_formview_action_once = _.once(this.execute_formview_action.bind(this));
+ this.$el.click(function (ev) {
+ ev.preventDefault();
+ execute_formview_action_once();
+ });
+ }
}
},
+ execute_formview_action: function() {
+ var self = this;
+ var context = self.build_context().eval();
+ (new Model(self.field.relation)).call('get_formview_action', [self.get("value"), context]).then(function(action) {
+ self.do_action(action);
+ });
+ },
set_value: function(value_) {
if (value_ instanceof Array) {
this.display_value = {};
@@ -418,11 +409,6 @@ var FieldMany2One = common.AbstractField.extend(common.CompletionFieldMixin, com
this.no_ed = false;
return res;
},
- set_dimensions: function (height, width) {
- this._super(height, width);
- if (!this.get("effective_readonly") && this.$input)
- this.$input.css('height', height);
- }
});
/**
@@ -586,40 +572,39 @@ var AbstractManyField = common.AbstractField.extend({
_.each(command_list, function(command) {
self.mutex.exec(function() {
var id = command[1];
- if (!id || _.isString(id) || _.isNumber(id)) {
- switch (command[0]) {
- case COMMANDS.CREATE:
- var data = _.clone(command[2]);
- delete data.id;
- return dataset.create(data, internal_options).then(function (id) {
+ switch (command[0]) {
+ case COMMANDS.CREATE:
+ var data = _.clone(command[2]);
+ delete data.id;
+ return dataset.create(data, internal_options).then(function (id) {
+ dataset.ids.push(id);
+ res = id;
+ });
+ case COMMANDS.UPDATE:
+ return dataset.write(id, command[2], internal_options).then(function () {
+ if (dataset.ids.indexOf(id) === -1) {
dataset.ids.push(id);
res = id;
- });
- case COMMANDS.UPDATE:
- return dataset.write(id, command[2], internal_options).then(function () {
- if (dataset.ids.indexOf(id) === -1) {
- dataset.ids.push(id);
- res = id;
- }
- });
- case COMMANDS.FORGET:
- return dataset.unlink([id]);
- case COMMANDS.DELETE:
- return dataset.unlink([id]);
- case COMMANDS.LINK_TO:
- if (dataset.ids.indexOf(id) === -1) {
- return dataset.add_ids([id], internal_options);
}
- return;
- case COMMANDS.DELETE_ALL:
- return dataset.reset_ids([], {keep_read_data: true});
- case COMMANDS.REPLACE_WITH:
- dataset.ids = [];
- return dataset.alter_ids(command[2], internal_options);
- }
+ });
+ case COMMANDS.FORGET:
+ return dataset.unlink([id]);
+ case COMMANDS.DELETE:
+ return dataset.unlink([id]);
+ case COMMANDS.LINK_TO:
+ if (dataset.ids.indexOf(id) === -1) {
+ return dataset.add_ids([id], internal_options);
+ }
+ return;
+ case COMMANDS.DELETE_ALL:
+ return dataset.reset_ids([], {keep_read_data: true});
+ case COMMANDS.REPLACE_WITH:
+ dataset.ids = [];
+ return dataset.alter_ids(command[2], internal_options);
+ default:
+ throw new Error("send_commands to '"+self.name+"' receive a non command value." +
+ "\n" + JSON.stringify(command_list));
}
- throw new Error("send_commands to '"+self.name+"' receive a non command value." +
- "\n" + JSON.stringify(command_list));
});
});
@@ -660,10 +645,6 @@ var AbstractManyField = common.AbstractField.extend({
if (record.to_create) {
command_list.push(COMMANDS.create(values));
} else {
- if (index === -1) {
- // because the UPDATE below does not imply LINK_TO
- command_list.push(COMMANDS.link_to(id));
- }
command_list.push(COMMANDS.update(record.id, values));
}
return;
@@ -724,13 +705,12 @@ var FieldX2Many = AbstractManyField.extend({
},
start: function() {
this._super.apply(this, arguments);
- this.$el.addClass('oe_form_field');
-
var self = this;
this.load_views();
var destroy = function() {
self.is_loaded = self.is_loaded.then(function() {
+ self.renderElement();
self.viewmanager.destroy();
return $.when(self.load_views()).done(function() {
self.reload_current_view();
@@ -828,7 +808,8 @@ var FieldX2Many = AbstractManyField.extend({
});
});
$.async_when().done(function () {
- self.alive( self.viewmanager.appendTo(self.$el));
+ self.$el.addClass('o_view_manager_content');
+ self.alive(self.viewmanager.attachTo(self.$el));
});
return def;
},
@@ -881,6 +862,9 @@ var FieldX2Many = AbstractManyField.extend({
}
return true;
},
+ is_false: function() {
+ return false;
+ },
});
var X2ManyDataSet = data.BufferedDataSet.extend({
@@ -891,10 +875,15 @@ var X2ManyDataSet = data.BufferedDataSet.extend({
self.context.add(context);
});
return this.context;
- }
+ },
});
var X2ManyViewManager = ViewManager.extend({
+ custom_events: {
+ // Catch event scrollTo to prevent scrolling to the top when using the
+ // pager of List and Kanban views in One2Many fields
+ 'scrollTo': function() {},
+ },
init: function(parent, dataset, views, flags, x2many_views) {
// By default, render buttons and pager in X2M fields, but no sidebar
flags = _.extend({}, flags, {
@@ -984,6 +973,15 @@ var X2ManyListView = ListView.extend({
});
return valid;
},
+ render_pager: function($node, options) {
+ options = _.extend(options || {}, {
+ single_page_hidden: true,
+ });
+ this._super($node, options);
+ },
+ display_nocontent_helper: function () {
+ return false;
+ },
});
/**
@@ -1008,7 +1006,7 @@ var X2ManyList = ListView.List.extend({
var $cell = $('<td>', {
colspan: columns,
- 'class': 'oe_form_field_x2many_list_row_add'
+ 'class': 'o_form_field_x2many_list_row_add'
}).append(
$('<a>', {href: '#'}).text(_t("Add an item"))
.click(function (e) {
@@ -1037,7 +1035,6 @@ var X2ManyList = ListView.List.extend({
});
var One2ManyListView = X2ManyListView.extend({
- _template: 'One2Many.listview',
init: function () {
this._super.apply(this, arguments);
this.options = _.extend(this.options, {
@@ -1177,7 +1174,7 @@ var One2ManyListView = X2ManyListView.extend({
var click_outside = ($target.closest('.ui-autocomplete,.btn,.modal-backdrop').length === 0);
// Check if click inside the current list editable
- var $o2m = $target.closest(".oe_list_editable");
+ var $o2m = $target.closest(".o_list_editable");
if($o2m.length && $o2m[0] === this.el) {
click_outside = false;
}
@@ -1251,39 +1248,19 @@ var One2ManyGroups = ListView.Groups.extend({
}
});
-var One2ManyFormView = FormView.extend({
- form_template: 'One2Many.formview',
- load_form: function(data) {
- this._super(data);
- var self = this;
- this.$buttons.find('button.oe_form_button_create').click(function() {
- self.save().done(self.on_button_new);
- });
- },
- do_notify_change: function() {
- if (this.dataset.parent_view) {
- this.dataset.parent_view.do_notify_change();
- } else {
- this._super.apply(this, arguments);
- }
- }
-});
-
var FieldOne2Many = FieldX2Many.extend({
init: function() {
this._super.apply(this, arguments);
this.x2many_views = {
- form: One2ManyFormView,
kanban: core.view_registry.get('one2many_kanban'),
list: One2ManyListView,
};
},
start: function() {
- this.$el.addClass('oe_form_field_one2many');
+ this.$el.addClass('o_form_field_one2many');
return this._super.apply(this, arguments);
},
commit_value: function() {
- var self = this;
var view = this.viewmanager.active_view;
if(view.type === "list" && view.controller.editable()) {
return this.mutex.def.then(function () {
@@ -1357,7 +1334,7 @@ var FieldMany2Many = FieldX2Many.extend({
};
},
start: function() {
- this.$el.addClass('oe_form_field_many2many');
+ this.$el.addClass('o_form_field_many2many');
return this._super.apply(this, arguments);
}
});
@@ -1373,7 +1350,7 @@ var FieldMany2ManyKanban = FieldMany2Many.extend({
});
var FieldMany2ManyTags = AbstractManyField.extend(common.CompletionFieldMixin, common.ReinitializeFieldMixin, {
- className: "oe_form_field o_form_field_many2manytags",
+ className: "o_form_field_many2manytags",
tag_template: "FieldMany2ManyTag",
events: {
@@ -1435,7 +1412,6 @@ var FieldMany2ManyTags = AbstractManyField.extend(common.CompletionFieldMixin, c
}
},
get_render_data: function(ids){
- var self = this;
this.dataset.cancel_read();
var fields = this.fields.color ? ['display_name', 'name', 'color'] : ['display_name', 'name']; // TODO master: remove useless 'name'
return this.dataset.read_ids(ids, fields);
@@ -1475,26 +1451,30 @@ var FieldMany2ManyTags = AbstractManyField.extend(common.CompletionFieldMixin, c
}
return false;
},
- set_dimensions: function (height, width) {
- this._super(height, width);
- var $input = this.$('input');
- if (!this.get("effective_readonly") && $input) {
- $input.css('height', height);
+ set_dimensions: function(height, width) {
+ if(this.many2one) {
+ this.many2one.$el.css('height', 'auto');
+ }
+ this.$el.css({
+ width: width,
+ minHeight: height,
+ });
+ if(this.many2one) {
+ this.many2one.$el.css('height', this.$el.height());
}
},
open_color_picker: function(ev){
- this.mutex.exec(function(){
- if (this.fields.color) {
- this.$color_picker = $(QWeb.render('FieldMany2ManyTag.colorpicker', {
- 'widget': this,
- 'tag_id': $(ev.currentTarget).data('id'),
- }));
- $(ev.currentTarget).append(this.$color_picker);
- this.$color_picker.dropdown('toggle');
- this.$color_picker.attr("tabindex", 1).focus();
- }
- }.bind(this));
+ if (this.fields.color) {
+ this.$color_picker = $(QWeb.render('FieldMany2ManyTag.colorpicker', {
+ 'widget': this,
+ 'tag_id': $(ev.currentTarget).data('id'),
+ }));
+
+ $(ev.currentTarget).append(this.$color_picker);
+ this.$color_picker.dropdown('toggle');
+ this.$color_picker.attr("tabindex", 1).focus();
+ }
},
close_color_picker: function(){
this.$color_picker.remove();
@@ -1513,24 +1493,76 @@ var FieldMany2ManyTags = AbstractManyField.extend(common.CompletionFieldMixin, c
var old_color = tag.data('color');
tag.removeClass('o_tag_color_' + old_color);
tag.data('color', color);
- tag.addClass('o_tag_color_' + color);
+ tag.addClass('o_tag_color_' + color);
});
},
-
});
/**
* Widget for (many2many field) to upload one or more file in same time and display in list.
* The user can delete his files.
- * Options on attribute ; "blockui" {Boolean} block the UI or not
- * during the file is uploading
+ * Options on attribute ; "blockui" {Boolean} block the UI or not during the file is uploading
*/
var FieldMany2ManyBinaryMultiFiles = AbstractManyField.extend(common.ReinitializeFieldMixin, {
template: "FieldBinaryFileUploader",
+ events: {
+ 'click .o_attach': function(e) {
+ this.$('.o_form_input_file').click();
+ },
+ 'change .o_form_input_file': function(e) {
+ e.stopPropagation();
+
+ var $target = $(e.target);
+ var value = $target.val();
+
+ if(value !== '') {
+ if(this.data[0] && this.data[0].upload) { // don't upload more of one file in same time
+ return false;
+ }
+
+ var filename = value.replace(/.*[\\\/]/, '');
+ for(var id in this.get('value')) {
+ // if the files exits, delete the file before upload (if it's a new file)
+ if(this.data[id] && (this.data[id].filename || this.data[id].name) == filename && !this.data[id].no_unlink) {
+ this.ds_file.unlink([id]);
+ }
+ }
+
+ if(this.node.attrs.blockui > 0) { // block UI or not
+ framework.blockUI();
+ }
+
+ // TODO : unactivate send on wizard and form
+
+ // submit file
+ this.$('form.o_form_binary_form').submit();
+ this.$(".oe_fileupload").hide();
+ // add file on data result
+ this.data[0] = {
+ id: 0,
+ name: filename,
+ filename: filename,
+ url: '',
+ upload: true,
+ };
+ }
+ },
+ 'click .oe_delete': function(e) {
+ e.preventDefault();
+ e.stopPropagation();
+
+ var file_id = $(e.currentTarget).data("id");
+ if(file_id) {
+ var files = _.without(this.get('value'), file_id);
+ if(!this.data[file_id].no_unlink) {
+ this.ds_file.unlink([file_id]);
+ }
+ this.set({'value': files});
+ }
+ },
+ },
init: function(field_manager, node) {
- this._super(field_manager, node);
- this.field_manager = field_manager;
- this.node = node;
+ this._super.apply(this, arguments);
this.session = session;
if(this.field.type != "many2many" || this.field.relation != 'ir.attachment') {
throw _.str.sprintf(_t("The type of the field '%s' must be a many2many field with a relation to 'ir.attachment' model."), this.field.string);
@@ -1541,40 +1573,39 @@ var FieldMany2ManyBinaryMultiFiles = AbstractManyField.extend(common.Reinitializ
this.fileupload_id = _.uniqueId('oe_fileupload_temp');
$(window).on(this.fileupload_id, _.bind(this.on_file_loaded, this));
},
- initialize_content: function() {
- this.$el.on('change', 'input.o_form_input_file', this.on_file_change );
- },
- get_file_url: function (attachment) {
+ get_file_url: function(attachment) {
return '/web/content/' + attachment.id + '?download=true';
},
- read_name_values : function () {
+ read_name_values : function() {
var self = this;
// don't reset know values
var ids = this.get('value');
- var _value = _.filter(ids, function (id) { return typeof self.data[id] == 'undefined'; } );
+ var _value = _.filter(ids, function(id) { return self.data[id] === undefined; });
// send request for get_name
- if (_value.length) {
- return this.ds_file.call('read', [_value, ['id', 'name', 'datas_fname', 'mimetype']]).then(function (datas) {
- _.each(datas, function (data) {
- data.no_unlink = true;
- data.url = self.get_file_url(data);
- self.data[data.id] = data;
- });
- return ids;
- });
+ if(_value.length) {
+ return this.ds_file.call('read', [_value, ['id', 'name', 'datas_fname', 'mimetype']])
+ .then(process_data);
} else {
return $.when(ids);
}
+
+ function process_data(datas) {
+ _.each(datas, function(data) {
+ data.no_unlink = true;
+ data.url = self.get_file_url(data);
+ self.data[data.id] = data;
+ });
+ return ids;
+ }
},
- render_value: function () {
+ render_value: function() {
var self = this;
this.read_name_values().then(function (ids) {
- var render = $(QWeb.render('FieldBinaryFileUploader.files', {'widget': self, 'values': ids}));
- render.on('click', '.oe_delete', _.bind(self.on_file_delete, self));
- self.$('.oe_placeholder_files, .oe_attachments').replaceWith( render );
+ self.$('.oe_placeholder_files, .oe_attachments')
+ .replaceWith($(QWeb.render('FieldBinaryFileUploader.files', {'widget': self, 'values': ids})));
// reinit input type file
- var $input = self.$('input.o_form_input_file');
+ var $input = self.$('.o_form_input_file');
$input.after($input.clone(true)).remove();
self.$(".oe_fileupload").show();
@@ -1587,77 +1618,26 @@ var FieldMany2ManyBinaryMultiFiles = AbstractManyField.extend(common.Reinitializ
});
});
},
- on_file_change: function (event) {
- event.stopPropagation();
- var self = this;
- var $target = $(event.target);
- if ($target.val() !== '') {
- var filename = $target.val().replace(/.*[\\\/]/,'');
- // don't uplode more of one file in same time
- if (self.data[0] && self.data[0].upload ) {
- return false;
- }
- for (var id in this.get('value')) {
- // if the files exits, delete the file before upload (if it's a new file)
- if (self.data[id] && (self.data[id].filename || self.data[id].name) == filename && !self.data[id].no_unlink ) {
- self.ds_file.unlink([id]);
- }
- }
-
- // block UI or not
- if(this.node.attrs.blockui>0) {
- framework.blockUI();
- }
-
- // TODO : unactivate send on wizard and form
-
- // submit file
- this.$('form.o_form_binary_form').submit();
- this.$(".oe_fileupload").hide();
- // add file on data result
- this.data[0] = {
- 'id': 0,
- 'name': filename,
- 'filename': filename,
- 'url': '',
- 'upload': true
- };
- }
- },
- on_file_loaded: function (event, result) {
- var files = this.get('value');
-
- // unblock UI
- if(this.node.attrs.blockui>0) {
+ on_file_loaded: function(e, result) {
+ if(this.node.attrs.blockui > 0) { // unblock UI
framework.unblockUI();
}
- if (result.error || !result.id ) {
- this.do_warn( _t('Uploading Error'), result.error);
+ if(result.error || !result.id) {
+ this.do_warn(_t('Uploading Error'), result.error);
delete this.data[0];
} else {
- if (this.data[0] && this.data[0].filename == result.filename && this.data[0].upload) {
+ if(this.data[0] && this.data[0].filename === result.filename && this.data[0].upload) {
delete this.data[0];
}
result.url = this.get_file_url(result);
this.data[result.id] = result;
var values = _.clone(this.get('value'));
values.push(result.id);
- this.set({'value': values});
+ this.set({value: values});
}
this.render_value();
},
- on_file_delete: function (event) {
- event.stopPropagation();
- var file_id=$(event.target).closest('.oe_delete').data("id");
- if (file_id) {
- var files = _.filter(this.get('value'), function (id) {return id != file_id;});
- if(!this.data[file_id].no_unlink) {
- this.ds_file.unlink([file_id]);
- }
- this.set({'value': files});
- }
- },
});
/*
@@ -1672,7 +1652,7 @@ var FieldMany2ManyCheckBoxes = AbstractManyField.extend(common.ReinitializeField
this.set("records", []);
this.field_manager.on("view_content_has_changed", this, function() {
var domain = new data.CompoundDomain(this.build_domain()).eval();
- if (! _.isEqual(domain, this.get("domain"))) {
+ if (!_.isEqual(domain, this.get("domain"))) {
this.set("domain", domain);
}
});
@@ -1694,18 +1674,22 @@ var FieldMany2ManyCheckBoxes = AbstractManyField.extend(common.ReinitializeField
});
},
render_value: function() {
- this.$().html(QWeb.render("FieldMany2ManyCheckBoxes", {widget: this}));
- var inputs = this.$("input");
- inputs.change(_.bind(this.from_dom, this));
- if (this.get("effective_readonly"))
- inputs.attr("disabled", "true");
+ this.$el.html(QWeb.render("FieldMany2ManyCheckBoxes", {widget: this}));
+ var $inputs = this.$("input");
+ $inputs.change(_.bind(this.from_dom, this));
+ if (this.get("effective_readonly")) {
+ $inputs.attr("disabled", "true");
+ }
},
from_dom: function() {
var new_value = this.$("input:checked").map(function() { return +$(this).data("record-id"); }).get();
- if (! _.isEqual(new_value, this.get("value"))) {
+ if (!_.isEqual(new_value, this.get("value"))) {
this.internal_set_value(new_value);
}
- }
+ },
+ is_false: function() {
+ return false;
+ },
});
core.form_widget_registry
@@ -1718,9 +1702,13 @@ core.form_widget_registry
.add('many2many_binary', FieldMany2ManyBinaryMultiFiles)
.add('many2many_checkboxes', FieldMany2ManyCheckBoxes);
+core.one2many_view_registry
+ .add('list', One2ManyListView);
+
return {
FieldMany2ManyTags: FieldMany2ManyTags,
AbstractManyField: AbstractManyField,
+ FieldMany2One: FieldMany2One,
};
});
diff --git a/addons/web/static/src/js/views/form_upgrade_widgets.js b/addons/web/static/src/js/views/form_upgrade_widgets.js
new file mode 100644
index 00000000000..ce32ef0664b
--- /dev/null
+++ b/addons/web/static/src/js/views/form_upgrade_widgets.js
@@ -0,0 +1,101 @@
+odoo.define('web.form_upgrade_widgets', function (require) {
+"use strict";
+
+var core = require('web.core');
+var Dialog = require('web.Dialog');
+var form_widgets = require('web.form_widgets');
+var framework = require('web.framework');
+var Model = require('web.DataModel');
+
+var _t = core._t;
+var QWeb = core.qweb;
+
+/**
+ * This widget is intended to be used in config settings.
+ * When checked, an upgrade popup is showed to the user.
+ */
+var AbstractFieldUpgrade = {
+ events: {
+ 'click input': 'on_click_input',
+ },
+
+ start: function() {
+ this._super.apply(this, arguments);
+
+ this.get_enterprise_label().after($("<span>", {
+ text: "Enterprise",
+ 'class': "label label-primary oe_inline"
+ }));
+ },
+
+ open_dialog: function() {
+ var message = $(QWeb.render('EnterpriseUpgrade'));
+
+ var buttons = [
+ {
+ text: _t("Upgrade now"),
+ classes: 'btn-primary',
+ close: true,
+ click: this.confirm_upgrade,
+ },
+ {
+ text: _t("Cancel"),
+ close: true,
+ },
+ ];
+
+ return new Dialog(this, {
+ size: 'medium',
+ buttons: buttons,
+ $content: $('<div>', {
+ html: message,
+ }),
+ title: _t("Odoo Enterprise"),
+ }).open();
+ },
+
+ confirm_upgrade: function() {
+ new Model("res.users").call("search_count", [[["share", "=", false]]]).then(function(data) {
+ framework.redirect("https://www.odoo.com/odoo-enterprise/upgrade?num_users=" + data);
+ });
+ },
+
+ get_enterprise_label: function() {},
+ on_click_input: function() {},
+};
+
+var UpgradeBoolean = form_widgets.FieldBoolean.extend(AbstractFieldUpgrade, {
+ template: "FieldUpgradeBoolean",
+
+ get_enterprise_label: function() {
+ return this.$label;
+ },
+
+ on_click_input: function() {
+ if(this.$checkbox.prop("checked")) {
+ this.open_dialog().on('closed', this, function() {
+ this.$checkbox.prop("checked", false);
+ });
+ }
+ },
+});
+
+var UpgradeRadio = form_widgets.FieldRadio.extend(AbstractFieldUpgrade, {
+ get_enterprise_label: function() {
+ return this.$('label').last();
+ },
+
+ on_click_input: function(event) {
+ if($(event.target).val() === 1) {
+ this.open_dialog().on('closed', this, function() {
+ this.$('input').first().prop("checked", true);
+ });
+ }
+ },
+});
+
+core.form_widget_registry
+ .add('upgrade_boolean', UpgradeBoolean)
+ .add('upgrade_radio', UpgradeRadio);
+
+});
diff --git a/addons/web/static/src/js/views/form_view.js b/addons/web/static/src/js/views/form_view.js
index 7a2cf428400..d2c7a21eb04 100644
--- a/addons/web/static/src/js/views/form_view.js
+++ b/addons/web/static/src/js/views/form_view.js
@@ -1,12 +1,14 @@
odoo.define('web.FormView', function (require) {
"use strict";
+var common = require('web.form_common');
var core = require('web.core');
var crash_manager = require('web.crash_manager');
var data = require('web.data');
var Dialog = require('web.Dialog');
-var common = require('web.form_common');
+var FormRenderingEngine = require('web.FormRenderingEngine');
var Model = require('web.DataModel');
+var Pager = require('web.Pager');
var Sidebar = require('web.Sidebar');
var utils = require('web.utils');
var View = require('web.View');
@@ -14,7 +16,6 @@ var View = require('web.View');
var _t = core._t;
var _lt = core._lt;
var QWeb = core.qweb;
-var Class = core.Class;
/**
* Properties:
@@ -22,7 +23,7 @@ var Class = core.Class;
* the mode used by the view.
*/
var FormView = View.extend(common.FieldManagerMixin, {
- accesskey: "F",
+ className: "o_form_view",
defaults: _.extend({}, View.prototype.defaults, {
not_interactible_on_create: false,
initial_mode: "view",
@@ -34,8 +35,20 @@ var FormView = View.extend(common.FieldManagerMixin, {
multi_record: false,
// Indicates that this view is not searchable, and thus that no search view should be displayed.
searchable: false,
- template: "FormView",
+ /**
+ * Called each time the form view is attached into the DOM
+ */
+ on_attach_callback: function() {
+ this.trigger('attached');
+ this.autofocus();
+ },
+ /**
+ * Called each time the form view is detached from the DOM
+ */
+ on_detach_callback: function() {
+ this.trigger('detached');
+ },
init: function() {
var self = this;
this._super.apply(this, arguments);
@@ -60,14 +73,11 @@ var FormView = View.extend(common.FieldManagerMixin, {
this.__clicked_inside = false;
this.__blur_timeout = null;
this.rendering_engine = new FormRenderingEngine(this);
- self.set({actual_mode: self.options.initial_mode});
+ this.set({actual_mode: this.options.initial_mode});
this.has_been_loaded.done(function() {
self._build_onchange_specs();
- self.check_actual_mode();
- self.on("change:actual_mode", self, self.check_actual_mode);
self.on("change:actual_mode", self, self.toggle_buttons);
self.on("change:actual_mode", self, self.toggle_sidebar);
- self.on("change:actual_mode", self, self.do_update_pager);
});
self.on("load_record", self, self.load_record);
core.bus.on('clear_uncommitted_changes', this, function(chain_callbacks) {
@@ -90,8 +100,7 @@ var FormView = View.extend(common.FieldManagerMixin, {
this.rendering_engine.set_tags_registry(this.tags_registry);
this.rendering_engine.set_widgets_registry(this.widgets_registry);
this.rendering_engine.set_fields_view(this.fields_view);
- var $dest = this.$el.hasClass("oe_form_container") ? this.$el : this.$el.find('.oe_form_container');
- this.rendering_engine.render_to($dest);
+ this.rendering_engine.render_to(this.$el);
this.$el.on('mousedown.formBlur', function () {
self.__clicked_inside = true;
@@ -100,22 +109,14 @@ var FormView = View.extend(common.FieldManagerMixin, {
this.has_been_loaded.resolve();
// Add bounce effect on button 'Edit' when click on readonly page view.
- this.$el.find(".oe_form_group_row,.oe_form_field,label,h1,.oe_title,.oe_notebook_page, .oe_list_content").on('click', function (e) {
+ this.$(".oe_title,.o_group").on('mouseup', function (e) { // 'mouseup' event because some widget need bootstrap click event to go up to body
if(self.get("actual_mode") === "view" && self.$buttons && !$(e.target).is('[data-toggle]')) {
- var $button = self.$buttons.find(".oe_form_button_edit");
+ var $button = self.$buttons.find(".o_form_button_edit");
$button.openerpBounce();
e.stopPropagation();
core.bus.trigger('click', e);
}
});
- //bounce effect on red button when click on statusbar.
- this.$el.find(".oe_form_field_status:not(.oe_form_status_clickable)").on('click', function (e) {
- if((self.get("actual_mode") === "view")) {
- var $button = self.$el.find(".oe_highlight:not(.o_form_invisible)").css({'float':'left','clear':'none'});
- $button.openerpBounce();
- e.stopPropagation();
- }
- });
return this._super();
},
destroy: function() {
@@ -133,10 +134,10 @@ var FormView = View.extend(common.FieldManagerMixin, {
* Set this.$buttons with the produced jQuery element
* @param {jQuery} [$node] a jQuery node where the rendered buttons should be inserted
* $node may be undefined, in which case the FormView inserts them into this.options.$buttons
- * or into a div of its template
+ * if it exists
*/
render_buttons: function($node) {
- this.$buttons = $('<div/>', {'class': 'oe_form_buttons'});
+ this.$buttons = $('<div/>');
var $footer = this.$('footer');
if (this.options.action_buttons !== false || this.options.footer_to_buttons && $footer.children().length === 0) {
@@ -148,23 +149,17 @@ var FormView = View.extend(common.FieldManagerMixin, {
// Show or hide the buttons according to the view mode
this.toggle_buttons();
- this.$buttons.on('click', '.oe_form_button_create', this.on_button_create);
- this.$buttons.on('click', '.oe_form_button_edit', this.on_button_edit);
- this.$buttons.on('click', '.oe_form_button_save', this.on_button_save);
- this.$buttons.on('click', '.oe_form_button_cancel', this.on_button_cancel);
+ this.$buttons.on('click', '.o_form_button_create', this.on_button_create);
+ this.$buttons.on('click', '.o_form_button_edit', this.on_button_edit);
+ this.$buttons.on('click', '.o_form_button_save', this.on_button_save);
+ this.$buttons.on('click', '.o_form_button_cancel', this.on_button_cancel);
- if ($node) {
- this.$buttons.appendTo($node);
- } else {
- this.$('.oe_form_buttons').replaceWith(this.$buttons);
- }
+ this.$buttons.appendTo($node);
},
/**
* Instantiate and render the sidebar if a sidebar is requested
* Sets this.sidebar
* @param {jQuery} [$node] a jQuery node where the sidebar should be inserted
- * $node may be undefined, in which case the FormView inserts the sidebar in a
- * div of its template
**/
render_sidebar: function($node) {
if (!this.sidebar && this.options.sidebar) {
@@ -177,7 +172,6 @@ var FormView = View.extend(common.FieldManagerMixin, {
this.is_action_enabled('create') && { label: _t('Duplicate'), callback: this.on_button_duplicate }
]));
- $node = $node || this.$('.oe_form_sidebar');
this.sidebar.appendTo($node);
// Show or hide the sidebar according to the view mode
@@ -185,41 +179,33 @@ var FormView = View.extend(common.FieldManagerMixin, {
}
},
/**
- * Render the pager according to the FormView.pager template and add listeners on it.
- * Set this.$pager with the produced jQuery element
- * @param {jQuery} [$node] a jQuery node where the rendered pager should be inserted
+ * Instantiate and render the pager and add listeners on it.
+ * Set this.pager
+ * @param {jQuery} [$node] a jQuery node where the pager should be inserted
* $node may be undefined, in which case the FormView inserts the pager into this.options.$pager
- * or into a div of its template
*/
render_pager: function($node) {
if (this.options.pager) {
var self = this;
- if (this.$pager) {
- this.$pager.remove();
- }
- if (this.get("actual_mode") === "create") {
- return;
- }
- this.$pager = $(QWeb.render("FormView.pager", {'widget': self}));
- this.$pager.on('click','a[data-pager-action]',function() {
- var $el = $(this);
- if ($el.attr("disabled")) {
- return;
- }
- var action = $el.data('pager-action');
- var def = $.when(self.execute_pager_action(action));
- $el.attr("disabled");
- def.always(function() {
- $el.removeAttr("disabled");
+ var options = {
+ validate: _.bind(this.can_be_discarded, this),
+ };
+
+ this.pager = new Pager(this, this.dataset.ids.length, this.dataset.index + 1, 1, options);
+ this.pager.on('pager_changed', this, function (new_state) {
+ this.pager.disable();
+ this.dataset.index = new_state.current_min - 1;
+ this.trigger('pager_action_executed');
+ $.when(this.reload()).then(function () {
+ self.pager.enable();
});
});
- this.do_update_pager();
- $node = $node || this.options.$pager;
- if ($node) {
- this.$pager.appendTo($node);
- } else {
- this.$('.oe_form_pager').replaceWith(this.$pager);
+ this.pager.appendTo($node = $node || this.options.$pager);
+
+ // Hide the pager in create mode
+ if (this.get("actual_mode") === "create") {
+ this.pager.do_hide();
}
}
},
@@ -241,6 +227,16 @@ var FormView = View.extend(common.FieldManagerMixin, {
this.sidebar.do_toggle(this.get("actual_mode") === "view");
}
},
+ update_pager: function() {
+ if (this.pager) {
+ // Hide the pager in create mode
+ if (this.get("actual_mode") === "create") {
+ this.pager.do_hide();
+ } else {
+ this.pager.update_state({size: this.dataset.ids.length, current_min: this.dataset.index + 1});
+ }
+ }
+ },
widgetFocused: function() {
// Clear click flag if used to focus a widget
this.__clicked_inside = false;
@@ -281,11 +277,6 @@ var FormView = View.extend(common.FieldManagerMixin, {
do_show: function (options) {
var self = this;
options = options || {};
- this._super();
- this.$el.css({
- opacity: '0',
- filter: 'alpha(opacity = 0)'
- });
this.$el.removeClass('oe_form_dirty');
var shown = this.has_been_loaded;
@@ -307,10 +298,6 @@ var FormView = View.extend(common.FieldManagerMixin, {
}
return $.when(shown, this._super()).then(function() {
self._actualize_mode(options.mode || self.options.initial_mode);
- self.$el.css({
- opacity: '1',
- filter: 'alpha(opacity = 100)'
- });
core.bus.trigger('form_view_shown', self);
});
},
@@ -324,6 +311,7 @@ var FormView = View.extend(common.FieldManagerMixin, {
this.datarecord = record;
this._actualize_mode();
this.set({ 'title' : record.id ? record.display_name : _t("New") });
+ this.update_pager();
this.record_loaded = $.Deferred();
_(this.fields).each(function (field, f) {
@@ -342,19 +330,17 @@ var FormView = View.extend(common.FieldManagerMixin, {
self.rendering_engine.init_fields().then(function() {
self.is_initialized.resolve();
self.record_loaded.resolve();
- self.do_update_pager(record.id === null || record.id === undefined);
if (self.sidebar) {
- self.sidebar.do_attachement_update(self.dataset, self.datarecord.id);
+ self.sidebar.do_attachement_update(self.dataset, self.datarecord.id);
}
if (record.id) {
self.do_push_state({id:record.id});
} else {
self.do_push_state({});
}
- self.$el.removeClass('oe_form_dirty');
- self.autofocus();
+ self.$el.removeClass('oe_form_dirty');
});
- });
+ });
},
/**
* Loads and sets up the default values for the model as the current
@@ -370,7 +356,7 @@ var FormView = View.extend(common.FieldManagerMixin, {
self.trigger('load_record', _.clone(r));
});
}
- return self.trigger('load_record', {});
+ return $.when().then(this.trigger.bind(this, 'load_record', {}));
},
on_form_changed: function() {
this.trigger("view_content_has_changed");
@@ -378,40 +364,6 @@ var FormView = View.extend(common.FieldManagerMixin, {
do_notify_change: function() {
this.$el.addClass('oe_form_dirty');
},
- execute_pager_action: function(action) {
- var self = this;
- return this.can_be_discarded().then(function() {
- switch (action) {
- case 'first':
- self.dataset.index = 0;
- break;
- case 'previous':
- self.dataset.previous();
- break;
- case 'next':
- self.dataset.next();
- break;
- case 'last':
- self.dataset.index = self.dataset.ids.length - 1;
- break;
- }
- self.trigger('pager_action_executed');
- return self.reload();
- });
- },
- do_update_pager: function(hide_index) {
- if (this.$pager) {
- // Hide the pager in create mode or when there is only one record
- var pager_visible = (this.get("actual_mode") !== "create") && (this.dataset.ids.length > 1);
- this.$pager.toggle(pager_visible);
- if (hide_index === true) {
- this.$pager.find(".oe_form_pager_state").html("");
- } else {
- this.$pager.find(".oe_form_pager_state").html(_.str.sprintf(_t("%d / %d"), this.dataset.index + 1, this.dataset.ids.length));
- }
- }
- },
-
_build_onchange_specs: function() {
var self = this;
var find = function(field_name, root) {
@@ -664,15 +616,15 @@ var FormView = View.extend(common.FieldManagerMixin, {
} else if (mode === "create") {
mode = "edit";
}
+
+ var viewMode = (mode === "view");
+ this.$el.toggleClass('o_form_readonly', viewMode).toggleClass('o_form_editable', !viewMode);
+
this.render_value_defs = [];
this.set({actual_mode: mode});
- },
- check_actual_mode: function(source, options) {
- if(this.get("actual_mode") === "view") {
- this.$el.removeClass('oe_form_editable').addClass('oe_form_readonly');
- } else {
- this.$el.removeClass('oe_form_readonly').addClass('oe_form_editable');
- _.defer(_.bind(this.autofocus, this));
+
+ if(!viewMode) {
+ this.autofocus();
}
},
autofocus: function() {
@@ -699,7 +651,7 @@ var FormView = View.extend(common.FieldManagerMixin, {
this.$('.oe_form_buttons').add(this.$buttons).find('button.o_disabled').removeClass('o_disabled').prop('disabled', false);
this.is_disabled = false;
},
- on_button_save: function(e) {
+ on_button_save: function() {
var self = this;
if (this.is_disabled) {
return;
@@ -716,7 +668,7 @@ var FormView = View.extend(common.FieldManagerMixin, {
self.enable_button();
});
},
- on_button_cancel: function(event) {
+ on_button_cancel: function() {
var self = this;
this.can_be_discarded().then(function() {
if (self.get('actual_mode') === 'create') {
@@ -733,10 +685,11 @@ var FormView = View.extend(common.FieldManagerMixin, {
},
on_button_new: function() {
var self = this;
- this.to_edit_mode();
return $.when(this.has_been_loaded).then(function() {
return self.can_be_discarded().then(function() {
- return self.load_defaults();
+ return self.load_defaults().then(function() {
+ self.to_edit_mode();
+ });
});
});
},
@@ -763,7 +716,8 @@ var FormView = View.extend(common.FieldManagerMixin, {
if (self.datarecord.id && confirm(_t("Do you really want to delete this record?"))) {
self.dataset.unlink([self.datarecord.id]).done(function() {
if (self.dataset.size()) {
- self.execute_pager_action('next');
+ self.reload();
+ self.update_pager();
} else {
self.do_action('history_back');
}
@@ -790,7 +744,9 @@ var FormView = View.extend(common.FieldManagerMixin, {
title: _t("Warning"),
confirm_callback: function() {
self.$el.removeClass('oe_form_dirty');
- def.resolve();
+ this.on('closed', null, function() { // 'this' is the dialog widget
+ def.resolve();
+ });
},
cancel_callback: function() {
def.reject();
@@ -951,7 +907,7 @@ var FormView = View.extend(common.FieldManagerMixin, {
this.dataset.alter_ids([this.datarecord.id].concat(this.dataset.ids));
this.dataset.index = 0;
}
- this.do_update_pager();
+ this.update_pager();
if (this.sidebar) {
this.sidebar.do_attachement_update(this.dataset, this.datarecord.id);
}
@@ -1090,7 +1046,7 @@ var FormView = View.extend(common.FieldManagerMixin, {
$box.remove();
});
// add content inside notification box on top of the sheet/form
- var $target = this.$('.oe_form_sheet').length ? this.$('.oe_form_sheet') : this.$el;
+ var $target = this.$('.o_form_sheet_bg').length ? this.$('.o_form_sheet_bg') : this.$el;
$target.prepend($box);
},
open_defaults_dialog: function () {
@@ -1153,7 +1109,7 @@ var FormView = View.extend(common.FieldManagerMixin, {
var $defaults = d.$el.find('#formview_default_fields');
var field_to_set = $defaults.val();
if (!field_to_set) {
- $defaults.parent().addClass('oe_form_invalid');
+ $defaults.parent().addClass('o_form_invalid');
return;
}
var condition = d.$el.find('#formview_default_conditions').val(),
@@ -1234,21 +1190,29 @@ var FormView = View.extend(common.FieldManagerMixin, {
},
});
-/**
- * Interface to be implemented by rendering engines for the form view.
- */
-var FormRenderingEngineInterface = Class.extend({
- set_fields_view: function(fields_view) {},
- set_fields_registry: function(fields_registry) {},
- render_to: function($el) {},
+core.view_registry.add('form', FormView);
+
+return FormView;
+
});
+
+odoo.define('web.FormRenderingEngine', function (require) {
+"use strict";
+
+var common = require('web.form_common');
+var core = require('web.core');
+var utils = require('web.utils');
+
+var _t = core._t;
+var QWeb = core.qweb;
+
/**
* Default rendering engine for the form view.
*
* It is necessary to set the view using set_view() before usage.
*/
-var FormRenderingEngine = FormRenderingEngineInterface.extend({
+return core.Class.extend({
init: function(view) {
this.view = view;
},
@@ -1289,7 +1253,7 @@ var FormRenderingEngine = FormRenderingEngineInterface.extend({
$('board', doc).each(function() {
$(this).attr('layout', $(this).attr('style'));
});
- return $('<div class="oe_form"/>').append(utils.xml_to_str(doc));
+ return $(utils.xml_to_str(doc));
},
render_to: function($target) {
var self = this;
@@ -1305,7 +1269,8 @@ var FormRenderingEngine = FormRenderingEngineInterface.extend({
this.labels = {};
this.process(this.$form);
- this.$form.appendTo(this.$target);
+ this.$form.contents().appendTo(this.$target);
+ this.handle_common_properties(this.$target, this.$form);
this.to_replace = [];
@@ -1382,9 +1347,6 @@ var FormRenderingEngine = FormRenderingEngineInterface.extend({
args[0] = $tag;
return fn.apply(self, args);
} else {
- if( tagname === 'header') {
- $tag.addClass('o_statusbar_buttons');
- }
// generic tag handling, just process children
$tag.children().each(function() {
self.process($(this));
@@ -1408,14 +1370,14 @@ var FormRenderingEngine = FormRenderingEngineInterface.extend({
process_sheet: function($sheet) {
var $new_sheet = this.render_element('FormRenderingSheet', $sheet.getAttributes());
this.handle_common_properties($new_sheet, $sheet);
- var $dst = $new_sheet.find('.oe_form_sheet');
+ var $dst = $new_sheet.find('.o_form_sheet');
$sheet.contents().appendTo($dst);
$sheet.before($new_sheet).remove();
this.process($new_sheet);
},
process_form: function($form) {
if ($form.find('> sheet').length === 0) {
- $form.addClass('oe_form_nosheet');
+ $form.addClass('o_form_nosheet');
}
var $new_form = this.render_element('FormRenderingForm', $form.getAttributes());
this.handle_common_properties($new_form, $form);
@@ -1479,119 +1441,99 @@ var FormRenderingEngine = FormRenderingEngineInterface.extend({
},
process_group: function($group) {
var self = this;
- $group.children('field').each(function() {
- self.preprocess_field($(this));
- });
- var $new_group = this.render_element('FormRenderingGroup', $group.getAttributes());
- var $table;
- if ($new_group.first().is('table.oe_form_group')) {
- $table = $new_group;
- } else if ($new_group.filter('table.oe_form_group').length) {
- $table = $new_group.filter('table.oe_form_group').first();
- } else {
- $table = $new_group.find('table.oe_form_group').first();
- }
- var $tr, $td,
- cols = parseInt($group.attr('col') || 2, 10),
- row_cols = cols;
+ // Processes a group containing nested groups
+ // Renders a div for each nested group, into a div that is the outer group
+ // The nested groups's width is a percentage according to col and colspan attributes
+ var _process_outer_group = function(col) {
+ var $new_group = self.render_element('FormRenderingOuterGroup', $group.getAttributes());
+ $group.children().each(function() {
+ var $child = $(this);
+ var tagName = $child[0].tagName.toLowerCase();
+ var colspan = parseInt($child.attr('colspan') || 1, 10);
- var children = [];
- $group.children().each(function() {
- var $child = $(this);
- var colspan = parseInt($child.attr('colspan') || 1, 10);
- var tagName = $child[0].tagName.toLowerCase();
- var $td = $('<td/>').addClass('oe_form_group_cell').attr('colspan', colspan);
- var newline = tagName === 'newline';
-
- // Note FME: those classes are used in layout debug mode
- if ($tr && row_cols > 0 && (newline || row_cols < colspan)) {
- $tr.addClass('oe_form_group_row_incomplete');
- if (newline) {
- $tr.addClass('oe_form_group_row_newline');
+ if (tagName === 'newline') {
+ $new_group.append($('<br>')); // Skip to the next line
+ return;
}
- }
- if (newline) {
- $tr = null;
- return;
- }
- if (!$tr || row_cols < colspan) {
- $tr = $('<tr/>').addClass('oe_form_group_row').appendTo($table);
- row_cols = cols;
- } else if (tagName==='group') {
- // When <group> <group/><group/> </group>, we need a spacing between the two groups
- $td.addClass('oe_group_right');
- }
- row_cols -= colspan;
+ // compute child's classname from col and colspan attributes
+ $child.addClass('o_group_col_' + Math.min(Math.floor(colspan/col*12), 12));
+ $new_group.append($child);
- // invisibility transfer
- var field_modifiers = JSON.parse($child.attr('modifiers') || '{}');
- var invisible = field_modifiers.invisible;
- self.handle_common_properties($td, $("<dummy>").attr("modifiers", JSON.stringify({invisible: invisible})));
+ children.push($child[0]);
+ });
+ return $new_group;
+ };
+ // Processes a group containing no nested group
+ // Renders an HTML table
+ var _process_inner_group = function(col) {
+ var $new_group = self.render_element('FormRenderingInnerGroup', $group.getAttributes());
+ $new_group.find('td').attr('colspan', col); // Group's title spans all column
+ var row_col = col;
+ var $row = null;
- $tr.append($td.append($child));
- children.push($child[0]);
- });
- if (row_cols && $td) {
- $td.attr('colspan', parseInt($td.attr('colspan'), 10) + row_cols);
- }
- $group.before($new_group).remove();
+ $group.children().each(function() {
+ var $child = $(this);
+ var tagName = $child[0].tagName.toLowerCase();
+ var colspan = parseInt($child.attr('colspan') || 1, 10);
- $table.find('> tbody > tr').each(function() {
- var to_compute = [],
- row_cols = cols,
- total = 100;
- $(this).children().each(function() {
- var $td = $(this),
- $child = $td.children(':first');
- if ($child.attr('cell-class')) {
- $td.addClass($child.attr('cell-class'));
+ if (tagName === 'newline') {
+ $row = null; // Start with a new row
+ return;
}
- switch ($child[0].tagName.toLowerCase()) {
- case 'separator':
- break;
- case 'label':
- if ($child.attr('for')) {
- $td.attr('width', '1%').addClass('oe_form_group_cell_label');
- row_cols-= $td.attr('colspan') || 1;
- total--;
- }
- break;
- default:
- var width = _.str.trim($child.attr('width') || ''),
- iwidth = parseInt(width, 10);
- if (iwidth) {
- if (width.substr(-1) === '%') {
- total -= iwidth;
- width = iwidth + '%';
- } else {
- // Absolute width
- $td.css('min-width', width + 'px');
- }
- $td.attr('width', width);
- $child.removeAttr('width');
- row_cols-= $td.attr('colspan') || 1;
- } else {
- to_compute.push($td);
- }
-
+ row_col -= colspan;
+ if (!$row || row_col < 0) { // Append a new row to the group
+ $row = $('<tr>').appendTo($new_group);
+ row_col = col-colspan;
}
+ $('<td>').attr('colspan', colspan).append($child).appendTo($row);
+
+ children.push($child[0]);
});
- if (row_cols) {
- var unit = Math.floor(total / row_cols);
- if (!$(this).is('.oe_form_group_row_incomplete')) {
- _.each(to_compute, function($td) {
- var width = parseInt($td.attr('colspan'), 10) * unit;
- $td.attr('width', width + '%');
- total -= width;
- });
- }
- }
+
+ // Some kind of an hack
+ // Add width on table's cell to avoid automatic layout of table which
+ // makes first col to take full width available (typically, first col contains label)
+ $new_group.find('tr').each(function() {
+ var $tr = $(this);
+ var nonlabel_width = 100/(col - $tr.find('td > label:first-child').length);
+ $tr.find('td').each(function() {
+ var $td = $(this);
+ var $child = $td.children(':first');
+ if ($child.is("label")) {
+ $td.addClass("o_td_label");
+ } else {
+ $td.css("width", (nonlabel_width*parseInt($td.attr('colspan')))+"%");
+ }
+ });
+
+ });
+ return $new_group;
+ };
+
+ // Preprocess field children
+ $group.children('field').each(function() {
+ self.preprocess_field($(this));
});
+
+ // Process group
+ var nested_groups = $group.children('group').length; // Detect possible nested groups
+ var children = [];
+ var col = parseInt($group.attr('col') || 2, 10);
+ var $new_group;
+ if (nested_groups) {
+ $new_group = _process_outer_group(col);
+ } else {
+ $new_group = _process_inner_group(col);
+ }
+ this.handle_common_properties($new_group, $group);
+
+ // Process group's children
+ $group.before($new_group).remove();
_.each(children, function(el) {
self.process($(el));
});
- this.handle_common_properties($new_group, $group);
+
return $new_group;
},
process_notebook: function($notebook) {
@@ -1658,17 +1600,8 @@ var FormRenderingEngine = FormRenderingEngineInterface.extend({
var dict = {
string: $label.attr('string') || (field_orm || {}).string || '',
help: $label.attr('help') || (field_orm || {}).help || '',
- _for: name ? _.uniqueId('oe-field-input-') : undefined,
+ _for: name ? _.uniqueId('o_field_input_') : undefined,
};
- var align = parseFloat(dict.align);
- if (isNaN(align) || align === 1) {
- align = 'right';
- } else if (align === 0) {
- align = 'left';
- } else {
- align = 'center';
- }
- dict.align = align;
var $new_label = this.render_element('FormRenderingLabel', dict);
$label.before($new_label).remove();
this.handle_common_properties($new_label, $label);
@@ -1698,8 +1631,4 @@ var FormRenderingEngine = FormRenderingEngineInterface.extend({
}
});
-core.view_registry.add('form', FormView);
-
-return FormView;
-
});
diff --git a/addons/web/static/src/js/views/form_widgets.js b/addons/web/static/src/js/views/form_widgets.js
index 2a2a36cdaba..2aeaaa17111 100644
--- a/addons/web/static/src/js/views/form_widgets.js
+++ b/addons/web/static/src/js/views/form_widgets.js
@@ -5,17 +5,17 @@ var core = require('web.core');
var crash_manager = require('web.crash_manager');
var data = require('web.data');
var datepicker = require('web.datepicker');
+var dom_utils = require('web.dom_utils');
+var Priority = require('web.Priority');
var ProgressBar = require('web.ProgressBar');
var Dialog = require('web.Dialog');
var common = require('web.form_common');
var formats = require('web.formats');
var framework = require('web.framework');
var Model = require('web.DataModel');
-var Priority = require('web.Priority');
var pyeval = require('web.pyeval');
var session = require('web.session');
var utils = require('web.utils');
-var dom_utils = require('web.dom_utils');
var _t = core._t;
var QWeb = core.qweb;
@@ -119,24 +119,25 @@ var WidgetButton = common.FormWidget.extend({
var FieldChar = common.AbstractField.extend(common.ReinitializeFieldMixin, {
template: 'FieldChar',
- widget_class: 'oe_form_field_char',
events: {
- 'change input': 'store_dom_value',
+ 'change': 'store_dom_value',
},
init: function (field_manager, node) {
this._super(field_manager, node);
this.password = this.node.attrs.password === 'True' || this.node.attrs.password === '1';
},
initialize_content: function() {
- this.setupFocus(this.$('input'));
+ if(!this.get('effective_readonly') && !this.$input) {
+ this.$input = this.$el;
+ }
+ this.setupFocus(this.$el);
+ },
+ destroy_content: function() {
+ this.$input = undefined;
},
store_dom_value: function () {
- if (!this.get('effective_readonly')
- && this.$('input').length
- && this.is_syntax_valid()) {
- this.internal_set_value(
- this.parse_value(
- this.$('input').val()));
+ if (this.$input && this.is_syntax_valid()) {
+ this.internal_set_value(this.parse_value(this.$input.val()));
}
},
commit_value: function () {
@@ -145,20 +146,19 @@ var FieldChar = common.AbstractField.extend(common.ReinitializeFieldMixin, {
},
render_value: function() {
var show_value = this.format_value(this.get('value'), '');
- if (!this.get("effective_readonly")) {
- this.$el.find('input').val(show_value);
+ if (this.$input) {
+ this.$input.val(show_value);
} else {
if (this.password) {
show_value = new Array(show_value.length + 1).join('*');
}
- this.$(".oe_form_char_content").text(show_value);
+ this.$el.text(show_value);
}
},
is_syntax_valid: function() {
- if (!this.get("effective_readonly") && this.$("input").size() > 0) {
+ if (this.$input) {
try {
- this.parse_value(this.$('input').val(), '');
- return true;
+ this.parse_value(this.$input.val(), '');
} catch(e) {
return false;
}
@@ -175,31 +175,30 @@ var FieldChar = common.AbstractField.extend(common.ReinitializeFieldMixin, {
return this.get('value') === '' || this._super();
},
focus: function() {
- var input = this.$('input:first')[0];
- return input ? input.focus() : false;
- },
- set_dimensions: function (height, width) {
- this._super(height, width);
- this.$('input').css({
- height: height,
- width: width
- });
- }
+ if (this.$input) {
+ return this.$input.focus();
+ }
+ return false;
+ },
});
-var KanbanSelection = FieldChar.extend({
+var KanbanSelection = common.AbstractField.extend({
template: "FormSelection",
- init: function (field_manager, node) {
- this._super(field_manager, node);
+ events: {
+ 'click a': function(e) {
+ e.preventDefault();
+ },
+ 'mouseup a': function(e) {
+ e.stopPropagation();
+ },
+ 'click li': 'set_kanban_selection'
},
start: function () {
- var self = this;
- this.states = [];
- this._super.apply(this, arguments);
// hook on form view content changed: recompute the states, because it may be related to the current stage
- this.getParent().on('view_content_has_changed', self, function () {
- self.render_value();
+ this.view.on('view_content_has_changed', this, function () {
+ this.render_value();
});
+ return this._super();
},
prepare_dropdown_selection: function() {
var self = this;
@@ -233,6 +232,7 @@ var KanbanSelection = FieldChar.extend({
this._super();
this.states = this.prepare_dropdown_selection();
var self = this;
+
// Adapt "FormSelection"
var current_state = _.find(this.states, function(state) {
return state.name === self.get('value');
@@ -248,7 +248,6 @@ var KanbanSelection = FieldChar.extend({
var $dropdown = this.$el.find('.dropdown-menu');
$dropdown.children().remove(); // remove old items
$items.appendTo($dropdown);
- this.$el.find('a').on('click', this.set_kanban_selection.bind(this));
},
/* setting the value: in view mode, perform an asynchronous call and reload
the form view; in edit mode, use set_value to save the new value that will
@@ -259,7 +258,7 @@ var KanbanSelection = FieldChar.extend({
var li = $(ev.target).closest('li');
if (li.length) {
var value = String(li.data('value'));
- if (this.view.get('actual_mode') == 'view') {
+ if (this.view.get('actual_mode') === 'view') {
var write_values = {};
write_values[self.name] = value;
return this.view.dataset._model.call(
@@ -339,66 +338,35 @@ var FieldID = FieldChar.extend({
var FieldEmail = FieldChar.extend({
template: 'FieldEmail',
- initialize_content: function() {
- this._super();
- var $button = this.$el.find('button');
- $button.click(this.on_button_clicked);
- this.setupFocus($button);
+ prefix: 'mailto',
+ init: function() {
+ this._super.apply(this, arguments);
+ this.clickable = true;
},
render_value: function() {
- if (!this.get("effective_readonly")) {
- this._super();
- } else {
- this.$el.find('a')
- .attr('href', 'mailto:' + this.get('value'))
- .text(this.get('value') || '');
- }
- },
- on_button_clicked: function() {
- if (!this.get('value') || !this.is_syntax_valid()) {
- this.do_warn(_t("E-mail Error"), _t("Can't send email to invalid e-mail address"));
- } else {
- location.href = 'mailto:' + this.get('value');
+ this._super();
+ if (this.get("effective_readonly") && this.clickable) {
+ this.$el.attr('href', this.prefix + ':' + this.get('value'));
}
}
});
-var FieldUrl = FieldChar.extend({
- template: 'FieldUrl',
- initialize_content: function() {
- this._super();
- var $button = this.$el.find('button');
- $button.click(this.on_button_clicked);
- this.setupFocus($button);
- },
+var FieldUrl = FieldEmail.extend({
render_value: function() {
- if (!this.get("effective_readonly")) {
- this._super();
- } else {
+ this._super();
+ if(this.get("effective_readonly")) {
var tmp = this.get('value');
var s = /(\w+):(.+)|^\.{0,2}\//.exec(tmp);
if (!s) {
tmp = "http://" + this.get('value');
}
var text = this.get('value') ? this.node.attrs.text || tmp : '';
- this.$el.find('a').attr('href', tmp).text(text);
- }
- },
- on_button_clicked: function() {
- if (!this.get('value')) {
- this.do_warn(_t("Resource Error"), _t("This resource is empty"));
- } else {
- var url = $.trim(this.get('value'));
- if(/^www\./i.test(url))
- url = 'http://'+url;
- window.open(url);
+ this.$el.attr('href', tmp).text(text);
}
}
});
var FieldFloat = FieldChar.extend({
- is_field_number: true,
- widget_class: 'oe_form_field_float',
init: function (field_manager, node) {
this._super(field_manager, node);
this.internal_set_value(0);
@@ -408,19 +376,18 @@ var FieldFloat = FieldChar.extend({
this.digits = this.field.digits;
}
},
+ initialize_content: function() {
+ this._super();
+ this.$el.addClass('o_form_field_number');
+ },
set_value: function(value_) {
if (value_ === false || value_ === undefined) {
- // As in GTK client, floats default to 0
- value_ = 0;
+ value_ = 0; // As in GTK client, floats default to 0
}
if (this.digits !== undefined && this.digits.length === 2) {
value_ = utils.round_decimals(value_, this.digits[1]);
}
- this._super.apply(this, [value_]);
- },
- focus: function () {
- var $input = this.$('input:first');
- return $input.length ? $input.select() : false;
+ this._super(value_);
}
});
@@ -474,7 +441,7 @@ var FieldCharDomain = common.AbstractField.extend(common.ReinitializeFieldMixin,
} else {
this.$('.o_count').text(_t('No selected record'));
var $arrow = this.$('button span').detach();
- this.$('button').text(_('Select records ')).append($("<span/>").addClass('fa fa-arrow-right'));
+ this.$('button').text(_t('Select records ')).append($("<span/>").addClass('fa fa-arrow-right'));
}
},
on_click: function(event) {
@@ -497,60 +464,58 @@ var FieldCharDomain = common.AbstractField.extend(common.ReinitializeFieldMixin,
},
});
-var FieldDatetime = common.AbstractField.extend(common.ReinitializeFieldMixin, {
- template: "FieldDatetime",
+var FieldDate = common.AbstractField.extend(common.ReinitializeFieldMixin, {
+ tagName: "span",
+ className: "o_form_field_date",
build_widget: function() {
- return new datepicker.DateTimeWidget(this);
+ return new datepicker.DateWidget(this);
},
- destroy_content: function() {
+ initialize_content: function() {
if (this.datewidget) {
this.datewidget.destroy();
this.datewidget = undefined;
}
- },
- initialize_content: function() {
+
if (!this.get("effective_readonly")) {
this.datewidget = this.build_widget();
- this.datewidget.on('datetime_changed', this, _.bind(function() {
+ this.datewidget.on('datetime_changed', this, function() {
this.internal_set_value(this.datewidget.get_value());
- }, this));
- this.datewidget.appendTo(this.$el);
- this.setupFocus(this.datewidget.$input);
+ });
+
+ var self = this;
+ this.datewidget.appendTo('<div>').done(function() {
+ self.datewidget.$el.addClass(self.$el.attr('class'));
+ self.replaceElement(self.datewidget.$el);
+ self.datewidget.$input.addClass('o_form_input');
+ self.setupFocus(self.datewidget.$input);
+ });
}
},
render_value: function() {
- if (!this.get("effective_readonly")) {
- this.datewidget.set_value(this.get('value'));
- } else {
+ if (this.get("effective_readonly")) {
this.$el.text(formats.format_value(this.get('value'), this, ''));
+ } else {
+ this.datewidget.set_value(this.get('value'));
}
},
is_syntax_valid: function() {
- if (!this.get("effective_readonly") && this.datewidget) {
- return this.datewidget.is_valid();
- }
- return true;
+ return this.get("effective_readonly") || !this.datewidget || this.datewidget.is_valid();
},
is_false: function() {
return this.get('value') === '' || this._super();
},
focus: function() {
- var input = this.datewidget && this.datewidget.$input[0];
- return input ? input.focus() : false;
- },
- set_dimensions: function (height, width) {
- this._super(height, width);
if (!this.get("effective_readonly")) {
- this.datewidget.$input.css('height', height);
+ return this.datewidget.$input.focus();
}
- }
+ return false;
+ },
});
-var FieldDate = FieldDatetime.extend({
- template: "FieldDate",
+var FieldDatetime = FieldDate.extend({
build_widget: function() {
- return new datepicker.DateWidget(this);
- }
+ return new datepicker.DateTimeWidget(this);
+ },
});
var FieldText = common.AbstractField.extend(common.ReinitializeFieldMixin, {
@@ -566,46 +531,37 @@ var FieldText = common.AbstractField.extend(common.ReinitializeFieldMixin, {
e.stopPropagation();
}
},
- 'change textarea': 'store_dom_value',
+ 'change': 'store_dom_value',
},
initialize_content: function() {
- if (! this.get("effective_readonly")) {
- this.$textarea = this.$el.find('textarea');
+ if (!this.get("effective_readonly")) {
this.auto_sized = false;
- this.default_height = this.$textarea.css('height');
- if (this.default_height === '0px') this.default_height = '90px';
- if (this.get("effective_readonly")) {
- this.$textarea.attr('disabled', 'disabled');
- }
- this.setupFocus(this.$textarea);
- } else {
- this.$textarea = undefined;
+ this.setupFocus(this.$el);
}
},
commit_value: function () {
- if (! this.get("effective_readonly") && this.$textarea) {
+ if (!this.get("effective_readonly")) {
this.store_dom_value();
}
return this._super();
},
store_dom_value: function () {
- this.internal_set_value(formats.parse_value(this.$textarea.val(), this));
+ this.internal_set_value(formats.parse_value(this.$el.val(), this));
},
render_value: function() {
- if (! this.get("effective_readonly")) {
- var show_value = formats.format_value(this.get('value'), this, '');
- this.$textarea.val(show_value);
- dom_utils.autoresize(this.$textarea, {parent: this, min_height: parseInt(this.default_height)});
- } else {
+ if (this.get("effective_readonly")) {
var txt = this.get("value") || '';
- this.$(".oe_form_text_content").text(txt);
+ this.$el.text(txt);
+ } else {
+ var show_value = formats.format_value(this.get('value'), this, '');
+ this.$el.val(show_value);
+ dom_utils.autoresize(this.$el, {parent: this});
}
},
is_syntax_valid: function() {
- if (!this.get("effective_readonly") && this.$textarea) {
+ if (!this.get("effective_readonly")) {
try {
- formats.parse_value(this.$textarea.val(), this, '');
- return true;
+ formats.parse_value(this.$el.val(), this, '');
} catch(e) {
return false;
}
@@ -616,51 +572,48 @@ var FieldText = common.AbstractField.extend(common.ReinitializeFieldMixin, {
return this.get('value') === '' || this._super();
},
focus: function($el) {
- var input = !this.get("effective_readonly") && this.$textarea && this.$textarea[0];
- return input ? input.focus() : false;
- },
- set_dimensions: function (height, width) {
- this._super(height, width);
- if (!this.get("effective_readonly") && this.$textarea) {
- this.$textarea.css({
- width: width,
- minHeight: height
- });
+ if(!this.get("effective_readonly")) {
+ return this.$el.focus();
}
+ return false;
+ },
+ set_dimensions: function(height, width) {
+ this.$el.css({
+ width: width,
+ minHeight: height,
+ });
},
});
var FieldBoolean = common.AbstractField.extend({
template: 'FieldBoolean',
+ events: {
+ 'click': function() {
+ this.internal_set_value(this.$checkbox.prop('checked'));
+ }
+ },
start: function() {
- var self = this;
- this.$checkbox = $("input", this.$el);
+ this.$checkbox = this.$('input');
+
+ this.$checkbox.prop('disabled', this.get("effective_readonly"));
+ this.on("change:effective_readonly", this, function() {
+ this.$checkbox.prop('disabled', this.get("effective_readonly"));
+ });
+
this.setupFocus(this.$checkbox);
- this.$el.click(_.bind(function() {
- this.internal_set_value(this.$checkbox.is(':checked'));
- }, this));
- var check_readonly = function() {
- self.$checkbox.prop('disabled', self.get("effective_readonly"));
- self.click_disabled_boolean();
- };
- this.on("change:effective_readonly", this, check_readonly);
- check_readonly.call(this);
- this._super.apply(this, arguments);
+
+ return this._super();
},
render_value: function() {
- this.$checkbox[0].checked = this.get('value');
+ this.$checkbox.prop('checked', this.get('value'));
},
focus: function() {
- var input = this.$checkbox && this.$checkbox[0];
- return input ? input.focus() : false;
- },
- click_disabled_boolean: function(){
- var $disabled = this.$el.find('input[type=checkbox]:disabled');
- $disabled.each(function (){
- $(this).next('div').remove();
- $(this).closest("span").append($('<div class="boolean"></div>'));
- });
- }
+ return this.$checkbox.focus();
+ },
+ set_dimensions: function(height, width) {}, // Checkboxes have a fixed height and width (even in list editable)
+ is_false: function() {
+ return false;
+ },
});
/**
@@ -706,9 +659,7 @@ var FieldBooleanButton = common.AbstractField.extend({
},
});
-/**
- The progressbar field expect a float from 0 to 100.
-*/
+// The progressbar field expects a float from 0 to 100.
var FieldProgressBar = common.AbstractField.extend(common.ReinitializeFieldMixin, {
initialize_content: function() {
if(this.progressbar) {
@@ -734,96 +685,41 @@ var FieldProgressBar = common.AbstractField.extend(common.ReinitializeFieldMixin
render_value: function() {
this.progressbar.set_value(this.get('value'));
},
+ is_false: function() {
+ return false;
+ },
});
-/**
- The PercentPie field expect a float from 0 to 100.
-*/
+// The PercentPie field expects a float from 0 to 100.
var FieldPercentPie = common.AbstractField.extend({
template: 'FieldPercentPie',
-
+ start: function() {
+ this.$left_mask = this.$('.o_mask').first();
+ this.$right_mask = this.$('.o_mask').last();
+ this.$pie_value = this.$('.o_pie_value');
+ return this._super();
+ },
render_value: function() {
- var value = this.get('value'),
- formatted_value = Math.round(value || 0) + '%',
- svg = this.$('svg')[0];
-
- svg.innerHTML = "";
- nv.addGraph(function() {
- var width = 42, height = 42;
- var chart = nv.models.pieChart()
- .width(width)
- .height(height)
- .margin({top: 0, right: 0, bottom: 0, left: 0})
- .donut(true)
- .showLegend(false)
- .showLabels(false)
- .color(['#7C7BAD','#DDD'])
- .donutRatio(0.62);
-
- chart.tooltip.enabled(false);
-
- d3.select(svg)
- .datum([{'x': 'value', 'y': value}, {'x': 'complement', 'y': 100 - value}])
- .transition()
- .call(chart)
- .attr('style', 'width: ' + width + 'px; height:' + height + 'px;');
-
- d3.select(svg)
- .append("text")
- .attr({x: width/2, y: height/2 + 3, 'text-anchor': 'middle'})
- .style({"font-size": "10px", "font-weight": "bold"})
- .text(formatted_value);
-
- return chart;
- });
-
- }
-});
+ var value = this.get('value') || 0, degValue = 360*value/100;
-/**
- The FieldBarChart expectsa list of values (indeed)
-*/
-var FieldBarChart = common.AbstractField.extend({
- template: 'FieldBarChart',
+ this.$right_mask.toggleClass('o_full', degValue >= 180);
- render_value: function() {
- var value = JSON.parse(this.get('value'));
- var svg = this.$('svg')[0];
- svg.innerHTML = "";
- nv.addGraph(function() {
- var width = 34, height = 34;
- var chart = nv.models.discreteBarChart()
- .x(function (d) { return d.tooltip; })
- .y(function (d) { return d.value; })
- .width(width)
- .height(height)
- .margin({top: 0, right: 0, bottom: 0, left: 0})
- .showValues(false)
- .transition(350)
- .showXAxis(false)
- .showYAxis(false);
-
- chart.tooltip.enabled(false);
-
- d3.select(svg)
- .datum([{key: 'values', values: value}])
- .transition()
- .call(chart)
- .attr('style', 'width: ' + (width + 4) + 'px; height: ' + (height + 8) + 'px;');
-
- nv.utils.windowResize(chart.update);
-
- return chart;
- });
-
+ var leftDeg = 'rotate(' + ((degValue < 180)? 180 : degValue) + 'deg)';
+ var rightDeg = 'rotate(' + ((degValue < 180)? degValue : 0) + 'deg)';
+ this.$left_mask.css({transform: leftDeg, msTransform: leftDeg, mozTransform: leftDeg, webkitTransform: leftDeg});
+ this.$right_mask.css({transform: rightDeg, msTransform: rightDeg, mozTransform: rightDeg, webkitTransform: rightDeg});
+
+ this.$pie_value.html(Math.round(value) + '%');
+ },
+ is_false: function() {
+ return false;
}
});
-
var FieldSelection = common.AbstractField.extend(common.ReinitializeFieldMixin, {
template: 'FieldSelection',
events: {
- 'change select': 'store_dom_value',
+ 'change': 'store_dom_value',
},
init: function(field_manager, node) {
this._super(field_manager, node);
@@ -832,7 +728,7 @@ var FieldSelection = common.AbstractField.extend(common.ReinitializeFieldMixin,
this.records_orderer = new utils.DropMisordered();
this.field_manager.on("view_content_has_changed", this, function() {
var domain = new data.CompoundDomain(this.build_domain()).eval();
- if (! _.isEqual(domain, this.get("domain"))) {
+ if (!_.isEqual(domain, this.get("domain"))) {
this.set("domain", domain);
}
});
@@ -869,27 +765,27 @@ var FieldSelection = common.AbstractField.extend(common.ReinitializeFieldMixin,
// current row or switching to the next one)
// * If the user presses [RETURN] with a select closed (side-effect:
// also if the user opened the select and pressed [RETURN] without
- // changing the selected value), takes the action as validating the
- // row
- var ischanging = false;
- var $select = this.$el.find('select')
- .change(function () { ischanging = true; })
- .click(function () { ischanging = false; })
- .keyup(function (e) {
- if (e.which !== 13 || !ischanging) { return; }
- e.stopPropagation();
- ischanging = false;
- });
- this.setupFocus($select);
+ // changing the selected value), takes the action as validating the row
+ if(!this.get('effective_readonly')) {
+ var ischanging = false;
+ this.$el
+ .change(function () { ischanging = true; })
+ .click(function () { ischanging = false; })
+ .keyup(function (e) {
+ if (e.which !== 13 || !ischanging) { return; }
+ e.stopPropagation();
+ ischanging = false;
+ });
+ this.setupFocus(this.$el);
+ }
},
commit_value: function () {
this.store_dom_value();
return this._super();
},
store_dom_value: function () {
- if (!this.get('effective_readonly') && this.$('select').length) {
- var val = JSON.parse(this.$('select').val());
- this.internal_set_value(val);
+ if (!this.get('effective_readonly')) {
+ this.internal_set_value(JSON.parse(this.$el.val()));
}
},
set_value: function(value_) {
@@ -901,28 +797,29 @@ var FieldSelection = common.AbstractField.extend(common.ReinitializeFieldMixin,
var values = this.get("values");
values = [[false, this.node.attrs.placeholder || '']].concat(values);
var found = _.find(values, function(el) { return el[0] === this.get("value"); }, this);
- if (! found) {
+ if (!found) {
found = [this.get("value"), _t('Unknown')];
values = [found].concat(values);
}
- if (! this.get("effective_readonly")) {
- this.$().html(QWeb.render("FieldSelectionSelect", {widget: this, values: values}));
- this.$("select").val(JSON.stringify(found[0]));
+ if (!this.get("effective_readonly")) {
+ this.$el.empty();
+ for(var i = 0 ; i < values.length ; i++) {
+ this.$el.append($('<option/>', {
+ value: JSON.stringify(values[i][0]),
+ html: values[i][1]
+ }))
+ }
+ this.$el.val(JSON.stringify(found[0]));
} else {
this.$el.text(found[1]);
}
},
focus: function() {
- var input = this.$('select:first')[0];
- return input ? input.focus() : false;
- },
- set_dimensions: function (height, width) {
- this._super(height, width);
- this.$('select').css({
- height: height,
- width: width
- });
- }
+ if (!this.get("effective_readonly")) {
+ return this.$el.focus();
+ }
+ return false;
+ },
});
/**
@@ -932,20 +829,20 @@ var FieldSelection = common.AbstractField.extend(common.ReinitializeFieldMixin,
the time difference between UTC time and local time, in minutes.
*/
var TimezoneMismatch = FieldSelection.extend({
- initialize_content: function(){
+ initialize_content: function() {
this._super.apply(this, arguments);
this.tz_offset_field = (this.options && this.options.tz_offset_field) || this.tz_offset_field || 'tz_offset';
this.set({"tz_offset": this.field_manager.get_field_value(this.tz_offset_field)});
this.on("change:tz_offset", this, this.render_value);
},
- start: function(){
+ start: function() {
this._super.apply(this, arguments);
// trigger a render_value when tz_offset field change
this.field_manager.on("field_changed:" + this.tz_offset_field, this, function() {
this.set({"tz_offset": this.field_manager.get_field_value(this.tz_offset_field)});
});
},
- check_timezone: function(){
+ check_timezone: function() {
var user_offset = this.get('tz_offset');
if (user_offset) {
var offset = -(new Date().getTimezoneOffset());
@@ -956,17 +853,15 @@ var TimezoneMismatch = FieldSelection.extend({
}
return false;
},
- render_value: function(){
+ render_value: function() {
this._super.apply(this, arguments);
+ this.$label.next('.o_tz_warning').remove();
if(this.check_timezone()){
- this.$label.find('.oe_tz_warning').remove();
var options = _.extend({
delay: { show: 501, hide: 0 },
title: _t("Timezone Mismatch : The timezone of your browser doesn't match the selected one. The time in Odoo is displayed according to your field timezone."),
});
- this.$label.css('white-space', 'normal');
- $(QWeb.render('WebClient.timezone_warning')).appendTo(this.$label);
- this.$label.find('.oe_tz_warning').tooltip(options);
+ $('<span/>').addClass('fa fa-exclamation-triangle o_tz_warning').insertAfter(this.$label).tooltip(options);
}
}
});
@@ -979,8 +874,8 @@ var LabelSelection = FieldSelection.extend({
render_value: function() {
this._super.apply(this, arguments);
if (this.get("effective_readonly")) {
- var btn_class = this.classes[this.get('value')] || 'default';
- this.$el.wrapInner($('<span/>').addClass('label label-' + btn_class));
+ var bt_class = this.classes[this.get('value')] || 'default';
+ this.$el.html($('<span/>', {html: this.$el.html()}).addClass('label label-' + bt_class));
}
},
});
@@ -1001,7 +896,6 @@ var FieldRadio = common.AbstractField.extend(common.ReinitializeFieldMixin, {
this.uniqueId = _.uniqueId("radio");
},
initialize_content: function () {
- this.on("change:effective_readonly", this, this.render_value);
this.field_manager.on("view_content_has_changed", this, this.get_selection);
this.get_selection();
},
@@ -1043,7 +937,7 @@ var FieldRadio = common.AbstractField.extend(common.ReinitializeFieldMixin, {
def.resolve();
}
return def.then(function () {
- if (! _.isEqual(selection, self.selection)) {
+ if (!_.isEqual(selection, self.selection)) {
self.selection = _.clone(selection);
self.renderElement();
self.render_value();
@@ -1066,14 +960,16 @@ var FieldRadio = common.AbstractField.extend(common.ReinitializeFieldMixin, {
},
render_value: function () {
var self = this;
- this.$el.toggleClass("oe_readonly", this.get('effective_readonly'));
- this.$("input").filter(function () {return this.value == self.get_value();}).prop("checked", true);
- this.$(".oe_radio_readonly").text(this.get('value') ? this.get('value')[1] : "");
+ if(this.get('effective_readonly')) {
+ this.$el.html(this.get('value')? this.get('value')[1] : "");
+ } else {
+ this.$("input").filter(function() {return this.value == self.get_value();}).prop("checked", true);
+ }
}
});
var FieldReference = common.AbstractField.extend(common.ReinitializeFieldMixin, {
- template: 'FieldReference',
+ className: 'o_row',
init: function(field_manager, node) {
this._super(field_manager, node);
this.reference_ready = true;
@@ -1086,9 +982,8 @@ var FieldReference = common.AbstractField.extend(common.ReinitializeFieldMixin,
},
initialize_content: function() {
var self = this;
- var fm = new common.DefaultFieldManager(this);
- this.fm = fm;
- fm.extend_field_desc({
+ this.fm = new common.DefaultFieldManager(this);
+ this.fm.extend_field_desc({
"selection": {
selection: this.field_manager.get_field_desc(this.name).selection,
type: "selection",
@@ -1098,23 +993,23 @@ var FieldReference = common.AbstractField.extend(common.ReinitializeFieldMixin,
type: "many2one",
},
});
- this.selection = new FieldSelection(fm, { attrs: {
+ this.selection = new FieldSelection(this.fm, { attrs: {
name: 'selection',
modifiers: JSON.stringify({readonly: this.get('effective_readonly')}),
}});
this.selection.on("change:value", this, this.on_selection_changed);
- this.selection.appendTo(this.$(".oe_form_view_reference_selection"));
+ this.selection.appendTo(this.$el);
this.selection
.on('focused', null, function () {self.trigger('focused');})
.on('blurred', null, function () {self.trigger('blurred');});
var FieldMany2One = core.form_widget_registry.get('many2one');
- this.m2o = new FieldMany2One(fm, { attrs: {
+ this.m2o = new FieldMany2One(this.fm, { attrs: {
name: 'Referenced Document',
modifiers: JSON.stringify({readonly: this.get('effective_readonly')}),
}});
this.m2o.on("change:value", this, this.data_changed);
- this.m2o.appendTo(this.$(".oe_form_view_reference_m2o"));
+ this.m2o.appendTo(this.$el);
this.m2o
.on('focused', null, function () {self.trigger('focused');})
.on('blurred', null, function () {self.trigger('blurred');});
@@ -1151,6 +1046,9 @@ var FieldReference = common.AbstractField.extend(common.ReinitializeFieldMixin,
this.m2o.do_toggle(!!this.get('value')[0]);
this.reference_ready = true;
},
+ is_false: function() {
+ return !this.get_value();
+ },
});
var FieldBinary = common.AbstractField.extend(common.ReinitializeFieldMixin, {
@@ -1161,7 +1059,7 @@ var FieldBinary = common.AbstractField.extend(common.ReinitializeFieldMixin, {
this.useFileAPI = !!window.FileReader;
this.max_upload_size = 25 * 1024 * 1024; // 25Mo
if (!this.useFileAPI) {
- this.fileupload_id = _.uniqueId('oe_fileupload');
+ this.fileupload_id = _.uniqueId('o_fileupload');
$(window).on(this.fileupload_id, function() {
var args = [].slice.call(arguments).slice(1);
self.on_file_uploaded.apply(self, args);
@@ -1175,13 +1073,14 @@ var FieldBinary = common.AbstractField.extend(common.ReinitializeFieldMixin, {
this._super.apply(this, arguments);
},
initialize_content: function() {
- var self= this;
- this.$('input.o_form_input_file').change(this.on_file_change);
- this.$('button.oe_form_binary_file_save').click(this.on_save_as);
- this.$('.oe_form_binary_file_clear').click(this.on_clear);
- this.$('.oe_form_binary_file_edit').click(function() {
- self.$('input.o_form_input_file').click();
+ this.$inputFile = this.$('.o_form_input_file');
+ this.$inputFile.change(this.on_file_change);
+ var self = this;
+ this.$('.o_select_file_button').click(function() {
+ self.$inputFile.click();
});
+ this.$('.o_save_file_button').click(this.on_save_as);
+ this.$('.o_clear_file_button').click(this.on_clear);
},
on_file_change: function(e) {
var self = this;
@@ -1202,26 +1101,28 @@ var FieldBinary = common.AbstractField.extend(common.ReinitializeFieldMixin, {
self.on_file_uploaded(file.size, file.name, file.type, data);
};
} else {
- this.$el.find('form.o_form_binary_form input[name=session_id]').val(this.session.session_id);
- this.$el.find('form.o_form_binary_form').submit();
+ this.$('form.o_form_binary_form input[name=session_id]').val(this.session.session_id);
+ this.$('form.o_form_binary_form').submit();
}
- this.$el.find('.oe_form_binary_progress').show();
- this.$el.find('.oe_form_binary').hide();
+ this.$('.o_form_binary_progress').show();
+ this.$('button').hide();
}
},
- on_file_uploaded: function(size, name, content_type, file_base64) {
+ on_file_uploaded: function(size, name) {
if (size === false) {
this.do_warn(_t("File Upload"), _t("There was a problem while uploading your file"));
// TODO: use openerp web crashmanager
console.warn("Error while uploading file : ", name);
} else {
- this.filename = name;
this.on_file_uploaded_and_valid.apply(this, arguments);
}
- this.$el.find('.oe_form_binary_progress').hide();
- this.$el.find('.oe_form_binary').show();
+ this.$('.o_form_binary_progress').hide();
+ this.$('button').show();
},
on_file_uploaded_and_valid: function(size, name, content_type, file_base64) {
+ this.binary_value = true;
+ this.set_filename(name);
+ this.set_value(file_base64);
},
on_save_as: function(ev) {
var value = this.get('value');
@@ -1248,7 +1149,6 @@ var FieldBinary = common.AbstractField.extend(common.ReinitializeFieldMixin, {
'error': c.rpc_error.bind(c)
});
ev.stopPropagation();
- return false;
}
},
set_filename: function(value) {
@@ -1262,129 +1162,95 @@ var FieldBinary = common.AbstractField.extend(common.ReinitializeFieldMixin, {
}
},
on_clear: function() {
- if (this.get('value') !== false) {
- this.binary_value = false;
- this.internal_set_value(false);
- }
- return false;
+ this.binary_value = false;
+ this.set_filename('');
+ this.set_value(false); // FIXME do not really remove the value
}
});
var FieldBinaryFile = FieldBinary.extend({
template: 'FieldBinaryFile',
initialize_content: function() {
+ var self = this;
this._super();
if (this.get("effective_readonly")) {
- var self = this;
- this.$el.find('a').click(function(ev) {
+ this.$el.click(function(ev) {
if (self.get('value')) {
self.on_save_as(ev);
}
return false;
});
+ } else {
+ this.$input = this.$('.o_form_input').eq(0);
+ this.$input.on('click', function() {
+ self.$inputFile.click();
+ });
}
},
render_value: function() {
- var show_value;
- if (!this.get("effective_readonly")) {
- if (this.node.attrs.filename) {
- show_value = this.view.datarecord[this.node.attrs.filename] || '';
- } else {
- show_value = (this.get('value') !== null && this.get('value') !== undefined && this.get('value') !== false) ? this.get('value') : '';
+ var filename = this.view.datarecord[this.node.attrs.filename];
+ if (this.get("effective_readonly")) {
+ this.do_toggle(!!this.get('value'));
+ if (this.get('value')) {
+ this.$el.empty().append($("<span/>").addClass('fa fa-download'));
+ if (filename) {
+ this.$el.append(" " + filename);
+ }
}
- this.$el.find('input').eq(0).val(show_value);
} else {
- this.$el.find('a').toggle(!!this.get('value'));
- if (this.get('value')) {
- show_value = _t("Download");
- if (this.view)
- show_value += " " + (this.view.datarecord[this.node.attrs.filename] || '');
- this.$el.find('a').text(show_value);
+ if(this.get('value')) {
+ this.$el.children().removeClass('o_hidden');
+ this.$('.o_select_file_button').first().addClass('o_hidden');
+ this.$input.val(filename || this.get('value'));
+ } else {
+ this.$el.children().addClass('o_hidden');
+ this.$('.o_select_file_button').first().removeClass('o_hidden');
}
}
- },
- on_file_uploaded_and_valid: function(size, name, content_type, file_base64) {
- this.binary_value = true;
- this.set_filename(name);
- this.internal_set_value(file_base64);
- var show_value = name + " (" + utils.human_size(size) + ")";
- this.$el.find('input').eq(0).val(show_value);
- },
- on_clear: function() {
- this._super.apply(this, arguments);
- this.$el.find('input').eq(0).val('');
- this.set_filename('');
- },
- set_value: function(value_){
- var changed = value_ !== this.get_value();
- this._super.apply(this, arguments);
- // Trigger value change if size is the same
- if (!changed){
- this.trigger("change:value", this, {
- oldValue: value_,
- newValue: value_
- });
- }
- }
+ }
});
var FieldBinaryImage = FieldBinary.extend({
template: 'FieldBinaryImage',
placeholder: "/web/static/src/img/placeholder.png",
render_value: function() {
- var self = this;
- var url;
- this.session = session;
- if (this.get('value') && !utils.is_bin_size(this.get('value'))) {
- url = 'data:image/png;base64,' + this.get('value');
- } else if (this.get('value')) {
- var id = JSON.stringify(this.view.datarecord.id || null);
- var field = this.name;
- if (this.options.preview_image)
- field = this.options.preview_image;
- url = session.url('/web/image', {
- model: this.view.dataset.model,
- id: id,
- field: field,
- unique: (this.view.datarecord.__last_update || '').replace(/[^0-9]/g, ''),
- });
- } else {
- url = this.placeholder;
+ var url = this.placeholder;
+ if(this.get('value')) {
+ if(!utils.is_bin_size(this.get('value'))) {
+ url = 'data:image/png;base64,' + this.get('value');
+ } else {
+ url = session.url('/web/image', {
+ model: this.view.dataset.model,
+ id: JSON.stringify(this.view.datarecord.id || null),
+ field: (this.options.preview_image)? this.options.preview_image : this.name,
+ unique: (this.view.datarecord.__last_update || '').replace(/[^0-9]/g, ''),
+ });
+ }
}
- var $img = $(QWeb.render("FieldBinaryImage-img", { widget: this, url: url }));
- $($img).click(function(e) {
+
+ var $img = $(QWeb.render("FieldBinaryImage-img", {widget: this, url: url}));
+
+ var self = this;
+ $img.click(function(e) {
if(self.view.get("actual_mode") == "view") {
- var $button = $(".oe_form_button_edit");
+ var $button = $(".o_form_button_edit");
$button.openerpBounce();
e.stopPropagation();
}
});
- this.$el.find('> img').remove();
+ this.$('> img').remove();
+ if (self.options.size) {
+ $img.css("width", "" + self.options.size[0] + "px");
+ $img.css("height", "" + self.options.size[1] + "px");
+ }
this.$el.prepend($img);
- $img.load(function() {
- if (! self.options.size)
- return;
- $img.css("max-width", "" + self.options.size[0] + "px");
- $img.css("max-height", "" + self.options.size[1] + "px");
- });
$img.on('error', function() {
self.on_clear();
$img.attr('src', self.placeholder);
self.do_warn(_t("Image"), _t("Could not display the selected image."));
});
},
- on_file_uploaded_and_valid: function(size, name, content_type, file_base64) {
- this.internal_set_value(file_base64);
- this.binary_value = true;
- this.render_value();
- this.set_filename(name);
- },
- on_clear: function() {
- this._super.apply(this, arguments);
- this.render_value();
- this.set_filename('');
- },
- set_value: function(value_){
+ set_value: function(value_) {
var changed = value_ !== this.get_value();
this._super.apply(this, arguments);
// By default, on binary images read, the server returns the binary size
@@ -1397,7 +1263,16 @@ var FieldBinaryImage = FieldBinary.extend({
newValue: value_
});
}
- }
+ },
+ is_false: function() {
+ return false;
+ },
+ set_dimensions: function(height, width) {
+ this.$el.css({
+ maxWidth: width,
+ minHeight: height,
+ });
+ },
});
var FieldStatus = common.AbstractField.extend({
@@ -1423,13 +1298,14 @@ var FieldStatus = common.AbstractField.extend({
});
this.get_selection();
if (this.options.clickable) {
- this.$el.on('click','li[data-id]',this.on_click_stage);
- }
- if (this.$el.parent().is('header')) {
- this.$el.after('<div class="oe_clear"/>');
+ this.bind_stage_click();
}
this._super();
},
+ bind_stage_click: function () {
+ // This function is overriden in the enterprise webclient
+ this.$el.on('click','li[data-id]',this.on_click_stage);
+ },
set_value: function(value_) {
if (value_ instanceof Array) {
value_ = value_[0];
@@ -1468,15 +1344,15 @@ var FieldStatus = common.AbstractField.extend({
var fold_field = this.options.fold_field;
var calculation = _.bind(function() {
- if (this.field.type == "many2one") {
- return self.get_distant_fields().then(function (fields) {
+ if (this.field.type === "many2one") {
+ return self.get_distant_fields().then(function () {
return new data.DataSetSearch(self, self.field.relation, self.build_context(), self.get("evaluated_selection_domain"))
.read_slice(_.union(_.keys(self.distant_fields), ['id']), {}).then(function (records) {
var ids = _.pluck(records, 'id');
return self.dataset.name_get(ids).then(function (records_name) {
_.each(records, function (record) {
- var name = _.find(records_name, function (val) {return val[0] == record.id;})[1];
- if (fold_field && record[fold_field] && record.id != self.get('value')) {
+ var name = _.find(records_name, function (val) {return val[0] === record.id;})[1];
+ if (fold_field && record[fold_field] && record.id !== self.get('value')) {
selection_folded.push([record.id, name]);
} else {
selection_unfolded.push([record.id, name]);
@@ -1492,7 +1368,7 @@ var FieldStatus = common.AbstractField.extend({
var select = this.field.selection;
for(var i=0; i < select.length; i++) {
var key = select[i][0];
- if(key == this.get('value') || !this.options.visible || this.options.visible.indexOf(key) != -1) {
+ if(key === this.get('value') || !this.options.visible || this.options.visible.indexOf(key) !== -1) {
selection_unfolded.push(select[i]);
}
}
@@ -1529,13 +1405,12 @@ var FieldStatus = common.AbstractField.extend({
return;
}
var val;
- if (this.field.type == "many2one") {
+ if (this.field.type === "many2one") {
val = parseInt($li.data("id"), 10);
- }
- else {
+ } else {
val = $li.data("id");
}
- if (val != self.get('value')) {
+ if (val !== self.get('value')) {
this.view.recursive_save().done(function() {
var change = {};
change[self.name] = val;
@@ -1548,8 +1423,7 @@ var FieldStatus = common.AbstractField.extend({
});
var FieldMonetary = FieldFloat.extend({
- template: "FieldMonetary",
- widget_class: 'oe_form_field_float oe_form_field_monetary',
+ template: 'FieldMonetary',
init: function() {
this._super.apply(this, arguments);
this.set({"currency": false});
@@ -1567,6 +1441,23 @@ var FieldMonetary = FieldFloat.extend({
this.on("change:currency_info", this, this.update);
return tmp;
},
+ initialize_content: function() {
+ if(!this.get('effective_readonly')) {
+ this.$input = this.$('input');
+ this.add_symbol();
+ } else {
+ this.$input = undefined;
+ }
+
+ this._super();
+ },
+ add_symbol: function() {
+ var currency = this.get('currency_info');
+ if(currency) {
+ var before = (currency.position === 'before');
+ this.$el[(before)? 'prepend' : 'append']($('<span/>', {html: currency.symbol}));
+ }
+ },
get_currency_info: function() {
var self = this;
if (this.get("currency") === false) {
@@ -1576,15 +1467,21 @@ var FieldMonetary = FieldFloat.extend({
return self.set({"currency_info": session.get_currency(self.get("currency"))});
},
update: function() {
- if (this.view.options.is_list_editable){
+ if (this.view.options.is_list_editable) {
return;
} else {
return this.reinitialize();
}
},
+ render_value: function() {
+ this._super();
+ if(this.get('effective_readonly')) {
+ this.add_symbol();
+ }
+ },
get_digits_precision: function() {
return this.node.attrs.digits || this.field.digits || (this.get('currency_info') && this.get('currency_info').digits);
- },
+ },
parse_value: function(val, def) {
return formats.parse_value(val, {type: "float", digits: this.get_digits_precision()}, def);
},
@@ -1625,7 +1522,6 @@ var StatInfo = common.AbstractField.extend({
this.$el.html(QWeb.render("StatInfo", options));
this.$el.addClass('o_stat_info');
},
-
});
/**
@@ -1633,14 +1529,18 @@ var StatInfo = common.AbstractField.extend({
switching between a green bullet / gray bullet.
*/
var FieldToggleBoolean = common.AbstractField.extend({
+ template: "toggle_button",
+ events: {
+ 'click': 'set_toggle_button'
+ },
render_value: function () {
- this.icon = this.get_value() ? 'gtk-yes.png' : 'gtk-normal.png';
- this.$el.html(QWeb.render("FieldToggleBoolean", {'widget': this}));
- this.$('.oe_toggle_button').on('click', this.set_toggle_button.bind(this));
+ var $img = this.$('img');
+ var src = $img.attr('src');
+ $img.attr('src', src.substr(0, src.lastIndexOf('/')+1) + (this.get_value() ? 'gtk-yes.png' : 'gtk-normal.png'));
},
set_toggle_button: function () {
var self = this;
- var toggle_value = this.get_value() === false ? true: false;
+ var toggle_value = !this.get_value();
if (this.view.get('actual_mode') == 'view') {
var rec_values = {};
rec_values[self.node.attrs.name] = toggle_value;
@@ -1658,91 +1558,8 @@ var FieldToggleBoolean = common.AbstractField.extend({
reload_record: function () {
this.view.reload();
},
-});
-
-/**
- This widget is intended to be used in config settings.
- When checked, an upgrade popup is showed to the user.
-*/
-
-var AbstractFieldUpgrade = {
- events: {
- 'click input': 'on_click_input',
- },
-
- start: function() {
- this._super.apply(this, arguments);
-
- this.get_enterprise_label().after($("<span>", {
- text: "Enterprise",
- 'class': "label label-primary oe_inline"
- }));
- },
-
- open_dialog: function() {
- var message = $(QWeb.render('EnterpriseUpgrade'));
-
- var buttons = [
- {
- text: _t("Upgrade now"),
- classes: 'btn-primary',
- close: true,
- click: this.confirm_upgrade,
- },
- {
- text: _t("Cancel"),
- close: true,
- },
- ];
-
- return new Dialog(this, {
- size: 'medium',
- buttons: buttons,
- $content: $('<div>', {
- html: message,
- }),
- title: _t("Odoo Enterprise"),
- }).open();
- },
-
- confirm_upgrade: function() {
- new Model("res.users").call("search_count", [[["share", "=", false]]]).then(function(data) {
- framework.redirect("https://www.odoo.com/odoo-enterprise/upgrade?num_users=" + data);
- });
- },
-
- get_enterprise_label: function() {},
- on_click_input: function() {},
-};
-
-var UpgradeBoolean = FieldBoolean.extend(AbstractFieldUpgrade, {
- template: "FieldUpgradeBoolean",
-
- get_enterprise_label: function() {
- return this.$label;
- },
-
- on_click_input: function(event) {
- if(this.$checkbox.prop("checked")) {
- this.open_dialog().on('closed', this, function() {
- this.$checkbox.prop("checked", false);
- });
- }
- },
-});
-
-var UpgradeRadio = FieldRadio.extend(AbstractFieldUpgrade, {
-
- get_enterprise_label: function() {
- return this.$('label').last();
- },
-
- on_click_input: function(event) {
- if($(event.target).val() == 1) {
- this.open_dialog().on('closed', this, function() {
- this.$('input').first().prop("checked", true);
- });
- }
+ is_false: function() {
+ return false;
},
});
@@ -1770,7 +1587,6 @@ core.form_widget_registry
.add('toggle_button', FieldToggleBoolean)
.add('float', FieldFloat)
.add('percentpie', FieldPercentPie)
- .add('barchart', FieldBarChart)
.add('integer', FieldFloat)
.add('float_time', FieldFloat)
.add('progressbar', FieldProgressBar)
@@ -1782,9 +1598,7 @@ core.form_widget_registry
.add('kanban_state_selection', KanbanSelection)
.add('statinfo', StatInfo)
.add('timezone_mismatch', TimezoneMismatch)
- .add('label_selection', LabelSelection)
- .add('upgrade_boolean', UpgradeBoolean)
- .add('upgrade_radio', UpgradeRadio);
+ .add('label_selection', LabelSelection);
/**
@@ -1796,8 +1610,12 @@ core.form_widget_registry
core.form_tag_registry.add('button', WidgetButton);
return {
+ FieldBoolean: FieldBoolean,
FieldChar: FieldChar,
+ FieldEmail: FieldEmail,
FieldFloat: FieldFloat,
+ FieldRadio: FieldRadio,
+ FieldStatus: FieldStatus,
FieldMonetary: FieldMonetary,
WidgetButton: WidgetButton
};
diff --git a/addons/web/static/src/js/views/graph_view.js b/addons/web/static/src/js/views/graph_view.js
index 62ee1e62c23..c8ff16cd0f1 100644
--- a/addons/web/static/src/js/views/graph_view.js
+++ b/addons/web/static/src/js/views/graph_view.js
@@ -14,7 +14,7 @@ var _t = core._t;
var QWeb = core.qweb;
var GraphView = View.extend({
- className: 'oe_graph',
+ className: 'o_graph',
display_name: _lt('Graph'),
icon: 'fa-bar-chart',
require_fields: true,
@@ -54,12 +54,14 @@ var GraphView = View.extend({
if ($node) {
var context = {measures: _.pairs(_.omit(this.measures, '__count__'))};
this.$buttons = $(QWeb.render('GraphView.buttons', context));
- this.$measure_list = this.$buttons.find('.oe-measure-list');
+ this.$measure_list = this.$buttons.find('.o_graph_measures_list');
this.update_measure();
this.$buttons.find('button').tooltip();
this.$buttons.click(this.on_button_click.bind(this));
- this.$buttons.appendTo($node);
+ this.$buttons.find('.o_graph_button[data-mode="' + this.widget.mode + '"]').addClass('active');
+
+ this.$buttons.appendTo($node);
}
},
update_measure: function () {
@@ -86,7 +88,7 @@ var GraphView = View.extend({
},
do_search: function (domain, context, group_by) {
if (!this.widget) {
- this.initial_groupbys = context.graph_groupbys || this.initial_groupbys;
+ this.initial_groupbys = context.graph_groupbys || (group_by.length ? group_by : this.initial_groupbys);
this.widget = new GraphWidget(this, this.model, {
measure: context.graph_measure || this.active_measure,
mode: context.graph_mode || this.active_mode,
@@ -112,14 +114,16 @@ var GraphView = View.extend({
},
on_button_click: function (event) {
var $target = $(event.target);
- if ($target.hasClass('oe-bar-mode')) {this.widget.set_mode('bar');}
- if ($target.hasClass('oe-line-mode')) {this.widget.set_mode('line');}
- if ($target.hasClass('oe-pie-mode')) {this.widget.set_mode('pie');}
- if ($target.parents('.oe-measure-list').length) {
- var parent = $target.parent(),
- field = parent.data('field');
+ if ($target.hasClass('o_graph_button')) {
+ this.widget.set_mode($target.data('mode'));
+ this.$buttons.find('.o_graph_button.active').removeClass('active');
+ $target.addClass('active');
+ }
+ else if ($target.parents('.o_graph_measures_list').length) {
+ var parent = $target.parent();
+ var field = parent.data('field');
this.active_measure = field;
- parent.toggleClass('selected');
+ event.preventDefault();
event.stopPropagation();
this.update_measure();
this.widget.set_measure(this.active_measure);
diff --git a/addons/web/static/src/js/views/graph_widget.js b/addons/web/static/src/js/views/graph_widget.js
index a86ea35e449..e3786408125 100644
--- a/addons/web/static/src/js/views/graph_widget.js
+++ b/addons/web/static/src/js/views/graph_widget.js
@@ -14,6 +14,7 @@ var QWeb = core.qweb;
var MAX_LEGEND_LENGTH = 25 * (1 + config.device.size_class);
return Widget.extend({
+ className: "o_graph_svg_container",
init: function (parent, model, options) {
this._super(parent);
this.context = options.context;
diff --git a/addons/web/static/src/js/views/list_view.js b/addons/web/static/src/js/views/list_view.js
index d42d34a98d2..9214eb27152 100644
--- a/addons/web/static/src/js/views/list_view.js
+++ b/addons/web/static/src/js/views/list_view.js
@@ -8,6 +8,7 @@ var DataExport = require('web.DataExport');
var formats = require('web.formats');
var common = require('web.list_common');
var Model = require('web.DataModel');
+var Pager = require('web.Pager');
var pyeval = require('web.pyeval');
var session = require('web.session');
var Sidebar = require('web.Sidebar');
@@ -34,8 +35,7 @@ var row_decoration = [
var ListView = View.extend({
_template: 'ListView',
- accesskey: 'L',
- display_name: _lt('List'),
+ accesskey: "L",
defaults: _.extend({}, View.prototype.defaults, {
// records can be selected one by one
selectable: true,
@@ -54,8 +54,14 @@ var ListView = View.extend({
//whether the editable property of the view has to be disabled
disable_editable_mode: false,
}),
+ display_name: _lt('List'),
events: {
- 'click thead th.oe_sortable[data-id]': 'sort_by_column'
+ 'click thead th.o_column_sortable[data-id]': 'sort_by_column',
+ 'click .oe_view_nocontent': function() {
+ if (this.$buttons) {
+ this.$buttons.width(this.$buttons.width() + 1).openerpBounce();
+ }
+ },
},
icon: 'fa-list-ul',
@@ -92,8 +98,7 @@ var ListView = View.extend({
});
this.previous_colspan = null;
- this.colors = null;
- this.fonts = null;
+ this.decoration = null;
this.columns = [];
@@ -111,7 +116,6 @@ var ListView = View.extend({
this.groups.datagroup.sort = this.dataset._sort;
}
- this.page = 0;
this.records.bind('change', function (event, record, key) {
if (!_(self.aggregate_columns).chain()
.pluck('name').contains(key).value()) {
@@ -127,6 +131,7 @@ var ListView = View.extend({
this.options.$pager = false;
}
+ this.options.deletable = this.options.deletable && this.is_action_enabled('delete');
this.name = "" + this.fields_view.arch.attrs.string;
// the view's number of records per page (|| section)
@@ -135,14 +140,26 @@ var ListView = View.extend({
(this.getParent().action || {}).limit ||
parseInt(this.fields_view.arch.attrs.limit, 10) ||
80);
+ // the index of the first displayed record (starting from 1)
+ this.current_min = 1;
- //Sort
- var default_order = this.fields_view.arch.attrs.default_order,
- unsorted = !this.dataset._sort.length;
+ // Sort
+ var default_order = this.fields_view.arch.attrs.default_order;
+ var unsorted = !this.dataset._sort.length;
if (unsorted && default_order && !this.grouped) {
this.dataset.set_sort(default_order.split(','));
}
},
+ willStart: function() {
+ // Retrieve the decoration defined on the model's list view
+ this.decoration = _.pick(this.fields_view.arch.attrs, function(value, key) {
+ return row_decoration.indexOf(key) >= 0;
+ });
+ this.decoration = _.mapObject(this.decoration, function(value) {
+ return py.parse(py.tokenize(value));
+ });
+ return this._super();
+ },
/**
* Set a custom Group construct as the root of the List View.
*
@@ -171,43 +188,6 @@ var ListView = View.extend({
}
});
},
- willStart: function() {
- // Retrieve the decoration defined on the model's list view
- this.decoration = _.pick(this.fields_view.arch.attrs, function(value, key) {
- return row_decoration.indexOf(key) >= 0;
- });
- this.decoration = _.mapObject(this.decoration, function(value) {
- return py.parse(py.tokenize(value));
- });
-
- this.setup_columns(this.fields_view.fields, this.grouped);
-
- return this._super();
- },
- start: function() {
- var self = this;
- this.$el.html(QWeb.render(this._template, this));
- this.$el.addClass(this.fields_view.arch.attrs['class']);
- this.$el.addClass('oe_list o_list_view');
-
- // Selecting records
- this.$('.oe_list_record_selector').click(function() {
- var checked = self.$('.oe_list_record_selector').prop('checked');
- self.$('.oe_list_record_selector input').prop('checked', checked || false);
- var selection = self.groups.get_selection();
- $(self.groups).trigger('selected', [selection.ids, selection.records]);
- });
-
- if(this.dataset._sort.length){
- if(this.dataset._sort[0].indexOf('-') === -1){
- this.$el.find('th[data-id=' + this.dataset._sort[0] + ']').addClass("sortdown");
- }else {
- this.$el.find('th[data-id=' + this.dataset._sort[0].split('-')[1] + ']').addClass("sortup");
- }
- }
- this.trigger('list_view_loaded', data, this.grouped);
- return this._super();
- },
/**
* Computes and returns the classnames for the provided record (from the
* ``@decoration`` attribute)
@@ -231,24 +211,58 @@ var ListView = View.extend({
return classnames;
},
/**
+ * Renders the table itself and inserts its content
+ * Computes and displays the aggregates
+ * Hooks up the selection of records event
+ * Adds adequate classname on the sorted column
+ */
+ load_list: function() {
+ var self = this;
+
+ // Render the table and append its content
+ this.$el.html(QWeb.render(this._template, this));
+ this.$el.addClass(this.fields_view.arch.attrs['class']);
+ if (this.grouped) {
+ this.$('.o_list_view').addClass('o_list_view_grouped');
+ }
+ this.$('.o_list_view').append(this.groups.elements);
+
+ // Compute the aggregates and display them in the list's footer
+ this.compute_aggregates();
+
+ // Head hook
+ // Selecting records
+ this.$('thead .o_list_record_selector input').click(function() {
+ self.$('tbody .o_list_record_selector input').prop('checked', $(this).prop('checked') || false);
+ var selection = self.groups.get_selection();
+ $(self.groups).trigger('selected', [selection.ids, selection.records]);
+ });
+
+ // Sort
+ if (this.dataset._sort.length) {
+ if (this.dataset._sort[0].indexOf('-') === -1) {
+ this.$('th[data-id=' + this.dataset._sort[0] + ']').addClass("o-sort-down");
+ } else {
+ this.$('th[data-id=' + this.dataset._sort[0].split('-')[1] + ']').addClass("o-sort-up");
+ }
+ }
+
+ this.trigger('list_view_loaded', data, this.grouped);
+ return $.when();
+ },
+ /**
* Render the buttons according to the ListView.buttons template and
* add listeners on it.
* Set this.$buttons with the produced jQuery element
* @param {jQuery} [$node] a jQuery node where the rendered buttons should be inserted
* $node may be undefined, in which case the ListView inserts them into this.options.$buttons
- * or into a div of its template
+ * if it exists
*/
render_buttons: function($node) {
if (!this.$buttons) {
this.$buttons = $(QWeb.render("ListView.buttons", {'widget': this}));
-
this.$buttons.find('.o_list_button_add').click(this.proxy('do_add_record'));
-
- if ($node) {
- this.$buttons.appendTo($node);
- } else {
- this.$('.oe_list_buttons').replaceWith(this.$buttons);
- }
+ this.$buttons.appendTo($node);
}
},
/**
@@ -271,7 +285,7 @@ var ListView = View.extend({
this.is_action_enabled('delete') && { label: _t('Delete'), callback: this.do_delete_selected }
]));
- $node = $node || this.options.$sidebar || this.$('.oe_list_sidebar');
+ $node = $node || this.options.$sidebar;
this.sidebar.appendTo($node);
// Hide the sidebar by default (it will be shown as soon as a record is selected)
@@ -279,72 +293,52 @@ var ListView = View.extend({
}
},
/**
- * Render the pager according to the ListView.pager template and add listeners on it.
- * Set this.$pager with the produced jQuery element
- * @param {jQuery} [$node] a jQuery node where the rendered pager should be inserted
+ * Instantiate and render the pager and add listeners on it.
+ * Set this.pager
+ * @param {jQuery} [$node] a jQuery node where the pager should be inserted
* $node may be undefined, in which case the ListView inserts the pager into this.options.$pager
- * or into a div of its template
*/
- render_pager: function($node) {
- if (!this.$pager && this.options.pager) {
- var self = this;
-
- this.$pager = $(QWeb.render("ListView.pager", {'widget': self}));
- this.$pager
- .on('click', 'a[data-pager-action]', function () {
- var $this = $(this);
- var max_page_index = Math.ceil(self.dataset.size() / self._limit) - 1;
- switch ($this.data('pager-action')) {
- case 'first':
- self.page = 0;
- break;
- case 'last':
- self.page = max_page_index;
- break;
- case 'next':
- self.page += 1;
- break;
- case 'previous':
- self.page -= 1;
- break;
+ render_pager: function($node, options) {
+ if (!this.pager && this.options.pager) {
+ this.pager = new Pager(this, this.dataset.size(), 1, this._limit, options);
+ this.pager.appendTo($node || this.options.$pager);
+
+ this.pager.on('pager_changed', this, function (new_state) {
+ var self = this;
+ var limit_changed = (this._limit !== new_state.limit);
+
+ this._limit = new_state.limit;
+ this.current_min = new_state.current_min;
+ this.reload_content().then(function() {
+ // Reset the scroll position to the top on page changed only
+ if (!limit_changed) {
+ self.set_scrollTop(0);
+ self.trigger_up('scrollTo', {offset: 0});
}
- if (self.page < 0) {
- self.page = max_page_index;
- } else if (self.page > max_page_index) {
- self.page = 0;
- }
- self.reload_content();
- }).find('.oe_list_pager_state')
- .click(function (e) {
- e.stopPropagation();
- var $this = $(this);
-
- var $select = $('<select>')
- .appendTo($this.empty())
- .click(function (e) {e.stopPropagation();})
- .append('<option value="80">80</option>' +
- '<option value="200">200</option>' +
- '<option value="500">500</option>' +
- '<option value="2000">2000</option>' +
- '<option value="NaN">' + _t("Unlimited") + '</option>')
- .change(function () {
- var val = parseInt($select.val(), 10);
- self._limit = (isNaN(val) ? null : val);
- self.page = 0;
- self.reload_content();
- }).blur(function() {
- $(this).trigger('change');
- })
- .val(self._limit || 'NaN');
- });
- this.configure_pager(this.dataset);
-
- $node = $node || this.options.$pager;
- if ($node) {
- this.$pager.appendTo($node);
- } else {
- this.$('.oe_list_pager').replaceWith(this.$pager);
+ });
+ });
+ }
+ },
+ /**
+ * Updates the pager based on the provided dataset's information
+ *
+ * Horrifying side-effect: sets the dataset's data on this.dataset?
+ *
+ * @param {instance.web.DataSet} [dataset]
+ * @param {int} [current_min] the min pager value
+ */
+ update_pager: function (dataset, current_min) {
+ this.dataset.ids = dataset.ids;
+ // Not exactly clean
+ if (dataset._length !== undefined) {
+ this.dataset._length = dataset._length;
+ }
+ if (this.pager && !this.grouped) {
+ var new_state = { size: this.dataset.size(), limit: this._limit };
+ if (current_min) {
+ new_state.current_min = current_min;
}
+ this.pager.update_state(new_state);
}
},
sort_by_column: function (e) {
@@ -357,54 +351,14 @@ var ListView = View.extend({
return false;
}
this.dataset.sort(col_name);
- if($column.hasClass("sortdown") || $column.hasClass("sortup")) {
- $column.toggleClass("sortup sortdown");
+ if($column.hasClass("o-sort-down") || $column.hasClass("o-sort-up")) {
+ $column.toggleClass("o-sort-up o-sort-down");
} else {
- $column.addClass("sortdown");
- }
- $column.siblings('.oe_sortable').removeClass("sortup sortdown");
-
- this.reload_content();
- },
- /**
- * Configures the ListView pager based on the provided dataset's information
- *
- * Horrifying side-effect: sets the dataset's data on this.dataset?
- *
- * @param {instance.web.DataSet} dataset
- */
- configure_pager: function (dataset) {
- this.dataset.ids = dataset.ids;
- // Not exactly clean
- if (dataset._length) {
- this.dataset._length = dataset._length;
+ $column.addClass("o-sort-down");
}
- if (this.$pager) {
- if (this.grouped) {
- // page count is irrelevant on grouped page, replace by limit
- this.$pager.find('.oe-pager-buttons').hide();
- this.$pager.find('.oe_list_pager_state').text(this._limit || '∞');
- } else {
- var total = dataset.size();
- var limit = this._limit || total;
- this.$pager.find('.oe-pager-buttons').toggle(total > limit);
- this.$pager.find('.oe_pager_value').toggle(total !== 0);
- var spager = '-';
- if (total) {
- var range_start = this.page * limit + 1;
- var range_stop = range_start - 1 + limit;
- if (this.records.length) {
- range_stop = range_start - 1 + this.records.length;
- }
- if (range_stop > total) {
- range_stop = total;
- }
- spager = _.str.sprintf(_t("%d-%d of %d"), range_start, range_stop, total);
- }
+ $column.siblings('.o_column_sortable').removeClass("o-sort-up o-sort-down");
- this.$pager.find('.oe_list_pager_state').text(spager);
- }
- }
+ return this.reload_content();
},
/**
* Sets up the listview's columns: merges view and fields data, move
@@ -422,8 +376,7 @@ var ListView = View.extend({
return for_(id, fields[id], field);
}));
if (grouped) {
- this.columns.unshift(
- new ListView.MetaColumn('_group', _t("Group")));
+ this.columns.unshift(new ListView.MetaColumn('_group'));
}
this.visible_columns = _.filter(this.columns, function (column) {
@@ -468,27 +421,27 @@ var ListView = View.extend({
*/
reload_content: synchronized(function () {
var self = this;
- self.$el.find('.oe_list_record_selector').prop('checked', false);
+ this.setup_columns(this.fields_view.fields, this.grouped);
+ this.$('tbody .o_list_record_selector input').prop('checked', false);
this.records.reset();
var reloaded = $.Deferred();
- reloaded.then(function () {
- self.configure_pager(self.dataset);
- });
- this.$el.find('.oe_list_content').append(
- this.groups.render(function () {
- if (self.dataset.index === null) {
- if (self.records.length) {
- self.dataset.index = 0;
- }
- } else if (self.dataset.index >= self.records.length) {
- self.dataset.index = self.records.length ? 0 : null;
+ this.groups.render(function () {
+ if (self.dataset.index === null) {
+ if (self.records.length) {
+ self.dataset.index = 0;
+ }
+ } else if (self.dataset.index >= self.records.length) {
+ self.dataset.index = self.records.length ? 0 : null;
+ }
+ self.load_list().then(function () {
+ if (!self.grouped && self.display_nocontent_helper()) {
+ self.no_result();
}
-
- self.compute_aggregates();
reloaded.resolve();
- }));
+ });
+ });
this.do_push_state({
- page: this.page,
+ min: this.current_min,
limit: this._limit
});
return reloaded.promise();
@@ -531,8 +484,8 @@ var ListView = View.extend({
do_load_state: function(state, warm) {
var reload = false;
- if (state.page && this.page !== state.page) {
- this.page = state.page;
+ if (state.min && this.current_min !== state.min) {
+ this.current_min = state.min;
reload = true;
}
if (state.limit) {
@@ -558,7 +511,7 @@ var ListView = View.extend({
* @param {Object} results results of evaluating domain and process for a search
*/
do_search: function (domain, context, group_by) {
- this.page = 0;
+ this.current_min = 1;
this.groups.datagroup = new DataGroup(
this, this.model, domain, context, group_by);
this.groups.datagroup.sort = this.dataset._sort;
@@ -569,6 +522,10 @@ var ListView = View.extend({
this.no_leaf = !!context['group_by_no_leaf'];
this.grouped = !!group_by;
+ // Hide the pager in grouped mode
+ if (this.pager && this.grouped) {
+ this.pager.do_hide();
+ }
return this.reload_content();
},
/**
@@ -581,26 +538,25 @@ var ListView = View.extend({
return;
}
var self = this;
+
return $.when(this.dataset.unlink(ids)).done(function () {
_(ids).each(function (id) {
self.records.remove(self.records.get(id));
});
// Hide the table if there is no more record in the dataset
- if (self.dataset.size() === 0) {
+ if (self.display_nocontent_helper()) {
self.no_result();
} else {
+ // Load previous page if the current one is empty
if (self.records.length === 0 && self.dataset.size() > 0) {
- //Trigger previous manually to navigate to previous page,
- //If all records are deleted on current page.
- self.$pager.find('ul li:first a').trigger('click');
- } else if (self.dataset.size() === self._limit) {
- //Reload listview to update current page with next page records
- //because pager going to be hidden if dataset.size == limit
+ self.pager.previous();
+ }
+ // Reload the list view if we are not on the last page
+ if (self.current_min + self._limit - 1 < self.dataset.size()) {
self.reload();
- } else {
- self.configure_pager(self.dataset);
}
}
+ self.update_pager(self.dataset);
self.compute_aggregates();
});
},
@@ -613,7 +569,7 @@ var ListView = View.extend({
do_select: function (ids, records, deselected) {
// uncheck header hook if at least one row has been deselected
if (deselected) {
- this.$('.oe_list_record_selector').prop('checked', false);
+ this.$('thead .o_list_record_selector input').prop('checked', false);
}
if (!ids.length) {
@@ -810,13 +766,14 @@ var ListView = View.extend({
this.display_aggregates(aggregates);
},
display_aggregates: function (aggregation) {
- var $footer_cells = this.$el.find('.oe_list_footer');
+ var $footer_cells = this.$('tfoot td');
_(this.aggregate_columns).each(function (column) {
if (!column['function']) {
return;
}
$footer_cells.filter(_.str.sprintf('[data-field=%s]', column.id))
+ .addClass('o_list_number')
.html(column.format(aggregation, { process_modifiers: false }));
});
},
@@ -831,7 +788,7 @@ var ListView = View.extend({
*/
get_active_domain: function () {
var self = this;
- if (this.$('.oe_list_record_selector').prop('checked')) {
+ if (this.$('thead .o_list_record_selector input').prop('checked')) {
var search_view = this.getParent().searchview;
var search_data = search_view.build_search_data();
return pyeval.eval_domains_and_contexts({
@@ -859,7 +816,7 @@ var ListView = View.extend({
pad_columns: function (count, options) {
options = options || {};
// padding for action/pager header
- var $first_header = this.$el.find('thead tr:first th');
+ var $first_header = this.$('thead tr:first th');
var colspan = $first_header.attr('colspan');
if (colspan) {
if (!this.previous_colspan) {
@@ -882,7 +839,7 @@ var ListView = View.extend({
* Removes all padding columns of the table
*/
unpad_columns: function () {
- this.$el.find('.oe_list_padding').remove();
+ this.$('.oe_list_padding').remove();
if (this.previous_colspan) {
this.$el
.find('thead tr:first th')
@@ -890,23 +847,20 @@ var ListView = View.extend({
this.previous_colspan = null;
}
},
+ display_nocontent_helper: function () {
+ return (this.dataset.size() === 0);
+ },
no_result: function () {
- this.$el.find('.oe_view_nocontent').remove();
- if (this.groups.group_by
- || !this.options.action
- || !this.options.action.help) {
+ this.$('.oe_view_nocontent').remove();
+ if (this.groups.group_by ||
+ !this.options.action ||
+ !this.options.action.help) {
return;
}
- this.$el.find('table:first').hide();
+ this.$('table:first').hide();
this.$el.prepend(
$('<div class="oe_view_nocontent">').html(this.options.action.help)
);
- if (this.$buttons) {
- var $buttons = this.$buttons;
- this.$el.find('.oe_view_nocontent').click(function() {
- $buttons.width($buttons.width() + 1).openerpBounce();
- });
- }
}
});
core.view_registry.add('list', ListView);
@@ -975,9 +929,8 @@ ListView.List = Class.extend({
$row = self.$current.children(
'[data-id=' + record.get('id') + ']');
}
-
var $newRow = $(self.render_record(record));
- $newRow.find('.oe_list_record_selector input').prop('checked', !!$row.find('.oe_list_record_selector input').prop('checked'));
+ $newRow.find('.o_list_record_selector input').prop('checked', !!$row.find('.o_list_record_selector input').prop('checked'));
$row.replaceWith($newRow);
},
'add': function (ev, records, record, index) {
@@ -1012,14 +965,14 @@ ListView.List = Class.extend({
*/
e.preventDefault();
})
- .delegate('th.oe_list_record_selector', 'click', function (e) {
+ .delegate('td.o_list_record_selector', 'click', function (e) {
e.stopPropagation();
var selection = self.get_selection();
var checked = $(e.currentTarget).find('input').prop('checked');
$(self).trigger(
'selected', [selection.ids, selection.records, ! checked]);
})
- .delegate('td.oe_list_record_delete', 'click', function (e) {
+ .delegate('td.o_list_record_delete', 'click', function (e) {
e.stopPropagation();
var $row = $(e.target).closest('tr');
$(self).trigger('deleted', [[self.row_id($row)]]);
@@ -1028,7 +981,7 @@ ListView.List = Class.extend({
$('<input />').appendTo('body').focus().remove();
}
})
- .delegate('td.oe_list_field_cell button', 'click', function (e) {
+ .delegate('td button', 'click', function (e) {
e.stopPropagation();
var $target = $(e.currentTarget),
field = $target.closest('td').data('field'),
@@ -1158,7 +1111,7 @@ ListView.List = Class.extend({
}
var cells = [];
if (this.options.selectable) {
- cells.push('<th class="oe_list_record_selector"></td>');
+ cells.push('<td class="o_list_record_selector"></td>');
}
_(this.columns).each(function(column) {
if (column.invisible === '1') {
@@ -1167,7 +1120,7 @@ ListView.List = Class.extend({
cells.push('<td title="' + column.string + '">&nbsp;</td>');
});
if (this.options.deletable) {
- cells.push('<td class="oe_list_record_delete"></td>');
+ cells.push('<td class="o_list_record_delete"></td>');
}
cells.unshift('<tr>');
cells.push('</tr>');
@@ -1187,7 +1140,7 @@ ListView.List = Class.extend({
return result;
}
var records = this.records;
- this.$current.find('th.oe_list_record_selector input:checked')
+ this.$current.find('td.o_list_record_selector input:checked')
.closest('tr').each(function () {
var record = records.get($(this).data('id'));
result.ids.push(record.get('id'));
@@ -1206,14 +1159,12 @@ ListView.List = Class.extend({
return $(row).data('id');
},
/**
- * Death signal, cleans up list display
+ * Death signal, cleans up records's callbacks
*/
on_records_reset: function () {
_(this.record_callbacks).each(function (callback, event) {
this.records.unbind(event, callback);
}, this);
- if (!this.$current) { return; }
- this.$current.remove();
},
get_records: function () {
return this.records.map(function (record) {
@@ -1279,7 +1230,7 @@ ListView.Groups = Class.extend({
this.$row = null;
this.children = {};
- this.page = 0;
+ this.pager = null; // group pager
var self = this;
this.records.bind('reset', function () {
@@ -1315,51 +1266,46 @@ ListView.Groups = Class.extend({
}
return red_letter_tboday;
},
- make_paginator: function () {
+ /**
+ * Renders the group pager and append it to the group's header
+ */
+ render_group_pager: function () {
var self = this;
- var $prev = $('<button type="button" data-pager-action="previous">&lt;</button>')
- .click(function (e) {
- e.stopPropagation();
- if (self.page > 0) {
- self.page -= 1;
- } else {
- self.page = self.max_page_index;
- }
-
- self.$row.closest('tbody').next()
- .replaceWith(self.render());
+ if (this.datagroup.length > this.view._limit) {
+ this.pager = new Pager(this, this.datagroup.length, 1, this.view._limit);
+ this.pager.on('pager_changed', this, function (state) {
+ self.view._limit = state.limit;
+ self.current_min = state.current_min;
+ self.render().then(function() {
+ self.$row.closest('tbody').next().replaceWith($(self.elements));
+ });
});
- var $next = $('<button type="button" data-pager-action="next">&gt;</button>')
- .click(function (e) {
- e.stopPropagation();
- if (self.page < self.max_page_index) {
- self.page += 1;
- } else {
- self.page = 0;
- }
- self.$row.closest('tbody').next()
- .replaceWith(self.render());
+ var $last_cell = this.$row.children().last();
+ $last_cell.addClass('o_group_pager');
+ // Prevent group to fold when clicking on the pager
+ $last_cell.click(function(e) {
+ e.stopPropagation();
});
- this.$row.children().last()
- .addClass('oe_list_group_pagination')
- .append($prev)
- .append('<span class="oe_list_pager_state"></span>')
- .append($next);
+ this.pager.appendTo($last_cell);
+ }
},
open: function (point_insertion) {
- this.render().insertAfter(point_insertion);
+ this.render();
+ $(this.elements).insertAfter(point_insertion);
var no_subgroups = _(this.datagroup.group_by).isEmpty(),
records_terminated = !this.datagroup.context['group_by_no_leaf'];
if (no_subgroups && records_terminated) {
- this.make_paginator();
+ this.render_group_pager();
}
},
close: function () {
- this.$row.children().last().find('button').remove();
- this.$row.children().last().find('span').remove();
+ if (this.pager) {
+ this.pager.destroy();
+ }
this.records.reset();
+ this.$to_be_removed.remove();
},
/**
* Prefixes ``$node`` with floated spaces in order to indent it relative
@@ -1391,20 +1337,20 @@ ListView.Groups = Class.extend({
self.bind_child_events(child);
child.datagroup = group;
- var $row = child.$row = $('<tr class="oe_group_header">');
+ var $row = child.$row = $('<tr class="o_group_header">');
if (group.openable && group.length) {
$row.click(function (e) {
if (!$row.data('open')) {
$row.data('open', true)
- .find('span.ui-icon')
- .removeClass('ui-icon-triangle-1-e')
- .addClass('ui-icon-triangle-1-s');
+ .find('span.fa')
+ .removeClass('fa-caret-right')
+ .addClass('fa-caret-down');
child.open(self.point_insertion(e.currentTarget));
} else {
$row.removeData('open')
- .find('span.ui-icon')
- .removeClass('ui-icon-triangle-1-s')
- .addClass('ui-icon-triangle-1-e');
+ .find('span.fa')
+ .removeClass('fa-caret-down')
+ .addClass('fa-caret-right');
child.close();
// force recompute the selection as closing group reset properties
var selection = self.get_selection();
@@ -1414,7 +1360,7 @@ ListView.Groups = Class.extend({
}
placeholder.appendChild($row[0]);
- var $group_column = $('<th class="oe_list_group_name">').appendTo($row);
+ var $group_column = $('<th class="o_group_name">').appendTo($row);
// Don't fill this if group_by_no_leaf but no group_by
if (group.grouped_on) {
var row_data = {};
@@ -1449,12 +1395,9 @@ ListView.Groups = Class.extend({
if (group.length && group.openable) {
// Make openable if not terminal group & group_by_no_leaf
- $group_column.prepend('<span class="ui-icon ui-icon-triangle-1-e" style="float: left;">');
+ $group_column.prepend('<span class="fa fa-caret-right" style="padding-right: 5px;">');
} else {
- // Kinda-ugly hack: jquery-ui has no "empty" icon, so set
- // wonky background position to ensure nothing is displayed
- // there but the rest of the behavior is ui-icon's
- $group_column.prepend('<span class="ui-icon" style="float: left; background-position: 150px 150px">');
+ $group_column.prepend('<span class="fa">');
}
}
self.indent($group_column, group.level);
@@ -1511,13 +1454,11 @@ ListView.Groups = Class.extend({
});
this.bind_child_events(list);
- var view = this.view,
- limit = view._limit,
- page = this.datagroup.openable ? this.page : view.page;
+ var view = this.view;
+ var current_min = this.datagroup.openable ? this.current_min : view.current_min;
var fields = _.pluck(_.select(this.columns, function(x) {return x.tag == "field";}), 'name');
- var options = { offset: page * limit, limit: limit, context: {bin_size: true} };
- //TODO xmo: investigate why we need to put the setTimeout
+ var options = { offset: current_min - 1, limit: view._limit, context: {bin_size: true} };
return $.async_when().then(function() {
return dataset.read_slice(fields, options).then(function (records) {
// FIXME: ignominious hacks, parents (aka form view) should not send two ListView#reload_content concurrently
@@ -1525,34 +1466,12 @@ ListView.Groups = Class.extend({
self.records.reset(null, {silent: true});
}
if (!self.datagroup.openable) {
- view.configure_pager(dataset);
- } else {
- if (dataset.size() == records.length) {
- // only one page
- self.$row.find('td.oe_list_group_pagination').find('button').remove();
- self.$row.find('td.oe_list_group_pagination').find('span').remove();
- } else {
- self.max_page_index = Math.ceil(dataset.size() / limit) - 1;
- self.$row
- .find('.oe_list_pager_state')
- .text(_.str.sprintf(_t("%(page)d/%(page_count)d"), {
- page: page + 1,
- page_count: self.max_page_index + 1
- }))
- .end()
- .find('button[data-pager-action=previous]')
- .toggleClass('disabled', page === 0)
- .end()
- .find('button[data-pager-action=next]')
- .toggleClass('disabled', page === self.max_page_index);
- }
+ // Update the main list view pager
+ view.update_pager(dataset, current_min);
}
self.records.add(records, {silent: true});
list.render();
- if (_.isEmpty(records)) {
- view.no_result();
- }
return list;
});
});
@@ -1580,7 +1499,7 @@ ListView.Groups = Class.extend({
helper: 'clone'
});
if (sequence_field) {
- list.$current.sortable('option', 'handle', '.oe_list_field_handle');
+ list.$current.sortable('option', 'handle', '.o_row_handle');
}
list.$current.sortable('option', {
start: function (e, ui) {
@@ -1631,7 +1550,7 @@ ListView.Groups = Class.extend({
var $el = $('<tbody>');
this.elements = [$el[0]];
- this.datagroup.list(
+ return this.datagroup.list(
_(this.view.visible_columns).chain()
.filter(function (column) { return column.tag === 'field';})
.pluck('name').value(),
@@ -1640,7 +1559,7 @@ ListView.Groups = Class.extend({
self.render_groups(groups));
if (post_render) { post_render(); }
}, function (dataset) {
- self.render_dataset(dataset).then(function (list) {
+ return self.render_dataset(dataset).then(function (list) {
self.children[null] = list;
self.elements =
[list.$current.replaceAll($el)[0]];
@@ -1650,7 +1569,6 @@ ListView.Groups = Class.extend({
self.view.trigger('view_list_rendered');
});
});
- return $el;
},
/**
* Returns the ids of all selected records for this group, and the records
@@ -1669,8 +1587,11 @@ ListView.Groups = Class.extend({
return {ids: ids, records: records};
},
on_records_reset: function () {
+ this.$to_be_removed = $(this.elements);
+ _.each(this.children, function(child){
+ this.$to_be_removed = this.$to_be_removed.add(child.$to_be_removed);
+ }.bind(this));
this.children = {};
- $(this.elements).remove();
},
get_records: function () {
if (_(this.children).isEmpty()) {
@@ -1725,13 +1646,12 @@ var DataGroup = Class.extend({
fields = _.unique((fields || []).concat(this.group_by));
}
var query = this.model.query(fields).order_by(this.sort).group_by(this.group_by);
- $.when(query).done(function (querygroups) {
+ return $.when(query).then(function (querygroups) {
// leaf node
if (!querygroups) {
var ds = new data.DataSetSearch(self, self.model.name, self.model.context(), self.model.domain());
ds._sort = self.sort;
- ifRecords(ds);
- return;
+ return ifRecords(ds);
}
// internal node
var child_datagroups = _(querygroups).map(function (group) {
@@ -1763,7 +1683,7 @@ var StaticDataGroup = DataGroup.extend({
this.dataset = dataset;
},
list: function (fields, ifGroups, ifRecords) {
- ifRecords(this.dataset);
+ return ifRecords(this.dataset);
}
});
@@ -1811,6 +1731,10 @@ var Column = Class.extend({
C.prototype = this;
return new C(aggregation_func, this[aggregation_func]);
},
+ heading: function () {
+ return _.escape(this.string);
+ },
+ width: function () {},
/**
*
* @param row_data record whose values should be displayed in the cell
@@ -1834,7 +1758,8 @@ var Column = Class.extend({
? ''
: options.value_if_empty;
}
- return this._format(row_data, options);
+ var f = this._format(row_data, options);
+ return (f !== '')? f : '&nbsp;';
},
/**
* Method to override in order to provide alternative HTML content for the
@@ -1890,7 +1815,7 @@ var ColumnBoolean = Column.extend({
* @private
*/
_format: function (row_data, options) {
- return _.str.sprintf('<input type="checkbox" %s readonly="readonly"/>',
+ return _.str.sprintf('<div class="o_checkbox"><input type="checkbox" %s disabled="disabled"/><span/></div>',
row_data[this.id].value ? 'checked="checked"' : '');
}
});
@@ -1965,14 +1890,19 @@ var ColumnHandle = Column.extend({
this._super.apply(this, arguments);
// Handle overrides the field to not be form-editable.
this.modifiers.readonly = true;
+ this.string = ""; // Don't display the column header
+ },
+ heading: function () {
+ return '<span class="o_row_handle fa fa-arrows invisible"></span>';
},
+ width: function () { return 1; },
/**
* Return styling hooks for a drag handle
*
* @private
*/
_format: function (row_data, options) {
- return '<i class="oe_list_handle fa fa-circle"/>';
+ return '<span class="o_row_handle fa fa-arrows"/>';
}
});
@@ -2042,8 +1972,9 @@ var ColumnUrl = Column.extend({
var ColumnMonetary = Column.extend({
_format: function (row_data, options) {
+ var options = pyeval.py_eval(this.options || '{}');
//name of currency field is defined either by field attribute, in view options or we assume it is named currency_id
- var currency_field = (this.options && this.options.currency_field) || this.currency_field || 'currency_id';
+ var currency_field = (_.isEmpty(options) === false && options.currency_field) || this.currency_field || 'currency_id';
var currency_id = row_data[currency_field] && row_data[currency_field].value[0];
var currency = session.get_currency(currency_id);
var digits_precision = this.digits || (currency && currency.digits);
diff --git a/addons/web/static/src/js/views/list_view_editable.js b/addons/web/static/src/js/views/list_view_editable.js
index 8937b8bb36f..f4a4c695334 100644
--- a/addons/web/static/src/js/views/list_view_editable.js
+++ b/addons/web/static/src/js/views/list_view_editable.js
@@ -69,9 +69,9 @@ var Editor = Widget.extend({
if (!(arch.attrs && arch.attrs.version === "7.0")) {
throw new Error("Editor delegate's #edition_view must be a version 7 view");
}
- if (!/\boe_form_container\b/.test(arch.attrs['class'])) {
+ if (!/\bo_list_editable_form\b/.test(arch.attrs['class'])) {
throw new Error("Editor delegate's #edition_view must have the class " +
- "'boe_form_container' on its root element");
+ "'o_list_editable_form' on its root element");
}
return edition_view;
},
@@ -183,12 +183,12 @@ ListView.include(/** @lends instance.web.ListView# */{
}
});
this.on('edit:after', this, function () {
- self.$el.add(self.$buttons).addClass('oe_editing');
+ self.$el.add(self.$buttons).addClass('o-editing');
self.$('.ui-sortable').sortable('disable');
});
this.on('save:after cancel:after', this, function () {
self.$('.ui-sortable').sortable('enable');
- self.$el.add(self.$buttons).removeClass('oe_editing');
+ self.$el.add(self.$buttons).removeClass('o-editing');
});
},
destroy: function () {
@@ -260,7 +260,7 @@ ListView.include(/** @lends instance.web.ListView# */{
this._super.apply(this, arguments);
}
},
- start: function () {
+ load_list: function (data, grouped) {
// tree/@editable takes priority on everything else if present.
var result = this._super.apply(this, arguments);
@@ -271,10 +271,10 @@ ListView.include(/** @lends instance.web.ListView# */{
this.editor = new Editor(this); // Editor is not restartable due to formview not being restartable
if(this.editable()) {
- this.$el.addClass('oe_list_editable');
+ this.$el.addClass('o_list_editable');
return $.when(result, this.editor.prependTo(this.$el).done(this.proxy('setup_events')));
} else {
- this.$el.removeClass('oe_list_editable');
+ this.$el.removeClass('o_list_editable');
}
return result;
},
@@ -366,11 +366,11 @@ ListView.include(/** @lends instance.web.ListView# */{
fields[field_name] = field;
self.fields_for_resize.push({field: field, cell: cell});
}, options).then(function () {
- $recordRow.addClass('oe_edition');
+ $recordRow.addClass('o_row_edition');
self.resize_fields();
// Local function that returns true if field is visible and editable
var is_focusable = function(field) {
- return field && field.$el.is(':visible:not(.oe_readonly)');
+ return field && field.$el.is(':visible:not(.o_readonly)');
};
var focus_field = options && options.focus_field ? options.focus_field : undefined;
if (!is_focusable(fields[focus_field])) {
@@ -423,16 +423,21 @@ ListView.include(/** @lends instance.web.ListView# */{
resize_field: function (field, cell) {
var $cell = $(cell);
field.set_dimensions($cell.outerHeight(), $cell.outerWidth());
- field.$el.addClass('o_temp_visible').css({top: 0, left: 0}).position({
- my: 'left top',
- at: 'left top',
- of: $cell,
- }).removeClass('o_temp_visible');
+ position_element(field.$el, 'left top');
+ position_element(field.$translate, 'right top');
if(field.get('effective_readonly')) {
- field.$el.addClass('oe_readonly');
+ field.$el.addClass('o_readonly');
}
if(field.widget == "handle") {
- field.$el.addClass('oe_list_field_handle');
+ field.$el.addClass('o_row_handle');
+ }
+
+ function position_element($el, pos) {
+ $el.addClass('o_temp_visible').css({top: 0, left: 0}).position({
+ my: pos,
+ at: pos,
+ of: $cell,
+ }).removeClass('o_temp_visible');
}
},
/**
@@ -541,7 +546,7 @@ ListView.include(/** @lends instance.web.ListView# */{
var view = $.extend(true, {}, this.fields_view);
view.arch.tag = 'form';
_.extend(view.arch.attrs, {
- 'class': 'oe_form_container',
+ 'class': 'o_list_editable_form',
version: '7.0'
});
_(view.arch.children).chain()
@@ -817,7 +822,7 @@ ListView.List.include(/** @lends instance.web.ListView.List# */{
var record_id = $(event.currentTarget).data('id');
return this.view.start_edition(
((record_id)? this.records.get(record_id) : null), {
- focus_field: $(event.target).not(".oe_readonly").data('field'),
+ focus_field: $(event.target).not(".o_readonly").data('field'),
}).fail(function() {
return _super.apply(self, args); // The record can't be edited so open it in a modal (use-case: readonly mode)
});
diff --git a/addons/web/static/src/js/views/pivot_view.js b/addons/web/static/src/js/views/pivot_view.js
index 9dc2c4c2cdd..c7710b86605 100644
--- a/addons/web/static/src/js/views/pivot_view.js
+++ b/addons/web/static/src/js/views/pivot_view.js
@@ -21,11 +21,11 @@ var QWeb = core.qweb;
var PivotView = View.extend({
events: {
- 'click .oe-opened': 'on_open_header_click',
- 'click .oe-closed': 'on_closed_header_click',
- 'click .o-field-menu': 'on_field_menu_selection',
+ 'click .o_pivot_header_cell_opened': 'on_open_header_click',
+ 'click .o_pivot_header_cell_closed': 'on_closed_header_click',
+ 'click .o_pivot_field_menu': 'on_field_menu_selection',
'click td': 'on_cell_click',
- 'click .measure-row': 'on_measure_row_click',
+ 'click .o_pivot_measure_row': 'on_measure_row_click',
},
display_name: _lt('Pivot'),
icon: 'fa-table',
@@ -100,6 +100,7 @@ var PivotView = View.extend({
if ((!this.active_measures.length) || this.fields_view.arch.attrs.display_quantity) {
this.active_measures.push('__count__');
}
+
return $.when(fields_def, xlwt_def, this._super()).then(function (fields) {
self.prepare_fields(fields);
// add active measures to the measure list. This is very rarely necessary, but it
@@ -116,14 +117,13 @@ var PivotView = View.extend({
});
},
start: function () {
- this.$table_container = this.$('.o-pivot-table');
- this.$el.toggleClass('oe_enable_linking', this.enable_linking);
+ this.$el.toggleClass('o_enable_linking', this.enable_linking);
var context = {
fields: _.chain(this.groupable_fields).pairs().sortBy(function(f) {
return f[1].string;
}).value(),
};
- this.$field_selection = this.$('.o-field-selection');
+ this.$field_selection = this.$('.o_field_selection');
this.$field_selection.html(QWeb.render('PivotView.FieldSelection', context));
core.bus.on('click', this, function () {
this.$field_selection.find('ul').first().hide();
@@ -161,11 +161,6 @@ var PivotView = View.extend({
render_sidebar: function($node) {
if (this.xlwt_installed && $node && this.options.sidebar) {
this.sidebar = new Sidebar(this, {editable: this.is_action_enabled('edit')});
- this.sidebar.add_items('other', [{
- label: _t("Download xls"),
- callback: this.download_table.bind(this),
- }]);
-
this.sidebar.appendTo($node);
}
},
@@ -207,11 +202,12 @@ var PivotView = View.extend({
},
do_show: function () {
var self = this;
+ var _super = this._super.bind(this);
this.do_push_state({});
- this.data_loaded.done(function () {
+ return this.data_loaded.done(function () {
self.display_table();
+ _super();
});
- return this._super();
},
get_context: function () {
return !this.ready ? {} : {
@@ -222,16 +218,17 @@ var PivotView = View.extend({
},
on_button_click: function (event) {
var $target = $(event.target);
- if ($target.hasClass('oe-pivot-flip')) { return this.flip();}
- if ($target.hasClass('oe-pivot-expand-all')) {return this.expand_all();}
- if ($target.parents('.oe-measure-list').length) {
- var parent = $target.parent(),
- field = parent.data('field');
+ if ($target.hasClass('o_pivot_flip_button')) { return this.flip(); }
+ if ($target.hasClass('o_pivot_expand_button')) { return this.expand_all(); }
+ if ($target.parents('.o_pivot_measures_list').length) {
+ var parent = $target.parent();
+ var field = parent.data('field');
parent.toggleClass('selected');
+ event.preventDefault();
event.stopPropagation();
return this.toggle_measure(field);
}
- if ($target.hasClass('oe-pivot-download')) {
+ if ($target.hasClass('o_pivot_download')) {
return this.download_table();
}
},
@@ -252,21 +249,23 @@ var PivotView = View.extend({
this.expand_header(header, groupbys[header.path.length - 1])
.then(this.proxy('display_table'));
} else {
- var $test = $(event.target);
- var pos = $test.position();
this.last_header_selected = id;
+ var $test = $(event.target);
var $menu = this.$field_selection.find('ul').first();
- $menu.css('top', pos.top + $test.parent().height() - 2);
- $menu.css('left', pos.left + event.offsetX);
+ var position = $test.position();
+ $menu.css({
+ top: position.top + $test.height(),
+ left: position.left + event.offsetX,
+ });
$menu.show();
event.stopPropagation();
}
},
on_cell_click: function (event) {
var $target = $(event.target);
- if ($target.hasClass('oe-closed')
- || $target.hasClass('oe-opened')
- || $target.hasClass('oe-empty')
+ if ($target.hasClass('o_pivot_header_cell_closed')
+ || $target.hasClass('o_pivot_header_cell_opened')
+ || $target.hasClass('o_empty')
|| !this.enable_linking) {
return;
}
@@ -297,11 +296,10 @@ var PivotView = View.extend({
col_id = $target.data('id'),
measure = $target.data('measure');
- this.sort_rows(col_id, measure, $target.hasClass('o-sorted-asc'));
+ this.sort_rows(col_id, measure, $target.hasClass('o_pivot_measure_row_sorted_asc'));
this.display_table();
},
sort_rows: function (col_id, measure, descending) {
- console.log('order', descending);
var self = this;
traverse_tree(this.main_row.root, function (header) {
header.children.sort(compare);
@@ -321,6 +319,7 @@ var PivotView = View.extend({
}
},
on_field_menu_selection: function (event) {
+ event.preventDefault();
var field = $(event.target).parent().data('field'),
interval = $(event.target).data('interval'),
header = this.headers[this.last_header_selected];
@@ -550,13 +549,22 @@ var PivotView = View.extend({
}
return find_path_in_tree(root, path);
},
+ _clean_table: function () {
+ return this.$el
+ .find('table')
+ .remove()
+ .end()
+ .find('.oe_view_nocontent')
+ .remove()
+ .end();
+ },
display_table: function () {
if (!this.active_measures.length || !this.has_data) {
- return this.$table_container.empty().append(QWeb.render('PivotView.nodata'));
+ return this._clean_table().append(QWeb.render('PivotView.nodata'));
}
var $fragment = $(document.createDocumentFragment()),
$table = $('<table>')
- .addClass('table table-hover table-condensed')
+ .addClass('table table-hover table-condensed table-bordered')
.appendTo($fragment),
$thead = $('<thead>').appendTo($table),
$tbody = $('<tbody>').appendTo($table),
@@ -572,8 +580,8 @@ var PivotView = View.extend({
$table.on('hover', 'td', function () {
$table.find('col:eq(' + $(this).index()+')').toggleClass('hover');
});
- this.$table_container.empty().append($fragment);
- this.$table_container.find('.oe-opened,.oe-closed').tooltip();
+ this._clean_table().append($fragment);
+ this.$('.o_pivot_header_cell_opened,.o_pivot_header_cell_closed').tooltip();
},
draw_headers: function ($thead, headers) {
var self = this,
@@ -591,26 +599,27 @@ var PivotView = View.extend({
.text(cell.title)
.attr('rowspan', cell.height)
.attr('colspan', cell.width);
- if (cell.total) {
- $cell.addClass('oe-total');
- }
if (i > 0) {
$cell.attr('title', groupby_labels[i-1]);
}
if (cell.expanded !== undefined) {
- $cell.addClass(cell.expanded ? 'oe-opened' : 'oe-closed');
+ $cell.addClass(cell.expanded ? 'o_pivot_header_cell_opened' : 'o_pivot_header_cell_closed');
$cell.data('id', cell.id);
}
if (cell.measure) {
- $cell.addClass('measure-row text-muted')
- .text(this.measures[cell.measure].string)
- .toggleClass('oe-total', cell.is_bold);
+ $cell.addClass('o_pivot_measure_row text-muted')
+ .text(this.measures[cell.measure].string);
$cell.data('id', cell.id).data('measure', cell.measure);
if (cell.id === this.sorted_column.id && cell.measure === this.sorted_column.measure) {
- $cell.addClass('o-sorted o-sorted-' + this.sorted_column.order);
+ $cell.addClass('o_pivot_measure_row_sorted_' + this.sorted_column.order);
}
}
$row.append($cell);
+
+ $cell.toggleClass('hidden-xs', (cell.expanded !== undefined) || (cell.measure !== undefined && j < headers[i].length - this.active_measures.length));
+ if (cell.height > 1) {
+ $cell.css('padding', 0);
+ }
}
$thead.append($row);
}
@@ -635,7 +644,7 @@ var PivotView = View.extend({
.text(rows[i].title)
.data('id', rows[i].id)
.css('padding-left', (5 + rows[i].indent * 30) + 'px')
- .addClass(rows[i].expanded ? 'oe-opened' : 'oe-closed');
+ .addClass(rows[i].expanded ? 'o_pivot_header_cell_opened' : 'o_pivot_header_cell_closed');
if (rows[i].indent > 0) $header.attr('title', groupby_labels[rows[i].indent - 1]);
$header.appendTo($row);
for (j = 0; j < length; j++) {
@@ -643,12 +652,15 @@ var PivotView = View.extend({
$cell = $('<td>')
.data('id', rows[i].id)
.data('col_id', rows[i].col_ids[Math.floor(j / nbr_measures)])
- .toggleClass('oe-empty', !value)
- .text(value);
+ .toggleClass('o_empty', !value)
+ .text(value)
+ .addClass('o_pivot_cell_value text-right');
if (((j >= length - this.active_measures.length) && display_total) || i === 0){
$cell.css('font-weight', 'bold');
}
$row.append($cell);
+
+ $cell.toggleClass('hidden-xs', j < length - this.active_measures.length);
}
$tbody.append($row);
}
diff --git a/addons/web/static/src/js/views/search_filters.js b/addons/web/static/src/js/views/search_filters.js
index c6193488578..041cda35580 100644
--- a/addons/web/static/src/js/views/search_filters.js
+++ b/addons/web/static/src/js/views/search_filters.js
@@ -12,9 +12,9 @@ var _lt = core._lt;
var ExtendedSearchProposition = Widget.extend(/** @lends instance.web.search.ExtendedSearchProposition# */{
template: 'SearchView.extended_search.proposition',
events: {
- 'change .searchview_extended_prop_field': 'changed',
- 'change .searchview_extended_prop_op': 'operator_changed',
- 'click .searchview_extended_delete_prop': function (e) {
+ 'change .o_searchview_extended_prop_field': 'changed',
+ 'change .o_searchview_extended_prop_op': 'operator_changed',
+ 'click .o_searchview_extended_delete_prop': function (e) {
e.stopPropagation();
this.getParent().remove_proposition(this);
},
@@ -40,13 +40,13 @@ var ExtendedSearchProposition = Widget.extend(/** @lends instance.web.search.Ext
return this._super().done(this.proxy('changed'));
},
changed: function() {
- var nval = this.$(".searchview_extended_prop_field").val();
+ var nval = this.$(".o_searchview_extended_prop_field").val();
if(this.attrs.selected === null || this.attrs.selected === undefined || nval != this.attrs.selected.name) {
this.select_field(_.detect(this.fields, function(x) {return x.name == nval;}));
}
},
operator_changed: function (e) {
- var $value = this.$('.searchview_extended_prop_value');
+ var $value = this.$('.o_searchview_extended_prop_value');
switch ($(e.target).val()) {
case '∃':
case '∄':
@@ -66,7 +66,7 @@ var ExtendedSearchProposition = Widget.extend(/** @lends instance.web.search.Ext
if(this.attrs.selected !== null && this.attrs.selected !== undefined) {
this.value.destroy();
this.value = null;
- this.$('.searchview_extended_prop_op').html('');
+ this.$('.o_searchview_extended_prop_op').html('');
}
this.attrs.selected = field;
if(field === null || field === undefined) {
@@ -80,9 +80,9 @@ var ExtendedSearchProposition = Widget.extend(/** @lends instance.web.search.Ext
_.each(this.value.operators, function(operator) {
$('<option>', {value: operator.value})
.text(String(operator.text))
- .appendTo(self.$('.searchview_extended_prop_op'));
+ .appendTo(self.$('.o_searchview_extended_prop_op'));
});
- var $value_loc = this.$('.searchview_extended_prop_value').show().empty();
+ var $value_loc = this.$('.o_searchview_extended_prop_value').show().empty();
this.value.appendTo($value_loc);
},
@@ -90,7 +90,7 @@ var ExtendedSearchProposition = Widget.extend(/** @lends instance.web.search.Ext
if (this.attrs.selected === null || this.attrs.selected === undefined)
return null;
var field = this.attrs.selected,
- op_select = this.$('.searchview_extended_prop_op')[0],
+ op_select = this.$('.o_searchview_extended_prop_op')[0],
operator = op_select.options[op_select.selectedIndex];
return {
@@ -155,7 +155,10 @@ ExtendedSearchProposition.Field = Widget.extend({
});
ExtendedSearchProposition.Char = ExtendedSearchProposition.Field.extend({
- template: 'SearchView.extended_search.proposition.char',
+ tagName: 'input',
+ attributes: {
+ type: 'text'
+ },
operators: [
{value: "ilike", text: _lt("contains")},
{value: "not ilike", text: _lt("doesn't contain")},
@@ -170,7 +173,7 @@ ExtendedSearchProposition.Char = ExtendedSearchProposition.Field.extend({
});
ExtendedSearchProposition.DateTime = ExtendedSearchProposition.Field.extend({
- template: 'SearchView.extended_search.proposition.empty',
+ tagName: 'span',
operators: [
{value: "=", text: _lt("is equal to")},
{value: "!=", text: _lt("is not equal to")},
@@ -204,7 +207,11 @@ ExtendedSearchProposition.Date = ExtendedSearchProposition.DateTime.extend({
});
ExtendedSearchProposition.Integer = ExtendedSearchProposition.Field.extend({
- template: 'SearchView.extended_search.proposition.integer',
+ tagName: 'input',
+ attributes: {
+ type: 'number',
+ value: '0',
+ },
operators: [
{value: "=", text: _lt("is equal to")},
{value: "!=", text: _lt("is not equal to")},
@@ -280,7 +287,7 @@ ExtendedSearchProposition.Selection = ExtendedSearchProposition.Field.extend({
});
ExtendedSearchProposition.Boolean = ExtendedSearchProposition.Field.extend({
- template: 'SearchView.extended_search.proposition.empty',
+ tagName: 'span',
operators: [
{value: "=", text: _lt("is true")},
{value: "!=", text: _lt("is false")}
diff --git a/addons/web/static/src/js/views/search_inputs.js b/addons/web/static/src/js/views/search_inputs.js
index 44b79999259..0263f270172 100644
--- a/addons/web/static/src/js/views/search_inputs.js
+++ b/addons/web/static/src/js/views/search_inputs.js
@@ -541,6 +541,7 @@ var FilterGroup = Input.extend(/** @lends instance.web.search.FilterGroup# */{
return {
category: _t("Filter"),
icon: this.icon,
+ separator: _t(" or "),
values: values,
field: this
};
@@ -617,6 +618,7 @@ var FilterGroup = Input.extend(/** @lends instance.web.search.FilterGroup# */{
});
},
toggle_filter: function (e) {
+ e.preventDefault();
e.stopPropagation();
this.toggle(this.filters[Number($(e.target).parent().data('index'))]);
},
@@ -686,6 +688,7 @@ var GroupbyGroup = FilterGroup.extend({
return {
category: _t("Group By"),
icon: this.icon,
+ separator: " > ",
values: values,
field: this.searchview._s_groupby
};
diff --git a/addons/web/static/src/js/views/search_menus.js b/addons/web/static/src/js/views/search_menus.js
index 9edb817c567..10ab44ef30c 100644
--- a/addons/web/static/src/js/views/search_menus.js
+++ b/addons/web/static/src/js/views/search_menus.js
@@ -15,12 +15,16 @@ return Widget.extend({
'click li': function (event) {
event.stopImmediatePropagation();
},
- 'click .oe-save-search a': function () {
+ 'click li a': function (event) {
+ event.preventDefault();
+ },
+ 'click .o_save_search a': function (event) {
+ event.preventDefault();
this.toggle_save_menu();
},
- 'click .oe-save-name button': 'save_favorite',
+ 'click .o_save_name button': 'save_favorite',
'hidden.bs.dropdown': 'close_menus',
- 'keyup .oe-save-name input': function (ev) {
+ 'keyup .o_save_name input': function (ev) {
if (ev.which === $.ui.keyCode.ENTER) {
this.save_favorite();
}
@@ -38,8 +42,8 @@ return Widget.extend({
start: function () {
var self = this;
this.$filters = {};
- this.$save_search = this.$('.oe-save-search');
- this.$save_name = this.$('.oe-save-name');
+ this.$save_search = this.$('.o_save_search');
+ this.$save_name = this.$('.o_save_name');
this.$inputs = this.$save_name.find('input');
this.$divider = this.$('.divider');
this.$inputs.eq(0).val(this.searchview.get_title());
@@ -116,7 +120,6 @@ return Widget.extend({
model_id: this.target_model,
context: results.context,
domain: results.domain,
- sort: JSON.stringify(this.searchview.dataset._sort),
is_default: default_filter,
action_id: this.action_id,
};
@@ -204,12 +207,11 @@ return Widget.extend({
this.$divider.show();
if (!(key in this.$filters)) {
var $filter = $('<li>')
- .addClass(filter.user_id ? 'oe_searchview_custom_private'
- : 'oe_searchview_custom_public')
- .toggleClass('oe_searchview_custom_default', filter.is_default)
- .append($('<a>').text(filter.name))
+ .addClass(filter.user_id ? 'o-searchview-custom-private'
+ : 'o-searchview-custom-public')
+ .append($('<a>', {'href': '#'}).text(filter.name))
.append($('<span>', {
- class: 'fa fa-trash-o remove-filter',
+ class: 'fa fa-trash-o o-remove-filter',
on: {
click: function (event) {
event.stopImmediatePropagation();
@@ -235,13 +237,6 @@ return Widget.extend({
}
this.query.reset([this.facet_for(filter)], {
preventSearch: preventSearch || false});
-
- // Load sort settings on view
- if (!_.isUndefined(filter.sort)){
- var sort_items = JSON.parse(filter.sort);
- this.searchview.dataset.set_sort(sort_items);
- }
-
this.$filters[this.key_for(filter)].addClass('selected');
},
remove_filter: function (filter, $filter, key) {
@@ -277,16 +272,20 @@ var Widget = require('web.Widget');
return Widget.extend({
template: 'SearchView.FilterMenu',
events: {
- 'click .oe-add-filter': function () {
+ 'click .o_add_filter': function (event) {
+ event.preventDefault();
this.toggle_custom_filter_menu();
},
- 'click li': function (event) {event.stopImmediatePropagation();},
+ 'click li': function (event) {
+ event.preventDefault();
+ event.stopImmediatePropagation();
+ },
'hidden.bs.dropdown': function () {
this.toggle_custom_filter_menu(false);
},
- 'click .oe-add-condition': 'append_proposition',
- 'click .oe-apply-filter': 'commit_search',
- 'keyup .searchview_extended_prop_value': function (ev) {
+ 'click .o_add_condition': 'append_proposition',
+ 'click .o_apply_filter': 'commit_search',
+ 'keyup .o_searchview_extended_prop_value': function (ev) {
if (ev.which === $.ui.keyCode.ENTER) {
this.commit_search();
}
@@ -301,10 +300,10 @@ return Widget.extend({
},
start: function () {
var self = this;
- this.$menu = this.$('.filters-menu');
- this.$add_filter = this.$('.oe-add-filter');
- this.$apply_filter = this.$('.oe-apply-filter');
- this.$add_filter_menu = this.$('.oe-add-filter-menu');
+ this.$menu = this.$('.o_filters_menu');
+ this.$add_filter = this.$('.o_add_filter');
+ this.$apply_filter = this.$('.o_apply_filter');
+ this.$add_filter_menu = this.$('.o_add_filter_menu');
_.each(this.filters, function (group) {
if (group.is_visible()) {
group.insertBefore(self.$add_filter);
@@ -340,7 +339,7 @@ return Widget.extend({
.toggleClass('o_closed_menu', !self.custom_filters_open)
.toggleClass('o_open_menu', self.custom_filters_open);
self.$add_filter_menu.toggle(self.custom_filters_open);
- self.$('.oe-filter-condition').toggle(self.custom_filters_open);
+ self.$('.o_filter_condition').toggle(self.custom_filters_open);
});
},
append_proposition: function () {
@@ -402,7 +401,8 @@ return Widget.extend({
'hidden.bs.dropdown': function () {
this.toggle_add_menu(false);
},
- 'click .add-custom-group a': function () {
+ 'click .o_add_custom_group a': function (event) {
+ event.preventDefault();
this.toggle_add_menu();
},
},
@@ -413,13 +413,13 @@ return Widget.extend({
this.searchview = parent;
},
start: function () {
- this.$menu = this.$('.group-by-menu');
+ this.$menu = this.$('.o_group_by_menu');
var divider = this.$menu.find('.divider');
_.invoke(this.groups, 'insertBefore', divider);
if (this.groups.length) {
divider.show();
}
- this.$add_group = this.$menu.find('.add-custom-group');
+ this.$add_group = this.$menu.find('.o_add_custom_group');
},
get_fields: function () {
var self = this;
@@ -435,9 +435,9 @@ return Widget.extend({
self.groupable_fields = _.sortBy(filter_group_field, 'string');
self.$menu.append(QWeb.render('GroupByMenuSelector', self));
- self.$add_group_menu = self.$('.oe-add-group');
- self.$group_selector = self.$('.oe-group-selector');
- self.$('.oe-select-group').click(function () {
+ self.$add_group_menu = self.$('.o_add_group');
+ self.$group_selector = self.$('.o_group_selector');
+ self.$('.o_select_group').click(function () {
self.toggle_add_menu(false);
var field = self.$group_selector.find(':selected').data('name');
self.add_groupby_to_menu(field);
diff --git a/addons/web/static/src/js/views/search_view.js b/addons/web/static/src/js/views/search_view.js
index 125b7c9c152..fa1794cdc7c 100644
--- a/addons/web/static/src/js/views/search_view.js
+++ b/addons/web/static/src/js/views/search_view.js
@@ -2,6 +2,7 @@ odoo.define('web.SearchView', function (require) {
"use strict";
var AutoComplete = require('web.AutoComplete');
+var config = require('web.config');
var core = require('web.core');
var data_manager = require('web.data_manager');
var FavoriteMenu = require('web.FavoriteMenu');
@@ -9,9 +10,9 @@ var FilterMenu = require('web.FilterMenu');
var GroupByMenu = require('web.GroupByMenu');
var pyeval = require('web.pyeval');
var search_inputs = require('web.search_inputs');
-var utils = require('web.utils');
var View = require('web.View');
var Widget = require('web.Widget');
+var _t = core._t;
var Backbone = window.Backbone;
@@ -134,125 +135,32 @@ var InputView = Widget.extend({
template: 'SearchView.InputView',
events: {
focus: function () { this.trigger('focused', this); },
- blur: function () { this.$el.text(''); this.trigger('blurred', this); },
+ blur: function () { this.$el.val(''); this.trigger('blurred', this); },
keydown: 'onKeydown',
- paste: 'onPaste',
- },
- getSelection: function () {
- this.el.normalize();
- // get Text node
- var root = this.el.childNodes[0];
- if (!root || !root.textContent) {
- // if input does not have a child node, or the child node is an
- // empty string, then the selection can only be (0, 0)
- return {start: 0, end: 0};
- }
- var range = window.getSelection().getRangeAt(0);
- // In Firefox, depending on the way text is selected (drag, double- or
- // triple-click) the range may start or end on the parent of the
- // selected text node‽ Check for this condition and fixup the range
- // note: apparently with C-a this can go even higher?
- if (range.startContainer === this.el && range.startOffset === 0) {
- range.setStart(root, 0);
- }
- if (range.endContainer === this.el && range.endOffset === 1) {
- range.setEnd(root, root.length);
- }
- utils.assert(range.startContainer === root,
- "selection should be in the input view");
- utils.assert(range.endContainer === root,
- "selection should be in the input view");
- return {
- start: range.startOffset,
- end: range.endOffset
- };
},
onKeydown: function (e) {
- this.el.normalize();
- var sel;
switch (e.which) {
- // Do not insert newline, but let it bubble so searchview can use it
- case $.ui.keyCode.ENTER:
- e.preventDefault();
- break;
+ case $.ui.keyCode.BACKSPACE:
+ if(this.$el.val() === '') {
+ var preceding = this.getParent().siblingSubview(this, -1);
+ if (preceding && (preceding instanceof FacetView)) {
+ preceding.model.destroy();
+ }
+ }
+ break;
- // FIXME: may forget content if non-empty but caret at index 0, ok?
- case $.ui.keyCode.BACKSPACE:
- sel = this.getSelection();
- if (sel.start === 0 && sel.start === sel.end) {
- e.preventDefault();
- var preceding = this.getParent().siblingSubview(this, -1);
- if (preceding && (preceding instanceof FacetView)) {
- preceding.model.destroy();
+ case $.ui.keyCode.LEFT: // Stop propagation to parent if not at beginning of input value
+ if(this.el.selectionStart > 0) {
+ e.stopPropagation();
}
- }
- break;
+ break;
- // let left/right events propagate to view if caret is at input border
- // and not a selection
- case $.ui.keyCode.LEFT:
- sel = this.getSelection();
- if (sel.start !== 0 || sel.start !== sel.end) {
- e.stopPropagation();
- }
- break;
- case $.ui.keyCode.RIGHT:
- sel = this.getSelection();
- var len = this.$el.text().length;
- if (sel.start !== len || sel.start !== sel.end) {
- e.stopPropagation();
- }
- break;
+ case $.ui.keyCode.RIGHT: // Stop propagation to parent if not at end of input value
+ if(this.el.selectionStart < this.$el.val().length) {
+ e.stopPropagation();
+ }
+ break;
}
- },
- setCursorAtEnd: function () {
- this.el.normalize();
- var sel = window.getSelection();
- sel.removeAllRanges();
- var range = document.createRange();
- // in theory, range.selectNodeContents should work here. In practice,
- // MSIE9 has issues from time to time, instead of selecting the inner
- // text node it would select the reference node instead (e.g. in demo
- // data, company news, copy across the "Company News" link + the title,
- // from about half the link to half the text, paste in search box then
- // hit the left arrow key, getSelection would blow up).
- //
- // Explicitly selecting only the inner text node (only child node
- // since we've normalized the parent) avoids the issue
- range.selectNode(this.el.childNodes[0]);
- range.collapse(false);
- sel.addRange(range);
- },
- onPaste: function () {
- this.el.normalize();
- // In MSIE and Webkit, it is possible to get various representations of
- // the clipboard data at this point e.g.
- // window.clipboardData.getData('Text') and
- // event.clipboardData.getData('text/plain') to ensure we have a plain
- // text representation of the object (and probably ensure the object is
- // pastable as well, so nobody puts an image in the search view)
- // (nb: since it's not possible to alter the content of the clipboard
- // — at least in Webkit — to ensure only textual content is available,
- // using this would require 1. getting the text data; 2. manually
- // inserting the text data into the content; and 3. cancelling the
- // paste event)
- //
- // But Firefox doesn't support the clipboard API (as of FF18)
- // although it correctly triggers the paste event (Opera does not even
- // do that) => implement lowest-denominator system where onPaste
- // triggers a followup "cleanup" pass after the data has been pasted
- setTimeout(function () {
- // Read text content (ignore pasted HTML)
- var data = this.$el.text();
- if (!data)
- return;
- // paste raw text back in
- this.$el.empty().text(data);
- this.el.normalize();
- // Set the cursor at the end of the text, so the cursor is not lost
- // in some kind of error-spawning limbo.
- this.setCursorAtEnd();
- }.bind(this), 0);
}
});
@@ -262,7 +170,7 @@ var FacetView = Widget.extend({
'focus': function () { this.trigger('focused', this); },
'blur': function () { this.trigger('blurred', this); },
'click': function (e) {
- if ($(e.target).is('.oe_facet_remove')) {
+ if ($(e.target).hasClass('o_facet_remove')) {
this.model.destroy();
return false;
}
@@ -272,10 +180,10 @@ var FacetView = Widget.extend({
'keydown': function (e) {
var keys = $.ui.keyCode;
switch (e.which) {
- case keys.BACKSPACE:
- case keys.DELETE:
- this.model.destroy();
- return false;
+ case keys.BACKSPACE:
+ case keys.DELETE:
+ this.model.destroy();
+ return false;
}
}
},
@@ -290,9 +198,12 @@ var FacetView = Widget.extend({
},
start: function () {
var self = this;
- var $e = this.$('> span:last-child');
+ var $e = this.$('.o_facet_values').last();
return $.when(this._super()).then(function () {
- return $.when.apply(null, self.model.values.map(function (value) {
+ return $.when.apply(null, self.model.values.map(function (value, index) {
+ if (index > 0) {
+ $('<span/>', {html: self.model.get('separator') || _t(" or ")}).addClass('o_facet_values_sep').appendTo($e);
+ }
return new FacetValueView(self, value).appendTo($e);
}));
});
@@ -319,49 +230,34 @@ var FacetValueView = Widget.extend({
});
var SearchView = View.extend({
- defaults: _.extend({}, View.prototype.defaults, {
- hidden: false,
- disable_filters: false,
- disable_groupby: false,
- disable_favorites: false,
- disable_custom_filters: false,
- }),
events: {
- // focus last input if view itself is clicked
- 'click': function (e) {
- if (e.target === this.$('.oe_searchview_facets')[0]) {
- this.$('.oe_searchview_input:last').focus();
- }
- },
- // search button
- 'click div.oe_searchview_search': function (e) {
- e.stopImmediatePropagation();
- this.do_search();
- },
- 'click .oe_searchview_unfold_drawer': function (e) {
- e.stopImmediatePropagation();
- $(e.target).toggleClass('fa-caret-down fa-caret-up');
+ 'click .o_searchview_more': function (e) {
+ $(e.target).toggleClass('fa-search-plus fa-search-minus');
localStorage.visible_search_menu = (localStorage.visible_search_menu !== 'true');
this.toggle_buttons();
},
- 'keydown .oe_searchview_input, .oe_searchview_facet': function (e) {
+ 'keydown .o_searchview_input, .o_searchview_facet': function (e) {
switch(e.which) {
- case $.ui.keyCode.LEFT:
- this.focusPreceding(e.target);
- e.preventDefault();
- break;
- case $.ui.keyCode.RIGHT:
- if (!this.autocomplete.is_expandable()) {
- this.focusFollowing(e.target);
- }
- e.preventDefault();
- break;
+ case $.ui.keyCode.LEFT:
+ this.focusPreceding(e.target);
+ e.preventDefault();
+ break;
+ case $.ui.keyCode.RIGHT:
+ if(!this.autocomplete.is_expandable()) {
+ this.focusFollowing(e.target);
+ }
+ e.preventDefault();
+ break;
}
},
- 'autocompleteopen': function () {
- this.$el.autocomplete('widget').css('z-index', 9999);
- },
},
+ defaults: _.extend({}, View.prototype.defaults, {
+ hidden: false,
+ disable_filters: false,
+ disable_groupby: false,
+ disable_favorites: false,
+ disable_custom_filters: false,
+ }),
template: "SearchView",
/**
@@ -377,9 +273,9 @@ var SearchView = View.extend({
*/
init: function() {
this._super.apply(this, arguments);
- this.title = this.options.action && this.options.action.name;
- this.action_id = this.options.action && this.options.action.id;
this.query = undefined;
+ this.title = this.options.action && this.options.action.name;
+ this.action_id = this.options.action && this.options.action.id;
this.search_fields = [];
this.filters = [];
this.groupbys = [];
@@ -408,15 +304,14 @@ var SearchView = View.extend({
this.do_hide();
}
this.toggle_visibility(false);
- this.$facets_container = this.$('div.oe_searchview_facets');
this.setup_global_completion();
this.query = new SearchQuery()
.on('add change reset remove', this.proxy('do_search'))
.on('change', this.proxy('renderChangedFacets'))
.on('add reset remove', this.proxy('renderFacets'));
- this.$('.oe_searchview_unfold_drawer')
- .toggleClass('fa-caret-down', !this.visible_filters)
- .toggleClass('fa-caret-up', this.visible_filters);
+ this.$('.o_searchview_more')
+ .toggleClass('fa-search-minus', this.visible_filters)
+ .toggleClass('fa-search-plus', !this.visible_filters);
var menu_defs = [];
this.prepare_search_inputs();
if (this.$buttons) {
@@ -516,8 +411,8 @@ var SearchView = View.extend({
if (this.$buttons) {
this.$buttons.toggle(!this.headless && is_visible && this.visible_filters);
}
- if (!this.headless && is_visible) {
- this.$('div.oe_searchview_input').last().focus();
+ if (!config.device.touch && config.device.size_class >= config.device.SIZES.SM) {
+ this.$('input').focus();
}
},
toggle_buttons: function (is_visible) {
@@ -535,7 +430,7 @@ var SearchView = View.extend({
source: this.proxy('complete_global_search'),
select: this.proxy('select_completion'),
get_search_string: function () {
- return self.$('div.oe_searchview_input').text();
+ return self.$('.o_searchview_input').val().trim();
},
});
this.autocomplete.appendTo(this.$el);
@@ -569,10 +464,11 @@ var SearchView = View.extend({
*/
select_completion: function (e, ui) {
e.preventDefault();
- var input_index = _(this.input_subviews).indexOf(
- this.subviewForRoot(
- this.$('div.oe_searchview_input:focus')[0]));
- this.query.add(ui.item.facet, {at: input_index / 2});
+ if(ui.item.facet.values && ui.item.facet.values.length && String(ui.item.facet.values[0].value).trim() !== "") {
+ this.query.add(ui.item.facet);
+ } else {
+ this.query.trigger('add');
+ }
},
subviewForRoot: function (subview_root) {
return _(this.input_subviews).detect(function (subview) {
@@ -609,34 +505,21 @@ var SearchView = View.extend({
_.invoke(this.input_subviews, 'destroy');
this.input_subviews = [];
- var i = new InputView(this);
- started.push(i.appendTo(this.$facets_container));
- this.input_subviews.push(i);
this.query.each(function (facet) {
var f = new FacetView(this, facet);
- started.push(f.appendTo(self.$facets_container));
+ started.push(f.appendTo(self.$el));
self.input_subviews.push(f);
-
- var i = new InputView(this);
- started.push(i.appendTo(self.$facets_container));
- self.input_subviews.push(i);
}, this);
+ var i = new InputView(this);
+ started.push(i.appendTo(self.$el));
+ self.input_subviews.push(i);
_.each(this.input_subviews, function (childView) {
childView.on('focused', self, self.proxy('childFocused'));
childView.on('blurred', self, self.proxy('childBlurred'));
});
$.when.apply(null, started).then(function () {
- if (options && options.focus_input === false) return;
- var input_to_focus;
- // options.at: facet inserted at given index, focus next input
- // otherwise just focus last input
- if (!options || typeof options.at !== 'number') {
- input_to_focus = _.last(self.input_subviews);
- } else {
- input_to_focus = self.input_subviews[(options.at + 1) * 2];
- }
- input_to_focus.$el.focus();
+ _.last(self.input_subviews).$el.focus();
});
},
childFocused: function () {
@@ -726,230 +609,3 @@ _.extend(SearchView, {
return SearchView;
});
-
-odoo.define('web.AutoComplete', function (require) {
-"use strict";
-
-var Widget = require('web.Widget');
-
-return Widget.extend({
- template: "SearchView.autocomplete",
-
- // Parameters for autocomplete constructor:
- //
- // parent: this is used to detect keyboard events
- //
- // options.source: function ({term:query}, callback). This function will be called to
- // obtain the search results corresponding to the query string. It is assumed that
- // options.source will call callback with the results.
- // options.select: function (ev, {item: {facet:facet}}). Autocomplete widget will call
- // that function when a selection is made by the user
- // options.get_search_string: function (). This function will be called by autocomplete
- // to obtain the current search string.
- init: function (parent, options) {
- this._super(parent);
- this.$input = parent.$el;
- this.source = options.source;
- this.select = options.select;
- this.get_search_string = options.get_search_string;
-
- this.current_result = null;
-
- this.searching = true;
- this.search_string = '';
- this.current_search = null;
- },
- start: function () {
- var self = this;
- this.$input.on('keyup', function (ev) {
- if (ev.which === $.ui.keyCode.RIGHT) {
- self.searching = true;
- ev.preventDefault();
- return;
- }
- if (ev.which === $.ui.keyCode.ENTER) {
- if (self.search_string.length) {
- self.select_item(ev);
- }
- return;
- }
- var search_string = self.get_search_string();
- if (self.search_string !== search_string) {
- if (search_string.length) {
- self.search_string = search_string;
- self.initiate_search(search_string);
- } else {
- self.close();
- }
- }
- });
- this.$input.on('keypress', function (ev) {
- self.search_string = self.search_string + String.fromCharCode(ev.which);
- if (self.search_string.length) {
- self.searching = true;
- var search_string = self.search_string;
- self.initiate_search(search_string);
- } else {
- self.close();
- }
- });
- this.$input.on('keydown', function (ev) {
- switch (ev.which) {
- case $.ui.keyCode.ENTER:
-
- // TAB and direction keys are handled at KeyDown because KeyUp
- // is not guaranteed to fire.
- // See e.g. https://github.com/aef-/jquery.masterblaster/issues/13
- case $.ui.keyCode.TAB:
- if (self.search_string.length) {
- self.select_item(ev);
- }
- break;
- case $.ui.keyCode.DOWN:
- self.move('down');
- self.searching = false;
- ev.preventDefault();
- break;
- case $.ui.keyCode.UP:
- self.move('up');
- self.searching = false;
- ev.preventDefault();
- break;
- case $.ui.keyCode.RIGHT:
- self.searching = false;
- var current = self.current_result;
- if (current && current.expand && !current.expanded) {
- self.expand();
- self.searching = true;
- }
- ev.preventDefault();
- break;
- case $.ui.keyCode.ESCAPE:
- self.close();
- self.searching = false;
- break;
- }
- });
- },
- initiate_search: function (query) {
- if (query === this.search_string && query !== this.current_search) {
- this.search(query);
- }
- },
- search: function (query) {
- var self = this;
- this.current_search = query;
- this.source({term:query}, function (results) {
- if (results.length) {
- self.render_search_results(results);
- self.focus_element(self.$('li:first-child'));
- } else {
- self.close();
- }
- });
- },
- render_search_results: function (results) {
- var self = this;
- var $list = this.$('ul');
- $list.empty();
- var render_separator = false;
- results.forEach(function (result) {
- if (result.is_separator) {
- if (render_separator)
- $list.append($('<li>').addClass('oe-separator'));
- render_separator = false;
- } else {
- var $item = self.make_list_item(result).appendTo($list);
- result.$el = $item;
- render_separator = true;
- }
- });
- this.show();
- },
- make_list_item: function (result) {
- var self = this;
- var $li = $('<li>')
- .hover(function () {self.focus_element($li);})
- .mousedown(function (ev) {
- if (ev.button === 0) { // left button
- self.select(ev, {item: {facet: result.facet}});
- self.close();
- } else {
- ev.preventDefault();
- }
- })
- .data('result', result);
- if (result.expand) {
- var $expand = $('<span class="oe-expand">').text('▶').appendTo($li);
- $expand.mousedown(function (ev) {
- ev.preventDefault();
- ev.stopPropagation();
- if (result.expanded)
- self.fold();
- else
- self.expand();
- });
- result.expanded = false;
- }
- if (result.indent) $li.addClass('oe-indent');
- $li.append($('<span>').html(result.label));
- return $li;
- },
- expand: function () {
- var self = this;
- var current_result = this.current_result;
- current_result.expand(this.get_search_string()).then(function (results) {
- (results || [{label: '(no result)'}]).reverse().forEach(function (result) {
- result.indent = true;
- var $li = self.make_list_item(result);
- current_result.$el.after($li);
- });
- current_result.expanded = true;
- current_result.$el.find('span.oe-expand').html('▼');
- });
- },
- fold: function () {
- var $next = this.current_result.$el.next();
- while ($next.hasClass('oe-indent')) {
- $next.remove();
- $next = this.current_result.$el.next();
- }
- this.current_result.expanded = false;
- this.current_result.$el.find('span.oe-expand').html('▶');
- },
- focus_element: function ($li) {
- this.$('li').removeClass('oe-selection-focus');
- $li.addClass('oe-selection-focus');
- this.current_result = $li.data('result');
- },
- select_item: function (ev) {
- if (this.current_result.facet) {
- this.select(ev, {item: {facet: this.current_result.facet}});
- this.close();
- }
- },
- show: function () {
- this.$el.show();
- },
- close: function () {
- this.current_search = null;
- this.search_string = '';
- this.searching = true;
- this.$el.hide();
- },
- move: function (direction) {
- var $next;
- if (direction === 'down') {
- $next = this.$('li.oe-selection-focus').nextAll(':not(.oe-separator)').first();
- if (!$next.length) $next = this.$('li:first-child');
- } else {
- $next = this.$('li.oe-selection-focus').prevAll(':not(.oe-separator)').first();
- if (!$next.length) $next = this.$('li:not(.oe-separator)').last();
- }
- this.focus_element($next);
- },
- is_expandable: function () {
- return !!this.$('.oe-selection-focus .oe-expand').length;
- },
-});
-});
diff --git a/addons/web/static/src/js/views/tree_view.js b/addons/web/static/src/js/views/tree_view.js
index 6246a1494f5..aeb206257fe 100644
--- a/addons/web/static/src/js/views/tree_view.js
+++ b/addons/web/static/src/js/views/tree_view.js
@@ -87,7 +87,7 @@ var TreeView = View.extend({
return;
}
- var $select = self.$el.find('select')
+ var $select = self.$('select')
.change(function () {
var $option = $(this).find(':selected');
self.getdata($option.val(), $option.data('children'));
@@ -155,8 +155,8 @@ var TreeView = View.extend({
children_ids = record[self.children_field];
_(children_ids).each(function(childid) {
- if (self.$el.find('[id=treerow_' + childid + '][data-row-parent-id='+ record_id +']').length ) {
- if (self.$el.find('[id=treerow_' + childid + '][data-row-parent-id='+ record_id +']').is(':hidden')) {
+ if (self.$('[id=treerow_' + childid + '][data-row-parent-id='+ record_id +']').length ) {
+ if (self.$('[id=treerow_' + childid + '][data-row-parent-id='+ record_id +']').is(':hidden')) {
is_loaded = -1;
} else {
is_loaded++;
@@ -164,7 +164,7 @@ var TreeView = View.extend({
}
});
if (is_loaded === 0) {
- if (!$this.parent().hasClass('oe_open')) {
+ if (!$this.parent().hasClass('o_open')) {
self.getdata(record_id, children_ids);
}
} else {
@@ -180,7 +180,7 @@ var TreeView = View.extend({
_(records).each(function (record) {
self.records[record.id] = record;
});
- var $curr_node = self.$el.find('#treerow_' + id);
+ var $curr_node = self.$('#treerow_' + id);
var children_rows = QWeb.render('TreeView.rows', {
'records': records,
'children_field': self.children_field,
@@ -192,10 +192,10 @@ var TreeView = View.extend({
'row_parent_id': id
});
if ($curr_node.length) {
- $curr_node.addClass('oe_open');
+ $curr_node.addClass('o_open');
$curr_node.after(children_rows);
} else {
- self.$el.find('tbody').html(children_rows);
+ self.$('tbody').html(children_rows);
}
});
},
@@ -229,11 +229,11 @@ var TreeView = View.extend({
// show & hide the contents
showcontent: function (curnode,record_id, show) {
- curnode.parent('tr').toggleClass('oe_open', show);
+ curnode.parent('tr').toggleClass('o_open', show);
_(this.records[record_id][this.children_field]).each(function (child_id) {
- var $child_row = this.$el.find('[id=treerow_' + child_id + '][data-row-parent-id='+ curnode.data('id') +']');
- if ($child_row.hasClass('oe_open')) {
- $child_row.toggleClass('oe_open',show);
+ var $child_row = this.$('[id=treerow_' + child_id + '][data-row-parent-id='+ curnode.data('id') +']');
+ if ($child_row.hasClass('o_open')) {
+ $child_row.toggleClass('o_open',show);
this.showcontent($child_row, child_id, false);
}
$child_row.toggle(show);
diff --git a/addons/web/static/src/js/web_client.js b/addons/web/static/src/js/web_client.js
index 640449d74b3..213aa70eed4 100644
--- a/addons/web/static/src/js/web_client.js
+++ b/addons/web/static/src/js/web_client.js
@@ -1,177 +1,26 @@
odoo.define('web.WebClient', function (require) {
"use strict";
-var ActionManager = require('web.ActionManager');
+var AbstractWebClient = require('web.AbstractWebClient');
var core = require('web.core');
-var crash_manager = require('web.crash_manager');
var data = require('web.data');
var data_manager = require('web.data_manager');
var framework = require('web.framework');
-var Loading = require('web.Loading');
var Menu = require('web.Menu');
var Model = require('web.DataModel');
-var NotificationManager = require('web.notification').NotificationManager;
var session = require('web.session');
var SystrayMenu = require('web.SystrayMenu');
var UserMenu = require('web.UserMenu');
-var utils = require('web.utils');
-var Widget = require('web.Widget');
-var _t = core._t;
-
-var WebClient = Widget.extend({
+return AbstractWebClient.extend({
events: {
'click .oe_logo_edit_admin': 'logo_edit',
- 'click .oe_logo img': 'on_logo_click',
- },
- custom_events: {
- 'notification': function (e) {
- if(this.notification_manager) {
- this.notification_manager.notify(e.data.title, e.data.message, e.data.sticky);
- }
- },
- 'warning': function (e) {
- if(this.notification_manager) {
- this.notification_manager.warn(e.data.title, e.data.message, e.data.sticky);
- }
- },
- },
-
- init: function(parent, client_options) {
- this.client_options = {};
- this._super(parent);
- this.origin = undefined;
- if (client_options) {
- _.extend(this.client_options, client_options);
- }
- this._current_state = null;
- this.menu_dm = new utils.DropMisordered();
- this.action_mutex = new utils.Mutex();
- this.set('title_part', {"zopenerp": "Odoo"});
- },
- start: function() {
- var self = this;
- this.on("change:title_part", this, this._title_changed);
- this._title_changed();
-
- core.bus.on('web_client_toggle_bars', this, function () {
- this.toggle_bars.apply(this, arguments);
- });
-
- document.body.classList.add('o_web_client');
- return session.session_bind(this.origin).then(function() {
- self.bind_events();
- return self.show_common();
- }).then(function() {
- if (session.session_is_valid()) {
- self.show_application();
- }
- if (self.client_options.action) {
- self.action_manager.do_action(self.client_options.action);
- delete(self.client_options.action);
- }
- core.bus.trigger('web_client_ready');
- });
- },
- bind_events: function() {
- var self = this;
- $('.oe_systray').show();
- this.$el.on('mouseenter', '.oe_systray > div:not([data-toggle=tooltip])', function() {
- $(this).attr('data-toggle', 'tooltip').tooltip().trigger('mouseenter');
- });
- this.$el.on('click', '.oe_dropdown_toggle', function(ev) {
+ 'click .oe_logo img': function(ev) {
ev.preventDefault();
- var $toggle = $(this);
- var doc_width = $(document).width();
- var $menu = $toggle.siblings('.oe_dropdown_menu');
- $menu = $menu.size() >= 1 ? $menu : $toggle.find('.oe_dropdown_menu');
- var state = $menu.is('.oe_opened');
- setTimeout(function() {
- // Do not alter propagation
- $toggle.add($menu).toggleClass('oe_opened', !state);
- if (!state) {
- // Move $menu if outside window's edge
- var offset = $menu.offset();
- var menu_width = $menu.width();
- var x = doc_width - offset.left - menu_width - 2;
- if (x < 0) {
- $menu.offset({ left: offset.left + x }).width(menu_width);
- }
- }
- }, 0);
- });
- core.bus.on('click', this, function(ev) {
- $('.tooltip').remove();
- if (!$(ev.target).is('input[type=file]')) {
- self.$el.find('.oe_dropdown_menu.oe_opened, .oe_dropdown_toggle.oe_opened').removeClass('oe_opened');
- }
- });
- core.bus.on('set_full_screen', this, function (full_screen) {
- this.set_content_full_screen(full_screen);
- });
- },
- on_logo_click: function(ev) {
- ev.preventDefault();
- return this.clear_uncommitted_changes().then(function() {
- framework.redirect("/web" + (core.debug ? "?debug" : ""));
- });
- },
- show_common: function() {
- var self = this;
- session.on('error', crash_manager, crash_manager.rpc_error);
- self.notification_manager = new NotificationManager(this);
- self.notification_manager.appendTo(self.$('.openerp'));
- self.loading = new Loading(self);
- self.loading.appendTo(self.$('.openerp_webclient_container'));
- self.action_manager = new ActionManager(self);
- self.action_manager.replace(self.$('.oe_application'));
-
- window.onerror = function (message, file, line, col, error) {
- var traceback = error ? error.stack : '';
- crash_manager.show_error({
- type: _t("Client Error"),
- message: message,
- data: {debug: file + ':' + line + "\n" + _t('Traceback:') + "\n" + traceback}
+ return this.clear_uncommitted_changes().then(function() {
+ framework.redirect("/web" + (core.debug ? "?debug" : ""));
});
- };
-
- },
- toggle_bars: function(value) {
- this.$('tr:has(td.navbar),.oe_leftbar').toggle(value);
- },
- clear_uncommitted_changes: function() {
- var def = $.Deferred().resolve();
- core.bus.trigger('clear_uncommitted_changes', function chain_callbacks(callback) {
- def = def.then(callback);
- });
- return def;
- },
- /**
- Sets the first part of the title of the window, dedicated to the current action.
- */
- set_title: function(title) {
- this.set_title_part("action", title);
- },
- /**
- Sets an arbitrary part of the title of the window. Title parts are identified by strings. Each time
- a title part is changed, all parts are gathered, ordered by alphabetical order and displayed in the
- title of the window separated by '-'.
- */
- set_title_part: function(part, title) {
- var tmp = _.clone(this.get("title_part"));
- tmp[part] = title;
- this.set("title_part", tmp);
- },
- _title_changed: function() {
- var parts = _.sortBy(_.keys(this.get("title_part")), function(x) { return x; });
- var tmp = "";
- _.each(parts, function(part) {
- var str = this.get("title_part")[part];
- if (str) {
- tmp = tmp ? tmp + " - " + str : str;
- }
- }, this);
- document.title = tmp;
+ },
},
show_application: function() {
var self = this;
@@ -186,9 +35,8 @@ var WebClient = Widget.extend({
// Create the user menu (rendered client-side)
self.user_menu = new UserMenu(self);
- var user_menu_loaded = self.user_menu.appendTo(this.$el.parents().find('.oe_user_menu_placeholder'));
- self.user_menu.on('user_logout', self, self.on_logout);
- self.user_menu.do_update();
+ var $user_menu_placeholder = $('body').find('.oe_user_menu_placeholder').show();
+ var user_menu_loaded = self.user_menu.appendTo($user_menu_placeholder);
// Create the systray menu (rendered server-side)
self.systray_menu = new SystrayMenu(self);
@@ -208,6 +56,9 @@ var WebClient = Widget.extend({
delete(self.client_options.action_post_login);
}
},
+ toggle_bars: function(value) {
+ this.$('tr:has(td.navbar),.oe_leftbar').toggle(value);
+ },
update_logo: function() {
var company = session.company_id;
var img = session.url('/web/binary/company_logo' + '?db=' + session.db + (company ? '&company=' + company : ''));
@@ -237,37 +88,12 @@ var WebClient = Widget.extend({
});
return false;
},
- /**
- * When do_action is performed on the WebClient, forward it to the main ActionManager
- * This allows to widgets that are not inside the ActionManager to perform do_action
- */
- do_action: function() {
- return this.action_manager.do_action.apply(this, arguments);
- },
- destroy_content: function() {
- _.each(_.clone(this.getChildren()), function(el) {
- el.destroy();
- });
- this.$el.children().remove();
- },
- do_reload: function() {
- var self = this;
- return this.session.session_reload().then(function () {
- session.load_modules(true).then(
- self.menu.proxy('do_reload')); });
- },
- on_logout: function() {
- var self = this;
- this.clear_uncommitted_changes().then(function() {
- self.action_manager.do_action('logout');
- });
- },
bind_hashchange: function() {
var self = this;
$(window).bind('hashchange', this.on_hashchange);
var state = $.bbq.getState(true);
- if (_.isEmpty(state) || state.action == "login") {
+ if (_.isEmpty(state) || state.action === "login") {
self.menu.is_bound.done(function() {
new Model("res.users").call("read", [session.uid, ["action_id"]]).done(function(data) {
if(data.action_id) {
@@ -277,7 +103,8 @@ var WebClient = Widget.extend({
var first_menu_id = self.menu.$el.find("a:first").data("menu");
if(first_menu_id) {
self.menu.menu_click(first_menu_id);
- } }
+ }
+ }
});
});
} else {
@@ -295,19 +122,16 @@ var WebClient = Widget.extend({
});
} else {
state._push_me = false; // no need to push state back...
- this.action_manager.do_load_state(state, !!this._current_state);
+ this.action_manager.do_load_state(state, !!this._current_state).then(function () {
+ var action = self.action_manager.get_inner_action();
+ if (action) {
+ self.menu.open_action(action.action_descr.id);
+ }
+ });
}
}
this._current_state = stringstate;
},
- do_push_state: function(state) {
- this.set_title(state.title);
- delete state.title;
- var url = '#' + $.param(state);
- this._current_state = $.deparam($.param(state), false); // stringify all values
- $.bbq.pushState(url);
- this.trigger('state_pushed', state);
- },
on_menu_action: function(options) {
var self = this;
return this.menu_dm.add(data_manager.load_action(options.action_id))
@@ -337,13 +161,6 @@ var WebClient = Widget.extend({
});
});
},
- set_content_full_screen: function(fullscreen) {
- $(document.body).css('overflow-y', fullscreen ? 'hidden' : 'scroll');
- this.$('.oe_webclient').toggleClass(
- 'oe_content_full_screen', fullscreen);
- },
});
-return WebClient;
-
});
diff --git a/addons/web/static/src/js/widgets/auto_complete.js b/addons/web/static/src/js/widgets/auto_complete.js
new file mode 100644
index 00000000000..883206ae4c2
--- /dev/null
+++ b/addons/web/static/src/js/widgets/auto_complete.js
@@ -0,0 +1,220 @@
+odoo.define('web.AutoComplete', function (require) {
+"use strict";
+
+var Widget = require('web.Widget');
+
+return Widget.extend({
+ template: "SearchView.autocomplete",
+
+ // Parameters for autocomplete constructor:
+ //
+ // parent: this is used to detect keyboard events
+ //
+ // options.source: function ({term:query}, callback). This function will be called to
+ // obtain the search results corresponding to the query string. It is assumed that
+ // options.source will call callback with the results.
+ // options.select: function (ev, {item: {facet:facet}}). Autocomplete widget will call
+ // that function when a selection is made by the user
+ // options.get_search_string: function (). This function will be called by autocomplete
+ // to obtain the current search string.
+ init: function (parent, options) {
+ this._super(parent);
+ this.$input = parent.$el;
+ this.source = options.source;
+ this.select = options.select;
+ this.get_search_string = options.get_search_string;
+
+ this.current_result = null;
+
+ this.searching = true;
+ this.search_string = '';
+ this.current_search = null;
+ },
+ start: function () {
+ var self = this;
+ this.$input.on('keyup', function (ev) {
+ if (ev.which === $.ui.keyCode.RIGHT) {
+ self.searching = true;
+ ev.preventDefault();
+ return;
+ }
+ if (ev.which === $.ui.keyCode.ENTER) {
+ if (self.search_string.length) {
+ self.select_item(ev);
+ }
+ return;
+ }
+ var search_string = self.get_search_string();
+ if (self.search_string !== search_string) {
+ if (search_string.length) {
+ self.search_string = search_string;
+ self.initiate_search(search_string);
+ } else {
+ self.close();
+ }
+ }
+ });
+ this.$input.on('keypress', function (ev) {
+ self.search_string = self.search_string + String.fromCharCode(ev.which);
+ if (self.search_string.length) {
+ self.searching = true;
+ var search_string = self.search_string;
+ self.initiate_search(search_string);
+ } else {
+ self.close();
+ }
+ });
+ this.$input.on('keydown', function (ev) {
+ switch (ev.which) {
+ case $.ui.keyCode.ENTER:
+
+ // TAB and direction keys are handled at KeyDown because KeyUp
+ // is not guaranteed to fire.
+ // See e.g. https://github.com/aef-/jquery.masterblaster/issues/13
+ case $.ui.keyCode.TAB:
+ if (self.search_string.length) {
+ self.select_item(ev);
+ }
+ break;
+ case $.ui.keyCode.DOWN:
+ self.move('down');
+ self.searching = false;
+ ev.preventDefault();
+ break;
+ case $.ui.keyCode.UP:
+ self.move('up');
+ self.searching = false;
+ ev.preventDefault();
+ break;
+ case $.ui.keyCode.RIGHT:
+ self.searching = false;
+ var current = self.current_result;
+ if (current && current.expand && !current.expanded) {
+ self.expand();
+ self.searching = true;
+ }
+ ev.preventDefault();
+ break;
+ case $.ui.keyCode.ESCAPE:
+ self.close();
+ self.searching = false;
+ break;
+ }
+ });
+ },
+ initiate_search: function (query) {
+ if (query === this.search_string && query !== this.current_search) {
+ this.search(query);
+ }
+ },
+ search: function (query) {
+ var self = this;
+ this.current_search = query;
+ this.source({term:query}, function (results) {
+ if (results.length) {
+ self.render_search_results(results);
+ self.focus_element(self.$('li:first-child'));
+ } else {
+ self.close();
+ }
+ });
+ },
+ render_search_results: function (results) {
+ var self = this;
+ var $list = this.$el;
+ $list.empty();
+ results.forEach(function (result) {
+ var $item = self.make_list_item(result).appendTo($list);
+ result.$el = $item;
+ });
+ this.show();
+ },
+ make_list_item: function (result) {
+ var self = this;
+ var $li = $('<li>')
+ .hover(function () {self.focus_element($li);})
+ .mousedown(function (ev) {
+ if (ev.button === 0) { // left button
+ self.select(ev, {item: {facet: result.facet}});
+ self.close();
+ }
+ })
+ .data('result', result);
+ if (result.expand) {
+ var $expand = $('<a class="o-expand" href="#">').appendTo($li);
+ $expand.mousedown(function (ev) {
+ ev.stopPropagation();
+ ev.preventDefault(); // to prevent dropdown from closing
+ if (result.expanded) {
+ self.fold();
+ } else {
+ self.expand();
+ }
+ });
+ $expand.click(function(ev) {
+ ev.preventDefault(); // to prevent url from changing due to href="#"
+ });
+ result.expanded = false;
+ }
+ if (result.indent) $li.addClass('o-indent');
+ $li.append($('<a href="#">').html(result.label));
+ return $li;
+ },
+ expand: function () {
+ var self = this;
+ var current_result = this.current_result;
+ current_result.expand(this.get_search_string()).then(function (results) {
+ (results || [{label: '(no result)'}]).reverse().forEach(function (result) {
+ result.indent = true;
+ var $li = self.make_list_item(result);
+ current_result.$el.after($li);
+ });
+ self.current_result.expanded = true;
+ self.current_result.$el.find('a.o-expand').removeClass('o-expand').addClass('o-expanded');
+ });
+ },
+ fold: function () {
+ var $next = this.current_result.$el.next();
+ while ($next.hasClass('o-indent')) {
+ $next.remove();
+ $next = this.current_result.$el.next();
+ }
+ this.current_result.expanded = false;
+ this.current_result.$el.find('a.o-expanded').removeClass('o-expanded').addClass('o-expand');
+ },
+ focus_element: function ($li) {
+ this.$('li').removeClass('o-selection-focus');
+ $li.addClass('o-selection-focus');
+ this.current_result = $li.data('result');
+ },
+ select_item: function (ev) {
+ if (this.current_result.facet) {
+ this.select(ev, {item: {facet: this.current_result.facet}});
+ this.close();
+ }
+ },
+ show: function () {
+ this.$el.show();
+ },
+ close: function () {
+ this.current_search = null;
+ this.search_string = '';
+ this.searching = true;
+ this.$el.hide();
+ },
+ move: function (direction) {
+ var $next;
+ if (direction === 'down') {
+ $next = this.$('li.o-selection-focus').next();
+ if (!$next.length) $next = this.$('li').first();
+ } else {
+ $next = this.$('li.o-selection-focus').prev();
+ if (!$next.length) $next = this.$('li').last();
+ }
+ this.focus_element($next);
+ },
+ is_expandable: function () {
+ return !!this.$('.o-selection-focus .o-expand').length;
+ },
+});
+});
diff --git a/addons/web/static/src/js/widgets/change_password.js b/addons/web/static/src/js/widgets/change_password.js
index 658c7ee8e7d..367cf42e680 100644
--- a/addons/web/static/src/js/widgets/change_password.js
+++ b/addons/web/static/src/js/widgets/change_password.js
@@ -13,7 +13,7 @@ var ChangePassword = Widget.extend({ // FIXME
start: function() {
var self = this;
web_client.set_title(_t("Change Password"));
- var $button = self.$el.find('.oe_form_button');
+ var $button = self.$('.oe_form_button');
$button.appendTo(this.getParent().$footer);
$button.eq(1).click(function(){
self.$el.parents('.modal').modal('hide');
diff --git a/addons/web/static/src/js/widgets/data_export.js b/addons/web/static/src/js/widgets/data_export.js
index a73020ce9b2..4b87d45ff4a 100644
--- a/addons/web/static/src/js/widgets/data_export.js
+++ b/addons/web/static/src/js/widgets/data_export.js
@@ -11,212 +11,326 @@ var QWeb = core.qweb;
var _t = core._t;
var DataExport = Dialog.extend({
- template: 'ExportTreeView',
+ template: 'ExportDialog',
events: {
- 'click #add_field': function () {
+ 'click .o_expand_parent': function(e) {
+ this.on_expand_action(this.records[$(e.target).closest('.o_export_tree_item').data('id')]);
+ },
+ 'click .o_export_tree_item': function(e) {
+ e.stopPropagation();
+ var $elem = $(e.currentTarget);
+
+ var row_index = $elem.prevAll('.o_export_tree_item').length;
+ var row_index_level = $elem.parents('.o_export_tree_item').length;
+
+ if(e.shiftKey && row_index_level === this.row_index_level) {
+ var minIndex = Math.min(row_index, this.row_index);
+ var maxIndex = Math.max(row_index, this.row_index);
+
+ this.$records.filter(function() { return ($elem.parent()[0] === $(this).parent()[0]); })
+ .slice(minIndex, maxIndex+1)
+ .addClass('o_selected')
+ .filter(':not(:last)')
+ .each(process_children);
+ }
+
+ this.row_index = row_index;
+ this.row_index_level = row_index_level;
+
+ if(e.ctrlKey) {
+ $elem.toggleClass('o_selected').focus();
+ } else if(e.shiftKey) {
+ $elem.addClass('o_selected').focus();
+ } else {
+ this.$(".o_selected").removeClass("o_selected")
+ $elem.addClass("o_selected").focus();
+ }
+
+ function process_children() {
+ var $this = $(this);
+ if($this.hasClass('open')) {
+ $this.children('.o_export_tree_item')
+ .addClass('o_selected')
+ .each(process_children);
+ }
+ }
+ },
+ 'dblclick .o_export_tree_item': function(e) {
+ var $elem = $(e.currentTarget);
+ $elem.removeClass('o_selected');
+ this.add_field($elem.data('id'), $elem.find('.o_tree_column').first().text());
+ },
+ 'keydown .o_export_tree_item': function(e) {
+ e.stopPropagation();
+ var $elem = $(e.currentTarget);
+ var record = this.records[$elem.data('id')];
+
+ switch(e.keyCode || e.which) {
+ case $.ui.keyCode.LEFT:
+ if ($elem.hasClass('open')) {
+ this.on_expand_action(record);
+ }
+ break;
+ case $.ui.keyCode.RIGHT:
+ if (!$elem.hasClass('open')) {
+ this.on_expand_action(record);
+ }
+ break;
+ case $.ui.keyCode.UP:
+ var $prev = $elem.prev('.o_export_tree_item');
+ if($prev.length === 1) {
+ while($prev.hasClass('open')) {
+ $prev = $prev.children('.o_export_tree_item').last();
+ }
+ } else {
+ $prev = $elem.parent('.o_export_tree_item');
+ if($prev.length === 0) {
+ break;
+ }
+ }
+
+ $elem.removeClass("o_selected").blur();
+ $prev.addClass("o_selected").focus();
+ break;
+ case $.ui.keyCode.DOWN:
+ var $next;
+ if($elem.hasClass('open')) {
+ $next = $elem.children('.o_export_tree_item').first();
+ } else {
+ $next = $elem.next('.o_export_tree_item');
+ if($next.length === 0) {
+ $next = $elem.parent('.o_export_tree_item').next('.o_export_tree_item');
+ if($next.length === 0) {
+ break;
+ }
+ }
+ }
+
+ $elem.removeClass("o_selected").blur();
+ $next.addClass("o_selected").focus();
+ break;
+ }
+ },
+
+ 'click .o_add_field': function() {
var self = this;
- this.$('#field-tree-structure tr.ui-selected')
- .removeClass('ui-selected')
- .find('a').each(function () {
- var id = $(this).attr('id').split('-')[1];
- var string = $(this).attr('string');
- self.add_field(id, string);
+ this.$('.o_field_tree_structure .o_selected')
+ .removeClass('o_selected')
+ .each(function() {
+ var $this = $(this);
+ self.add_field($this.data('id'), $this.children('.o_tree_column').text());
});
},
- 'click #remove_field': function () {
- this.$('#fields_list option:selected').remove();
+ 'click .o_remove_field': function() {
+ this.$fields_list.find('option:selected').remove();
+ },
+ 'click .o_remove_all_field': function() {
+ this.$fields_list.empty();
+ },
+ 'click .o_move_up': function() {
+ var $selected_rows = this.$fields_list.find('option:selected');
+
+ var $prev_row = $selected_rows.first().prev();
+ if($prev_row.length){
+ $prev_row.before($selected_rows.detach());
+ }
+ },
+ 'click .o_move_down': function () {
+ var $selected_rows = this.$fields_list.find('option:selected');
+
+ var $next_row = $selected_rows.last().next();
+ if($next_row.length){
+ $next_row.after($selected_rows.detach());
+ }
},
- 'click #remove_all_field': function () {
- this.$('#fields_list').empty();
+
+ 'click .o_toggle_save_list': function(e) {
+ e.preventDefault();
+
+ var $saveList = this.$(".o_save_list");
+ if($saveList.is(':empty')) {
+ $saveList.append(QWeb.render('Export.SaveList'));
+ } else {
+ if($saveList.is(':hidden')) {
+ $saveList.show();
+ $saveList.find(".o_export_list_input").val("");
+ } else {
+ $saveList.hide();
+ }
+ }
+ },
+ 'click .o_save_list > button': function(e) {
+ var $saveList = this.$(".o_save_list");
+
+ var value = $saveList.find("input").val();
+ if(!value) {
+ Dialog.alert(this, _t("Please enter save field list name"));
+ return;
+ }
+
+ var fields = this.get_fields();
+ if (fields.length === 0) {
+ return;
+ }
+
+ $saveList.hide();
+
+ var self = this;
+ this.exports.create({
+ name: value,
+ resource: this.dataset.model,
+ export_fields: _.map(fields, function (field) {
+ return [0, 0, {name: field}];
+ }),
+ }).then(function(export_list_id) {
+ if(!export_list_id) {
+ return;
+ }
+ var $select = self.$(".o_exported_lists_select");
+ if($select.length === 0 || $select.is(":hidden")) {
+ self.show_exports_list();
+ }
+ $select.append(new Option(value, export_list_id));
+ });
},
- 'click #export_new_list': 'on_show_save_list',
- 'click #move_up':'on_click_move_up',
- 'click #move_down':'on_click_move_down',
},
init: function(parent, dataset) {
- var self = this;
var options = {
+ title: _t("Export Data"),
buttons: [
- {text: _t("Close"), click: function () { self.$el.parents('.modal').modal('hide'); }},
- {text: _t("Export To File"), click: function () { self.on_click_export_data(); }}
+ {text: _t("Export To File"), click: this.export_data, classes: "btn-primary"},
+ {text: _t("Close"), close: true},
],
- close: function () { self.close();}
};
this._super(parent, options);
this.records = {};
this.dataset = dataset;
- this.exports = new data.DataSetSearch(
- this, 'ir.exports', this.dataset.get_context());
- this.set_title(_t("Export Data"));
+ this.exports = new data.DataSetSearch(this, 'ir.exports', this.dataset.get_context());
+
+ this.row_index = 0;
+ this.row_index_level = 0;
},
start: function() {
var self = this;
- this._super.apply(this, arguments);
+ var waitFor = [this._super.apply(this, arguments)];
+
+ this.$fields_list = this.$('.o_fields_list');
+ this.$import_compat_radios = this.$('.o_import_compat input');
+
+ waitFor.push(this.rpc('/web/export/formats', {}).then(do_setup_export_formats));
var got_fields = new $.Deferred();
- this.$el.find('#import_compat').change(function() {
- self.$el.find('#fields_list').empty();
- self.$el.find('#field-tree-structure').remove();
- var import_comp = self.$el.find("#import_compat").val();
+ this.$import_compat_radios.change(function(e) {
+ self.$fields_list.empty();
+ self.$('.o_field_tree_structure').remove();
+
self.rpc("/web/export/get_fields", {
model: self.dataset.model,
- import_compat: !!import_comp,
+ import_compat: !!$(e.target).val(),
}).done(function (records) {
got_fields.resolve();
self.on_show_data(records);
});
- }).change();
+ }).eq(0).change();
+ waitFor.push(got_fields);
- var got_domain = this.getParent().get_active_domain().then(function (domain) {
+ waitFor.push(this.getParent().get_active_domain().then(function (domain) {
if (domain === undefined) {
self.ids_to_export = self.getParent().get_selected_ids();
self.domain = self.dataset.domain;
- }
- else {
+ } else {
self.ids_to_export = false;
self.domain = domain;
}
self.on_show_domain();
- });
+ }));
- return $.when(
- got_fields,
- got_domain,
- this.rpc('/web/export/formats', {}).done(this.do_setup_export_formats),
- this.show_exports_list());
- },
- on_click_move_up: function () {
- var prev_row = this.$('#fields_list option:selected').first().prev();
- if(prev_row.length){
- var selected_rows = this.$('#fields_list option:selected').detach();
- prev_row.before(selected_rows);
- }
- },
- on_click_move_down: function () {
- var next_row = this.$('#fields_list option:selected').last().next();
- if(next_row.length){
- var selected_rows = this.$('#fields_list option:selected').detach();
- next_row.after(selected_rows);
+ waitFor.push(this.show_exports_list());
+
+ return $.when.apply($, waitFor);
+
+ function do_setup_export_formats(formats) {
+ var $fmts = self.$('.o_export_format');
+
+ _.each(formats, function(format, i) {
+ var $radio = $('<input/>', {type: 'radio', value: format.tag, name: 'o_export_format_name'});
+ var $label = $('<label/>', {html: format.label});
+
+ if (format.error) {
+ $radio.prop('disabled', true);
+ $label.html(_.str.sprintf("%s — %s", format.label, format.error));
+ }
+
+ $fmts.append($("<div/>").append($radio, $label));
+ });
+
+ self.$export_format_inputs = $fmts.find('input');
+ self.$export_format_inputs.first().prop('checked', true);
}
},
- do_setup_export_formats: function (formats) {
- var $fmts = this.$el.find('#export_format');
- _(formats).each(function (format) {
- var opt = new Option(format.label, format.tag);
- if (format.error) {
- opt.disabled = true;
- opt.replaceChild(
- document.createTextNode(
- _.str.sprintf("%s — %s", format.label, format.error)),
- opt.childNodes[0]);
- }
- $fmts.append(opt);
- });
- },
show_exports_list: function() {
- var self = this;
- if (self.$el.find('#saved_export_list').is(':hidden')) {
- self.$el.find('#ExistsExportList').show();
+ if (this.$('.o_exported_lists_select').is(':hidden')) {
+ this.$('.o_exported_lists').show();
return $.when();
}
+
+ var self = this;
return this.exports.read_slice(['name'], {
domain: [['resource', '=', this.dataset.model]]
- }).done(function (export_list) {
+ }).then(function (export_list) {
if (!export_list.length) {
return;
}
- self.$el.find('#ExistsExportList').append(QWeb.render('Exists.ExportList', {'existing_exports': export_list}));
- self.$el.find('#saved_export_list').change(function() {
- self.$el.find('#fields_list option').remove();
- var export_id = self.$el.find('#saved_export_list option:selected').val();
- if (export_id) {
- self.rpc('/web/export/namelist', {'model': self.dataset.model, export_id: parseInt(export_id, 10)}).done(self.do_load_export_field);
+ self.$('.o_exported_lists').append(QWeb.render('Export.SavedList', {'existing_exports': export_list}));
+ self.$('.o_exported_lists_select').on('change', function() {
+ self.$fields_list.empty();
+ var export_id = self.$('.o_exported_lists_select option:selected').val();
+ if(export_id) {
+ self.rpc('/web/export/namelist', {
+ model: self.dataset.model,
+ export_id: parseInt(export_id, 10),
+ }).then(do_load_export_field);
}
});
- self.$el.find('#delete_export_list').click(function() {
- var select_exp = self.$el.find('#saved_export_list option:selected');
- if (select_exp.val()) {
+ self.$('.o_delete_exported_list').click(function() {
+ var select_exp = self.$('.o_exported_lists_select option:selected');
+ if(select_exp.val()) {
self.exports.unlink([parseInt(select_exp.val(), 10)]);
select_exp.remove();
- self.$el.find("#fields_list option").remove();
- if (self.$el.find('#saved_export_list option').length <= 1) {
- self.$el.find('#ExistsExportList').hide();
+ self.$fields_list.empty();
+ if (self.$('.o_exported_lists_select option').length <= 1) {
+ self.$('.o_exported_lists').hide();
}
}
});
});
- },
- do_load_export_field: function(field_list) {
- var export_node = this.$el.find("#fields_list");
- _(field_list).each(function (field) {
- export_node.append(new Option(field.label, field.name));
- });
- },
- on_show_save_list: function() {
- var self = this;
- var current_node = self.$el.find("#savenewlist");
- if (!(current_node.find("label")).length) {
- current_node.append(QWeb.render('ExportNewList'));
- current_node.find("#add_export_list").click(function() {
- var value = current_node.find("#savelist_name").val();
- if (value) {
- self.do_save_export_list(value);
- } else {
- alert(_t("Please enter save field list name"));
- }
+
+ function do_load_export_field(field_list) {
+ _.each(field_list, function (field) {
+ self.$fields_list.append(new Option(field.label, field.name));
});
- } else {
- if (current_node.is(':hidden')) {
- current_node.show();
- current_node.find("#savelist_name").val("");
- } else {
- current_node.hide();
- }
}
},
- do_save_export_list: function(value) {
- var self = this;
- var fields = self.get_fields();
- if (!fields.length) {
+ on_expand_action: function(record) {
+ if(!record['children']) {
return;
}
- this.exports.create({
- name: value,
- resource: this.dataset.model,
- export_fields: _(fields).map(function (field) {
- return [0, 0, {name: field}];
- })
- }).then(function (export_list_id) {
- if (!export_list_id) {
- return;
- }
- if (!self.$el.find("#saved_export_list").length || self.$el.find("#saved_export_list").is(":hidden")) {
- self.show_exports_list();
- }
- self.$el.find("#saved_export_list").append( new Option(value, export_list_id) );
- });
- this.on_show_save_list();
- },
- on_click: function(id, record) {
- var self = this;
- if (!record['children']) {
- return;
- }
- var model = record['params']['model'],
- prefix = record['params']['prefix'],
- name = record['params']['name'],
- exclude_fields = [];
- if (record['relation_field']) {
+
+ var model = record['params']['model'];
+ var prefix = record['params']['prefix'];
+ var name = record['params']['name'];
+ var exclude_fields = [];
+ if(record['relation_field']) {
exclude_fields.push(record['relation_field']);
}
- if (!record.loaded) {
- var import_comp = self.$el.find("#import_compat").val();
- self.rpc("/web/export/get_fields", {
+ if(!record.loaded) {
+ var self = this;
+ this.rpc("/web/export/get_fields", {
model: model,
prefix: prefix,
parent_name: name,
- import_compat: Boolean(import_comp),
+ import_compat: !!this.$import_compat_radios.filter(':checked').val(),
parent_field_type : record['field_type'],
exclude: exclude_fields
}).done(function(results) {
@@ -224,200 +338,90 @@ var DataExport = Dialog.extend({
self.on_show_data(results, record.id);
});
} else {
- self.showcontent(record.id);
+ this.show_content(record.id);
}
},
on_show_domain: function() {
- this.$el.find('tr').first().find('td').append(QWeb.render('ExportTreeView-Domain', {'record': this}));
+ this.$('p').first()
+ .after(QWeb.render('Export.DomainMessage', {record: this}));
},
- on_show_data: function(result, after) {
+ on_show_data: function(records, expansion) {
var self = this;
-
- if (after) {
- var current_tr = self.$el.find("tr[id='treerow-" + after + "']");
- current_tr.addClass('open');
- current_tr.find('img').attr('src','/web/static/src/img/collapse.gif');
- current_tr.after(QWeb.render('ExportTreeView-Secondary.children', {'fields': result}));
+
+ if(expansion) {
+ this.$('.o_export_tree_item[data-id="' + expansion + '"]')
+ .addClass('open')
+ .find('.o_expand_parent')
+ .toggleClass('fa-plus fa-minus')
+ .next()
+ .after(QWeb.render('Export.TreeItems', {'fields': records}));
} else {
- self.$el.find('#left_field_panel').append(QWeb.render('ExportTreeView-Secondary', {'fields': result}));
+ this.$('.o_left_field_panel').empty().append(
+ $("<div/>").addClass('o_field_tree_structure')
+ .append(QWeb.render('Export.TreeItems', {'fields': records}))
+ );
}
- _.each(result, function(record) {
- self.records[record.id] = record.value;
- if (record.required) {
- var required_fld = self.$el.find("tr[id='treerow-" + record.id + "']").find('#tree-column');
- required_fld.addClass("oe_export_requiredfield");
- }
- self.$el.find("img[id='parentimg-" + record.id +"']").click(function() {
- self.on_click(this.id, record);
- });
- self.$el.find("tr[id='treerow-" + record.id + "']").click(function(e) {
- if (e.shiftKey) {
- var frst_click, scnd_click = '';
- if (self.row_index === 0) {
- self.row_index = this.rowIndex;
- frst_click = self.$el.find("tr[id^='treerow-']")[self.row_index-1];
- $(frst_click).addClass("ui-selected");
- } else {
- var i;
- if (this.rowIndex >=self.row_index) {
- for (i = (self.row_index-1); i < this.rowIndex; i++) {
- scnd_click = self.$el.find("tr[id^='treerow-']")[i];
- if (!$(scnd_click).find('#tree-column').hasClass("oe_export_readonlyfield")) {
- $(scnd_click).addClass("ui-selected");
- }
- }
- } else {
- for (i = (self.row_index-1); i >= (this.rowIndex-1); i--) {
- scnd_click = self.$el.find("tr[id^='treerow-']")[i];
- if (!$(scnd_click).find('#tree-column').hasClass("oe_export_readonlyfield")) {
- $(scnd_click).addClass("ui-selected");
- }
- }
- }
- }
- }
- self.row_index = this.rowIndex;
-
- self.$el.find("tr[id='treerow-" + record.id + "']").keyup(function() {
- self.row_index = 0;
- });
- var o2m_selection = self.$el.find("tr[id='treerow-" + record.id + "']").find('#tree-column');
- if ($(o2m_selection).hasClass("oe_export_readonlyfield")) {
- return false;
- }
- if (e.ctrlKey) {
- if ($(this).hasClass('ui-selected')) {
- $(this).removeClass('ui-selected').find('a').blur();
- } else {
- $(this).addClass('ui-selected').find('a').focus();
- }
- } else if (!e.shiftKey) {
- self.$el.find("tr.ui-selected")
- .removeClass("ui-selected").find('a').blur();
- $(this).addClass("ui-selected").find('a').focus();
- }
- return false;
- });
-
- self.$el.find("tr[id='treerow-" + record.id + "']").keydown(function(e) {
- var keyCode = e.keyCode || e.which;
- var arrow = {left: 37, up: 38, right: 39, down: 40 };
- var elem;
- switch (keyCode) {
- case arrow.left:
- if ($(this).hasClass('open')) {
- self.on_click(this.id, record);
- }
- break;
- case arrow.right:
- if (!$(this).hasClass('open')) {
- self.on_click(this.id, record);
- }
- break;
- case arrow.up:
- elem = this;
- $(elem).removeClass("ui-selected");
- while (!$(elem).prev().is(":visible")) {
- elem = $(elem).prev();
- }
- if (!$(elem).prev().find('#tree-column').hasClass("oe_export_readonlyfield")) {
- $(elem).prev().addClass("ui-selected");
- }
- $(elem).prev().find('a').focus();
- break;
- case arrow.down:
- elem = this;
- $(elem).removeClass("ui-selected");
- while(!$(elem).next().is(":visible")) {
- elem = $(elem).next();
- }
- if (!$(elem).next().find('#tree-column').hasClass("oe_export_readonlyfield")) {
- $(elem).next().addClass("ui-selected");
- }
- $(elem).next().find('a').focus();
- break;
- }
- });
- self.$el.find("tr[id='treerow-" + record.id + "']").dblclick(function() {
- var $o2m_selection = self.$el.find("tr[id^='treerow-" + record.id + "']").find('#tree-column');
- if (!$o2m_selection.hasClass("oe_export_readonlyfield")) {
- self.add_field(record.id, $(this).find("a").attr("string"));
- }
- });
- });
- self.$el.find('#fields_list').mouseover(function(event) {
- if (event.relatedTarget) {
- if (event.relatedTarget.attributes['id'] && event.relatedTarget.attributes['string']) {
- var field_id = event.relatedTarget.attributes["id"]["value"];
- if (field_id && field_id.split("-")[0] === 'export') {
- if (!self.$el.find("tr[id='treerow-" + field_id.split("-")[1] + "']").find('#tree-column').hasClass("oe_export_readonlyfield")) {
- self.add_field(field_id.split("-")[1], event.relatedTarget.attributes["string"]["value"]);
- }
- }
- }
- }
+ _.extend(this.records, _.object(_.pluck(records, 'id'), records));
+ this.$records = this.$(".o_export_tree_item");
+ this.$records.each(function(i, el) {
+ var $elem = $(el);
+ $elem.find('.o_tree_column').first().toggleClass('o_required', !!self.records[$elem.data('id')].required);
});
},
- showcontent: function(id) {
- // show & hide the contents
- var $this = this.$el.find("tr[id='treerow-" + id + "']");
- var is_open = $this.hasClass('open');
+ show_content: function(id) {
+ var $this = this.$('.o_export_tree_item[data-id="' + id + '"]');
$this.toggleClass('open');
+ var is_open = $this.hasClass('open');
- var first_child = $this.find('img');
- if (is_open) {
- first_child.attr('src', '/web/static/src/img/expand.gif');
- } else {
- first_child.attr('src', '/web/static/src/img/collapse.gif');
- }
- var child_field = this.$el.find("tr[id^='treerow-" + id +"/']");
+ $this.children('.o_expand_parent').toggleClass('fa-minus', !!is_open).toggleClass('fa-plus', !is_open);
+
+ var $child_field = $this.find('.o_export_tree_item');
var child_len = (id.split("/")).length + 1;
- for (var i = 0; i < child_field.length; i++) {
- var $child = $(child_field[i]);
- if (is_open) {
+ for (var i = 0 ; i < $child_field.length ; i++) {
+ var $child = $child_field.eq(i);
+ if(!is_open) {
$child.hide();
- } else if (child_len == (child_field[i].id.split("/")).length) {
+ } else if(child_len === $child_field.eq(i).data('id').split("/").length) {
if ($child.hasClass('open')) {
$child.removeClass('open');
- $child.find('img').attr('src', '/web/static/src/img/expand.gif');
+ $child.children('.o_expand_parent').removeClass('fa-minus').addClass('fa-plus');
}
$child.show();
}
}
},
add_field: function(field_id, string) {
- var field_list = this.$el.find('#fields_list');
- field_id = this.records[field_id] || field_id;
- if (this.$el.find("#fields_list option[value='" + field_id + "']")
- && !this.$el.find("#fields_list option[value='" + field_id + "']").length) {
- field_list.append(new Option(string, field_id));
+ var $field_list = this.$('.o_fields_list');
+ if($field_list.find("option[value='" + field_id + "']").length === 0) {
+ $field_list.append(new Option(string, field_id));
}
},
get_fields: function() {
- var export_fields = this.$("#fields_list option").map(function() {
+ var $export_fields = this.$(".o_fields_list option").map(function() {
return $(this).val();
}).get();
- if (!export_fields.length) {
- alert(_t("Please select fields to save export list..."));
+ if($export_fields.length === 0) {
+ Dialog.alert(this, _t("Please select fields to save export list..."));
}
- return export_fields;
+ return $export_fields;
},
- on_click_export_data: function() {
+ export_data: function() {
var self = this;
- var exported_fields = this.$el.find('#fields_list option').map(function () {
- // DOM property is textContent, but IE8 only knows innerText
- return {name: self.records[this.value] || this.value,
- label: this.textContent || this.innerText};
+ var exported_fields = this.$('.o_fields_list option').map(function () {
+ return {
+ name: (self.records[this.value] || this).value,
+ label: this.textContent || this.innerText // DOM property is textContent, but IE8 only knows innerText
+ };
}).get();
if (_.isEmpty(exported_fields)) {
- alert(_t("Please select fields to export..."));
+ Dialog.alert(this, _t("Please select fields to export..."));
return;
}
exported_fields.unshift({name: 'id', label: 'External ID'});
- var export_format = this.$el.find("#export_format").val();
+ var export_format = this.$export_format_inputs.filter(':checked').val();
framework.blockUI();
this.session.get_file({
@@ -428,16 +432,14 @@ var DataExport = Dialog.extend({
ids: this.ids_to_export,
domain: this.domain,
context: this.dataset.context,
- import_compat: !!this.$el.find("#import_compat").val(),
+ import_compat: !!this.$import_compat_radios.filter(':checked').val(),
})},
complete: framework.unblockUI,
error: crash_manager.rpc_error.bind(crash_manager),
});
},
- close: function() {
- this._super();
- }
});
return DataExport;
+
});
diff --git a/addons/web/static/src/js/widgets/debug_manager.js b/addons/web/static/src/js/widgets/debug_manager.js
index 74a534ec40e..d95509bb465 100644
--- a/addons/web/static/src/js/widgets/debug_manager.js
+++ b/addons/web/static/src/js/widgets/debug_manager.js
@@ -1,6 +1,8 @@
odoo.define('web.DebugManager', function (require) {
"use strict";
+var ActionManager = require('web.ActionManager');
+var common = require('web.form_common');
var core = require('web.core');
var Dialog = require('web.Dialog');
var formats = require('web.formats');
@@ -8,210 +10,691 @@ var framework = require('web.framework');
var Model = require('web.Model');
var session = require('web.session');
var SystrayMenu = require('web.SystrayMenu');
+var Tour = require('web.Tour');
var utils = require('web.utils');
var ViewManager = require('web.ViewManager');
+var WebClient = require('web.WebClient');
var Widget = require('web.Widget');
var QWeb = core.qweb;
var _t = core._t;
-if (core.debug) {
- var DebugManager = Widget.extend({
- template: "WebClient.DebugManager",
- events: {
- "click .oe_debug_button": "render_dropdown",
- "click .js_debug_dropdown li": "on_debug_click",
- },
- start: function() {
- this._super();
- this.$dropdown = this.$(".js_debug_dropdown");
- },
- /**
- * Updates its attributes according to the inner_widget of the ActionManager
- */
- _update: function() {
- this.view_manager = odoo.__DEBUG__.services['web.web_client'].action_manager.get_inner_widget();
- if (!this.view_manager instanceof ViewManager) { return; }
- this.dataset = this.view_manager.dataset;
- this.active_view = this.view_manager.active_view;
- if (!this.active_view) { return; }
- this.view = this.active_view.controller;
- return true;
+var ADD = function (id) { return [4, id, false]; },
+ REMOVE = function (id) { return [3, id, false]; };
+/**
+ * DebugManager base + general features (applicable to any context)
+ */
+var DebugManager = Widget.extend({
+ template: "WebClient.DebugManager",
+ events: {
+ "click a[data-action]": "perform_callback",
+ "mouseover .o_debug_dropdowns > li:not(.open)": function(e) {
+ // Open other dropdowns on mouseover
+ var $opened = this.$('.o_debug_dropdowns > li.open');
+ if($opened.length) {
+ $opened.removeClass('open');
+ $(e.currentTarget).addClass('open').find('> a').focus();
+ }
},
- /**
- * Renders the DebugManager dropdown
- */
- render_dropdown: function() {
- var self = this;
+ },
+ init: function () {
+ this._super.apply(this, arguments);
+ // 15 fps, only actually call after sequences of queries
+ this._update_stats = _.throttle(
+ this._update_stats.bind(this),
+ 1000/15, {leading: false});
+ this._events = null;
+ if (document.querySelector('meta[name=debug]')) {
+ this._events = [];
+ }
+ },
+ start: function () {
+ core.bus.on('action_pushed', this, this.update);
+ core.bus.on('rpc:result', this, function (req, resp) {
+ this._debug_events(resp.debug);
+ });
+ this.on('update-stats', this, this._update_stats);
+ var init;
+ if ((init = document.querySelector('meta[name=debug]'))) {
+ this._debug_events(JSON.parse(init.getAttribute('value')));
+ }
- // Empty the previously rendered dropdown
- this.$dropdown.empty();
+ this.$dropdown = this.$(".o_debug_dropdown");
+ // falsy if can't write to user or couldn't find technical features
+ // group, otherwise features group id
+ this._features_group = null;
+ // whether group is currently enabled for current user
+ this._has_features = false;
+ // whether the current user is an administrator
+ this._is_admin = false;
+ return $.when(
+ new Model('res.users').call('check_access_rights', {operation: 'write', raise_exception: false}),
+ this.session.user_has_group('base.group_no_one'),
+ new Model('ir.model.data').call('xmlid_to_res_id', {xmlid: 'base.group_no_one'}),
+ this.session.user_has_group('base.group_system'),
+ this._super()
+ ).then(function (can_write_user, has_group_no_one, group_no_one_id, is_admin) {
+ this._features_group = can_write_user && group_no_one_id;
+ this._has_features = has_group_no_one;
+ this._is_admin = is_admin;
+ return this.update();
+ }.bind(this));
+ },
+ leave_debug_mode: function () {
+ var qs = $.deparam.querystring();
+ delete qs.debug;
+ window.location.search = '?' + $.param(qs);
+ }, /**
+ * Calls the appropriate callback when clicking on a Debug option
+ */
+ perform_callback: function (evt) {
+ evt.preventDefault();
+ var params = $(evt.target).data();
+ var callback = params.action;
- // Attempt to retrieve the inner_widget of the ActionManager
- if (!this._update()) {
- // Disable the button when not available
- console.warn("DebugManager is not available");
- return;
+ if (callback && this[callback]) {
+ // Perform the callback corresponding to the option
+ this[callback](params, evt);
+ } else {
+ console.warn("No handler for ", callback);
+ }
+ },
+
+ _debug_events: function (events) {
+ if (!this._events) { return; }
+ if (events && events.length) {
+ this._events.push(events);
+ }
+ this.trigger('update-stats', this._events);
+ },
+ requests_clear: function () {
+ if (!this._events) { return; }
+ this._events = [];
+ this.trigger('update-stats', this._events);
+ },
+ _update_stats: function (rqs) {
+ var requests = 0, rtime = 0, queries = 0, qtime = 0;
+ for(var r = 0; r < rqs.length; ++r) {
+ for (var i = 0; i < rqs[r].length; i++) {
+ var event = rqs[r][i];
+ var query_start, request_start;
+ switch (event[0]) {
+ case 'request-start':
+ request_start = event[3] * 1e3;
+ break;
+ case 'request-end':
+ ++requests;
+ rtime += (event[3] * 1e3 - request_start) | 0;
+ break;
+ case 'sql-start':
+ query_start = event[3] * 1e3;
+ break;
+ case 'sql-end':
+ ++queries;
+ qtime += (event[3] * 1e3 - query_start) | 0;
+ break;
+ }
}
+ }
+ this.$('#debugmanager_requests_stats').text(
+ _.str.sprintf(_t("%d requests (%d ms) %d queries (%d ms)"),
+ requests, rtime, queries, qtime));
+ },
+ show_timelines: function () {
+ if (this._overlay) {
+ this._overlay.destroy();
+ this._overlay = null;
+ return;
+ }
+ this._overlay = new RequestsOverlay(this);
+ this._overlay.appendTo(document.body);
+ },
- this.session.user_has_group('base.group_system').then(function(is_admin) {
- // Render the dropdown and append it
- var dropdown_content = QWeb.render('WebClient.DebugDropdown', {
- widget: self,
- active_view: self.active_view,
- view: self.view,
- action: self.view_manager.action,
- searchview: self.view_manager.searchview,
- is_admin: is_admin,
- });
- $(dropdown_content).appendTo(self.$dropdown);
- });
- },
- /**
- * Calls the appropriate callback when clicking on a Debug option
- */
- on_debug_click: function (evt) {
- evt.preventDefault();
-
- var params = $(evt.target).data();
- var callback = params.action;
-
- if (callback && this[callback]) {
- // Perform the callback corresponding to the option
- this[callback](params, evt);
- } else {
- console.warn("No debug handler for ", callback);
+ /**
+ * Update the debug manager: reinserts all "universal" controls
+ */
+ update: function () {
+ this.$dropdown
+ .empty()
+ .append(QWeb.render('WebClient.DebugManager.Global', {
+ manager: this,
+ }));
+ return $.when();
+ },
+ start_tour: function() {
+ var dialog = new Dialog(this, {
+ title: 'Tours',
+ $content: QWeb.render('WebClient.DebugManager.ToursDialog', {
+ tours: Tour.tours
+ }),
+ }).open();
+
+ dialog.$('.o_start_tour').on('click', function(e) {
+ e.preventDefault();
+ odoo.__DEBUG__.services['web.Tour'].run($(e.target).data('id'));
+ });
+ },
+ select_view: function () {
+ var self = this;
+ new common.SelectCreateDialog(this, {
+ res_model: 'ir.ui.view',
+ title: _t('Select a view'),
+ disable_multiple_selection: true,
+ on_selected: function (element_ids) {
+ new Model('ir.ui.view')
+ .query(['name', 'model', 'type'])
+ .filter([['id', '=', element_ids[0]]])
+ .first()
+ .then(function (view) {
+ self.do_action({
+ type: 'ir.actions.act_window',
+ name: view.name,
+ res_model: view.model,
+ views: [[view.id, view.type]]
+ });
+ });
}
- },
- get_metadata: function() {
- var ds = this.dataset;
- ds.call('get_metadata', [this.view.get_selected_ids()]).done(function(result) {
- new Dialog(this, {
- title: _.str.sprintf(_t("Metadata (%s)"), ds.model),
- size: 'medium',
- $content: QWeb.render('WebClient.DebugViewLog', {
- perm : result[0],
- format : formats.format_value
- })
- }).open();
- });
- },
- toggle_layout_outline: function() {
- this.view.rendering_engine.toggle_layout_debugging();
- },
- set_defaults: function() {
- this.view.open_defaults_dialog();
- },
- perform_js_tests: function() {
- this.do_action({
- name: _t("JS Tests"),
- target: 'new',
- type : 'ir.actions.act_url',
- url: '/web/tests?mod=*'
+ }).open();
+ },
+ perform_js_tests: function () {
+ this.do_action({
+ name: _t("JS Tests"),
+ target: 'new',
+ type: 'ir.actions.act_url',
+ url: '/web/tests?mod=*'
+ });
+ },
+ toggle_technical_features: function () {
+ if (!this._features_group) { return; }
+ var command = this._has_features ? REMOVE(this._features_group) : ADD(this._features_group);
+ new Model('res.users').call('write', [session.uid, {
+ groups_id: [command]
+ }]).then(function () {
+ window.location.reload();
+ });
+ },
+ split_assets: function() {
+ window.location = $.param.querystring(window.location.href, 'debug=assets');
+ },
+});
+
+/**
+ * DebugManager features depending on having an action, and possibly a model
+ * (window action)
+ */
+DebugManager.include({
+ /**
+ * Updates current action (action descriptor) on tag = action,
+ */
+ update: function (tag, descriptor) {
+ if (tag === 'action') {
+ this._action = descriptor;
+ }
+ return this._super().then(function () {
+ this.$dropdown.find(".o_debug_leave_section").before(QWeb.render('WebClient.DebugManager.Action', {
+ manager: this,
+ action: this._action
+ }));
+ }.bind(this));
+ },
+ edit: function (params, evt) {
+ this.do_action({
+ res_model: params.model,
+ res_id: params.id,
+ name: evt.target.text,
+ type: 'ir.actions.act_window',
+ views: [[false, 'form']],
+ view_mode: 'form',
+ target: 'new',
+ flags: {action_buttons: true, headless: true}
+ });
+ },
+ get_view_fields: function () {
+ var self = this;
+ var model = this._action.res_model;
+ new Model(model).call('fields_get', {
+ attributes: ['string', 'searchable', 'required', 'readonly', 'type', 'store', 'sortable', 'relation', 'help']
+ }).done(function (fields) {
+ new Dialog(self, {
+ title: _.str.sprintf(_t("Fields of %s"), model),
+ $content: $(QWeb.render('WebClient.DebugManager.Action.Fields', {
+ fields: fields
+ }))
+ }).open();
+ });
+ },
+ manage_filters: function () {
+ this.do_action({
+ res_model: 'ir.filters',
+ name: _t('Manage Filters'),
+ views: [[false, 'list'], [false, 'form']],
+ type: 'ir.actions.act_window',
+ context: {
+ search_default_my_filters: true,
+ search_default_model_id: this._action.res_model
+ }
+ });
+ },
+ edit_workflow: function () {
+ return this.do_action({
+ res_model: 'workflow',
+ name: _t('Edit Workflow'),
+ domain: [['osv', '=', this._action.res_model]],
+ views: [[false, 'list'], [false, 'form'], [false, 'diagram']],
+ type: 'ir.actions.act_window',
+ view_type: 'list',
+ view_mode: 'list'
+ });
+ },
+ translate: function() {
+ var model = this._action.res_model;
+ new Model("ir.translation")
+ .call('get_technical_translations', [model])
+ .then(this.do_action);
+ }
+});
+
+/**
+ * DebugManager features depending on having a form view or single record.
+ * These could theoretically be split, but for now they'll be considered one
+ * and the same.
+ */
+DebugManager.include({
+ start: function () {
+ this._can_edit_views = false;
+ return $.when(
+ this._super(),
+ new Model('ir.ui.view').call(
+ 'check_access_rights', {operation: 'write', raise_exception: false}
+ ).then(function (ar) {
+ this._can_edit_views = ar;
+ }.bind(this))
+ );
+ },
+ update: function (tag, descriptor, widget) {
+ switch (tag) {
+ case 'action':
+ if (!(widget instanceof ViewManager)) {
+ this._active_view = null;
+ this._view_manager = null;
+ break;
+ }
+ this._view_manager = widget;
+ widget.on('switch_mode', this, function () {
+ this.update('view', null, widget);
});
- },
- get_view_fields: function() {
- var self = this;
- self.dataset.call('fields_get', [false, {}]).done(function (fields) {
- var $root = $('<dl>');
- _(fields).each(function (attributes, name) {
- $root.append($('<dt>').append($('<h4>').text(name)));
- var $attrs = $('<dl>').appendTo($('<dd>').appendTo($root));
- _(attributes).each(function (def, name) {
- if (def instanceof Object) {
- def = JSON.stringify(def);
- }
- $attrs
- .append($('<dt>').text(name))
- .append($('<dd style="white-space: pre-wrap;">').text(def));
- });
+ case 'view':
+ this._active_view = widget.active_view;
+ }
+
+ return this._super(tag, descriptor).then(function () {
+ this.$dropdown.find(".o_debug_leave_section").before(QWeb.render('WebClient.DebugManager.View', {
+ manager: this,
+ action: this._action,
+ view: this._active_view,
+ can_edit: this._can_edit_views,
+ searchview: this._view_manager && this._view_manager.searchview,
+ }));
+ }.bind(this));
+ },
+
+ get_metadata: function() {
+ var ds = this._view_manager.dataset;
+ ds.call('get_metadata', [this._active_view.controller.get_selected_ids()]).done(function(result) {
+ new Dialog(this, {
+ title: _.str.sprintf(_t("Metadata (%s)"), ds.model),
+ size: 'medium',
+ $content: QWeb.render('WebClient.DebugViewLog', {
+ perm : result[0],
+ format : formats.format_value
+ })
+ }).open();
+ });
+ },
+ set_defaults: function() {
+ this._active_view.controller.open_defaults_dialog();
+ },
+ fvg: function() {
+ var dialog = new Dialog(this, { title: _t("Fields View Get") }).open();
+ $('<pre>').text(utils.json_node_to_xml(
+ this._active_view.controller.fields_view.arch, true)
+ ).appendTo(dialog.$el);
+ },
+ print_workflow: function() {
+ var ids = this._active_view.controller.get_selected_ids();
+ framework.blockUI();
+ var action = {
+ context: { active_ids: ids },
+ report_name: "workflow.instance.graph",
+ datas: {
+ model: this._view_manager.dataset.model,
+ id: ids[0],
+ nested: true,
+ }
+ };
+ this.session.get_file({
+ url: '/web/report',
+ data: {action: JSON.stringify(action)},
+ complete: framework.unblockUI
+ });
+ },
+});
+function make_context(width, height, fn) {
+ var canvas = document.createElement('canvas');
+ canvas.width = width;
+ canvas.height = height;
+ // make e.layerX/e.layerY imitate e.offsetX/e.offsetY.
+ canvas.style.position = 'relative';
+ var ctx = canvas.getContext('2d');
+ ctx.imageSmoothingEnabled = false;
+ ctx.mozImageSmoothingEnabled = false;
+ ctx.oImageSmoothingEnabled = false;
+ ctx.webkitImageSmoothingEnabled = false;
+ fn && fn(ctx);
+ return ctx;
+}
+var RequestsOverlay = Widget.extend({
+ template: 'WebClient.DebugManager.RequestsOverlay',
+ TRACKS: 8,
+ TRACK_WIDTH: 9,
+ events: {
+ mousemove: function (e) {
+ this.$tooltip.hide();
+ }
+ },
+ init: function () {
+ this._super.apply(this, arguments);
+ this._render = _.throttle(
+ this._render.bind(this),
+ 1000/15, {leading: false}
+ );
+ },
+ start: function () {
+ var _super = this._super();
+ this.$tooltip = this.$('div.o_debug_tooltip');
+ this.getParent().on('update-stats', this, this._render);
+ this._render();
+ return _super;
+ },
+ tooltip: function (text, start, end, x, y) {
+ // x and y are hit point with respect to the viewport. To know where
+ // this hit point is with respect to the overlay, subtract the offset
+ // between viewport and overlay, then add scroll factor of overlay
+ // (which isn't taken in account by the viewport).
+ //
+ // Normally the viewport overlay should sum offsets of all
+ // offsetParents until we reach `null` but in this case the overlay
+ // should have been added directly to the body, which should have an
+ // offset of 0.
+
+ var top = y - this.el.offsetTop + this.el.scrollTop + 1;
+ var left = x - this.el.offsetLeft + this.el.scrollLeft + 1;
+ this.$tooltip.css({top: top, left: left}).show()[0].innerHTML = ['<p>', text, ' (', (end - start), 'ms)', '</p>'].join('');
+ },
+
+ _render: function () {
+ var $summary = this.$('header'),
+ w = $summary[0].clientWidth,
+ $requests = this.$('.o_debug_requests');
+ $summary.find('canvas').attr('width', w);
+ var tracks = document.getElementById('o_debug_requests_summary');
+
+ _.invoke(this.getChildren(), 'destroy');
+
+ var requests = this.getParent()._events;
+ var bounds = this._get_bounds(requests);
+ // horizontal scaling factor for summary
+ var scale = w / (bounds.high - bounds.low);
+
+ // store end-time of "current" requests, to find out which track a
+ // request should go in, just look for the first track whose end-time
+ // is smaller than the new request's start time.
+ var track_ends = _(this.TRACKS).times(_.constant(-Infinity));
+
+ var ctx = tracks.getContext('2d');
+ ctx.lineWidth = this.TRACK_WIDTH;
+ for (var i = 0; i < requests.length; i++) {
+ var request = requests[i];
+ // FIXME: is it certain that events in the request are sorted by timestamp?
+ var rstart = Math.floor(request[0][3] * 1e3);
+ var rend = Math.ceil(request[request.length - 1][3] * 1e3);
+ // find free track for current request
+ for(var track=0; track < track_ends.length; ++track) {
+ if (track_ends[track] < rstart) { break; }
+ }
+ // FIXME: display error message of some sort? Re-render with larger area? Something?
+ if (track >= track_ends.length) {
+ console.warn("could not find an empty summary track");
+ continue;
+ }
+ // set new track end
+ track_ends[track] = rend;
+ ctx.save();
+ ctx.translate(Math.floor((rstart - bounds.low) * scale), track * (this.TRACK_WIDTH + 1));
+ this._draw_request(request, ctx, 0, scale);
+ ctx.restore();
+ new RequestDetails(this, request, scale).appendTo($requests);
+ }
+ },
+ _draw_request: function (request, to_context, step, hscale, handle_event) {
+ // have one draw surface for each event type:
+ // * no need to alter context from one event to the next, each surface
+ // gets its own color for all its lifetime
+ // * surfaces can be blended in a specified order, which means events
+ // can be drawn in any order, no need to care about z-index while
+ // serializing events to the surfaces
+ var surfaces = {
+ request: make_context(to_context.canvas.width, to_context.canvas.height, function (ctx) {
+ ctx.strokeStyle = 'blue';
+ ctx.fillStyle = '#88f';
+ ctx.lineJoin = 'round';
+ ctx.lineWidth = 1;
+ }),
+ //func: make_context(to_context.canvas.width, to_context.canvas.height, function (ctx) {
+ // ctx.strokeStyle = 'gray';
+ // ctx.lineWidth = to_context.lineWidth;
+ // ctx.translate(0, initial_offset);
+ //}),
+ sql: make_context(to_context.canvas.width, to_context.canvas.height, function (ctx) {
+ ctx.strokeStyle = 'red';
+ ctx.fillStyle = '#f88';
+ ctx.lineJoin = 'round';
+ ctx.lineWidth = 1;
+ }),
+ template: make_context(to_context.canvas.width, to_context.canvas.height, function (ctx) {
+ ctx.strokeStyle = 'green';
+ ctx.fillStyle = '#8f8';
+ ctx.lineJoin = 'round';
+ ctx.lineWidth = 1;
+ })
+ };
+ // apply scaling manually so zooming in improves display precision
+ var stacks = {}, start = Math.floor(request[0][3] * 1e3 * hscale);
+ var event_idx = 0;
+
+ var rect_width = to_context.lineWidth;
+ for (var i = 0; i < request.length; i++) {
+ var type, m, event = request[i];
+ var tag = event[0], timestamp = Math.floor(event[3] * 1e3 * hscale) - start;
+
+ if (m = /(\w+)-start/.exec(tag)) {
+ type = m[1];
+ if (!(type in stacks)) { stacks[type] = []; }
+ handle_event && handle_event(event_idx, timestamp, event);
+ stacks[type].push({
+ timestamp: timestamp,
+ idx: event_idx++
});
- new Dialog(self, {
- title: _.str.sprintf(_t("Model %s fields"), self.dataset.model),
- $content: $root
- }).open();
- });
- },
- fvg: function() {
- var dialog = new Dialog(this, { title: _t("Fields View Get") }).open();
- $('<pre>').text(utils.json_node_to_xml(this.view.fields_view.arch, true)).appendTo(dialog.$el);
- },
- manage_filters: function() {
- this.do_action({
- res_model: 'ir.filters',
- name: _t('Manage Filters'),
- views: [[false, 'list'], [false, 'form']],
- type: 'ir.actions.act_window',
- context: {
- search_default_my_filters: true,
- search_default_model_id: this.dataset.model
- }
- });
- },
- translate: function() {
- new Model("ir.translation")
- .call('get_technical_translations', [this.dataset.model])
- .then(this.do_action);
+ } else if (m = /(\w+)-end/.exec(tag)) {
+ type = m[1];
+ var stack = stacks[type];
+ var estart = stack.pop(), duration = Math.ceil(timestamp - estart.timestamp);
+ handle_event && handle_event(estart.idx, timestamp, event);
+
+ var surface = surfaces[type];
+ if (!surface) { continue; } // FIXME: support for unknown event types
+
+ var y = step * estart.idx;
+ // path rectangle for the current event on the relevant surface
+ surface.rect(estart.timestamp + 0.5, y + 0.5, duration || 1, rect_width);
+ }
+ }
+ // add each layer to the main canvas
+ var keys = ['request', /*'func', */'template', 'sql'];
+ for (var j = 0; j < keys.length; ++j) {
+ // stroke and fill all rectangles for the relevant surface/context
+ var ctx = surfaces[keys[j]];
+ ctx.fill();
+ ctx.stroke();
+ to_context.drawImage(ctx.canvas, 0, 0);
+ }
+ },
+ /**
+ * Returns first and last events in milliseconds
+ *
+ * @param requests
+ * @returns {{low: number, high: number}}
+ * @private
+ */
+ _get_bounds: function (requests) {
+ var low = +Infinity;
+ var high =-+Infinity;
+
+ for (var i = 0; i < requests.length; i++) {
+ var request = requests[i];
+ for (var j = 0; j < request.length; j++) {
+ var event = request[j];
+ var timestamp = event[3];
+ low = Math.min(low, timestamp);
+ high = Math.max(high, timestamp);
+ }
+ }
+ return {low: Math.floor(low * 1e3), high: Math.ceil(high * 1e3)};
+ }
+});
+var RequestDetails = Widget.extend({
+ events: {
+ click: function () {
+ this._open = !this._open;
+ this.render();
},
- edit: function(params, evt) {
- this.do_action({
- res_model : params.model,
- res_id : params.id,
- name: evt.target.text,
- type : 'ir.actions.act_window',
- view_type : 'form',
- view_mode : 'form',
- views : [[false, 'form']],
- target : 'new',
- flags : {
- action_buttons : true,
- headless: true,
+ 'mousemove canvas': function (e) {
+ e.stopPropagation();
+ var y = e.y || e.offsetY || e.layerY;
+ if (!y) { return; }
+ var event = this._payloads[Math.floor(y / this._REQ_HEIGHT)];
+ if (!event) { return; }
+
+ this.getParent().tooltip(event.payload, event.start, event.stop, e.clientX, e.clientY);
+ }
+ },
+ init: function (parent, request, scale) {
+ this._super.apply(this, arguments);
+ this._request = request;
+ this._open = false;
+ this._scale = scale;
+ this._REQ_HEIGHT = 20;
+ },
+ start: function () {
+ this.el.style.borderBottom = '1px solid black';
+ this.render();
+ return this._super();
+ },
+ render: function () {
+ var request_cell_height = this._REQ_HEIGHT, TITLE_WIDTH = 200;
+ var request = this._request;
+ var req_start = request[0][3] * 1e3;
+ var req_duration = request[request.length - 1][3] * 1e3 - req_start;
+ var height = request_cell_height * (this._open ? request.length / 2 : 1);
+ var cell_center = request_cell_height / 2;
+ var ctx = make_context(210 + Math.ceil(req_duration * this._scale), height, function (ctx) {
+ ctx.lineWidth = cell_center;
+ });
+ this.$el.empty().append(ctx.canvas);
+ var payloads = this._payloads = [];
+
+ // lazy version: if the render is single-line (!this._open), the extra
+ // content will be discarded when the text canvas gets pasted onto the
+ // main canvas. An improvement would be to not do text rendering
+ // beyond the first event for "closed" requests events… then again
+ // that makes for more regular rendering profile?
+ var text_ctx = make_context(TITLE_WIDTH, height, function (ctx) {
+ ctx.font = '12px sans-serif';
+ ctx.textAlign = 'right';
+ ctx.textBaseline = 'middle';
+ ctx.translate(0, cell_center);
+ });
+
+ ctx.save();
+ ctx.translate(TITLE_WIDTH + 10, ((request_cell_height/4)|0));
+
+ this.getParent()._draw_request(request, ctx, this._open ? request_cell_height : 0, this._scale, function (idx, timestamp, event) {
+ if (/-start$/g.test(event[0])) {
+ payloads.push({
+ payload: event[2],
+ start: timestamp,
+ stop: null
+ });
+
+ // we want ~200px wide, assume the average character is at
+ // least 4px wide => there can be *at most* 49 characters
+ var title = event[2];
+ title = title.replace(/\s+$/, '');
+ title = title.length <= 50 ? title : ('…' + title.slice(-49));
+ while (text_ctx.measureText(title).width > 200) {
+ title = '…' + title.slice(2);
}
+ text_ctx.fillText(title, TITLE_WIDTH, request_cell_height * idx);
+ } else if (/-end$/g.test(event[0])) {
+ payloads[idx].stop = timestamp;
+ }
+ });
+ ctx.restore();
+ // add the text layer to the main canvas
+ ctx.drawImage(text_ctx.canvas, 0, 0);
+ }
+});
+
+if (core.debug) {
+ SystrayMenu.Items.push(DebugManager);
+
+ WebClient.include({
+ start: function() {
+ var self = this;
+ return this._super().then(function () {
+ // Override push_action so that it triggers an event each time a new action is pushed
+ // The DebugManager listens to this event to keep itself up-to-date
+ var push_action = self.action_manager.push_action;
+ self.action_manager.push_action = function(widget, descr) {
+ return push_action.apply(self.action_manager, arguments).then(function () {
+ core.bus.trigger('action_pushed', 'action', descr, widget);
+ });
+ };
});
},
- edit_workflow: function() {
- return this.do_action({
- res_model : 'workflow',
- name: _t('Edit Workflow'),
- domain : [['osv', '=', this.dataset.model]],
- views: [[false, 'list'], [false, 'form'], [false, 'diagram']],
- type : 'ir.actions.act_window',
- view_type : 'list',
- view_mode : 'list'
- });
- },
- print_workflow: function() {
- if (this.view.get_selected_ids && this.view.get_selected_ids().length == 1) {
- framework.blockUI();
- var action = {
- context: { active_ids: this.view.get_selected_ids() },
- report_name: "workflow.instance.graph",
- datas: {
- model: this.dataset.model,
- id: this.view.get_selected_ids()[0],
- nested: true,
- }
- };
- this.session.get_file({
- url: '/web/report',
- data: {action: JSON.stringify(action)},
- complete: framework.unblockUI
+ });
+
+ Dialog.include({
+ open: function() {
+ var self = this;
+
+ var parent = self.getParent();
+ if (parent instanceof ActionManager && parent.dialog_widget) {
+ // Instantiate the DebugManager and insert it into the DOM once dialog is opened
+ this.opened(function() {
+ self.debug_manager = new DebugManager(self);
+ var $header = self.$modal.find('.modal-header');
+ return self.debug_manager.prependTo($header).then(function() {
+ self.debug_manager.update('action', parent.dialog_widget.action, parent.dialog_widget);
+ });
});
- } else {
- this.do_warn("Warning", "No record selected.");
}
- },
- split_assets: function() {
- window.location = $.param.querystring(window.location.href, 'debug=assets');
- },
- leave_debug: function() {
- window.location.search="?";
+
+ return this._super.apply(this, arguments);
},
});
-
- SystrayMenu.Items.push(DebugManager);
-
- return DebugManager;
}
+return DebugManager;
+
});
diff --git a/addons/web/static/src/js/widgets/loading.js b/addons/web/static/src/js/widgets/loading.js
index 4ccabcc199e..645287ecf80 100644
--- a/addons/web/static/src/js/widgets/loading.js
+++ b/addons/web/static/src/js/widgets/loading.js
@@ -9,7 +9,8 @@ var Widget = require('web.Widget');
var _t = core._t;
var Loading = Widget.extend({
- template: _t("Loading"),
+ template: "Loading",
+
init: function(parent) {
this._super(parent);
this.count = 0;
diff --git a/addons/web/static/src/js/widgets/pager.js b/addons/web/static/src/js/widgets/pager.js
index 21f3957ca97..d9b37dc889a 100644
--- a/addons/web/static/src/js/widgets/pager.js
+++ b/addons/web/static/src/js/widgets/pager.js
@@ -28,6 +28,7 @@ var Pager = Widget.extend({
* @param {int} [limit] the number of elements per page
* @param {boolean} [options.can_edit] editable feature of the pager
* @param {boolean} [options.single_page_hidden] (not) to display the pager if only one page
+ * @param {function} [options.validate] callback returning a Deferred to validate changes
*/
init: function (parent, size, current_min, limit, options) {
this.state = {
@@ -43,6 +44,9 @@ var Pager = Widget.extend({
this.options = _.defaults({}, options, {
can_edit: true, // editable
single_page_hidden: false, // displayed even if there is a single page
+ validate: function() {
+ return $.Deferred().resolve();
+ },
});
this._super(parent);
},
@@ -101,7 +105,7 @@ var Pager = Widget.extend({
_edit: function() {
if (this.options.can_edit) {
var self = this;
- var $input = $('<input>').val(this.$value.html());
+ var $input = $('<input>', {type: 'text', value: this.$value.html()});
this.$value.html($input);
$input.focus();
@@ -129,23 +133,26 @@ var Pager = Widget.extend({
* @param {jQuery} [$input] the jQuery element containing the new state
*/
_save: function($input) {
- var value = $input.val().split("-");
- var min = utils.confine(parseInt(value[0], 10), 1, this.state.size);
- var max = utils.confine(parseInt(value[1], 10), 1, this.state.size);
-
- if (!isNaN(min)) {
- this.state.current_min = min;
- if (!isNaN(max)) {
- this.state.limit = utils.confine(max-min+1, 1, this.state.size);
- } else {
- // The state has been given as a single value -> set the limit to 1
- this.state.limit = 1;
+ var self = this;
+ this.options.validate().then(function() {
+ var value = $input.val().split("-");
+ var min = utils.confine(parseInt(value[0], 10), 1, self.state.size);
+ var max = utils.confine(parseInt(value[1], 10), 1, self.state.size);
+
+ if (!isNaN(min)) {
+ self.state.current_min = min;
+ if (!isNaN(max)) {
+ self.state.limit = utils.confine(max-min+1, 1, self.state.size);
+ } else {
+ // The state has been given as a single value -> set the limit to 1
+ self.state.limit = 1;
+ }
+ self.trigger('pager_changed', _.clone(self.state));
}
- this.trigger('pager_changed', _.clone(this.state));
- }
-
- // Render the pager's new state (removes the input)
- this._render();
+ }).always(function() {
+ // Render the pager's new state (removes the input)
+ self._render();
+ });
},
/**
@@ -153,23 +160,26 @@ var Pager = Widget.extend({
* @param {int} [direction] the action (previous or next) on the pager
*/
_change_selection: function (direction) {
- var size = this.state.size;
- var current_min = this.state.current_min;
- var limit = this.state.limit;
-
- // Compute the new current_min
- current_min = (current_min + limit*direction);
- if (current_min > size) {
- current_min = 1;
- } else if ((current_min < 1) && (limit === 1)) {
- current_min = size;
- } else if ((current_min < 1) && (limit > 1)) {
- current_min = size - ((size % limit) || limit) + 1;
- }
+ var self = this;
+ this.options.validate().then(function() {
+ var size = self.state.size;
+ var current_min = self.state.current_min;
+ var limit = self.state.limit;
+
+ // Compute the new current_min
+ current_min = (current_min + limit*direction);
+ if (current_min > size) {
+ current_min = 1;
+ } else if ((current_min < 1) && (limit === 1)) {
+ current_min = size;
+ } else if ((current_min < 1) && (limit > 1)) {
+ current_min = size - ((size % limit) || limit) + 1;
+ }
- this.state.current_min = current_min;
- this.trigger('pager_changed', _.clone(this.state));
- this._render();
+ self.state.current_min = current_min;
+ self.trigger('pager_changed', _.clone(self.state));
+ self._render();
+ });
},
/**
diff --git a/addons/web/static/src/js/widgets/sidebar.js b/addons/web/static/src/js/widgets/sidebar.js
index 9ea15be128b..e2222526320 100644
--- a/addons/web/static/src/js/widgets/sidebar.js
+++ b/addons/web/static/src/js/widgets/sidebar.js
@@ -6,7 +6,6 @@ var data = require('web.data');
var Dialog = require('web.Dialog');
var framework = require('web.framework');
var pyeval = require('web.pyeval');
-var session = require('web.session');
var Widget = require('web.Widget');
var QWeb = core.qweb;
@@ -37,6 +36,7 @@ var Sidebar = Widget.extend({
start: function() {
var self = this;
this._super(this);
+ this.$el.addClass('btn-group');
this.redraw();
this.$el.on('click','.dropdown-menu li a', function(event) {
var section = $(this).data('section');
@@ -53,16 +53,19 @@ var Sidebar = Widget.extend({
});
},
redraw: function() {
- var self = this;
- self.$el.html(QWeb.render('Sidebar', {widget: self}));
+ this.$el.html(QWeb.render('Sidebar', {widget: this}));
// Hides Sidebar sections when item list is empty
- this.$('.oe_form_dropdown_section').each(function() {
- $(this).toggle(!!$(this).find('li').length);
+ this.$('.o_dropdown').each(function() {
+ if (!$(this).find('li').length) {
+ $(this).hide();
+ }
});
- self.$("[title]").tooltip({
+ this.$("[title]").tooltip({
delay: { show: 500, hide: 0}
});
+ this.$('.o_sidebar_add_attachment .o_form_binary_form').change(this.on_attachment_changed);
+ this.$('.o_sidebar_delete_attachment').click(this.on_attachment_delete);
},
/**
* For each item added to the section:
@@ -104,7 +107,6 @@ var Sidebar = Widget.extend({
items[i] = {
label: items[i]['name'],
action: items[i],
- classname: 'oe_sidebar_' + type
};
}
self.add_items(type=='print' ? 'print' : 'other', items);
@@ -184,16 +186,14 @@ var Sidebar = Widget.extend({
});
this.items.files = attachments;
this.redraw();
- this.$('.oe_sidebar_add_attachment .o_form_input_file').change(this.on_attachment_changed);
- this.$el.find('.oe_sidebar_delete_item').click(this.on_attachment_delete);
},
on_attachment_changed: function(e) {
var $e = $(e.target);
if ($e.val() !== '') {
- this.$el.find('form.o_form_binary_form').submit();
+ this.$('form.o_form_binary_form').submit();
$e.parent().find('input[type=file]').prop('disabled', true);
$e.parent().find('button').prop('disabled', true).find('img, span').toggle();
- this.$('.oe_sidebar_add_attachment a').text(_t('Uploading...'));
+ this.$('.o_sidebar_add_attachment a').text(_t('Uploading...'));
framework.blockUI();
}
},
@@ -202,11 +202,16 @@ var Sidebar = Widget.extend({
e.stopPropagation();
var self = this;
var $e = $(e.currentTarget);
- if (confirm(_t("Do you really want to delete this attachment ?"))) {
- (new data.DataSet(this, 'ir.attachment')).unlink([parseInt($e.attr('data-id'), 10)]).done(function() {
- self.do_attachement_update(self.dataset, self.model_id);
- });
- }
+ var options = {
+ confirm_callback: function () {
+ new data.DataSet(this, 'ir.attachment')
+ .unlink([parseInt($e.attr('data-id'), 10)])
+ .done(function() {
+ self.do_attachement_update(self.dataset, self.model_id);
+ });
+ }
+ };
+ Dialog.confirm(this, _t("Do you really want to delete this attachment ?"), options);
}
});
diff --git a/addons/web/static/src/js/widgets/switch_company_menu.js b/addons/web/static/src/js/widgets/switch_company_menu.js
index 2879a0a2b0d..89dc6ae29b3 100644
--- a/addons/web/static/src/js/widgets/switch_company_menu.js
+++ b/addons/web/static/src/js/widgets/switch_company_menu.js
@@ -1,45 +1,46 @@
odoo.define('web.SwitchCompanyMenu', function(require) {
- "use strict";
+"use strict";
- var Model = require('web.Model');
- var session = require('web.session');
- var SystrayMenu = require('web.SystrayMenu');
- var Widget = require('web.Widget');
-
- var SwitchCompanyMenu = Widget.extend({
- template: 'SwitchCompanyMenu',
- willStart: function() {
- if (!session.user_companies) {
- return $.Deferred().reject();
- }
- return this._super();
- },
- start: function() {
- var self = this;
- this.$el.on('click', '.dropdown-menu li a[data-menu]', _.debounce(function(ev) {
- ev.preventDefault();
- var company_id = $(ev.currentTarget).data('company-id');
- new Model('res.users').call('write', [[session.uid], {'company_id': company_id}]).then(function() {
- location.reload();
- });
- }, 1500, true));
-
- self.$('.oe_topbar_name').text(session.user_companies.current_company[1]);
+var Model = require('web.Model');
+var session = require('web.session');
+var SystrayMenu = require('web.SystrayMenu');
+var Widget = require('web.Widget');
- var companies_list = '';
- _.each(session.user_companies.allowed_companies, function(company) {
- var a = '';
- if(company[0] == session.user_companies.current_company[0]) {
- a = '<i class="fa fa-check o_current_company"></i>';
- } else {
- a = '<span class="o_company"/>';
- }
- companies_list += '<li><a href="#" data-menu="company" data-company-id="' + company[0] + '">' + a + company[1] + '</a></li>';
+var SwitchCompanyMenu = Widget.extend({
+ template: 'SwitchCompanyMenu',
+ willStart: function() {
+ if (!session.user_companies) {
+ return $.Deferred().reject();
+ }
+ return this._super();
+ },
+ start: function() {
+ var self = this;
+ this.$el.on('click', '.dropdown-menu li a[data-menu]', _.debounce(function(ev) {
+ ev.preventDefault();
+ var company_id = $(ev.currentTarget).data('company-id');
+ new Model('res.users').call('write', [[session.uid], {'company_id': company_id}]).then(function() {
+ location.reload();
});
- self.$('.dropdown-menu').html(companies_list);
- return this._super();
- },
- });
+ }, 1500, true));
+
+ self.$('.oe_topbar_name').text(session.user_companies.current_company[1]);
+
+ var companies_list = '';
+ _.each(session.user_companies.allowed_companies, function(company) {
+ var a = '';
+ if (company[0] === session.user_companies.current_company[0]) {
+ a = '<i class="fa fa-check o_current_company"></i>';
+ } else {
+ a = '<span class="o_company"/>';
+ }
+ companies_list += '<li><a href="#" data-menu="company" data-company-id="' + company[0] + '">' + a + company[1] + '</a></li>';
+ });
+ self.$('.dropdown-menu').html(companies_list);
+ return this._super();
+ },
+});
+
+SystrayMenu.Items.push(SwitchCompanyMenu);
- SystrayMenu.Items.push(SwitchCompanyMenu);
});
diff --git a/addons/web/static/src/js/widgets/user_menu.js b/addons/web/static/src/js/widgets/user_menu.js
index 31728dfa813..edeb059790a 100644
--- a/addons/web/static/src/js/widgets/user_menu.js
+++ b/addons/web/static/src/js/widgets/user_menu.js
@@ -4,7 +4,7 @@ odoo.define('web.UserMenu', function (require) {
var core = require('web.core');
var Dialog = require('web.Dialog');
var framework = require('web.framework');
-var Model = require('web.DataModel');
+var Model = require('web.Model');
var session = require('web.session');
var Widget = require('web.Widget');
@@ -13,10 +13,6 @@ var QWeb = core.qweb;
var UserMenu = Widget.extend({
template: "UserMenu",
- init: function(parent) {
- this._super(parent);
- this.update_promise = $.Deferred().resolve();
- },
start: function() {
var self = this;
this.$el.on('click', '.dropdown-menu li a[data-menu]', function(ev) {
@@ -26,32 +22,28 @@ var UserMenu = Widget.extend({
f($(this));
}
});
- this.$el.parent().show();
- return this._super.apply(this, arguments);
+ return this._super.apply(this, arguments).then(function () {
+ return self.do_update();
+ });
},
do_update: function () {
var self = this;
- var fct = function() {
- var $avatar = self.$el.find('.oe_topbar_avatar');
- $avatar.attr('src', $avatar.data('default-src'));
- if (!session.uid)
- return;
- var func = new Model("res.users").get_func("read");
- return self.alive(func(session.uid, ["name"])).then(function(res) {
- var topbar_name = res.name;
- if(session.debug)
- topbar_name = _.str.sprintf("%s (%s)", topbar_name, session.db);
- self.$el.find('.oe_topbar_name').text(topbar_name);
- if (!session.debug) {
- topbar_name = _.str.sprintf("%s (%s)", topbar_name, session.db);
- }
- var avatar_src = session.url('/web/image', {model:'res.users', field: 'image_small', id: session.uid});
- $avatar.attr('src', avatar_src);
+ var $avatar = self.$('.oe_topbar_avatar');
+ $avatar.attr('src', $avatar.data('default-src'));
+ if (!session.uid) {
+ return $.when();
+ }
+ var func = new Model("res.users").get_func("read");
+ return self.alive(func(session.uid, ["name"])).then(function(res) {
+ var topbar_name = res.name;
+ if(session.debug) {
+ topbar_name = _.str.sprintf("%s (%s)", topbar_name, session.db);
+ }
+ self.$('.oe_topbar_name').text(topbar_name);
- core.bus.trigger('resize'); // Re-trigger the reflow logic
- });
- };
- this.update_promise = this.update_promise.then(fct, fct);
+ var avatar_src = session.url('/web/image', {model:'res.users', field: 'image_small', id: session.uid});
+ $avatar.attr('src', avatar_src);
+ });
},
on_menu_documentation: function () {
window.open('https://www.odoo.com/documentation/user', '_blank');
@@ -83,36 +75,42 @@ var UserMenu = Widget.extend({
},
on_menu_settings: function() {
var self = this;
- this.getParent().clear_uncommitted_changes().then(function() {
- self.rpc("/web/action/load", { action_id: "base.action_res_users_my" }).done(function(result) {
- result.res_id = session.uid;
- self.getParent().action_manager.do_action(result);
- });
+ this.trigger_up('clear_uncommitted_changes', {
+ callback: function() {
+ self.rpc("/web/action/load", { action_id: "base.action_res_users_my" }).done(function(result) {
+ result.res_id = session.uid;
+ self.do_action(result);
+ });
+ },
});
},
on_menu_account: function() {
- this.getParent().clear_uncommitted_changes().then(function() {
- var P = new Model('ir.config_parameter');
- P.call('get_param', ['database.uuid']).then(function(dbuuid) {
- var state = {
- 'd': session.db,
- 'u': window.location.protocol + '//' + window.location.host,
- };
- var params = {
- response_type: 'token',
- client_id: dbuuid || '',
- state: JSON.stringify(state),
- scope: 'userinfo',
- };
- framework.redirect('https://accounts.odoo.com/oauth2/auth?'+$.param(params));
- }).fail(function(result, ev){
- ev.preventDefault();
- framework.redirect('https://accounts.odoo.com/account');
- });
+ this.trigger_up('clear_uncommitted_changes', {
+ callback: function() {
+ var P = new Model('ir.config_parameter');
+ P.call('get_param', ['database.uuid']).then(function(dbuuid) {
+ var state = {
+ 'd': session.db,
+ 'u': window.location.protocol + '//' + window.location.host,
+ };
+ var params = {
+ response_type: 'token',
+ client_id: dbuuid || '',
+ state: JSON.stringify(state),
+ scope: 'userinfo',
+ };
+ framework.redirect('https://accounts.odoo.com/oauth2/auth?'+$.param(params));
+ }).fail(function(result, ev){
+ ev.preventDefault();
+ framework.redirect('https://accounts.odoo.com/account');
+ });
+ },
});
},
on_menu_logout: function() {
- this.trigger('user_logout');
+ this.trigger_up('clear_uncommitted_changes', {
+ callback: this.do_action.bind(this, 'logout'),
+ });
},
});
diff --git a/addons/web/static/src/less/bootstrap_overridden.less b/addons/web/static/src/less/bootstrap_overridden.less
new file mode 100644
index 00000000000..39df64ac86e
--- /dev/null
+++ b/addons/web/static/src/less/bootstrap_overridden.less
@@ -0,0 +1,103 @@
+// ------------------------------------------------------------------
+// Bootstrap variables
+// ------------------------------------------------------------------
+
+//== Grid
+@grid-gutter-width: @odoo-horizontal-padding*2;
+
+//== Colors
+@brand-primary: @odoo-brand-primary;
+
+//== Titles
+@font-size-h1: @odoo-font-size-base + 13px;
+@font-size-h2: @odoo-font-size-base + 7px;
+@font-size-h3: @odoo-font-size-base + 3px;
+@font-size-h4: @odoo-font-size-base + 2px;
+@font-size-h5: @odoo-font-size-base + 1px;
+@font-size-h6: @odoo-font-size-base;
+
+//== Scaffolding
+@body-bg: @odoo-brand-secondary;
+@text-color: @odoo-main-text-color;
+@link-color: @odoo-brand-optional;
+@link-hover-decoration: none;
+
+//== Typography
+@font-family-sans-serif: "Lucida Grande", Helvetica, Verdana, Arial, sans-serif;
+@font-size-base: @odoo-font-size-base;
+@headings-font-weight: bold;
+
+//== Components
+@component-active-bg: @gray-lighter;
+@component-active-color: @odoo-brand-optional;
+
+//== Badges
+@badge-bg: @odoo-brand-optional;
+@badge-color: white;
+@badge-line-height: @line-height-base;
+@badge-font-weight: normal;
+
+//== Breadcrumbs
+@breadcrumb-active-color: #777777;
+@breadcrumb-bg: @odoo-control-panel-background-color;
+@breadcrumb-color: #777777;
+@breadcrumb-padding-horizontal: 0;
+@breadcrumb-padding-vertical: 0;
+
+//== Buttons
+@btn-default-bg: white;
+@btn-default-border: #cccccc;
+@btn-default-color: @odoo-main-text-color;
+@btn-primary-bg: @odoo-brand-optional;
+@btn-primary-border: @odoo-brand-optional;
+@btn-primary-color: white;
+
+//== Modals
+@modal-sm: 300px;
+@modal-md: 650px;
+@modal-lg: 980px;
+@modal-inner-padding: @odoo-horizontal-padding;
+@modal-title-padding: @odoo-horizontal-padding;
+
+//== Navs
+@nav-link-padding: 10px 15px;
+@nav-pills-border-radius: 0;
+@nav-pills-active-link-hover-color: white;
+@nav-pills-active-link-hover-bg: @odoo-brand-optional;
+@nav-tabs-active-link-hover-bg: white;
+
+//== Navbar
+@navbar-height: @odoo-navbar-height - 2;
+@navbar-margin-bottom: 0;
+@navbar-inverse-bg: #222222;
+@navbar-inverse-link-color: #9d9d9d;
+@navbar-inverse-link-hover-bg: #222222;
+@navbar-inverse-toggle-hover-bg: #222222;
+@navbar-border-radius: 0;
+
+//== Tables
+@table-bg-accent: #efeff8; // FIXME: expose
+
+
+// ------------------------------------------------------------------
+// Bootstrap components rules (non exposed features variables)
+// ------------------------------------------------------------------
+
+//== Badges
+.badge {
+ margin: 1px 2px 1px 0;
+ padding-top: 0;
+ padding-bottom: 0;
+}
+
+//== Buttons
+.btn-icon {
+ .button-variant(@btn-default-color; @btn-default-bg; @btn-default-border);
+}
+
+//== Printing improvements
+@media print {
+ .table-responsive {
+ overflow-x: initial;
+ }
+}
diff --git a/addons/web/static/src/less/control_panel.less b/addons/web/static/src/less/control_panel.less
new file mode 100644
index 00000000000..e2635af43d4
--- /dev/null
+++ b/addons/web/static/src/less/control_panel.less
@@ -0,0 +1,74 @@
+.o_control_panel {
+ .o-webclient-padding(@top: 10px, @bottom: 10px);
+ background-color: @odoo-control-panel-background-color;
+ border-bottom: 1px solid @odoo-main-color-muted;
+ .breadcrumb {
+ font-size: 18px;
+ margin: 0px;
+ > li > a {
+ color: @odoo-brand-optional;
+ cursor: pointer;
+ &:hover {
+ color: darken(@odoo-brand-optional, 10%);
+ text-decoration: none;
+ }
+ }
+ }
+
+ // Sidebar
+ .o_cp_sidebar {
+ padding-right: 10px;
+
+ .o_hidden_input_file {
+ position: relative;
+ input.o_form_input_file {
+ position: absolute;
+ top: 1px;
+ opacity: 0;
+ width: 100%;
+ height: 26px;
+ }
+ .o_form_binary_form span {
+ padding: 3px 25px;
+ color: @btn-default-color;
+ }
+ .o_form_binary_form:hover {
+ background-color: @table-bg-hover;
+ }
+ }
+ .o_sidebar_delete_attachment {
+ padding: 0px;
+ position: absolute;
+ top: 5px;
+ right: 10px;
+ }
+ }
+
+ // Pager
+ .o_cp_pager {
+ text-align: center;
+ padding-left: 5px;
+ .user-select(none);
+ }
+
+ // View Switcher
+ .o_cp_switch_buttons {
+ padding-left: 5px;
+ }
+}
+
+.o_x2m_control_panel {
+ .o_cp_buttons > div {
+ margin-top: 5px;
+ }
+}
+
+// Pager input (to edit pager values)
+.o_pager_value > input {
+ display: inline-block;
+ width: 60px;
+ text-align: right;
+ &:focus {
+ outline: none;
+ }
+}
diff --git a/addons/web/static/src/less/control_panel_layout.less b/addons/web/static/src/less/control_panel_layout.less
new file mode 100644
index 00000000000..92f8397bca4
--- /dev/null
+++ b/addons/web/static/src/less/control_panel_layout.less
@@ -0,0 +1,70 @@
+@breadcrumb-height: 30px;
+
+.o_control_panel {
+ .o-flex-display();
+ .o-flex-flow(row, wrap);
+
+ .breadcrumb {
+ width: 50%;
+
+ > li {
+ .o_text_overflow;
+ max-width: 90%;
+ display: inline-block;
+ }
+ }
+
+ &.o_breadcrumb_full {
+ .breadcrumb {
+ width: 100%;
+ }
+ }
+
+ .o_cp_searchview {
+ width: 50%;
+ min-height: @breadcrumb-height;
+ }
+
+ .btn.o_enable_searchview {
+ width: 10%;
+ margin-left: 2%;
+ padding: 0px;
+ }
+
+ .o_cp_left {
+ width: 50%;
+ margin-top: 5px;
+ .o-flex-display();
+ .o-justify-content(space-between);
+ }
+
+ .o_cp_right {
+ width: 50%;
+ margin-top: 5px;
+ .o-flex-display();
+
+ .o_cp_pager {
+ margin: auto 0 auto auto;
+ }
+ }
+}
+
+.o_x2m_control_panel {
+ .o-flex-display();
+ .o-flex-flow(row, wrap);
+
+ .o_cp_buttons {
+ .o-flex-display();
+ margin-right: auto;
+ }
+ .o_cp_pager {
+ .o-flex-display();
+ margin-left: auto;
+ }
+}
+
+@media print {
+ .o_control_panel {
+ display: none;
+ }
+}
diff --git a/addons/web/static/src/less/data_export.less b/addons/web/static/src/less/data_export.less
new file mode 100644
index 00000000000..3f596bea27d
--- /dev/null
+++ b/addons/web/static/src/less/data_export.less
@@ -0,0 +1,107 @@
+.o_web_client .o_export {
+
+ .o-flex(0, 1, 1000px);
+ .o-flex-display();
+ .o-flex-flow(column, nowrap);
+
+ > p, > .row {
+ .o-flex(0, 0, auto);
+ }
+
+ label {
+ vertical-align: top;
+ font-weight: normal;
+ }
+
+ .o_import_compat, .o_export_format {
+ display: inline-block;
+
+ > div {
+ margin-left: 5px;
+ .o-inline-flex-display();
+ .o-align-items(center);
+
+ > label, > input {
+ margin: 0 0 0 5px;
+ }
+ }
+ }
+
+ .o_export_panel {
+ .o-flex(1, 0, 0);
+ position: relative;
+
+ > div {
+ height: 100%;
+ .o-flex-display();
+ .o-flex-flow(column, nowrap);
+ .o-justify-content(center);
+
+ &.o_left_panel { // Needed because of chrome
+ .o-position-absolute(@top: 0, @bottom: 0, @left: 0, @right: 57%);
+ }
+ &.o_center_panel { // Needed because of chrome
+ .o-position-absolute(@top: 0, @bottom: 0, @left: 43%, @right: 43%);
+ }
+ &.o_right_panel { // Needed because of chrome
+ .o-position-absolute(@top: 0, @bottom: 0, @left: 57%, @right: 0);
+ }
+
+ > h4, > div {
+ .o-flex(0, 0, auto);
+ }
+
+ > button {
+ .o-flex(0, 0, auto);
+ margin-top: 10px;
+ }
+
+ .o_left_field_panel, .o_fields_list {
+ border: 1px solid @odoo-brand-lightsecondary;
+ overflow: auto;
+ .o-flex(1, 0, 0);
+ }
+
+ .o_export_tree_item {
+ cursor: pointer;
+ position: relative;
+ padding-left: 20px;
+ .user-select(none);
+
+ &.o_selected > .o_tree_column {
+ background-color: @odoo-brand-primary;
+ color: white;
+ }
+
+ .o_expand_parent {
+ .o-position-absolute(@top: 4px, @left: 5px);
+ }
+ .o_tree_column {
+ display: block;
+
+ &.o_required {
+ border-bottom: 2px solid @odoo-main-text-color;
+ }
+ }
+
+ &:focus {
+ outline: none;
+ }
+ }
+
+ .o_save_list, .o_exported_lists {
+ .o-flex-display();
+ .o-align-items(baseline);
+
+ > label, > button {
+ margin: 0 0 5px;
+ .o-flex(0, 0, auto);
+ }
+ > input, > select {
+ width: 0;
+ .o-flex(1, 0, auto);
+ }
+ }
+ }
+ }
+}
diff --git a/addons/web/static/src/less/datepicker.less b/addons/web/static/src/less/datepicker.less
new file mode 100644
index 00000000000..271cd357d15
--- /dev/null
+++ b/addons/web/static/src/less/datepicker.less
@@ -0,0 +1,59 @@
+@odoo-datepicker-week-color: #8f8f8f;
+@odoo-datepicker-week-bg-color: lighten(@odoo-datepicker-week-color, 30%);
+
+.o_datepicker {
+ position: relative;
+
+ .o_datepicker_input {
+ width: 100%;
+ }
+
+ .o_datepicker_button {
+ .o-position-absolute(2px, 4px);
+ cursor: pointer;
+ &:after {
+ .o-caret-down;
+ }
+ }
+}
+
+.datepicker {
+ .table-condensed {
+ > thead {
+ color: white;
+ background-color: @odoo-brand-primary;
+
+ > tr {
+ &:first-child {
+ th:hover {
+ color: white;
+ background-color: darken(@odoo-brand-primary, 10%);
+ }
+ }
+
+ &:last-child {
+ color: @odoo-datepicker-week-color;
+ background-color: @odoo-datepicker-week-bg-color;
+ }
+ > th {
+ border-radius: 0;
+ }
+ }
+ }
+
+ > tbody {
+ > tr {
+ > td {
+ &.active, .active {
+ background-color: @odoo-brand-optional;
+ border-radius: 100px;
+ }
+
+ &.today:before {
+ border-bottom-color: @odoo-brand-optional;
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/addons/web/static/src/less/debug_manager.less b/addons/web/static/src/less/debug_manager.less
new file mode 100644
index 00000000000..74d20dda43a
--- /dev/null
+++ b/addons/web/static/src/less/debug_manager.less
@@ -0,0 +1,8 @@
+.modal {
+ .o_debug_manager {
+ position: relative;
+ list-style: none;
+ margin: 2px 10px 2px 0;
+ float: left;
+ }
+}
diff --git a/addons/web/static/src/less/dropdown.less b/addons/web/static/src/less/dropdown.less
new file mode 100644
index 00000000000..5cc6ddbe759
--- /dev/null
+++ b/addons/web/static/src/less/dropdown.less
@@ -0,0 +1,79 @@
+.li-a-padding {
+ padding: 3px @odoo-dropdown-hpadding;
+}
+
+.ui-autocomplete { // Copy style of bootstrap dropdown
+ background-image: none;
+ background-color: @dropdown-bg;
+ border: 1px solid @dropdown-border;
+ font-family: @font-family-serif;
+ font-size: @font-size-base;
+ padding: 5px 0px;
+ box-shadow: 0px 6px 12px rgba(0, 0, 0, 0.176);
+
+ .ui-menu-item {
+ padding: 0;
+ > a {
+ display: block;
+ color: @dropdown-link-color;
+
+ .li-a-padding
+ }
+
+ &.ui-state-focus {
+ background-image: none;
+ background-color: @odoo-brand-primary;
+ border: none;
+ font-weight: normal;
+ margin: 0;
+ }
+ &.o_m2o_dropdown_option {
+ padding-left: 20px;
+ > a {
+ color: @odoo-brand-primary;
+ }
+ }
+ }
+}
+
+.dropdown-menu {
+ .o_inline_dropdown {
+ position: relative;
+
+ &> .dropdown-menu {
+ top: 0;
+ left: 100%;
+ }
+ &:hover > .dropdown-menu {
+ display: block;
+ }
+ }
+}
+
+.dropdown-menu-mixin {
+ .open .dropdown-menu > li {
+ position: relative; // to allow absolute positionning inside the li
+ > a {
+ &:focus, &:active, &:focus:active {
+ outline: none;
+ }
+
+ .li-a-padding;
+ }
+
+ &.dropdown-header {
+ .li-a-padding;
+ color: @odoo-main-text-color;
+
+ @media (max-width: @screen-xs-max) {
+ color: white;
+ text-decoration: underline;
+ }
+ }
+ }
+}
+
+.dropdown-menu-mixin();
+.navbar-nav {
+ .dropdown-menu-mixin();
+}
diff --git a/addons/web/static/src/less/dropdown_extra.less b/addons/web/static/src/less/dropdown_extra.less
new file mode 100644
index 00000000000..ec38e6d5292
--- /dev/null
+++ b/addons/web/static/src/less/dropdown_extra.less
@@ -0,0 +1,63 @@
+.ui-autocomplete .ui-menu-item {
+ &.ui-state-focus {
+ background-color: @odoo-brand-primary;
+ }
+ &.o_m2o_dropdown_option > a {
+ color: @odoo-brand-primary;
+ }
+ &.ui-state-focus > a,
+ &.ui-state-focus.o_m2o_dropdown_option > a {
+ color: white;
+ }
+}
+
+@tag-border: #afafb6;
+.oe_dropdown, .oe_dropdown_toggle {
+ position: relative;
+ cursor: pointer;
+}
+.oe_dropdown_toggle {
+ color: #2B2B2B;
+ font-weight: normal;
+}
+.oe_dropdown_menu {
+ display: none;
+ position: absolute;
+ z-index: 3;
+ margin: 0;
+ border: 1px solid @tag-border;
+ background: white;
+ padding: 4px 0;
+ min-width: 140px;
+ text-align: left;
+ box-shadow: 0 1px 4px rgba(0,0,0,0.3);
+ &.oe_opened {
+ display: block;
+ }
+ > li {
+ list-style-type: none;
+ float: none;
+ display: block;
+ position: relative;
+ margin: 0;
+ padding: 2px 8px;
+ &:hover {
+ .o-vertical-gradient(#f0f0fa, #eeeef6);
+ box-shadow: none;
+ }
+ > a {
+ white-space: nowrap;
+ display: block;
+ color: #4c4c4c;
+ text-decoration: none;
+ &:hover {
+ text-decoration: none;
+ }
+ }
+ }
+}
+
+// Buttons used as dropdown toggler
+.o_dropdown_toggler_btn {
+ .btn-default;
+}
diff --git a/addons/web/static/src/less/enterprise_compatibility.less b/addons/web/static/src/less/enterprise_compatibility.less
deleted file mode 100644
index 71dc441abbd..00000000000
--- a/addons/web/static/src/less/enterprise_compatibility.less
+++ /dev/null
@@ -1,467 +0,0 @@
-// ------------------------------------------------------------------
-// Odoo
-// ------------------------------------------------------------------
-
-// This file is necessary to make the community edition of the Odoo web
-// client compatible with the enterprise edition.
-
-// The problem is that we have two web clients in parallel, and every
-// addons should behave properly with both.
-
-@brand-primary: @odoo-brand-primary;
-
-.oe-view-manager {
- background-color: @odoo-webclient-background-color !important;
-}
-
-.o_kanban_view {
- background-color: @odoo-webclient-background-color;
-
- .o_kanban_config i, .o_kanban_quick_add i {
- color: @odoo-main-text-color !important;
- &:hover {
- background-color: darken(@odoo-webclient-background-color, 10%) !important;
- }
- }
- .o_column_title, .o_kanban_title, .o_kanban_add_column, .o_column_unfold {
- color: @odoo-main-text-color !important;
- }
-
- .o_column_folded {
- background-color: darken(@odoo-webclient-background-color, 5%) !important;
- border-color: darken(@odoo-webclient-background-color, 10%) !important;
- }
-
- .o_column_quick_create {
- background-color: darken(@odoo-webclient-background-color, 10%) !important;
- }
-
- &.o_kanban_grouped .o_kanban_group .o_kanban_header {
- margin-bottom: 2px; // For the buttons not to overlap first record's box shaddow on hover
- }
-}
-
-.oe_list {
- background-color: white !important;
-}
-
-// Buttons and links
-@link-hover-decoration: none;
-.btn, .btn-group > .btn {
- &:hover, &:active, &:focus, &:active:focus {
- outline: none;
- }
-}
-.btn-icon {
- .btn-default;
-}
-.oe_button {
- .btn-default;
- &.oe_highlight, &.btn-primary {
- .btn-primary;
- }
- &.oe_link, &.btn-link {
- .btn-link;
- }
-}
-.oe_highlight {
- .btn-primary;
-}
-.oe_link {
- .btn-link;
-}
-
-.openerp .oe_avatar {
- float: left;
-}
-
-.openerp .oe_button_box {
- float: right;
-}
-
-
-// Pager input (to edit pager values)
-.o_pager_value > input {
- width: 60px;
- text-align: right;
- &:focus {
- outline: none;
- }
-}
-
-.oe_form_field_one2many, .oe_form_field_many2many {
- .oe-view-manager {
- background-color: white;
-
- .o_kanban_view {
- background-color: white;
-
- .o_kanban_record {
- box-shadow: none;
- }
- }
- }
-}
-
-// Buttons containing only an icon
-.o_icon_button {
- background-color: transparent;
- border: 0;
- padding: 0;
- outline: none;
-}
-
-// Stars
-.o_priority {
- display: inline-block;
- padding: 0;
- margin: 0;
- vertical-align: middle;
- > .o_priority_star {
- display: inline-block;
- font-size: 1.35em;
- &:hover, &:focus {
- text-decoration: none;
- outline: none;
- }
-
- + .o_priority_star {
- padding-left: 5px;
- }
-
- &.fa-star-o {
- color: @odoo-main-color-muted;
- }
- &.fa-star {
- color: gold;
- }
- }
-}
-
-.oe_title {
- .o_priority > .o_priority_star {
- font-size: inherit;
- }
-}
-
-.o_text_overflow {
- display: block;
- max-width: 100%;
- white-space: nowrap;
- overflow: hidden;
- text-overflow: ellipsis;
- vertical-align: top; // To update display context changed by overflow:hidden
-}
-
-.oe-x2m-control-panel {
- background-color: white;
-}
-
-div.o_checkbox {
- display: inline-block;
- vertical-align: sub;
- > input + span {
- display: none;
- }
-}
-
-.openerp .oe_formview {
- .oe_button_box {
- .oe_stat_button {
- text-align: left;
-
- .o_button_icon {
- width: 30%;
- display: inline-block;
- vertical-align: middle;
- }
-
- .o_stat_info { // contains the value and text
- display: inline-block;
- vertical-align: middle;
- max-width: 70%;
- line-height: 1.2;
-
- .o_stat_value {
- .o_text_overflow;
- font-weight: 700;
- color: @odoo-brand-primary;
- }
- .o_stat_text {
- .o_text_overflow;
- font-size: small;
-
- .o_stat_value {
- display: inline;
- }
- }
- }
-
- // Some buttons only display text and directly use the WidgetButton template instead of StatInfo
- > span {
- .o_stat_info; // layout
- font-size: small;
- white-space: normal; // text on several lines if needed
- }
- }
-
- &, & + .oe_avatar {
- + .oe_title {
- width: 400px;
- }
- }
- }
-
- .oe_avatar {
- > img {
- max-width: 90px;
- max-height: 90px;
- }
-
- + .oe_title {
- padding-left: 95px;
- }
- }
-
- .o_row {
- > * {
- width: auto!important; // oe_inline
- }
- > div {
- display: inline-block;
- + div {
- margin-left: 5px;
- }
- }
- }
-
- .oe_form label {
- font-size: 13px;
- }
-
- .oe_form_group .oe_form_group_cell:not(.oe_form_group_cell_label) label {
- font-weight: normal;
- }
-
- .o_form_field_many2manytags {
- .o-inline-flex-display();
- .o-flex-flow(row, wrap);
- .o-align-items(flex-start);
-
- .badge {
- cursor: pointer;
- .o-flex(0, 0, auto);
- margin: 0 3px 3px 0;
- color: #FFF;
- font-size: 12px;
- .o_delete {
- cursor: pointer;
- }
- > ul {
- @colored-tag-width: 45px;
- width: 5*@colored-tag-width + 3px;
- > li {
- float: left;
- color: black;
- > span {
- border-radius: 6px;
- width: @colored-tag-width;
- height: 30px;
- display: inline-block;
- border: 2px solid white;
- cursor: pointer;
- padding: 0;
-
- &:hover {
- opacity: 0.8;
- }
- }
- }
- > li:last-child {
- margin-top: 7px;
- cursor: auto;
- }
- }
- }
-
- padding: 0;
- > .oe_form_field_many2one {
- padding: 0;
- }
- }
-
- &.oe_form_editable .o_form_field_many2manytags {
- border: 1px solid #CCC;
- border-radius: 3px;
-
- &.o_form_field_empty {
- display: none;
- }
-
- > .oe_form_field {
- .o-flex(1, 0, 100px);
-
- input {
- border: none;
- }
- }
- }
-
- .o_address_format {
- width: 100%;
-
- > .oe_form_field {
- width: auto;
- display: block;
- }
-
- > .o_address_street, > .o_address_country {
- clear: left;
- width: 100%;
- }
- > .o_address_city, > .o_address_state, > .o_address_zip {
- float: left;
- margin-right: 2%;
- }
- > .o_address_zip {
- margin-right: 0;
- }
- &.o_zip_city {
- > .o_address_zip {
- margin-right: 2%;
- }
- > .o_address_city {
- margin-right: 0;
- }
- > .o_address_state {
- clear: left;
- margin-right: 0;
- }
- }
- &.o_city_state {
- > .o_address_state {
- margin-right: 0;
- }
- > .o_address_zip {
- clear: left;
- margin-right: 0;
- }
- }
- }
- &.oe_form_editable .o_address_format {
- > .o_address_city {
- width: 38%;
- }
- > .o_address_state {
- width: 33%;
- }
- > .o_address_zip {
- width: 25%;
- }
- &.o_zip_city {
- > .o_address_zip {
- width: 38%;
- }
- > .o_address_city {
- width: 60%;
- }
- > .o_address_state {
- width: 100%;
- }
- }
- &.o_city_state {
- > .o_address_city {
- width: 50%;
- }
- > .o_address_state {
- width: 48%;
- }
- > .o_address_zip {
- width: 100%;
- }
- }
- }
-}
-
-// Many2many tags
-.o_form_field_many2manytags {
- .o_tag_color_0 {
- background-color: #4D4D4D;
- }
- .o_tag_color_1 {
- background-color: #61BD4F;
- }
- .o_tag_color_2 {
- background-color: #F2D600;
- }
- .o_tag_color_3 {
- background-color: #FFAB4A;
- }
- .o_tag_color_4 {
- background-color: #EB5A46;
- }
- .o_tag_color_5 {
- background-color: #A24689;
- }
- .o_tag_color_6 {
- background-color: #0079BF;
- }
- .o_tag_color_7 {
- background-color: #00C2E0;
- }
- .o_tag_color_8 {
- background-color: #4CD98E;
- }
- .o_tag_color_9 {
- background-color: #FF80CE;
- }
- .o_tag_color_10 {
- background-color: #B6BBBF;
- }
-}
-
-// Search options dropdowns
-.o-search-options-dropdown-custom-li() {
- margin: 3px 25px;
- width: auto;
- max-width: 250px;
-
-}
-// Open and closed carets in dropdowns
-.o_closed_menu {
- position: relative;
- a:before {
- .o-caret-right;
- .o-position-absolute(@top: 50%, @left: 12px);
- margin-top: (-@caret-width-base);
- }
-}
-.o_open_menu {
- position: relative;
- a:before {
- .o-caret-down;
- .o-position-absolute(@top: 50%, @left: 9px);
- margin-top: (-@caret-width-base);
- }
-}
-
-// Favorites Menu -> Add to my dashboard
-.o_favorites_menu {
- .o_add_to_dashboard_input {
- .form-control();
- }
- .o_add_to_dashboard_button {
- .btn();
- .btn-default();
- }
-}
-
-// Because the `web_planner` module has to work with Odoo community and enterprise without
-// code duplication, fine-tune the display of it in the community webclient here
-#PlannerDialog {
- top: 35px;
- -webkit-box-shadow: 0 3px 9px #666666;
- box-shadow: 0 3px 9px #666666;
- padding-bottom: 44px;
-}
-
diff --git a/addons/web/static/src/less/fonts.less b/addons/web/static/src/less/fonts.less
new file mode 100644
index 00000000000..c6b19a2ba2f
--- /dev/null
+++ b/addons/web/static/src/less/fonts.less
@@ -0,0 +1,37 @@
+// ------------------------------------------------------------------
+// Lato
+// ------------------------------------------------------------------
+@lato-font-path: '../fonts/lato';
+
+.lato-font(@type, @weight, @style) {
+ @font-face {
+ font-family: 'Lato';
+ src: url('@{lato-font-path}/Lato-@{type}-webfont.eot');
+ src: url('@{lato-font-path}/Lato-@{type}-webfont.eot?#iefix') format('embedded-opentype'),
+ url('@{lato-font-path}/Lato-@{type}-webfont.woff') format('woff'),
+ url('@{lato-font-path}/Lato-@{type}-webfont.ttf') format('truetype'),
+ url('@{lato-font-path}/Lato-@{type}-webfont.svg#Lato') format('svg');
+ font-weight: @weight;
+ font-style: @style;
+ }
+
+ @font-face {
+ font-family: 'Lato-@{type}';
+ src: url('@{lato-font-path}/Lato-@{type}-webfont.eot');
+ src: url('@{lato-font-path}/Lato-@{type}-webfont.eot?#iefix') format('embedded-opentype'),
+ url('@{lato-font-path}/Lato-@{type}-webfont.woff') format('woff'),
+ url('@{lato-font-path}/Lato-@{type}-webfont.ttf') format('truetype'),
+ url('@{lato-font-path}/Lato-@{type}-webfont.svg#Roboto') format('svg');
+ }
+}
+
+.lato-font-pair(@type, @weight) {
+ .lato-font('@{type}', @weight, normal);
+ .lato-font('@{type}Ita', @weight, italic);
+}
+
+.lato-font-pair('Hai', 100);
+.lato-font-pair('Lig', 300);
+.lato-font-pair('Reg', 400);
+.lato-font-pair('Bol', 700);
+.lato-font-pair('Bla', 900);
diff --git a/addons/web/static/src/less/form_view.less b/addons/web/static/src/less/form_view.less
new file mode 100644
index 00000000000..d534976ee1c
--- /dev/null
+++ b/addons/web/static/src/less/form_view.less
@@ -0,0 +1,468 @@
+.o_form_view {
+ background-color: @odoo-view-background-color;
+
+ // Utility classes (+ oe_edit_only, oe_read_only, o_label_nowrap, o_text_overflow)
+ .o_form_invisible, .o_form_field_empty {
+ display: none!important;
+ }
+ .oe_form_box_info {
+ .bg-info;
+ .o-webclient-padding(@top: 5px, @bottom: 5px);
+ > p {
+ margin: auto;
+ }
+ }
+ .oe_text_center {
+ text-align: center;
+ }
+ .oe_link {
+ .btn-link;
+ }
+ .oe_grey {
+ opacity: 0.5;
+ }
+
+ // Readonly specific rules
+ &.o_form_readonly {
+ .oe_edit_only {
+ .o_form_invisible;
+ }
+
+ .o_form_uri { // FIXME maybe global?
+ display: inline-block;
+
+ color: @odoo-main-text-color;
+ &:first-line {
+ color: @link-color;
+ }
+ &:hover {
+ color: darken(@odoo-main-text-color, 1%); // hack required on chrome
+ &:first-line {
+ color: darken(@link-color, 15%);
+ }
+ }
+ }
+ }
+
+ // Editable specific rules
+ &.o_form_editable {
+ .oe_read_only {
+ .o_form_invisible;
+ }
+
+ .o_form_field_many2manytags {
+ .o-input();
+
+ > .o_form_field {
+ .o-flex(1, 0, 100px);
+ max-width: 100%;
+
+ > .o_form_input_dropdown > .o_form_input {
+ border-style: none!important;
+ }
+ }
+ }
+
+ .o_form_field_monetary {
+ .o-input();
+ .o-align-items(baseline);
+
+ > .o_form_input {
+ border-style: none!important;
+ width: 100px;
+ .o-flex(1, 0, auto);
+ }
+ }
+ }
+
+ // Button box
+ .oe_button_box {
+ .oe_stat_button {
+ &:not(:hover) .o_stat_info > .o_hover {
+ display: none !important;
+ }
+ &:hover .o_stat_info > .o_not_hover {
+ display: none !important
+ }
+ }
+ }
+
+ // Title
+ .oe_title {
+ .o_priority > .o_priority_star {
+ font-size: inherit;
+ }
+ }
+
+ // Groups
+ .o_group {
+ &.o_label_nowrap {
+ .o_form_label {
+ white-space: nowrap;
+ }
+ }
+
+ .o_form_label {
+ font-weight: normal;
+ }
+ .o_td_label .o_form_label {
+ font-weight: bold;
+ margin-right: 0px;
+ }
+ }
+ &.oe_form_configuration {
+ .o_group .o_form_label {
+ white-space: nowrap;
+ }
+ }
+
+ // Separators
+ .o_horizontal_separator {
+ font-size: @font-size-h2;
+ margin: @odoo-form-spacing-unit 0;
+ &:empty {
+ height: @odoo-form-spacing-unit * 2;
+ }
+ }
+
+ // Labels
+ .o_form_label {
+ font-size: @font-size-base; // The label muse have the same size whatever their position
+ line-height: @line-height-base;
+ margin-right: @odoo-form-spacing-unit;
+ &.o_form_invalid {
+ color: @brand-danger;
+ }
+ }
+
+ // Tags
+ .o_form_field_many2manytags {
+ .badge {
+ cursor: pointer;
+ color: white;
+ font-size: 12px;
+ border: 0;
+
+ > ul {
+ @colored-tag-width: 45px;
+ width: 5*@colored-tag-width + 3px;
+ > li {
+ float: left;
+ color: black;
+ > span {
+ border-radius: 6px;
+ width: @colored-tag-width;
+ height: 30px;
+ display: inline-block;
+ border: 2px solid white;
+ cursor: pointer;
+ padding: 0;
+
+ &:hover {
+ opacity: 0.8;
+ }
+ }
+ }
+ > li:last-child {
+ margin-top: 7px;
+ cursor: auto;
+ }
+ }
+ }
+ }
+
+ .o_form_invalid {
+ &.o_form_input, .o_form_input, &.o_form_textarea, .o_form_textarea {
+ border-color: @brand-danger;
+ }
+ }
+
+ // Boolean
+ .o_form_field_boolean {
+ margin: 0 @odoo-form-spacing-unit 0 0;
+ }
+
+ // Numbers
+ .o_form_field_number {
+ white-space: nowrap;
+ }
+
+ // Radio buttons
+ .o_form_field_radio .o_form_radio {
+ outline: none;
+ }
+
+ // Translate icon
+ .o_field_translate {
+ padding: 0;
+ display: none;
+ cursor: pointer;
+ width: 12px;
+ vertical-align: top;
+ &::before { // seems to be useful for some old browser
+ position: relative;
+ }
+ &.o_translate_active {
+ display: inline-block;
+ }
+ }
+
+ // Dropdowns input (many2one, ...)
+ .o_form_input_dropdown {
+ .o-flex(1, 0, auto);
+ position: relative;
+
+ > input {
+ padding-right: 15px;
+ cursor: pointer;
+ }
+
+ .o_dropdown_button {
+ pointer-events: none;
+ &:after {
+ .o-caret-down;
+ }
+ }
+ }
+
+ // Many2many tags
+ .badge .o_delete {
+ cursor: pointer;
+ }
+
+ // Image
+ .o_form_field_image {
+ position: relative;
+
+ .o_form_image_controls {
+ .o-position-absolute(0, 0);
+ width: 100%;
+
+ color: white;
+ background-color: @odoo-brand-optional;
+ opacity: 0;
+ transition: opacity ease 400ms;
+
+ > .fa {
+ margin: 5px;
+ cursor: pointer;
+ }
+ }
+
+ &:hover .o_form_image_controls {
+ opacity: 0.8;
+ }
+ }
+
+ // Input loading/file
+ .o_form_binary_progress, .o_hidden_input_file .o_form_input_file {
+ display: none;
+ }
+
+ // Timezone widget warning
+ .o_tz_warning {
+ color: @brand-danger;
+ cursor: pointer;
+ }
+
+ // One2Many Kanban views
+ .o_form_field .o_kanban_view.o_kanban_ungrouped {
+ padding: 0;
+ .o_kanban_record {
+ box-shadow: none;
+ }
+ }
+
+ // One2Many List views
+ .o_form_field .o_list_view {
+ margin-bottom: 10px;
+
+ > tfoot > tr > td {
+ padding: 3px;
+ color: @odoo-main-text-color;
+ }
+ }
+ &.o_form_readonly .o_form_field .o_list_view .o_row_handle {
+ display: none; // Hide the handler in non-edit mode
+ }
+
+ // Percent pie field
+ .o_form_field_percent_pie {
+ .o_pie {
+ position: relative;
+ border-radius: 100%;
+ overflow: hidden;
+ background-color: @odoo-brand-optional;
+
+ &:after { // Outside pie border to go over border-radius irregularities
+ content: " ";
+ .o-position-absolute(0, 0);
+ width: 100%;
+ height: 100%;
+ border-radius: 100%;
+ }
+
+ .o_mask {
+ .o-position-absolute(0, 0);
+ .o-transform-origin(0);
+ width: 50%;
+ height: 100%;
+ background-color: @odoo-view-background-color;
+ &.o_full {
+ background-color: inherit;
+ }
+ }
+
+ .o_pie_value {
+ .o-flex-display();
+ .o-justify-content(center);
+ .o-align-items(center);
+
+ border-radius: 100%;
+
+ font-weight: 700;
+ color: @odoo-brand-primary;
+ }
+ }
+ }
+
+ // Attachments
+ .oe_attachment {
+ display: inline-block;
+ border: 1px solid @odoo-brand-lightsecondary;
+ margin: 0 @odoo-form-spacing-unit @odoo-form-spacing-unit 0;
+ padding: @odoo-form-spacing-unit;
+ }
+
+ // Specific style classes
+ .o_group.o_inner_group.oe_subtotal_footer {
+ > tbody > tr > td {
+ padding: 0;
+
+ &.o_td_label {
+ text-align: right;
+ }
+
+ .o_form_label {
+ padding-right: 20px;
+
+ min-width: 0;
+ white-space: nowrap;
+ &:after {
+ content: ":";
+ }
+ }
+
+ .o_form_field {
+ text-align: right;
+ width: 100%;
+ }
+ }
+
+ .oe_subtotal_footer_separator {
+ width: 100%;
+ text-align: right;
+ border-top: 1px solid @odoo-brand-secondary;
+ font-weight: bold;
+ font-size: 1.3em;
+ }
+ }
+
+ .o_address_format {
+ width: 100%;
+ .o_address_street, .o_address_country {
+ .o-flex-display;
+ }
+
+ .o_address_city {
+ margin-right: 2%;
+ }
+ .o_address_state {
+ margin-right: 2%;
+ }
+ &.o_zip_city {
+ .o_address_zip {
+ margin-right: 2%;
+ }
+ .o_address_city {
+ margin-right: 0;
+ }
+ .o_address_state {
+ display: block;
+ margin-right: 0;
+ }
+ }
+ &.o_city_state {
+ .o_address_state {
+ margin-right: 0;
+ }
+ .o_address_zip {
+ display: block;
+ margin-right: 0;
+ }
+ }
+ > span.o_form_field {
+ width: auto;
+ }
+ }
+ &.o_form_editable .o_address_format {
+ input.o_address_city {
+ width: 38%;
+ }
+ div.o_address_state {
+ width: 33%;
+ }
+ input.o_address_zip {
+ width: 25%;
+ }
+ &.o_zip_city {
+ .o_address_zip {
+ width: 38%;
+ }
+ .o_address_city {
+ width: 60%;
+ }
+ .o_address_state {
+ width: 100%;
+ }
+ }
+ &.o_city_state {
+ .o_address_city {
+ width: 50%;
+ }
+ .o_address_state {
+ width: 48%;
+ }
+ .o_address_zip {
+ width: 100%;
+ }
+ }
+ }
+}
+
+// Overriden style when form view in modal
+.modal .modal-dialog {
+ .o_form_view {
+ .o_form_sheet {
+ box-shadow: none;
+ width: 100%;
+ margin: 0 auto;
+ max-width: none;
+ }
+ }
+
+ .o_form_invisible {
+ display: none!important;
+ }
+}
+
+// FIXME bootstrap modal : 1050
+.ui-autocomplete {
+ z-index: 1051;
+}
+
+// Buttons in ControlPanel
+.o_control_panel .o_form_buttons_view > button:first-child {
+ float: left; // Unfortunately needed for the bounce effect
+ margin-right: 4px;
+}
diff --git a/addons/web/static/src/less/form_view_extra.less b/addons/web/static/src/less/form_view_extra.less
new file mode 100644
index 00000000000..300724e2819
--- /dev/null
+++ b/addons/web/static/src/less/form_view_extra.less
@@ -0,0 +1,265 @@
+.o_form_view {
+ .o_form_sheet_bg {
+ background: url(/web/static/src/img/form_sheetbg.png);
+ border-bottom: 1px solid #ddd;
+ .o_form_sheet {
+ border: 1px solid #c8c8d3;
+ box-shadow: 0 4px 20px rgba(0,0,0,0.15);
+ }
+ }
+
+ // Header containing status/workflow buttons
+ > header {
+ border-bottom: 1px solid #cacaca;
+ .o-vertical-gradient(#fcfcfc, #dedede);
+ > button:not(.btn-primary):not(.btn-link):not(.oe_highlight) {
+ .btn-default;
+ }
+ }
+ &.o_form_nosheet > header {
+ margin: -16px -16px 0 -16px;
+ }
+ ul.oe_form_status, ul.oe_form_status_clickable {
+ display: inline-block;
+ margin: 0;
+ padding: 0 18px 0 0;
+ li {
+ display: inline-block;
+ list-style-type: none;
+ // It is probably a bad idea to modify this margin
+ margin: 0 -18px 0 0;
+ padding: 0;
+ height: 30px;
+ .o-vertical-gradient(#fcfcfc, #dedede);
+ &:first-child > .label {
+ border-left: 1px solid #cacaca;
+ padding-left: 14px;
+ }
+ &:last-child {
+ border-right: 1px solid #cacaca;
+ > .label {
+ padding-right: 14px;
+ }
+ > .arrow {
+ display: none;
+ }
+ }
+ > .label {
+ color: #4c4c4c;
+ text-shadow: 0 1px 1px #fcfcfc, 0 -1px 1px #dedede;
+ padding: 7px;
+ display: inline-block;
+ padding-left: 24px;
+ margin: 0;
+ position: relative;
+ // Customize for statusbar label
+ line-height: normal;
+ font-size: 100%;
+ font-weight: normal;
+ // End of customize
+ }
+ > .arrow {
+ width: 17px;
+ height: 30px;
+ display: inline-block;
+ vertical-align: top;
+ overflow: hidden;
+ margin-left: -5px;
+ span {
+ position: relative;
+ width: 24px;
+ height: 24px;
+ display: inline-block;
+ margin-left: -12px;
+ margin-top: 3px;
+ border-radius: 3px;
+ box-shadow: -1px 1px 2px rgba(255,255,255,0.2), inset -1px 1px 1px rgba(0,0,0,0.2);
+ .o-skew-gradient(#fcfcfc, #dedede);
+ .o-transform(rotate(45deg));
+ }
+ }
+ }
+ ul.oe_dropdown_menu {
+ display: none;
+ padding: 0;
+ min-width: 0;
+ &.oe_opened {
+ display: block;
+ }
+ li {
+ margin: 0;
+ width: 100%;
+ span.label {
+ padding-left: 14px;
+ }
+ }
+ }
+ li.oe_active {
+ .o-vertical-gradient(lighten(@odoo-brand-primary, 15%), darken(@odoo-brand-primary, 15%));
+ > .arrow span {
+ .o-skew-gradient(lighten(@odoo-brand-primary, 15%), darken(@odoo-brand-primary, 15%));
+ }
+ > .label {
+ color: white;
+ text-shadow: 0 1px 1px #729fcf, 0 -1px 1px #3465a4;
+ }
+ }
+ }
+ ul.oe_form_status_clickable {
+ li {
+ cursor: pointer;
+ &:hover {
+ .o-vertical-gradient(darken(#fcfcfc, 8%), darken(#dedede, 8%));
+ > .label {
+ text-shadow: 0 -1px 1px #fcfcfc, 0 1px 1px #dedede;
+ }
+ > .arrow span {
+ .o-vertical-gradient(darken(#fcfcfc, 8%), darken(#dedede, 8%));
+ }
+ }
+ > .label {
+ color: @link-color;
+ }
+ }
+ li.oe_active {
+ &:hover {
+ .o-vertical-gradient(@odoo-brand-primary, darken(@odoo-brand-primary, 30%));
+ > .label {
+ text-shadow: 0 -1px 1px #729fcf, 0 1px 1px #3465a4;
+ }
+ > .arrow span {
+ .o-skew-gradient(@odoo-brand-primary, darken(@odoo-brand-primary, 30%));
+ }
+ }
+ }
+ }
+
+ // Button box
+ .oe_button_box {
+ .oe_stat_button {
+ border-radius: 0;
+ border-color: #ccc;
+ background: white;
+ outline: none;
+ &:hover {
+ background-color: #e6e6e6;
+ }
+ .o_button_icon {
+ color: #7C7BAD;
+ font-size: 24px;
+ }
+
+ .o_stat_info { // contains the value and text
+ .o_stat_value {
+ .o-text-overflow(block);
+ font-weight: 700;
+ color: @odoo-brand-primary;
+ }
+ .o_stat_text {
+ .o-text-overflow(block);
+ font-size: small;
+
+ .o_stat_value {
+ display: inline;
+ }
+ }
+ }
+
+ // Some buttons only display text and directly use the WidgetButton template instead of StatInfo
+ > span {
+ font-size: small;
+ white-space: normal; // text on several lines if needed
+ }
+ }
+ }
+
+ // Avatar
+ .oe_avatar > img {
+ box-shadow: 0 1px 4px rgba(0, 0, 0, 0.4);
+ border: none;
+ }
+
+ // Groups
+ .o_group {
+ .o_td_label {
+ border-right: 1px solid #ddd;
+ }
+ }
+
+ // All required form fields
+ .o_form_required {
+ &.o_form_input, .o_form_input, &.o_form_textarea, .o_form_textarea {
+ background-color: #D2D2FF;
+ }
+ }
+
+ .o_form_field.o_form_field_many2one .o_external_button {
+ padding: 0;
+ margin-left: 2px;
+ font-size: 19px;
+ color: #7C7BAD;
+ border: none;
+ &:hover {
+ background-color: transparent;
+ }
+ }
+
+ // Dropdowns input carret
+ .o_form_input_dropdown .o_dropdown_button {
+ .o-position-absolute(2px, 4px);
+ }
+
+ // Separators
+ .o_horizontal_separator {
+ color: @odoo-brand-optional;
+ font-weight: bold;
+ }
+
+ // Translate icon
+ .o_field_translate {
+ margin-left: -15px;
+ }
+
+ // Percent pie field
+ .o_form_field_percent_pie {
+ @pie-dimension: 34px;
+ @pie-ring-width: 4px;
+
+ .o_pie {
+ width: @pie-dimension;
+ height: @pie-dimension;
+ margin-left: 5px;
+
+ &:after { // Outside pie border to go over border-radius irregularities
+ border: 1px solid @odoo-brand-primary;
+ }
+
+ .o_pie_value {
+ .o-position-absolute(@pie-ring-width, @pie-ring-width);
+ width: @pie-dimension - 2 * @pie-ring-width;
+ height: @pie-dimension - 2 * @pie-ring-width;
+ border: 1px solid white;
+ background-color: white;
+ }
+ }
+ }
+
+ // Specific style classes
+ .o_group.o_inner_group.oe_subtotal_footer {
+ .oe_subtotal_footer_separator {
+ border-top: 1px solid #cacaca;
+ }
+ .o_td_label {
+ border-right: none;
+ }
+ }
+}
+
+// Overriden style when form view in modal
+.modal .modal-dialog {
+ .o_form_view {
+ .o_form_sheet_bg, .o_form_sheet {
+ border: none;
+ }
+ }
+}
diff --git a/addons/web/static/src/less/form_view_layout.less b/addons/web/static/src/less/form_view_layout.less
new file mode 100644
index 00000000000..e6aa989ca12
--- /dev/null
+++ b/addons/web/static/src/less/form_view_layout.less
@@ -0,0 +1,298 @@
+.o_form_view {
+ .oe_inline {
+ width: auto!important;
+ @media (min-width: @screen-xs-min) {
+ &.o_inner_group {
+ width: 1px!important;
+ }
+ }
+ }
+ .oe_left {
+ .oe_inline;
+ float: left!important;
+ }
+ .oe_right {
+ .oe_inline;
+ float: right!important;
+ }
+
+ @media (min-width: @screen-xs-min) {
+ .o_row {
+ &, &.o_form_field { // Some field may want to use o_row as root and these rules must prevalue
+ .o-flex-display();
+ width: auto!important;
+ }
+
+ .o-align-items(baseline);
+ min-width: 50px;
+ margin: 0 -@odoo-form-spacing-unit/2;
+
+ > div, > span, > button, > label, > a, > input { // > * did not add a level of priority to the rule
+ .o-flex(0, 0, auto);
+ width: auto!important;
+ margin-right: @odoo-form-spacing-unit/2;
+ margin-left: @odoo-form-spacing-unit/2;
+ }
+
+ > .o_row {
+ margin: 0;
+ }
+ > .btn {
+ padding-top: 0;
+ padding-bottom: 0;
+ }
+ > .o_form_field_boolean {
+ .o-align-self(center);
+ }
+ }
+
+ .o_row .o_form_field_many2one, .o_form_field_many2one.oe_inline {
+ &.o_with_button:not(:last-child) { // If invisible element as last child, this line has no effect but that's not very important
+ margin-right: (35px + (@odoo-form-spacing-unit/2));
+ }
+ }
+ }
+
+ .o_row > div > .o_form_field {
+ width: 100%;
+ }
+
+ // Readonly specific rules
+ &.o_form_readonly {
+ .o_row {
+ display: inline-block;
+ > div {
+ display: inline-block;
+ }
+ }
+ }
+
+ // Editable specific rules
+ &.o_form_editable {
+ @media (min-width: @screen-xs-min) {
+ .o_row {
+ > .o_form_field, > div {
+ .o-flex(1, 1, auto);
+ width: 0!important; // 3rd flex argument does not work with input (must be auto and real width 0)
+
+ &.o_form_field_boolean, &.o_priority {
+ .o-flex(0, 0, auto);
+ width: auto!important;
+ }
+ }
+ }
+ }
+
+ .oe_title {
+ max-width: @container-sm - (2 * @odoo-horizontal-padding);
+ }
+ }
+
+ // Title
+ .oe_title {
+ > h1, > h2, > h3 {
+ width: 100%; // Needed because inline-block when is a hx.o_row
+ margin-top: 0;
+ margin-bottom: 0;
+ line-height: inherit;
+ }
+ }
+
+ // Groups
+ .o_group {
+ display: inline-block;
+ width: 100%;
+ margin: 10px 0;
+
+ // o_group contains nested groups
+ .o-generate-groups(@odoo-form-group-cols);
+ .o-generate-groups(@n, @i: 1) when (@i =< @n) {
+ .o_group_col_@{i} {
+ display: inline-block;
+ width: floor(100% / 12 * @i);
+ vertical-align: top;
+ }
+ .o-generate-groups(@n, @i + 1);
+ }
+
+ &.o_inner_group {
+ display: inline-table;
+
+ > tbody > tr > td {
+ &.o_td_label {
+ width: 0%;
+ padding: 0 15px 0 0;
+ min-width: 150px;
+ }
+ vertical-align: top;
+
+ span, .o_form_field_boolean, .oe_avatar, .o_form_uri {
+ &.o_form_field {
+ width: auto;
+ }
+ }
+ }
+ }
+
+ .o_form_field {
+ width: 100%;
+
+ > .btn {
+ .o-flex(0, 0, auto);
+ padding: 0 10px;
+ }
+ }
+ }
+
+ // Notebooks
+ .o_notebook {
+ clear: both; // For the notebook not to have alongside floating elements
+ margin-top: @odoo-form-spacing-unit * 2;
+ }
+
+ // Labels
+ .o_form_label {
+ margin: 0;
+ }
+
+ // Form fields
+ .o_form_field {
+ display: inline-block;
+ margin-bottom: @odoo-form-spacing-unit;
+ }
+
+ // Block fields
+ .note-editor, .oe_form_field_html, .oe_form_field_html_text, .oe_form_field_text, .o_view_manager_content {
+ display: block;
+ }
+
+ // Flex fields
+ .o_form_field_many2one, .o_form_field_radio, .o_form_field_many2manytags, .o_form_field_percent_pie, .o_form_field_monetary, .o_form_field_binary_file {
+ .o-inline-flex-display();
+ > span, > button {
+ .o-flex(0, 0, auto);
+ }
+ }
+
+ .o_form_field, .btn {
+ .o_form_field {
+ margin-bottom: 0px;
+ }
+ }
+
+ // Input in field
+ .o_form_field {
+ .o_form_input_dropdown {
+ width: 100%;
+ }
+ .o_form_input {
+ display: inline-block;
+ }
+ }
+
+ // Textarea
+ .o_form_textarea {
+ white-space: pre-wrap;
+ width: 100%;
+ &.oe_inline {
+ width: 100%!important;
+ @media (min-width: @screen-xs-min) {
+ width: 45%!important;
+ }
+ }
+ }
+
+ // Radio buttons
+ .o_form_field_radio {
+ .o_radio_item {
+ .o-flex(0, 0, auto);
+ .o-flex-display();
+ .o-align-items(center);
+
+ > input {
+ .o-flex(0, 0, auto);
+ margin: 0 @odoo-form-spacing-unit 0 0;
+ }
+ > label {
+ margin: 0;
+ }
+ }
+
+ &.o_horizontal {
+ .o_radio_item {
+ margin-right: @odoo-form-spacing-unit * 2;
+ }
+ }
+
+ &.o_vertical {
+ .o-flex-flow(column, nowrap);
+ .o_radio_item {
+ margin-bottom: @odoo-form-spacing-unit;
+ }
+ }
+ }
+
+ // One2Many, Many2Many outside of group
+ .o_form_field {
+ &.o_view_manager_content, &.o_form_field_one2many, &.o_form_field_many2many {
+ width: 100%;
+ > div {
+ width: 100%;
+ }
+ }
+ }
+
+ // Many2many tags
+ .o_form_field_many2manytags {
+ .o-flex-flow(row, wrap);
+ .o-align-items(baseline);
+ .badge {
+ .o-flex(0, 0, auto);
+ > .o_badge_text {
+ .o-text-overflow(inline-block);
+ max-width: 200px;
+ }
+ }
+ }
+
+ // Percent pie
+ .o_form_field_percent_pie {
+ .o-align-items(center);
+ > .o_pie {
+ margin-right: 10px;
+ }
+ }
+
+ // Kanban selection
+ .o_form_sheet > .o_kanban_selection {
+ float: right;
+ }
+
+ // Specific style classes
+ .o_group.o_inner_group.oe_subtotal_footer {
+ .oe_right;
+ }
+}
+
+// Overriden style when form view in modal
+.modal .modal-dialog {
+ .o_form_view {
+ .o_form_sheet_bg {
+ padding: 0;
+ }
+ .oe_chatter {
+ display: none;
+ }
+ }
+ &:not(.modal-lg) .o_form_view {
+ .o_group {
+ width: 100%;
+ }
+ }
+}
+
+@media print {
+ .oe_button_box {
+ display: none !important;
+ }
+}
diff --git a/addons/web/static/src/less/form_view_layout_extra.less b/addons/web/static/src/less/form_view_layout_extra.less
new file mode 100644
index 00000000000..0845977ef4d
--- /dev/null
+++ b/addons/web/static/src/less/form_view_layout_extra.less
@@ -0,0 +1,125 @@
+@sheet-max-width: 860px;
+@sheet-min-width: 650px;
+@sheet-padding: 16px;
+
+.o_form_view {
+ &.o_form_nosheet {
+ padding: 16px;
+ &.oe_form_nomargin {
+ margin: 0;
+ }
+ }
+ .o_form_sheet_bg {
+ position: relative;
+ padding: @sheet-padding 0;
+ .o_form_sheet {
+ min-width: @sheet-min-width;
+ max-width: @sheet-max-width;
+ min-height: 330px;
+ background: white;
+ padding: 16px;
+ margin: 0 auto;
+ .ui-tabs {
+ margin: 0 -16px;
+ }
+ .oe_notebook_page {
+ padding: 0 16px;
+ }
+ }
+ }
+
+ // Header containing status/workflow buttons
+ > header {
+ padding-left: 14px;
+ .clearfix();
+ ul:not(.oe_tooltip_technical):not(.oe_dropdown_menu) {
+ display: inline-block;
+ float: right;
+ }
+ > button {
+ margin: 0 2px;
+ }
+ > span {
+ margin-left: 4px;
+ }
+ }
+
+ // Button box
+ .oe_button_box {
+ width: 400px;
+ text-align: right;
+ float: right;
+ .oe_stat_button {
+ text-align: left;
+ width: 132px !important;
+ height: 40px;
+ margin: 0px -1px -1px 0px;
+ padding: 0;
+ > div {
+ text-align: left;
+ padding: 0;
+ line-height: 120%;
+ vertical-align: middle;
+ }
+ .o_button_icon {
+ display: inline-block;
+ width: 30%;
+ padding: 0px 3px;
+ width: 37px;
+ text-align: center;
+ vertical-align: middle;
+ }
+
+ .o_stat_info { // contains the value and text
+ display: inline-block;
+ max-width: 70%;
+ line-height: 1.2;
+ }
+
+ // Some buttons only display text and directly use the WidgetButton template instead of StatInfo
+ > span {
+ .o_stat_info; // layout
+ }
+ }
+
+ &, & + .oe_avatar {
+ + .oe_title {
+ width: 400px;
+ }
+ }
+ }
+
+ // Groups
+ .o_group {
+ .o_td_label + td {
+ padding: 2px 36px 2px 8px;
+ }
+ .o_form_field.o_text_overflow {
+ width: 1px!important; // hack to make the table layout believe it is a small element (so that the table does not grow too much) ...
+ min-width: 100%; // ... but in fact it takes the whole table space
+ }
+ }
+
+ // Avatar
+ .oe_avatar {
+ float: left;
+ > img {
+ max-height: 90px;
+ max-width: 90px;
+ margin-bottom: 10px;
+ }
+ + .oe_title {
+ padding-left: 95px;
+ margin-left: 5px;
+ }
+ }
+
+ // Chatter
+ .oe_chatter {
+ display: block;
+ min-width: @sheet-min-width + 2* @sheet-padding;
+ max-width: @sheet-max-width + 2* @sheet-padding;
+ margin: 0 auto;
+ padding: 16px 16px 48px;
+ }
+}
diff --git a/addons/web/static/src/less/graph_view.less b/addons/web/static/src/less/graph_view.less
new file mode 100644
index 00000000000..c0d460ab3f1
--- /dev/null
+++ b/addons/web/static/src/less/graph_view.less
@@ -0,0 +1,18 @@
+.o_graph {
+ height: 100%;
+
+ .o_graph_svg_container {
+ height: 100%;
+ overflow: auto;
+ svg {
+ background-color: @odoo-view-background-color;
+ }
+ }
+}
+
+// ------------------------------------------------------------------
+// Control panel buttons
+// ------------------------------------------------------------------
+.o_graph_measures_list {
+ .o-selected-li;
+} \ No newline at end of file
diff --git a/addons/web/static/src/less/list_view.less b/addons/web/static/src/less/list_view.less
new file mode 100644
index 00000000000..a8b4130269c
--- /dev/null
+++ b/addons/web/static/src/less/list_view.less
@@ -0,0 +1,220 @@
+@odoo-list-group-header-color: lighten(@odoo-list-grey, 10%);
+.o_list_view {
+ cursor: pointer;
+ background-color: @odoo-view-background-color;
+ margin-bottom: 0px;
+
+ &.table {
+ td, th {
+ vertical-align: middle;
+ }
+ }
+
+ thead {
+ color: @odoo-main-text-color;
+ background-color: #eee;
+ border-bottom: 1px solid #cacaca;
+ > tr > th {
+ border-left: 1px solid #dfdfdf;
+ &:not(.o_column_sortable):hover {
+ cursor: default;
+ }
+ }
+ }
+
+ tfoot {
+ cursor: default;
+ color: @odoo-list-footer-color;
+ background-color: @odoo-list-footer-bg-color;
+ font-weight: @odoo-list-footer-font-weight;
+ border-top: 2px solid #cacaca;
+ border-bottom: 1px solid #cacaca;
+ }
+
+ .o_column_sortable {
+ .user-select(none); // Prevent unwanted selection while sorting
+
+ &.o-sort-up:after {
+ font-family: FontAwesome;
+ margin-left: 5px;
+ content: "\f0d7";
+ }
+ &.o-sort-down:after {
+ font-family: FontAwesome;
+ margin-left: 5px;
+ content: "\f0d8";
+ }
+ }
+
+ .o_list_record_selector {
+ width: 1px; // to prevent the column to expand
+ > input {
+ margin-left: 3px;
+ .hidden-xs();
+ }
+ }
+
+ .o_list_record_delete {
+ width: 13px;
+ }
+
+ .o_handle_cell {
+ width: 1px; // to prevent the column to expand
+ .o_row_handle {
+ cursor: ns-resize;
+ }
+ }
+
+ // Decoration of the row
+ .text-bf {
+ font-weight: bold;
+ }
+ .text-it {
+ font-style: italic;
+ }
+ .text-muted {
+ color: lighten(@text-muted, 10%);
+ }
+
+ // Grouped list views
+ tbody > tr.o_group_header {
+ .o-vertical-gradient(#fcfcfc, #dedede);
+
+ .o_group_name {
+ white-space: nowrap;
+ }
+ .o_group_pager {
+ cursor: text;
+ .user-select(none);
+ text-align: right;
+ .o_pager_previous, .o_pager_next {
+ background-color: @odoo-list-group-header-color;
+ &:hover {
+ background-color: darken(@odoo-list-group-header-color, 10%);
+ }
+ }
+ }
+ }
+ tbody + tbody {
+ border-top: none; // Override bootstrap for grouped list views
+ }
+
+ .o_list_number {
+ text-align: right;
+ white-space: nowrap;
+ }
+ .o_list_text {
+ white-space: pre-wrap;
+ }
+}
+
+.o_list_editable {
+ position: relative;
+
+ .o_temp_visible {
+ opacity: 0;
+ display: block!important;
+ }
+
+ .o_list_view {
+ .o_row_edition > td {
+ visibility: hidden; // Hide row's content during edition
+ &.o_list_record_selector, &.o_list_record_delete, &.o_list_button {
+ visibility: visible;
+ }
+
+ &.o_readonly {
+ visibility: visible;
+ color: transparent;
+ }
+ }
+ }
+
+ .o_form_view.o_list_editable_form {
+ padding: 0;
+ > .o_form_field {
+ padding: 0;
+ position: absolute;
+ white-space: nowrap;
+ &.o_form_textarea {
+ white-space: pre-wrap;
+ }
+ .o_form_field, .badge { // Many2Many tags
+ display: block;
+ float: left;
+ white-space: normal;
+ max-width: 100%; // Fix a chrome bug where badge would not break on multiple lines
+ }
+
+ &.o_readonly {
+ background-color: transparent;
+ padding: 5px;
+ }
+ }
+ > .o_field_translate {
+ position: absolute;
+ width: 16px; // to have some space on the right
+ }
+ .o_form_input_dropdown {
+ height: 100%;
+ }
+ .o_form_input {
+ height: 100%;
+ padding-left: 5px;
+ padding-right: 5px;
+ }
+ .o_form_input, .o_form_textarea, .o_form_field_many2manytags, .o_form_field_monetary {
+ border-style: solid;
+ }
+ .o_form_field_monetary .o_form_input {
+ width: 0;
+ }
+ .o_checkbox {
+ padding: 7px 0 0 5px;
+ background: transparent;
+ }
+ .o_form_textarea {
+ min-width: 0;
+ }
+ .o_with_button .o_form_input_dropdown {
+ width: 1%; // Hack so that the sibling button is not overlapped
+ }
+ .o_form_input_dropdown, .o_datepicker {
+ > .o_form_input {
+ padding-right: 15px; // To prevent caret overlapping
+ }
+ > .o_dropdown_button, .o_datepicker_button {
+ .o-position-absolute(20%, 5px);
+ }
+ }
+ .o_form_field > .o_external_button {
+ padding: 0;
+ background-color: inherit;
+ margin-left: 3px;
+ }
+ .o_row_handle {
+ visibility: hidden; // Hide sequence when editing
+ }
+ .o_form_field_boolean {
+ width: auto!important; // Override the width computed in JS (needed for Chrome)
+ }
+ .o_form_field_number {
+ text-align: right;
+ }
+ }
+}
+
+// Buttons in ControlPanel
+.o_list_buttons {
+ .o_list_button_save, .o_list_button_discard {
+ display: none;
+ }
+ &.o-editing { // for list view editable
+ .o_list_button_add {
+ display: none
+ }
+ .o_list_button_save, .o_list_button_discard {
+ display: inline-block
+ }
+ }
+}
diff --git a/addons/web/static/src/less/modal.less b/addons/web/static/src/less/modal.less
index 9ff0453c4dd..bca950796fc 100644
--- a/addons/web/static/src/less/modal.less
+++ b/addons/web/static/src/less/modal.less
@@ -3,6 +3,10 @@
.modal-content {
border-radius: 0;
+ .modal-header .o_subtitle {
+ margin-left: 10px;
+ }
+
.modal-body {
&.o_act_window {
padding: 0;
@@ -20,7 +24,7 @@
}
}
- .oe-view-manager-content {
+ .o_view_manager_content {
position: static; // Reset position for view managers in modals (default value: absolute)
}
}
diff --git a/addons/web/static/src/less/navbar.less b/addons/web/static/src/less/navbar.less
index 8dcacd1c45c..50015db9955 100644
--- a/addons/web/static/src/less/navbar.less
+++ b/addons/web/static/src/less/navbar.less
@@ -1,6 +1,5 @@
.o_main_navbar {
- position: relative;
height: @odoo-navbar-height;
border: 1px solid @odoo-navbar-inverse-link-hover-bg;
background-color: @odoo-brand-primary;
@@ -66,12 +65,6 @@
left: auto;
right: 0;
}
- .o_user_menu {
- float: right;
- .oe_topbar_avatar {
- height: 15px;
- }
- }
}
}
@@ -150,13 +143,6 @@
}
}
}
-
- .o_menu_brand {
- float: none;
- margin: 0;
- border-bottom: 1px solid @odoo-navbar-inverse-link-hover-bg;
- color: transparent;
- }
}
}
diff --git a/addons/web/static/src/less/pivot_view.less b/addons/web/static/src/less/pivot_view.less
new file mode 100644
index 00000000000..2fa6e1a6f44
--- /dev/null
+++ b/addons/web/static/src/less/pivot_view.less
@@ -0,0 +1,79 @@
+.o_pivot {
+ height: 100%;
+ overflow: auto;
+
+ // Inform the user that he may click on a cell to be redirected to a list view of the
+ // items corresponding to the clicked cell
+ &.o_enable_linking {
+ .o_pivot_cell_value:hover {
+ color: @odoo-brand-optional;
+ cursor: pointer;
+ }
+ }
+
+ table {
+ background-color: @odoo-view-background-color;
+ width: auto; // bootstrap override
+
+ th {
+ font-weight: normal; // bootstrap override
+ background-color: lighten(@odoo-brand-secondary, 40%);
+ }
+
+ .o-pivot-header-cell() {
+ background-color: lighten(@odoo-brand-secondary, 40%);
+ cursor: pointer;
+ white-space: nowrap;
+ .user-select(none);
+ &:hover {
+ background-color: lighten(@odoo-brand-secondary, 30%);
+ }
+ }
+
+ .o_pivot_measure_row {
+ .o-pivot-header-cell;
+ }
+
+ .o_pivot_header_cell_closed {
+ .o-pivot-header-cell;
+ &::before {
+ font-family: FontAwesome;
+ content: "";
+ margin-right: 8px;
+ }
+ }
+
+ .o_pivot_header_cell_opened {
+ .o-pivot-header-cell;
+ &::before {
+ font-family: FontAwesome;
+ content: "";
+ margin-right: 8px;
+ }
+ }
+
+ .o_pivot_measure_row_sorted_asc::after {
+ .o-caret-down;
+ margin-left: 5px;
+ }
+
+ .o_pivot_measure_row_sorted_desc::after {
+ .o-caret-up;
+ margin-left: 5px;
+ }
+ }
+
+ .o_pivot_field_selection::after {
+ .o-caret-right;
+ position: absolute;
+ right: 6px;
+ top: 9px;
+ }
+}
+
+// ------------------------------------------------------------------
+// Control panel buttons
+// ------------------------------------------------------------------
+.o_pivot_measures_list {
+ .o-selected-li;
+} \ No newline at end of file
diff --git a/addons/web/static/src/less/progress_bar.less b/addons/web/static/src/less/progress_bar.less
new file mode 100644
index 00000000000..25a89d15ecf
--- /dev/null
+++ b/addons/web/static/src/less/progress_bar.less
@@ -0,0 +1,36 @@
+.o_progressbar {
+
+ > div {
+ display: inline-block;
+ }
+
+ .o_progressbar_title {
+ white-space: nowrap;
+ padding-right: 10px;
+ }
+
+ .o_progress {
+ width: 100px;
+ height: 15px;
+ vertical-align: middle;
+
+ border: 1px solid lighten(@odoo-brand-secondary, 25%);
+ overflow: hidden;
+
+ background-color: white;
+ &.o_progress_overflow {
+ background-color: @odoo-brand-secondary;
+ }
+
+ .o_progressbar_complete {
+ background-color: @odoo-brand-optional;
+ height: 100%;
+ }
+ }
+
+ .o_progressbar_value {
+ width: 100px;
+ white-space: nowrap;
+ padding-left: 10px;
+ }
+}
diff --git a/addons/web/static/src/less/search_view.less b/addons/web/static/src/less/search_view.less
new file mode 100644
index 00000000000..a34905cb929
--- /dev/null
+++ b/addons/web/static/src/less/search_view.less
@@ -0,0 +1,209 @@
+.o-search-options-dropdown-custom-li() {
+ margin: 3px 25px;
+ width: auto;
+ max-width: 250px;
+}
+
+.o_searchview {
+ .o-flex-display();
+ .o-flex-flow(row, wrap);
+ .o-align-items(flex-end);
+ position: relative;
+ padding: 0 20px 1px 0;
+
+ .o_searchview_facet {
+ @o-searchview-facet-remove-width: 18px;
+
+ .o-flex(0, 0, auto);
+ max-width: 100%;
+ .o-flex-display();
+ position: relative;
+ margin: 1px 3px 0 0;
+
+ .o_searchview_facet_label {
+ .o-flex(0, 0, auto);
+ .o-text-overflow();
+ padding: 0 3px;
+ color: white;
+
+ .o-flex-display();
+ .o-align-items(center);
+ }
+
+ .o_facet_values {
+ padding: 0 @o-searchview-facet-remove-width 0 5px;
+ .o_facet_values_sep {
+ font-style: italic;
+ }
+ }
+ .o_facet_remove {
+ .o-flex(0, 0, auto);
+ .o-flex-display();
+ .o-justify-content(center);
+ .o-align-items(center);
+ .o-position-absolute(0, 0, 0);
+ width: @o-searchview-facet-remove-width;
+ cursor: pointer;
+ }
+ }
+
+ .o_searchview_input {
+ width: 100px;
+ .o-flex(1, 0, auto);
+ }
+
+ .o_searchview_more {
+ font-size: 16px;
+ cursor: pointer;
+ }
+
+ .o_searchview_autocomplete {
+ .o-position-absolute(100%, @left: auto);
+ width: 100%;
+
+ li {
+ padding-left: 25px;
+ position: relative;
+ &.o-indent {
+ padding-left: 50px;
+ }
+ a {
+ display: inline-block;
+ padding-left: 0px;
+ padding-right: 0px;
+ &:hover {
+ background-color: inherit;
+ }
+ &.o-expand, &.o-expanded { // caret
+ .o-position-absolute(@left: 6px);
+ padding: 3px;
+ }
+ &.o-expand:before {
+ .o-caret-right;
+ }
+ &.o-expanded:before {
+ .o-caret-down;
+ }
+ }
+ }
+ }
+}
+
+// Searchview and Sidebar dropdowns
+// FIXME: move me out of here
+.o_dropdown {
+ white-space: nowrap; // prevent the arrow from going under the dropdown when too little space
+ .dropdown-toggle:first-child {
+ // apply the padding to the first element so that when the `favorites` menu goes under
+ // the `filters` menu, they're still aligned
+ padding-right: 10px;
+ }
+
+ display: inline-block;
+ cursor: pointer;
+ .user-select(none); // Prevent text selection when toggling the dropdowns
+ > a { // dropdown togglers
+ color: @odoo-main-text-color;
+ &:hover {
+ text-decoration: none;
+ font-weight: bold;
+ color: darken(@odoo-main-text-color, 10%);
+ }
+ }
+ &.open > a {
+ font-weight: bold;
+ color: darken(@odoo-main-text-color, 10%);
+ }
+}
+
+// Searchview dropdowns
+.o_search_options {
+ // Open and closed carets in dropdowns
+ .o_closed_menu {
+ position: relative;
+ a:before {
+ .o-caret-right;
+ .o-position-absolute(@top: 50%, @left: 10px);
+ margin-top: (-@caret-width-base);
+ }
+ }
+ .o_open_menu {
+ position: relative;
+ a:before {
+ .o-caret-down;
+ .o-position-absolute(@top: 50%, @left: 10px);
+ margin-top: (-@caret-width-base);
+ }
+ }
+
+ // Filters
+ .o_filters_menu {
+ .o-selected-li;
+
+ .o_filter_condition {
+ .o-search-options-dropdown-custom-li;
+ margin-bottom: 8px;
+ .o_or_filter { // or between conditions
+ display: none; // hidden for the first condition
+ .o-position-absolute(@top: 7px, @left: -18px);
+ }
+ }
+ .o_filter_condition + .o_filter_condition {
+ .o_or_filter {
+ display: block; // displayed from second condition
+ }
+ }
+ .o_searchview_extended_prop_op {
+ margin: 3px 0px; // vertical gap between selects
+ }
+ .o_searchview_extended_prop_value { // date fields: datepicker position
+ .datepickerbutton {
+ .o-position-absolute(3px, -20px);
+ cursor: pointer;
+ }
+ }
+ .o_searchview_extended_delete_prop { // delete condition button position
+ .o-position-absolute(3px, -18px);
+ cursor: pointer;
+ }
+ .o_add_filter_menu { // apply and add buttons
+ display: none; // Needed by the webclient
+ .o-search-options-dropdown-custom-li;
+ }
+ }
+
+ // Group By
+ .o_group_by_menu {
+ .o-selected-li;
+
+ .divider {display: none;} // hide the divider by default (no group)
+ .o_add_group { // add button
+ display: none; // Needed by the webclient
+ .o-search-options-dropdown-custom-li;
+ }
+ }
+
+ // Favorites
+ .o_favorites_menu {
+ .o-selected-li;
+
+ .divider {display: none;} // hide the divider by default (no favorite)
+ .o-searchview-custom-private, .o-searchview-custom-public {
+ .o-remove-filter {
+ .o-position-absolute(50%, 12px);
+ margin-top: -6px;
+ cursor: pointer;
+ }
+ }
+ .o-searchview-custom-public a:after {
+ font-family: FontAwesome;
+ content: "\f0c0";
+ margin-left: 5px;
+ font-weight: normal;
+ }
+ .o_save_name { // save button
+ display: none; // hidden by default
+ .o-search-options-dropdown-custom-li;
+ }
+ }
+}
diff --git a/addons/web/static/src/less/search_view_extra.less b/addons/web/static/src/less/search_view_extra.less
new file mode 100644
index 00000000000..0ef7b8dd1dd
--- /dev/null
+++ b/addons/web/static/src/less/search_view_extra.less
@@ -0,0 +1,44 @@
+.o_searchview {
+ background-color: white;
+ border: 1px solid #ccc;
+ border-radius: @border-radius-base;
+ padding: 1px 25px 3px 5px;
+
+ .o_searchview_facet {
+ border: 1px solid @gray-light;
+ background: lighten(@odoo-brand-primary, 35%);
+
+ .o_searchview_facet_label {
+ background-color: @gray-light;
+ }
+
+ .o_facet_remove {
+ color: @gray-light;
+ &:hover {
+ color: @gray;
+ }
+ }
+ }
+
+ .o_searchview_input {
+ border: none;
+ padding: 4px 0 0 0;
+ }
+ .o_searchview_more {
+ .o-position-absolute(@top: 6px, @right: 5px);
+ }
+ .o_searchview_autocomplete li.o-selection-focus {
+ background-color: @odoo-brand-primary;
+ > a {
+ color: white;
+ }
+ }
+}
+
+// Search options: inputs and selects style
+.o_search_options {
+ input[type="text"], select {
+ .form-control();
+ }
+
+}
diff --git a/addons/web/static/src/less/tooltip.less b/addons/web/static/src/less/tooltip.less
new file mode 100644
index 00000000000..dad63e374fa
--- /dev/null
+++ b/addons/web/static/src/less/tooltip.less
@@ -0,0 +1,57 @@
+
+.tooltip {
+ padding: 0;
+ margin: 0;
+ opacity: 1;
+
+ .tooltip-inner {
+ background-color: @odoo-tooltip-background-color;
+ color: @odoo-tooltip-color;
+ border-radius: @border-radius-base;
+ box-shadow: 0px 0px 1px 1px @odoo-brand-secondary;
+
+ padding: 5px;
+
+ text-align: left;
+
+ .oe_tooltip_string {
+ background-color: @odoo-brand-primary;
+ color: white;
+ font-weight: bold;
+ padding: 5px;
+ }
+ .oe_tooltip_help {
+ white-space: pre-line;
+ padding: 5px 5px 0;
+ }
+ .oe_tooltip_technical {
+ padding: 0;
+ margin: 5px 0 5px 20px;
+ list-style-type: circle;
+
+ .oe_tooltip_technical_title {
+ font-weight: bold;
+ }
+ }
+ }
+
+ .tooltip-arrow {
+ -moz-transform: scale(0.9999);
+ }
+ &.top, &.top-left, &.top-right {
+ .tooltip-arrow {
+ border-top-color: @odoo-tooltip-arrow-color!important;
+ }
+ }
+ &.bottom, &.bottom-left, &.bottom-right {
+ .tooltip-arrow {
+ border-bottom-color: @odoo-tooltip-arrow-color!important;
+ }
+ }
+ &.left .tooltip-arrow {
+ border-left-color: @odoo-tooltip-arrow-color!important;
+ }
+ &.right .tooltip-arrow {
+ border-right-color: @odoo-tooltip-arrow-color!important;
+ }
+}
diff --git a/addons/web/static/src/less/tree_view.less b/addons/web/static/src/less/tree_view.less
new file mode 100644
index 00000000000..681cfb33c80
--- /dev/null
+++ b/addons/web/static/src/less/tree_view.less
@@ -0,0 +1,50 @@
+.o_treeview_table {
+ width: 100%;
+ background-color: white;
+ border-collapse: collapse;
+
+ thead {
+ color: @odoo-main-text-color;
+ background-color: @odoo-list-grey;
+ > tr > th {
+ padding: 10px;
+ }
+ }
+
+ tbody {
+ > tr {
+ border: 1px solid @odoo-list-grey;
+ &:hover {
+ background-color: lighten(@odoo-list-grey, 15%);
+ }
+ > td {
+ border: 1px solid @odoo-list-grey;
+ cursor: pointer;
+ height: 40px;
+ padding: 0 4px;
+ &.oe_number {
+ text-align: right;
+ }
+ }
+ }
+ .treeview-tr, .treeview-td {
+ &.o_treeview_first > span {
+ padding-left: 16px;
+ }
+ }
+ .treeview-tr.o_treeview_first {
+ position: relative;
+ &:before {
+ position: absolute;
+ top: 13px;
+ .o-caret-right(6px);
+ }
+ }
+ .o_open .treeview-tr.o_treeview_first {
+ &:before {
+ top: 16px;
+ .o-caret-down(6px);
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/addons/web/static/src/less/utils.less b/addons/web/static/src/less/utils.less
index 302f79edf03..836ae6453dc 100644
--- a/addons/web/static/src/less/utils.less
+++ b/addons/web/static/src/less/utils.less
@@ -116,14 +116,6 @@
background-size: @size;
}
-// Background gradient
-.o-linear-gradient(@deg: 45deg, @start-color: #555, @end-color: #333) {
- background-repeat: repeat-x;
- background-image: -webkit-linear-gradient(@deg, @start-color, @end-color);
- background-image: -o-linear-gradient(@deg, @start-color, @end-color);
- background-image: linear-gradient(@deg, @start-color, @end-color);
-}
-
// ------------------------------------------------------------------
// Dropdowns
// ------------------------------------------------------------------
@@ -221,3 +213,40 @@
text-overflow: ellipsis;
vertical-align: top; // To update display context changed by overflow:hidden
}
+
+// ------------------------------------------------------------------
+// Gradients
+// ------------------------------------------------------------------
+.o-linear-gradient(@deg: 45deg, @start-color: #555, @end-color: #333) {
+ background-repeat: repeat-x;
+ background-image: -webkit-linear-gradient(@deg, @start-color, @end-color);
+ background-image: -o-linear-gradient(@deg, @start-color, @end-color);
+ background-image: linear-gradient(@deg, @start-color, @end-color);
+}
+.o-vertical-gradient(@startColor: #555, @endColor: #333) {
+ background-color: mix(@startColor, @endColor);
+ background-image: -webkit-gradient(linear, left top, left bottom, from(@startColor), to(@endColor));
+ background-image: -webkit-linear-gradient(top, @startColor, @endColor);
+ background-image: -moz-linear-gradient(top, @startColor, @endColor);
+ background-image: -ms-linear-gradient(top, @startColor, @endColor);
+ background-image: -o-linear-gradient(top, @startColor, @endColor);
+ background-image: linear-gradient(to bottom, @startColor, @endColor);
+}
+.o-skew-gradient(@startColor: #555, @endColor: #333) {
+ background-color: @endColor;
+ background: -moz-linear-gradient(135deg, @endColor, @startColor);
+ background: -o-linear-gradient(135deg, @startColor, @endColor);
+ background: -webkit-gradient(linear, left top, right bottom, from(@startColor), to(@endColor));
+ background: -ms-linear-gradient(top, @startColor, @endColor);
+}
+
+// ------------------------------------------------------------------
+// Transform
+// ------------------------------------------------------------------
+.o-transform(@transform) {
+ -webkit-transform: @transform;
+ -moz-transform: @transform;
+ -ms-transform: @transform;
+ -o-transform: @transform;
+ transform: @transform;
+}
diff --git a/addons/web/static/src/less/variables.less b/addons/web/static/src/less/variables.less
index 4bea799e5ec..5a8120d0d97 100644
--- a/addons/web/static/src/less/variables.less
+++ b/addons/web/static/src/less/variables.less
@@ -1,28 +1,50 @@
@odoo-font-size-base: 13px;
-@odoo-font-size-base-touch: 15px;
// Colors
-@odoo-brand-primary: #337ab7;
-@odoo-brand-optional: @odoo-brand-primary;
-@odoo-brand-secondary: #8f8f8f;
+@odoo-brand-primary: #7c7bad;
+@odoo-brand-optional: #7c7bad;
+@odoo-brand-secondary: #f0eeee;
@odoo-brand-lightsecondary: #e2e2e0;
+@odoo-color-pink: #a24689;
@odoo-main-color-muted: #a8a8a8;
-@odoo-main-text-color: #555555;
+@odoo-main-text-color: #4c4c4c;
@odoo-view-background-color: white;
@odoo-shadow-color: #303030;
-@odoo-webclient-background-color: #F0EEEE;
+
+@odoo-webclient-background-color: @odoo-brand-secondary;
+@odoo-control-panel-background-color: @odoo-webclient-background-color;
+@odoo-form-lightsecondary: #ccc;
@odoo-list-grey: @odoo-brand-lightsecondary;
+@odoo-list-footer-color: @odoo-main-text-color;
+@odoo-list-footer-bg-color: #eee;
+@odoo-list-footer-font-weight: bold;
+
+@odoo-tooltip-background-color: black;
+@odoo-tooltip-color: white;
+@odoo-tooltip-arrow-color: black;
+
// Layout
@screen-xs-min: 475px;
@screen-xxs-max: (@screen-xs-min - 1);
@odoo-form-group-cols: 12;
+@odoo-form-spacing-unit: 5px;
@odoo-horizontal-padding: 16px;
+@odoo-innergroup-rpadding: 45px;
+@odoo-dropdown-hpadding: 25px;
+
+@border-radius-base: 3px;
-// Compatibility
-@odoo-navbar-height: 46px;
+@odoo-sheet-vpadding: 24px;
+
+@odoo-avatar-size: 90px;
+
+@odoo-statusbar-height: 36px;
+@odoo-statusbar-arrow-width: @odoo-statusbar-height/3;
+
+@odoo-label-font-size-factor: 0.8;
+@odoo-navbar-height: 34px;
@odoo-navbar-inverse-link-hover-bg: darken(@odoo-brand-primary, 10%);
-@odoo-dropdown-hpadding: 25px;
diff --git a/addons/web/static/src/less/views.less b/addons/web/static/src/less/views.less
new file mode 100644
index 00000000000..7a4deca60ff
--- /dev/null
+++ b/addons/web/static/src/less/views.less
@@ -0,0 +1,72 @@
+// --------------------------------------------------------------------------
+// This file contains rules applying on elements shared between views
+// --------------------------------------------------------------------------
+
+// Many2many tags
+.o_form_field_many2manytags {
+ .o_tag_color_0 {
+ background-color: #B6BBBF;
+ }
+ .o_tag_color_1 {
+ background-color: #61BD4F;
+ }
+ .o_tag_color_2 {
+ background-color: #F2D600;
+ }
+ .o_tag_color_3 {
+ background-color: #FFAB4A;
+ }
+ .o_tag_color_4 {
+ background-color: #EB5A46;
+ }
+ .o_tag_color_5 {
+ background-color: #A24689;
+ }
+ .o_tag_color_6 {
+ background-color: #0079BF;
+ }
+ .o_tag_color_7 {
+ background-color: #00C2E0;
+ }
+ .o_tag_color_8 {
+ background-color: #4CD98E;
+ }
+ .o_tag_color_9 {
+ background-color: #FF80CE;
+ }
+ .o_tag_color_10 {
+ background-color: #4D4D4D;
+ }
+}
+
+// Stars
+.o_priority {
+ display: inline-block;
+ padding: 0;
+ margin: 0;
+ vertical-align: middle;
+ > .o_priority_star {
+ display: inline-block;
+ font-size: 1.35em;
+ &:hover, &:focus {
+ text-decoration: none;
+ outline: none;
+ }
+
+ + .o_priority_star {
+ padding-left: 5px;
+ }
+
+ &.fa-star-o {
+ color: @odoo-main-color-muted;
+ }
+ &.fa-star {
+ color: gold;
+ }
+ }
+}
+
+// No content helper
+.oe_view.oe_cannot_create .oe_view_nocontent_create {
+ display: none;
+}
diff --git a/addons/web/static/src/less/views_extra.less b/addons/web/static/src/less/views_extra.less
new file mode 100644
index 00000000000..ad6f4c83017
--- /dev/null
+++ b/addons/web/static/src/less/views_extra.less
@@ -0,0 +1,33 @@
+// No content helper
+.oe_view_nocontent {
+ padding: 15px;
+ margin-top: 0;
+ color: #777777;
+ font-size: 125%;
+ max-width: 700px;
+ .oe_view_nocontent_create {
+ margin-top: 0;
+ padding-top: 35px;
+ color: #4c4c4c;
+ &:before {
+ content: "";
+ display: inline-block;
+ position: absolute;
+ width: 70px;
+ height: 80px;
+ margin-left: -70px;
+ margin-top: -50px;
+ background: transparent url(/web/static/src/img/view_empty_arrow.png) no-repeat 0px 0px;
+ }
+ }
+ > p {
+ padding-left: 78px;
+ }
+ .oe_empty_custom_dashboard {
+ background: transparent url(/web/static/src/img/graph_background.png) no-repeat 0 0;
+ margin-top: -15px;
+ padding: 100px 0 0 137px;
+ min-height: 327px;
+ margin-left: -15px;
+ }
+}
diff --git a/addons/web/static/src/less/notification.less b/addons/web/static/src/less/webclient.less
index 0c910dbc5c5..2f9878fbdc3 100644
--- a/addons/web/static/src/less/notification.less
+++ b/addons/web/static/src/less/webclient.less
@@ -1,3 +1,29 @@
+// ------------------------------------------------------------------
+// Typography
+// ------------------------------------------------------------------
+a {
+ color: @odoo-brand-optional;
+ &:hover {
+ color: darken(@odoo-brand-optional, 10%);
+ }
+}
+
+// ------------------------------------------------------------------
+// General
+// ------------------------------------------------------------------
+.o_web_client {
+ background-color: @odoo-webclient-background-color;
+}
+.o_text_overflow {
+ .o-text-overflow();
+}
+.o_hidden {
+ display: none!important;
+}
+
+// ------------------------------------------------------------------
+// Misc. widgets
+// ------------------------------------------------------------------
@notification-error-bg-color: #F16567;
@notification-info-bg-color: #FCFBEA;
.o_notification_manager {
@@ -5,7 +31,7 @@
max-width: 100%;
.o-position-absolute(@navbar-height, 0px);
- z-index: 50; // same as debug manager. Fixme: expose a variable
+ z-index: 1100; // Bootstrap modal z-index is 1050
.o_notification {
padding: 0;
@@ -49,3 +75,15 @@
}
}
}
+
+// Buttons
+.o_icon_button {
+ background-color: transparent;
+ border: 0;
+ padding: 0;
+ outline: none;
+}
+
+.oe_highlight {
+ .btn-primary;
+}
diff --git a/addons/web/static/src/less/webclient_extra.less b/addons/web/static/src/less/webclient_extra.less
new file mode 100644
index 00000000000..094670bf0ca
--- /dev/null
+++ b/addons/web/static/src/less/webclient_extra.less
@@ -0,0 +1,65 @@
+// ------------------------------------------------------------------
+// Checkboxes
+// ------------------------------------------------------------------
+div.o_checkbox {
+ display: inline-block;
+ vertical-align: sub;
+ > input + span {
+ display: none;
+ }
+}
+
+// ------------------------------------------------------------------
+// Inputs and selects
+// ------------------------------------------------------------------
+.o-input() {
+ border: 1px solid @odoo-form-lightsecondary;
+ border-radius: @border-radius-base;
+ padding: 2px 4px;
+ color: #1f1f1f;
+}
+input[type="text"], input[type="password"], input[type="number"], textarea, select {
+ .o-input();
+
+ width: 100%;
+ outline: none;
+ display: block;
+}
+select {
+ background: white;
+}
+
+// ------------------------------------------------------------------
+// Loading
+// ------------------------------------------------------------------
+.o_loading {
+ position: fixed;
+ top: 0;
+ right: 50%;
+ padding: 4px 12px;
+ background-color: @odoo-color-pink;
+ color: white;
+ text-align: center;
+ border-top: none;
+ border-bottom-right-radius: 8px;
+ border-bottom-left-radius: 8px;
+}
+
+// ------------------------------------------------------------------
+// Planner
+// ------------------------------------------------------------------
+// Because the `web_planner` module has to work with Odoo community and enterprise without
+// code duplication, fine-tune the display of it in the community webclient here
+#PlannerDialog {
+ top: 35px;
+ box-shadow: 0 3px 9px #666666;
+ padding-bottom: 44px;
+}
+
+// ------------------------------------------------------------------
+// User menu in navbar
+// ------------------------------------------------------------------
+#oe_main_menu_navbar .oe_user_menu_placeholder .o_user_menu .oe_topbar_name {
+ .o-text-overflow();
+ max-width: 150px;
+}
diff --git a/addons/web/static/src/less/webclient_layout.less b/addons/web/static/src/less/webclient_layout.less
new file mode 100644
index 00000000000..2dab3042aba
--- /dev/null
+++ b/addons/web/static/src/less/webclient_layout.less
@@ -0,0 +1,156 @@
+@odoo-submenu-width: 220px;
+
+.o_web_client {
+ .o-flex-display();
+ .o-flex-flow(column, nowrap);
+ overflow: hidden;
+
+ .navbar {
+ .o-flex(0, 0, auto);
+
+ li > a {
+ padding: 4px 8px;
+ margin-top: 2px;
+ font-size: 13px;
+ }
+
+ .oe_topbar_avatar {
+ max-height: 18px;
+ width: 18px;
+ }
+ }
+
+ > .o_main {
+ .o-flex(1, 1, auto);
+ .o-flex-display();
+
+ .o_sub_menu {
+ .o-flex(0, 0, @odoo-submenu-width);
+ .o-flex-display();
+ .o-flex-flow(column, nowrap);
+ border-right: 1px solid #afafb6;
+
+ .o_sub_menu_logo {
+ .o-flex(0, 0, auto);
+ text-align: center;
+ position: relative;
+
+ > img {
+ margin: 14px 0;
+ }
+
+ .oe_logo_edit {
+ position: absolute;
+ top: 1px;
+ width: 100%;
+ padding: 4px;
+ margin: 14px 0;
+ display: none;
+ color: #eee;
+ background: rgba(37,37,37,0.9);
+ }
+ &:hover .oe_logo_edit_admin {
+ display: block;
+ }
+ }
+
+ .o_sub_menu_content {
+ .o-flex(1, 1, auto);
+ height:100%;
+ overflow-y: auto;
+
+ .oe_secondary_menu_section {
+ font-weight: bold;
+ margin-left: 8px;
+ color: @odoo-brand-optional;
+ }
+ .oe_secondary_submenu {
+ margin: 3px 0px 10px;
+ line-height: 1.1em;
+ >li:not(.active) > a {
+ color: @odoo-main-text-color;
+ }
+ > li > a {
+ padding: 4px 4px 4px 18px;
+ > .badge {
+ margin-top: -1px;
+ }
+ }
+ .oe_secondary_submenu {
+ > li > a {
+ padding-left: 30px;
+ }
+ .oe_secondary_submenu > li > a {
+ padding-left: 42px;
+ }
+ }
+ .oe_menu_text {
+ .o-text-overflow();
+ max-width: 85%;
+ margin-top: 1px;
+ }
+ .oe_menu_toggler:before {
+ display: inline-block;
+ width: 0;
+ height: 0;
+ content: "&darr";
+ opacity: 0.5;
+ text-indent: -99999px;
+ vertical-align: top;
+ margin-left: -12px;
+ margin-top: 4px;
+ margin-right: 4px;
+ border-top: 4px solid transparent;
+ border-bottom: 4px solid transparent;
+ border-left: 4px solid #4c4c4c;
+ }
+ .oe_menu_opened:before {
+ margin-top: 6px;
+ margin-left: -16px;
+ margin-right: 4px;
+ border-left: 4px solid transparent;
+ border-right: 4px solid transparent;
+ border-top: 4px solid #4c4c4c;
+ }
+ }
+ }
+
+ .o_sub_menu_footer {
+ .o-flex(0, 0, auto);
+ text-align: center;
+
+ > a {
+ font-weight: bold;
+ > span {
+ color: @odoo-color-pink;
+ }
+ }
+ }
+ }
+
+ .o_main_content {
+ .o-flex(1, 1, auto);
+ .o-flex-display();
+ .o-flex-flow(column, nowrap);
+
+ .o_control_panel {
+ .o-flex(0, 0, auto);
+ }
+ .o_content {
+ .o-flex(1, 1, auto);
+ height: 100%;
+ overflow: auto;
+ position: relative;
+
+ .o_view_manager_content {
+ .o-position-absolute(0, 0, 0, 0); // Get the 100% height of its flex parent
+ height: 100%;
+
+ .o_view_manager_content {
+ position: static; // Reset position for nested view managers
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml
index a36b9b9685e..a551c7ee1f2 100644
--- a/addons/web/static/src/xml/base.xml
+++ b/addons/web/static/src/xml/base.xml
@@ -2,7 +2,7 @@
<templates id="template" xml:space="preserve">
<div t-name="EmptyComponent"/>
-<div t-name="Loading" class="oe_loading">Loading...</div>
+<div t-name="Loading" class="o_loading"/>
<t t-name="Notification">
<div class="o_notification" t-translation="off">
<a t-if="widget.sticky" class="fa fa-times o_close" href="#"/>
@@ -35,262 +35,275 @@
</div>
</t>
-<t t-name="ChangePassword">
- <form name="change_password_form" method="POST">
- <div class="oe_form">
- <table align="center">
+<form t-name="ChangePassword" name="change_password_form" method="POST">
+ <div class="o_form_view">
+ <table class="o_group o_inner_group o_label_nowrap">
<tr>
- <td class="oe_form_group_cell oe_form_group_cell_label"><label for="old_pwd" class="oe_form_label">Old Password:</label></td>
- <td class="oe_form_group_cell"><input type="password" name="old_pwd"
- minlength="1" autofocus="autofocus"/></td>
+ <td class="o_td_label"><label for="old_pwd" class="o_form_label">Old Password</label></td>
+ <td width="100%"><input type="password" class="o_form_field o_form_input" name="old_pwd" minlength="1" autofocus="autofocus"/></td>
</tr>
<tr>
- <td class="oe_form_group_cell oe_form_group_cell_label"><label for="new_password" class="oe_form_label">New Password:</label></td>
- <td class="oe_form_group_cell"><input type="password" name="new_password"
- minlength="1"/></td>
+ <td class="o_td_label"><label for="new_password" class="o_form_label">New Password</label></td>
+ <td width="100%"><input type="password" class="o_form_field o_form_input" name="new_password" minlength="1"/></td>
</tr>
<tr>
- <td class="oe_form_group_cell oe_form_group_cell_label"><label for="confirm_pwd" class="oe_form_label">Confirm New Password:</label></td>
- <td class="oe_form_group_cell"><input type="password" name="confirm_pwd"
- minlength="1"/></td>
- </tr>
- <tr>
- <td colspan="2" align="right">
- <button type="button" class='oe_button oe_form_button'>Change Password</button>
- <button type="button" class="oe_button oe_form_button_cancel oe_form_button oe_link" href="javascript:void(0)"><span>Cancel</span></button>
- </td>
+ <td class="o_td_label"><label for="confirm_pwd" class="o_form_label">Confirm New Password</label></td>
+ <td width="100%"><input type="password" class="o_form_field o_form_input" name="confirm_pwd" minlength="1"/></td>
</tr>
</table>
- </div>
- </form>
-</t>
-<t t-name="Menu.needaction_counter">
- <div id="menu_counter" class="badge pull-right">
- <t t-if="widget.needaction_counter &gt; 99"> 99+ </t>
- <t t-if="widget.needaction_counter &lt;= 99"> <t t-esc="widget.needaction_counter"/> </t>
+ <button type="button" class="btn btn-sm btn-primary oe_form_button">Change Password</button>
+ <button type="button" class="btn btn-sm btn-default oe_form_button oe_form_button_cancel" href="javascript:void(0)">Cancel</button>
</div>
-</t>
-
-<t t-name="UserMenu">
- <li class="dropdown">
- <a href="#" class="dropdown-toggle" data-toggle="dropdown">
- <img class="oe_topbar_avatar" t-att-data-default-src="_s + '/web/static/src/img/user_menu_avatar.png'"/>
- <span class="oe_topbar_name"/> <b class="caret"></b>
- </a>
- <ul class="dropdown-menu">
- <li><a href="#" data-menu="documentation">Documentation</a></li>
- <li><a href="#" data-menu="support">Support</a></li>
- <li><a href="#" data-menu="about">About</a></li>
- <li class="divider"/>
- <li><a href="#" data-menu="settings">Preferences</a></li>
- <li><a href="#" data-menu="account">My Odoo.com account</a></li>
- <li><a href="#" data-menu="logout">Log out</a></li>
- </ul>
- </li>
-</t>
+</form>
-<div t-name="UserMenu.about" class="oe_about">
- <div class="container-fluid">
- <div class="row">
- <div class="col-sm-offset-2 col-md-offset-2 col-sm-8 col-md-8 user-details">
- <div class="user-image">
- <img src="/web/static/src/img/logo2.png" alt="Odoo (Formerly OpenERP)" title="Odoo (Formerly OpenERP)" class="img-circle"/>
- </div>
- <div class="user-info-block">
- <div class="user-heading">
- <h3>
- Version <t t-esc="db_info.server_version"/>
- (Community Edition)
- </h3>
- <t t-if="db_info.expiration_date">
- <h5>Database expiration: <t t-esc="new moment(db_info.expiration_date).format('LL')"/></h5>
+<div t-name="WebClient.database_expiration_panel">
+ <div class="database_expiration_panel" id="announcement_bar_table">
+ <div t-attf-class="alert alert-#{diffDays&lt;6?'danger':(diffDays&lt;16?'warning':'info')}" role="alert">
+ <a href="#" class="oe_instance_hide_panel pull-right" t-translation="off">&amp;times;</a>
+ <span>
+ <span class="oe_instance_expires"></span>
+ <span class="oe_instance_register">
+ <t t-if="!has_mail">
+ You will be able to register your database once you have installed your first app.
+ </t>
+ <t t-if="has_mail">
+ <t t-if="diffDays == 30">
+ <t t-set="delay">1 month</t>
</t>
- </div>
- <div class="user-body">
- <div class="tab-content">
- <div id="settings" class="tab-pane active">
- <h4>Copyright © 2004-2015 Odoo S.A.</h4>
- <p>Odoo is a trademark of <a target="_blank" href="https://www.odoo.com">Odoo S.A.</a></p>
- <p>Licenced under the terms of <a target="_blank" href="http://www.gnu.org/licenses/lgpl.html">GNU Lesser General Public License</a></p>
- <p>For more information visit <a target="_blank" href="https://www.odoo.com">Odoo.com</a></p>
- <p>
- <a href="https://www.odoo.com/web/about/facebook"><i class="fa fa-facebook-square fa-3x social-fb"></i></a>
- <a href="https://www.odoo.com/web/about/twitter"><i class="fa fa-twitter-square fa-3x social-tw"></i></a>
- <a href="https://www.odoo.com/web/about/googleplus"><i class="fa fa-google-plus-square fa-3x social-gp"></i></a>
- <a href="https://www.odoo.com/web/about/linkedin"><i class="fa fa-linkedin-square fa-3x social-lk"></i></a>
- </p>
- </div>
- </div>
- </div>
+ <t t-if="diffDays != 30">
+ <t t-set="delay"><t t-esc="diffDays"/> days</t>
+ </t>
+ <t t-if="diffDays &gt; 0">
+ <t t-if="dbexpiration_reason == 'demo'">
+ This demo database will expire in <span t-esc="delay"/>.
+ </t>
+ <t t-if="dbexpiration_reason != 'demo'">
+ This database will expire in <span t-esc="delay"/>.
+ </t>
+ </t>
+ <t t-if="diffDays &lt; 1">
+ This database has expired.
+ </t>
+ <!-- only show corrective actions to an admin (group_system) -->
+ <t t-if="warning=='admin'">
+ <t t-if="dbexpiration_reason == 'trial' or dbexpiration_reason == 'demo' or dbexpiration_reason === false">
+ <a class="oe_instance_register_show" href="#">Register your subscription</a> or <a class="oe_instance_buy" href="#">buy a subscription</a>.
+ </t>
+ <t t-if="dbexpiration_reason == 'renewal'">
+ <a class="oe_instance_renew" href="#">Renew your subscription</a>.
+ </t>
+ <t t-if="dbexpiration_reason == 'upsell'">
+ You have more users than your subscription allows.<br/>
+ <a class="oe_instance_upsell" href="#">Add more users</a>
+ </t>
+ </t>
+ <t t-if="warning=='user'">
+ Log in as an administrator to correct the issue.
+ </t>
+ </t>
+ </span>
+ </span>
+ <span class="oe_instance_register oe_instance_success">
+ Thank you, your registration was successful! Your database is valid until <span class="valid_date"/>.
+ </span>
+ <span class="oe_instance_register oe_instance_error">
+ Something went wrong while registering your database. You can try again or contact our support at <a href='mailto:help@odoo.com' t-translation="off">help@odoo.com</a>.
+ </span>
+ <form class="form-inline oe_instance_register oe_instance_register_form">
+ <br/>
+ <div class="form-group">
+ <label for="enterprise_code">Subscription Code: </label>
+ <input type="text" class="form-control" id="enterprise_code"
+ placeholder="Paste code here"
+ title="Your subscription code"/>
</div>
- </div>
- </div>
- <div class="row" t-if="!debug">
- <div class="col-sm-12 col-md-12">
- <a class="pull-right oe_activate_debug_mode" href="?debug" >Activate the developer mode</a>
- </div>
+ <button class="btn btn-sm btn-primary" id="confirm_enterprise_code">Register</button>
+ </form>
</div>
</div>
</div>
-<t t-name="WebClient.timezone_warning">
- <i class="fa fa-exclamation-triangle oe_tz_warning"></i>
-</t>
-
-<t t-name="EmbedClient">
- <div class="openerp">
- <div class="oe_application"></div>
- </div>
-</t>
-
-<div t-name="ActionManager" class="oe_application" />
+<div t-name="ActionManager" class="o_content"/>
<t t-name="ControlPanel">
- <div class="oe-control-panel">
- <div class="container-fluid">
- <div class="row">
- <div class="col-md-6 oe-cp-title">
- <ol class="oe-view-title breadcrumb">
- </ol>
- </div>
- <div class="oe-cp-search-view col-md-6" />
- </div>
- <div class="row">
- <div class="col-md-6 oe-button-column">
- <div class="oe-cp-buttons"></div>
- <div class="oe-cp-sidebar"></div>
- </div>
- <div class="col-md-6">
- <div class="oe-search-options btn-group"/>
- <div class="oe-right-toolbar">
- <div class="oe-cp-pager"></div>
- <div class="oe-cp-switch-buttons btn-group btn-group-sm"></div>
- </div>
- </div>
- </div>
+ <div class="o_control_panel">
+ <ol class="breadcrumb"/>
+ <div class="o_cp_searchview"/>
+ <div class="o_cp_left">
+ <div class="o_cp_buttons"/>
+ <div class="o_cp_sidebar"/>
+ </div>
+ <div class="o_cp_right">
+ <div class="btn-group o_search_options"/>
+ <div class="o_cp_pager"/>
+ <div class="btn-group btn-group-sm o_cp_switch_buttons"/>
</div>
</div>
</t>
<t t-name="X2ManyControlPanel">
- <div class="oe-x2m-control-panel container-fluid">
- <div class="oe-cp-buttons pull-left"/>
- <div class="oe-cp-pager pull-right"/>
+ <div class="o_x2m_control_panel">
+ <div class="o_cp_buttons"/>
+ <div class="o_cp_pager"/>
</div>
</t>
-<div t-name="ViewManager" class="oe-view-manager">
- <div class="oe-view-manager-content">
- <t t-foreach="widget.views" t-as="view">
- <div t-attf-class="oe-view-manager-view-#{view}"/>
- </t>
- </div>
-</div>
<t t-name="ViewManager.switch-buttons">
<t t-foreach="views" t-as="view">
<button type="button" t-att-accesskey="view.accesskey"
- t-attf-class="btn btn-default fa #{view.icon} oe-cp-switch-#{view.type}"
+ t-attf-class="btn btn-icon fa fa-lg #{view.icon} o_cp_switch_#{view.type}"
t-att-data-view-type="view.type" t-att-title="view.label"/>
</t>
</t>
<t t-name="WebClient.DebugManager">
- <li class="oe_debug_manager">
- <a href="#" title="Open Debug Menu" class="dropdown-toggle oe_debug_button" data-toggle="dropdown">
+ <li class="o_debug_manager">
+ <a href="#" title="Open Developer Tools" class="dropdown-toggle" data-toggle="dropdown">
<span class="fa fa-bug"/>
<b class="caret"/>
</a>
- <ul class="dropdown-menu js_debug_dropdown" role="menu"/>
+ <ul class="dropdown-menu o_debug_dropdown" role="menu"/>
</li>
</t>
-<t t-name="WebClient.DebugDropdown">
- <t t-if="active_view.type === 'form'">
- <li class="oe_metadata"><a href="#" data-action="get_metadata">View Metadata</a></li>
- <li class="oe_layout"><a href="#" data-action="toggle_layout_outline">Toggle Form Layout Outline</a></li>
- <li class="oe_defaults"><a href="#" data-action="set_defaults">Set Defaults</a></li>
- </t>
- <li class="oe_defaults"><a href="#" data-action="perform_js_tests">JS Tests</a></li>
- <li class="oe_fields"><a href="#" data-action="get_view_fields">View Fields</a></li>
- <li class="oe_fvg"><a href="#" data-action="fvg">Fields View Get</a></li>
- <li class="oe_filters"><a href="#" data-action="manage_filters">Manage Filters</a></li>
- <t t-if="is_admin">
- <li class="oe_translate"><a href="#" data-action="translate">Technical Translation</a></li>
- <li class="oe_edit_view"><a href="#" data-action="edit" data-model="ir.ui.view" t-att-data-id="active_view.controller.fields_view.view_id">Edit <t t-esc="_.str.capitalize(view.fields_view.type)"/> View</a></li>
- <li class="oe_edit_searchview" t-if="searchview"><a href="#" data-action="edit" data-model="ir.ui.view" t-att-data-id="searchview.view_id">Edit SearchView</a></li>
- <li class="oe_edit_action" t-if="action"><a href="#" data-action="edit" t-att-data-model="action.type" t-att-data-id="action.id">Edit Action</a></li>
- <li class="oe_edit_workflow"><a href="#" data-action="edit_workflow">Edit Workflow</a></li>
- <li class="oe_print_workflow"><a href="#" data-action="print_workflow">Print Workflow</a></li>
- <li class="divider"/>
- <li class="oe_split_assets"><a href="#" data-action="split_assets">Activate Assets Debugging</a></li>
+
+<t t-name="WebClient.DebugManager.Global">
+ <li t-if="manager._features_group"><a href="#" data-action="toggle_technical_features">
+ <t t-if="manager._has_features">
+ Disable Technical Features
+ </t>
+ <t t-if="!manager._has_features">
+ Enable Technical Features
+ </t>
+ </a></li>
+ <li><a href="#" data-action="split_assets">Activate Assets Debugging</a></li>
+ <li class="divider"/>
+ <li><a href="#" data-action="perform_js_tests">Run JS Tests</a></li>
+ <li><a href="#" data-action="select_view">Open View</a></li>
+ <li><a href="#" data-action="start_tour">Start tour</a></li>
+ <t t-if="manager._events">
<li class="divider"/>
- <li class="oe_leave"><a href="#" data-action="leave_debug">Leave Debug Mode</a></li>
+ <li><a href="#" data-action="show_timelines">Toggle Timelines</a></li>
+ <li><a href="#" data-action="requests_clear">Clear Events</a></li>
</t>
+ <li class="divider o_debug_leave_section"/>
+ <li><a href="#" data-action="leave_debug_mode">Leave the Developer Tools</a></li>
</t>
-<t t-name="WebClient.DebugViewLog">
- <div class="oe_debug_menu_log">
- <table class="table table-condensed table-striped">
- <tr>
- <th>ID:</th>
- <td><t t-esc="perm.id"/></td>
- </tr>
- <tr>
- <th>XML ID:</th>
- <td><t t-esc="perm.xmlid or '/'"/></td>
- </tr>
- <tr>
- <th>No Update:</th>
- <td><t t-esc="perm.noupdate"/></td>
- </tr>
- <tr>
- <th>Creation User:</th>
- <td><t t-esc="format(perm.create_uid, { 'type' : 'many2one' }, '/')"/></td>
- </tr>
- <tr>
- <th>Creation Date:</th>
- <td><t t-esc="format(perm.create_date, { 'type' : 'datetime' }, '/')"/></td>
- </tr>
+
+<t t-name="WebClient.DebugManager.ToursDialog">
+ <div>
+ <table class="table table-condensed table-striped table-responsive">
<tr>
- <th>Latest Modification by:</th>
- <td><t t-esc="format(perm.write_uid, { 'type' : 'many2one' }, '/')"/></td>
+ <th>ID</th>
+ <th>Name</th>
+ <th>Path</th>
+ <th/>
</tr>
- <tr>
- <th>Latest Modification Date:</th>
- <td><t t-esc="format(perm.write_date, { 'type' : 'datetime' }, '/')"/></td>
+
+ <tr t-foreach="tours" t-as="tour">
+ <td><t t-esc="tours[tour].id"/></td>
+ <td><t t-esc="tours[tour].name"/></td>
+ <td><t t-esc="tours[tour].path"/></td>
+ <td><button type="button" class="btn btn-sm btn-primary fa fa-play o_start_tour" t-att-data-id="tours[tour].id"/></td>
</tr>
</table>
</div>
</t>
-<span t-name="ViewPager">
- <div class="oe_pager_value" style="display: inline-block">
- <t t-raw="0"/>
- </div>
- <div class="btn-group btn-group-sm oe-pager-buttons" style="display: inline-block">
- <!-- accesskeys not wanted in X2Many widgets -->
- <t t-if="!widget.x2m">
- <t t-set="att_prev" t-value="{'accesskey': 'O'}" />
- <t t-set="att_next" t-value="{'accesskey': 'P'}" />
+<t t-name="WebClient.DebugManager.Action">
+ <t t-if="action">
+ <li class="divider"/>
+ <li><a href="#" data-action="edit" t-att-data-model="action.type" t-att-data-id="action.id">Edit Action</a></li>
+ <t t-if="action.res_model">
+ <li><a href="#" data-action="get_view_fields">View Fields</a></li>
+ <li><a href="#" data-action="manage_filters">Manage Filters</a></li>
+ <li t-if="manager._is_admin"><a href="#" data-action="edit_workflow">Edit Workflow</a></li>
+ <li><a href="#" data-action="translate">Technical Translation</a></li>
</t>
- <a class="fa fa-chevron-left btn btn-default oe-pager-button" t-att="att_prev" type="button" data-pager-action="previous"></a>
- <a class="fa fa-chevron-right btn btn-default oe-pager-button" t-att="att_next" type="button" data-pager-action="next"></a>
- </div>
-</span>
+ </t>
+</t>
+<t t-name="WebClient.DebugManager.Action.Fields">
+ <dl><t t-foreach="fields" t-as="field">
+ <dt><h4><t t-esc="field"/></h4></dt>
+ <dd>
+ <dl><ul><li t-foreach="field_value" t-as="attribute">
+ <strong><t t-esc="attribute"/></strong>:
+ <t t-esc="attribute_value"/>
+ </li></ul></dl>
+ </dd>
+ </t></dl>
+</t>
+<t t-name="WebClient.DebugManager.View">
+ <t t-if="view">
+ <li class="divider"/>
+ <t t-if="view.type === 'form'">
+ <li><a href="#" data-action="set_defaults">Set Defaults</a></li>
+ <t t-if="view.controller.get_selected_ids().length === 1">
+ <li><a href="#" data-action="get_metadata">View Metadata</a></li>
+ <li><a href="#" data-action="print_workflow">Print Workflow</a></li>
+ </t>
+ </t>
+ <li><a href="#" data-action="fvg">Fields View Get</a></li>
+ <t t-if="can_edit">
+ <li><a href="#" data-action="edit" data-model="ir.ui.view" t-att-data-id="view.controller.fields_view.view_id">Edit <t t-esc="_.str.capitalize(view.controller.fields_view.type)"/>View</a></li>
+ <li t-if="searchview and searchview.$el.is(':visible')"><a href="#" data-action="edit" data-model="ir.ui.view" t-att-data-id="searchview.fields_view.view_id">Edit SearchView</a></li>
+ </t>
+ </t>
+</t>
+<t t-name="WebClient.DebugViewLog">
+ <table class="table table-condensed table-striped">
+ <tr>
+ <th>ID:</th>
+ <td><t t-esc="perm.id"/></td>
+ </tr>
+ <tr>
+ <th>XML ID:</th>
+ <td><t t-esc="perm.xmlid or '/'"/></td>
+ </tr>
+ <tr>
+ <th>No Update:</th>
+ <td><t t-esc="perm.noupdate"/></td>
+ </tr>
+ <tr>
+ <th>Creation User:</th>
+ <td><t t-esc="format(perm.create_uid, { 'type' : 'many2one' }, '/')"/></td>
+ </tr>
+ <tr>
+ <th>Creation Date:</th>
+ <td><t t-esc="format(perm.create_date, { 'type' : 'datetime' }, '/')"/></td>
+ </tr>
+ <tr>
+ <th>Latest Modification by:</th>
+ <td><t t-esc="format(perm.write_uid, { 'type' : 'many2one' }, '/')"/></td>
+ </tr>
+ <tr>
+ <th>Latest Modification Date:</th>
+ <td><t t-esc="format(perm.write_date, { 'type' : 'datetime' }, '/')"/></td>
+ </tr>
+ </table>
+</t>
+<div t-name="WebClient.DebugManager.RequestsOverlay" class="o_debug_manager_overlay">
+ <header>
+ <!-- enough height to display all tracks + 1px spacing between tracks -->
+ <t t-set="canvas_height" t-value="widget.TRACKS * (widget.TRACK_WIDTH + 1)"/>
+ <canvas t-att-height="canvas_height" id="o_debug_requests_summary"/>
+ <!-- transparent overlay to display selected range -->
+ <canvas t-att-height="canvas_height" id="o_debug_requests_selector"/>
+ </header>
+ <div class="o_debug_requests"/>
+ <div class="o_debug_tooltip"/>
+</div>
-<div t-name="Sidebar" class="oe_sidebar btn-group">
+<t t-name="Sidebar">
<t t-foreach="widget.sections" t-as="section">
- <div class="oe_form_dropdown_section btn-group btn-group-sm">
- <button type="button" class="btn btn-default dropdown-toggle"
- t-if="section.name != 'buttons'"
- data-toggle="dropdown">
+ <div class="btn-group o_dropdown">
+ <button t-if="section.name != 'buttons'" class="o_dropdown_toggler_btn btn btn-sm dropdown-toggle" data-toggle="dropdown">
<t t-if="section.name == 'files'" t-raw="widget.items[section.name].length || ''"/>
- <t t-esc="section.label"/>
- <span class="caret"></span>
+ <t t-esc="section.label"/> <span class="caret"/>
</button>
<t t-if="section.name == 'buttons'" t-foreach="widget.items[section.name]" t-as="item" t-att-class="item.classname">
- <button type="button" t-att-title="item.title or ''" t-att-data-section="section.name" t-att-data-index="item_index" t-att-href="item.url"
- target="_blank" class="oe_sidebar_button oe_highlight">
+ <a t-att-title="item.title or ''" t-att-data-section="section.name" t-att-data-index="item_index" t-att-href="item.url" target="_blank">
<t t-raw="item.label"/>
- </button>
+ </a>
</t>
<ul class="dropdown-menu" role="menu">
<li t-foreach="widget.items[section.name]" t-as="item" t-att-class="item.classname">
@@ -310,14 +323,12 @@
<t t-raw="item.write_uid[1] + ' ' + item.write_date"/>
</t>
</t>
- <a class="oe_file_attachment" t-att-title="item.title or ''" t-att-data-section="section.name" t-att-data-index="item_index" t-att-href="item.url">
+ <a t-att-title="item.title or ''" t-att-data-section="section.name" t-att-data-index="item_index" t-att-href="item.url">
<t t-raw="item.label"/>
- <span t-if="section.name == 'files' and widget.options.editable and !item.callback" class="oe_sidebar_delete_item" t-att-data-id="item.id" title="Delete this attachment">
- <i class="fa fa-trash-o"/>
- </span>
+ <span t-if="section.name == 'files' and widget.options.editable and !item.callback" class="fa fa-trash-o o_sidebar_delete_attachment" t-att-data-id="item.id" title="Delete this attachment"/>
</a>
</li>
- <li t-if="section.name == 'files' and widget.options.editable" class="oe_sidebar_add_attachment">
+ <li t-if="section.name == 'files' and widget.options.editable" class="o_sidebar_add_attachment">
<t t-call="HiddenInputFile">
<t t-set="fileupload_id" t-value="widget.fileupload_id"/>
<t t-set="fileupload_action" t-translation="off">/web/binary/upload_attachment</t>
@@ -330,12 +341,11 @@
</ul>
</div>
</t>
-</div>
+</t>
<t t-name="TreeView">
- <select t-if="toolbar" style="width: 30%">
- </select>
- <table class="oe_tree_table oe-treeview-table">
+ <select t-if="toolbar" style="width: 30%"/>
+ <table class="o_treeview_table">
<thead>
<tr>
<th t-foreach="fields_view" t-as="field"
@@ -356,7 +366,7 @@
t-att-data-row-parent-id="row_parent_id">
<t t-set="children" t-value="record[children_field]"/>
<t t-set="class" t-value="children and children.length ? 'treeview-tr' : 'treeview-td'"/>
- <t t-set="rank" t-value="'oe-treeview-first'"/>
+ <t t-set="rank" t-value="'o_treeview_first'"/>
<t t-set="style" t-value="'background-position: ' + 19*(level) + 'px; padding-left: ' + (4 + 19*(level)) + 'px;'"/>
<td t-foreach="fields_view" t-as="field"
@@ -375,49 +385,47 @@
</td>
</tr>
-<table t-name="ListView" class="oe_list_content">
- <t t-set="columns_count" t-value="visible_columns.length + (options.selectable ? 1 : 0) + (options.deletable ? 1 : 0)"/>
- <thead>
- <tr t-if="(!!options.action_buttons and !options.$buttons) or (!!options.pager and !options.$pager)">
- <th t-att-colspan="columns_count">
- <div class="oe_list_buttons"/>
- <div class="oe_list_sidebar"/>
- <div class="oe_list_pager"/>
- </th>
- </tr>
- <tr t-if="options.header" class="oe_list_header_columns">
- <t t-foreach="columns" t-as="column">
- <th t-if="column.meta">
- <t t-esc="column.string"/>
+<div t-name="ListView" class="table-responsive">
+ <table class="o_list_view table table-condensed table-striped">
+ <t t-set="columns_count" t-value="visible_columns.length + (options.selectable ? 1 : 0) + (options.deletable ? 1 : 0)"/>
+ <thead>
+ <tr t-if="options.header">
+ <t t-foreach="columns" t-as="column">
+ <th t-if="column.meta">
+ <t t-esc="column.string"/>
+ </th>
+ </t>
+ <th t-if="options.selectable" class="o_list_record_selector" width="1">
+ <div class="o_checkbox">
+ <input type="checkbox"/><span/>
+ </div>
</th>
- </t>
- <th t-if="options.selectable" width="1" >
- <input type="checkbox" class="oe_list_record_selector"/>
- </th>
- <t t-foreach="columns" t-as="column">
- <th t-if="!column.meta and column.invisible !== '1'" t-att-data-id="column.id"
- t-attf-class="oe_list_header_#{column.widget or column.type} #{((options.sortable and column.tag !== 'button') ? 'oe_sortable' : null)}"><div>
- <t t-if="column.tag !== 'button'"><t t-esc="column.string"/></t>
- </div></th>
- </t>
- <th t-if="options.deletable" class="oe_list_record_delete" width="13px"/>
- </tr>
- </thead>
- <tfoot>
- <tr>
- <td t-if="options.selectable"/>
- <td t-foreach="aggregate_columns" t-as="column" class="oe_list_footer oe_number"
- t-att-data-field="column.id" t-att-title="column.label">
- </td>
- <td t-if="options.deletable" class="oe_list_record_delete"/>
- </tr>
- </tfoot>
-</table>
+ <t t-foreach="columns" t-as="column">
+ <th t-if="!column.meta and column.invisible !== '1'" t-att-data-id="column.id"
+ t-attf-class="#{((options.sortable and column.sortable and column.tag !== 'button') ? 'o_column_sortable' : '')}"
+ t-att-width="column.width()">
+ <t t-if="column.tag !== 'button'"><t t-raw="column.heading()"/></t>
+ </th>
+ </t>
+ <th t-if="options.deletable" class="o_list_record_delete"/>
+ </tr>
+ </thead>
+ <tfoot>
+ <tr>
+ <td t-if="options.selectable"/>
+ <td t-foreach="aggregate_columns" t-as="column" t-att-data-field="column.id" t-att-title="column.label">
+ </td>
+ <td t-if="options.deletable" class="o_list_record_delete"/>
+ </tr>
+ </tfoot>
+ </table>
+</div>
+
<t t-name="ListView.buttons">
<t t-if="!widget.no_leaf and widget.options.action_buttons !== false">
- <div class="oe_list_buttons">
+ <div class="o_list_buttons">
<t t-if="widget.options.addable and widget.is_action_enabled('create')">
- <button type="button" class="btn btn-sm btn-primary o_list_button_add" accesskey="C">
+ <button type="button" class="btn btn-primary btn-sm o_list_button_add" accesskey="C">
<t t-esc="widget.options.addable"/>
</button>
</t>
@@ -430,14 +438,13 @@
</div>
</t>
</t>
-<t t-name="ListView.pager" t-if="!widget.no_leaf and widget.options.pager !== false" t-call="ViewPager">
- <span class="oe_list_pager_state"></span>
-</t>
+
<t t-name="ListView.rows" t-foreach="records.length" t-as="index">
<t t-call="ListView.row">
<t t-set="record" t-value="records.at(index)"/>
</t>
</t>
+
<tr t-name="ListView.row"
t-att-data-id="record.get('id')"
t-attf-style="#{(view.fonts || view.colors) ? view.style_for(record) : ''}"
@@ -446,30 +453,34 @@
<t t-foreach="columns" t-as="column">
<td t-if="column.meta"> </td>
</t>
- <th t-if="options.selectable" class="oe_list_record_selector" width="1">
+ <td t-if="options.selectable" class="o_list_record_selector">
<t t-set="checked" t-value="options.select_view_id == record.get('id') ? 'checked' : null"/>
<input t-if="options.radio" type="radio" name="radiogroup" t-att-checked="checked"/>
- <input t-if="!options.radio" type="checkbox" name="radiogroup" t-att-checked="checked"/>
- </th>
+ <div t-if="!options.radio" class="o_checkbox">
+ <input type="checkbox" name="radiogroup" t-att-checked="checked"/><span/>
+ </div>
+ </td>
<t t-foreach="columns" t-as="column">
<t t-set="number" t-value="column.type === 'integer' or column.type == 'float' or column.type == 'monetary'"/>
+ <t t-set="text" t-value="column.type === 'text'"/>
<t t-set="modifiers" t-value="column.modifiers_for(asData)"/>
<td t-if="!column.meta and column.invisible !== '1'" t-att-title="column.help"
- t-attf-class="oe_list_field_cell oe_list_field_#{column.widget or column.type} #{number ? 'oe_number' : ''} #{column.tag === 'button' ? 'oe-button' : ''} #{modifiers.readonly ? 'oe_readonly' : ''} #{modifiers.required ? 'oe_required' : ''}"
+ t-attf-class="#{modifiers.readonly ? 'o_readonly' : ''} #{number ? 'o_list_number' : ''} #{text ? 'o_list_text' : ''} #{column.id === 'sequence' ? 'o_handle_cell' : ''} #{column.tag === 'button' ? 'o_list_button' : ''}"
t-att-data-field="column.id"
><t t-raw="render_cell(record, column)"/></td>
</t>
- <td t-if="options.deletable" class='oe_list_record_delete' width="13px">
+ <td t-if="options.deletable" class='o_list_record_delete'>
<span name="delete" class="fa fa-trash-o"/>
</td>
</tr>
+
<button t-name="ListView.row.text_button" type="button"
t-att-title="widget.string" t-att-disabled="disabled || undefined"
t-att-class="disabled ? 'oe_list_button_disabled btn_txt oe_link' : 'btn_txt oe_link'"
><t t-esc="widget.string"/></button>
<button t-name="ListView.row.button" type="button"
t-att-title="widget.string" t-att-disabled="disabled || undefined"
- t-att-class="disabled ? 'oe_list_button_disabled' : ''"
+ t-attf-class="o_icon_button #{disabled ? 'oe_list_button_disabled' : ''}"
><img t-if="!widget.icon.indexOf('fa-') == 0" t-attf-src="#{prefix}/web/static/src/img/icons/#{widget.icon}.png"
t-att-alt="widget.string"/><i t-if="widget.icon.indexOf('fa-') == 0" t-attf-class="fa #{widget.icon}" t-att-title="widget.string"/>
</button>
@@ -483,34 +494,27 @@
</t>
</t>
-<t t-name="FormView">
- <div class="oe_formview">
- <div class="oe_form_buttons"/>
- <div class="oe_form_sidebar"/>
- <div class="oe_form_pager"/>
- <div class="oe_form_container"/>
- </div>
-</t>
<t t-name="FormView.buttons">
<div class="o_form_buttons_view">
- <button t-if="widget.is_action_enabled('edit')"
- type="button"
- class="oe_form_button_edit btn btn-default btn-sm" accesskey="E">
+ <button t-if="widget.is_action_enabled('edit')" type="button"
+ class="btn btn-primary btn-sm o_form_button_edit" accesskey="E">
Edit
</button>
- <button t-if="widget.is_action_enabled('create')"
- type="button" class="oe_form_button_create btn btn-default btn-sm"
- accesskey="C">
+ <button t-if="widget.is_action_enabled('create')" type="button"
+ class="btn btn-default btn-sm o_form_button_create" accesskey="C">
Create
</button>
</div>
- <span class="o_form_buttons_edit">
- <button type="button" class="oe_form_button_save btn btn-primary btn-sm" accesskey="S">Save</button>
- <button type="button" class="oe_form_button_cancel btn btn-sm btn-default" accesskey="D">Discard</button>
- </span>
-</t>
-<t t-name="FormView.pager" t-if="widget.options.pager !== false" t-call="ViewPager">
- <span class="oe_form_pager_state"></span>
+ <div class="o_form_buttons_edit">
+ <button type="button"
+ class="btn btn-primary btn-sm o_form_button_save" accesskey="S">
+ Save
+ </button>
+ <button type="button"
+ class="btn btn-default btn-sm o_form_button_cancel" accesskey="D">
+ Discard
+ </button>
+ </div>
</t>
<form t-name="FormView.set_default">
<t t-set="args" t-value="widget.args"/>
@@ -574,20 +578,23 @@
</div>
</t>
<t t-name="FormRenderingSheet">
- <div class="oe_form_sheetbg">
- <div t-attf-class="oe_form_sheet oe_form_sheet_width #{classnames}">
- </div>
+ <div class="o_form_sheet_bg">
+ <div t-attf-class="o_form_sheet #{classnames}"/>
</div>
</t>
-<t t-name="FormRenderingGroup">
+<div t-name="FormRenderingOuterGroup" class="o_group">
<t t-if="string" t-call="FormRenderingSeparator"/>
- <table border="0" cellpadding="0" cellspacing="0" t-attf-class="oe_form_group #{classnames}"/>
-</t>
+</div>
+<table t-name="FormRenderingInnerGroup" class="o_group o_inner_group">
+ <t t-if="string">
+ <tr><td><t t-call="FormRenderingSeparator"/></td></tr>
+ </t>
+</table>
<t t-name="FormRenderingNotebook">
- <div class="oe_clear">
+ <div class="o_notebook">
<ul t-attf-class="nav nav-tabs #{classnames}" role="tablist">
<li t-foreach="pages" t-as="page" t-att-modifiers="page.modifiers">
- <a role="tab" t-attf-href="##{page.id}" t-att-accesskey="page.accesskey" data-toggle="tab">
+ <a role="tab" t-attf-href="##{page.id}" t-att-accesskey="page.accesskey" data-toggle="tab" disable_anchor="true">
<t t-esc="page.string"/>
</a>
</li>
@@ -600,101 +607,96 @@
</div>
</t>
<t t-name="FormRenderingSeparator">
- <div t-attf-class="oe_horizontal_separator oe_clear #{classnames}">
+ <div t-attf-class="o_horizontal_separator">
<t t-esc="string"/>
</div>
</t>
<t t-name="FormRenderingLabel">
- <label t-att-for="_for"
- t-attf-class="#{classnames} oe_form_label#{help ? '_help' : ''} oe_align_#{align}">
+ <label t-att-for="_for"
+ t-attf-class="#{classnames} o_form_label #{help ? 'o_form_label_help ' : ''}">
<t t-esc="string"/>
</label>
</t>
<t t-name="GraphView.buttons">
- <div class="btn-group btn-group-sm">
- <button class="btn btn-default fa fa-bar-chart-o oe-bar-mode" title="Bar Chart"></button>
- <button class="btn btn-default fa fa-line-chart oe-line-mode" title="Line Chart"></button>
- <button class="btn btn-default fa fa-pie-chart oe-pie-mode" title="Pie Chart"></button>
- </div>
- <div class="btn-group btn-group-sm">
- <button class="btn btn-default dropdown-toggle" data-toggle="dropdown">
- Measure <span class="caret"/>
+ <div class="btn-group btn-group-sm" role="group">
+ <button class="btn btn-primary btn-sm dropdown-toggle" data-toggle="dropdown">
+ Measures <span class="caret"/>
</button>
- <ul class="oe-measure-list dropdown-menu">
+ <ul class="dropdown-menu o_graph_measures_list">
<li t-foreach="measures" t-as="measure" t-att-data-field="measure[0]">
- <a><t t-esc="measure[1].string"/></a>
+ <a href="#"><t t-esc="measure[1].string"/></a>
</li>
<li class="divider"></li>
- <li data-field="__count__"><a>Quantity</a></li>
+ <li data-field="__count__"><a href="#">Quantity</a></li>
</ul>
</div>
+ <div class="btn-group btn-group-sm">
+ <button class="btn btn-default fa fa-bar-chart-o o_graph_button" title="Bar Chart" data-mode="bar"/>
+ <button class="btn btn-default fa fa-line-chart o_graph_button" title="Line Chart" data-mode="line"/>
+ <button class="btn btn-default fa fa-pie-chart o_graph_button" title="Pie Chart" data-mode="pie"/>
+ </div>
</t>
<div t-name="GraphView.error" class="oe_view_nocontent" >
- <div class="oe_empty_custom_dashboard">
- <p><b><t t-esc="title"/></b></p>
- <p><t t-esc="description"/></p>
- </div>
+ <p><strong><t t-esc="title"/></strong></p>
+ <p><t t-esc="description"/></p>
</div>
-
-<div t-name="PivotView" class="oe_pivot">
- <div class="o-field-selection"/>
- <div class="o-pivot-table"/>
+<div t-name="PivotView" class="o_pivot">
+ <div class="o_field_selection"/>
</div>
<t t-name="PivotView.buttons">
- <div class="btn-group btn-group-sm">
- <button class="btn btn-default fa fa-expand oe-pivot-flip" title="Flip axis"></button>
- <button class="btn btn-default fa fa-arrows-alt oe-pivot-expand-all" title="Expand all"></button>
- </div>
- <div class="btn-group btn-group-sm">
- <button class="btn btn-default dropdown-toggle" data-toggle="dropdown">
+ <div class="btn-group btn-group-sm" role="group">
+ <button class="btn btn-primary btn-sm dropdown-toggle" data-toggle="dropdown">
Measures <span class="caret"/>
</button>
- <ul class="oe-measure-list dropdown-menu">
+ <ul class="dropdown-menu o_pivot_measures_list">
<li t-foreach="measures" t-as="measure" t-att-data-field="measure[0]">
- <a><t t-esc="measure[1].string"/></a>
+ <a href="#"><t t-esc="measure[1].string"/></a>
</li>
<li class="divider"></li>
- <li data-field="__count__"><a>Quantity</a></li>
+ <li data-field="__count__"><a href="#">Quantity</a></li>
</ul>
</div>
+ <div class="btn-group btn-group-sm">
+ <button class="btn btn-default fa fa-expand o_pivot_flip_button" title="Flip axis"/>
+ <button class="btn btn-default fa fa-arrows-alt o_pivot_expand_button" title="Expand all"/>
+ <button class="btn btn-default fa fa-download o_pivot_download" title="Download xls"/>
+ </div>
</t>
<t t-name="PivotView.FieldSelection">
- <ul class="dropdown-menu multi-level o-field-menu" role="menu">
+ <ul class="dropdown-menu o_pivot_field_menu" role="menu">
<t t-foreach="fields" t-as="field">
<t t-if="(field[1].type === 'date') || (field[1].type === 'datetime')">
- <li class="pivot-dropdown-submenu" t-att-data-field="field[0]">
- <a class="field-selection">
+ <li class="o_inline_dropdown" t-att-data-field="field[0]">
+ <a href="#" class="o_pivot_field_selection">
<t t-esc="field[1].string"/>
</a>
<ul class="dropdown-menu">
- <li t-att-data-field="field[0]"><a t-att-data-interval="'day'">Day</a></li>
- <li t-att-data-field="field[0]"><a t-att-data-interval="'week'">Week</a></li>
- <li t-att-data-field="field[0]"><a t-att-data-interval="'month'">Month</a></li>
- <li t-att-data-field="field[0]"><a t-att-data-interval="'quarter'">Quarter</a></li>
- <li t-att-data-field="field[0]"><a t-att-data-interval="'year'">Year</a></li>
+ <li t-att-data-field="field[0]"><a href="#" t-att-data-interval="'day'">Day</a></li>
+ <li t-att-data-field="field[0]"><a href="#" t-att-data-interval="'week'">Week</a></li>
+ <li t-att-data-field="field[0]"><a href="#" t-att-data-interval="'month'">Month</a></li>
+ <li t-att-data-field="field[0]"><a href="#" t-att-data-interval="'quarter'">Quarter</a></li>
+ <li t-att-data-field="field[0]"><a href="#" t-att-data-interval="'year'">Year</a></li>
</ul>
</li>
</t>
<t t-if="(field[1].type !== 'date') &amp;&amp; (field[1].type !== 'datetime')">
- <li t-att-data-field="field[0]"><a><t t-esc="field[1].string"/></a></li>
+ <li t-att-data-field="field[0]"><a href="#"><t t-esc="field[1].string"/></a></li>
</t>
</t>
</ul>
</t>
<div t-name="PivotView.nodata" class="oe_view_nocontent" >
- <div class="oe_empty_custom_dashboard">
- <p><b>No data to display.</b></p>
- <p>
- No data available for this pivot table. Try to add some records, or make sure
- that there is at least one measure and no active filter in the search bar.
- </p>
- </div>
+ <p><strong>No data to display.</strong></p>
+ <p>
+ No data available for this pivot table. Try to add some records, or make sure
+ that there is at least one measure and no active filter in the search bar.
+ </p>
</div>
@@ -703,21 +705,16 @@
<t t-js="dict">console.warn('Unhandled widget', dict.widget);</t>
</t>
<t t-name="FieldChar">
- <span t-att-class="'oe_form_field '+widget.widget_class" t-att-style="widget.node.attrs.style">
- <t t-if="!widget.get('effective_readonly')">
- <input t-att-type="widget.password ? 'password' : 'text'"
- t-att-barcode_events="widget.options.barcode_events"
- t-att-id="widget.id_for_label"
- t-att-tabindex="widget.node.attrs.tabindex"
- t-att-autofocus="widget.node.attrs.autofocus"
- t-att-placeholder="widget.node.attrs.placeholder"
- t-att-maxlength="widget.field.size"
- /><img class="oe_field_translate oe_input_icon" t-if="_t.database.multi_lang and widget.field.translate" t-att-src='_s + "/web/static/src/img/icons/terp-translate.png"' width="16" height="16" border="0"/>
- </t>
- <t t-if="widget.get('effective_readonly')">
- <span class="oe_form_char_content"></span>
- </t>
- </span>
+ <span t-if="widget.get('effective_readonly')"/>
+
+ <input t-if="!widget.get('effective_readonly')" class="o_form_input"
+ t-att-barcode_events="widget.options.barcode_events"
+ t-att-type="widget.password ? 'password' : 'text'"
+ t-att-id="widget.id_for_label"
+ t-att-tabindex="widget.node.attrs.tabindex"
+ t-att-autofocus="widget.node.attrs.autofocus"
+ t-att-placeholder="widget.node.attrs.placeholder"
+ t-att-maxlength="widget.field.size"/>
</t>
<t t-name="FormSelection">
<div class="btn-group o_kanban_selection">
@@ -738,59 +735,30 @@
<a t-if="!widget.readonly" t-foreach="widget.values.slice(1)" t-as="v" href="#" t-att-data-value="v[0]" t-att-title="v[1]" class="o_priority_star fa"/>
<span t-if="widget.readonly" t-foreach="widget.values.slice(1)" t-as="v" t-att-data-value="v[0]" t-att-title="v[1]" class="o_priority_star fa"/>
</div>
-<t t-name="FieldEmail">
- <span class="oe_form_field oe_form_field_email" t-att-style="widget.node.attrs.style">
- <a t-if="widget.get('effective_readonly')" href="#" class="oe_form_uri" target="_blank"/>
- <t t-if="!widget.get('effective_readonly')">
- <div>
- <input type="text"
- t-att-id="widget.id_for_label"
- t-att-tabindex="widget.node.attrs.tabindex"
- t-att-autofocus="widget.node.attrs.autofocus"
- t-att-placeholder="widget.node.attrs.placeholder"
- t-att-maxlength="widget.field.size"
- />
- </div>
+<t t-name="FieldEmail" t-extend="FieldChar">
+ <t t-jquery="span" t-operation="replace">
+ <t t-if="widget.get('effective_readonly')">
+ <a t-if="widget.clickable" class="o_form_uri o_text_overflow" href="#" target="_blank"/>
+ <span t-if="!widget.clickable" class="o_text_overflow"/>
</t>
- </span>
-</t>
-<t t-name="FieldUrl" t-extend="FieldEmail">
- <t t-jquery="span:first">
- this.removeClass('oe_form_field_email').addClass('oe_form_field_url');
</t>
</t>
<t t-name="FieldText">
- <div class="oe_form_field oe_form_field_text" t-att-style="widget.node.attrs.style">
- <t t-if="!widget.get('effective_readonly')">
- <textarea rows="6"
- t-att-name="widget.name"
- class="field_text"
- t-att-tabindex="widget.node.attrs.tabindex"
- t-att-autofocus="widget.node.attrs.autofocus"
- t-att-placeholder="! widget.get('effective_readonly') ? widget.node.attrs.placeholder : ''"
- t-att-maxlength="widget.field.size"
- ></textarea><img class="oe_field_translate oe_input_icon"
- t-if="_t.database.multi_lang and widget.field.translate and !widget.get('effective_readonly')"
- t-att-src='_s + "/web/static/src/img/icons/terp-translate.png"' width="16" height="16" border="0"
- />
- </t>
- <t t-if="widget.get('effective_readonly')">
- <span class="oe_form_text_content"></span>
- </t>
- </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>
+ <span t-if="widget.get('effective_readonly')" class="o_form_textarea"/>
+
+ <textarea t-if="!widget.get('effective_readonly')"
+ class="o_form_textarea"
+ rows="6"
+ t-att-name="widget.name"
+ t-att-tabindex="widget.node.attrs.tabindex"
+ t-att-autofocus="widget.node.attrs.autofocus"
+ t-att-placeholder="!widget.get('effective_readonly') ? widget.node.attrs.placeholder : ''"
+ t-att-maxlength="widget.field.size"/>
</t>
<t t-name="FieldCharDomain">
- <div class="oe_form_field">
+ <div>
<span class="o_count"/>
- <button class="btn btn-link" type="button"
+ <button class="btn btn-default" type="button"
t-att-accesskey="widget.node.attrs.accesskey"/>
<input t-if="widget.debug" type="text" class="o_form_input o_debug_input"/>
</div>
@@ -802,76 +770,54 @@
class="o_datepicker_input"
t-att-name="widget.name"
t-att-placeholder="placeholder"/>
- <span class="fa fa-calendar o_datepicker_button"/>
+ <span class="o_datepicker_button"/>
</div>
</t>
-<t t-name="FieldDate">
- <span class="oe_form_field oe_datepicker_root oe_form_field_date" t-att-style="widget.node.attrs.style"/>
-</t>
-<t t-name="FieldDatetime">
- <span class="oe_form_field oe_datepicker_root oe_form_field_datetime" t-att-style="widget.node.attrs.style"/>
-</t>
<t t-name="FieldSelection">
- <span class="oe_form_field oe_form_field_selection" t-att-style="widget.node.attrs.style">
- </span>
-</t>
-<t t-name="FieldSelectionSelect">
+ <span t-if="widget.get('effective_readonly')"/>
+
<select t-if="!widget.get('effective_readonly')"
+ class="o_form_input"
t-att-name="widget.name"
t-att-tabindex="widget.node.attrs.tabindex"
t-att-autofocus="widget.node.attrs.autofocus"
- t-att-id="widget.id_for_label">
- <t t-foreach="values" t-as="option">
- <option t-att-value="JSON.stringify(option[0])">
- <t t-esc="option[1]"/>
- </option>
- </t>
- </select>
+ t-att-id="widget.id_for_label"/>
</t>
<t t-name="FieldRadio">
- <span t-attf-class="oe_form_field oe_form_field_radio #{widget.options.horizontal ? 'oe_horizontal' : 'oe_vertical'}" t-att-style="widget.node.attrs.style">
- <span t-if="!widget.get('effective_readonly')">
- <t t-foreach="widget.selection" t-as="selection">
- <div>
- <span class="oe_radio_input"><input type="radio" t-att-id="widget.uniqueId + '_' + selection[0]" t-att-name="widget.uniqueId" t-att-value="selection[0]"/></span><label t-if="!widget.options.no_radiolabel" t-att-for="widget.uniqueId + '_' + selection[0]"><t t-esc="selection[1]"/></label>
- </div>
- </t>
- </span>
- <span t-if="widget.get('effective_readonly')" class="oe_radio_readonly"/>
- </span>
+ <span t-if="widget.get('effective_readonly')"/>
+
+ <div t-if="!widget.get('effective_readonly')" t-attf-class="o_form_field_radio #{widget.options.horizontal ? 'o_horizontal' : 'o_vertical'}">
+ <div t-foreach="widget.selection" t-as="selection" class="o_radio_item">
+ <input type="radio" class="o_form_radio" t-att-id="widget.uniqueId + '_' + selection[0]" t-att-name="widget.uniqueId" t-att-value="selection[0]"/>
+ <label t-if="!widget.options.no_radiolabel" class="o_form_label" t-att-for="widget.uniqueId + '_' + selection[0]"><t t-esc="selection[1]"/></label>
+ </div>
+ </div>
</t>
<t t-name="FieldMany2One">
- <span class="oe_form_field oe_form_field_many2one oe_form_field_with_button" t-att-style="widget.node.attrs.style">
- <t t-if="widget.get('effective_readonly')">
- <a t-if="! widget.options.no_open" href="#" class="oe_form_uri"/>
- <span t-if="widget.options.no_open" href="#" class="oe_form_uri"/>
- <span class="oe_form_m2o_follow"/>
- </t>
- <t t-if="!widget.get('effective_readonly')">
- <i t-if="! widget.options.no_open" href="#" tabindex="-1"
- class="oe_m2o_cm_button fa fa-external-link" draggable="false"/>
- <div>
- <input type="text"
- t-att-barcode_events="widget.options.barcode_events"
- t-att-id="widget.id_for_label"
- t-att-tabindex="widget.node.attrs.tabindex"
- t-att-autofocus="widget.node.attrs.autofocus"
- t-att-placeholder="widget.node.attrs.placeholder"
- />
- <span class="oe_m2o_drop_down_button">
- <img t-att-src='_s + "/web/static/src/img/down-arrow.png"' draggable="false"/>
- </span>
- </div>
- </t>
- </span>
+ <t t-if="widget.get('effective_readonly')">
+ <a t-if="!widget.options.no_open" class="o_form_uri" href="#"/>
+ <span t-if="widget.options.no_open"/>
+ </t>
+ <div t-if="!widget.get('effective_readonly')" t-att-class="'o_form_field_many2one' + ((widget.options.no_open)? '' : ' o_with_button')">
+ <div class="o_form_input_dropdown">
+ <input type="text" class="o_form_input"
+ t-att-barcode_events="widget.options.barcode_events"
+ t-att-id="widget.id_for_label"
+ t-att-tabindex="widget.node.attrs.tabindex"
+ t-att-autofocus="widget.node.attrs.autofocus"
+ t-att-placeholder="widget.node.attrs.placeholder"/>
+ <span class="o_dropdown_button" draggable="false"/>
+ </div>
+ <button type="button" t-if="!widget.options.no_open" class="fa fa-external-link btn btn-default o_external_button" tabindex="-1" draggable="false"/>
+ </div>
</t>
-<t t-name="Many2OneButton.cell"
- ><img t-attf-src="#{prefix}/web/static/src/img/icons/#{widget.icon}.png" t-att-alt="widget.string" width="16" height="16"/>
+<t t-name="Many2OneButton.cell">
+ <img t-attf-src="#{prefix}/web/static/src/img/icons/#{widget.icon}.png" t-att-alt="widget.string" width="16" height="16"/>
</t>
<t t-name="FieldMany2ManyTag">
<t t-foreach="elements" t-as="el">
- <span t-attf-class="badge dropdown #{'o_tag_color_' + el.color}" t-att-data-color="el.color" t-att-data-index="el_index" t-att-data-id="el.id">
- <t t-esc="el['display_name']"/>
+ <span t-attf-class="badge dropdown #{'o_tag_color_' + (el['color'] || 0)}" t-att-data-color="(el['color'] || 0)" t-att-data-index="el_index" t-att-data-id="el['id']">
+ <span class="o_badge_text"><t t-esc="el['display_name']"/></span>
<span t-if="!readonly" class="fa fa-times o_delete"/>
</span>
</t>
@@ -879,57 +825,43 @@
<t t-name="FieldMany2ManyTag.colorpicker">
<ul class="o_colorpicker dropdown-menu" role="menu">
<li t-foreach="10" t-as="color">
- <span href="#" t-att-data-id="tag_id" t-att-data-color="color_index" t-attf-class="o_tag_color_#{color}"/>
+ <span t-att-data-id="tag_id" t-att-data-color="color_index + 1" t-attf-class="o_tag_color_#{color + 1}"/>
</li>
<li>
- <span t-att-data-id="tag_id" t-att-data-color="10" class="o_tag_color_10"/>
+ <span t-att-data-id="tag_id" t-att-data-color="0" class="o_tag_color_0"/>
</li>
<li>
Not shown in kanban
</li>
</ul>
</t>
-<t t-name="FieldReference">
- <table class="oe_form_field oe_form_field_reference" border="0" cellpadding="0" cellspacing="0" t-att-style="widget.node.attrs.style">
- <tr>
- <td t-attf-class="oe_form_frame_cell oe_form_selection">
- <span t-attf-class="oe_form_view_reference_selection"/>
- </td>
- <td t-attf-class="oe_form_frame_cell oe_form_many2one" nowrap="true">
- <span t-attf-class="oe_form_view_reference_m2o"/>
- </td>
- </tr>
- </table>
-</t>
<t t-name="FieldBoolean">
- <span class="oe_form_field oe_form_field_boolean" t-att-style="widget.node.attrs.style">
+ <div class="o_checkbox o_form_field_boolean">
<input type="checkbox"
t-att-id="widget.id_for_label"
t-att-name="widget.name"
t-att-tabindex="widget.node.attrs.tabindex"
- t-att-autofocus="widget.node.attrs.autofocus"
- class="field_boolean"/>
- </span>
+ t-att-autofocus="widget.node.attrs.autofocus"/>
+ <span/>
+ </div>
</t>
-<div t-name="FieldUpgradeBoolean" class="oe_form_field oe_form_field_boolean">
- <t t-call="FieldBoolean"/>
+<div t-name="FieldUpgradeBoolean" class="o_form_field o_form_field_boolean">
+ <t t-call="FieldBoolean"/>
</div>
<t t-name="ProgressBar">
<div class="o_progressbar">
<div t-if="widget.title" class="o_progressbar_title"><t t-esc="widget.title"/></div><div class="o_progress">
<div class="o_progressbar_complete"/>
- </div><div t-if="widget.readonly" class="o_progressbar_value"/><input t-if="!widget.readonly" class="o_progressbar_value"/>
+ </div><div t-if="widget.readonly" class="o_progressbar_value"/><input t-if="!widget.readonly" class="o_progressbar_value" type="text"/>
</div>
</t>
<t t-name="FieldPercentPie">
- <div class="oe_form_field oe_form_field_percent_pie" t-att-style="widget.node.attrs.style">
- <svg></svg>
- <span t-if="widget.string"><t t-esc="widget.string"/></span>
- </div>
-</t>
-<t t-name="FieldBarChart">
- <div class="oe_form_field oe_form_field_bar_chart" t-att-style="widget.node.attrs.style">
- <svg></svg>
+ <div class="o_form_field_percent_pie">
+ <div class="o_pie">
+ <div class="o_mask"/>
+ <div class="o_mask"/>
+ <div class="o_pie_value"/>
+ </div>
<span t-if="widget.string"><t t-esc="widget.string"/></span>
</div>
</t>
@@ -957,197 +889,149 @@
</li>
</t>
</t>
+<t t-name="FieldStatus.content.button">
+ <button type="button" t-attf-class="btn btn-sm o_arrow_button #{i[0] === widget.get('value') ? 'btn-primary' : 'btn-default'} #{!widget.options.clickable || i[0] === widget.get('value') ? 'disabled' : ''}" t-att-data-id="i[0]">
+ <t t-esc="i[1]"/>
+ </button>
+</t>
<t t-name="FieldBinaryImage">
- <span class="oe_form_field oe_form_field_image" t-att-style="widget.node.attrs.style">
+ <div class="o_form_field_image">
<t t-if="!widget.get('effective_readonly')">
- <div class="oe_form_field_image_controls oe_edit_only">
- <i class="fa fa-pencil fa-1g pull-left col-md-offset-1 oe_form_binary_file_edit" title="Edit"/>
- <i class="fa fa-trash-o fa-1g col-md-offset-5 oe_form_binary_file_clear" title="Clear"/>
- <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>
- </div>
+ <div class="o_form_image_controls">
+ <span class="fa fa-pencil fa-lg pull-left o_select_file_button" title="Edit"/>
+ <span class="fa fa-trash-o fa-lg pull-right o_clear_file_button" title="Clear"/>
+
+ <span class="o_form_binary_progress">Uploading...</span>
<t t-call="HiddenInputFile">
<t t-set="fileupload_id" t-value="widget.fileupload_id"/>
</t>
</div>
</t>
- </span>
+ </div>
</t>
<t t-name="FieldBinaryImage-img">
<img t-att-src='url'
t-att-border="widget.readonly ? 0 : 1"
t-att-name="widget.name"
t-att-width="widget.node.attrs.img_width || widget.node.attrs.width"
- t-att-height="widget.node.attrs.img_height || widget.node.attrs.height"
- />
+ t-att-height="widget.node.attrs.img_height || widget.node.attrs.height"/>
</t>
<t t-name="FieldBinaryFile">
- <t t-if="!widget.get('effective_readonly')">
- <table class="oe_form_field oe_form_field_binary" cellpadding="0" cellspacing="0" border="0" t-att-style="widget.node.attrs.style">
- <tr>
- <td>
- <input type="text" size="1" readonly="readonly"
- t-att-name="widget.name"
- t-att-tabindex="widget.node.attrs.tabindex"
- t-att-autofocus="widget.node.attrs.autofocus"
- class="field_binary"
- />
- </td>
- <td class="oe_form_binary" nowrap="true">
- <table cellspacing="0" cellpadding="0" border="0">
- <tr>
- <td>
- <t t-call="HiddenInputFile">
- <t t-set="fileupload_id" t-value="widget.fileupload_id"/>
- <t t-set="fileupload_style" t-translation="off">overflow-x: hidden</t>
- <button class="oe_button oe_field_button" type="button">
- <img t-att-src='_s + "/web/static/src/img/icons/STOCK_DIRECTORY.png"'/>
- <span>Select</span>
- </button>
- </t>
- </td>
- <td>
- <a class="oe_form_binary_file_save_data">
- <button class="oe_button oe_form_binary_file_save" type="button" title="Save As">
- <img t-att-src='_s + "/web/static/src/img/icons/gtk-save.png"'/>
- <span>Save As</span>
- </button>
- </a>
- </td>
- <td>
- <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"'/>
- <span>Clear</span>
- </button>
- </td>
- </tr>
- </table>
- </td>
- <td class="oe_form_binary_progress" style="display: none" nowrap="true">
- <img t-att-src='_s + "/web/static/src/img/throbber.gif"' width="16" height="16"/>
- <b>Uploading ...</b>
- </td>
- </tr>
- </table>
- </t>
- <t t-if="widget.get('effective_readonly')">
- <span t-att-style="widget.node.attrs.style">
- <a href="javascript:void(0)" class="oe_form_uri"/>
- </span>
- </t>
+ <a t-if="widget.get('effective_readonly')" href="javascript:void(0)" class="o_form_uri"/>
+
+ <div t-if="!widget.get('effective_readonly')" class="o_form_field_binary_file">
+ <input type="text" class="o_form_input"
+ readonly="readonly"
+ t-att-name="widget.name"
+ t-att-tabindex="widget.node.attrs.tabindex"
+ t-att-autofocus="widget.node.attrs.autofocus"/>
+
+ <button type="button" class="btn btn-sm btn-primary o_select_file_button" title="Select">Upload your file</button>
+ <button type="button" class="btn btn-sm btn-default fa fa-pencil o_select_file_button" title="Select"/>
+ <button type="button" class="btn btn-sm btn-default fa fa-download o_save_file_button" title="Save As..."/>
+ <button type="button" class="btn btn-sm btn-default fa fa-trash-o o_clear_file_button" title="Clear"/>
+
+ <span class="o_form_binary_progress">Uploading...</span>
+ <t t-call="HiddenInputFile">
+ <t t-set="fileupload_id" t-value="widget.fileupload_id"/>
+ <t t-set="fileupload_style" t-translation="off">overflow-x: hidden</t>
+ </t>
+ </div>
</t>
<t t-name="HiddenInputFile">
- <div t-attf-class="oe_hidden_input_file #{fileupload_class or ''}" t-att-style="fileupload_style">
+ <div t-attf-class="o_hidden_input_file #{fileupload_class or ''}" t-att-style="fileupload_style">
<form class="o_form_binary_form" t-att-target="fileupload_id"
method="post" enctype="multipart/form-data" t-att-action="fileupload_action || '/web/binary/upload'">
<input type="hidden" name="csrf_token" t-att-value="csrf_token"/>
<input type="hidden" name="session_id" value="" t-if="widget.session.override_session"/>
<input type="hidden" name="callback" t-att-value="fileupload_id"/>
+ <input t-if="widget.widget!='image'" type="file" class="o_form_input_file" name="ufile"/>
+ <input t-if="widget.widget=='image'" type="file" class="o_form_input_file" name="ufile" accept="image/*"/>
<t t-raw="0"/>
- <input type="file" class="o_form_input_file" name="ufile" t-if="widget.widget!='image'"/>
- <input type="file" class="o_form_input_file" name="ufile" accept="image/*" t-if="widget.widget=='image'"/>
</form>
<iframe t-att-id="fileupload_id" t-att-name="fileupload_id" style="display: none"/>
</div>
</t>
-<t t-name="FieldBinaryFileUploader.files">
- <div class="oe_attachments">
- <t t-if="!widget.get('effective_readonly')">
- <t t-foreach="values" t-as="id">
- <t t-set="file" t-value="widget.data[id]"/>
- <div class="oe_attachment">
- <span t-if="(file.upload or file.percent_loaded&lt;100)" t-attf-title="#{(file.name || file.filename) + (file.date?' \n('+file.date+')':'' )}" t-attf-name="#{file.name || file.filename}">
- <span class="oe_fileuploader_in_process">...Upload in progress...</span>
- <t t-raw="file.name || file.filename"/>
- </span>
- <t t-if="(!file.upload or file.percent_loaded&gt;=100)">
- <a class="o_image" t-att-href="file.url" t-attf-title="#{(file.name || file.filename) + (file.date?' \n('+file.date+')':'' )}" t-att-data-mimetype="file.mimetype" t-attf-data-src="/web/image/#{file.id}/100x80">
- <t t-raw="file.name || file.filename"/>
- </a>
- <span class="fa fa-stack oe_delete" title="Delete this file" t-attf-data-id="#{file.id}">
- <i class="fa fa-circle fa-stack-1x fa-inverse"></i>
- <i class="fa fa-times-circle fa-stack-1x"></i>
- </span>
- </t>
- </div>
- </t>
+<div t-name="FieldBinaryFileUploader" t-attf-class="oe_fileupload #{widget.node.attrs.class ? widget.node.attrs.class :''}">
+ <div class="oe_placeholder_files"/>
+ <div t-if="!widget.get('effective_readonly')" class="oe_add">
+ <button class="btn btn-default o_attach"><span class="fa fa-paperclip"/> <t t-esc="widget.string"/></button>
+ <t t-call="HiddenInputFile">
+ <t t-set="fileupload_id" t-value="widget.fileupload_id"/>
+ <t t-set="fileupload_action" t-translation="off">/web/binary/upload_attachment</t>
+ <input type="hidden" name="model" t-att-value="widget.view.model"/>
+ <input type="hidden" name="id" value="0"/>
+ <input t-if="widget.session.override_session" type="hidden" name="session_id" t-att-value="widget.session.session_id"/>
</t>
- <t t-if="widget.get('effective_readonly')">
- <t t-foreach="widget.get('value')" t-as="id">
- <t t-set="file" t-value="widget.data[id]"/>
+ </div>
+</div>
+<div t-name="FieldBinaryFileUploader.files" class="oe_attachments">
+ <t t-if="widget.get('effective_readonly')">
+ <div t-foreach="widget.get('value')" t-as="id">
+ <t t-set="file" t-value="widget.data[id]"/>
+ <a t-att-href="file.url" t-attf-title="#{(file.name || file.filename) + (file.date?' \n('+file.date+')':'' )}"><t t-raw="file.name || file.filename"/></a>
+ </div>
+ </t>
+ <t t-if="!widget.get('effective_readonly')">
+ <div t-foreach="values" t-as="id" class="oe_attachment">
+ <t t-set="file" t-value="widget.data[id]"/>
+ <span t-if="file.upload or file.percent_loaded&lt;100"
+ t-att-title="(file.name || file.filename) + ((file.date)? (' \n(' + file.date + ')') : '')"
+ t-att-name="file.name || file.filename">
+ <span class="oe_fileuploader_in_process">...Upload in progress...</span>
+ <t t-raw="file.name || file.filename"/>
+ </span>
+ <t t-if="!file.upload or file.percent_loaded&gt;=100">
<div>
- <a t-att-href="file.url" t-attf-title="#{(file.name || file.filename) + (file.date?' \n('+file.date+')':'' )}">
- <t t-raw="file.name || file.filename"/>
- </a>
+ <a href="#" class="fa fa-times pull-right oe_delete" title="Delete this file" t-att-data-id="file.id"/>
+ <t t-raw="file.name || file.filename"/>
</div>
- </t>
- </t>
- </div>
-</t>
-<t t-name="FieldBinaryFileUploader">
- <div t-att-style="widget.node.attrs.style" t-attf-class="oe_fileupload #{widget.node.attrs.class ? widget.node.attrs.class :''}">
- <div class="oe_placeholder_files"/>
- <div class="oe_add" t-if="!widget.get('effective_readonly')">
- <!-- uploader of file -->
- <button class="oe_attach"><i class="fa fa-paperclip"/></button>
- <span class='oe_attach_label'><t t-esc="widget.string"/></span>
- <t t-call="HiddenInputFile">
- <t t-set="fileupload_id" t-value="widget.fileupload_id"/>
- <t t-set="fileupload_action" t-translation="off">/web/binary/upload_attachment</t>
- <input type="hidden" name="model" t-att-value="widget.view.model"/>
- <input type="hidden" name="id" value="0"/>
- <input type="hidden" name="session_id" t-att-value="widget.session.session_id" t-if="widget.session.override_session"/>
+ <a class="o_image" t-att-href="file.url"
+ t-att-title="(file.name || file.filename) + ((file.date)? (' \n(' + file.date + ')') : '')"
+ t-att-data-mimetype="file.mimetype"
+ t-attf-data-src="/web/image/#{file.id}/100x80"/>
</t>
</div>
- </div>
-</t>
-
-<t t-name="One2Many.formview" t-extend="FormView">
- <t t-jquery=".oe_form_buttons" t-operation="inner">
- <button type="button" class="oe_button oe_form_button_create">Add</button>
</t>
-</t>
-
-<t t-name="One2Many.listview" t-extend="ListView">
- <t t-jquery="thead > tr:first">
- this.removeAttr('t-if');
- </t>
-</t>
-
-<div t-name="SearchView" class="oe_searchview form-control input-sm">
- <div class="oe_searchview_search fa fa-lg fa-search" title="Search Again"/>
- <div class="oe_searchview_facets"/>
- <div class="oe_searchview_unfold_drawer fa fa-lg fa-fw fa-chevron-right" title="Advanced Search..."/>
</div>
-
-<div t-name="SearchView.InputView"
- class="oe_searchview_input"
- contenteditable="true"
- tabindex="0"/>
-<!-- tabindex: makes div focusable -->
-<div t-name="SearchView.FacetView"
- class="oe_tag oe_searchview_facet"
- tabindex="0">
- <span class="oe_facet_remove">x</span>
- <span t-if="widget.model.has('icon')"
- t-att-class="'label label-default fa ' + widget.model.get('icon')">
- </span>
- <span class="label label-default" t-if="!widget.model.has('icon')">
+<div t-name="SearchView" class="o_searchview">
+ <span class="o_searchview_more fa" title="Advanced Search..."/>
+</div>
+<input t-name="SearchView.InputView" type="text" class="o_searchview_input" placeholder="Search..."/>
+<div t-name="SearchView.FacetView" tabindex="0" class="o_searchview_facet">
+ <span t-if="widget.model.has('icon')" t-att-class="'fa ' + widget.model.get('icon') + ' o_searchview_facet_label'"/>
+ <span t-if="!widget.model.has('icon')" class="o_searchview_facet_label">
<t t-esc="widget.model.get('category')"/>
- </span >
- <span class="oe_facet_values"/>
+ </span>
+ <div class="o_facet_values"/>
+ <div class="fa fa-sm fa-remove o_facet_remove"/>
</div>
-<span t-name="SearchView.FacetView.Value" class="oe_facet_value">
+<span t-name="SearchView.FacetView.Value">
<t t-esc="widget.model.get('label')"/>
</span>
+<t t-name="SearchView.autocomplete">
+ <ul class="dropdown-menu o_searchview_autocomplete" role="menu"></ul>
+</t>
+
+<div t-name="SearchView.FilterMenu" class="btn-group o_dropdown">
+ <button class="o_dropdown_toggler_btn btn btn-sm dropdown-toggle" data-toggle="dropdown">
+ <span class="fa fa-filter"/> Filters <span class="caret"/>
+ </button>
+ <ul class="dropdown-menu o_filters_menu" role="menu">
+ <li class="o_add_filter o_closed_menu">
+ <a href="#">Add Custom Filter</a>
+ </li>
+ <li class="o_add_filter_menu">
+ <button class="btn btn-primary btn-sm o_apply_filter" type="button">Apply</button>
+ <button class="btn btn-default btn-sm o_add_condition" type="button"><span class="fa fa-plus-circle"/> Add a condition</button>
+ </li>
+ </ul>
+</div>
<t t-name="SearchView.filters">
<li t-foreach="widget.filters" t-as="filter" t-if="!filter.visible || filter.visible()"
t-att-title="filter.attrs.string ? filter.attrs.help : undefined"
t-att-data-index="filter_index">
- <a>
- <t t-esc="filter.attrs.string or filter.attrs.help or filter.attrs.name or 'Ω'"/>
- </a>
+ <a href="#"><t t-esc="filter.attrs.string or filter.attrs.help or filter.attrs.name or 'Ω'"/></a>
</li>
</t>
<t t-name="SearchView.field">
@@ -1206,56 +1090,11 @@
<t t-if="filters.length" t-raw="filters.render(defaults)"/>
</div>
</t>
-<div t-name="SearchView.FilterMenu" class="btn-group btn-group-sm">
- <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown">
- <span class="fa fa-filter"/> Filters <span class="caret"/>
- </button>
- <ul class="dropdown-menu filters-menu" role="menu">
- <li class="oe-add-filter o_closed_menu"><a>Add Custom Filter</a></li>
- <li class="oe-add-filter-menu"><button type="button" class="btn btn-default oe-apply-filter">Apply</button><a class="oe-add-condition"><span class="fa fa-plus-circle"/> Add a condition</a></li>
- </ul>
-</div>
-
-<div t-name="SearchView.GroupByMenu" class="btn-group btn-group-sm oe-groupby-menu">
- <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown">
- <span class="fa fa-bars"/> Group By <span class="caret"/>
- </button>
- <ul class="dropdown-menu group-by-menu" role="menu">
- <li class="divider"/>
- <li class="add-custom-group o_closed_menu"><a>Add custom group</a></li>
- </ul>
-</div>
-
-<t t-name="GroupByMenuSelector">
- <li><select class="form-control oe-add-group oe-group-selector">
- <t t-foreach="groupable_fields" t-as="field">
- <option t-att-data-name="field.name"><t t-esc="field.string"/></option>
- </t>
- </select></li>
- <li><button type="button" class="btn btn-default oe-add-group oe-select-group">Apply</button></li>
-</t>
-<div t-name="SearchView.FavoriteMenu" class="btn-group btn-group-sm">
- <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown">
- <span class="fa fa-star"/> Favorites <span class="caret"/>
- </button>
- <ul class="dropdown-menu o_favorites_menu" role="menu">
- <li class="divider"/>
- <li class="oe-save-search o_closed_menu"><a>Save current search</a></li>
- <li class="oe-save-name"><input type="text" class="form-control"></input></li>
- <li class="oe-save-name">
- <span><input type="checkbox"/>Use by default</span>
- </li>
- <li class="oe-save-name">
- <span class="oe-share-filter"><input type="checkbox"/>Share with all users</span>
- </li>
- <li class="oe-save-name"><button type="button" class="btn btn-default">Save</button></li>
- </ul>
-</div>
<t t-name="SearchView.extended_search.proposition">
- <li class="oe-filter-condition">
- <span class="o-or-filter">or</span>
+ <li class="o_filter_condition">
+ <span class="o_or_filter">or</span>
<span>
- <select class="searchview_extended_prop_field form-control">
+ <select class="o_searchview_extended_prop_field">
<t t-foreach="widget.attrs.fields" t-as="field">
<option t-att="{'selected': field === widget.attrs.selected ? 'selected' : null}"
t-att-value="field.name">
@@ -1263,151 +1102,140 @@
</option>
</t>
</select>
- <span class="searchview_extended_delete_prop fa fa-trash-o"/>
+ <span class="o_searchview_extended_delete_prop fa fa-trash-o"/>
</span>
- <select class="searchview_extended_prop_op form-control"/>
- <span class="searchview_extended_prop_value"/>
+ <select class="o_searchview_extended_prop_op"/>
+ <span class="o_searchview_extended_prop_value"/>
</li>
</t>
-<t t-name="SearchView.extended_search.proposition.char">
- <input class="field_char form-control"/>
-</t>
-<t t-name="SearchView.extended_search.proposition.empty">
- <span/>
-</t>
-<t t-name="SearchView.extended_search.proposition.integer">
- <input type="number" class="field_integer form-control" value = "0" step="1"/>
-</t>
<t t-name="SearchView.extended_search.proposition.float">
- <input class="field_float form-control"
- t-att-type="widget.decimal_point === '.' ? 'number' : 'text'"
+ <input t-att-type="widget.decimal_point === '.' ? 'number' : 'text'"
t-attf-title="Number using #{widget.decimal_point || '.' } as decimal separator."
t-attf-pattern="[0-9]+([\\#{widget.decimal_point || '.' }][0-9]+)?"
t-attf-value="0#{widget.decimal_point || '.' }0" step="0.01"/>
</t>
<t t-name="SearchView.extended_search.proposition.selection">
- <select class="form-control">
- <t t-foreach="widget.field.selection" t-as="element">
- <option t-att-value="element[0]"><t t-esc="element[1]"/></option>
- </t>
+ <select>
+ <option t-foreach="widget.field.selection" t-as="element" t-att-value="element[0]">
+ <t t-esc="element[1]"/>
+ </option>
</select>
</t>
-<div t-name="SearchView.autocomplete" class="oe-autocomplete">
- <ul>
+<div t-name="SearchView.GroupByMenu" class="btn-group hidden-xs o_dropdown">
+ <button class="o_dropdown_toggler_btn btn btn-sm dropdown-toggle" data-toggle="dropdown">
+ <span class="fa fa-bars"/> Group By <span class="caret"/>
+ </button>
+ <ul class="dropdown-menu o_group_by_menu" role="menu">
+ <li class="divider"/>
+ <li class="o_add_custom_group o_closed_menu">
+ <a href="#">Add custom group</a>
+ </li>
</ul>
</div>
-<t t-name="ExportView">
- <a id="exportview" href="javascript: void(0)" style="text-decoration: none;color: #3D3D3D;">Export</a>
-</t>
-<table t-name="ExportTreeView" class="oe_export"
- style="background-color: #F3F3F3;">
- <tr>
- <td colspan="3">
- This wizard will export all data that matches the current search criteria to a CSV file.
- You can export all data or only the fields that can be reimported after modification.
- </td>
- </tr>
- <tr>
- <td colspan="3">
- <label for="import_compat">Export Type:</label>
- <select id="import_compat" name="import_compat">
- <option value="yes">Import-Compatible Export</option>
- <option value="">Export all Data</option>
- </select>
+<t t-name="GroupByMenuSelector">
+ <li><select class="o_add_group o_group_selector">
+ <t t-foreach="groupable_fields" t-as="field">
+ <option t-att-data-name="field.name"><t t-esc="field.string"/></option>
+ </t>
+ </select></li>
+ <li>
+ <button type="button" class="btn btn-primary btn-sm o_add_group o_select_group">Apply</button>
+ </li>
+</t>
- <label for="export_format">Export Formats</label>
- <select id="export_format" name="export_format"></select>
- </td>
- </tr>
+<div t-name="SearchView.FavoriteMenu" class="btn-group o_dropdown">
+ <button class="o_dropdown_toggler_btn btn btn-sm dropdown-toggle" data-toggle="dropdown">
+ <span class="fa fa-star"/> Favorites <span class="caret"/>
+ </button>
+ <ul class="dropdown-menu o_favorites_menu" role="menu">
+ <li class="divider"/>
+ <li class="o_save_search o_closed_menu">
+ <a href="#">Save current search</a>
+ </li>
+ <li class="o_save_name">
+ <input type="text"></input>
+ </li>
+ <li class="o_save_name">
+ <span><div class="o_checkbox"><input type="checkbox"/><span/></div> Use by default</span>
+ </li>
+ <li class="o_save_name">
+ <span><div class="o_checkbox"><input type="checkbox"/><span/></div> Share with all users </span><span class="fa fa-users"/>
+ </li>
+ <li class="o_save_name">
+ <button type="button" class="btn btn-primary btn-sm">Save</button>
+ </li>
+ </ul>
+</div>
- <tr>
- <th>Available fields</th>
- <th/>
- <th>
- Fields to export
- <a style="color: blue; text-decoration: none;" href="#" id="export_new_list">Save fields list</a>
- <div id="savenewlist"></div>
- <div id="ExistsExportList"></div>
- </th>
- </tr>
- <tr style="height: 400px;">
- <td class="oe_export_fields_selector_left">
- <div id="left_field_panel">
+<div t-name="ExportDialog" class="o_export">
+ <p>
+ This wizard will export all data that matches the current search criteria to a CSV file.
+ You can export all data or only the fields that can be reimported after modification.
+ </p>
+
+ <div class="row">
+ <div class="col-md-6">
+ <label>Export Type :</label>
+ <div class="o_import_compat">
+ <div><input type="radio" name="o_import_compat_name" value="yes" checked="checked"/><label>Import-Compatible Export</label></div>
+ <div><input type="radio" name="o_import_compat_name" value=""/><label>Export all Data</label></div>
</div>
- </td>
- <td class="oe_export_fields_selector_center">
- <!-- TODO: replace ids by 'oe_*' classes -->
- <button class="oe_button" id="add_field">Add</button>
- <button class="oe_button" id="remove_field">Remove</button>
- <button class="oe_button" id="remove_all_field">Remove All</button>
- <button class="oe_button" id="move_up">Move Up</button>
- <button class="oe_button" id="move_down">Move Down</button>
- </td>
- <td class="oe_export_fields_selector_right">
- <select name="fields_list" id="fields_list"
- multiple="multiple"></select>
- </td>
- </tr>
-</table>
-<t t-name="ExportTreeView-Domain">
- <t t-if="! record.ids_to_export">
- <p><strong>Please pay attention that all records matching your search filter will be exported. Not only the selected ids.</strong></p>
- </t>
- <t t-if="record.ids_to_export">
- <p><strong>Please note that only the selected ids will be exported.</strong></p>
- </t>
-</t>
-<table t-name="ExportTreeView-Secondary"
- id="field-tree-structure" class="oe_export_fields_selector_export"
- cellspacing="0" cellpadding="0">
- <tr><th class="oe_export_tree_header"> Name </th></tr>
- <t t-call="ExportTreeView-Secondary.children"/>
-</table>
-<tr t-name="ExportTreeView-Secondary.children"
+ </div>
+ <div class="col-md-6">
+ <label>Export Formats :</label>
+ <div class="o_export_format"/>
+ </div>
+ </div>
+
+ <div class="o_export_panel">
+ <div class="o_left_panel">
+ <h4>Available fields</h4>
+ <div class="o_left_field_panel"/>
+ </div>
+ <div class="o_center_panel">
+ <button type="button" class="btn btn-sm btn-default o_add_field">Add</button>
+ <button type="button" class="btn btn-sm btn-default o_remove_field">Remove</button>
+ <button type="button" class="btn btn-sm btn-default o_remove_all_field">Remove All</button>
+ <button type="button" class="btn btn-sm btn-default o_move_up">Move Up</button>
+ <button type="button" class="btn btn-sm btn-default o_move_down">Move Down</button>
+ </div>
+ <div class="o_right_panel">
+ <h4>
+ <a href="#" class="pull-right o_toggle_save_list">Save fields list</a>
+ Fields to export
+ </h4>
+ <div class="o_save_list"/>
+ <div class="o_exported_lists"/>
+ <select class="o_fields_list" multiple="multiple"></select>
+ </div>
+ </div>
+</div>
+<p t-name="Export.DomainMessage">
+ <strong t-if="!record.ids_to_export">Please pay attention that all records matching your search filter will be exported. Not only the selected ids.</strong>
+ <strong t-if="record.ids_to_export">Please note that only the selected ids will be exported.</strong>
+</p>
+<div t-name="Export.TreeItems"
t-foreach="fields" t-as="field"
- t-att-id="'treerow-' + field.id" class="oe_export_row">
- <td>
- <table class="tree_grid" border="0">
- <tr class="oe_export_row">
- <t t-foreach="(field.id).split('/')" t-as="level" >
- <t t-if="(field.id).split('/')[0] != level">
- <td width="18" t-translation="off">&amp;nbsp;</td>
- </t>
- </t>
- <td valign="top" align="left" style="cursor: pointer;" width="18">
- <t t-if="field.children">
- <t t-if="(field.id).split('/').length != 3">
- <img t-att-id="'parentimg-' + field.id" t-att-src='_s + "/web/static/src/img/expand.gif"' width="16" height="16" border="0"/>
- </t>
- </t>
- </td>
- <td id="tree-column" valign="middle" align="left" style="cursor: pointer;">
- <a t-att-id="'export-' + field.id" t-att-string="field.string" href="javascript: void(0);" style="text-decoration: none;">
- <t t-esc="field.string"/>
- </a>
- </td>
- </tr>
- </table>
- </td>
-</tr>
-<t t-name="ExportNewList">
- <tr>
- <th><label>Save as:</label></th>
- <td><input size="10" type="text" id="savelist_name"/></td>
- <td><button class="oe_button oe_export_button_export" id="add_export_list">Ok</button></td>
- </tr>
-</t>
-<t t-name="Exists.ExportList">
- <label for="saved_export_list">Saved exports:</label>
-
- <select id="saved_export_list">
+ t-att-data-id="field.id"
+ class="o_export_tree_item"
+ tabindex="-1"> <!-- tabindex make the div focusable -->
+ <span t-if="field.children &amp;&amp; (field.id).split('/').length != 3"
+ class="o_expand_parent fa fa-plus"/>
+ <span class="o_tree_column"><t t-esc="field.string"/></span>
+</div>
+<t t-name="Export.SaveList">
+ <label>Save as:</label> <input type="text"/><button type="button" class="btn btn-sm btn-default">Ok</button>
+</t>
+<t t-name="Export.SavedList">
+ <label>Saved exports: </label>
+ <select class="o_exported_lists_select">
<option></option>
<t t-foreach="existing_exports" t-as="export">
<option t-att-value="export.id"><t t-esc="export.name"/></option>
</t>
</select>
- <button class="oe_button oe_export_button_export" id="delete_export_list" type="button">Delete</button>
+ <button type="button" class="btn btn-sm btn-default o_delete_exported_list">Delete</button>
</t>
<t t-name="Throbber">
@@ -1421,32 +1249,26 @@
</t>
<t t-name="M2ODialog">
<div>
- <p class="oe_grey"/>
+ <p/>
Name: <input class="oe_form_m2o_input_name" type="text"/>
</div>
</t>
<t t-name="FieldMonetary" t-extend="FieldChar">
- <t t-jquery="t:first" t-operation="before">
- <t t-if="widget.get('currency_info') and widget.get('currency_info').position === 'before'">
- <t t-esc="widget.get('currency_info').symbol"/>
- </t>
- </t>
- <t t-jquery="t:last" t-operation="after">
- <t t-if="widget.get('currency_info') and widget.get('currency_info').position === 'after'">
- <t t-esc="widget.get('currency_info').symbol"/>
- </t>
+ <t t-jquery="input">
+ var $div = $(document.createElement('div')).attr('t-if', this.attr('t-if')).addClass('o_form_field_monetary');
+ this.clone(true).appendTo($div);
+ this.replaceWith($div);
</t>
</t>
<t t-name="FieldMany2ManyCheckBoxes">
- <t t-foreach="widget.get('records')" t-as="record">
- <div>
- <label style="font-weight: normal">
- <input type="checkbox" t-att-data-record-id="JSON.stringify(record[0])"
- t-att-checked="(widget.get('value').indexOf(record[0]) !== -1) or null"/>
- <t t-esc="record[1]"/>
- </label>
+ <div t-foreach="widget.get('records')" t-as="record">
+ <div class="o_checkbox">
+ <input t-if="widget.get('value').indexOf(record[0]) !== -1" type="checkbox" t-att-data-record-id="JSON.stringify(record[0])" checked="checked"/>
+ <input t-if="widget.get('value').indexOf(record[0]) === -1" type="checkbox" t-att-data-record-id="JSON.stringify(record[0])"/>
+ <span/>
</div>
- </t>
+ <label class="o_form_label"><t t-esc="record[1]"/></label>
+ </div>
</t>
<t t-name="X2ManyCounter">
<a href="javascript:void(0)"><t t-esc="text"/></a>
@@ -1456,12 +1278,22 @@
<span class="o_stat_text"><t t-esc="text"/></span>
</t>
-<button t-name="toggle_button" type="button"
- t-att-title="widget.string"
- style="box-shadow: none; white-space:nowrap;">
- <img t-attf-src="#{prefix}/web/static/src/img/icons/#{widget.icon}.png"
- t-att-alt="widget.string"/>
-</button>
+<t t-name="toggle_button">
+ <button type="button" class="o_icon_button" t-att-title="widget.string">
+ <img t-attf-src="#{prefix || _s}/web/static/src/img/icons/#{widget.icon}.png" t-att-alt="widget.string"/>
+ </button>
+</t>
+
+<t t-name="BooleanButton">
+ <t t-if="widget.get_value()">
+ <span class="o_stat_text o_not_hover text-success"><t t-esc="widget.string_true"/></span>
+ <span class="o_stat_text o_hover text-danger"><t t-esc="widget.hover_true"/></span>
+ </t>
+ <t t-if="!widget.get_value()">
+ <span class="o_stat_text o_not_hover text-danger"><t t-esc="widget.string_false"/></span>
+ <span class="o_stat_text o_hover text-success"><t t-esc="widget.hover_false"/></span>
+ </t>
+</t>
<div t-name="Pager">
<span class="o_pager_value"></span> / <span class="o_pager_limit"></span>
@@ -1476,20 +1308,11 @@
</span>
</div>
-<button t-name="FieldToggleBoolean" type="button"
- t-att-title="widget.string" class="oe_toggle_button">
- <img t-attf-src="#{_s}/web/static/src/img/icons/#{widget.icon}" t-att-alt="widget.string"/>
-</button>
-
-<t t-name="BooleanButton">
- <t t-if="widget.get_value()">
- <span class="o_stat_text o_not_hover text-success"><t t-esc="widget.string_true"/></span>
- <span class="o_stat_text o_hover text-danger"><t t-esc="widget.hover_true"/></span>
- </t>
- <t t-if="!widget.get_value()">
- <span class="o_stat_text o_not_hover text-danger"><t t-esc="widget.string_false"/></span>
- <span class="o_stat_text o_hover text-success"><t t-esc="widget.hover_false"/></span>
- </t>
+<t t-name="Menu.needaction_counter">
+ <div id="menu_counter" class="badge pull-right">
+ <t t-if="widget.needaction_counter &gt; 99"> 99+ </t>
+ <t t-if="widget.needaction_counter &lt;= 99"> <t t-esc="widget.needaction_counter"/> </t>
+ </div>
</t>
<t t-name="notification-box">
@@ -1509,6 +1332,68 @@
</t>
</t>
+<t t-name="UserMenu">
+ <li class="o_user_menu">
+ <a class="dropdown-toggle" data-toggle="dropdown" aria-expanded="false" href="#">
+ <img class="img-circle oe_topbar_avatar" t-att-src="_s + '/web/static/src/img/user_menu_avatar.png'"/>
+ <span class="oe_topbar_name"/> <span class="caret"></span>
+ </a>
+ <ul class="dropdown-menu" role="menu">
+ <li><a href="#" data-menu="documentation">Documentation</a></li>
+ <li><a href="#" data-menu="support">Support</a></li>
+ <li><a href="#" data-menu="about">About</a></li>
+ <li class="divider"/>
+ <li><a href="#" data-menu="settings">Preferences</a></li>
+ <li><a href="#" data-menu="account">My Odoo.com account</a></li>
+ <li><a href="#" data-menu="logout">Log out</a></li>
+ </ul>
+ </li>
+</t>
+
+<div t-name="UserMenu.about" class="oe_about">
+ <div class="container-fluid">
+ <div class="row">
+ <div class="col-sm-offset-2 col-md-offset-2 col-sm-8 col-md-8 user-details">
+ <div class="user-image text-center">
+ <img src="/web/static/src/img/logo2.png" alt="Odoo (Formerly OpenERP)" title="Odoo (Formerly OpenERP)" class="img-circle"/>
+ </div>
+ <div class="user-info-block text-center">
+ <div class="user-heading">
+ <h3>
+ Version <t t-esc="db_info.server_version"/>
+ (Enterprise Edition)
+ </h3>
+ <t t-if="db_info.expiration_date">
+ <h5>Database expiration: <t t-esc="new moment(db_info.expiration_date).format('LL')"/></h5>
+ </t>
+ </div>
+ <div class="user-body">
+ <div class="tab-content">
+ <div id="settings" class="tab-pane active">
+ <h4>Copyright © 2004-2015 Odoo S.A.</h4>
+ <p>Odoo is a trademark of <a target="_blank" href="https://www.odoo.com" style="text-decoration: underline;">Odoo S.A.</a></p>
+ <p>Licenced under the terms of <a target="_blank" href="http://www.gnu.org/licenses/lgpl.html" style="text-decoration: underline;">GNU Lesser General Public License</a></p>
+ <p>For more information visit <a target="_blank" href="https://www.odoo.com" style="text-decoration: underline;">Odoo.com</a></p>
+ <p>
+ <a href="https://www.odoo.com/web/about/facebook"><i class="fa fa-facebook-square fa-3x social-fb"></i></a>
+ <a href="https://www.odoo.com/web/about/twitter"><i class="fa fa-twitter-square fa-3x social-tw"></i></a>
+ <a href="https://www.odoo.com/web/about/googleplus"><i class="fa fa-google-plus-square fa-3x social-gp"></i></a>
+ <a href="https://www.odoo.com/web/about/linkedin"><i class="fa fa-linkedin-square fa-3x social-lk"></i></a>
+ </p>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="row" t-if="!debug">
+ <div class="col-md-12">
+ <a class="oe_activate_debug_mode pull-right" href="?debug" >Activate the developer mode</a>
+ </div>
+ </div>
+ </div>
+</div>
+
<t t-name="EnterpriseUpgrade">
<div class="row">
<div class="col-xs-6">
diff --git a/addons/web/static/src/xml/base_common.xml b/addons/web/static/src/xml/base_common.xml
index 2e73f9a153e..1570b5a8717 100644
--- a/addons/web/static/src/xml/base_common.xml
+++ b/addons/web/static/src/xml/base_common.xml
@@ -5,10 +5,10 @@
<div t-name="Dialog" class="modal" tabindex="-1" data-backdrop="static" role="dialog" aria-hidden="true">
<div class="modal-dialog">
- <div class="modal-content openerp">
+ <div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
- <h4 class="modal-title"><t t-raw="title"/><span class="o_subtitle text-muted"><t t-esc="subtitle"/></span></h4>
+ <h4 class="modal-title"><t t-raw="title"/><span class="o_subtitle text-muted small"><t t-esc="subtitle"/></span></h4>
</div>
<div class="modal-body"/>
<div class="modal-footer"/>
@@ -17,7 +17,7 @@
</div>
<t t-name="WidgetButton">
- <button type="button" t-attf-class="btn btn-sm oe_button #{widget.node.attrs.class or ''}"
+ <button type="button" t-attf-class="btn btn-sm #{widget.node.attrs.class or ''}"
t-att-style="widget.node.attrs.style"
t-att-tabindex="widget.node.attrs.tabindex"
t-att-autofocus="widget.node.attrs.autofocus"
diff --git a/addons/web/static/test/list-editable.js b/addons/web/static/test/list-editable.js
index 0b94958020d..be2acdb1365 100644
--- a/addons/web/static/test/list-editable.js
+++ b/addons/web/static/test/list-editable.js
@@ -43,7 +43,7 @@ odoo.define_section('editor', ['web.ListEditor'], function (test, mock) {
tag: 'form',
attrs: {
version: '7.0',
- 'class': 'oe_form_container'
+ 'class': 'o_list_editable_form'
},
children: children
},
diff --git a/addons/web/static/test/list.js b/addons/web/static/test/list.js
index 298e65b5972..9d1d1b9ec7d 100644
--- a/addons/web/static/test/list.js
+++ b/addons/web/static/test/list.js
@@ -12,7 +12,6 @@ odoo.define_section('list.buttons', ['web.ListView', 'web.data', 'web.data_manag
throw new Error(JSON.stringify(_.toArray(arguments)));
});
mock.add('demo:search_read', function (args, kwargs) {
- console.log(args);
if (_.isEqual(args[0], [['id', 'in', [2]]])) {
return [];
}
diff --git a/addons/web/static/test/menu.js b/addons/web/static/test/menu.js
index 8f183481bb5..584f8fb5dc0 100644
--- a/addons/web/static/test/menu.js
+++ b/addons/web/static/test/menu.js
@@ -1,3 +1,5 @@
+// This test is deprecated since v9 at least and thus no longer put in the bundles
+
odoo.define('web.test.menu', function (require) {
"use strict";
diff --git a/addons/web/static/test/search.js b/addons/web/static/test/search.js
index dad64c018b4..6086d2a30fc 100644
--- a/addons/web/static/test/search.js
+++ b/addons/web/static/test/search.js
@@ -1196,9 +1196,9 @@ odoo.define_section('search.serialization', ['web.search_inputs', 'web.SearchVie
var $fix = $('#qunit-fixture');
return view.appendTo($fix)
.done(function () {
- assert.ok(view.$buttons.find('.filters-menu').length,
+ assert.ok(view.$buttons.find('.o_filters_menu').length,
"filters menu has been drawn");
- assert.ok(view.$buttons.find('.group-by-menu').length,
+ assert.ok(view.$buttons.find('.o_group_by_menu').length,
"group by menu has been drawn");
assert.ok(view.$buttons.find('.o_favorites_menu').length,
"favorites menu has been drawn");
@@ -1228,9 +1228,9 @@ odoo.define_section('search.filters', ['web.search_inputs', 'web.SearchView', 'w
return view.appendTo($fix)
.done(function () {
- var $filters = view.$buttons.find('.filters-menu li'),
+ var $filters = view.$buttons.find('.o_filters_menu li'),
$favorites = view.$buttons.find('.o_favorites_menu li'),
- $groupby = view.$buttons.find('.group-by-menu li');
+ $groupby = view.$buttons.find('.o_group_by_menu li');
// 3 filters, 1 separator, 1 button add filter, 1 apply button
assert.equal($filters.length, 6,
'filter menu should have 6 elements total');
@@ -1258,7 +1258,7 @@ odoo.define_section('search.filters', ['web.search_inputs', 'web.SearchView', 'w
var $fix = $('#qunit-fixture');
return view.appendTo($fix)
.done(function () {
- var $fs = view.$buttons.find('.filters-menu li a');
+ var $fs = view.$buttons.find('.o_filters_menu li a');
$fs.eq(2).trigger('click');
assert.equal(view.query.length, 1, "click should have added a facet");
var facet = view.query.at(0);
@@ -1278,7 +1278,7 @@ odoo.define_section('search.filters', ['web.search_inputs', 'web.SearchView', 'w
var $fix = $('#qunit-fixture');
return view.appendTo($fix)
.done(function () {
- var $fs = view.$buttons.find('.filters-menu li a');
+ var $fs = view.$buttons.find('.o_filters_menu li a');
$fs.eq(2).trigger('click');
assert.equal(view.query.length, 1, "click should not have changed facet count");
var facet = view.query.at(0);
@@ -1304,7 +1304,7 @@ odoo.define_section('search.filters', ['web.search_inputs', 'web.SearchView', 'w
var $fix = $('#qunit-fixture');
return view.appendTo($fix)
.done(function () {
- var $fs = view.$buttons.find('.filters-menu li a');
+ var $fs = view.$buttons.find('.o_filters_menu li a');
// sanity check
assert.equal(view.query.length, 1, "query should have default facet");
assert.strictEqual(calls, 0);
@@ -1414,7 +1414,7 @@ odoo.define_section('search.filters.saved', ['web.search_inputs', 'web.SearchVie
var $li = view.favorite_menu.$el.find('li:first').click();
assert.ok($li.hasClass('selected'), "should check/select the filter's row");
- assert.ok($li.hasClass("oe_searchview_custom_private"),
+ assert.ok($li.hasClass("o-searchview-custom-private"),
"should have private filter note/class");
assert.equal(view.query.length, 1, "should have only one facet");
var values = view.query.at(0).values;
@@ -1508,8 +1508,8 @@ odoo.define_section('search.filters.saved', ['web.search_inputs', 'web.SearchVie
var $fix = $('#qunit-fixture');
return view.appendTo($fix)
.then(function () {
- view.favorite_menu.$el.find('.oe-save-name input').first().val("filter name");
- view.favorite_menu.$el.find('.oe-save-name button').click();
+ view.favorite_menu.$el.find('.o_save_name input').first().val("filter name");
+ view.favorite_menu.$el.find('.o_save_name button').click();
return done.promise();
});
});
@@ -1526,9 +1526,9 @@ odoo.define_section('search.advanced', ['web.search_inputs', 'web.SearchView', '
.done(function () {
var $filter_menu = view.filter_menu.$el;
// open advanced search (not actually useful)
- $filter_menu.find('.oe-add-filter').click();
+ $filter_menu.find('.o_add_filter').click();
// select proposition (only one)
- var $prop = $filter_menu.find('.oe-filter-condition');
+ var $prop = $filter_menu.find('.o_filter_condition');
// field select should have two possible values, dummy and id
assert.equal($prop.find('select:first option').length,
2, "advanced search should provide choice between two fields");
@@ -1537,13 +1537,13 @@ odoo.define_section('search.advanced', ['web.search_inputs', 'web.SearchView', '
'dummy',
"only field should be dummy");
// operator should be "contains"/'ilike'
- assert.equal($prop.find('.searchview_extended_prop_op').val(),
+ assert.equal($prop.find('.o_searchview_extended_prop_op').val(),
'ilike', "default char operator should be ilike");
// put value in
- $prop.find('.searchview_extended_prop_value input')
+ $prop.find('.o_searchview_extended_prop_value input')
.val("stupid value");
// validate advanced search
- $filter_menu.find('button.oe-apply-filter').click();
+ $filter_menu.find('button.o_apply_filter').click();
// resulting search
assert.equal(view.query.length, 1, "search query should have a single facet");
var facet = view.query.at(0);
@@ -1565,26 +1565,26 @@ odoo.define_section('search.advanced', ['web.search_inputs', 'web.SearchView', '
.done(function () {
var $filter_menu = view.filter_menu.$el;
// open advanced search (not actually useful)
- $filter_menu.find('.oe-add-filter').click();
+ $filter_menu.find('.o_add_filter').click();
// open second condition
- $filter_menu.find('a.oe-add-condition').click();
+ $filter_menu.find('button.o_add_condition').click();
// select first proposition
- var $prop1 = $filter_menu.find('.oe-filter-condition:first');
- $prop1.find('select.searchview_extended_prop_field').val("dummy").change();
- $prop1.find('select.searchview_extended_prop_op').val('ilike');
- $prop1.find('.searchview_extended_prop_value input')
+ var $prop1 = $filter_menu.find('.o_filter_condition:first');
+ $prop1.find('select.o_searchview_extended_prop_field').val("dummy").change();
+ $prop1.find('select.o_searchview_extended_prop_op').val('ilike');
+ $prop1.find('.o_searchview_extended_prop_value input')
.val("stupid value");
// select first proposition
- var $prop2 = $filter_menu.find('.oe-filter-condition:last');
+ var $prop2 = $filter_menu.find('.o_filter_condition:last');
// need to trigger event manually or op not changed
- $prop2.find('select.searchview_extended_prop_field').val('id').change();
- $prop2.find('select.searchview_extended_prop_op').val('=');
- $prop2.find('.searchview_extended_prop_value input')
+ $prop2.find('select.o_searchview_extended_prop_field').val('id').change();
+ $prop2.find('select.o_searchview_extended_prop_op').val('=');
+ $prop2.find('.o_searchview_extended_prop_value input')
.val(42);
// validate advanced search
- $filter_menu.find('button.oe-apply-filter').click();
+ $filter_menu.find('button.o_apply_filter').click();
// resulting search
assert.equal(view.query.length, 1, "search query should have a single facet");
diff --git a/addons/web/static/test/x2many.js b/addons/web/static/test/x2many.js
index f57b03bcb1d..e053c974fb3 100644
--- a/addons/web/static/test/x2many.js
+++ b/addons/web/static/test/x2many.js
@@ -13,33 +13,33 @@ Tour.register({
steps: [
{
title: "wait web client",
- waitFor: '.oe-view-title:contains(Discussions)'
+ waitFor: '.breadcrumb:contains(Discussions)'
},
// create test discussion
{
title: "create new discussion",
- element: 'button.o_list_button_add'
+ element: 'button.o_list_button_add',
},
{
title: "insert title",
- element: '.oe_form_required input',
+ element: 'input.o_form_required',
sampleText: 'test'
},
// try to add a user with one2many form
{
title: "click on moderator one2many drop down",
- waitFor: '.oe_form_required input:propValue(test)',
- element: 'tr:contains(Moderator) .oe_m2o_drop_down_button'
+ waitFor: 'input.o_form_required:propValue(test)',
+ element: 'tr:contains(Moderator) .o_form_input_dropdown > input'
},
{
title: "click on 'Create and Edit...'",
- element: '.oe_m2o_dropdown_option:last'
+ element: '.o_m2o_dropdown_option:last'
},
{
title: "insert a name into the modal form",
- element: '.modal .oe_form_field.oe_form_required:first input',
+ element: '.modal input.o_form_field.o_form_required:first',
sampleText: 'user_test',
onload: function () {
inc = new Date().getTime();
@@ -48,8 +48,8 @@ Tour.register({
},
{
title: "insert an email into the modal form",
- waitFor: '.modal .oe_form_field.oe_form_required input:propValueContains(user_test)',
- element: '.modal .oe_form_field.oe_form_required:eq(1) input',
+ waitFor: '.modal input.o_form_field.o_form_required:propValueContains(user_test)',
+ element: '.modal input.o_form_field.o_form_required:eq(1)',
sampleText: 'user_test@test',
onload: function () {
this.sampleText = 'user_test_' + inc + '@test';
@@ -57,50 +57,50 @@ Tour.register({
},
{
title: "save the modal content and create the new moderator",
- waitFor: '.modal .oe_form_field.oe_form_required input:propValueContains(@test)',
- element: '.modal .o_formdialog_save',
+ waitFor: '.modal input.o_form_field.o_form_required:propValueContains(@test)',
+ element: '.modal .modal-footer button:contains(Save)',
},
{
title: "check if the modal is saved",
- waitFor: 'tr:contains(Moderator) .oe_form_field_many2one input:propValueContains(user_test)',
+ waitFor: 'tr:contains(Moderator) .o_form_field_many2one input:propValueContains(user_test)',
},
{
title: "check the onchange from the o2m to the m2m",
- waitFor: '.tab-pane:last tr:has(.oe_list_field_cell):not(:has(.oe_list_record_selector)):contains(user_test)',
+ waitFor: '.tab-pane:eq(1) .o_form_field.o_view_manager_content tbody tr td:contains(user_test)',
},
// add message a
{
title: "create new message a",
- element: '.oe_form_field_x2many_list_row_add:first a'
+ element: '.tab-pane:eq(0) .o_form_field_x2many_list_row_add a'
},
{
title: "insert body a",
- element: '.modal textarea.field_text',
+ element: '.modal textarea.o_form_textarea',
sampleText: 'a'
},
{
title: "save new message a",
- waitFor: '.modal textarea.field_text:propValue(a)',
- element: '.o_formdialog_save'
+ waitFor: '.modal textarea.o_form_textarea:propValue(a)',
+ element: '.modal .modal-footer button:contains(Save)'
},
// add message b
{
title: "create new message b",
waitNot: '.modal',
- waitFor: '.oe_application:has(.oe_list_field_cell):has(textarea[name="message_concat"]:propValue([test] Administrator:a))',
- element: '.oe_form_field_x2many_list_row_add:first a'
+ waitFor: '.o_web_client:has(textarea[name="message_concat"]:propValue([test] Administrator:a))',
+ element: '.tab-pane:eq(0) .o_form_field_x2many_list_row_add a'
},
{
title: "insert body b",
- element: '.modal textarea.field_text',
+ element: '.modal textarea.o_form_textarea',
sampleText: 'b'
},
{
title: "save new message b",
- waitFor: '.modal textarea.field_text:propValue(b)',
- element: '.o_formdialog_save'
+ waitFor: '.modal textarea.o_form_textarea:propValue(b)',
+ element: '.modal .modal-footer button:contains(Save)'
},
// change title to trigger on change
@@ -108,13 +108,13 @@ Tour.register({
title: "insert title",
waitNot: '.modal',
waitFor: 'textarea[name="message_concat"]:propValue([test] Administrator:a\n[test] Administrator:b)',
- element: '.oe_form_required input',
+ element: 'input.o_form_required',
sampleText: 'test_trigger'
},
{
title: "blur the title field",
- waitFor: '.oe_form_required input:propValue(test_trigger)',
- element: '.oe_form_field_many2one input:first',
+ waitFor: 'input.o_form_required:propValue(test_trigger)',
+ element: '.o_form_field_many2one input:first',
},
{
title: "check onchange",
@@ -125,19 +125,19 @@ Tour.register({
{
title: "edit message b",
- waitFor: '.tab-pane:first tr:has(.oe_list_field_cell):not(:has(.oe_list_record_selector)):eq(1) .oe_list_field_cell:contains([test_trigger] )',
- waitNot: '.tab-pane:first tr:has(.oe_list_field_cell):not(:has(.oe_list_record_selector)):eq(2)',
- element: '.oe_list_field_cell:containsExact(b)'
+ waitFor: '.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody tr td:contains([test_trigger] )',
+ waitNot: '.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody tr[data-id]:eq(2)',
+ element: '.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody tr td:containsExact(b)'
},
{
title: "change the body",
- element: '.modal textarea.field_text',
+ element: '.modal textarea.o_form_textarea',
sampleText: 'bbb'
},
{
title: "save changes",
- waitFor: '.modal textarea.field_text:propValue(bbb)',
- element: '.o_formdialog_save'
+ waitFor: '.modal textarea.o_form_textarea:propValue(bbb)',
+ element: '.modal .modal-footer button:contains(Save)'
},
// add message c
@@ -145,77 +145,77 @@ Tour.register({
title: "create new message c",
waitNot: '.modal',
waitFor: 'textarea[name="message_concat"]:propValue([test_trigger] Administrator:a\n[test_trigger] Administrator:bbb)',
- element: '.oe_form_field_x2many_list_row_add:first a'
+ element: '.tab-pane:eq(0) .o_form_field_x2many_list_row_add a'
},
{
title: "insert body",
- element: '.modal textarea.field_text',
+ element: '.modal textarea.o_form_textarea',
sampleText: 'c'
},
{
title: "save new message c",
- waitFor: '.modal textarea.field_text:propValue(c)',
- element: '.o_formdialog_save'
+ waitFor: '.modal textarea.o_form_textarea:propValue(c)',
+ element: '.modal .modal-footer button:contains(Save)'
},
// add participants
{
title: "change tab to Participants",
waitNot: '.modal',
- waitFor: '.oe_form_field_one2many .oe_list_field_cell:eq(3)',
+ waitFor: '.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody tr[data-id]:eq(2)',
element: '[data-toggle="tab"]:contains(Participants)'
},
{
title: "click to add participants",
- element: '.tab-pane:eq(1).active .oe_form_field_x2many_list_row_add a'
+ element: '.tab-pane:eq(1).active .o_form_field_x2many_list_row_add a'
},
{
title: "select Admin",
- element: '.modal .oe_list_content tr:has(td[data-field="name"]:containsExact(Administrator)) .oe_list_record_selector input[type="checkbox"]'
+ element: '.modal tr:has(td[data-field="name"]:containsExact(Administrator)) .o_list_record_selector input[type="checkbox"]'
},
{
title: "select Demo User",
- waitFor: '.modal .oe_list_content tr:has(td[data-field="name"]:containsExact(Administrator)) .oe_list_record_selector input[type="checkbox"]:propChecked',
- element: '.modal .oe_list_content tr:has(td[data-field="name"]:containsExact(Demo User)) .oe_list_record_selector input[type="checkbox"]'
+ waitFor: '.modal tr:has(td[data-field="name"]:containsExact(Administrator)) .o_list_record_selector input[type="checkbox"]:propChecked',
+ element: '.modal tr:has(td[data-field="name"]:containsExact(Demo User)) .o_list_record_selector input[type="checkbox"]'
},
{
title: "save selected participants",
- waitFor: '.modal .oe_list_content tr:has(td[data-field="name"]:containsExact(Demo User)) .oe_list_record_selector input[type="checkbox"]:propChecked',
+ waitFor: '.modal tr:has(td[data-field="name"]:containsExact(Demo User)) .o_list_record_selector input[type="checkbox"]:propChecked',
element: '.o_selectcreatepopup_search_select'
},
// save
{
title: "save discussion",
- waitFor: '.oe_form_field_many2many tbody tr:has(.oe_list_field_char):eq(2)',
- waitNot: '.oe_form_field_many2many tbody tr:has(.oe_list_field_char):eq(3)',
- element: 'button.oe_form_button_save'
+ waitFor: '.tab-pane:eq(1) .o_form_field.o_view_manager_content tbody tr[data-id]:eq(2)',
+ waitNot: '.tab-pane:eq(1) .o_form_field.o_view_manager_content tbody tr[data-id]:eq(3)',
+ element: 'button.o_form_button_save'
},
// check saved data
{
title: "check data 1",
- waitFor: '.oe_form_field_one2many tbody tr:has(.oe_list_field_char):eq(2)',
- waitNot: '.oe_form_field_one2many tbody tr:has(.oe_list_field_char):eq(3)',
+ waitFor: '.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody tr[data-id]:eq(2)',
+ waitNot: '.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody tr[data-id]:eq(3)',
},
{
title: "check data 2",
- waitFor: '.oe_form_field_one2many tr:has(.oe_list_field_text:containsExact(bbb)):has(.oe_list_field_char:containsExact([test_trigger] Administrator))',
+ waitFor: '.tab-pane:eq(0) .o_form_field.o_view_manager_content tr:has(td:containsExact(bbb)):has(td:containsExact([test_trigger] Administrator))',
},
{
title: "check data 3",
- waitFor: '.oe_form_field_many2many tbody tr:has(.oe_list_field_char):eq(2)',
- waitNot: '.oe_form_field_many2many tbody tr:has(.oe_list_field_char):eq(3)',
+ waitFor: '.tab-pane:eq(1) .o_form_field.o_view_manager_content tbody tr[data-id]:eq(2)',
+ waitNot: '.tab-pane:eq(1) .o_form_field.o_view_manager_content tbody tr[data-id]:eq(3)',
},
// edit
{
title: "edit discussion",
- element: 'button.oe_form_button_edit'
+ element: 'button.o_form_button_edit'
},
{
title: "change tab to Participants",
- waitFor: '.oe_form_editable',
+ waitFor: '.o_form_editable',
element: '[data-toggle="tab"]:contains(Messages)'
},
@@ -223,74 +223,74 @@ Tour.register({
{
title: "create new message d",
waitFor: 'li.active a[data-toggle="tab"]:contains(Messages)',
- element: '.oe_form_field_x2many_list_row_add:first a'
+ element: '.tab-pane:eq(0) .o_form_field_x2many_list_row_add a'
},
{
title: "insert body",
- element: '.modal textarea.field_text',
+ element: '.modal textarea.o_form_textarea',
sampleText: 'd'
},
{
title: "save new message d",
- waitFor: '.modal textarea.field_text:propValue(d)',
- element: '.o_formdialog_save'
+ waitFor: '.modal textarea.o_form_textarea:propValue(d)',
+ element: '.modal .modal-footer button:contains(Save)'
},
// add message e
{
title: "create new message e",
waitNot: '.modal',
- waitFor: '.oe_list_field_cell:containsExact(d)',
- element: '.oe_form_field_x2many_list_row_add:first a'
+ waitFor: '.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody tr td:containsExact(d)',
+ element: '.tab-pane:eq(0) .o_form_field_x2many_list_row_add a'
},
{
title: "insert body",
- element: '.modal textarea.field_text',
+ element: '.modal textarea.o_form_textarea',
sampleText: 'e'
},
{
title: "save new message e",
- waitFor: '.modal textarea.field_text:propValue(e)',
- element: '.o_formdialog_save'
+ waitFor: '.modal textarea.o_form_textarea:propValue(e)',
+ element: '.modal .modal-footer button:contains(Save)'
},
// change message a
{
title: "edit message a",
waitNot: '.modal',
- waitFor: '.oe_list_field_cell:containsExact(e)',
- element: '.oe_list_field_cell:containsExact(a)'
+ waitFor: '.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody tr td:containsExact(e)',
+ element: '.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody tr td:containsExact(a)'
},
{
title: "change the body",
- element: '.modal textarea.field_text',
+ element: '.modal textarea.o_form_textarea',
sampleText: 'aaa'
},
{
title: "save changes",
- waitFor: '.modal textarea.field_text:propValue(aaa)',
- element: '.o_formdialog_save'
+ waitFor: '.modal textarea.o_form_textarea:propValue(aaa)',
+ element: '.modal .modal-footer button:contains(Save)'
},
// change message e
{
title: "edit message e",
waitNot: '.modal',
- waitFor: '.oe_list_field_text:contains(aaa)',
- element: '.oe_list_field_cell:containsExact(e)'
+ waitFor: '.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody tr td:contains(aaa)',
+ element: '.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody tr td:containsExact(e)'
},
{
- title: "open the many2one to select an other user",
- element: '.modal .oe_m2o_drop_down_button',
+ title: "open the many2one to select another user",
+ element: '.modal .o_form_input_dropdown > input',
},
{
- title: "select an other user",
+ title: "select another user",
element: '.ui-autocomplete li:contains(Demo User)',
},
{
title: "test one2many's line onchange after many2one",
- waitFor: '.oe_form_char_content:contains([test_trigger] Demo User)',
+ waitFor: '.modal .o_form_field:contains([test_trigger] Demo User)',
},
{
title: "test one2many field not triggered onchange",
@@ -298,11 +298,11 @@ Tour.register({
},
{
title: "save changes",
- element: '.o_formdialog_save'
+ element: '.modal .modal-footer button:contains(Save)'
},
{
title: "test one2many triggered the onchange on save for the line",
- waitFor: '.oe_list_content td.oe_list_field_cell.oe_readonly:contains([test_trigger] Demo User)',
+ waitFor: '.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody tr td.o_readonly:contains([test_trigger] Demo User)',
},
{
title: "test one2many triggered the onchange on save",
@@ -313,82 +313,82 @@ Tour.register({
{
title: "remove b",
waitNot: '.modal',
- waitFor: '.oe_list_field_text:contains(aaa)',
- element: 'tr:has(.oe_list_field_cell:containsExact(bbb)) .oe_list_record_delete'
+ waitFor: '.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody tr td:contains(aaa)',
+ element: '.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody tr:has(td:containsExact(bbb)) .o_list_record_delete'
},
{
title: "remove e",
- waitNot: 'tr:has(.oe_list_field_cell:containsExact(bbb))',
- element: 'tr:has(.oe_list_field_cell:containsExact(e)) .oe_list_record_delete'
+ waitNot: 'tr:has(td:containsExact(bbb))',
+ element: 'tr:has(td:containsExact(e)) .o_list_record_delete'
},
// save
{
title: "save discussion",
- waitNot: 'tr:has(.oe_list_field_cell:containsExact(e))',
- element: 'button.oe_form_button_save'
+ waitNot: 'tr:has(td:containsExact(e))',
+ element: 'button.o_form_button_save'
},
// check saved data
{
title: "check data 4",
- waitNot: '.oe_form_field_one2many tbody tr:has(.oe_list_field_char):eq(4)',
+ waitNot: '.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody tr:has(.o_list_record_delete):eq(4)',
},
{
title: "check data 5",
- waitFor: 'body:has(.oe_list_field_text:containsExact(aaa)):has(.oe_list_field_text:containsExact(c)):has(.oe_list_field_text:containsExact(d))',
+ waitFor: '.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody:has(tr td:containsExact(aaa)):has(tr td:containsExact(c)):has(tr td:containsExact(d))',
},
{
title: "check data 6",
- waitFor: '.oe_form_field_one2many tr:has(.oe_list_field_text:containsExact(aaa)):has(.oe_list_field_char:containsExact([test_trigger] Administrator))',
+ waitFor: '.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody tr:has(td:containsExact([test_trigger] Administrator)):has(td:containsExact(aaa))',
},
{
title: "check data 7",
- waitFor: '.oe_form_field_many2many tbody tr:has(.oe_list_field_char):eq(2)',
- waitNot: '.oe_form_field_many2many tbody tr:has(.oe_list_field_char):eq(3)',
+ waitFor: '.tab-pane:eq(1) .o_form_field.o_view_manager_content tbody tr[data-id]:eq(2)',
+ waitNot: '.tab-pane:eq(1) .o_form_field.o_view_manager_content tbody tr[date-id]:eq(3)',
},
// edit
{
title: "edit discussion",
- element: 'button.oe_form_button_edit'
+ element: 'button.o_form_button_edit'
},
// add message ddd
{
title: "create new message ddd",
waitNot: '.modal',
- waitFor: '.oe_list_field_cell:containsExact(d)',
- element: '.oe_form_field_x2many_list_row_add:first a'
+ waitFor: '.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody tr:has(td:containsExact(d))',
+ element: '.tab-pane:eq(0) .o_form_field_x2many_list_row_add a'
},
{
- title: "select an other user",
- element: '.modal .oe_m2o_drop_down_button',
+ title: "select another user",
+ element: '.modal .o_form_field_many2one .o_form_input_dropdown > input',
},
{
title: "select demo user",
- element: 'li:contains(Demo User)',
+ element: 'li a:contains(Demo User)',
},
{
title: "test one2many's line onchange after many2one",
- waitFor: '.oe_form_char_content:contains([test_trigger] Demo User)',
+ waitFor: '.modal .o_form_field:contains([test_trigger] Demo User)',
},
{
title: "insert body",
- element: '.modal textarea.field_text',
+ element: '.modal textarea.o_form_textarea',
sampleText: 'ddd'
},
{
title: "save new message ddd",
- waitFor: '.modal textarea.field_text:propValue(ddd)',
- element: '.o_formdialog_save'
+ waitFor: '.modal textarea.o_form_textarea:propValue(ddd)',
+ element: '.modal .modal-footer button:contains(Save)'
},
// trigger onchange
{
title: "blur the one2many",
- waitFor: '.oe_list_field_cell:containsExact(ddd)',
- element: '.oe_form_required input',
+ waitFor: '.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody:has(tr td:containsExact(ddd))',
+ element: 'input.o_form_required',
},
// check onchange data
@@ -398,15 +398,15 @@ Tour.register({
},
{
title: "check data 9",
- waitFor: '.oe_form_field_one2many tbody tr:has(.oe_list_field_cell):eq(3)',
- waitNot: '.oe_form_field_one2many tbody tr:has(.oe_list_field_cell):eq(4)',
+ waitFor: '.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody tr[data-id]:eq(3)',
+ waitNot: '.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody tr[data-id]:eq(4)',
},
// cancel
{
title: "cancel change",
- waitFor: '.oe_list_field_cell:containsExact(ddd)',
- element: 'button.oe_form_button_cancel',
+ waitFor: '.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody:has(tr td:containsExact(ddd))',
+ element: '.o_form_button_cancel',
onload: function () {
// remove the window alert (can't click on it with JavaScript tour)
$('.oe_form_dirty').removeClass('oe_form_dirty');
@@ -417,9 +417,13 @@ Tour.register({
/////////////////////////////////////////////////////////////////////////////////////////////
{
- title: "switch to the second form view to test one2many with editable list",
- waitFor: '.oe_list_field_cell:eq(3)',
- element: 'a.oe_menu_leaf:contains(Discussions 2)'
+ title: "switch to the second form view to test one2many with editable list (toggle menu dropdown)",
+ waitFor: '.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody tr[data-id]:eq(2)',
+ element: '.o_sub_menu .oe_secondary_submenu .oe_menu_leaf .oe_menu_text:containsExact(Discussions)'
+ },
+ {
+ title: "switch to the second form view to test one2many with editable list (open submenu)",
+ element: '.o_sub_menu .oe_secondary_submenu .oe_menu_leaf .oe_menu_text:contains(Discussions 2)'
},
{
@@ -429,36 +433,36 @@ Tour.register({
},
{
title: "click on edit",
- element: '.oe_form_button_edit',
+ element: '.o_form_button_edit',
},
{
title: "edit title",
- waitFor: ".oe_form_editable",
- element: '.oe_form_required:first input',
+ waitFor: ".o_form_editable",
+ element: 'input.o_form_required',
sampleText: 'test_trigger2'
},
{
title: "click outside to trigger onchange",
- element: '.oe_form_sheet',
+ element: '.o_form_sheet',
},
{
title: "click on a field of the editable list to edit content",
- waitFor: '.oe_list_editable:contains(test_trigger2)',
- element: '.oe_list_editable tr[data-id]:eq(1) .oe_list_field_cell:eq(2)',
+ waitFor: '.o_list_editable:contains(test_trigger2)',
+ element: '.o_list_editable tr[data-id]:eq(1) td',
},
{
title: "change text value",
- element: '.oe_form_field[data-fieldname="body"] textarea[name="body"]',
+ element: '.o_list_editable_form textarea.o_form_field[data-fieldname="body"]',
sampleText: 'ccc'
},
{
title: "click on first field (trigger the line onchange)",
- element: '.oe_list_editable .oe_form_editable .oe_form_field[data-fieldname="name"]',
+ element: '.o_list_editable_form .o_form_field[data-fieldname="name"]',
},
{
title: "test one2many's line onchange",
- waitFor: '.oe_list_editable .oe_form_editable .oe_form_field[data-fieldname="size"]:contains(3)',
+ waitFor: '.o_list_editable_form .o_form_field[data-fieldname="size"]:contains(3)',
},
{
title: "test one2many field not triggered onchange",
@@ -467,15 +471,15 @@ Tour.register({
{
title: "open the many2one to select an other user",
- element: '.oe_list .oe_m2o_drop_down_button',
+ element: '.o_list_editable_form .o_form_field_many2one .o_form_input_dropdown > input',
},
{
title: "select an other user",
- element: '.ui-autocomplete li:contains(Demo User)',
+ element: '.ui-autocomplete li a:contains(Demo User)',
},
{
title: "test one2many's line onchange after many2one",
- waitFor: '.oe_form_char_content:contains([test_trigger2] Demo User)',
+ waitFor: '.o_list_editable_form span.o_form_field:contains([test_trigger2] Demo User)',
},
{
title: "test one2many field not triggered onchange",
@@ -483,7 +487,7 @@ Tour.register({
},
{
title: "change text value",
- element: '.oe_form_field[data-fieldname="body"] textarea',
+ element: 'textarea.o_form_field[data-fieldname="body"]',
sampleText: 'ccccc'
},
@@ -491,7 +495,7 @@ Tour.register({
{
title: "click outside to trigger one2many onchange",
waitNot: 'textarea[name="message_concat"]:propValueContains(Demo User)',
- element: '.oe_form_required input',
+ element: 'input.o_form_required',
},
{
title: "test one2many onchange",
@@ -500,17 +504,17 @@ Tour.register({
{
title: "click outside to trigger one2many onchange",
- element: '.o_form_field_many2manytags .oe_m2o_drop_down_button',
+ element: '.o_form_field_many2manytags .o_form_input_dropdown > input',
},
{
title: "add a tag",
- element: '.ui-autocomplete li:first',
+ element: '.ui-autocomplete a:first',
},
// remove record
{
title: "delete the last item in the editable list",
- element: '.oe_list_record_delete:visible:last',
+ element: '.o_list_view tr[data-id] td.o_list_record_delete span:visible:last',
},
{
title: "test one2many onchange after delete",
@@ -520,55 +524,55 @@ Tour.register({
// save
{
title: "save discussion",
- waitNot: 'tr:has(.oe_list_field_cell:containsExact(e))',
- element: 'button.oe_form_button_save'
+ waitNot: 'tr:has(td:containsExact(d))',
+ element: 'button.o_form_button_save'
},
// check saved data
{
title: "check data 10",
- waitFor: '.oe_form_text_content:containsExact([test_trigger2] Administrator:aaa\n[test_trigger2] Demo User:ccccc)',
+ waitFor: '.o_form_textarea:containsExact([test_trigger2] Administrator:aaa\n[test_trigger2] Demo User:ccccc)',
},
{
title: "check data 11",
- waitFor: '.oe_form_field_one2many tbody tr:has(.oe_list_field_cell):eq(1)',
- waitNot: '.oe_form_field_one2many tbody tr:has(.oe_list_field_cell):eq(2)',
+ waitFor: '.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody tr[data-id]:eq(1)',
+ waitNot: '.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody tr[data-id]:eq(2)',
},
// edit
{
title: "edit discussion",
- element: 'button.oe_form_button_edit'
+ element: 'button.o_form_button_edit'
},
// add message eee
{
title: "create new message eee",
waitFor: 'li.active a[data-toggle="tab"]:contains(Messages)',
- element: '.oe_form_field_x2many_list_row_add:first a'
+ element: '.tab-pane:eq(0) .o_form_field_x2many_list_row_add a'
},
{
title: "change text value",
- element: '.oe_form_field[data-fieldname="body"] textarea',
+ element: 'textarea.o_form_field[data-fieldname="body"]',
sampleText: 'eee'
},
- // save
+ // save
{
title: "save discussion",
- waitFor: '.oe_form_field[data-fieldname="body"] textarea:propValueContains(eee)',
- element: 'button.oe_form_button_save'
+ waitFor: 'textarea.o_form_field[data-fieldname="body"]:propValueContains(eee)',
+ element: 'button.o_form_button_save'
},
// check saved data
{
title: "check data 12",
- waitFor: '.oe_form_text_content:containsExact([test_trigger2] Administrator:aaa\n[test_trigger2] Demo User:ccccc\n[test_trigger2] Administrator:eee)',
+ waitFor: '.o_form_textarea:containsExact([test_trigger2] Administrator:aaa\n[test_trigger2] Demo User:ccccc\n[test_trigger2] Administrator:eee)',
},
{
title: "check data 13",
- waitFor: '.oe_form_field_one2many tbody tr:has(.oe_list_field_cell):eq(2)',
- waitNot: '.oe_form_field_one2many tbody tr:has(.oe_list_field_cell):eq(3)',
+ waitFor: '.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody tr[data-id]:eq(2)',
+ waitNot: '.tab-pane:eq(0) .o_form_field.o_view_manager_content tbody tr[data-id]:eq(3)',
},
]
});