summaryrefslogtreecommitdiff
path: root/addons/web/views
diff options
context:
space:
mode:
authorstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
committerstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
commit3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch)
treea44932296ef4a9b71d5f010906253d8c53727726 /addons/web/views
parent0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff)
initial commit 2
Diffstat (limited to 'addons/web/views')
-rw-r--r--addons/web/views/base_document_layout_views.xml54
-rw-r--r--addons/web/views/database_manager.html421
-rw-r--r--addons/web/views/report_templates.xml773
-rw-r--r--addons/web/views/webclient_templates.xml903
4 files changed, 2151 insertions, 0 deletions
diff --git a/addons/web/views/base_document_layout_views.xml b/addons/web/views/base_document_layout_views.xml
new file mode 100644
index 00000000..7f9e5c03
--- /dev/null
+++ b/addons/web/views/base_document_layout_views.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<odoo>
+ <data>
+ <record id="view_base_document_layout" model="ir.ui.view">
+ <field name="name">Document Layout</field>
+ <field name="model">base.document.layout</field>
+ <field name="arch" type="xml">
+ <form class="o_document_layout">
+ <group>
+ <group class="o_document_layout_company">
+ <field name="company_id" invisible="1"/>
+ <field name="external_report_layout_id" invisible="1" />
+ <field name="logo_primary_color" invisible="1" />
+ <field name="logo_secondary_color" invisible="1" />
+ <field name="report_layout_id" widget="radio" string="Layout"/>
+ <field name="logo" widget="image"/>
+ <label for="primary_color" string="Colors" />
+ <div class="o_document_layout_colors">
+ <field name="primary_color" widget="color"/>
+ <field name="secondary_color" widget="color"/>
+ <field name="custom_colors" class="d-none" />
+ <button class="btn btn-link" title="Reset to logo colors" attrs="{'invisible': [('custom_colors', '=', False)]}">
+ <label for="custom_colors" class="fa fa-refresh" string="" />
+ </button>
+ </div>
+ <field name="font" widget="font"/>
+ <field name="report_header" widget="char" placeholder="e.g. Global Business Solutions" />
+ <field name="report_footer" string="Footer" placeholder="e.g. Opening hours, bank accounts (one per line)" />
+ <field name="paperformat_id" required="1" />
+ </group>
+ <div>
+ <field name="preview" widget="iframe_wrapper" />
+ </div>
+ </group>
+ <footer>
+ <button string="Save" class="btn-primary" type="object" name="document_layout_save"/>
+ <button special="cancel" string="Cancel" />
+ </footer>
+ </form>
+ </field>
+ </record>
+
+ <record id="action_base_document_layout_configurator" model="ir.actions.act_window">
+ <field name="type">ir.actions.act_window</field>
+ <field name="name">Configure your document layout</field>
+ <field name="view_mode">form</field>
+ <field name="target">new</field>
+ <field name="res_model">base.document.layout</field>
+ <field name="view_id" ref="web.view_base_document_layout"/>
+ </record>
+
+ </data>
+</odoo>
+
diff --git a/addons/web/views/database_manager.html b/addons/web/views/database_manager.html
new file mode 100644
index 00000000..811ec082
--- /dev/null
+++ b/addons/web/views/database_manager.html
@@ -0,0 +1,421 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta http-equiv="content-type" content="text/html; charset=utf-8">
+ <title>Odoo</title>
+ <link rel="shortcut icon" href="/web/static/src/img/favicon.ico" type="image/x-icon">
+
+ <link rel="stylesheet" href="/web/static/lib/fontawesome/css/font-awesome.css">
+ <link rel="stylesheet" href="/web/static/lib/bootstrap/css/bootstrap.css">
+
+ <script src="/web/static/lib/jquery/jquery.js" type="text/javascript"></script>
+
+ <script type="text/javascript" src="/web/static/lib/popper/popper.js"></script>
+
+ <script type="text/javascript" src="/web/static/lib/bootstrap/js/index.js"></script>
+ <script type="text/javascript" src="/web/static/lib/bootstrap/js/util.js"></script>
+ <script type="text/javascript" src="/web/static/lib/bootstrap/js/alert.js"></script>
+ <script type="text/javascript" src="/web/static/lib/bootstrap/js/button.js"></script>
+ <script type="text/javascript" src="/web/static/lib/bootstrap/js/carousel.js"></script>
+ <script type="text/javascript" src="/web/static/lib/bootstrap/js/collapse.js"></script>
+ <script type="text/javascript" src="/web/static/lib/bootstrap/js/dropdown.js"></script>
+ <script type="text/javascript" src="/web/static/lib/bootstrap/js/modal.js"></script>
+ <script type="text/javascript" src="/web/static/lib/bootstrap/js/tooltip.js"></script>
+ <script type="text/javascript" src="/web/static/lib/bootstrap/js/popover.js"></script>
+ <script type="text/javascript" src="/web/static/lib/bootstrap/js/scrollspy.js"></script>
+ <script type="text/javascript" src="/web/static/lib/bootstrap/js/tab.js"></script>
+
+ <script type="text/javascript">
+ $(function() {
+ // Little eye
+ $('body').on('mousedown', '.o_little_eye', function (ev) {
+ $(ev.target).closest('.input-group').find('.form-control').prop("type",
+ (i, old) => { return old === "text" ? "password" : "text"; }
+ );
+ });
+ // db modal
+ $('body').on('click', '.o_database_action', function (ev) {
+ ev.preventDefault();
+ var db = $(ev.currentTarget).data('db');
+ var target = $(ev.currentTarget).data('target');
+ $(target).find('input[name=name]').val(db);
+ $(target).modal();
+ });
+ // close modal on submit
+ $('.modal').on('submit', 'form', function (ev) {
+ var form = $(this).closest('form')[0];
+ if (form && form.checkValidity && !form.checkValidity()) {
+ return;
+ }
+ var modal = $(this).parentsUntil('body', '.modal');
+ if (modal.hasClass('o_database_backup')) {
+ $(modal).modal('hide');
+ if (!$('.alert-backup-long').length) {
+ $('.list-group').before("<div class='alert alert-info alert-backup-long'>The backup may take some time before being ready</div>");
+ }
+ }
+ });
+
+ // generate a random master password
+ // removed l1O0 to avoid confusions
+ var charset = "abcdefghijkmnpqrstuvwxyz23456789";
+ var password = "";
+ for (var i = 0, n = charset.length; i < 12; ++i) {
+ password += charset.charAt(Math.floor(Math.random() * n));
+ if (i === 3 || i === 7) {
+ password += "-";
+ }
+ }
+ var master_pwds = document.getElementsByClassName("generated_master_pwd");
+ for (var i=0, len=master_pwds.length|0; i<len; i=i+1|0) {
+ master_pwds[i].innerText = password;
+ }
+ var master_pwd_inputs = document.getElementsByClassName("generated_master_pwd_input");
+ for (var i=0, len=master_pwd_inputs.length|0; i<len; i=i+1|0) {
+ master_pwd_inputs[i].value = password;
+ master_pwd_inputs[i].setAttribute('autocomplete', 'new-password');
+ }
+ });
+ </script>
+ </head>
+
+ {% macro master_input(set_master_pwd=False) -%}
+
+ {% set input_class = "form-control" %}
+ {% if insecure %}
+ {% if set_master_pwd %}
+ <input type="hidden" name="master_pwd" class="form-control" value="admin"/>
+ {% else %}
+ <div class="alert alert-warning">
+ <p>Warning, your Odoo database manager is not protected. To secure it, we have generated the following master password for it:</p>
+ <p style="text-align: center;"><strong class="generated_master_pwd"></strong></p>
+ <p>You can change it below but be sure to remember it, it will be asked for future operations on databases.</p>
+ </div>
+ {% set input_class = "form-control generated_master_pwd_input" %}
+ {% endif %}
+ {% endif %}
+ {% if not insecure or not set_master_pwd %}
+ <div class="form-group row">
+ <label for="master_pwd" class="col-md-4 col-form-label">Master Password</label>
+ <div class="col-md-8 input-group">
+ <input name="master_pwd"
+ class="{{ input_class}}"
+ required="required"
+ autofocus="autofocus"
+ type="password"
+ autocomplete="current-password" />
+ <div class="input-group-append">
+ <span class="fa fa-eye o_little_eye input-group-text" aria-hidden="true" style="cursor: pointer;"></span>
+ </div>
+ </div>
+ </div>
+ {% endif %}
+ {%- endmacro %}
+
+ {% macro create_form() -%}
+ {{ master_input() }}
+ <div class="form-group row">
+ <label for="name" class="col-md-4 col-form-label">Database Name</label>
+ <div class="col-md-8">
+ <input id="dbname" type="text" name="name" class="form-control" required="required" autocomplete="off" pattern="{{ pattern }}" title="Only alphanumerical characters, underscore, hyphen and dot are allowed"/>
+ </div>
+ </div>
+ <div class="form-group row">
+ <label for="login" class="col-md-4 col-form-label">Email</label>
+ <div class="col-md-8">
+ <input id="login" type="text" name="login" class="form-control" required="required" autocomplete="off"/>
+ </div>
+ </div>
+ <div class="form-group row">
+ <label for="password" class="col-md-4 col-form-label">Password</label>
+ <div class="col-md-8 input-group">
+ <input id="password" type="password" name="password" class="form-control" required="required" autocomplete="off"/>
+ <div class="input-group-append">
+ <span class="fa fa-eye o_little_eye input-group-text" aria-hidden="true" style="cursor: pointer;"></span>
+ </div>
+ </div>
+ </div>
+ <div class="form-group row">
+ <label for="phone" class="col-md-4 col-form-label">Phone number</label>
+ <div class="col-md-8 input-group">
+ <input id="phone" type="tel" name="phone" class="form-control" autocomplete="off"/>
+ </div>
+ </div>
+ <div class="form-group row">
+ <label for="lang" class="col-md-4 col-form-label">Language</label>
+ <div class="col-md-8">
+ <select id="lang" name="lang" class="form-control" required="required" autocomplete="off">
+ {% for lang in langs %}
+ <option {% if lang[0] == "en_US" %}selected="selected" {% endif %}value="{{ lang[0] }}">{{ lang[1] }}</option>
+ {% endfor %}
+ </select>
+ </div>
+ </div>
+ <div class="form-group row">
+ <label for="country" class="col-md-4 col-form-label ">Country</label>
+ <div class="col-md-8">
+ <select id="country" name="country_code" class="form-control" autocomplete="off">
+ <option value=""></option>
+ {% for country in countries %}
+ <option value="{{ country[0] }}">{{ country[1] }}</option>
+ {% endfor %}
+ </select>
+ </div>
+ </div>
+ <div class="form-group row">
+ <label for="load_demo_checkbox" class="col-md-4 col-form-label">Demo data</label>
+ <div class="col-md-8">
+ <input type="checkbox" id="load_demo_checkbox" class="form-control-sm" name="demo" value="1">
+ </div>
+ </div>
+ {%- endmacro %}
+
+ <body>
+ <div class="container">
+ <!-- Database List -->
+ <div class="row">
+ <div class="col-lg-6 offset-lg-3 o_database_list">
+ <img src="/web/static/src/img/logo2.png" class="img-fluid d-block mx-auto"/>
+ {% if not list_db %}
+ <div class="alert alert-danger text-center">The database manager has been disabled by the administrator</div>
+ {% elif insecure and databases %}
+ <div class="alert alert-warning">
+ Warning, your Odoo database manager is not protected.<br/>
+ Please <a href="#" data-toggle="modal" data-target=".o_database_master">set a master password</a> to secure it.
+ </div>
+ {% endif %}
+ {% if error %}
+ <div class="alert alert-danger">{{ error }}</div>
+ {% endif %}
+ {% if list_db and databases %}
+ <div class="list-group">
+ {% for db in databases %}
+ <div class="list-group-item d-flex align-items-center">
+ <a href="/web?db={{ db }}" class="d-block flex-grow-1">
+ {% if db in incompatible_databases %}
+ <i class="icon fa fa-warning float-right text-warning" title="This database may not be compatible"></i>
+ {% endif %}
+ {{ db }}
+ </a>
+ {% if manage %}
+ <div class="btn-group btn-group-sm float-right">
+ <button type="button" data-db="{{ db }}" data-target=".o_database_backup" class="o_database_action btn btn-primary">
+ <i class="fa fa-floppy-o fa-fw"></i> Backup
+ </button>
+ <button type="button" data-db="{{ db }}" data-target=".o_database_duplicate" class="o_database_action btn btn-secondary">
+ <i class="fa fa-files-o fa-fw"></i> Duplicate
+ </button>
+ <button type="button" data-db="{{ db }}" data-target=".o_database_delete" class="o_database_action btn btn-danger">
+ <i class="fa fa-trash-o fa-fw"></i> Delete
+ </button>
+ </div>
+ {% endif %}
+ </div>
+ {% endfor %}
+ </div>
+ {% if manage %}
+ <div class="d-flex mt-2">
+ <button type="button" data-toggle="modal" data-target=".o_database_create" class="btn btn-primary flex-grow-1">Create Database</button>
+ <button type="button" data-toggle="modal" data-target=".o_database_restore" class="btn btn-primary flex-grow-1 ml-2">Restore Database</button>
+ <button type="button" data-toggle="modal" data-target=".o_database_master" class="btn btn-primary flex-grow-1 ml-2">Set Master Password</button>
+ </div>
+ {% else %}
+ <div class="text-center mt-2">
+ <a href="/web/database/manager">Manage databases</a>
+ </div>
+ {% endif %}
+ {% elif list_db %}
+ <form role="form" action="/web/database/create" method="post">
+ {{ create_form() }}
+ <input type="submit" value="Create database" class="btn btn-primary float-left"/>
+ </form>
+ <a role="button" data-toggle="modal" data-target=".o_database_restore" class="btn btn-link">or restore a database</a>
+ {% endif %}
+ </div>
+ </div>
+ </div>
+
+ <!-- Create -->
+ <div class="modal fade o_database_create" role="dialog">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <form role="form" action="/web/database/create" method="post">
+ <div class="modal-header">
+ <h4 class="modal-title">Create Database</h4>
+ <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
+ </div>
+ <div class="modal-body">
+ {{ create_form() }}
+ <small class="text-muted">
+ To enhance your experience, some data may be sent to Odoo online services. See our <a href="https://www.odoo.com/privacy">Privacy Policy</a>.
+ </small>
+ </div>
+ <div class="modal-footer">
+ <input type="submit" value="Continue" class="btn btn-primary float-right"/>
+ </div>
+ </form>
+ </div>
+ </div>
+ </div>
+
+ <!-- Restore -->
+ <div class="modal fade o_database_restore" role="dialog">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <h4 class="modal-title">Restore Database</h4>
+ <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
+ </div>
+ <form id="form_restore_db" role="form" action="/web/database/restore" method="post" enctype="multipart/form-data">
+ <div class="modal-body">
+ {{ master_input() }}
+ <div class="form-group row">
+ <label for="backup_file" class="col-md-4 col-form-label">File</label>
+ <div class="col-md-8">
+ <input id="backup_file" type="file" name="backup_file" class="required"/>
+ </div>
+ </div>
+ <div class="form-group row">
+ <label for="name" class="col-md-4 col-form-label">Database Name</label>
+ <div class="col-md-8">
+ <input id="dbname_restore" type="text" name="name" class="form-control" required="required" pattern="{{ pattern }}" title="Only alphanumerical characters, underscore, hyphen and dot are allowed"/>
+ </div>
+ </div>
+ <div class="form-group">
+ <label for="copy">This database might have been moved or copied.</label>
+ <p class="form-text">
+ In order to avoid conflicts between databases, Odoo needs to know if this database was moved or copied.<br/>
+ If you don't know, answer "This database is a copy".
+ </p>
+ <div class="custom-control custom-radio">
+ <input id="radio_copy_true" name="copy" type="radio" class="custom-control-input" value="true" checked="1">
+ <label for="radio_copy_true" class="custom-control-label">This database is a copy</label>
+ </div>
+ <div class="custom-control custom-radio">
+ <input id="radio_copy_false" name="copy" type="radio" class="custom-control-input" value="false">
+ <label for="radio_copy_false" class="custom-control-label">This database was moved</label>
+ </div>
+ </div>
+ </div>
+ <div class="modal-footer">
+ <input type="submit" value="Continue" class="btn btn-primary float-right"/>
+ </div>
+ </form>
+ </div>
+ </div>
+ </div>
+
+ <!-- Master password -->
+ <div class="modal fade o_database_master" role="dialog">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <h4 class="modal-title">Set Master Password</h4>
+ <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
+ </div>
+ <form id="form_change_pwd" role="form" action="/web/database/change_password" method="post">
+ <div class="modal-body">
+ <p>The master password is required to create, delete, dump or restore databases.</p>
+ {{ master_input(set_master_pwd=True) }}
+ <div class="form-group">
+ <label for="master_pwd_new" class="col-form-label">New Master Password</label>
+ <div class="input-group">
+ <input id="master_pwd_new" type="password" name="master_pwd_new" class="form-control" required="required" autocomplete="new-password"/>
+ <div class="input-group-append">
+ <span class="fa fa-eye o_little_eye input-group-text" aria-hidden="true" style="cursor: pointer;"></span>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="modal-footer">
+ <input type="submit" value="Continue" class="btn btn-primary float-right"/>
+ </div>
+ </form>
+ </div>
+ </div>
+ </div>
+
+ <!-- Duplicate DB -->
+ <div class="modal fade o_database_duplicate" role="dialog">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <h4 class="modal-title">Duplicate Database</h4>
+ <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
+ </div>
+ <form id="form-duplicate-db" role="form" action="/web/database/duplicate" method="post">
+ <div class="modal-body">
+ {{ master_input() }}
+ <div class="form-group">
+ <label for="name" class="col-form-label">Database Name</label>
+ <input id="dbname_duplicate" type="text" name="name" class="form-control" required="required" readonly="readonly"/>
+ </div>
+ <div class="form-group">
+ <label for="new_name" class="col-form-label">New Name</label>
+ <input id="new_name" type="text" name="new_name" class="form-control" required="required" pattern="{{ pattern }}" title="Only alphanumerical characters, underscore, hyphen and dot are allowed"/>
+ </div>
+ </div>
+ <div class="modal-footer">
+ <input type="submit" value="Continue" class="btn btn-primary float-right"/>
+ </div>
+ </form>
+ </div>
+ </div>
+ </div>
+
+ <!-- Drop DB -->
+ <div class="modal fade o_database_delete" role="dialog">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <h4 class="modal-title">Delete Database</h4>
+ <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
+ </div>
+ <form id="form_drop_db" role="form" action="/web/database/drop" method="post">
+ <div class="modal-body">
+ {{ master_input() }}
+ <div class="form-group">
+ <label for="name" class="col-form-label">Database</label>
+ <input id="dbname_delete" type="text" name="name" class="form-control" required="required" readonly="readonly"/>
+ </div>
+ </div>
+ <div class="modal-footer">
+ <input type="submit" value="Delete" class="btn btn-primary float-right"/>
+ </div>
+ </form>
+ </div>
+ </div>
+ </div>
+
+ <!-- Backup DB -->
+ <div class="modal fade o_database_backup" role="dialog">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <h4 class="modal-title">Backup Database</h4>
+ <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
+ </div>
+ <form id="form_backup_db" role="form" action="/web/database/backup" method="post">
+ <div class="modal-body">
+ {{ master_input() }}
+ <div class="form-group">
+ <label for="name" class="col-form-label">Database Name</label>
+ <input id="dbname_backup" type="text" name="name" class="form-control" required="required" readonly="readonly"/>
+ </div>
+ <div class="form-group">
+ <label for="backup_format" class="col-form-label">Backup Format</label>
+ <select id="backup_format" name="backup_format" class="form-control" required="required">
+ <option value="zip">zip (includes filestore)</option>
+ <option value="dump">pg_dump custom format (without filestore)</option>
+ </select>
+ </div>
+ </div>
+ <div class="modal-footer">
+ <input type="submit" value="Backup" class="btn btn-primary float-right"/>
+ </div>
+ </form>
+ </div>
+ </div>
+ </div>
+ </body>
+</html>
diff --git a/addons/web/views/report_templates.xml b/addons/web/views/report_templates.xml
new file mode 100644
index 00000000..573d1f1a
--- /dev/null
+++ b/addons/web/views/report_templates.xml
@@ -0,0 +1,773 @@
+<?xml version="1.0" encoding="utf-8"?>
+<odoo>
+ <!-- Assets for reports -->
+
+ <template id="report_assets_common">
+ <t t-call="web._assets_helpers">
+ <link rel="stylesheet" type="text/scss" href="/web/static/src/scss/bootstrap_overridden_report.scss"/>
+ </t>
+
+ <t t-call="web._assets_bootstrap"/>
+
+ <link href="/base/static/src/css/description.css" rel="stylesheet" type="text/css"/>
+
+ <link href="/web/static/lib/fontawesome/css/font-awesome.css" rel="stylesheet" type="text/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/report.scss"/>
+ <link rel="stylesheet" type="text/scss" href="/web/static/src/scss/layout_standard.scss"/>
+ <link rel="stylesheet" type="text/scss" href="/web/static/src/scss/layout_background.scss"/>
+ <link rel="stylesheet" type="text/scss" href="/web/static/src/scss/layout_boxed.scss"/>
+ <link rel="stylesheet" type="text/scss" href="/web/static/src/scss/layout_clean.scss"/>
+ <link rel="stylesheet" type="text/scss" href="/web/static/src/scss/asset_styles_company_report.scss"/>
+
+ <script type="text/javascript" src="/web/static/src/js/services/session.js"/>
+ <script type="text/javascript" src="/web/static/src/js/public/public_root.js"/>
+ <script type="text/javascript" src="/web/static/src/js/public/public_root_instance.js"/>
+ <script type="text/javascript" src="/web/static/src/js/public/public_widget.js"/>
+ <script type="text/javascript" src="/web/static/src/js/report/utils.js"/>
+ <script type="text/javascript" src='/web/static/src/js/report/report.js' />
+ </template>
+
+ <template id="report_assets_pdf">
+ <link href="/web/static/src/css/reset.min.css" rel="stylesheet"/>
+ </template>
+
+ <!-- Private templates used internally by reports -->
+
+ <template id="report_layout" name="Report layout">&lt;!DOCTYPE html&gt;
+ <html t-att-lang="lang and lang.replace('_', '-')"
+ t-att-data-report-margin-top="data_report_margin_top"
+ t-att-data-report-header-spacing="data_report_header_spacing"
+ t-att-data-report-dpi="data_report_dpi"
+ t-att-data-report-landscape="data_report_landscape"
+ t-att-web-base-url="web_base_url">
+ <head>
+ <meta charset="utf-8"/>
+ <meta name="viewport" content="initial-scale=1"/>
+ <title><t t-esc="title or 'Odoo Report'"/></title>
+ <t t-call-assets="web.report_assets_common" t-js="false"/>
+ <t t-call-assets="web.assets_common" t-css="false"/>
+ <t t-call-assets="web.report_assets_common" t-css="false"/>
+ </head>
+ <body t-att-class="'container' if not full_width else 'container-fluid'">
+ <div id="wrapwrap">
+ <main>
+ <t t-raw="0"/>
+ </main>
+ </div>
+ </body>
+ </html>
+ </template>
+
+ <template id="report_preview_layout" name="Report layout">&lt;!DOCTYPE html&gt;
+ <html t-att-lang="lang and lang.replace('_', '-')"
+ t-att-data-report-margin-top="data_report_margin_top"
+ t-att-data-report-header-spacing="data_report_header_spacing"
+ t-att-data-report-dpi="data_report_dpi"
+ t-att-data-report-landscape="data_report_landscape"
+ t-att-web-base-url="web_base_url"
+ >
+ <head>
+ <meta charset="utf-8"/>
+ <meta name="viewport" content="initial-scale=1"/>
+ <title><t t-esc="title or 'Odoo Report'"/></title>
+ <t t-call-assets="web.report_assets_common" t-js="false"/>
+ <t t-call-assets="web.assets_common" t-css="false"/>
+ <style>
+ <t t-raw="preview_css"/>
+
+ /**
+ Some css is overridden as it doesn't work properly in the preview.
+ Before generating 'real' reports, a lot of processing is applied. It is therefore quite
+ complicated to have an almost exact replica of the pdf report.
+ This changes down here are hacks to make the preview look as good as possible.
+ **/
+
+ /** The footers are not at the bottom of the page, so we push them down. **/
+ .o_background_footer {
+ margin-top: 270px !important;
+ }
+ .o_standard_footer {
+ margin-top: 190px !important;
+ }
+ .o_boxed_footer {
+ margin-top: 270px !important;
+ }
+ .o_clean_footer {
+ margin-top: 160px !important;
+ }
+
+ /** Avoid image overflowing and creating a scrollbar **/
+ .o_background_header {
+ min-width: initial !important;
+ }
+
+ /** This rule is overridden in web/report.scss to hack around whtml2pdf
+ Simply set it to its default value so it works properly in preview **/
+ .col-auto{
+ -webkit-box-flex: 0 !important;
+ -webkit-flex: 0 0 auto !important;
+ flex: 0 0 auto !important;
+ width: auto !important;
+ max-width: 100% !important;
+ }
+
+ </style>
+ </head>
+ <body t-att-class="'container' if not full_width else 'container-fluid'">
+ <div id="wrapwrap">
+ <t t-raw="0"/>
+ </div>
+ </body>
+ </html>
+ </template>
+
+ <template id="html_container">
+ <t t-set="body_classname" t-value="'container'"/>
+ <t t-call="web.report_layout">
+ <t t-raw="0"/>
+ </t>
+ </template>
+
+ <template id="html_preview_container">
+ <t t-set="body_classname" t-value="'container'"/>
+ <t t-call="web.report_preview_layout">
+ <t t-raw="0"/>
+ </t>
+ </template>
+
+
+ <template id="report_invoice_wizard_preview">
+ <t t-call="web.html_preview_container">
+ <t t-call="web.external_layout">
+ <div class="pt-5">
+ <div class="address row">
+ <div name="address" class="col-md-5 ml-auto">
+ <address>
+ <address class="mb-0" itemscope="itemscope"
+ itemtype="http://schema.org/Organization">
+ <div>
+ <span itemprop="name">Deco Addict</span>
+ </div>
+ <div itemprop="address" itemscope="itemscope"
+ itemtype="http://schema.org/PostalAddress">
+ <div class="d-flex align-items-baseline">
+ <span class="w-100 o_force_ltr" itemprop="streetAddress">77 Santa Barbara
+ Rd<br/>Pleasant Hill CA 94523<br/>United States</span>
+ </div>
+ </div>
+ </address>
+ </address>
+ </div>
+ </div>
+ </div>
+ <div class="page">
+ <h2>
+ <span>Invoice</span>
+ <span>INV/2020/07/0003</span>
+ </h2>
+ <div id="informations" class="row mt32 mb32">
+ <div class="col-auto mw-100 mb-2" name="invoice_date">
+ <strong>Invoice Date:</strong>
+ <p class="m-0">07/08/2020</p>
+ </div>
+ <div class="col-auto mw-100 mb-2" name="due_date">
+ <strong>Due Date:</strong>
+ <p class="m-0">08/07/2020</p>
+ </div>
+ </div>
+ <table class="table table-sm o_main_table" name="invoice_line_table">
+ <thead>
+ <tr>
+ <th name="th_description" class="text-left"><span>Description</span></th>
+ <th name="th_quantity" class="text-right"><span>Quantity</span></th>
+ <th name="th_priceunit" class="text-right d-none d-md-table-cell"><span>Unit Price</span></th>
+ <th name="th_taxes" class="text-left d-none d-md-table-cell"><span>Taxes</span></th>
+ <th name="th_subtotal" class="text-right">
+ <span>Amount</span>
+ </th>
+ </tr>
+ </thead>
+ <tbody class="invoice_tbody">
+ <tr>
+ <td name="account_invoice_line_name"><span>[FURN_8999] Three-Seat Sofa<br/>
+ Three Seater Sofa with Lounger in Steel Grey Colour</span></td>
+ <td class="text-right">
+ <span>5.000</span>
+ </td>
+ <td class="text-right d-none d-md-table-cell">
+ <span class="text-nowrap">1,500.00</span>
+ </td>
+ <td class="text-left d-none d-md-table-cell">
+ <span id="line_tax_ids">15.00%</span>
+ </td>
+ <td class="text-right o_price_total">
+ <span class="text-nowrap">$ <span class="oe_currency_value">7,500.00</span></span>
+ </td>
+ </tr>
+ <tr>
+ <td name="account_invoice_line_name"><span>[FURN_8220] Four Person Desk<br/>
+ Four person modern office workstation</span></td>
+ <td class="text-right">
+ <span>5.000</span>
+ </td>
+ <td class="text-right d-none d-md-table-cell">
+ <span class="text-nowrap">23,500.00</span>
+ </td>
+ <td class="text-left d-none d-md-table-cell">
+ <span id="line_tax_ids">15.00%</span>
+ </td>
+ <td class="text-right o_price_total">
+ <span class="text-nowrap">$ <span class="oe_currency_value">117,500.00</span></span>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ <div class="clearfix">
+ <div id="total" class="row">
+ <div class="col-sm-7 col-md-6 ml-auto">
+ <table class="table table-sm" style="page-break-inside: avoid;">
+ <tbody><tr class="border-black o_subtotal" style="">
+ <td><strong>Subtotal</strong></td>
+ <td class="text-right">
+ <span>$ <span class="oe_currency_value">125,000.00</span></span>
+ </td>
+ </tr>
+ <tr style="">
+ <td><span class="text-nowrap">Tax 15%</span></td>
+ <td class="text-right o_price_total">
+ <span class="text-nowrap">$ 18,750.00</span>
+ </td>
+ </tr>
+ <tr class="border-black o_total">
+ <td><strong>Total</strong></td>
+ <td class="text-right">
+ <span class="text-nowrap">$ <span class="oe_currency_value">
+ 143,750.00</span></span>
+ </td>
+ </tr>
+ </tbody></table>
+ </div>
+ </div>
+ </div>
+ <p>
+ Please use the following communication for your payment : <b><span>
+ INV/2020/07/0003</span></b>
+ </p>
+ <p name="payment_term">
+ <span>Payment terms: 30 Days</span>
+ </p>
+ </div>
+ </t>
+ </t>
+ </template>
+
+ <template id="minimal_layout">
+ &lt;!DOCTYPE html&gt;
+ <t t-raw="'&lt;base href=%s&gt;' % base_url"/>
+ <html style="height: 0;">
+ <head>
+ <t t-call-assets="web.report_assets_pdf" t-js="false"/>
+ <t t-call-assets="web.report_assets_common" t-js="false"/>
+ <t t-call-assets="web.report_assets_pdf" t-css="false"/>
+ <meta charset="utf-8"/>
+ <t t-set="subst_needed" t-value="subst is True"/>
+ <t t-if="subst_needed">
+ <script>
+ function subst() {
+ var vars = {};
+ var x = document.location.search.substring(1).split('&amp;');
+ for (var i in x) {
+ var z = x[i].split('=', 2);
+ vars[z[0]] = unescape(z[1]);
+ }
+ var x = ['sitepage', 'sitepages', 'section', 'subsection', 'subsubsection'];
+ var z = {'sitepage': 'page', 'sitepages': 'topage'};
+ for (var i in x) {
+ var y = document.getElementsByClassName(z[x[i]] || x[i])
+ for (var j=0; j&lt;y.length; ++j)
+ y[j].textContent = vars[x[i]];
+ }
+
+ var index = vars['webpage'].split('.', 4)[3];
+ var header = document.getElementById('minimal_layout_report_headers');
+ if(header !== null){
+ var companyHeader = header.children[index];
+ header.textContent = '';
+ header.appendChild(companyHeader);
+ }
+ var footer = document.getElementById('minimal_layout_report_footers');
+ if(footer !== null){
+ var companyFooter = footer.children[index];
+ footer.textContent = '';
+ footer.appendChild(companyFooter);
+ }
+ }
+ </script>
+ </t>
+ </head>
+ <body class="container" t-att-onload="subst_needed and 'subst()'">
+ <t t-raw="body"/>
+ </body>
+ </html>
+ </template>
+
+ <!-- External layouts styles -->
+
+ <template id="address_layout">
+ <t t-set="colclass" t-value="('col-md-5' if report_type == 'html' else 'col-5') + ' ml-auto'"/>
+ <t t-if="address">
+ <div class="address row">
+ <t t-if="information_block">
+ <t t-set="colclass" t-value="'col-5 offset-1'"/>
+ <div name="information_block" class="col-6">
+ <t t-raw="information_block"/>
+ </div>
+ </t>
+ <div name="address" t-att-class="colclass">
+ <t t-raw="address"/>
+ </div>
+ </div>
+ </t>
+ </template>
+
+ <template id="external_layout_background">
+ <div t-attf-class="o_company_#{company.id}_layout header" t-att-style="report_header_style">
+ <div class="o_background_header">
+ <div class="float-right">
+ <h3 class="mt0 text-right" t-field="company.report_header"/>
+ </div>
+ <img t-if="company.logo" t-att-src="image_data_uri(company.logo)" class="float-left" alt="Logo"/>
+ <div class="float-left company_address">
+ <div>
+ <strong t-field="company.partner_id.name"/>
+ </div>
+ <span t-field="company.partner_id"
+ t-options='{"widget": "contact", "fields": ["address"], "no_marker": true}'/>
+ </div>
+ <div class="clearfix mb8"/>
+ </div>
+ </div>
+
+ <div t-attf-class="o_company_#{company.id}_layout article o_report_layout_background" t-att-data-oe-model="o and o._name" t-att-data-oe-id="o and o.id" t-att-data-oe-lang="o and o.env.context.get('lang')">
+ <t t-call="web.address_layout"/>
+ <t t-raw="0"/>
+ </div>
+
+ <div t-attf-class="o_company_#{company.id}_layout footer o_background_footer">
+ <div class="text-center">
+ <ul class="list-inline">
+ <li t-if="company.phone" class="list-inline-item"><i class="fa fa-phone" role="img" aria-label="Phone" title="Phone"/> <span class="o_force_ltr" t-field="company.phone"/></li>
+ <li t-if="company.email" class="list-inline-item"><i class="fa fa-at" role="img" aria-label="Email" title="Email"/> <span t-field="company.email"/></li>
+ <li t-if="company.website" class="list-inline-item"><i class="fa fa-globe" role="img" aria-label="Website" title="Website"/> <span t-field="company.website"/></li>
+ <li t-if="company.vat" class="list-inline-item"><i class="fa fa-building-o" role="img" aria-label="Fiscal number"/><t t-esc="company.country_id.vat_label or 'Tax ID'"/>: <span t-field="company.vat"/></li>
+ </ul>
+ <div t-field="company.report_footer"/>
+ <div t-if="report_type == 'pdf'" class="text-muted">
+ Page:
+ <span class="page"/>
+ of
+ <span class="topage"/>
+ </div>
+ </div>
+ </div>
+ </template>
+
+ <template id="external_layout_boxed">
+ <div t-attf-class="header o_company_#{company.id}_layout" t-att-style="report_header_style">
+ <div class="o_boxed_header">
+ <div class="row mb8">
+ <div class="col-6">
+ <img t-if="company.logo" t-att-src="image_data_uri(company.logo)" alt="Logo"/>
+ </div>
+ <div class="col-6 text-right mb4">
+ <h4 class="mt0" t-field="company.report_header"/>
+ <div name="company_address" class="float-right mb4">
+ <span class="company_address" t-field="company.partner_id"
+ t-options='{"widget": "contact", "fields": ["address", "name"], "no_marker": true}'/>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+
+ <div t-attf-class="article o_report_layout_boxed o_company_#{company.id}_layout" t-att-data-oe-model="o and o._name" t-att-data-oe-id="o and o.id" t-att-data-oe-lang="o and o.env.context.get('lang')">
+ <div class="pt-5">
+ <!-- This div ensures that the address is not cropped by the header. -->
+ <t t-call="web.address_layout"/>
+ </div>
+ <t t-raw="0"/>
+ </div>
+
+ <div t-attf-class="footer o_boxed_footer o_company_#{company.id}_layout">
+ <div class="text-center">
+ <ul class="list-inline">
+ <li t-if="company.phone" class="list-inline-item"><span class="o_force_ltr" t-field="company.phone"/></li>
+ <li t-if="company.email" class="list-inline-item"><span t-field="company.email"/></li>
+ <li t-if="company.website" class="list-inline-item"><span t-field="company.website"/></li>
+ <li t-if="company.vat" class="list-inline-item"><t t-esc="company.country_id.vat_label or 'Tax ID'"/>: <span t-field="company.vat"/></li>
+ </ul>
+ <div t-field="company.report_footer"/>
+ <div t-if="report_type == 'pdf'">
+ Page: <span class="page"/> / <span class="topage"/>
+ </div>
+ </div>
+ </div>
+ </template>
+
+ <template id="external_layout_clean">
+ <div t-attf-class="header o_company_#{company.id}_layout" t-att-style="report_header_style">
+ <div class="o_clean_header">
+ <div class="row">
+ <div class="col-6">
+ <img t-if="company.logo" t-att-src="image_data_uri(company.logo)" alt="Logo"/>
+ </div>
+ <div class="col-5 offset-1" name="company_address">
+ <ul class="list-unstyled">
+ <strong><li t-if="company.name"><span t-field="company.name"/></li></strong>
+ <li t-if="company.vat"><t t-esc="company.country_id.vat_label or 'Tax ID'"/>: <span t-field="company.vat"/></li>
+ <li t-if="company.phone">Tel: <span class="o_force_ltr" t-field="company.phone"/></li>
+ <li t-if="company.email"><span t-field="company.email"/></li>
+ <li t-if="company.website"><span t-field="company.website"/></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ </div>
+
+ <div t-attf-class="article o_report_layout_clean o_company_#{company.id}_layout" t-att-data-oe-model="o and o._name" t-att-data-oe-id="o and o.id" t-att-data-oe-lang="o and o.env.context.get('lang')">
+ <t t-call="web.address_layout"/>
+ <t t-raw="0"/>
+ </div>
+
+ <div t-attf-class="footer o_clean_footer o_company_#{company.id}_layout">
+ <div class="row mt8">
+ <div class="col-3">
+ <span t-field="company.report_footer"/>
+ </div>
+ <div class="col-4 text-right">
+ <span class="company_address" t-field="company.partner_id"
+ t-options='{"widget": "contact", "fields": ["address"], "no_marker": true}'/>
+ </div>
+ <div class="col-4">
+ <h4 class="mt0 mb0 text-uppercase" t-field="company.report_header"/>
+ </div>
+ <div class="col-1">
+ <ul t-if="report_type == 'pdf'" class="list-inline pagenumber float-right text-center">
+ <li class="list-inline-item"><strong><span class="page"/></strong></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ </template>
+
+ <template id="external_layout_standard">
+ <div t-attf-class="header o_company_#{company.id}_layout" t-att-style="report_header_style">
+ <div class="row">
+ <div class="col-3 mb4">
+ <img t-if="company.logo" t-att-src="image_data_uri(company.logo)" style="max-height: 45px;" alt="Logo"/>
+ </div>
+ <div class="col-9 text-right" style="margin-top:22px;" t-field="company.report_header" name="moto"/>
+ </div>
+ <div t-if="company.logo or company.report_header" class="row zero_min_height">
+ <div class="col-12">
+ <div style="border-bottom: 1px solid black;"/>
+ </div>
+ </div>
+ <div class="row">
+ <div class="col-6" name="company_address">
+ <div t-field="company.partner_id"
+ t-options='{"widget": "contact", "fields": ["address", "name"], "no_marker": true}'
+ />
+ </div>
+ </div>
+ </div>
+
+ <div t-attf-class="article o_report_layout_standard o_company_#{company.id}_layout" t-att-data-oe-model="o and o._name" t-att-data-oe-id="o and o.id" t-att-data-oe-lang="o and o.env.context.get('lang')">
+ <div class="pt-5">
+ <!-- This div ensures that the address is not cropped by the header. -->
+ <t t-call="web.address_layout"/>
+ </div>
+ <t t-raw="0"/>
+ </div>
+
+ <div t-attf-class="footer o_standard_footer o_company_#{company.id}_layout">
+ <div class="text-center" style="border-top: 1px solid black;">
+ <ul class="list-inline mb4">
+ <!-- using the list-inline-item class from bootstrap causes weird behaviours in pdf report
+ adding d-inline class fixes the problem-->
+ <li t-if="company.phone" class="list-inline-item d-inline"><span class="o_force_ltr" t-field="company.phone"/></li>
+ <li t-if="company.email" class="list-inline-item d-inline"><span t-field="company.email"/></li>
+ <li t-if="company.website" class="list-inline-item d-inline"><span t-field="company.website"/></li>
+ <li t-if="company.vat" class="list-inline-item d-inline"><t t-esc="company.country_id.vat_label or 'Tax ID'"/>: <span t-field="company.vat"/></li>
+ </ul>
+
+ <div name="financial_infos">
+ <span t-field="company.report_footer"/>
+ </div>
+
+ <div t-if="report_type == 'pdf'" class="text-muted">
+ Page: <span class="page"/> / <span class="topage"/>
+ </div>
+ </div>
+ </div>
+ </template>
+
+ <!-- Public api: layout to t-call from reports -->
+
+ <template id="external_layout">
+ <t t-if="not o" t-set="o" t-value="doc"/>
+
+ <t t-if="not company">
+ <!-- Multicompany -->
+ <t t-if="company_id">
+ <t t-set="company" t-value="company_id"/>
+ </t>
+ <t t-elif="o and 'company_id' in o and o.company_id.sudo()">
+ <t t-set="company" t-value="o.company_id.sudo()"/>
+ </t>
+ <t t-else="else">
+ <t t-set="company" t-value="res_company"/>
+ </t>
+ </t>
+
+ <t t-if="company.external_report_layout_id" t-call="{{company.external_report_layout_id.key}}"><t t-raw="0"/></t>
+ <t t-else="else" t-call="web.external_layout_standard"><t t-raw="0"/></t>
+
+ </template>
+
+ <template id="internal_layout">
+ <t t-if="not o" t-set="o" t-value="doc"/>
+
+ <t t-if="not company">
+ <!-- Multicompany -->
+ <t t-if="company_id">
+ <t t-set="company" t-value="company_id"/>
+ </t>
+ <t t-elif="o and 'company_id' in o and o.company_id.sudo()">
+ <t t-set="company" t-value="o.company_id.sudo()"/>
+ </t>
+ <t t-else="else">
+ <t t-set="company" t-value="res_company"/>
+ </t>
+ </t>
+
+ <div class="header">
+ <div class="row">
+ <div class="col-3">
+ <span t-esc="context_timestamp(datetime.datetime.now()).strftime('%Y-%m-%d %H:%M')"/>
+ </div>
+ <div class="col-2 offset-2 text-center">
+ <span t-esc="company.name"/>
+ </div>
+ <div class="col-2 offset-3 text-right">
+ <ul class="list-inline">
+ <li class="list-inline-item"><span class="page"/></li>
+ <li class="list-inline-item">/</li>
+ <li class="list-inline-item"><span class="topage"/></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="article" t-att-data-oe-model="o and o._name" t-att-data-oe-id="o and o.id" t-att-data-oe-lang="o and o.env.context.get('lang')">
+ <t t-raw="0"/>
+ </div>
+ </template>
+
+ <template id="basic_layout">
+ <t t-call="web.html_container">
+ <t t-if="not o" t-set="o" t-value="doc"/>
+ <div class="article" t-att-data-oe-model="o and o._name" t-att-data-oe-id="o and o.id" t-att-data-oe-lang="o and o.env.context.get('lang')">
+ <t t-raw="0"/>
+ </div>
+ </t>
+ </template>
+
+ <!-- Customize the company form view by adding paperformat field as well as demo reports -->
+ <!-- Demo reports definition -->
+ <template id="preview_internalreport">
+ <t t-set="company" t-value="env.company"/>
+ <t t-call="web.html_container">
+ <t t-set="o" t-value="res_company"/>
+ <t t-call="web.internal_layout">
+ <div class="page">
+ <p>This is a sample of an internal report.</p>
+ </div>
+ </t>
+ </t>
+ </template>
+ <template id="preview_externalreport">
+ <t t-set="company" t-value="env.company"/>
+ <t t-call="web.html_container">
+ <t t-set="o" t-value="res_company"/>
+ <t t-call="web.external_layout">
+ <div class="page">
+ <p>This is a sample of an external report.</p>
+ </div>
+ </t>
+ </t>
+ </template>
+
+ <template id="styles_company_report">
+ <t t-foreach="company_ids" t-as="company" t-translation="off">
+ <t t-set="font" t-value="company.font or 'Lato'" />
+ <t t-set="primary" t-value="company.primary_color or 'black'" />
+ <t t-set="secondary" t-value="company.secondary_color or 'black'" />
+ <t t-set="layout" t-value="company.external_report_layout_id.key or 'web.external_layout_standard'" />
+ .o_company_<t t-esc='company.id'/>_layout {
+ font-family: '<t t-esc="font" />';
+
+ <t t-if="layout == 'web.external_layout_background'">
+ .o_background_header {
+ h3 {
+ color: <t t-esc='primary'/>;
+ }
+ }
+ &amp;.o_background_footer {
+ ul {
+ li {
+ color: <t t-esc='secondary'/>;
+ }
+ }
+ }
+ &amp;.o_report_layout_background {
+ strong {
+ color: <t t-esc='secondary'/>;
+ }
+ h2 {
+ color: <t t-esc='primary'/>;
+ }
+ thead tr th {
+ color: <t t-esc='secondary'/>;
+ }
+ }
+ .row > div > table,
+ div#total table {
+ &amp;:first-child,
+ &amp;:last-child,
+ &amp;.o_subtotal,
+ &amp;.o_total {
+ strong {
+ color: <t t-esc='primary'/>;
+ }
+ }
+ }
+ </t>
+ <t t-elif="layout == 'web.external_layout_boxed'">
+ &amp;.o_report_layout_boxed {
+ #total strong {
+ color: <t t-esc='primary'/>;
+ }
+ #informations strong {
+ color: <t t-esc='secondary'/>;
+ }
+ h2 span {
+ color: <t t-esc='primary'/>;
+ }
+ table {
+ thead {
+ tr th {
+ color: <t t-esc='secondary'/>;
+ }
+ }
+ tbody tr td {
+ &amp;.o_line_section td {
+ background-color: rgba(<t t-esc='primary'/>, 0.7);
+ }
+ &amp;.is-subtotal,
+ td.o_price_total {
+ background-color: rgba(<t t-esc='secondary'/>, 0.1);
+ }
+ }
+ }
+ }
+ .row > div > table,
+ div#total table {
+ tr {
+ &amp;.o_total td {
+ background-color: rgba(<t t-esc='primary'/>, 0.9);
+ }
+ }
+ }
+ </t>
+ <t t-elif="layout == 'web.external_layout_clean'" >
+ &amp;.o_clean_footer {
+ border-top: 3px solid <t t-esc='secondary'/>;
+ h4 {
+ color: <t t-esc='secondary'/>;
+ }
+ .pagenumber {
+ border: 3px solid <t t-esc='primary'/>;
+ background-color: <t t-esc='secondary'/>;
+ }
+ }
+ &amp;.o_report_layout_clean {
+ h1, h2, h3 {
+ color: <t t-esc='primary'/>;
+ }
+ strong {
+ color: <t t-esc='secondary'/>;
+ }
+ table {
+ thead {
+ color: <t t-esc='secondary'/>;
+ tr th {
+ border-top: 3px solid <t t-esc='secondary'/> !important;
+ }
+ }
+ tbody {
+ tr:last-child td {
+ border-bottom: 3px solid <t t-esc='secondary'/>;
+ }
+ }
+ }
+ #total {
+ strong {
+ color: <t t-esc='secondary'/>;
+ }
+ }
+ }
+ </t>
+ <t t-elif="layout == 'web.external_layout_standard'">
+ &amp;.o_report_layout_standard {
+ h2 {
+ color: <t t-esc='primary'/>;
+ }
+ #informations strong {
+ color: <t t-esc='secondary'/>;
+ }
+ #total strong{
+ color: <t t-esc='primary'/>;
+ }
+ table {
+ thead {
+ color: <t t-esc='secondary'/>;
+ }
+ }
+ }
+ </t>
+ }
+ </t>
+ </template>
+
+ <record id="action_report_internalpreview" model="ir.actions.report">
+ <field name="name">Preview Internal Report</field>
+ <field name="model">res.company</field>
+ <field name="report_type">qweb-pdf</field>
+ <field name="report_name">web.preview_internalreport</field>
+ <field name="report_file">web.preview_internalreport</field>
+ <field name="binding_model_id" ref="model_res_company"/>
+ <field name="binding_type">report</field>
+ </record>
+ <record id="action_report_externalpreview" model="ir.actions.report">
+ <field name="name">Preview External Report</field>
+ <field name="model">res.company</field>
+ <field name="report_type">qweb-pdf</field>
+ <field name="report_name">web.preview_externalreport</field>
+ <field name="report_file">web.preview_externalreport</field>
+ <field name="binding_model_id" ref="model_res_company"/>
+ <field name="binding_type">report</field>
+ </record>
+</odoo>
diff --git a/addons/web/views/webclient_templates.xml b/addons/web/views/webclient_templates.xml
new file mode 100644
index 00000000..b0419b49
--- /dev/null
+++ b/addons/web/views/webclient_templates.xml
@@ -0,0 +1,903 @@
+<?xml version="1.0" encoding="utf-8"?>
+<odoo>
+ <template id="_assets_utils">
+ <link rel="stylesheet" type="text/scss" href="/web/static/lib/bootstrap/scss/_functions.scss"/>
+ <link rel="stylesheet" type="text/scss" href="/web/static/lib/bootstrap/scss/_mixins.scss"/>
+
+ <link rel="stylesheet" type="text/scss" href="/web/static/src/scss/bs_mixins_overrides.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"/>
+
+ <t t-raw="0"/>
+
+ <link rel="stylesheet" type="text/scss" href="/web/static/lib/bootstrap/scss/_variables.scss"/>
+ </template>
+
+ <template id="_assets_backend_helpers">
+ <link rel="stylesheet" type="text/scss" href="/web/static/src/scss/bootstrap_overridden.scss"/>
+ </template>
+
+ <template id="_assets_frontend_helpers">
+ <link rel="stylesheet" type="text/scss" href="/web/static/src/scss/bootstrap_overridden_frontend.scss"/>
+ </template>
+
+ <template id="_assets_bootstrap">
+ <link rel="stylesheet" type="text/scss" href="/web/static/src/scss/import_bootstrap.scss"/>
+ <link rel="stylesheet" type="text/scss" href="/web/static/src/scss/bootstrap_review.scss"/>
+ </template>
+
+ <!-- The assets common minimal code should not require any library to work. -->
+ <!-- An exception is made for the promises polyfill and extensions that the -->
+ <!-- boot.js script needs to work -->
+ <template id="_assets_common_minimal_js">
+ <script type="text/javascript" src="/web/static/lib/es6-promise/es6-promise-polyfill.js"></script>
+ <script type="text/javascript" src="/web/static/src/js/promise_extension.js"></script>
+ <script type="text/javascript" src="/web/static/src/js/boot.js"></script>
+ </template>
+
+ <template id="assets_common_minimal_js">
+ <t t-call="web._assets_common_minimal_js"/>
+ </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/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/lib/tempusdominus/tempusdominus.scss"/>
+
+ <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"/>
+ <link rel="stylesheet" type="text/scss" href="/web/static/src/scss/daterangepicker.scss"/>
+ <link rel="stylesheet" type="text/scss" href="/web/static/src/scss/banner.scss"/>
+ <link rel="stylesheet" type="text/scss" href="/web/static/src/scss/colorpicker.scss"/>
+ <link rel="stylesheet" type="text/scss" href="/web/static/src/scss/popover.scss"/>
+ <link rel="stylesheet" type="text/scss" href="/web/static/src/scss/translation_dialog.scss"/>
+ <link rel="stylesheet" type="text/scss" href="/web/static/src/scss/keyboard.scss"/>
+ <link rel="stylesheet" type="text/scss" href="/web/static/src/scss/name_and_signature.scss"/>
+ <link rel="stylesheet" type="text/scss" href="/web/static/src/scss/web.zoomodoo.scss"/>
+ <link rel="stylesheet" type="text/scss" href="/web/static/src/scss/color_picker.scss"/>
+
+ <link rel="stylesheet" type="text/less" href="/web/static/src/scss/fontawesome_overridden.scss"/>
+
+ <t t-call="web._assets_common_minimal_js"/>
+
+ <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/owl/owl.js"></script>
+ <script type="text/javascript" src="/web/static/src/js/component_extension.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 type="text/javascript" src="/web/static/lib/popper/popper.js"></script>
+
+ <script type="text/javascript" src="/web/static/lib/bootstrap/js/index.js"></script>
+ <script type="text/javascript" src="/web/static/lib/bootstrap/js/util.js"></script>
+ <script type="text/javascript" src="/web/static/lib/bootstrap/js/alert.js"></script>
+ <script type="text/javascript" src="/web/static/lib/bootstrap/js/button.js"></script>
+ <script type="text/javascript" src="/web/static/lib/bootstrap/js/carousel.js"></script>
+ <script type="text/javascript" src="/web/static/lib/bootstrap/js/collapse.js"></script>
+ <script type="text/javascript" src="/web/static/lib/bootstrap/js/dropdown.js"></script>
+ <script type="text/javascript" src="/web/static/lib/bootstrap/js/modal.js"></script>
+ <script type="text/javascript" src="/web/static/lib/bootstrap/js/tooltip.js"></script>
+ <script type="text/javascript" src="/web/static/lib/bootstrap/js/popover.js"></script>
+ <script type="text/javascript" src="/web/static/lib/bootstrap/js/scrollspy.js"></script>
+ <script type="text/javascript" src="/web/static/lib/bootstrap/js/tab.js"></script>
+ <script type="text/javascript" src="/web/static/lib/bootstrap/js/toast.js"></script>
+
+ <script type="text/javascript" src="/web/static/lib/tempusdominus/tempusdominus.js"/>
+ <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/jSignature/jSignatureCustom.js"></script>
+
+ <script type="text/javascript" src="/web/static/lib/qweb/qweb2.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/libs/download.js"></script>
+ <script type="text/javascript" src="/web/static/src/js/libs/content-disposition.js"></script>
+ <script type="text/javascript" src="/web/static/src/js/libs/underscore.js"></script>
+ <script type="text/javascript" src="/web/static/src/js/libs/popper.js"></script>
+ <script type="text/javascript" src="/web/static/src/js/libs/fullcalendar.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/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/ajax.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/core/bus.js"></script>
+ <script type="text/javascript" src="/web/static/src/js/core/custom_hooks.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/concurrency.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/owl_dialog.js"></script>
+ <script type="text/javascript" src="/web/static/src/js/core/popover.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/local_storage.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/patch_mixin.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/ram_storage.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/rpc.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/session.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/core/time.js"></script>
+ <script type="text/javascript" src="/web/static/src/js/core/translation.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/widget.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/services/config.js"></script>
+ <script type="text/javascript" src="/web/static/src/js/services/core.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/services/notification_service.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/session_storage_service.js"></script>
+
+ <script type="text/javascript" src="/web/static/src/js/tools/debug_manager.js"></script>
+
+ <script type="text/javascript" src="/web/static/src/js/common_env.js"></script>
+
+ <script type="text/javascript" src="/web/static/src/js/widgets/name_and_signature.js"></script>
+ <script type="text/javascript" src="/web/static/src/js/widgets/notification.js"></script>
+ <script type="text/javascript" src="/web/static/src/js/widgets/rainbow_man.js"></script>
+ <script type="text/javascript" src="/web/static/src/js/core/smooth_scroll_on_drag.js"></script>
+ <script type="text/javascript" src="/web/static/src/js/widgets/colorpicker.js"></script>
+ <script type="text/javascript" src="/web/static/src/js/widgets/translation_dialog.js"></script>
+ <script type="text/javascript" src="/web/static/src/js/libs/zoomodoo.js"></script>
+ </template>
+
+ <template id="assets_common_lazy" inherit_id="web.assets_common" primary="True">
+ <xpath expr="//t[@t-call='web._assets_common_minimal_js']" position="replace"/>
+ </template>
+
+ <template id="assets_backend" name="Backend Assets (used in backend interface)">
+ <t t-call="web._assets_helpers">
+ <t t-call="web._assets_backend_helpers"/>
+ </t>
+
+ <t t-call="web._assets_bootstrap"/>
+
+ <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/switch_company_menu.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/file_upload.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/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_panel.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="/base/static/src/scss/onboarding.scss"/>
+ <link rel="stylesheet" type="text/scss" href="/web/static/src/scss/attachment_preview.scss"/>
+ <link rel="stylesheet" type="text/scss" href="/web/static/src/scss/notification.scss"/>
+ <link rel="stylesheet" type="text/scss" href="/web/static/src/scss/base_document_layout.scss"/>
+ <link rel="stylesheet" type="text/scss" href="/web/static/src/scss/special_fields.scss"/>
+ <link rel="stylesheet" type="text/scss" href="/web/static/src/scss/ribbon.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/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>
+ <script type="text/javascript" src="/web/static/lib/py.js/lib/py_extras.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/mvc.js"></script>
+ <script type="text/javascript" src="/web/static/src/js/core/py_utils.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/action_mixin.js"/>
+ <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/data_comparison_utils.js"></script>
+ <script type="text/javascript" src="/web/static/src/js/core/math_utils.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_service.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/widgets/change_password.js"></script>
+ <script type="text/javascript" src="/web/static/src/js/tools/test_menus_loader.js"/>
+ <script type="text/javascript" src="/web/static/src/js/tools/debug_manager_backend.js"></script>
+ <script type="text/javascript" src="/web/static/src/js/tools/tools.js"></script>
+ <script type="text/javascript" src="/web/static/src/js/env.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/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/chrome/apps_menu.js"></script>
+
+ <script type="text/javascript" src="/web/static/src/js/widgets/pie_chart.js"></script>
+ <script type="text/javascript" src="/web/static/src/js/widgets/ribbon.js"></script>
+ <script type="text/javascript" src="/web/static/src/js/widgets/signature.js"></script>
+ <script type="text/javascript" src="/web/static/src/js/components/action_menus.js"></script>
+ <script type="text/javascript" src="/web/static/src/js/components/dropdown_menu.js"></script>
+ <script type="text/javascript" src="/web/static/src/js/components/dropdown_menu_item.js"></script>
+ <script type="text/javascript" src="/web/static/src/js/components/custom_checkbox.js"></script>
+ <script type="text/javascript" src="/web/static/src/js/components/custom_file_input.js"></script>
+ <script type="text/javascript" src="/web/static/src/js/components/datepicker.js"></script>
+ <script type="text/javascript" src="/web/static/src/js/components/pager.js"></script>
+ <script type="text/javascript" src="/web/static/src/js/apps.js"></script>
+
+ <script type="text/javascript" src="/web/static/src/js/_deprecated/basic_fields.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/fields/field_registry_owl.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/fields/field_wrapper.js"></script>
+ <script type="text/javascript" src="/web/static/src/js/fields/abstract_field_owl.js"></script>
+ <script type="text/javascript" src="/web/static/src/js/fields/basic_fields_owl.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_renderer_owl.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/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/renderer_wrapper.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/control_panel/comparison_menu.js"></script>
+ <script type="text/javascript" src="/web/static/src/js/control_panel/control_panel.js"></script>
+ <script type="text/javascript" src="/web/static/src/js/control_panel/control_panel_model_extension.js"></script>
+ <script type="text/javascript" src="/web/static/src/js/control_panel/control_panel_x2many.js"></script>
+ <script type="text/javascript" src="/web/static/src/js/control_panel/custom_favorite_item.js"></script>
+ <script type="text/javascript" src="/web/static/src/js/control_panel/favorite_menu.js"></script>
+ <script type="text/javascript" src="/web/static/src/js/control_panel/custom_filter_item.js"></script>
+ <script type="text/javascript" src="/web/static/src/js/control_panel/filter_menu.js"></script>
+ <script type="text/javascript" src="/web/static/src/js/control_panel/groupby_menu.js"></script>
+ <script type="text/javascript" src="/web/static/src/js/control_panel/custom_group_by_item.js"></script>
+ <script type="text/javascript" src="/web/static/src/js/control_panel/search_bar.js"></script>
+ <script type="text/javascript" src="/web/static/src/js/control_panel/search_utils.js"></script>
+ <script type="text/javascript" src="/web/static/src/js/views/search_panel_model_extension.js"></script>
+ <script type="text/javascript" src="/web/static/src/js/views/search_panel.js"></script>
+ <script type="text/javascript" src="/web/static/src/js/views/action_model.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/file_upload_mixin.js"></script>
+ <script type="text/javascript" src="/web/static/src/js/views/file_upload_progress_bar.js"></script>
+ <script type="text/javascript" src="/web/static/src/js/views/file_upload_progress_card.js"></script>
+ <script type="text/javascript" src="/web/static/src/js/views/sample_server.js"></script>
+ <script type="text/javascript" src="/web/static/src/js/views/select_create_controllers_registry.js"></script>
+ <script type="text/javascript" src="/web/static/src/js/views/signature_dialog.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/view_utils.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_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_model.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/list/list_confirm_dialog.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_popover.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/views/qweb/qweb_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/fields/signature.js"></script>
+
+ <script type="text/javascript" src="/web/static/src/js/owl_compatibility.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="_assets_frontend_minimal_js">
+ <script type="text/javascript" src="/web/static/src/js/public/lazyloader.js"/>
+ </template>
+
+ <template id="assets_frontend_minimal_js">
+ <t t-call="web._assets_frontend_minimal_js"/>
+ </template>
+
+ <template id="assets_frontend" name="Website Assets">
+ <t t-call="web._assets_helpers">
+ <t t-call="web._assets_frontend_helpers"/>
+ </t>
+
+ <t t-call="web._assets_bootstrap"/>
+ <link rel="stylesheet" type="text/scss" href="/web/static/src/scss/base_frontend.scss"/>
+ <link rel="stylesheet" type="text/scss" href="/web/static/src/scss/lazyloader.scss"/>
+ <link rel="stylesheet" type="text/scss" href="/web/static/src/scss/navbar_mobile.scss"/>
+ <link rel="stylesheet" type="text/scss" href="/web/static/src/scss/notification.scss"/>
+
+ <t t-call="web._assets_frontend_minimal_js"/>
+
+ <script type="text/javascript" src="/web/static/src/js/services/session.js"/>
+ <script type="text/javascript" src="/web/static/src/js/public/public_env.js"/>
+ <script type="text/javascript" src="/web/static/src/js/public/public_crash_manager.js"/>
+ <script type="text/javascript" src="/web/static/src/js/public/public_notification.js"/>
+ <script type="text/javascript" src="/web/static/src/js/public/public_root.js"/>
+ <script type="text/javascript" src="/web/static/src/js/public/public_root_instance.js"/>
+ <script type="text/javascript" src="/web/static/src/js/public/public_widget.js"/>
+ </template>
+
+ <template id="assets_frontend_lazy" inherit_id="web.assets_frontend" primary="True">
+ <xpath expr="//t[@t-call='web._assets_frontend_minimal_js']" position="replace"/>
+ </template>
+
+ <!-- Do not direcly call this template, call 'conditional_assets_tests' instead -->
+ <template id="assets_tests" name="Tests Assets">
+ <script type="text/javascript" src="/web/static/tests/helpers/test_utils_file.js"/>
+ </template>
+
+ <template id="conditional_assets_tests" name="Tests Assets Bundle">
+ <t t-call-assets="web.assets_tests" t-if="'tests' in debug or test_mode_enabled" defer_load="True" />
+ </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"/>
+
+ <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 id="web.layout.odooscript" type="text/javascript">
+ var odoo = {
+ csrf_token: "<t t-esc="request.csrf_token(None)"/>",
+ debug: "<t t-esc="debug"/>",
+ };
+ </script>
+
+ <t t-raw="head or ''"/>
+ </head>
+ <body t-att-class="body_classname">
+ <t t-raw="0"/>
+ </body>
+ </html>
+ </template>
+
+ <template id="web.frontend_layout" name="Frontend Layout" inherit_id="web.layout" primary="True">
+ <xpath expr="//head/meta[last()]" position="after">
+ <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no"/>
+ </xpath>
+ <xpath expr="//head/link[last()]" position="after">
+ <link rel="preload" href="/web/static/lib/fontawesome/fonts/fontawesome-webfont.woff2?v=4.7.0" as="font" crossorigin=""/>
+ <t t-call-assets="web.assets_common" t-js="false"/>
+ <t t-call-assets="web.assets_frontend" t-js="false"/>
+ </xpath>
+ <xpath expr="//head/script[@id='web.layout.odooscript'] | //head/script[last()]" position="after">
+ <script type="text/javascript">
+ odoo.session_info = <t t-raw="json.dumps(request.env['ir.http'].get_frontend_session_info())"/>;
+ if (!/(^|;\s)tz=/.test(document.cookie)) {
+ const userTZ = Intl.DateTimeFormat().resolvedOptions().timeZone;
+ document.cookie = `tz=${userTZ}; path=/`;
+ }
+ </script>
+ <t t-call-assets="web.assets_common_minimal_js" t-css="false" defer_load="True"/>
+ <t t-call-assets="web.assets_frontend_minimal_js" t-css="false" defer_load="True"/>
+ <t t-call="web.conditional_assets_tests"/>
+ <t t-call-assets="web.assets_common_lazy" t-css="false" lazy_load="True"/>
+ <t t-call-assets="web.assets_frontend_lazy" t-css="false" lazy_load="True"/>
+ </xpath>
+ <xpath expr="//t[@t-raw='0']" position="replace">
+ <div id="wrapwrap" t-attf-class="#{pageName or ''}">
+ <header t-if="not no_header" id="top" data-anchor="true">
+ <img class="img-responsive d-block mx-auto"
+ t-attf-src="/web/binary/company_logo"
+ alt="Logo"/>
+ </header>
+ <main>
+ <t t-raw="0"/>
+ </main>
+ <footer t-if="not no_footer" id="bottom" data-anchor="true" t-attf-class="bg-light o_footer">
+ <div id="footer"/>
+ <div t-if="not no_copyright" class="o_footer_copyright">
+ <div class="container py-3">
+ <div class="row">
+ <div class="col-sm text-center text-sm-left text-muted">
+ <t t-call="web.debug_icon"/>
+ <span class="o_footer_copyright_name mr-2">Copyright &amp;copy; <span t-field="res_company.name" itemprop="name">Company name</span></span>
+ </div>
+ <div class="col-sm text-center text-sm-right">
+ <t t-call="web.brand_promotion"/>
+ </div>
+ </div>
+ </div>
+ </div>
+ </footer>
+ </div>
+ </xpath>
+ </template>
+
+ <template id="brand_promotion_message" name="Brand Promotion Message">
+ <t t-set="odoo_logo">
+ <a target="_blank"
+ t-attf-href="http://www.odoo.com?utm_source=db&amp;utm_medium=#{_utm_medium}"
+ class="badge badge-light">
+ <img alt="Odoo"
+ src="/web/static/src/img/odoo_logo_tiny.png"
+ style="height: 1em; vertical-align: baseline;"/>
+ </a>
+ </t>
+ <t t-set="final_message">Powered by %s%s</t>
+ <t t-raw="final_message % (odoo_logo, _message and ('- %s' % _message) or '')"/>
+ </template>
+ <template id="brand_promotion" name="Brand Promotion">
+ <div class="o_brand_promotion">
+ <t t-call="web.brand_promotion_message">
+ <t t-set="_message"></t>
+ <t t-set="_utm_medium" t-valuef="portal"/>
+ </t>
+ </div>
+ </template>
+
+ <template id="web.login_layout" name="Login Layout">
+ <t t-call="web.frontend_layout">
+ <t t-set="html_data" t-value="{'style': 'height: 100%;'}"/>
+ <t t-set="body_classname" t-value="'bg-100'"/>
+ <t t-set="no_header" t-value="True"/>
+ <t t-set="no_footer" t-value="True"/>
+
+ <div class="container py-5">
+ <div t-attf-class="card border-0 mx-auto bg-100 {{login_card_classes}} o_database_list" style="max-width: 300px;">
+ <div class="card-body">
+ <div t-attf-class="text-center pb-3 border-bottom {{'mb-3' if form_small else 'mb-4'}}">
+ <img t-attf-src="/web/binary/company_logo{{ '?dbname='+db if db else '' }}" alt="Logo" style="max-height:120px; max-width: 100%; width:auto"/>
+ </div>
+ <t t-raw="0"/>
+ <div class="text-center small mt-4 pt-3 border-top" t-if="not disable_footer">
+ <t t-if="not disable_database_manager">
+ <a class="border-right pr-2 mr-1" href="/web/database/manager">Manage Databases</a>
+ </t>
+ <a href="https://www.odoo.com?utm_source=db&amp;utm_medium=auth" target="_blank">Powered by <span>Odoo</span></a>
+ </div>
+ </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" method="post" onsubmit="this.action = '/web/login' + 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="col-form-label">Database</label>
+ <div t-attf-class="input-group {{'input-group-sm' if form_small else ''}}">
+ <input type="text" name="db" t-att-value="request.db" id="db" t-attf-class="form-control #{'form-control-sm' if form_small else ''}" required="required" readonly="readonly"/>
+ <span class="input-group-append">
+ <a role="button" href="/web/database/selector" class="btn btn-secondary">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">Email</label>
+ <input type="text" placeholder="Email" name="login" t-att-value="login" id="login" t-attf-class="form-control #{'form-control-sm' if form_small else ''}" required="required" autofocus="autofocus" autocapitalize="off"/>
+ </div>
+
+ <div class="form-group field-password">
+ <label for="password">Password</label>
+ <input type="password" placeholder="Password" name="password" id="password" t-attf-class="form-control #{'form-control-sm' if form_small else ''}" 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>
+
+ <div t-attf-class="clearfix oe_login_buttons text-center mb-1 {{'pt-2' if form_small else 'pt-3'}}">
+ <button type="submit" class="btn btn-primary btn-block">Log in</button>
+ <t t-if="debug">
+ <button type="submit" name="redirect" value="/web/become" class="btn btn-link btn-sm btn-block">Log in as superuser</button>
+ </t>
+ <div class="o_login_auth"/>
+ </div>
+
+ <input type="hidden" name="redirect" t-att-value="redirect"/>
+ </form>
+ </t>
+ </template>
+
+ <template id="web.tests_assets">
+ <link type="text/css" rel="stylesheet" href="/web/static/lib/daterangepicker/daterangepicker.css"/>
+ <link type="text/css" rel="stylesheet" href="/web/static/lib/qunit/qunit-2.9.1.css"/>
+ <script type="text/javascript" src="/web/static/lib/qunit/qunit-2.9.1.js"></script>
+ <script type="text/javascript" src="/web/static/tests/helpers/qunit_config.js"></script>
+ <script type="text/javascript" src="/web/static/tests/helpers/qunit_asserts.js"></script>
+
+ <!-- add lazy-loaded libs to make tests synchronous -->
+ <link rel="stylesheet" href="/web/static/lib/fullcalendar/core/main.css"/>
+ <link rel="stylesheet" href="/web/static/lib/fullcalendar/daygrid/main.css"/>
+ <link rel="stylesheet" href="/web/static/lib/fullcalendar/timegrid/main.css"/>
+ <link rel="stylesheet" href="/web/static/lib/fullcalendar/list/main.css"/>
+ <script type="text/javascript" src="/web/static/lib/fullcalendar/core/main.js"></script>
+ <script type="text/javascript" src="/web/static/lib/fullcalendar/moment/main.js"></script>
+ <script type="text/javascript" src="/web/static/lib/fullcalendar/interaction/main.js"></script>
+ <script type="text/javascript" src="/web/static/lib/fullcalendar/daygrid/main.js"></script>
+ <script type="text/javascript" src="/web/static/lib/fullcalendar/timegrid/main.js"></script>
+ <script type="text/javascript" src="/web/static/lib/fullcalendar/list/main.js"></script>
+
+ <script type="text/javascript" src="/web/static/lib/ace/ace.js"></script>
+ <script type="text/javascript" src="/web/static/lib/ace/javascript_highlight_rules.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" src="/web/static/lib/ace/mode-js.js"></script>
+ <script type="text/javascript" src="/web/static/lib/Chart/Chart.js"></script>
+ <script type="text/javascript" src="/web/static/lib/nearest/jquery.nearest.js"/>
+ <script type="text/javascript" src="/web/static/lib/daterangepicker/daterangepicker.js"></script>
+ <script type="text/javascript" src="/web/static/src/js/libs/daterangepicker.js"></script>
+
+ <script type="text/javascript" src="/web/static/tests/main_tests.js"></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_create.js"></script>
+ <script type="text/javascript" src="/web/static/tests/helpers/test_utils_control_panel.js"></script>
+ <script type="text/javascript" src="/web/static/tests/helpers/test_utils_dom.js"></script>
+ <script type="text/javascript" src="/web/static/tests/helpers/test_utils_fields.js"></script>
+ <script type="text/javascript" src="/web/static/tests/helpers/test_utils_file.js"></script>
+ <script type="text/javascript" src="/web/static/tests/helpers/test_utils_form.js"></script>
+ <script type="text/javascript" src="/web/static/tests/helpers/test_utils_graph.js"></script>
+ <script type="text/javascript" src="/web/static/tests/helpers/test_utils_kanban.js"></script>
+ <script type="text/javascript" src="/web/static/tests/helpers/test_utils_mock.js"></script>
+ <script type="text/javascript" src="/web/static/tests/helpers/test_utils_modal.js"></script>
+ <script type="text/javascript" src="/web/static/tests/helpers/test_utils_pivot.js"></script>
+ <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/helpers/test_env.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-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"/>
+
+ <t t-call-assets="web.tests_assets" t-js="false"/>
+ <t t-call-assets="web.tests_assets" t-css="false"/>
+ <t t-call-assets="web.qunit_suite_tests" t-js="false"/>
+ <t t-call-assets="web.qunit_suite_tests" t-css="false"/>
+ </t>
+ <div id="qunit"/>
+ <div id="qunit-fixture"/>
+ </t>
+ </template>
+
+ <template id="web.qunit_suite_tests">
+ <script type="text/javascript" src="/base/static/tests/base_settings_tests.js"></script>
+
+ <script type="text/javascript" src="/web/static/tests/qweb_tests.js"></script>
+ <script type="text/javascript" src="/web/static/tests/mockserver_tests.js"></script>
+
+ <script type="text/javascript" src="/web/static/tests/services/crash_manager_tests.js"></script>
+ <script type="text/javascript" src="/web/static/tests/services/data_manager_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/relational_fields/field_many2many_tests.js"></script>
+ <script type="text/javascript" src="/web/static/tests/fields/relational_fields/field_many2one_tests.js"></script>
+ <script type="text/javascript" src="/web/static/tests/fields/relational_fields/field_one2many_tests.js"></script>
+ <script type="text/javascript" src="/web/static/tests/fields/signature_tests.js"></script>
+ <script type="text/javascript" src="/web/static/tests/fields/special_fields_tests.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/sample_server_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/qweb_tests.js"></script>
+ <script type="text/javascript" src="/web/static/tests/views/abstract_model_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/abstract_view_banner_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_panel_tests.js"></script>
+ <script type="text/javascript" src="/web/static/tests/core/ajax_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/py_utils_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/data_comparison_utils_tests.js"></script>
+ <script type="text/javascript" src="/web/static/tests/core/math_utils_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/patch_mixin_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/core/dialog_tests.js"></script>
+ <script type="text/javascript" src="/web/static/tests/core/owl_dialog_tests.js"></script>
+ <script type="text/javascript" src="/web/static/tests/core/popover_tests.js"></script>
+ <script type="text/javascript" src="/web/static/tests/core/dom_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/keyboard_navigation_mixin_tests.js"></script>
+ <script type="text/javascript" src="/web/static/tests/chrome/menu_tests.js"></script>
+ <script type="text/javascript" src="/web/static/tests/chrome/user_menu_tests.js"></script>
+ <script type="text/javascript" src="/web/static/tests/chrome/systray_tests.js"></script>
+
+ <script type="text/javascript" src="/web/static/tests/components/custom_checkbox_tests.js"></script>
+ <script type="text/javascript" src="/web/static/tests/components/custom_file_input_tests.js"></script>
+ <script type="text/javascript" src="/web/static/tests/components/datepicker_tests.js"></script>
+ <script type="text/javascript" src="/web/static/tests/components/pager_tests.js"></script>
+ <script type="text/javascript" src="/web/static/tests/components/action_menus_tests.js"></script>
+ <script type="text/javascript" src="/web/static/tests/components/dropdown_menu_tests.js"></script>
+
+ <script type="text/javascript" src="/web/static/tests/control_panel/control_panel_model_extension_tests.js"></script>
+ <script type="text/javascript" src="/web/static/tests/control_panel/control_panel_tests.js"></script>
+ <script type="text/javascript" src="/web/static/tests/control_panel/comparison_menu_tests.js"></script>
+ <script type="text/javascript" src="/web/static/tests/control_panel/favorite_menu_tests.js"></script>
+ <script type="text/javascript" src="/web/static/tests/control_panel/custom_filter_item_tests.js"></script>
+ <script type="text/javascript" src="/web/static/tests/control_panel/filter_menu_tests.js"></script>
+ <script type="text/javascript" src="/web/static/tests/control_panel/custom_group_by_item_tests.js"></script>
+ <script type="text/javascript" src="/web/static/tests/control_panel/groupby_menu_tests.js"></script>
+ <script type="text/javascript" src="/web/static/tests/control_panel/search_bar_tests.js"></script>
+ <script type="text/javascript" src="/web/static/tests/control_panel/search_utils_tests.js"></script>
+
+ <script type="text/javascript" src="/web/static/tests/widgets/company_switcher_tests.js"/>
+ <script type="text/javascript" src="/web/static/tests/widgets/data_export_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"/>
+
+ <script type="text/javascript" src="/web/static/tests/report/client_action_tests.js"/>
+
+ <script type="text/javascript" src="/web/static/tests/tools/debug_manager_tests.js"/>
+
+ <script type="text/javascript" src="/web/static/tests/helpers/test_utils_tests.js"></script>
+
+ <script type="text/javascript" src="/web/static/tests/owl_compatibility_tests.js"></script>
+ <script type="text/javascript" src="/web/static/tests/component_extension_tests.js"></script>
+ </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">
+ <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no"/>
+ <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"/>
+
+ <t t-call-assets="web.tests_assets" t-js="false"/>
+ <t t-call-assets="web.tests_assets" t-css="false"/>
+ <t t-call-assets="web.qunit_mobile_suite_tests" t-js="false"/>
+ <t t-call-assets="web.qunit_mobile_suite_tests" t-css="false"/>
+ </t>
+ <div id="qunit"/>
+ <div id="qunit-fixture"/>
+ </t>
+ </template>
+
+ <template id="web.qunit_mobile_suite_tests">
+ <script type="text/javascript" src="/web/static/lib/jquery.touchSwipe/jquery.touchSwipe.js"></script>
+ <script type="text/javascript" src="/web/static/tests/fields/basic_fields_mobile_tests.js"></script>
+ <script type="text/javascript" src="/web/static/tests/fields/relational_fields_mobile_tests.js"></script>
+ </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">
+ <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"/>
+ <t t-call-assets="web.tests_assets" t-js="false"/>
+ <t t-call-assets="web.tests_assets" t-css="false"/>
+
+ <script type="text/javascript">
+ QUnit.config.hidepassed = false;
+ </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/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.assets_backend_prod_only">
+ <script type="text/javascript" src="/web/static/src/js/main.js"></script>
+ </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="json.dumps(session_info)"/>;
+ odoo.reloadMenus = () => fetch(`/web/webclient/load_menus/${odoo.session_info.cache_hashes.load_menus}`).then(res => res.json());
+ odoo.loadMenusPromise = odoo.reloadMenus();
+ </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"/>
+ <t t-call-assets="web.assets_backend_prod_only" t-css="false"/>
+ <t t-call="web.conditional_assets_tests"/>
+ </t>
+ <t t-set="head" t-value="head_web + (head or '')"/>
+ <t t-set="body_classname" t-value="'o_web_client'"/>
+ </t>
+ </template>
+
+ <template id="debug_icon" name="Debug Icon">
+ <t t-if="debug">
+ <t t-set="debug_mode_help" t-value="' (%s)' % debug if debug != '1' else ''"/>
+ <a t-attf-href="?#{keep_query('*', debug='')}" t-attf-title="Debug mode is activated#{debug_mode_help}. Click here to exit debug mode."
+ class="o_debug_mode"><span class="fa fa-bug"/></a>
+ </t>
+ </template>
+
+ <!--
+ Optional Bundle for PDFJS lib
+ Since PDFJS is quite huge (80000≈ 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 5300≈ lines.
+ -->
+ <template id="pdf_js_lib" name="PDF JS Library">
+ <script type="text/javascript" src="/web/static/lib/pdfjs/build/pdf.js"></script>
+ <script type="text/javascript" src="/web/static/lib/pdfjs/build/pdf.worker.js"></script>
+ </template>
+</odoo>