Files
odoo_source/addons/web/views/webclient_templates.xml
T
kujiu 9de1bc0eef [IMP] Improve compatibility with screen readers (accessibility) (#24574)
Today, Odoo is really tricky to use without seeing the screen, it must be improved to be usable.

This PR forbid to use labels without a "for" attribute, add some title, rule and aria attributes in HTML. With that, Odoo will be fully usable with a screen reader.


* [IMP] Labels must have a for attribute. Improve accessibility.
* [IMP] Better error message when trying to read a missing cached value
* [FIX] Add some aria-label and title attributes for screen readers.
* [FIX] Template name is not included in the error message in case of SyntaxError in QWeb
* [FIX] Improve the Tour failed at step error message to be more explicit.
* [IMP] Add aria-labels
* [FIX] Add missing aria-label on failing test
* [IMP] aria-hidden means hidden. Fix all bad aria-hidden and hide aria-hidden for all.
* [IMP] Color names on kanban views and many2many tags
* [IMP] Add some checks on views for accessibility.
* [IMP] Add `alt` attribute on `img` tags.
* [IMP] Add aria-label and title on non-described icons
* [IMP] Add button role to widgets with btn class
* [IMP] Translate aria and formatted attributes.
* [IMP] Remove wrong aria-labelledby
* [IMP] Add menu role on dropdowns
* [IMP] Buttons must be focusable
* [IMP] Add aria attributes on progress bars
* [IMP] Improve accessibility of basic widgets
* [IMP] Change main layout to more semantic tags
* [IMP] Add menuitem role when missing
* [IMP] Remove wrong role='presentation'
* [IMP] Improve accessibility of tab panels
* [IMP] Add aria-invalid on invalid fields
* [IMP] Add aria-sort on ordered columns
* [IMP] Add role on alerts
* [IMP] Use dialog role, header, main and footer tags for modals
* [IMP] Add labels on o_status
* [IMP] Improve accessibility of kanban view with feeds and articles
* [IMP] Add alerts in case of new messages
* [IMP] Add widget, navigation or img role to aria-labelled items
2018-06-22 21:22:21 +02:00

790 lines
51 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="_assets_utils">
<link rel="stylesheet" type="text/scss" href="/web/static/lib/bootstrap/scss/bootstrap/_mixins.scss"/>
<link rel="stylesheet" type="text/scss" href="/web/static/src/scss/utils.scss"/>
</template>
<template id="_assets_primary_variables">
<link rel="stylesheet" type="text/scss" href="/web/static/src/scss/primary_variables.scss"/>
</template>
<template id="_assets_secondary_variables">
<link rel="stylesheet" type="text/scss" href="/web/static/src/scss/secondary_variables.scss"/>
</template>
<template id="_assets_helpers">
<t t-call="web._assets_utils"/>
<t t-call="web._assets_primary_variables"/>
<t t-call="web._assets_secondary_variables"/>
<!-- Bootstrap variables should not be necessary, all pages come with bootstrap in at least one of their -->
<!-- bundle and, ideally, these should be available in all assets... with their odoo override. This system -->
<!-- however works for now as non-backend and non-frontend assets do not need overriden BS variables yet. -->
<link t-if="not no_bs_vars" rel="stylesheet" type="text/scss" href="/web/static/lib/bootstrap/scss/bootstrap/_variables.scss"/>
</template>
<template id="_assets_backend_helpers">
<t t-call="web._assets_helpers"><t t-set="no_bs_vars" t-value="True"/></t>
<link rel="stylesheet" type="text/scss" href="/web/static/src/scss/bootstrap_overridden.scss"/>
</template>
<template id="_assets_frontend_helpers">
<t t-call="web._assets_helpers"><t t-set="no_bs_vars" t-value="True"/></t>
<link rel="stylesheet" type="text/scss" href="/web/static/src/scss/bootstrap_overridden_frontend.scss"/>
</template>
<template id="assets_common" name="Common Assets (used in backend interface and website)">
<t t-call="web._assets_helpers"/>
<link rel="stylesheet" type="text/css" href="/web/static/lib/jquery.ui/jquery-ui.css"/>
<link rel="stylesheet" type="text/css" href="/web/static/lib/fontawesome/css/font-awesome.css"/>
<link rel="stylesheet" type="text/css" href="/web/static/lib/fontawesome/css/font-awesome-suffix.css"/>
<link rel="stylesheet" type="text/scss" href="/web/static/lib/bootstrap-datetimepicker/src/scss/_bootstrap-datetimepicker.scss"/>
<link rel="stylesheet" type="text/css" href="/web/static/lib/select2/select2.css"/>
<link rel="stylesheet" type="text/css" href="/web/static/lib/select2-bootstrap-css/select2-bootstrap.css"/>
<link rel="stylesheet" type="text/scss" href="/web/static/src/scss/fonts.scss"/>
<link rel="stylesheet" type="text/scss" href="/web/static/src/scss/ui.scss"/>
<link rel="stylesheet" type="text/scss" href="/web/static/src/scss/ui_extra.scss"/>
<link rel="stylesheet" type="text/scss" href="/web/static/src/scss/navbar.scss"/>
<link rel="stylesheet" type="text/scss" href="/web/static/src/scss/mimetypes.scss"/>
<link rel="stylesheet" type="text/scss" href="/web/static/src/scss/modal.scss"/>
<link rel="stylesheet" type="text/scss" href="/web/static/src/scss/animation.scss"/>
<link rel="stylesheet" type="text/scss" href="/web/static/src/scss/rainbow.scss"/>
<link rel="stylesheet" type="text/scss" href="/web/static/src/scss/datepicker.scss"/>
<script type="text/javascript" src="/web/static/lib/es5-shim/es5-shim.min.js"></script>
<script type="text/javascript" src="/web/static/lib/underscore/underscore.js"></script>
<script type="text/javascript" src="/web/static/lib/underscore.string/lib/underscore.string.js"></script>
<script type="text/javascript" src="/web/static/lib/moment/moment.js"></script>
<script type="text/javascript" src="/web/static/lib/jquery/jquery.js"></script>
<script type="text/javascript" src="/web/static/lib/jquery.ui/jquery-ui.js"></script>
<script type="text/javascript" src="/web/static/lib/jquery/jquery.browser.js"></script>
<script type="text/javascript" src="/web/static/lib/jquery.blockUI/jquery.blockUI.js"></script>
<script type="text/javascript" src="/web/static/lib/jquery.hotkeys/jquery.hotkeys.js"></script>
<script type="text/javascript" src="/web/static/lib/jquery.placeholder/jquery.placeholder.js"></script>
<script type="text/javascript" src="/web/static/lib/jquery.form/jquery.form.js"></script>
<script type="text/javascript" src="/web/static/lib/jquery.ba-bbq/jquery.ba-bbq.js"></script>
<script type="text/javascript" src="/web/static/lib/jquery.mjs.nestedSortable/jquery.mjs.nestedSortable.js"></script>
<script src="/web/static/lib/bootstrap/js/affix.js"></script>
<script src="/web/static/lib/bootstrap/js/alert.js"></script>
<script src="/web/static/lib/bootstrap/js/button.js"></script>
<script src="/web/static/lib/bootstrap/js/carousel.js"></script>
<script src="/web/static/lib/bootstrap/js/collapse.js"></script>
<script src="/web/static/lib/bootstrap/js/dropdown.js"></script>
<script src="/web/static/lib/bootstrap/js/modal.js"></script>
<script src="/web/static/lib/bootstrap/js/tooltip.js"></script>
<script src="/web/static/lib/bootstrap/js/popover.js"></script>
<script src="/web/static/lib/bootstrap/js/scrollspy.js"></script>
<script src="/web/static/lib/bootstrap/js/tab.js"></script>
<script src="/web/static/lib/bootstrap/js/transition.js"></script>
<script type="text/javascript" src="/web/static/lib/bootstrap-datetimepicker/src/js/bootstrap-datetimepicker.js"></script>
<script type="text/javascript" src="/web/static/lib/select2/select2.js"></script>
<script type="text/javascript" src="/web/static/lib/clipboard/clipboard.js"></script>
<script type="text/javascript" src="/web/static/lib/qweb/qweb2.js"></script>
<script type="text/javascript" src="/web/static/src/js/boot.js"></script>
<script type="text/javascript" src="/web/static/src/js/libs/autocomplete.js"></script>
<script type="text/javascript" src="/web/static/src/js/libs/bootstrap.js"></script>
<script type="text/javascript" src="/web/static/src/js/libs/jquery.js"></script>
<script type="text/javascript" src="/web/static/src/js/services/config.js"></script>
<script type="text/javascript" src="/web/static/src/js/core/abstract_service.js"></script>
<script type="text/javascript" src="/web/static/src/js/core/abstract_storage_service.js"></script>
<script type="text/javascript" src="/web/static/src/js/core/class.js"></script>
<script type="text/javascript" src="/web/static/src/js/core/collections.js"/>
<script type="text/javascript" src="/web/static/src/js/core/translation.js"></script>
<script type="text/javascript" src="/web/static/src/js/core/ajax.js"></script>
<script type="text/javascript" src="/web/static/src/js/services/ajax_service.js"></script>
<script type="text/javascript" src="/web/static/src/js/core/time.js"></script>
<script type="text/javascript" src="/web/static/src/js/core/mixins.js"></script>
<script type="text/javascript" src="/web/static/src/js/core/service_mixins.js"></script>
<script type="text/javascript" src="/web/static/src/js/core/rpc.js"></script>
<script type="text/javascript" src="/web/static/src/js/core/widget.js"></script>
<script type="text/javascript" src="/web/static/src/js/core/registry.js"></script>
<script type="text/javascript" src="/web/static/src/js/core/session.js"></script>
<script type="text/javascript" src="/web/static/src/js/core/dom.js"></script>
<script type="text/javascript" src="/web/static/src/js/core/concurrency.js"></script>
<script type="text/javascript" src="/web/static/src/js/core/utils.js"></script>
<script type="text/javascript" src="/web/static/src/js/core/qweb.js"></script>
<script type="text/javascript" src="/web/static/src/js/core/bus.js"></script>
<script type="text/javascript" src="/web/static/src/js/services/core.js"></script>
<script type="text/javascript" src="/web/static/src/js/core/dialog.js"></script>
<script type="text/javascript" src="/web/static/src/js/core/local_storage.js"></script>
<script type="text/javascript" src="/web/static/src/js/services/local_storage_service.js"></script>
<script type="text/javascript" src="/web/static/src/js/core/session_storage.js"></script>
<script type="text/javascript" src="/web/static/src/js/services/session_storage_service.js"></script>
<script type="text/javascript" src="/web/static/src/js/core/ram_storage.js"></script>
<script type="text/javascript" src="/web/static/src/js/widgets/rainbow_man.js"></script>
</template>
<template id="assets_backend" name="Backend Assets (used in backend interface)">
<t t-call="web._assets_backend_helpers"/>
<link rel="stylesheet" type="text/scss" href="/web/static/src/scss/import_bootstrap.scss"/>
<link rel="stylesheet" type="text/css" href="/base/static/src/css/modules.css"/>
<link rel="stylesheet" type="text/scss" href="/web/static/src/scss/webclient_extra.scss"/>
<link rel="stylesheet" type="text/scss" href="/web/static/src/scss/webclient_layout.scss"/>
<link rel="stylesheet" type="text/scss" href="/web/static/src/scss/webclient.scss"/>
<link rel="stylesheet" type="text/scss" href="/web/static/src/scss/domain_selector.scss"/>
<link rel="stylesheet" type="text/scss" href="/web/static/src/scss/model_field_selector.scss"/>
<link rel="stylesheet" type="text/scss" href="/web/static/src/scss/progress_bar.scss"/>
<link rel="stylesheet" type="text/scss" href="/web/static/src/scss/dropdown.scss"/>
<link rel="stylesheet" type="text/scss" href="/web/static/src/scss/dropdown_extra.scss"/>
<link rel="stylesheet" type="text/scss" href="/web/static/src/scss/tooltip.scss"/>
<link rel="stylesheet" type="text/scss" href="/web/static/src/scss/debug_manager.scss"/>
<link rel="stylesheet" type="text/scss" href="/web/static/src/scss/control_panel.scss"/>
<link rel="stylesheet" type="text/scss" href="/web/static/src/scss/fields.scss"/>
<link rel="stylesheet" type="text/scss" href="/web/static/src/scss/fields_extra.scss"/>
<link rel="stylesheet" type="text/scss" href="/web/static/src/scss/views.scss"/>
<link rel="stylesheet" type="text/scss" href="/web/static/src/scss/pivot_view.scss"/>
<link rel="stylesheet" type="text/scss" href="/web/static/src/scss/graph_view.scss"/>
<link rel="stylesheet" type="text/scss" href="/web/static/src/scss/form_view.scss"/>
<link rel="stylesheet" type="text/scss" href="/web/static/src/scss/form_view_extra.scss"/>
<link rel="stylesheet" type="text/scss" href="/web/static/src/scss/list_view.scss"/>
<link rel="stylesheet" type="text/scss" href="/web/static/src/scss/list_view_extra.scss"/>
<link rel="stylesheet" type="text/scss" href="/web/static/src/scss/kanban_dashboard.scss"/>
<link rel="stylesheet" type="text/scss" href="/web/static/src/scss/kanban_examples_dialog.scss"/>
<link rel="stylesheet" type="text/scss" href="/web/static/src/scss/kanban_column_progressbar.scss"/>
<link rel="stylesheet" type="text/scss" href="/web/static/src/scss/kanban_view.scss"/>
<link rel="stylesheet" type="text/scss" href="/web/static/src/scss/kanban_view_mobile.scss"/>
<link rel="stylesheet" type="text/scss" href="/web/static/src/scss/web_calendar.scss"/>
<link rel="stylesheet" type="text/scss" href="/web/static/src/scss/search_view.scss"/>
<link rel="stylesheet" type="text/scss" href="/web/static/src/scss/search_view_mobile.scss"/>
<link rel="stylesheet" type="text/scss" href="/web/static/src/scss/search_groupby_menu.scss"/>
<link rel="stylesheet" type="text/scss" href="/web/static/src/scss/dropdown_menu.scss"/>
<link rel="stylesheet" type="text/scss" href="/web/static/src/scss/search_view_extra.scss"/>
<link rel="stylesheet" type="text/scss" href="/web/static/src/scss/data_export.scss"/>
<link rel="stylesheet" type="text/scss" href="/web/static/src/scss/base_settings.scss"/>
<script type="text/javascript" src="/base/static/src/js/res_config_settings.js"></script>
<script type="text/javascript" src="/web/static/lib/jquery.scrollTo/jquery.scrollTo.js"></script>
<script type="text/javascript" src="/web/static/lib/backbone/backbone.js"></script>
<script type="text/javascript" src="/web/static/lib/fuzzy-master/fuzzy.js"></script>
<script type="text/javascript" charset="utf-8">
odoo._modules = <t t-raw="get_modules_order()"/>;
</script>
<script type="text/javascript" src="/web/static/lib/py.js/lib/py.js"></script>
<!-- Special case: core.js declares $.browser needed by ba-bbq -->
<script type="text/javascript" src="/web/static/lib/jquery.ba-bbq/jquery.ba-bbq.js"></script>
<script type="text/javascript" src="/web/static/src/js/core/domain.js"></script>
<script type="text/javascript" src="/web/static/src/js/core/pyeval.js"></script>
<script type="text/javascript" src="/web/static/src/js/chrome/abstract_action.js"></script>
<script type="text/javascript" src="/web/static/src/js/chrome/action_manager.js"></script>
<script type="text/javascript" src="/web/static/src/js/chrome/action_manager_act_window.js"></script>
<script type="text/javascript" src="/web/static/src/js/chrome/action_manager_report.js"/>
<script type="text/javascript" src="/web/static/src/js/chrome/control_panel.js"></script>
<script type="text/javascript" src="/web/static/src/js/core/browser_detection.js"></script>
<script type="text/javascript" src="/web/static/src/js/chrome/keyboard_navigation_mixin.js"></script>
<script type="text/javascript" src="/web/static/src/js/chrome/abstract_web_client.js"></script>
<script type="text/javascript" src="/web/static/src/js/chrome/web_client.js"></script>
<script type="text/javascript" src="/web/static/src/js/chrome/root_widget.js"></script>
<script type="text/javascript" src="/web/static/src/js/_deprecated/data.js"></script>
<script type="text/javascript" src="/web/static/src/js/core/context.js"></script>
<script type="text/javascript" src="/web/static/src/js/core/misc.js"></script>
<script type="text/javascript" src="/web/static/src/js/services/crash_manager.js"></script>
<script type="text/javascript" src="/web/static/src/js/services/data_manager.js"></script>
<script type="text/javascript" src="/web/static/src/js/services/report_service.js"></script>
<script type="text/javascript" src="/web/static/src/js/services/session.js"></script>
<script type="text/javascript" src="/web/static/src/js/services/notification_service.js"></script>
<script type="text/javascript" src="/web/static/src/js/widgets/auto_complete.js"></script>
<script type="text/javascript" src="/web/static/src/js/widgets/change_password.js"></script>
<script type="text/javascript" src="/web/static/src/js/widgets/debug_manager.js"></script>
<script type="text/javascript" src="/web/static/src/js/widgets/data_export.js"></script>
<script type="text/javascript" src="/web/static/src/js/widgets/date_picker.js"></script>
<script type="text/javascript" src="/web/static/src/js/widgets/domain_selector_dialog.js"></script>
<script type="text/javascript" src="/web/static/src/js/widgets/domain_selector.js"></script>
<script type="text/javascript" src="/web/static/src/js/widgets/iframe_widget.js"></script>
<script type="text/javascript" src="/web/static/src/js/chrome/loading.js"></script>
<script type="text/javascript" src="/web/static/src/js/widgets/model_field_selector.js"></script>
<script type="text/javascript" src="/web/static/src/js/widgets/notification.js"></script>
<script type="text/javascript" src="/web/static/src/js/chrome/sidebar.js"></script>
<script type="text/javascript" src="/web/static/src/js/chrome/pager.js"></script>
<script type="text/javascript" src="/web/static/src/js/chrome/systray_menu.js"></script>
<script type="text/javascript" src="/web/static/src/js/widgets/switch_company_menu.js"></script>
<script type="text/javascript" src="/web/static/src/js/chrome/user_menu.js"></script>
<script type="text/javascript" src="/web/static/src/js/chrome/menu.js"></script>
<script type="text/javascript" src="/web/static/src/js/views/search/search_view.js"></script>
<script type="text/javascript" src="/web/static/src/js/views/search/search_view_mobile.js"></script>
<script type="text/javascript" src="/web/static/src/js/views/search/search_filters.js"></script>
<script type="text/javascript" src="/web/static/src/js/views/search/search_inputs.js"></script>
<script type="text/javascript" src="/web/static/src/js/views/search/favorites_menu.js"></script>
<script type="text/javascript" src="/web/static/src/js/views/search/groupby_menu.js"></script>
<script type="text/javascript" src="/web/static/src/js/views/search/groupby_menu_interface_mixin.js"></script>
<script type="text/javascript" src="/web/static/src/js/widgets/dropdown_menu.js"></script>
<script type="text/javascript" src="/web/static/src/js/views/search/filters_menu.js"></script>
<script type="text/javascript" src="/web/static/src/js/apps.js"></script>
<script type="text/javascript" src="/web/static/src/js/fields/abstract_field.js"></script>
<script type="text/javascript" src="/web/static/src/js/fields/basic_fields.js"></script>
<script type="text/javascript" src="/web/static/src/js/fields/field_registry.js"></script>
<script type="text/javascript" src="/web/static/src/js/views/basic/widget_registry.js"></script>
<script type="text/javascript" src="/web/static/src/js/fields/field_utils.js"></script>
<script type="text/javascript" src="/web/static/src/js/fields/relational_fields.js"></script>
<script type="text/javascript" src="/web/static/src/js/fields/special_fields.js"></script>
<script type="text/javascript" src="/web/static/src/js/fields/upgrade_fields.js"></script>
<script type="text/javascript" src="/web/static/src/js/views/abstract_view.js"></script>
<script type="text/javascript" src="/web/static/src/js/views/abstract_renderer.js"></script>
<script type="text/javascript" src="/web/static/src/js/views/abstract_model.js"></script>
<script type="text/javascript" src="/web/static/src/js/views/abstract_controller.js"></script>
<script type="text/javascript" src="/web/static/src/js/views/basic/basic_model.js"></script>
<script type="text/javascript" src="/web/static/src/js/views/basic/basic_view.js"></script>
<script type="text/javascript" src="/web/static/src/js/views/basic/basic_controller.js"></script>
<script type="text/javascript" src="/web/static/src/js/views/basic/basic_renderer.js"></script>
<script type="text/javascript" src="/web/static/src/js/views/field_manager_mixin.js"></script>
<script type="text/javascript" src="/web/static/src/js/views/standalone_field_manager_mixin.js"></script>
<script type="text/javascript" src="/web/static/src/js/views/view_registry.js"></script>
<script type="text/javascript" src="/web/static/src/js/views/view_dialogs.js"></script>
<script type="text/javascript" src="/web/static/src/js/views/form/form_renderer.js"></script>
<script type="text/javascript" src="/web/static/src/js/views/form/form_controller.js"></script>
<script type="text/javascript" src="/web/static/src/js/views/form/form_view.js"></script>
<script type="text/javascript" src="/web/static/src/js/views/graph/graph_model.js"></script>
<script type="text/javascript" src="/web/static/src/js/views/graph/graph_controller.js"></script>
<script type="text/javascript" src="/web/static/src/js/views/graph/graph_renderer.js"></script>
<script type="text/javascript" src="/web/static/src/js/views/graph/graph_view.js"></script>
<script type="text/javascript" src="/web/static/src/js/views/kanban/kanban_column.js"></script>
<script type="text/javascript" src="/web/static/src/js/views/kanban/kanban_column_progressbar.js"></script>
<script type="text/javascript" src="/web/static/src/js/views/kanban/kanban_column_quick_create.js"></script>
<script type="text/javascript" src="/web/static/src/js/views/kanban/kanban_model.js"></script>
<script type="text/javascript" src="/web/static/src/js/views/kanban/kanban_controller.js"></script>
<script type="text/javascript" src="/web/static/src/js/views/kanban/kanban_examples_registry.js"></script>
<script type="text/javascript" src="/web/static/src/js/views/kanban/kanban_record.js"></script>
<script type="text/javascript" src="/web/static/src/js/views/kanban/kanban_record_quick_create.js"></script>
<script type="text/javascript" src="/web/static/src/js/views/kanban/kanban_renderer.js"></script>
<script type="text/javascript" src="/web/static/src/js/views/kanban/kanban_renderer_mobile.js"></script>
<script type="text/javascript" src="/web/static/src/js/views/kanban/kanban_view.js"></script>
<script type="text/javascript" src="/web/static/src/js/views/kanban/quick_create_form_view.js"></script>
<script type="text/javascript" src="/web/static/src/js/views/list/list_editable_renderer.js"></script>
<script type="text/javascript" src="/web/static/src/js/views/list/list_renderer.js"></script>
<script type="text/javascript" src="/web/static/src/js/views/list/list_view.js"></script>
<script type="text/javascript" src="/web/static/src/js/views/list/list_controller.js"></script>
<script type="text/javascript" src="/web/static/src/js/views/pivot/pivot_model.js"></script>
<script type="text/javascript" src="/web/static/src/js/views/pivot/pivot_controller.js"></script>
<script type="text/javascript" src="/web/static/src/js/views/pivot/pivot_renderer.js"></script>
<script type="text/javascript" src="/web/static/src/js/views/pivot/pivot_view.js"></script>
<script type="text/javascript" src="/web/static/src/js/views/calendar/calendar_controller.js"></script>
<script type="text/javascript" src="/web/static/src/js/views/calendar/calendar_model.js"></script>
<script type="text/javascript" src="/web/static/src/js/views/calendar/calendar_quick_create.js"></script>
<script type="text/javascript" src="/web/static/src/js/views/calendar/calendar_renderer.js"></script>
<script type="text/javascript" src="/web/static/src/js/views/calendar/calendar_view.js"></script>
<script type="text/javascript" src="/web/static/src/js/widgets/attach_document.js"></script>
<script type="text/javascript" src="/web/static/src/js/report/utils.js"/>
<script type="text/javascript" src="/web/static/src/js/report/client_action.js"/>
<link rel="stylesheet" type="text/scss" href="/web/static/src/scss/report_backend.scss"/>
</template>
<template id="web.assets_frontend" name="Website Assets">
<t t-call="web._assets_frontend_helpers"/>
<link rel="stylesheet" type="text/scss" href="/web/static/src/scss/import_bootstrap.scss"/>
<script type="text/javascript" src="/web/static/src/js/services/session.js"></script>
</template>
<template id="web.layout" name="Web layout">&lt;!DOCTYPE html&gt;
<html t-att="html_data or {}">
<head>
<meta charset="utf-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no"/>
<title t-esc="title or 'Odoo'"/>
<link type="image/x-icon" rel="shortcut icon" t-att-href="x_icon or '/web/static/src/img/favicon.ico'"/>
<script type="text/javascript">
var odoo = {
csrf_token: "<t t-esc="request.csrf_token(None)"/>",
};
</script>
<t t-raw="head or ''"/>
</head>
<body t-att-class="body_classname">
<t t-raw="0"/>
</body>
</html>
</template>
<template id="web.login_layout" name="Login Layout">
<t t-call="web.layout">
<t t-set="html_data" t-value="{'style': 'height: 100%;'}"/>
<t t-set="head">
<t t-call-assets="web.assets_common" t-js="false"/>
<t t-call-assets="web.assets_frontend" t-js="false"/>
<t t-call-assets="web.assets_common" t-css="false"/>
<t t-call-assets="web.assets_frontend" t-css="false"/>
</t>
<t t-set="body_classname" t-value="'container'"/>
<div class="row">
<div class="col-md-6 col-md-offset-3 o_database_list">
<div class="text-center">
<img t-attf-src="/web/binary/company_logo{{ '?dbname='+db if db else '' }}" alt="Logo"/>
</div>
<t t-raw="0"/>
<div class="text-center" t-if="not disable_footer">
<t t-if="not disable_database_manager">
<a class="" href="/web/database/manager">Manage Databases</a> |
</t>
<a href="https://www.odoo.com" target="_blank">Powered by <span>Odoo</span></a>
</div>
</div>
</div>
</t>
</template>
<template id="web.login" name="Login">
<t t-call="web.login_layout">
<form class="oe_login_form" role="form" t-attf-action="/web/login{{ '?debug' if debug else '' }}" method="post" onsubmit="this.action = this.action + location.hash">
<input type="hidden" name="csrf_token" t-att-value="request.csrf_token()"/>
<div class="form-group field-db" t-if="databases and len(databases) &gt; 1">
<label for="db" class="control-label">Database</label>
<div class="input-group">
<input type="text" name="db" t-att-value="request.db" id="db" class="form-control" required="required" readonly="readonly"/>
<span class="input-group-btn">
<a role="button" href="/web/database/selector" class="btn btn-default">Select <i class="fa fa-database" role="img" aria-label="Database" title="Database"></i></a>
</span>
</div>
</div>
<div class="form-group field-login">
<label for="login" class="control-label">Email</label>
<input type="text" name="login" t-att-value="login" id="login" class="form-control" required="required" autofocus="autofocus" autocapitalize="off"/>
</div>
<div class="form-group field-password">
<label for="password" class="control-label">Password</label>
<input type="password" name="password" id="password" class="form-control" required="required" autocomplete="current-password" t-att-autofocus="'autofocus' if login else None" maxlength="4096"/>
</div>
<p class="alert alert-danger" t-if="error" role="alert">
<t t-esc="error"/>
</p>
<p class="alert alert-success" t-if="message" role="status">
<t t-esc="message"/>
</p>
<input type="hidden" name="redirect" t-att-value="redirect"/>
<div class="clearfix oe_login_buttons">
<button type="submit" class="btn btn-primary">Log in</button>
</div>
</form>
</t>
</template>
<template id="web.menu">
<ul class="nav navbar-nav navbar-left oe_application_menu_placeholder" style="display: none;" role="menu">
<li t-foreach="menu_data['children']" t-as="menu">
<t t-call="web.menu_link"/>
</li>
<li id="menu_more_container" class="dropdown" style="display: none;">
<a role="menuitem" aria-haspopup="true" href="#" class="dropdown-toggle" data-toggle="dropdown" id="more_menu_button">More <b class="caret"></b></a>
<ul id="menu_more" class="dropdown-menu" role="menu"></ul>
</li>
</ul>
<ul class="nav navbar-nav navbar-right oe_user_menu_placeholder" style="display: none;"/>
<ul class="nav navbar-nav navbar-right oe_systray" style="display: none;"/>
</template>
<template id="web.menu_secondary">
<a class="o_sub_menu_logo" t-att-href="'/web/?debug' if debug else '/web'">
<span class="oe_logo_edit">Edit Company data</span>
<img src='/web/binary/company_logo' alt="Logo"/>
</a>
<div class="o_sub_menu_content">
<t t-foreach="menu_data['children']" t-as="menu">
<div style="display: none" class="oe_secondary_menu" t-att-data-menu-parent="menu['id']">
<t t-foreach="menu['children']" t-as="menu">
<div class="oe_secondary_menu_section" t-att-data-menu-xmlid="menu.get('xmlid')">
<t t-if="menu['children']"><t t-esc="menu['name']"/></t>
<t t-if="not menu['children']"><t t-call="web.menu_link"/></t>
</div>
<t t-call="web.menu_secondary_submenu"/>
</t>
</div>
</t>
</div>
<div class="o_sub_menu_footer">
Powered by <a href="http://www.odoo.com" target="_blank"><span>Odoo</span></a>
</div>
</template>
<template id="web.menu_secondary_submenu">
<ul t-if="menu['children']" class="oe_secondary_submenu nav nav-pills nav-stacked">
<li t-foreach="menu['children']" t-as="menu">
<t t-call="web.menu_link"/>
<t t-call="web.menu_secondary_submenu"/>
</li>
</ul>
</template>
<template id="web.menu_link">
<t t-set="debug_param" t-value="'?&amp;debug=' if debug else ''"/>
<a t-att-href="'/web%s#menu_id=%s&amp;action=%s' % (debug_param, menu['id'], menu['action'] and menu['action'].split(',')[1] or '')"
role="menuitem"
t-att-class="'oe_menu_toggler' if menu.get('children') else 'oe_menu_leaf'"
t-att-data-menu="menu['id']"
t-att-data-menu-xmlid="menu.get('xmlid')"
t-att-data-action-model="menu['action'] and menu['action'].split(',')[0] or None"
t-att-data-action-id="menu['action'] and menu['action'].split(',')[1] or None">
<span class="oe_menu_text">
<t t-esc="menu['name']"/>
</span>
</a>
</template>
<template id="web.js_tests_assets">
<link type="text/css" rel="stylesheet" href="/web/static/lib/qunit/qunit-2.3.0.css"/>
<script type="text/javascript" src="/web/static/lib/qunit/qunit-2.3.0.js"></script>
<script type="text/javascript" src="/web/static/tests/helpers/qunit_config.js"></script>
<t t-call-assets="web.assets_common" t-js="false"/>
<t t-call-assets="web.assets_backend" t-js="false"/>
<t t-call-assets="web.assets_common" t-css="false"/>
<t t-call-assets="web.assets_backend" t-css="false"/>
<!-- add lazy-loaded libs to make tests synchronous -->
<link rel="stylesheet" href="/web/static/lib/fullcalendar/css/fullcalendar.css"/>
<script type="text/javascript" src="/web/static/lib/fullcalendar/js/fullcalendar.js"></script>
<link rel="stylesheet" type="text/css" href="/web/static/lib/nvd3/nv.d3.css"/>
<script type="text/javascript" src="/web/static/lib/nvd3/d3.v3.js"></script>
<script type="text/javascript" src="/web/static/lib/nvd3/nv.d3.js"></script>
<script type="text/javascript" src="/web/static/src/js/libs/nvd3.js"></script>
<script type="text/javascript" src="/web/static/lib/ace/ace.js"></script>
<script type="text/javascript" src="/web/static/lib/ace/mode-python.js"></script>
<script type="text/javascript" src="/web/static/lib/ace/mode-xml.js"></script>
<script type="text/javascript">
// define the 'web.web_client' module because some other modules require it
odoo.define('web.web_client', function (require) {
var WebClient = require('web.WebClient');
var web_client = new WebClient();
// override _call_service to prevent the web_client from doing RPCs
web_client._call_service = function () {};
return web_client;
});
</script>
<style>
body {
position: relative; // bootstrap-datepicker needs this
}
body:not(.debug) .modal-backdrop, body:not(.debug) .modal, body:not(.debug) .ui-autocomplete {
opacity: 0 !important;
}
#qunit-testrunner-toolbar label {
font-weight: inherit;
margin-bottom: inherit;
}
#qunit-testrunner-toolbar input[type=text] {
width: inherit;
display: inherit;
}
</style>
<script type="text/javascript" src="/web/static/tests/helpers/test_utils.js"></script>
<script type="text/javascript" src="/web/static/tests/helpers/mock_server.js"></script>
<script type="text/javascript" src="/web/static/tests/boot_tests.js"></script>
</template>
<template id="web.qunit_suite">
<t t-call="web.layout">
<t t-set="html_data" t-value="{'style': 'height: 100%;'}"/>
<t t-set="title">Web Tests</t>
<t t-set="head">
<t t-call="web.js_tests_assets"/>
<script type="text/javascript" src="/base/static/tests/base_settings_tests.js"></script>
<script type="text/javascript" src="/web/static/tests/services/notification_service_tests.js"></script>
<script type="text/javascript" src="/web/static/tests/fields/basic_fields_tests.js"></script>
<script type="text/javascript" src="/web/static/tests/fields/field_utils_tests.js"></script>
<script type="text/javascript" src="/web/static/tests/fields/relational_fields_tests.js"></script>
<script type="text/javascript" src="/web/static/tests/fields/special_fields.js"></script>
<script type="text/javascript" src="/web/static/tests/fields/upgrade_fields_tests.js"></script>
<script type="text/javascript" src="/web/static/tests/views/abstract_controller_tests.js"></script>
<script type="text/javascript" src="/web/static/tests/views/abstract_view_tests.js"></script>
<script type="text/javascript" src="/web/static/tests/views/form_tests.js"></script>
<script type="text/javascript" src="/web/static/tests/views/graph_tests.js"></script>
<script type="text/javascript" src="/web/static/tests/views/list_tests.js"></script>
<script type="text/javascript" src="/web/static/tests/views/pivot_tests.js"></script>
<script type="text/javascript" src="/web/static/tests/views/kanban_tests.js"></script>
<script type="text/javascript" src="/web/static/tests/views/calendar_tests.js"></script>
<script type="text/javascript" src="/web/static/tests/views/basic_model_tests.js"></script>
<script type="text/javascript" src="/web/static/tests/views/kanban_model_tests.js"></script>
<script type="text/javascript" src="/web/static/tests/views/view_dialogs_tests.js"></script>
<script type="text/javascript" src="/web/static/tests/views/search_filters_menu_tests.js"></script>
<script type="text/javascript" src="/web/static/tests/views/search_groupby_menu_tests.js"></script>
<script type="text/javascript" src="/web/static/tests/widgets/dropdown_menu_tests.js"></script>
<script type="text/javascript" src="/web/static/tests/views/search_view_tests.js"></script>
<script type="text/javascript" src="/web/static/tests/core/registry_tests.js"></script>
<script type="text/javascript" src="/web/static/tests/core/pyeval_tests.js"></script>
<script type="text/javascript" src="/web/static/tests/core/class_tests.js"></script>
<script type="text/javascript" src="/web/static/tests/core/rpc_tests.js"></script>
<script type="text/javascript" src="/web/static/tests/core/domain_tests.js"></script>
<script type="text/javascript" src="/web/static/tests/core/mixins_tests.js"></script>
<script type="text/javascript" src="/web/static/tests/core/time_tests.js"></script>
<script type="text/javascript" src="/web/static/tests/core/concurrency_tests.js"></script>
<script type="text/javascript" src="/web/static/tests/core/util_tests.js"></script>
<script type="text/javascript" src="/web/static/tests/core/widget_tests.js"></script>
<script type="text/javascript" src="/web/static/tests/chrome/action_manager_tests.js"></script>
<script type="text/javascript" src="/web/static/tests/chrome/search_tests.js"></script>
<script type="text/javascript" src="/web/static/tests/chrome/pager_tests.js"></script>
<script type="text/javascript" src="/web/static/tests/chrome/keyboard_navigation_mixin_tests.js"></script>
<script type="text/javascript" src="/web/static/tests/widgets/data_export_tests.js"/>
<script type="text/javascript" src="/web/static/tests/widgets/debug_manager_tests.js"/>
<script type="text/javascript" src="/web/static/tests/widgets/domain_selector_tests.js"/>
<script type="text/javascript" src="/web/static/tests/widgets/model_field_selector_tests.js"/>
<script type="text/javascript" src="/web/static/tests/widgets/rainbow_man_tests.js"/>
</t>
<div id="qunit"/>
<div id="qunit-fixture"/>
</t>
</template>
<template id="web.qunit_mobile_suite">
<t t-call="web.layout">
<t t-set="html_data" t-value="{'style': 'height: 100%;'}"/>
<t t-set="title">Web Mobile Tests</t>
<t t-set="head">
<script>
// force the config.device.isMobile key to be true so that
// mobile specific files aren't rejected
window.odoo = {};
var odooDefine;
Object.defineProperty(window.odoo, 'define', {
get: function () {
return odooDefine;
},
set: function (define) {
odooDefine = function () {
define.apply(this, arguments);
if (arguments[0] === 'web.config') {
define.call(this, 'web.config.patch', function (require) {
var config = require('web.config');
config.device.isMobile = true;
});
}
};
},
});
</script>
<t t-call="web.js_tests_assets"/>
<script type="text/javascript" src="/web/static/lib/jquery.touchSwipe/jquery.touchSwipe.js"></script>
<script type="text/javascript" src="/base/static/tests/base_settings_mobile_tests.js"></script>
<script type="text/javascript" src="/web/static/tests/chrome/action_manager_mobile_tests.js"></script>
<script type="text/javascript" src="/web/static/tests/chrome/search_view_mobile_tests.js"></script>
<script type="text/javascript" src="/web/static/tests/views/calendar_mobile_tests.js"></script>
<script type="text/javascript" src="/web/static/tests/views/kanban_mobile_tests.js"></script>
</t>
<div id="qunit"/>
<div id="qunit-fixture"/>
</t>
</template>
<template id="web.benchmark_suite">
<t t-call="web.layout">
<t t-set="html_data" t-value="{'style': 'height: 100%;'}"/>
<t t-set="title">Web Benchmarks</t>
<t t-set="head">
<link type="text/css" rel="stylesheet" href="/web/static/lib/qunit/qunit-2.3.0.css"/>
<script type="text/javascript" src="/web/static/lib/qunit/qunit-2.3.0.js"></script>
<script type="text/javascript" src="/web/static/tests/helpers/qunit_config.js"></script>
<script type="text/javascript" src="/web/static/lib/benchmarkjs/lodash.js"></script>
<script type="text/javascript" src="/web/static/lib/benchmarkjs/benchmark.js"></script>
<t t-call-assets="web.assets_common" t-js="false"/>
<t t-call-assets="web.assets_backend" t-js="false"/>
<t t-call-assets="web.assets_common" t-css="false"/>
<t t-call-assets="web.assets_backend" t-css="false"/>
<script type="text/javascript">
QUnit.config.hidepassed = false;
// define the 'web.web_client' module because some other modules require it
odoo.define('web.web_client', function (require) {
var WebClient = require('web.WebClient');
var web_client = new WebClient();
// override _call_service to prevent the web_client from doing RPCs
web_client._call_service = function () {};
return web_client;
});
</script>
<style>
body:not(.debug) .modal-backdrop, body:not(.debug) .modal, body:not(.debug) .ui-autocomplete {
opacity: 0 !important;
}
#qunit-testrunner-toolbar label {
font-weight: inherit;
margin-bottom: inherit;
}
#qunit-testrunner-toolbar input[type=text] {
width: inherit;
display: inherit;
}
</style>
<script type="text/javascript" src="/web/static/tests/helpers/test_utils.js"></script>
<script type="text/javascript" src="/web/static/tests/helpers/mock_server.js"></script>
<script type="text/javascript" src="/web/static/tests/views/list_benchmarks.js"></script>
<script type="text/javascript" src="/web/static/tests/views/kanban_benchmarks.js"></script>
<script type="text/javascript" src="/web/static/tests/views/form_benchmarks.js"></script>
</t>
<div id="qunit"/>
<div id="qunit-fixture"/>
</t>
</template>
<template id="web.webclient_bootstrap">
<t t-call="web.layout">
<t t-set="head_web">
<script type="text/javascript">
odoo.session_info = <t t-raw="session_info"/>;
</script>
<t t-call-assets="web.assets_common" t-js="false"/>
<t t-call-assets="web.assets_backend" t-js="false"/>
<t t-call-assets="web.assets_common" t-css="false"/>
<t t-call-assets="web.assets_backend" t-css="false"/>
<![CDATA[
<!--[if lt IE 10]>
<body class="ie9">
<![endif]-->
]]>
<script type="text/javascript">
odoo.define('web.web_client', function (require) {
var WebClient = require('web.WebClient');
var web_client = new WebClient();
$(function() {
web_client.setElement($(document.body));
web_client.start();
});
return web_client;
});
</script>
</t>
<t t-set="head" t-value="head_web + (head or '')"/>
<t t-set="body_classname" t-value="'o_web_client'"/>
<header id="oe_main_menu_navbar">
<nav class="navbar navbar-inverse" groups="base.group_user,base.group_portal">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
</div>
<div class="navbar-collapse collapse">
<t t-call="web.menu"/>
</div>
</nav>
</header>
<div class="o_main">
<aside class="o_sub_menu" groups="base.group_user,base.group_portal" aria-label="Submenu">
<t t-call="web.menu_secondary"/>
</aside>
<main class="o_main_content"/>
</div>
</t>
</template>
<!--
Optional Bundle for PDFJS lib
Since PDFJS is quite huge (40000 lines), please only load it when it is necessary.
For now, it is only use to display the PDF slide Viewer during an embed.
Bundlized, the size is reduced to 3000 lines.
-->
<template id="pdf_js_lib" name="PDF JS Library">
<script type="text/javascript" src="/web/static/lib/pdfjs/src/shared/util.js"></script>
<script type="text/javascript" src="/web/static/lib/pdfjs/src/display/api.js"></script>
<script type="text/javascript" src="/web/static/lib/pdfjs/src/display/metadata.js"></script>
<script type="text/javascript" src="/web/static/lib/pdfjs/src/display/canvas.js"></script>
<script type="text/javascript" src="/web/static/lib/pdfjs/src/display/webgl.js"></script>
<script type="text/javascript" src="/web/static/lib/pdfjs/src/display/pattern_helper.js"></script>
<script type="text/javascript" src="/web/static/lib/pdfjs/src/display/font_loader.js"></script>
<script type="text/javascript" src="/web/static/lib/pdfjs/src/display/annotation_helper.js"></script>
<!-- files normally dynamically loaded in worker_loader.js -->
<script type="text/javascript" src="/web/static/lib/pdfjs/src/core/network.js"></script>
<script type="text/javascript" src="/web/static/lib/pdfjs/src/core/chunked_stream.js"></script>
<script type="text/javascript" src="/web/static/lib/pdfjs/src/core/pdf_manager.js"></script>
<script type="text/javascript" src="/web/static/lib/pdfjs/src/core/core.js"></script>
<script type="text/javascript" src="/web/static/lib/pdfjs/src/core/obj.js"></script>
<script type="text/javascript" src="/web/static/lib/pdfjs/src/core/charsets.js"></script>
<script type="text/javascript" src="/web/static/lib/pdfjs/src/core/annotation.js"></script>
<script type="text/javascript" src="/web/static/lib/pdfjs/src/core/function.js"></script>
<script type="text/javascript" src="/web/static/lib/pdfjs/src/core/colorspace.js"></script>
<script type="text/javascript" src="/web/static/lib/pdfjs/src/core/crypto.js"></script>
<script type="text/javascript" src="/web/static/lib/pdfjs/src/core/pattern.js"></script>
<script type="text/javascript" src="/web/static/lib/pdfjs/src/core/evaluator.js"></script>
<script type="text/javascript" src="/web/static/lib/pdfjs/src/core/cmap.js"></script>
<script type="text/javascript" src="/web/static/lib/pdfjs/src/core/fonts.js"></script>
<script type="text/javascript" src="/web/static/lib/pdfjs/src/core/font_renderer.js"></script>
<script type="text/javascript" src="/web/static/lib/pdfjs/src/core/glyphlist.js"></script>
<script type="text/javascript" src="/web/static/lib/pdfjs/src/core/image.js"></script>
<script type="text/javascript" src="/web/static/lib/pdfjs/src/core/metrics.js"></script>
<script type="text/javascript" src="/web/static/lib/pdfjs/src/core/parser.js"></script>
<script type="text/javascript" src="/web/static/lib/pdfjs/src/core/ps_parser.js"></script>
<script type="text/javascript" src="/web/static/lib/pdfjs/src/core/stream.js"></script>
<script type="text/javascript" src="/web/static/lib/pdfjs/src/core/worker.js"></script>
<script type="text/javascript" src="/web/static/lib/pdfjs/src/core/arithmetic_decoder.js"></script>
<script type="text/javascript" src="/web/static/lib/pdfjs/src/core/jpg.js"></script>
<script type="text/javascript" src="/web/static/lib/pdfjs/src/core/jpx.js"></script>
<script type="text/javascript" src="/web/static/lib/pdfjs/src/core/jbig2.js"></script>
<script type="text/javascript" src="/web/static/lib/pdfjs/src/core/bidi.js"></script>
<script type="text/javascript" src="/web/static/lib/pdfjs/src/core/murmurhash3.js"></script>
<!--
NOTE JEM : PDFJS not-minified load its assets dynamically. Not minify, this lib is huge (4000 lines).
To load PDFJS using odoo bundle, we create a custom worker_loader, to avoid reloading all the assets (core/*.js) dynamically.
Loading all this assets in a bundle can be problematic in debug mode, since we don't wait all assets to be loaded to start using PDFJS. That's why, in debug mode, we use the native loader, otherwise our custom loader is used.
-->
<t t-if="not debug">
<script>
// Use Odoo PDFJS Loader, to avoid dynamic assets loading
PDFJS.workerSrc = '/web/static/lib/pdfjs/worker_loader_by_odoo.js';
PDFJS.disableWorker = true;
</script>
</t>
<t t-if="debug">
<script>
// Specify the main script used to create a new PDF.JS web worker.
// In production, leave this undefined or change it to point to the
// combined `pdf.worker.js` file.
PDFJS.workerSrc = '/web/static/lib/pdfjs/src/worker_loader.js';
</script>
</t>
<!--
If no loader defined, this file will try to load pdf.worker.js (in build/).
It will crash since we don't use the minified version of PDFJS
-->
<script type="text/javascript" src="/web/static/lib/pdfjs/src/pdf.js"></script>
</template>
</odoo>