Initial commit: Mail packages

This commit is contained in:
Ernad Husremovic 2025-08-29 15:20:51 +02:00
commit 4e53507711
1948 changed files with 751201 additions and 0 deletions

View file

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="iframe_css_assets_edit" groups="base.group_user">
<t t-call-assets="mass_mailing.assets_mail_themes" t-js="false"/>
<t t-call="mass_mailing.mass_mailing_mail_style"/>
<t t-call-assets="mass_mailing.assets_mail_themes_edition" t-js="false"/>
<!-- To view the body_arch field in readonly and have it display exactly
like in edit, load all the same css. TODO: move all this and the above
to a separate asset -->
<t t-call-assets="web.assets_frontend" t-js="false"/>
<t t-call-assets="web_editor.assets_wysiwyg" t-js="false"/>
</template>
<template id="iframe_css_assets_readonly" groups="base.group_user">
<link rel="stylesheet" type="text/scss" href="/mass_mailing/static/src/css/basic_theme_readonly.css"/>
<t t-call="mass_mailing.mass_mailing_mail_style"/>
</template>
</odoo>

View file

@ -0,0 +1,81 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- LINK.TRACKER VIEWS -->
<record id="link_tracker_view_search" model="ir.ui.view">
<field name="name">link.tracker.view.search.inherit.mass.mail</field>
<field name="model">link.tracker</field>
<field name="inherit_id" ref="link_tracker.link_tracker_view_search"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='title']" position="after">
<field name="mass_mailing_id"/>
</xpath>
<xpath expr="//group" position="inside">
<filter string="Mass Mailing" name="groupby_mass_mailing_id" context="{'group_by': 'mass_mailing_id'}"/>
</xpath>
</field>
</record>
<record id="link_tracker_view_form" model="ir.ui.view">
<field name="name">link.tracker.view.form.inherit.mass.mail</field>
<field name="model">link.tracker</field>
<field name="inherit_id" ref="link_tracker.link_tracker_view_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='campaign_id']" position="before">
<field name="mass_mailing_id"/>
</xpath>
</field>
</record>
<!-- LINK.TRACKER.CLICK VIEWS -->
<record id="link_tracker_click_view_search" model="ir.ui.view">
<field name="name">link.tracker.click.view.search.inherit.mass_mailing</field>
<field name="model">link.tracker.click</field>
<field name="inherit_id" ref="link_tracker.link_tracker_click_view_search"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='country_id']" position="after">
<field name="campaign_id"/>
<field name="mass_mailing_id"/>
</xpath>
<xpath expr="//filter[@name='groupby_country_id']" position="after">
<filter string="Mass Mailing" name="groupby_mass_mailing_id" context="{'group_by': 'mass_mailing_id'}"/>
</xpath>
</field>
</record>
<record id="link_tracker_click_view_form" model="ir.ui.view">
<field name="name">link.tracker.click.view.form.inherit.mass_mailing</field>
<field name="model">link.tracker.click</field>
<field name="inherit_id" ref="link_tracker.link_tracker_click_view_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='country_id']" position="after">
<field name="campaign_id"/>
<field name="mass_mailing_id"/>
<field name="mailing_trace_id"/>
</xpath>
</field>
</record>
<record id="link_tracker_click_view_tree" model="ir.ui.view">
<field name="name">link.tracker.click.view.tree.inherit.mass_mailing</field>
<field name="model">link.tracker.click</field>
<field name="inherit_id" ref="link_tracker.link_tracker_click_view_tree"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='link_id']" position="after">
<field name="campaign_id"/>
<field name="mass_mailing_id"/>
</xpath>
</field>
</record>
<record id="link_tracker_click_view_graph" model="ir.ui.view">
<field name="name">link.tracker.click.view.graph.inherit.mass_mailing</field>
<field name="model">link.tracker.click</field>
<field name="inherit_id" ref="link_tracker.link_tracker_click_view_graph"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='country_id']" position="after">
<field name="campaign_id"/>
<field name="mass_mailing_id"/>
</xpath>
</field>
</record>
</odoo>

View file

@ -0,0 +1,53 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record model="ir.ui.view" id="mailing_contact_subscription_view_form">
<field name="name">mailing.contact.subscription.view.form</field>
<field name="model">mailing.contact.subscription</field>
<field name="priority">10</field>
<field name="arch" type="xml">
<form string="Mailing List Subscription">
<sheet>
<group>
<field name="list_id"/>
<field name="is_blacklisted" invisible="1"/>
<label for="contact_id" class="oe_inline"/>
<div class="o_row o_row_readonly">
<i class="fa fa-ban text-danger" role="img" title="This email is blacklisted for mass mailings"
aria-label="Blacklisted" attrs="{'invisible': [('is_blacklisted', '=', False)]}" groups="base.group_user"></i>
<field name="contact_id"/>
</div>
<field name="unsubscription_date" readonly="1"/>
<field name="opt_out"/>
<field name="message_bounce" readonly="1"/>
</group>
</sheet>
</form>
</field>
</record>
<record model="ir.ui.view" id="mailing_contact_subscription_view_tree">
<field name="name">mailing.contact.subscription.view.tree</field>
<field name="model">mailing.contact.subscription</field>
<field name="arch" type="xml">
<tree string="Mailing List Subscriptions">
<field name="contact_id"/>
<field name="unsubscription_date"/>
<field name="opt_out"/>
<field name="message_bounce"/>
<field name="is_blacklisted"/>
</tree>
</field>
</record>
<record model="ir.ui.view" id="mailing_contact_subscription_view_search">
<field name="name">mailing.contact.subscription.view.search</field>
<field name="model">mailing.contact.subscription</field>
<field name="arch" type="xml">
<search string="Mailing List Subscriptions">
<field name="contact_id"/>
<field name="opt_out"/>
<field name="list_id"/>
</search>
</field>
</record>
</odoo>

View file

@ -0,0 +1,192 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="mailing_contact_view_search" model="ir.ui.view">
<field name="name">mailing.contact.view.search</field>
<field name="model">mailing.contact</field>
<field name="arch" type="xml">
<search string="Mailing List Contacts">
<field name="name"
filter_domain="['|', '|', ('name','ilike',self), ('company_name','ilike',self), ('email_normalized','ilike',self)]"
string="Name / Email"/>
<field name="tag_ids"/>
<field name="list_ids"/>
<separator/>
<filter string="Valid Email Recipients"
name="filter_valid_email_recipient"
domain="[('opt_out', '=', False), ('is_blacklisted', '=', False), ('email_normalized', '!=', False)]"
invisible="not context.get('default_list_ids')"/>
<separator/>
<filter name="filter_bounce" string="Bounced" domain="[('message_bounce', '>', 0)]"/>
<filter name="filter_blacklisted" string="Blacklisted" domain="[('is_blacklisted','=',True)]" invisible="1"/>
<filter name="filter_opt_out" string="Opted-out" domain="[('opt_out', '=', True)]" invisible="1"/>
<separator/>
<filter string="Exclude Blacklisted Emails"
name="filter_not_email_bl"
domain="[('is_blacklisted', '=', False)]"/>
<separator/>
<filter string="Exclude Opt Out"
name="filter_not_optout"
domain="[('opt_out', '=', False)]"
invisible="not context.get('default_list_ids')"/>
<group expand="0" string="Group By">
<filter string="Creation Date" name="group_create_date"
context="{'group_by': 'create_date'}"/>
</group>
</search>
</field>
</record>
<record id="mailing_contact_view_tree" model="ir.ui.view">
<field name="name">mailing.contact.view.tree</field>
<field name="model">mailing.contact</field>
<field name="priority">10</field>
<field name="arch" type="xml">
<tree string="Mailing List Contacts" sample="1" multi_edit="1" js_class="mailing_contact_list">
<header>
<button name="action_add_to_mailing_list" string="Add to List" type="object"/>
</header>
<field name="create_date" optional="show"/>
<field name="title_id" optional="hide"/>
<field name="name" readonly="1"/>
<field name="company_name"/>
<field name="email" readonly="1"/>
<field name="is_blacklisted" string="Email Blacklisted"/>
<field name="country_id" optional="hide"/>
<field name="message_bounce" sum="Total Bounces" readonly="1"/>
<field name="opt_out" invisible="'default_list_ids' not in context" readonly="1"/>
<field name="list_ids" widget="many2many_tags" optional="hide"/>
</tree>
</field>
</record>
<record id="mailing_contact_view_kanban" model="ir.ui.view">
<field name="name">mailing.contact.view.kanban</field>
<field name="model">mailing.contact</field>
<field name="arch" type="xml">
<kanban sample="1" js_class="mailing_contact_kanban">
<field name="name"/>
<field name="company_name"/>
<field name="email"/>
<field name="message_bounce"/>
<templates>
<t t-name="kanban-box">
<div t-attf-class="oe_kanban_global_click">
<div class="o_kanban_record_top">
<div class="o_kanban_record_headings">
<strong class="o_kanban_record_title">
<t t-esc="record.name.value"/>
</strong>
</div>
<span class="badge rounded-pill" title="Number of bounced email.">
<i class="fa fa-exclamation-triangle" role="img" aria-label="Warning" title="Warning"/> <t t-esc="record.message_bounce.value" title=""/>
</span>
</div>
<div class="o_kanban_record_body">
<field name="tag_ids"/>
</div>
<div class="o_kanban_record_bottom">
<div class="oe_kanban_bottom_left">
<strong>
<t t-esc="record.email.value"/>
</strong>
</div>
<div class="oe_kanban_bottom_right">
<t t-esc="record.company_name.value"/>
</div>
</div>
</div>
</t>
</templates>
</kanban>
</field>
</record>
<record id="mailing_contact_view_form" model="ir.ui.view">
<field name="name">mailing.contact.view.form</field>
<field name="model">mailing.contact</field>
<field name="priority">10</field>
<field name="arch" type="xml">
<form string="Mailing List Contacts">
<field name="id" invisible="1"/>
<sheet>
<div class="oe_title">
<label for="name" string="Contact Name"/>
<h1>
<field class="text-break" name="name" placeholder="e.g. John Smith"/>
</h1>
<div>
<field name="tag_ids" widget="many2many_tags" options="{'color_field': 'color'}" placeholder="Tags" style="width: 100%"/>
</div>
</div>
<group>
<group>
<label for="email" class="oe_inline"/>
<div class="o_row o_row_readonly" name="email_details">
<button name="mail_action_blacklist_remove" class="fa fa-ban text-danger"
title="This email is blacklisted for mass mailings. Click to unblacklist."
type="object" context="{'default_email': email}" groups="base.group_user"
attrs="{'invisible': [('is_blacklisted', '=', False)]}"/>
<field name="email" widget="email"/>
<field name="is_blacklisted" invisible="1"/>
</div>
<field name="title_id"/>
<field name="company_name"/>
<field name="country_id" options="{'no_open': True, 'no_create': True}"/>
</group>
<group>
<field name="create_date" attrs="{'invisible': [('id', '=', False)]}" readonly="1"/>
<field name="message_bounce" attrs="{'invisible': [('id', '=', False)]}" readonly="1"/>
</group>
</group>
<field name="subscription_list_ids">
<tree editable="bottom">
<field name="list_id"/>
<field name="unsubscription_date"/>
<field name="opt_out"/>
</tree>
</field>
</sheet>
<div class="oe_chatter">
<field name="message_follower_ids"/>
<field name="message_ids"/>
</div>
</form>
</field>
</record>
<record id="mailing_contact_view_pivot" model="ir.ui.view">
<field name="name">mailing.contact.pivot</field>
<field name="model">mailing.contact</field>
<field name="priority">10</field>
<field name="arch" type="xml">
<pivot string="Mailing List Contacts" stacked="1" sample="1">
<field name="create_date" type="row"/>
</pivot>
</field>
</record>
<record id="mailing_contact_view_graph" model="ir.ui.view">
<field name="name">mailing.contact.view.graph</field>
<field name="model">mailing.contact</field>
<field name="priority">10</field>
<field name="arch" type="xml">
<graph string="Mailing List Contacts" sample="1">
<field name="create_date"/>
</graph>
</field>
</record>
<record model="ir.actions.act_window" id="action_view_mass_mailing_contacts">
<field name="name">Mailing List Contacts</field>
<field name="res_model">mailing.contact</field>
<field name="view_mode">tree,kanban,form,graph,pivot</field>
<field name="context">{'search_default_filter_not_email_bl': 1}</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Create a mailing contact
</p><p>
Mailing contacts allow you to separate your marketing audience from your business contact directory.
</p>
</field>
</record>
</odoo>

View file

@ -0,0 +1,78 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="mailing_filter_view_search" model="ir.ui.view">
<field name="name">mailing.filter.view.search</field>
<field name="model">mailing.filter</field>
<field name="arch" type="xml">
<search string="Mailing Filters">
<field name="name"/>
<field name="mailing_model_id"/>
<filter string="My Filters"
name="filter_saved_by_me"
domain="[('create_uid', '=', uid)]"
help="Filters saved by me"/>
<group string="Group By">
<filter name="groupby_recepient_model"
context="{'group_by' : 'mailing_model_id'}"
string="Recipients"/>
</group>
</search>
</field>
</record>
<record id="mailing_filter_view_tree" model="ir.ui.view">
<field name="name">mailing.filter.view.tree</field>
<field name="model">mailing.filter</field>
<field name="arch" type="xml">
<tree string="Mailing filters" sample="1">
<field name="name"/>
<field name="create_uid" string="Saved by" widget="many2one_avatar_user"/>
<field name="mailing_model_id" string="Recipients"/>
<field name="mailing_domain" string="Domain" optional="hide"/>
</tree>
</field>
</record>
<record id="mailing_filter_view_form" model="ir.ui.view">
<field name="name">mailing.filter.view.form</field>
<field name="model">mailing.filter</field>
<field name="arch" type="xml">
<form string="Mailing filters">
<sheet>
<group>
<group>
<field name="name"/>
<field name="mailing_model_id" options="{'no_create': True, 'no_open': True}"/>
</group>
<group>
<field name="create_uid" widget="many2one_avatar_user"/>
</group>
</group>
<group>
<field name="mailing_model_name" invisible="1"/>
<field name="mailing_domain" string="Domain" widget="domain"
options="{'model': 'mailing_model_name'}"
attrs="{'invisible': [('mailing_model_id', '=', False)]}"/>
</group>
</sheet>
</form>
</field>
</record>
<record id="mailing_filter_action" model="ir.actions.act_window">
<field name="name">Favorite Filters</field>
<field name="res_model">mailing.filter</field>
<field name="view_mode">tree,form</field>
<field name="context">{'search_default_filter_saved_by_me': 1}
</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
No saved filter yet!
</p><p>
While designing the mailing, you can define the rules to filter recipients.
To save the same criteria for future use, you can add it to the favorite list
by clicking on <i class="fa fa-star-o text-warning"></i> icon next to "Recipients".
</p>
</field>
</record>
</odoo>

View file

@ -0,0 +1,291 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- MAILING LIST -->
<record model="ir.ui.view" id="mailing_list_view_search">
<field name="name">mailing.list.view.search</field>
<field name="model">mailing.list</field>
<field name="arch" type="xml">
<search string="Mailing Lists">
<field name="name"/>
<field name="create_date"/>
<filter name="inactive" string="Archived" domain="[('active','=',False)]"/>
<group expand="0" string="Group By">
<filter string="Creation Period" name="group_create_date"
context="{'group_by': 'create_date'}"/>
</group>
</search>
</field>
</record>
<record model="ir.ui.view" id="mailing_list_view_tree">
<field name="name">mailing.list.view.tree</field>
<field name="model">mailing.list</field>
<field name="priority">10</field>
<field name="arch" type="xml">
<tree string="Mailing Lists" sample="1">
<field name="name"/>
<field name="is_public"/>
<field name="mailing_count" string="Mailings"/>
<field name="contact_pct_bounce" string="Bounce (%)"/>
<field name="contact_pct_opt_out" string="Opt-out (%)"/>
<field name="contact_pct_blacklisted" string="Blacklist (%s)"/>
<field name="contact_count" string="Recipients"/>
</tree>
</field>
</record>
<record model="ir.ui.view" id="mailing_list_view_form">
<field name="name">mailing.list.form</field>
<field name="model">mailing.list</field>
<field name="arch" type="xml">
<form string="Contact List">
<sheet>
<div class="oe_button_box" name="button_box">
<button name="action_view_contacts"
type="object" icon="fa-user" class="oe_stat_button">
<field name="contact_count" string="Recipients" widget="statinfo"/>
</button>
<button name="action_view_mailings"
type="object" icon="fa-envelope-o" class="oe_stat_button">
<field name="mailing_count" string="Mailings" widget="statinfo"/>
</button>
<button name="action_view_contacts_bouncing"
type="object" icon="fa-exchange" class="oe_stat_button">
<div class="o_field_widget o_stat_info">
<div class="oe_inline">
<span class="o_stat_value">
<field name="contact_pct_bounce" widget="statinfo" nolabel="1"/>
</span>
<span class="o_stat_value">%</span>
</div>
<span class="o_stat_text">Bounce</span>
</div>
</button>
<button name="action_view_contacts_opt_out"
type="object" icon="fa-bell-slash-o" class="oe_stat_button">
<div class="o_field_widget o_stat_info">
<div class="oe_inline">
<span class="o_stat_value">
<field name="contact_pct_opt_out" widget="statinfo" nolabel="1"/>
</span>
<span class="o_stat_value">%</span>
</div>
<span class="o_stat_text">Opt-out</span>
</div>
</button>
<button name="action_view_contacts_blacklisted"
type="object" icon="fa-ban" class="oe_stat_button">
<div class="o_field_widget o_stat_info">
<div class="oe_inline">
<span class="o_stat_value">
<field name="contact_pct_blacklisted" widget="statinfo" nolabel="1"/>
</span>
<span class="o_stat_value">%</span>
</div>
<span class="o_stat_text">Blacklist</span>
</div>
</button>
</div>
<widget name="web_ribbon" title="Archived" bg_color="bg-danger" attrs="{'invisible': [('active', '=', True)]}"/>
<div class="oe_title">
<label for="name"/>
<h1>
<field name="name" class="text-break" placeholder="e.g. Consumer Newsletter"/>
</h1>
</div>
<group>
<field name="active" invisible="1"/>
<field name="is_public"/>
</group>
</sheet>
</form>
</field>
</record>
<record id="mailing_list_view_form_simplified" model="ir.ui.view">
<field name="name">mailing.list.form.simplified</field>
<field name="model">mailing.list</field>
<field name="priority" eval="25"/>
<field name="arch" type="xml">
<form string="Contact List">
<div class="oe_title">
<label for="name"/>
<h1>
<field name="name" placeholder="e.g. Consumer Newsletter"/>
</h1>
</div>
<group>
<field name="is_public"/>
</group>
</form>
</field>
</record>
<record id="mailing_list_view_kanban" model="ir.ui.view">
<field name="name">mailing.list.view.kanban</field>
<field name="model">mailing.list</field>
<field name="arch" type="xml">
<kanban class="o_kanban_mobile o_kanban_mailing_list" sample="1">
<field name="name"/>
<field name="contact_count"/>
<field name="contact_count_email"/>
<field name="contact_count_opt_out"/>
<field name="contact_count_blacklisted"/>
<field name="contact_pct_bounce"/>
<field name="contact_pct_opt_out"/>
<field name="contact_pct_blacklisted"/>
<field name="active"/>
<templates>
<t t-name="kanban-box">
<!-- Card when the Kanban view is grouped -->
<div class="oe_kanban_global_click o_mailing_list_kanban_grouped">
<div class="oe_kanban_content d-flex flex-column h-100">
<h2 class="mb-3 o_text_overflow">
<field name="name"/>
</h2>
<div class="d-flex align-items-center">
<div class="me-3">
<button class="btn btn-primary" name="action_view_contacts" type="object">
<t t-esc="record.contact_count.value"/> <span>Contacts</span>
</button>
</div>
<div class="flex-grow-1 d-flex flex-column align-items-end o_mass_mailing_kanban_contact_links">
<a name="action_view_contacts_email" type="object">
<span>Valid Email Recipients</span>
<span t-esc="record.contact_count_email.value" class="ms-3"/>
</a>
</div>
</div>
<div class="flex-grow-1 d-flex align-items-end mt-4">
<div class="col-12">
<div class="row mt3">
<div class="col-3 border-end">
<a name="action_view_mailings" type="object" class="d-flex flex-column align-items-center">
<span><field name="mailing_count"/></span>
<span class="text-muted">Mailings</span>
</a>
</div>
<div class="col-3 border-end">
<a name="action_view_contacts_bouncing" type="object" class="d-flex flex-column align-items-center">
<span><field name="contact_pct_bounce"/>%</span>
<span class="text-muted">Bounce</span>
</a>
</div>
<div class="col-3 border-end">
<a name="action_view_contacts_opt_out" type="object" class="d-flex flex-column align-items-center">
<span><field name="contact_pct_opt_out"/>%</span>
<span class="text-muted">Opt-out</span>
</a>
</div>
<div class="col-3">
<a name="action_view_contacts_blacklisted" type="object" class="d-flex flex-column align-items-center">
<span><field name="contact_pct_blacklisted"/>%</span>
<span class="text-muted">Blacklist</span>
</a>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Card when the Kanban view is not grouped -->
<div class="oe_kanban_global_click o_mailing_list_kanban_ungrouped d-flex flex-row justify-content-between align-items-center flex-wrap">
<div class="col-lg-3 col-sm-6 col-12 py-0 my-auto">
<div class="d-flex text-large">
<span class="d-inline-block text-truncate fw-normal text-large"
t-att-title="record.name.value">
<field name="name"/>
</span>
</div>
</div>
<div class="o_mailing_list_kanban_counts col-lg-1 col-12 my-auto d-flex">
<div class="d-flex flex-row justify-content-start justify-content-md-end">
<div class="my-auto p-0">
<button name="action_view_contacts" type="object"
class="o_mailing_list_kanban_button o_mailing_list_kanban_big_nb text-primary fw-bold">
<field name="contact_count"/>
</button>
</div>
<div class="my-auto px-0">
<button name="action_view_contacts" type="object"
class="o_mailing_list_kanban_button text-large text-start ms-2">
Total <br/>Contacts
</button>
</div>
</div>
</div>
<div class="o_mailing_list_kanban_stats col-lg-5 col-sm-12 col-12 py-0 my-3 my-sm-auto d-flex justify-content-sm-between justify-content-start flex-wrap">
<a class="me-sm-0 me-3 text-large" tabindex="-1"
name="action_view_contacts_email" type="object">
<span class="fw-normal">
<field name="contact_count_email"/>
</span>
<br/>
<span class="text-secondary">
<i class="fa fa-envelope-o"/> Contacts
</span>
</a>
<a class="me-sm-0 me-3 text-large" tabindex="-1"
name="action_view_mailings" type="object">
<span class="fw-normal">
<field name="mailing_count"/>
</span>
<br/>
<span class="text-secondary">Mailings</span>
</a>
<hr class="w-100 d-block d-sm-none opacity-0 m-0 p-0"/>
<a class="me-sm-0 me-3 text-large" tabindex="-1"
name="action_view_contacts_bouncing" type="object">
<span class="fw-normal">
<field name="contact_pct_bounce"/> %
</span>
<br/>
<span class="text-secondary">Bounce</span>
</a>
<a class="me-sm-0 me-3 text-large" tabindex="-1"
name="action_view_contacts_opt_out" type="object">
<span class="fw-normal">
<field name="contact_pct_opt_out"/> %
</span>
<br/>
<span class="text-secondary">Opt-Out</span>
</a>
<a class="me-sm-0 me-3 text-large" tabindex="-1"
name="action_view_contacts_blacklisted" type="object">
<span class="fw-normal">
<field name="contact_pct_blacklisted"/> %
</span>
<br/>
<span class="text-secondary">Blacklist</span>
</a>
</div>
<div class="o_kanban_ungrouped_action_buttons col-12 col-lg-2 py-0 pe-2 ps-md-2 my-md-auto my-2 d-none d-md-flex flex-wrap justify-content-lg-end">
<button name="action_open_import" string="Import Contacts"
type="object" class="btn btn-secondary border me-2 text-nowrap">
Import Contacts
</button>
<button name="action_send_mailing" string="Send Mailing"
type="object" class="btn btn-secondary border me-2 text-nowrap">
Send Mailing
</button>
</div>
</div>
</t>
</templates>
</kanban>
</field>
</record>
<record model="ir.actions.act_window" id="action_view_mass_mailing_lists">
<field name="name">Mailing Lists</field>
<field name="res_model">mailing.list</field>
<field name="view_mode">kanban,tree,form</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Create a Mailing List
</p><p>
No need to import mailing lists, you can send mailings to contacts saved in other Odoo apps.
</p>
</field>
</record>
</odoo>

View file

@ -0,0 +1,710 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- MAILING !-->
<record model="ir.ui.view" id="view_mail_mass_mailing_search">
<field name="name">mailing.mailing.search</field>
<field name="model">mailing.mailing</field>
<field name="arch" type="xml">
<search string="Mailings">
<field name="name" string="Mailing" filter_domain="['|', ('name', 'ilike', self), ('subject', 'ilike', self)]"/>
<field name="campaign_id" string="Campaign" groups="mass_mailing.group_mass_mailing_campaign"/>
<filter string="My Mailings" name="assigned_to_me"
domain="[('user_id', '=', uid)]"
help="Mailings that are assigned to me"/>
<separator/>
<filter name="filter_sent_date" date="sent_date"/>
<separator/>
<filter string="A/B Tests" name="filter_ab_test" domain="[('ab_testing_enabled', '=', True)]"/>
<filter string="A/B Tests to review" name="filter_ab_test_to_review"
domain="[('ab_testing_enabled', '=', True), ('ab_testing_winner_selection', '=', 'manual'), ('ab_testing_completed', '=', False)]"/>
<separator/>
<filter name="inactive" string="Archived" domain="[('active', '=', False)]"/>
<group expand="0" string="Group By">
<filter string="Status" name="group_state" context="{'group_by': 'state'}"/>
<filter string="Sent By" name="sent_by" domain="[]" context="{'group_by': 'email_from'}"/>
<separator/>
<filter string="Sent Period" name="sent_date" domain="[]" context="{'group_by': 'sent_date'}"/>
</group>
</search>
</field>
</record>
<record model="ir.ui.view" id="view_mail_mass_mailing_tree">
<field name="name">mailing.mailing.tree</field>
<field name="model">mailing.mailing</field>
<field name="priority">10</field>
<field name="arch" type="xml">
<tree string="Mailings" sample="1" class="o_mass_mailing_mailing_tree">
<field name="calendar_date" string="Date" widget="datetime"/>
<field name="subject" attrs="{'readonly': [('state', 'in', ('sending', 'done'))]}"/>
<field name="mailing_model_id" string="Recipients" optional="hide"/>
<field name="user_id" widget="many2one_avatar_user"/>
<field name="ab_testing_enabled" string="A/B Test" groups="mass_mailing.group_mass_mailing_campaign"/>
<field name="campaign_id" string="Campaign" groups="mass_mailing.group_mass_mailing_campaign" optional="hide"/>
<field name="sent" sum="Total" />
<field name="received_ratio" class="d-flex align-items-center ps-0 ps-lg-5" widget="progressbar" string="Delivered (%)" avg="Average"/>
<field name="opened_ratio" class="d-flex align-items-center ps-0 ps-lg-5" widget="progressbar" string="Opened (%)" avg="Average"/>
<field name="bounced_ratio" string="Bounced (%)" optional="hide" avg="Average"/>
<field name="clicks_ratio" string="Clicked (%)" avg="Average"/>
<field name="replied_ratio" string="Replied (%)" avg="Average"/>
<field name="state" decoration-info="state in ['draft', 'in_queue']" decoration-success="state == 'sending' or state == 'done'" widget="badge"/>
</tree>
</field>
</record>
<!-- Main form view for inheriting from -->
<record model="ir.ui.view" id="view_mail_mass_mailing_form">
<field name="name">mailing.mailing.form</field>
<field name="model">mailing.mailing</field>
<field name="arch" type="xml">
<form string="Mailing" class="o_mass_mailing_mailing_form">
<header style="min-height:31px;">
<button name="action_launch" type="object" class="oe_highlight" string="Send"
attrs="{'invisible': [('state', 'in', ('in_queue', 'sending', 'done'))]}" data-hotkey="v"
confirm="This will send the email to all recipients. Do you still want to proceed ?"/>
<button name="action_schedule" type="object" class="btn-secondary" string="Schedule"
attrs="{'invisible': [('state', 'in', ('in_queue', 'sending', 'done'))]}" data-hotkey="x"/>
<button name="action_duplicate" type="object" class="btn-secondary" string="Duplicate"
data-hotkey="d" attrs="{'invisible': [('state', '!=', 'done')]}"/>
<button name="action_test" type="object" class="btn-secondary" string="Test" data-hotkey="k"/>
<button name="action_cancel" type="object" attrs="{'invisible': [('state', '!=', 'in_queue')]}" class="btn-secondary" string="Cancel" data-hotkey="z"/>
<button name="action_retry_failed" type="object" attrs="{'invisible': ['|', ('state', '!=', 'done'), ('failed', '=', 0)]}" class="oe_highlight" string="Retry" data-hotkey="y"/>
<field name="state" readonly="1" widget="statusbar"/>
</header>
<div class="alert alert-info text-center" role="alert"
attrs="{'invisible': ['&amp;','&amp;','&amp;','&amp;','&amp;',('state', '!=', 'in_queue'),('sent', '=', 0),('canceled', '=', 0),('scheduled', '=', 0),('failed', '=', 0),('warning_message', '=', False)]}">
<div class="o_mails_canceled" attrs="{'invisible': [('canceled', '=', 0)]}">
<button class="btn-link py-0"
name="action_view_traces_canceled"
type="object">
<strong>
<field name="canceled" class="oe_inline me-2"/>
<span name="canceled_text">emails have been canceled and will not be sent.</span>
</strong>
</button>
</div>
<div class="o_mails_scheduled" attrs="{'invisible': [('scheduled', '=', 0)]}">
<button class="btn-link py-0"
name="action_view_traces_scheduled"
type="object">
<strong>
<field name="scheduled" class="oe_inline me-2"/>
<span name="scheduled_text">emails are in queue and will be sent soon.</span>
</strong>
</button>
</div>
<div class="o_mails_sent" attrs="{'invisible': ['&amp;', ('sent', '=', 0), ('state', 'in', ('draft', 'test', 'in_queue'))]}">
<button class="btn-link py-0"
name="action_view_traces_sent"
type="object">
<strong>
<field name="sent" class="oe_inline me-2"/>
<span name="sent">emails have been sent.</span>
</strong>
</button>
</div>
<div class="o_mails_failed" attrs="{'invisible': ['|', ('state', '!=', 'done'), ('failed', '=', 0)]}">
<button class="btn-link py-0"
name="action_view_traces_failed"
type="object">
<strong>
<field name="failed" class="oe_inline me-2"/>
<span name="failed_text">emails could not be sent.</span>
</strong>
</button>
</div>
<div class="o_mails_in_queue" attrs="{'invisible': [('state', '!=', 'in_queue')]}">
<strong>
<span name="next_departure_text">This mailing is scheduled for </span>
<field name="next_departure" class="oe_inline"/>.
</strong>
</div>
<div attrs="{'invisible': [('warning_message', '=', False)]}">
<strong><field name="warning_message"/></strong>
</div>
</div>
<sheet>
<div class="oe_button_box" name="button_box">
<button name="action_view_delivered"
id="button_view_delivered"
type="object"
context="{'search_default_filter_delivered': True}"
attrs="{'invisible': [('state', 'in', ('draft','test'))]}"
class="oe_stat_button">
<field name="received_ratio" string="Received" widget="percentpie"/>
</button>
<button name="action_view_opened"
type="object"
context="{'search_default_filter_opened': True}"
attrs="{'invisible': [('state', 'in', ('draft','test'))]}"
class="oe_stat_button">
<field name="opened_ratio" string="Opened" widget="percentpie"/>
</button>
<button name="action_view_clicked"
type="object"
context="{'search_default_filter_clicked': True}"
attrs="{'invisible': [('state', 'in', ('draft','test'))]}"
class="oe_stat_button">
<field name="clicks_ratio" string="Clicked" widget="percentpie"/>
</button>
<button name="action_view_replied"
type="object"
context="{'search_default_filter_replied': True}"
attrs="{'invisible': [('state', 'in', ('draft','test'))]}"
class="oe_stat_button">
<field name="replied_ratio" string="Replied" widget="percentpie"/>
</button>
<button name="action_view_bounced"
type="object"
context="{'search_default_filter_bounced': True}"
attrs="{'invisible': [('state', 'in', ('draft','test'))]}"
class="oe_stat_button">
<field name="bounced_ratio" string="Bounced" widget="percentpie"/>
</button>
</div>
<widget name="web_ribbon" title="Archived" bg_color="bg-danger" attrs="{'invisible': [('active', '=', True)]}"/>
<group class="o_mass_mailing_mailing_group">
<field name="active" invisible="1"/>
<field name="create_uid" invisible="1"/>
<field name="mailing_type" widget="radio" options="{'horizontal': true}" invisible="1"
attrs="{'readonly': [('state', '!=', 'draft')]}" force_save="1"/>
<label for="subject">Subject</label>
<div class="o_mass_mailing_subject d-flex flex-row align-items-baseline">
<field class="text-break" name="subject" string="Subject"
options="{'dynamic_placeholder': true}"
attrs="{'readonly': [('state', 'in', ('sending', 'done'))]}"
widget="char_emojis" placeholder="e.g. New Sale on all T-shirts"/>
<field name="favorite" invisible="1"/>
<button type="object" name="action_set_favorite"
class="o_mass_mailing_favorite p-0"
icon="fa-star-o"
attrs="{'invisible': [('favorite', '=', True)]}"
title="Add to Templates"/>
<button type="object" name="action_remove_favorite"
class="o_mass_mailing_favorite p-0"
icon="fa-star"
attrs="{'invisible': [('favorite', '=', False)]}"
title="Remove from Templates"/>
</div>
<label for="mailing_model_id" string="Recipients"/>
<div name="mailing_model_id_container">
<div class="d-flex align-items-baseline flex-wrap">
<div class="me-5">
<field name="mailing_model_id" options="{'no_open': True, 'no_create': True}"
attrs="{'readonly': [('state', 'in', ('sending', 'done'))]}"/>
</div>
<div attrs="{'invisible': [('mailing_model_name', '!=', 'mailing.list')]}" class="o_mass_mailing_contact_list_ids pt-1 pt-sm-0">
<label for="contact_list_ids" string="Select mailing lists:" class="oe_edit_only pe-2"/>
<div class="d-inline-flex flex-row align-items-center">
<field name="contact_list_ids" widget="many2many_tags"
placeholder="Select mailing lists..." class="oe_inline mb-0"
context="{'form_view_ref': 'mass_mailing.mailing_list_view_form_simplified'}"
attrs="{
'required':[('mailing_model_name','=','mailing.list')],
'readonly': [('state', 'in', ('sending', 'done'))]
}"/>
<button icon="fa-user-plus" type="object" class="btn btn-secondary py-0 px-1 ms-1"
attrs="{'invisible': ['|', '|', ('contact_list_ids', '=', False), ('contact_list_ids', '=', []), ('state', 'in', ('sending', 'done'))]}"
name="action_view_mailing_contacts" title="Add Mailing Contacts"/>
</div>
</div>
<div attrs="{'invisible': [('mailing_model_name', '=', 'mailing.list')]}" class="o_td_label">
<!-- We don't want to display label in edit mode, unless mailing is in sending or done state (where filter will be readonly) -->
<label for="mailing_filter_id" string="Filter" class="oe_read_only me-4"
attrs="{'invisible': ['|', ('state', 'in', ('sending', 'done')), ('mailing_filter_id', '=', False)]}"/>
<label for="mailing_filter_id" string="Filter" class="me-4"
attrs="{'invisible': ['|', ('state', 'not in', ('sending', 'done')), ('mailing_filter_id', '=', False)]}"/>
<field name="mailing_filter_id" placeholder="Reload a favorite filter"
class="w-auto" widget="mailing_filter"
options="{'no_create': 1, 'no_open': 1, 'domain_field': 'mailing_domain', 'model_field': 'mailing_model_id'}"
attrs="{'readonly': [('state', 'in', ('sending', 'done'))]}"/>
</div>
<field name="mailing_filter_count" invisible="1"/>
<field name="mailing_filter_domain" invisible="1"/>
</div>
<field name="mailing_model_name" invisible="1"/>
<field name="mailing_model_real" invisible="1"/>
<div class="w-lg-50" attrs="{'invisible': [('mailing_model_name', '=', 'mailing.list')]}">
<field name="mailing_domain" widget="domain" options="{'model': 'mailing_model_real'}"
attrs="{'readonly': [('state', 'in', ('sending', 'done'))]}"/>
</div>
</div>
</group>
<notebook>
<page string="Mail Body" name="mail_body">
<div class="position-relative">
<div class="mt-n2">
<field name="body_arch" class="o_mail_body" widget="mass_mailing_html"
iframeHtmlClass="o_mass_mailing_iframe"
options="{
'snippets': 'mass_mailing.email_designer_snippets',
'cssEdit': 'mass_mailing.iframe_css_assets_edit',
'inline-field': 'body_html',
'dynamic_placeholder': true,
'cssReadonly': 'mass_mailing.iframe_css_assets_edit'
}" attrs="{'readonly': [('state', 'in', ('sending', 'done'))]}"/>
</div>
<field name="is_body_empty" invisible="1"/>
<div class="o_view_nocontent oe_read_only" attrs="{'invisible': ['|', ('is_body_empty', '=', False), ('state', 'in', ('sending', 'done'))]}">
<div class="o_nocontent_help">
<p class="o_view_nocontent_smiling_face">
This mailing has no selected design (yet!).
</p>
</div>
</div>
</div>
</page>
<page string="A/B Tests" name="ab_testing">
<group>
<group>
<label for="ab_testing_enabled"/>
<span class="d-flex">
<field name="ab_testing_enabled" attrs="{'readonly': [('state', '!=', 'draft')]}" force_save="1"/>
<span class="d-flex" attrs="{'invisible': [('ab_testing_enabled', '=', False)]}">
on <field name="ab_testing_pc" class="mx-1 text-center"
attrs="{'readonly': [('state', '!=', 'draft')]}"/> %
</span>
</span>
<field name="ab_testing_winner_selection"
attrs="{'required': [('ab_testing_enabled', '=', True), ('mailing_type', '=', 'mail')], 'invisible': ['|', ('ab_testing_enabled', '=', False), ('mailing_type', '!=', 'mail')], 'readonly': [('state', '!=', 'draft')]}"/>
<field name="ab_testing_schedule_datetime"
attrs="{'required': [('ab_testing_enabled', '=', True), ('ab_testing_winner_selection', '!=', 'manual')], 'readonly': ['|', ('ab_testing_enabled', '=', False), ('state', '!=', 'draft')], 'invisible': ['|', ('ab_testing_enabled', '=', False), ('ab_testing_winner_selection', '=', 'manual')]}"/>
</group>
<div>
<field name="ab_testing_mailings_count" invisible="1"/>
<field name="ab_testing_completed" invisible="1"/>
<field name="ab_testing_description" nolabel="1"/>
<div attrs="{'invisible': ['|', ('ab_testing_mailings_count', '&lt;', 2), ('ab_testing_enabled', '=', False)]}">
<button name="action_compare_versions" type="object" class="btn btn-link d-block">
<i class="fa fa-bar-chart"/> Compare Version
</button>
<button name="action_duplicate" type="object" class="btn btn-link d-block" attrs="{'invisible': [('ab_testing_completed', '=', True)]}">
<i class="fa fa-copy"/> Create an Alternative
</button>
<button name="action_send_winner_mailing" type="object" class="btn btn-link d-block" attrs="{'invisible': [('ab_testing_completed', '=', True)]}">
<i class="fa fa-envelope"/> <span name="ab_test_manual" attrs="{'invisible': [('ab_testing_winner_selection', '!=', 'manual')]}">
Send this version to remaining recipients
</span> <span name="ab_test_auto" attrs="{'invisible': [('ab_testing_winner_selection', '=', 'manual')]}">
Send Winner Now
</span>
</button>
<button name="action_select_as_winner" type="object" class="btn btn-link d-block"
attrs="{'invisible': ['|', ('ab_testing_completed', '!=', False), ('ab_testing_winner_selection', '!=', 'manual')]}">
<i class="fa fa-envelope"/> Send this as winner
</button>
</div>
<button name="action_duplicate" type="object" class="btn btn-primary"
attrs="{'invisible': ['|', ('ab_testing_mailings_count', '&gt;=', 2), ('ab_testing_enabled', '=', False)]}">
Create an Alternative Version
</button>
</div>
</group>
</page>
<page string="Settings" name="settings">
<group>
<group string="Email Content" name="email_content" attrs="{'invisible': [('mailing_type', '!=', 'mail')]}">
<field class="o_text_overflow" name="preview" string="Preview Text"
options="{'dynamic_placeholder': true}"
attrs="{'readonly': [('state', 'in', ('sending', 'done'))]}"
widget="char_emojis" placeholder="e.g. Check it out before it's too late!"/>
<field name="email_from" attrs="{'readonly': [('state', 'in', ('sending', 'done'))]}"/>
<label for="reply_to"/>
<div name="reply_to_details">
<field name="reply_to_mode" widget="radio"
attrs="{
'invisible': [('mailing_model_name', 'in', ['mailing.contact', 'res.partner', 'mailing.list'])],
'readonly': [('state', 'in', ('sending', 'done'))]
}"/>
<field name="reply_to"
attrs="{
'required': [('reply_to_mode', '=', 'new')],
'invisible': [('reply_to_mode', '=', 'update')],
'readonly': [('state', 'in', ('sending', 'done'))]
}"/>
<div style="margin-top:-5px">
<small class="oe_edit_only text-muted mb-2"
style="font-size:74%"
attrs="{'invisible': ['|', ('reply_to_mode', '=', 'update'), ('mailing_model_name', 'in', ['mailing.contact', 'res.partner', 'mailing.list'])],}">
To track replies, this address must belong to this database.
</small>
</div>
</div>
<label for="attachment_ids"/>
<div name="attachment_ids_details">
<field name="attachment_ids" widget="many2many_binary" string="Attach a file" class="oe_inline"
attrs="{'readonly': [('state', 'in', ('sending', 'done'))]}"/>
</div>
</group>
<group string="Tracking">
<field name="campaign_id"
string="Campaign"
groups="mass_mailing.group_mass_mailing_campaign"
options="{'create_name_field': 'title', 'always_reload': True}"
attrs="{'readonly': [('state', 'in', ('sending', 'done'))]}"/>
<field name="medium_id"
string="Medium"
required="True"
groups="base.group_no_one"
attrs="{'readonly': [('state', 'in', ('sending', 'done'))]}"/>
<field name="source_id"
string="Source"
readonly="1"
required="False"
class="o_text_overflow"
groups="base.group_no_one"
attrs="{'readonly': [('state', 'in', ('sending', 'done'))]}"/>
<field name="user_id" widget="many2one_avatar_user"
domain="[('share', '=', False)]"/>
</group>
<group string="Advanced" groups="base.group_no_one">
<field name="mail_server_available" invisible="1"/>
<field name="name" required="False" string="Name" attrs="{'readonly': [('state', 'in', ('sending', 'done'))]}"/>
<field name="mail_server_id" attrs="{'readonly': [('state', 'in', ('sending', 'done'))],
'invisible': [('mail_server_available', '=', False)]}"/>
<field name="keep_archives" attrs="{'readonly': [('state', 'in', ('sending', 'done'))]}"/>
</group>
</group>
</page>
</notebook>
</sheet>
<div class="oe_chatter">
<field name="message_follower_ids" groups="base.group_user"/>
<field name="message_ids"/>
<field name="activity_ids"/>
</div>
</form>
</field>
</record>
<!-- Inherited form view for mass mailing's form specifically -->
<record model="ir.ui.view" id="mailing_mailing_view_form_full_width">
<field name="name">mailing.mailing.view.form.full.width</field>
<field name="inherit_id" ref="mass_mailing.view_mail_mass_mailing_form"/>
<field name="mode">primary</field>
<field name="model">mailing.mailing</field>
<field name="arch" type="xml">
<xpath expr="//form" position="attributes">
<attribute name="js_class">mailing_mailing_view_form_full_width</attribute>
<attribute name="class">o_form_view o_mass_mailing_mailing_form o_mass_mailing_form_full_width</attribute>
</xpath>
<field name="state" position="before">
<xpath expr="//div[hasclass('alert-info')]" position="move"/>
</field>
<xpath expr="//div[hasclass('alert-info')]" position="attributes">
<attribute name="attrs">{'invisible': ['|',('state', '=', 'draft'),'&amp;',('state', '!=', 'in_queue'),('failed', '=', 0)]}</attribute>
</xpath>
<xpath expr="//div[hasclass('alert-info')]/div[hasclass('o_mails_canceled')]" position="replace"/>
<xpath expr="//div[hasclass('alert-info')]/div[hasclass('o_mails_sent')]" position="replace"/>
<xpath expr="//div[hasclass('alert-info')]/div[hasclass('o_mails_failed')]//span[@name='failed_text']" position="replace">
<span name="failed_text">email(s) not sent.</span>
</xpath>
<xpath expr="//div[hasclass('alert-info')]/div[hasclass('o_mails_scheduled')]" position="attributes">
<attribute name="attrs">{'invisible': [('state', '!=', 'in_queue')]}</attribute>
</xpath>
<xpath expr="//div[hasclass('alert-info')]/div[hasclass('o_mails_scheduled')]/button" position="attributes">
<attribute name="attrs">{'invisible': [('scheduled', '=', 0)]}</attribute>
</xpath>
<xpath expr="//div[hasclass('alert-info')]/div[hasclass('o_mails_scheduled')]//span[@name='scheduled_text']" position="replace">
<span name="scheduled_text">email(s) scheduled for </span>
</xpath>
<xpath expr="//div[hasclass('alert-info')]/div[hasclass('o_mails_scheduled')]/button" position="after">
</xpath>
<xpath expr="//div[hasclass('alert-info')]/div[hasclass('o_mails_in_queue')]/strong/span[@name='next_departure_text']" position="attributes">
<attribute name="attrs">{'invisible': [('scheduled', '!=', 0)]}</attribute>
</xpath>
<xpath expr="//div[hasclass('alert-info')]/div[hasclass('o_mails_scheduled')]" position="inside">
<xpath expr="//div[hasclass('alert-info')]/div[hasclass('o_mails_in_queue')]/strong" position="move"/>
</xpath>
<xpath expr="//div[hasclass('alert-info')]/div[hasclass('o_mails_in_queue')]" position="replace"/>
<xpath expr="//sheet" position="before">
<xpath expr="//div[hasclass('oe_button_box')]" position="move"/>
<xpath expr="//widget[@name='web_ribbon']" position="move"/>
<xpath expr="//group[hasclass('o_mass_mailing_mailing_group')]" position="move"/>
<xpath expr="//notebook" position="move"/>
</xpath>
<xpath expr="//div[hasclass('oe_button_box')]" position="inside">
<button name="action_view_traces_sent"
attrs="{'invisible': [('state', 'in', ('draft','test'))]}"
type="object" class="oe_stat_button" icon="fa-paper-plane">
<field name="sent" widget="statinfo" string="Sent"/>
</button>
<button name="action_view_traces_canceled"
attrs="{'invisible': [('state', 'in', ('draft','test'))]}"
type="object" class="oe_stat_button" icon="fa-paper-plane-o">
<field name="canceled" widget="statinfo" string="Ignored"/>
</button>
</xpath>
<xpath expr="//notebook" position="inside">
<page string="Chat" name="chat"/>
</xpath>
<xpath expr="//notebook/page[@name='chat']" position="inside">
<xpath expr="//div[hasclass('oe_chatter')]" position="move"/>
</xpath>
<xpath expr="//div[hasclass('oe_chatter')]" position="attributes">
<attribute name="class" remove="o-aside" add="o-full-width" separator=" "/>
</xpath>
<xpath expr="//notebook/page[@name='mail_body']//field[@name='body_arch']" position="attributes">
<attribute name="iframeHtmlClass">o_mass_mailing_iframe</attribute>
</xpath>
<xpath expr="//notebook/page[@name='mail_body']" position="after">
<!-- test_01_mass_mailing_editor_tour -->
<field name="body_html" invisible="1"/>
<page string="Mail Debug" name="mail_debug" groups="base.group_no_one">
<div class="position-relative">
<div class="mt-n2">
<field name="body_html" class="o_mail_body" widget="html"
readonly="True" force_save="1" options="{'cssReadonly': 'mass_mailing.iframe_css_assets_readonly'}"/>
</div>
<field name="is_body_empty" invisible="1"/>
<div class="o_view_nocontent oe_read_only" attrs="{'invisible': ['|', ('is_body_empty', '=', False), ('state', 'in', ('sending', 'done'))]}">
<div class="o_nocontent_help">
<p class="o_view_nocontent_smiling_face">
This mailing has no selected design (yet!).
</p>
</div>
</div>
</div>
</page>
</xpath>
<xpath expr="//sheet" position="replace"/>
</field>
</record>
<record model="ir.ui.view" id="view_mail_mass_mailing_kanban">
<field name="name">mailing.mailing.kanban</field>
<field name="model">mailing.mailing</field>
<field name="arch" type="xml">
<kanban default_group_by="state" quick_create="false" sample="1">
<field name='state' readonly="1"/>
<field name='email_from' readonly="1"/>
<field name='color'/>
<field name='user_id'/>
<field name='expected'/>
<field name='failed'/>
<field name='total'/>
<field name='mailing_model_id'/>
<field name='mailing_model_name'/>
<field name='sent_date'/>
<field name='schedule_date'/>
<field name='next_departure'/>
<field name='active'/>
<templates>
<t t-name="kanban-box">
<div t-attf-class="{{!selection_mode ? 'oe_kanban_color_' + kanban_getcolor(record.color.raw_value) : ''}} oe_kanban_card oe_kanban_global_click oe_kanban_mass_mailing">
<div class="o_dropdown_kanban dropdown" t-if="!selection_mode">
<a role="button" class="dropdown-toggle o-no-caret btn" data-bs-toggle="dropdown" href="#" data-bs-display="static" aria-label="Dropdown menu" title="Dropdown menu">
<span class="fa fa-ellipsis-v"/>
</a>
<div class="dropdown-menu" role="menu">
<ul class="oe_kanban_colorpicker" data-field="color"/>
<t t-if="widget.deletable">
<a role="menuitem" type="delete" class="dropdown-item">Delete</a>
</t>
<a role="menuitem" class="dropdown-item o_kanban_mailing_active" name="toggle_active" type="object">
<t t-if="record.active.raw_value">Archive</t>
<t t-if="!record.active.raw_value">Restore</t>
</a>
</div>
</div>
<div class="oe_kanban_content">
<div class="o_kanban_record_top">
<div class="o_kanban_record_headings">
<div class="row" attrs="{'invisible': [('sent_date', '=', False)]}">
<h3 class="my-1 col-8 o_text_overflow">
<field name="subject"/>
</h3>
<div class="progress border col-3 px-0 mt-2" style="background-color: inherit; height:12px;">
<div class="progress-bar" role="progressbar"
aria-valuemin="0"
t-att-aria-valuenow="record.delivered.raw_value"
t-att-aria-valuemax="record.expected.raw_value"
t-attf-style="width: #{record.delivered.raw_value * 100 / record.expected.raw_value}%"/>
</div>
</div>
<h3 class="my-1" attrs="{'invisible': [('sent_date', '!=', False)]}">
<field name="subject"/>
</h3>
<field name="mailing_type" invisible="1"/>
<div class="o_kanban_record_subtitle" attrs="{'invisible': [('sent_date', '=', False)]}">
<h5 style="display: inline;">
<field name="campaign_id" groups="mass_mailing.group_mass_mailing_campaign"/>
</h5>
</div>
</div>
</div>
<div class="o_kanban_record_body" t-if="!selection_mode" attrs="{'invisible': [('sent_date', '=', False), ('schedule_date', '=', False), ('state', '!=', 'in_queue')]}">
<div>
<span attrs="{'invisible': [('sent_date', '=', False)]}" class="me-1"><b><field name="delivered"/> / <field name="expected"/></b> Delivered to</span>
<span attrs="{'invisible': [('sent_date', '!=', False)]}" class="me-1"><b><field name='total'/></b></span>
<field name='mailing_model_id' attrs="{'invisible': [('mailing_model_name','=','mailing.list')]}"/>
<span attrs="{'invisible': [('mailing_model_name','!=','mailing.list')]}">Mailing Contact</span>
</div>
<div attrs="{'invisible': [('sent_date', '=', False)]}" class="d-flex justify-content-between">
<div name="stat_opened">
<b><field name="opened_ratio" />%</b> Opened
</div>
<div name="stat_replied">
<b><field name="replied_ratio" />%</b> Replied
</div>
<div name="stat_clicks">
<b><field name="clicks_ratio" />%</b> Clicks
</div>
</div>
</div>
</div>
<div name="div_responsible_avatar" class="o_kanban_record_bottom">
<div class="oe_kanban_bottom_left">
<span attrs="{'invisible': [('sent_date', '=', False)]}"
t-attf-title="Sent on #{record.sent_date.value}" class="d-inline-flex">
<span class="fa fa-calendar-check-o me-2 small my-auto" aria-label="Sent date"/>
<span class="align-self-baseline"><field name="sent_date" widget="date"/></span>
</span>
<span attrs="{'invisible': [('schedule_date', '=', False)]}"
t-attf-title="Scheduled on #{record.schedule_date.value}" class="d-inline-flex">
<span class="fa fa-hourglass-half me-2 small my-auto" aria-label="Scheduled date"/>
<span class="align-self-baseline"><field name="schedule_date" widget="date"/></span>
</span>
<span attrs="{'invisible': ['|', '|', ('sent_date', '!=', False), ('schedule_date', '!=', False), ('state', '=', 'in_queue')]}"
class="clearfix">
<b><field name='total' class="me-1"/></b>
<field name='mailing_model_id' attrs="{'invisible': [('mailing_model_name','=','mailing.list')]}"/>
<span attrs="{'invisible': [('mailing_model_name','!=','mailing.list')]}">Mailing Contact</span>
</span>
<span attrs="{'invisible': ['|', '|', ('schedule_date', '!=', False), ('state', '!=', 'in_queue'), ('next_departure', '=', False)]}"
t-attf-title="Scheduled on #{record.next_departure.value}" class="d-inline-flex">
<span class="fa fa-hourglass-o me-2 small my-auto" aria-label="Scheduled date"/>
<span class="align-self-baseline">Next Batch</span>
</span>
</div>
<div class="oe_kanban_bottom_right">
<field name="user_id" widget="many2one_avatar_user"/>
</div>
</div>
</div>
</t>
</templates>
</kanban>
</field>
</record>
<record id="mailing_mailing_view_calendar" model="ir.ui.view">
<field name="name">mailing.mailing.view.calendar</field>
<field name="model">mailing.mailing</field>
<field name="arch" type="xml">
<calendar date_start="calendar_date" string="Mailings" hide_time="true" mode="month" color="state" quick_add="False">
<field name="mailing_model_id" string="Recipient" options="{'no_open': True}"/>
<field name="user_id" filters="1" invisible="1"/>
<field name="state" filters="1" invisible="1"/>
</calendar>
</field>
</record>
<record id="view_mail_mass_mailing_graph" model="ir.ui.view">
<field name="name">mailing.mailing.graph</field>
<field name="model">mailing.mailing</field>
<field name="arch" type="xml">
<graph string="Mailing" sample="1">
<field name="state"/>
<field name="color" invisible="1"/>
</graph>
</field>
</record>
<record id="mailing_mailing_action_mail" model="ir.actions.act_window">
<field name="name">Mailings</field>
<field name="res_model">mailing.mailing</field>
<field name="view_mode">tree,kanban,form,calendar,graph</field>
<field name="domain">[('mailing_type', '=', 'mail')]</field>
<field name="context">{
'search_default_assigned_to_me': 1,
'default_user_id': uid,
'default_mailing_type': 'mail',
}</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Create a Mailing
</p><p>
Design a striking email, define recipients and track its results.
</p>
</field>
</record>
<record id="mailing_mailing_action_mail_fullwidth_tree" model="ir.actions.act_window.view">
<field name="sequence" eval="0"/>
<field name="view_mode">tree</field>
<field name="act_window_id" ref="mass_mailing.mailing_mailing_action_mail"/>
</record>
<record id="mailing_mailing_action_mail_fullwidth_kanban" model="ir.actions.act_window.view">
<field name="sequence" eval="1"/>
<field name="view_mode">kanban</field>
<field name="act_window_id" ref="mass_mailing.mailing_mailing_action_mail"/>
</record>
<record id="mailing_mailing_action_mail_fullwidth_form" model="ir.actions.act_window.view">
<field name="sequence" eval="2"/>
<field name="view_mode">form</field>
<field name="view_id" ref="mass_mailing.mailing_mailing_view_form_full_width"/>
<field name="act_window_id" ref="mass_mailing.mailing_mailing_action_mail"/>
</record>
<record id="mailing_mailing_action_mail_fullwidth_calendar" model="ir.actions.act_window.view">
<field name="sequence" eval="3"/>
<field name="view_mode">calendar</field>
<field name="act_window_id" ref="mass_mailing.mailing_mailing_action_mail"/>
</record>
<record id="mailing_mailing_action_mail_fullwidth_graph" model="ir.actions.act_window.view">
<field name="sequence" eval="4"/>
<field name="view_mode">graph</field>
<field name="act_window_id" ref="mass_mailing.mailing_mailing_action_mail"/>
</record>
<record id="action_view_mass_mailings_from_campaign" model="ir.actions.act_window">
<field name="name">Mailings</field>
<field name="res_model">mailing.mailing</field>
<field name="view_mode">kanban,tree,form,calendar</field>
<field name="context">{
'search_default_assigned_to_me': 1,
'search_default_campaign_id': [active_id],
'default_campaign_id': active_id,
'default_user_id': uid,
}
</field>
<field name="domain">[('mailing_type', '=', 'mail')]</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Create a new mailing
</p><p>
You don't need to import your mailing lists, you can easily
send emails<br/> to any contact saved in other Odoo apps.
</p>
</field>
</record>
<record id="action_create_mass_mailings_from_campaign" model="ir.actions.act_window">
<field name="name">Mailings</field>
<field name="res_model">mailing.mailing</field>
<field name="view_mode">form,kanban,tree</field>
<field name="context">{
'search_default_assigned_to_me': 1,
'search_default_campaign_id': [active_id],
'default_campaign_id': active_id,
'default_user_id': uid,
}
</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Create a new mailing
</p><p>
You don't need to import your mailing lists, you can easily
send emails<br/> to any contact saved in other Odoo apps.
</p>
</field>
</record>
<record id="action_ab_testing_open_winner_mailing" model="ir.actions.act_window">
<field name="name">A/B Test Winner</field>
<field name="res_model">mailing.mailing</field>
<field name="view_mode">form</field>
</record>
</odoo>

View file

@ -0,0 +1,103 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Marketing / Mailing -->
<menuitem name="Email Marketing"
id="mass_mailing_menu_root"
sequence="115"
web_icon="mass_mailing,static/description/icon.svg"
groups="mass_mailing.group_mass_mailing_user"/>
<!-- Mailings -->
<menuitem name="Mailings"
id="mass_mailing_menu"
parent="mass_mailing_menu_root"
sequence="1"
action="mailing_mailing_action_mail"/>
<!-- Mailing lists -->
<menuitem name="Mailing Lists"
id="mass_mailing_mailing_list_menu"
parent="mass_mailing_menu_root"
sequence="2"/>
<menuitem name="Mailing Lists"
id="menu_email_mass_mailing_lists"
parent="mass_mailing_mailing_list_menu"
sequence="1"
action="action_view_mass_mailing_lists"/>
<menuitem name="Mailing List Contacts"
id="menu_email_mass_mailing_contacts"
parent="mass_mailing_mailing_list_menu"
sequence="2"
action="action_view_mass_mailing_contacts"/>
<!-- Campaigns -->
<menuitem name="Campaigns"
id="menu_email_campaigns"
parent="mass_mailing_menu_root"
sequence="3"
action="action_view_utm_campaigns"
groups="mass_mailing.group_mass_mailing_campaign"/>
<!-- Reporting -->
<menuitem name="Reporting"
id="menu_mass_mailing_report"
sequence="90"
parent="mass_mailing_menu_root"
action="mailing_trace_report_action_mail"/>
<!-- Configuration -->
<menuitem name="Configuration"
id="mass_mailing_configuration"
parent="mass_mailing_menu_root"
sequence="100"/>
<!-- Configuration / Settings -->
<menuitem name="Settings"
id="menu_mass_mailing_global_settings"
parent="mass_mailing_configuration"
sequence="0"
action="action_mass_mailing_configuration"
groups="base.group_system"/>
<!-- Configuration / Campaign stages -->
<menuitem name="Campaign Stages"
id="menu_view_mass_mailing_stages"
parent="mass_mailing_configuration"
sequence="1"
groups="mass_mailing.group_mass_mailing_campaign"
action="utm.action_view_utm_stage"/>
<!-- Configuration / Utm Tags -->
<menuitem id="mass_mailing_tag_menu"
parent="mass_mailing_configuration"
action="utm.action_view_utm_tag"
sequence="2"
groups="mass_mailing.group_mass_mailing_campaign"/>
<!-- Configuration / Link trackers -->
<menuitem id="link_tracker_menu_mass_mailing"
name="Link Tracker"
parent="mass_mailing_configuration"
sequence="10"
action="link_tracker.link_tracker_action"/>
<!-- Configuration / Blacklist -->
<menuitem id="mail_blacklist_mm_menu"
name="Blacklisted Email Addresses"
action="mail.mail_blacklist_action"
parent="mass_mailing_configuration"
sequence="20"/>
<!-- Configuration / Favorite Filters -->
<menuitem id="mailing_filter_menu_action"
action="mailing_filter_action"
parent="mass_mailing_configuration"
sequence="30"/>
<!-- Technical / Mass Mailing -->
<menuitem id="mailing_mailing_menu_technical"
name="Mass Mailing"
sequence="4"
parent="base.menu_custom"/>
<menuitem id="menu_email_statistics"
name="Mailing Traces"
parent="mass_mailing.mailing_mailing_menu_technical"
sequence="2"
action="mailing_trace_action"/>
</odoo>

View file

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- new layout for mass_mailing -->
<template id="mass_mailing.layout" name="Mass Mailing Layout">
<t t-set="html_data" t-value="{'lang': lang and lang.replace('_', '-')}"/>
<t t-call="web.frontend_layout">
<body class="bg-white o_mailing_portal_body">
<header>
<div><title>Odoo</title></div>
<div class="text-center">
<img t-attf-src="/web/binary/company_logo?company={{ res_company.id }}"/>
</div>
</header>
<div id="wrap" class="oe_structure oe_empty"/>
<main>
<t t-out="0"/>
</main>
</body>
<xpath expr="//head/t[@t-call-assets][last()]" position="after">
<t t-call-assets="mass_mailing.mailing_assets" lazy_load="True"/>
</xpath>
<xpath expr="//header" position="before">
<t t-set="no_header" t-value="True"/>
</xpath>
</t>
</template>
</odoo>

View file

@ -0,0 +1,47 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="mailing_report_deactivated" name="Report Unsubscribed">
<t t-call="mass_mailing.layout">
<div class="container mt8">
<div class="row">
<div class="col-lg-6 offset-lg-3">
<h3>Mailing Reports Turned Off</h3>
<div class="alert alert-success text-center" role="status">
<p>
Mailing Reports have been turned off for all users. <br/>
If needed, they can be turned back on from the
<a t-if="menu_id" t-attf-href="/web#menu_id=#{menu_id}">
Settings Menu.
</a>
<t t-else="">
Settings Menu.
</t>
</p>
</div>
</div>
</div>
</div>
</t>
</template>
<!-- Dummy layout to "view" a template content (html) -->
<template id="view" name="Browser View">
&lt;!DOCTYPE html&gt;
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<style type="text/css">
<!-- Hide the link view online as it is displayed online -->
.o_snippet_view_in_browser {
display: none;
}
</style>
</head>
<body>
<!-- Raw body inserted here because it is a rendered mailing, therefore internal content -->
<t t-out="body"/>
</body>
</html>
</template>
</odoo>

View file

@ -0,0 +1,119 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="unsubscribe">
<div class="container o_unsubscribe_form">
<div class="row">
<form action="/mail/mailing/unsubscribe" method="POST" id="unsubscribe_form" class="col-lg-6 offset-lg-3 mt-4">
<input type="hidden" name="csrf_token" t-att-value="request.csrf_token()"/>
<input type="hidden" name="email" t-att-value="email"/>
<input type="hidden" name="mailing_id" t-att-value="mailing_id"/>
<input type="hidden" name="res_id" t-att-value="res_id"/>
<input type="hidden" name="unsubscribed_list" t-att-value="unsubscribed_list"/>
<div>
<t t-if="contacts">
<div id="info_state" class="alert alert-success" role="status">
<div id="subscription_info"></div>
<div id="div_feedback">
<p>We would appreciate if you provide feedback about why you updated<br/>your subscriptions</p>
<textarea class="form-control" name="opt_out_feedback" cols="60" rows="3"></textarea>
<br/>
<div class="btn btn-primary text-start" id="button_feedback">Send</div>
</div>
</div>
<h1 class="o_page_header">Mailing Subscriptions</h1>
<p>Choose your mailing subscriptions</p>
<div id="div_opt_out">
<ul class="list-group">
<t t-foreach="list_ids" t-as="list_id">
<t t-if="list_id.is_public == True">
<li class="list-group-item">
<input type="checkbox" name="contact_ids"
t-att-value="list_id['id']" t-att-checked="None if list_id['id'] in opt_out_list_ids else 'checked'"/>
<t t-esc="list_id.name"/>
<span t-if="list_id['id'] in opt_out_list_ids"
class="o_mailing_portal_list_unsubscribed">
Unsubscribed
</span>
</li>
</t>
</t>
</ul>
<div class="mb64 pt-3">
<div class="btn btn-link float-end pe-0 text-uppercase"
t-if="show_blacklist_button"
id="button_add_blacklist"
style="display:none">Blacklist Me</div>
<div class="btn btn-link float-end pe-0 text-uppercase"
id="button_remove_blacklist"
style="display:none">Come Back</div>
<button type="submit" id="send_form"
class="btn btn-primary">Update my subscriptions</button>
</div>
</div>
</t>
<t t-else="">
<div class="alert alert-info text-center" role="status">
<p>You are not subscribed to any of our mailing list.</p>
</div>
</t>
</div>
</form>
</div>
</div>
</template>
<template id="unsubscribed">
<div class="container o_unsubscribe_form">
<div class="row">
<input type="hidden" name="email" t-att-value="email"/>
<input type="hidden" name="mailing_id" t-att-value="mailing_id"/>
<input type="hidden" name="res_id" t-att-value="res_id"/>
<div id="div_blacklist" class="col-lg-6 offset-lg-3">
<h1 class="o_page_header">Mailing Subscriptions</h1>
<div id="subscription_info" class="alert alert-success text-center" role="status">
<p>You have been successfully <strong>unsubscribed</strong>!</p>
</div>
<div t-if="list_ids" class="alert alert-warning">
<p class="text-center">You were still subscribed to those newsletters. You will not receive any news from them anymore:</p>
<ul class="list-group mb-4">
<t t-foreach="list_ids" t-as="list_id">
<t t-if="list_id.is_public == True">
<li class="list-group-item bg-transparent">
<strong><t t-esc="list_id.name"/></strong>
</li>
</t>
</t>
</ul>
</div>
<div t-if="show_blacklist_button" class="mb64">
<div class="btn btn-link float-end"
id="button_add_blacklist"
style="display:none">Blacklist Me</div>
<div class="btn btn-link float-end"
id="button_remove_blacklist"
style="display:none">Come Back</div>
</div>
</div>
</div>
</div>
</template>
<template id="page_unsubscribe" name="Unsubscribe">
<t t-call="mass_mailing.layout">
<t t-call="mass_mailing.unsubscribe"/>
</t>
</template>
<template id="page_unsubscribed" name="Unsubscribed">
<t t-call="mass_mailing.layout">
<t t-call="mass_mailing.unsubscribed"/>
</t>
</template>
</odoo>

View file

@ -0,0 +1,143 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- MAILING TRACE !-->
<record model="ir.ui.view" id="mailing_trace_view_search">
<field name="name">mailing.trace.view.search</field>
<field name="model">mailing.trace</field>
<field name="arch" type="xml">
<search string="Mail Statistics">
<field name="mail_mail_id_int"/>
<field name="message_id"/>
<field name="email"/>
<field name="mass_mailing_id"/>
<filter string="Scheduled" name="filter_scheduled" domain="[('trace_status', '=', 'outgoing')]"/>
<filter string="Canceled" name="filter_canceled" domain="[('trace_status', '=', 'cancel')]"/>
<filter string="Sent" name="filter_sent" domain="[('sent_datetime', '!=', False)]"/>
<filter string="Clicked" name="filter_clicked" domain="[('links_click_datetime', '!=', False)]"/>
<filter string="Delivered" name="filter_delivered" domain="[('sent_datetime', '!=', False), ('trace_status', 'not in', ['error', 'cancel'])]"/>
<filter string="Opened" name="filter_opened" domain="[('trace_status', 'in', ['open', 'reply'])]"/>
<filter string="Replied" name="filter_replied" domain="[('trace_status', '=', 'reply')]"/>
<filter string="Bounced" name="filter_bounced" domain="[('trace_status', '=', 'bounce')]"/>
<filter string="Failed" name="filter_failed" domain="[('trace_status', '=', 'error')]"/>
<group expand="0" string="Group By">
<filter string="State" name="state" domain="[]" context="{'group_by': 'trace_status'}"/>
<filter string="Open Date" name="group_open_date" domain="[('trace_status', 'in', ['open', 'reply'])]" context="{'group_by': 'open_datetime:day'}"/>
<filter string="Reply Date" name="group_reply_date" domain="[('trace_status', '=', 'reply')]" context="{'group_by': 'reply_datetime:day'}"/>
<filter string="Last State Update" name="state_update" domain="[]" context="{'group_by': 'write_date'}"/>
<filter string="Mass Mailing" name="mass_mailing" domain="[]" context="{'group_by': 'mass_mailing_id'}"/>
</group>
</search>
</field>
</record>
<record id="mailing_trace_view_tree" model="ir.ui.view">
<field name="name">mailing.trace.view.tree</field>
<field name="model">mailing.trace</field>
<field name="arch" type="xml">
<tree string="Mailing Traces" create="0">
<field name="mass_mailing_id"/>
<field name="email"/>
<field name="message_id"/>
<field name="sent_datetime"/>
<field name="links_click_datetime"/>
<field name="trace_status" widget="badge"/>
<field name="failure_type" optional="show"/>
<field name="open_datetime" optional="hide"/>
<field name="reply_datetime" optional="hide"/>
<button name="action_view_contact" type="object"
string="Open Recipient" icon="fa-user"/>
</tree>
</field>
</record>
<record id="mailing_trace_view_tree_mail" model="ir.ui.view">
<field name="name">mailing.trace.view.tree.mail</field>
<field name="model">mailing.trace</field>
<field name="priority">20</field>
<field name="arch" type="xml">
<tree string="Mail Traces" create="0">
<field name="mass_mailing_id"/>
<field name="email"/>
<field name="message_id" optional="hide"/>
<field name="sent_datetime"/>
<field name="links_click_datetime"/>
<field name="trace_status" widget="badge"/>
<field name="failure_type" optional="show"/>
<field name="open_datetime" optional="hide"/>
<field name="reply_datetime" optional="hide"/>
<button name="action_view_contact" type="object"
string="Open Recipient" icon="fa-user"/>
</tree>
</field>
</record>
<record id="mailing_trace_view_form" model="ir.ui.view">
<field name="name">mailing.trace.view.form</field>
<field name="model">mailing.trace</field>
<field name="arch" type="xml">
<form string="Mail Statistics" create="0" edit="0">
<sheet>
<div class="oe_button_box" name="button_box">
<button name="action_view_contact"
type="object" icon="fa-user" class="oe_stat_button">
<span widget="statinfo">Open Recipient</span>
</button>
</div>
<group>
<group string="Status">
<field name="trace_status"/>
<field name="failure_type" attrs="{'invisible' : [('failure_type', '=', False)]}"/>
<field name="sent_datetime" attrs="{'invisible' : [('sent_datetime', '=', False)]}"/>
<field name="links_click_datetime" attrs="{'invisible' : [('links_click_datetime', '=', False)]}"/>
<field name="open_datetime" attrs="{'invisible' : [('open_datetime', '=', False)]}"/>
<field name="reply_datetime" attrs="{'invisible' : [('reply_datetime', '=', False)]}"/>
</group>
<group string="Mailing">
<field name="trace_type" invisible="1"/>
<field name="email" string="Recipient Address"/>
<field name="mass_mailing_id"/>
<field name="mail_mail_id_int" string="Mail ID" groups="base.group_no_one"/>
<field name="message_id" groups="base.group_no_one"/>
</group>
<group string="Marketing">
<field name="campaign_id" groups="mass_mailing.group_mass_mailing_campaign"/>
<field name="medium_id"/>
<field name="source_id"/>
</group>
</group>
</sheet>
</form>
</field>
</record>
<record id="view_mail_mail_statistics_graph" model="ir.ui.view">
<field name="name">Mail Statistics Graph</field>
<field name="model">mailing.trace</field>
<field name="arch" type="xml">
<graph string="Mail Statistics" sample="1">
<field name="write_date" interval="day"/>
<field name="trace_status"/>
</graph>
</field>
</record>
<record id="mailing_trace_action" model="ir.actions.act_window">
<field name="name">Mailing Traces</field>
<field name="res_model">mailing.trace</field>
<field name="view_mode">tree,form,graph,pivot</field>
<field name="domain">[]</field>
</record>
<record id="action_view_mail_mail_statistics_mailing" model="ir.actions.act_window">
<field name="name">Mail Statistics</field>
<field name="res_model">mailing.trace</field>
<field name="view_mode">graph,tree,form,pivot</field>
<field name="domain">[]</field>
<field name="context">{'search_default_mass_mailing_id': active_id}</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
No data yet!
</p>
</field>
</record>
</odoo>

View file

@ -0,0 +1,82 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="res_config_settings_view_form" model="ir.ui.view">
<field name="name">res.config.settings.view.form.inherit.mass.mailing</field>
<field name="model">res.config.settings</field>
<field name="priority" eval="60"/>
<field name="inherit_id" ref="base.res_config_settings_view_form"/>
<field name="arch" type="xml">
<xpath expr="//div[hasclass('settings')]" position="inside">
<div class="app_settings_block" data-string="Email Marketing" string="Email Marketing" data-key="mass_mailing" groups="mass_mailing.group_mass_mailing_user">
<h2>Email Marketing</h2>
<div class="row mt16 o_settings_container" name="managa_mail_campaigns_setting_container">
<div class="col-lg-6 o_setting_box col-12" title="This tool is advised if your marketing campaign is composed of several emails.">
<div class="o_setting_left_pane" title="This is useful if your marketing campaigns are composed of several emails.">
<field name="group_mass_mailing_campaign"/>
</div>
<div class="o_setting_right_pane">
<label for="group_mass_mailing_campaign"/>
<div class="text-muted">
Manage mass mailing campaigns
</div>
</div>
</div>
<div class="col-lg-6 o_setting_box col-12" name="dedicated_server_setting_container">
<div class="o_setting_left_pane" title="Use a specific mail server in priority. Otherwise Odoo relies on the first outgoing mail server available (based on their sequencing) as it does for normal mails.">
<field name="mass_mailing_outgoing_mail_server"/>
</div>
<div class="o_setting_right_pane">
<label for="mass_mailing_outgoing_mail_server"/>
<div class="text-muted">
Pick a dedicated outgoing mail server for your mass mailings
</div>
<div class="content-group" attrs="{'invisible': [('mass_mailing_outgoing_mail_server', '=', False)]}">
<div class="mt16">
<field name="mass_mailing_mail_server_id" options="{'no_create': True, 'no_open': True}"
placeholder="Default Server"/>
</div>
<div class="mt8">
<button type="action" name="base.action_ir_mail_server_list" string="Configure Outgoing Mail Servers" icon="fa-arrow-right" class="oe_link"/>
</div>
</div>
</div>
</div>
<div class="col-md-6 o_setting_box col-xs-12" name="allow_blacklist_setting_container">
<div class="o_setting_left_pane" title="Allow the recipient to manage themselves their state in the blacklist via the unsubscription page.
If the option is active, the 'Blacklist Me' button is hidden on the unsubscription page.
The 'come Back' button will always be visible in any case to allow leads and partners to re-subscribe.">
<field name="show_blacklist_buttons"/>
</div>
<div class="o_setting_right_pane">
<label for="show_blacklist_buttons"/>
<div class="text-muted">
Allow recipients to blacklist themselves
</div>
</div>
</div>
<div class="col-md-6 o_setting_box col-xs-12" name="mass_mailing_reports_setting_container">
<div class="o_setting_left_pane" title="Send a report to the mailing responsible one day after the mailing has been sent.">
<field name="mass_mailing_reports"/>
</div>
<div class="o_setting_right_pane">
<label for="mass_mailing_reports"/>
<div class="text-muted">
Check how well your mailing is doing a day after it has been sent
</div>
</div>
</div>
</div>
</div>
</xpath>
</field>
</record>
<record id="action_mass_mailing_configuration" model="ir.actions.act_window">
<field name="name">Settings</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">res.config.settings</field>
<field name="view_mode">form</field>
<field name="target">inline</field>
<field name="context">{'module' : 'mass_mailing', 'bin_size': False}</field>
</record>
</odoo>

View file

@ -0,0 +1,52 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="s_alert" name="Alert">
<div class="s_mail_alert o_mail_snippet_general pt16 pb16 mx-auto">
<div class="container">
<div class="row">
<div class="col-lg-12">
<div class="s_alert s_alert_md s_alert_info w-100" style="background-color: rgb(209 236 241); border-width: 1px !important; border-color: rgb(190 229 235) !important;">
<div class="s_alert_icon" valign="top">
<i class="fa fa-2x fa-info-circle" style="color: rgb(12 84 96);"/>
</div>
<div class="s_alert_content">
<h3><span style="color: rgb(12 84 96); font-size: 16px; font-weight: bolder;">Explain the benefits you offer</span></h3>
<p><font style="color: rgb(12 84 96);">Don't write about products or services here, write about solutions.</font></p>
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<template id="s_alert_options" inherit_id="mass_mailing.snippet_options">
<!-- Keep those options in separate xpath for options order -->
<xpath expr="//div[@id='so_width']" position="after">
<div data-selector=".s_mail_alert .s_alert">
<we-select string="Size">
<we-button data-select-class="s_alert_sm">Small</we-button>
<we-button data-select-class="s_alert_md">Medium</we-button>
<we-button data-select-class="s_alert_lg">Large</we-button>
</we-select>
<we-colorpicker string="Background Color" data-name="alert_colorpicker_opt"
data-select-style="true"
data-css-property="background-color"
data-color-prefix="alert-"/>
</div>
<div data-selector=".s_mail_alert .s_alert">
<t t-call="mass_mailing.snippet_options_border_widgets">
<t t-set="so_rounded_no_dependencies" t-value="True"/>
</t>
</div>
</xpath>
</template>
<!-- Assets -->
<record id="mass_mailing.s_alert_001_scss" model="ir.asset">
<field name="name">Alert 001 SCSS</field>
<field name="bundle">web.assets_frontend</field>
<field name="path">mass_mailing/static/src/snippets/s_alert/000.scss</field>
</record>
</odoo>

View file

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="s_blockquote" name="Blockquote">
<div class="s_mail_blockquote blockquote o_mail_snippet_general o_cc o_cc2 pt16 pb16 mb-0 w-100">
<div class="container">
<div class="row">
<div class="col-lg-1 pb80" style="text-align: right;">
<i class="fa fa-quote-left"/>
</div>
<div class="col-lg-10">
<div>
<p><i>Write a quote here from one of your customers. Quotes are a great way to build confidence in your products or services.</i></p>
<div>
<img src="/web_editor/image_shape/mass_mailing.s_company_team_default_image_2/mass_mailing/basic/circle.svg" style="width: 40px" class="img me-2" data-shape="mass_mailing/basic/circle" data-file-name="team_member_2-circle.svg" data-shape-colors=";;;;" data-original-mimetype="image/png"/>
<p style="font-weight: bolder; font-size: 14px;"><b>John DOE</b> &#8226; CEO of MyCompany</p>
</div>
</div>
</div>
<div class="col-lg-1 pt80" style="text-align: left;">
<i class="fa fa-quote-right"/>
</div>
</div>
</div>
</div>
</template>
</odoo>

View file

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="s_call_to_action" name="Call to Action">
<div class="s_call_to_action o_mail_snippet_general o_cc o_cc3 pt48 pb24">
<div class="container">
<div class="row">
<div class="col-lg-9">
<h3><span style="font-weight: bolder;">50,000+ companies</span> run Odoo.</h3>
<p>Join us and make your company a better place.</p>
</div>
<div class="col-lg-3" style="text-align: center;">
<a href="#" class="btn btn-primary btn-lg">Contact us</a>
</div>
</div>
</div>
</div>
</template>
</odoo>

View file

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="s_color_blocks_2" name="Big Boxes">
<div class="s_mail_color_blocks_2 o_mail_snippet_general">
<div class="container">
<div class="row">
<div class="col-lg-6 o_cc o_cc3 pt32 pb32">
<i class="fa fa-shield fa-5x m-3 mx-auto d-block"/>
<h2 style="text-align: center;">A color block</h2>
<p style="text-align: center;">Color blocks are a simple and effective way to <b>present and highlight your content</b>. Choose an image or a color for the background. You can even resize and duplicate the blocks to create your own layout. Add images or icons to customize the blocks.</p>
<p style="text-align: center;"><a href="#" class="btn btn-primary">More Details</a></p>
</div>
<div class="col-lg-6 o_cc o_cc5 pt32 pb32">
<i class="fa fa-cube fa-5x m-3 mx-auto d-block"/>
<h2 style="text-align: center;">Another color block</h2>
<p style="text-align: center;">Color blocks are a simple and effective way to <b>present and highlight your content</b>. Choose an image or a color for the background. You can even resize and duplicate the blocks to create your own layout. Add images or icons to customize the blocks.</p>
<p style="text-align: center;"><a href="#" class="btn btn-primary">More Details</a></p>
</div>
</div>
</div>
</div>
</template>
</odoo>

View file

@ -0,0 +1,65 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="s_company_team" name="Team">
<div class="s_company_team o_mail_snippet_general">
<div class="container">
<div class="row">
<div class="col-lg-6 pt24 pb24">
<div class="container">
<div class="row">
<div class="col-lg-3 pb16 px-0">
<img src="/web_editor/image_shape/mass_mailing.s_company_team_default_image_1/mass_mailing/basic/circle.svg" class="img-fluid mx-auto" data-shape="mass_mailing/basic/circle" data-file-name="team_member_1-circle.svg" data-shape-colors=";;;;" data-original-mimetype="image/png"/>
</div>
<div class="col-lg-9">
<h3>Tony Fred, CEO</h3>
<p>Founder and chief visionary, Tony is the driving force behind the company. He loves to keep his hands full by participating in the development of the software, marketing, and customer experience strategies.</p>
</div>
</div>
</div>
</div>
<div class="col-lg-6 pt24 pb24">
<div class="container">
<div class="row">
<div class="col-lg-3 px-0 pb16">
<img src="/web_editor/image_shape/mass_mailing.s_company_team_default_image_2/mass_mailing/basic/circle.svg" class="img-fluid mx-auto" data-shape="mass_mailing/basic/circle" data-file-name="team_member_2-circle.svg" data-shape-colors=";;;;" data-original-mimetype="image/png"/>
</div>
<div class="col-lg-9">
<h3>Mich Stark, COO</h3>
<p>Mich loves taking on challenges. With his multi-year experience as Commercial Director in the software industry, Mich has helped the company to get where it is today. Mich is among the best minds.</p>
</div>
</div>
</div>
</div>
<div class="col-lg-6 pt24 pb24">
<div class="container">
<div class="row">
<div class="col-lg-3 px-0 pb16">
<img src="/web_editor/image_shape/mass_mailing.s_company_team_default_image_3/mass_mailing/basic/circle.svg" class="img-fluid mx-auto" data-shape="mass_mailing/basic/circle" data-file-name="team_member_3-circle.svg" data-shape-colors=";;;;" data-original-mimetype="image/png"/>
</div>
<div class="col-lg-9">
<h3>Aline Turner, CTO</h3>
<p>Aline is one of the iconic people in life who can say they love what they do. She mentors 100+ in-house developers and looks after the community of thousands of developers.</p>
</div>
</div>
</div>
</div>
<div class="col-lg-6 pt24 pb24">
<div class="container">
<div class="row">
<div class="col-lg-3 px-0 pb16">
<img src="/web_editor/image_shape/mass_mailing.s_company_team_default_image_4/mass_mailing/basic/circle.svg" class="img-fluid mx-auto" data-shape="mass_mailing/basic/circle" data-file-name="team_member_4-circle.svg" data-shape-colors=";;;;" data-original-mimetype="image/png"/>
</div>
<div class="col-lg-9">
<h3>Iris Joe, CFO</h3>
<p>Iris, with her international experience, helps us easily understand the numbers and improves them. She is determined to drive success and delivers her professional acumen to bring the company to the next level.</p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</template>
</odoo>

View file

@ -0,0 +1,63 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="s_comparisons" name="Comparisons">
<div class="s_comparisons o_mail_snippet_general pt32 pb32">
<div class="container">
<div class="row">
<div class="col-lg-6 s_col_no_bgcolor pt32 pb16">
<div class="card o_cc o_cc2">
<div class="card-header"><h2 style="text-align: center;"><span style="font-weight: bolder;">DEFAULT</span></h2></div>
<div class="bg-white pt24 pb24">
<ul class="list-group list-group-flush">
<li class="list-group-item">
<h3 class="card-title" style="text-align: center;">$8</h3>
<p class="card-title" style="text-align: center;"><span style="font-size: 11px">user / month (billed annually)</span></p>
</li>
<li class="list-group-item"><p style="text-align: center;">Basic features</p></li>
<li class="list-group-item"><p style="text-align: center;">Basic management</p></li>
<li class="list-group-item"><p style="text-align: center;">No customization</p></li>
<li class="list-group-item"><p style="text-align: center;">No support</p></li>
</ul>
</div>
<div class="card-footer" style="text-align: center;">
<a href="#" class="btn btn-primary">More</a>
</div>
</div>
</div>
<div class="col-lg-6 s_col_no_bgcolor pt32 pb16">
<div class="card o_cc o_cc3">
<div class="card-header"><h2 style="text-align: center;"><span style="font-weight: bolder;">PRO</span></h2></div>
<div class="bg-white pt24 pb24">
<ul class="list-group list-group-flush">
<li class="list-group-item">
<h3 class="card-title" style="text-align: center;">$18</h3>
<p class="card-title" style="text-align: center;"><span style="font-size: 11px">user / month (billed annually)</span></p>
</li>
<li class="list-group-item">
<p style="text-align: center;"><span style="font-weight:bolder">Advanced</span>
features</p>
</li>
<li class="list-group-item">
<p style="text-align: center;"><span style="font-weight:bolder">Total</span>
management</p>
</li>
<li class="list-group-item">
<p style="text-align: center;"><span style="font-weight:bolder">Fully customizable</span></p>
</li>
<li class="list-group-item">
<p style="text-align: center;"><span style="font-weight:bolder">24/7 Support</span></p>
</li>
</ul>
</div>
<div class="card-footer" style="text-align: center;">
<a href="#" class="btn btn-primary">More</a>
</div>
</div>
</div>
</div>
</div>
</div>
</template>
</odoo>

View file

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="s_coupon_code" name="Promo Code">
<div class="s_discount2 o_mail_block_discount2 o_mail_snippet_general pt32 pb32" style="padding-left: 15px; padding-right: 15px;">
<h2 style="text-align: center;"><span style="font-weight: bolder;">GET $20 OFF</span></h2>
<p style="text-align: center;">
Here's your coupon code - but hurry! Ends 9/28
</p>
<table border="0" cellpadding="0" cellspacing="0" align="center" class="border" style="border-collapse:collapse; mso-table-lspace:0pt; mso-table-rspace:0pt;">
<tr>
<td width="50" height="50" align="center" class="o_mail_no_resize mx-auto o_cc o_cc3" style="width:50px!important; min-width: 50px; max-width:5.6rem; text-align: center;"><i class="fa fa-2x fa-ticket"></i></td>
<td width="200" height="50" align="center" class="o_cc" style="font-size: 15px; line-height: 22px; font-weight: 700; min-width: 150px; width: 200px; text-align: center;"><p class="mb0">ENDOFSUMMER20</p></td>
</tr>
</table>
<br/>
<p style="text-align:center;">
<a role="button" href="#" class="btn btn-primary">Use now</a>
</p>
</div>
</template>
</odoo>

View file

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="s_cover" name="Cover">
<div class="s_cover o_mail_snippet_general">
<div class="container">
<div class="row">
<div class="col-lg-12 oe_img_bg pt56 pb48" style="background-image: url('/web/image/mass_mailing.s_cover_default_image');">
<h1 style="text-align: center;"><font style="font-size: 62px; font-weight: bold;">Catchy Headline</font></h1>
<p class="lead" style="text-align: center;">Write one or two paragraphs describing your product, services or a specific feature.<br/> To be successful your content needs to be useful to your readers.</p>
</div>
</div>
</div>
</div>
</template>
</odoo>

View file

@ -0,0 +1,43 @@
<odoo>
<template id="s_event" name="Event">
<div class="s_mail_block_event o_mail_snippet_general bg-100">
<div class="container">
<div class="row align-items-center">
<div class="s_col_no_bgcolor col-lg-6 pt32 pb32">
<div class="card bg-white h-100 rounded" style="border-radius: 5px !important; border-color: rgb(233, 236, 239) !important;">
<img class="card-img-top" src="/web/image/mass_mailing.s_event_default_image_1" alt=""/>
<div class="card-body">
<h3 class="card-title">
<font style="font-size: 18px;">Event One</font>
</h3>
<p><font class="text-o-color-1">25 September 2022 - 4:30 PM</font></p>
<p>London, United Kingdom</p>
<p>
<a href="#" target="_blank" class="btn btn-primary">Register Now</a>
</p>
</div>
</div>
</div>
<div class="s_col_no_bgcolor col-lg-6 pt32 pb32">
<div class="card bg-white h-100 rounded" style="border-radius: 5px !important; border-color: rgb(233, 236, 239) !important;">
<img class="card-img-top" src="/web/image/mass_mailing.s_event_default_image_2" alt=""/>
<div class="card-body">
<h3 class="card-title">
<font style="font-size: 18px">Event Two</font>
</h3>
<p><font class="text-o-color-1">26 September 2022 - 1:30 PM</font></p>
<p>London, United Kingdom</p>
<p>
<a href="#" target="_blank" class="btn btn-primary">Register Now</a>
</p>
</div>
</div>
</div>
</div>
</div>
</div>
</template>
</odoo>

View file

@ -0,0 +1,34 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="s_features" name="Features">
<div class="s_features o_mail_snippet_general">
<div class="container">
<div class="row">
<div class="col-lg-4 o_cc pt16 pb16" style="text-align: center;">
<i class="fa fa-3x fa-gear bg-primary" style="padding: 10px; border-radius: 3px !important;"></i>
<br/>
<br/>
<h3>First Feature</h3>
<p>Tell what's the value for the customer for this feature.</p>
</div>
<div class="col-lg-4 o_cc pt16 pb16" style="text-align: center;">
<i class="fa fa-3x fa-photo bg-o-color-5" style="padding: 10px; border-radius: 3px !important;"></i>
<br/>
<br/>
<h3>Second Feature</h3>
<p>Write what the customer would like to know, not what you want to show.</p>
</div>
<div class="col-lg-4 o_cc pt16 pb16" style="text-align: center;">
<i class="fa fa-3x fa-leaf bg-secondary" style="padding: 10px; border-radius: 3px !important;"></i>
<br/>
<br/>
<h3>Third Feature</h3>
<p>A small explanation of this great feature, in clear words.</p>
</div>
</div>
</div>
</div>
</template>
</odoo>

View file

@ -0,0 +1,93 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="s_features_grid" name="Features Grid">
<div class="s_mail_features_grid o_mail_snippet_general pt48 pb24">
<div class="container">
<div class="row">
<div class="col-lg-6 o_cc">
<div class="container">
<div class="row g-0">
<div class="col-lg-12 pb24">
<h2>First list of Features</h2>
<p>Add a great slogan.</p>
</div>
</div>
<div class="row">
<div class="col-lg-2 px-0" style="text-align: center;">
<i class="fa fa-2x fa-font-awesome bg-primary" style="padding: 10px; border-radius: 50px !important;"></i>
</div>
<div class="col-lg-10 pb16">
<h3>Change Icons</h3>
<p>Double click an icon to replace it with one of your choice.</p>
</div>
</div>
<div class="row">
<div class="col-lg-2 px-0" style="text-align: center;">
<i class="fa fa-2x fa-files-o bg-primary" style="padding: 10px; border-radius: 50px !important;"></i>
</div>
<div class="col-lg-10 pb16">
<h3>Duplicate</h3>
<p>Duplicate blocks and columns to add more features.</p>
</div>
</div>
<div class="row">
<div class="col-lg-2 px-0" style="text-align: center;">
<i class="fa fa-2x fa-trash bg-primary" style="padding: 10px; border-radius: 50px !important;"></i>
</div>
<div class="col-lg-10 pb16">
<h3>Delete Blocks</h3>
<p>Select and delete blocks to remove features.</p>
</div>
</div>
</div>
</div>
<div class="col-lg-6 o_cc">
<div class="container">
<div class="row g-0">
<div class="col-lg-12 pb24">
<h2>Second list of Features</h2>
<p>Add a great slogan.</p>
</div>
</div>
<div class="row">
<div class="col-lg-2 px-0" style="text-align: center;">
<i class="fa fa-2x fa-magic bg-secondary" style="padding: 10px; border-radius: 3px !important;"></i>
</div>
<div class="col-lg-10 pb16">
<h3>Great Value</h3>
<p>Turn every feature into a benefit for your reader.</p>
</div>
</div>
<div class="row">
<div class="col-lg-2 px-0" style="text-align: center;">
<i class="fa fa-2x fa-eyedropper bg-secondary" style="padding: 10px; border-radius: 3px !important;"></i>
</div>
<div class="col-lg-10 pb16">
<h3>Edit Styles</h3>
<p>You can edit colors and backgrounds to highlight features.</p>
</div>
</div>
<div class="row">
<div class="col-lg-2 px-0" style="text-align: center;">
<i class="fa fa-2x fa-picture-o bg-secondary" style="padding: 10px; border-radius: 3px !important;"></i>
</div>
<div class="col-lg-10 pb16">
<h3>Sample Icons</h3>
<p>All these icons are completely free for commercial use.</p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<record id="mass_mailing.s_features_grid_000_scss" model="ir.asset">
<field name="name">Features grid 000 SCSS</field>
<field name="bundle">web.assets_frontend</field>
<field name="path">mass_mailing/static/src/snippets/s_features_grid/000.scss</field>
</record>
</odoo>

View file

@ -0,0 +1,41 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="s_hr" name="Separator" inherit_id="web_editor.s_hr" primary="True">
<xpath expr="//div[hasclass('s_hr')]" position="attributes">
<attribute name="class" add="o_mail_snippet_general pt16 pb16" remove="pt32 pb32" separator=" "/>
</xpath>
<xpath expr="//hr" position="attributes">
<attribute name="class" remove="w-100 mx-auto" separator=" "/>
</xpath>
</template>
<template id="s_hr_options" inherit_id="mass_mailing.snippet_options">
<xpath expr="." position="inside">
<div data-selector=".s_hr" data-target="hr">
<t t-call="mass_mailing.snippet_options_border_line_widgets">
<t t-set="label">Border</t>
<t t-set="direction" t-value="'top'"/>
</t>
<we-select string="Width">
<we-button data-select-class="w-25">25%</we-button>
<we-button data-select-class="w-50">50%</we-button>
<we-button data-select-class="w-75">75%</we-button>
<we-button data-select-class="w-100" data-name="so_width_100">100%</we-button>
</we-select>
<we-button-group string="Alignment" data-dependencies="!so_width_100">
<we-button class="fa fa-fw fa-align-left" title="Left" data-select-class="me-auto"/>
<we-button class="fa fa-fw fa-align-center" title="Center" data-select-class="mx-auto"/>
<we-button class="fa fa-fw fa-align-right" title="Right" data-select-class="ms-auto"/>
</we-button-group>
</div>
</xpath>
</template>
<record id="mass_mailing.s_hr_000_scss" model="ir.asset">
<field name="name">Hr 000 SCSS</field>
<field name="bundle">web.assets_frontend</field>
<field name="path">mass_mailing/static/src/snippets/s_hr/000.scss</field>
</record>
</odoo>

View file

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="s_image_text" name="Image - Text">
<div class="s_text_image o_mail_snippet_general pt32 pb32">
<div class="container">
<div class="row align-items-center">
<div class="col-lg-6 o_cc px-0">
<img src="/web/image/mass_mailing.s_image_text_default_image" class="img w-100" />
</div>
<div class="col-lg-6 o_cc pt16 pb16">
<h3>Omnichannel sales</h3>
<p style="text-align: justify;">Get your inside sales (CRM) fully integrated with online sales (eCommerce), in-store sales (Point of Sale) and marketplaces like eBay and Amazon.</p>
<div style="text-align: left;">
<a href="#" class="btn btn-link">Read More</a>
</div>
</div>
</div>
</div>
</div>
</template>
</odoo>

View file

@ -0,0 +1,313 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Template -->
<template id="s_masonry_block" name="Masonry">
<div class="s_masonry_block o_mail_snippet_general" data-vcss="001">
<div class="container text-white">
<t t-call="mass_mailing.s_masonry_block_default_template"/>
</div>
</div>
</template>
<!-- Templates -->
<template id="s_masonry_block_default_template" groups="base.group_user">
<div class="row">
<div class="col-lg-6 oe_img_bg text-center pb224 pt224" data-name="Block" style="background-image: url(/web/image/mass_mailing.s_masonry_block_default_image_1);">
<p><br/></p>
</div>
<div class="col-lg-6 s_col_no_resize o_masonry_grid_container">
<div class="row h-100">
<div class="col-lg-6 pt24 pb8 text-center o_cc o_cc2" data-name="Block">
<h3>A great title</h3>
<p>And a great subtitle</p>
</div>
<div class="col-lg-6 pt24 pb8 text-center o_cc o_cc3" data-name="Block">
<h3>A great title</h3>
<p>And a great subtitle</p>
</div>
<div class="col-lg-6 pt24 pb8 text-center o_cc o_cc4" data-name="Block">
<h3>A great title</h3>
<p>And a great subtitle</p>
</div>
<div class="col-lg-6 pt24 pb8 text-center o_cc o_cc2" data-name="Block">
<h3>A great title</h3>
<p>And a great subtitle</p>
</div>
</div>
</div>
</div>
</template>
<template id="s_masonry_block_reversed_template" groups="base.group_user">
<div class="row">
<div class="col-lg-6 s_col_no_resize o_masonry_grid_container">
<div class="row h-100">
<div class="col-lg-6 pt24 pb8 text-center o_cc o_cc3" data-name="Block">
<h3>A great title</h3>
<p>And a great subtitle</p>
</div>
<div class="col-lg-6 pt24 pb8 text-center o_cc o_cc2" data-name="Block">
<h3>A great title</h3>
<p>And a great subtitle</p>
</div>
<div class="col-lg-6 pt24 pb8 text-center o_cc o_cc2" data-name="Block">
<h3>A great title</h3>
<p>And a great subtitle</p>
</div>
<div class="col-lg-6 pt24 pb8 text-center o_cc o_cc4" data-name="Block">
<h3>A great title</h3>
<p>And a great subtitle</p>
</div>
</div>
</div>
<div class="col-lg-6 oe_img_bg text-center pb224 pt224" data-name="Block" style="background-image: url(/web/image/mass_mailing.s_masonry_block_default_image_1);">
<p><br/></p>
</div>
</div>
</template>
<template id="s_masonry_block_images_template" groups="base.group_user">
<div class="row">
<div class="col-lg-6 oe_img_bg text-center pb224 pt224" data-name="Block" style="background-image: url(/web/image/mass_mailing.s_masonry_block_default_image_1);">
<p><br/></p>
</div>
<div class="col-lg-6 oe_img_bg text-center pb224 pt224" data-name="Block" style="background-image: url(/web/image/mass_mailing.s_masonry_block_default_image_2);">
<p><br/></p>
</div>
</div>
</template>
<template id="s_masonry_block_image_texts_image_template" groups="base.group_user">
<div class="row">
<div class="col-lg-3 oe_img_bg text-center pt224 pb224" data-name="Block" style="background-image: url(/web/image/mass_mailing.s_masonry_block_default_image_2);">
<p><br/></p>
</div>
<div class="col-lg-3 s_col_no_resize o_masonry_grid_container">
<div class="row h-100">
<div class="col-lg-12 pt24 pb8 text-center o_cc o_cc2" data-name="Block">
<h3>A great title</h3>
<p>And a great subtitle</p>
</div>
<div class="col-lg-12 pt24 pb8 text-center o_cc o_cc4" data-name="Block">
<h3>A great title</h3>
<p>And a great subtitle</p>
</div>
</div>
</div>
<div class="col-lg-6 oe_img_bg text-center pt224 pb224" data-name="Block" style="background-image: url(/web/image/mass_mailing.s_masonry_block_default_image_1);">
<p><br/></p>
</div>
</div>
</template>
<template id="s_masonry_block_mosaic_template" groups="base.group_user">
<div class="row">
<div class="col-lg-6 s_col_no_resize o_masonry_grid_container">
<div class="row">
<div class="col-lg-6 pt24 pb8 text-center o_cc o_cc3" data-name="Block">
<h3>A great title</h3>
<p>And a great subtitle</p>
</div>
<div class="col-lg-6 pt24 pb8 text-center o_cc o_cc2" data-name="Block">
<h3>A great title</h3>
<p>And a great subtitle</p>
</div>
</div>
<div class="row">
<div class="col-lg-12 oe_img_bg text-center pt224 pb224" data-name="Block"
style="background-image: url(/web/image/mass_mailing.s_masonry_block_default_image_1);">
<p><br/></p>
</div>
</div>
</div>
<div class="col-lg-6 s_col_no_resize o_masonry_grid_container">
<div class="row">
<div class="col-lg-12 oe_img_bg text-center pt224 pb224" data-name="Block"
style="background-image: url(/web/image/mass_mailing.s_masonry_block_default_image_2);">
<p><br/></p>
</div>
</div>
<div class="row">
<div class="col-lg-6 pt24 pb8 text-center o_cc o_cc2" data-name="Block">
<h3>A great title</h3>
<p>And a great subtitle</p>
</div>
<div class="col-lg-6 pt24 pb8 text-center o_cc o_cc4" data-name="Block">
<h3>A great title</h3>
<p>And a great subtitle</p>
</div>
</div>
</div>
</div>
</template>
<template id="s_masonry_block_texts_image_texts_template" groups="base.group_user">
<div class="row">
<div class="col-lg-3 s_col_no_resize o_masonry_grid_container">
<div class="row h-100">
<div class="col-lg-12 pt24 pb8 text-center o_cc o_cc3" data-name="Block">
<h3>A great title</h3>
<p>And a great subtitle</p>
</div>
<div class="col-lg-12 pt24 pb8 text-center o_cc o_cc2" data-name="Block">
<h3>A great title</h3>
<p>And a great subtitle</p>
</div>
</div>
</div>
<div class="col-lg-6 oe_img_bg text-center pt224 pb224" data-name="Block"
style="background-image: url(/web/image/mass_mailing.s_masonry_block_default_image_1);">
<p><br/></p>
</div>
<div class="col-lg-3 s_col_no_resize o_masonry_grid_container">
<div class="row h-100">
<div class="col-lg-12 pt24 pb8 text-center o_cc o_cc2" data-name="Block">
<h3>A great title</h3>
<p>And a great subtitle</p>
</div>
<div class="col-lg-12 pt24 pb8 text-center o_cc o_cc4" data-name="Block">
<h3>A great title</h3>
<p>And a great subtitle</p>
</div>
</div>
</div>
</div>
</template>
<template id="s_masonry_block_alternation_text_template" groups="base.group_user">
<div class="row">
<div class="col-lg-3 pt24 pb8 text-center o_cc o_cc2" data-name="Block">
<h3>A great title</h3>
<p>And a great subtitle</p>
</div>
<div class="col-lg-3 pt24 pb8 text-center o_cc o_cc4" data-name="Block">
<h3>A great title</h3>
<p>And a great subtitle</p>
</div>
<div class="col-lg-3 pt24 pb8 text-center o_cc o_cc2" data-name="Block">
<h3>A great title</h3>
<p>And a great subtitle</p>
</div>
<div class="col-lg-3 pt24 pb8 text-center o_cc o_cc3" data-name="Block">
<h3>A great title</h3>
<p>And a great subtitle</p>
</div>
</div>
</template>
<template id="s_masonry_block_alternation_text_image_template" groups="base.group_user">
<div class="row">
<div class="col-lg-3 pt24 pb8 text-center o_cc o_cc2" data-name="Block">
<h3>A great title</h3>
<p>And a great subtitle</p>
</div>
<div class="col-lg-3 oe_img_bg text-center pt224 pb224" data-name="Block" style="background-image: url(/web/image/mass_mailing.s_masonry_block_default_image_1);">
<p><br/></p>
</div>
<div class="col-lg-3 pt24 pb8 text-center o_cc o_cc2" data-name="Block">
<h3>A great title</h3>
<p>And a great subtitle</p>
</div>
<div class="col-lg-3 oe_img_bg text-center pt224 pb224" data-name="Block" style="background-image: url(/web/image/mass_mailing.s_masonry_block_default_image_2);">
<p><br/></p>
</div>
</div>
</template>
<template id="s_masonry_block_alternation_image_text_template" groups="base.group_user">
<div class="row">
<div class="col-lg-3 oe_img_bg text-center pt224 pb224" data-name="Block" style="background-image: url(/web/image/mass_mailing.s_masonry_block_default_image_1);">
<p><br/></p>
</div>
<div class="col-lg-3 pt24 pb8 text-center o_cc o_cc4" data-name="Block">
<h3>A great title</h3>
<p>And a great subtitle</p>
</div>
<div class="col-lg-3 oe_img_bg text-center pt224 pb224" data-name="Block" style="background-image: url(/web/image/mass_mailing.s_masonry_block_default_image_2);">
<p><br/></p>
</div>
<div class="col-lg-3 pt24 pb8 text-center o_cc o_cc3" data-name="Block">
<h3>A great title</h3>
<p>And a great subtitle</p>
</div>
</div>
</template>
<template id="s_masonry_block_alternation_text_image_text_template" groups="base.group_user">
<div class="row">
<div class="col-lg-3 pt24 pb8 text-center o_cc o_cc2" data-name="Block">
<h3>A great title</h3>
<p>And a great subtitle</p>
</div>
<div class="col-lg-6 oe_img_bg text-center pt224 pb224" data-name="Block" style="background-image: url(/web/image/mass_mailing.s_masonry_block_default_image_1);">
<p><br/></p>
</div>
<div class="col-lg-3 pt24 pb8 text-center o_cc o_cc2" data-name="Block">
<h3>A great title</h3>
<p>And a great subtitle</p>
</div>
</div>
</template>
<!-- Options -->
<template id="s_masonry_block_options" inherit_id="mass_mailing.snippet_options">
<xpath expr="//div[@data-js='layout_column']" position="after">
<div data-js="MasonryLayout" data-selector=".s_masonry_block">
<we-select string="Template"
data-name="masonry_template_opt"
data-attribute-name="masonryTemplate"
data-attribute-default-value="default">
<we-button title="Default"
data-select-template="mass_mailing.s_masonry_block_default_template"
data-select-data-attribute="default"
data-img="/mass_mailing/static/src/img/snippets_options/masonry_template_default.svg"/>
<we-button title="Default Reversed"
data-select-template="mass_mailing.s_masonry_block_reversed_template"
data-select-data-attribute="default_reversed"
data-img="/mass_mailing/static/src/img/snippets_options/masonry_template_reversed.svg"/>
<we-button title="Images"
data-select-template="mass_mailing.s_masonry_block_images_template"
data-select-data-attribute="images"
data-img="/mass_mailing/static/src/img/snippets_options/masonry_template_images.svg"/>
<we-button title="Image Text Image"
data-select-template="mass_mailing.s_masonry_block_image_texts_image_template"
data-select-data-attribute="image_text_image"
data-img="/mass_mailing/static/src/img/snippets_options/masonry_template_image_texts_image.svg"/>
<we-button title="Mosaic"
data-select-template="mass_mailing.s_masonry_block_mosaic_template"
data-select-data-attribute="mosaic"
data-img="/mass_mailing/static/src/img/snippets_options/masonry_template_mosaic.svg"/>
<we-button title="Text Image Text"
data-select-template="mass_mailing.s_masonry_block_texts_image_texts_template"
data-select-data-attribute="text_image_text"
data-img="/mass_mailing/static/src/img/snippets_options/masonry_template_texts_image_texts.svg"/>
<we-button title="Alternate Text"
data-select-template="mass_mailing.s_masonry_block_alternation_text_template"
data-select-data-attribute="alternate_text"
data-img="/mass_mailing/static/src/img/snippets_options/masonry_template_alternate_texts.svg"/>
<we-button title="Alternate Text Image"
data-select-template="mass_mailing.s_masonry_block_alternation_text_image_template"
data-select-data-attribute="alternate_text_image"
data-img="/mass_mailing/static/src/img/snippets_options/masonry_template_alternate_text_image.svg"/>
<we-button title="Alternate Image Text"
data-select-template="mass_mailing.s_masonry_block_alternation_image_text_template"
data-select-data-attribute="alternate_image_text"
data-img="/mass_mailing/static/src/img/snippets_options/masonry_template_alternate_image_text.svg"/>
<we-button title="Alternate Text Image Text"
data-select-template="mass_mailing.s_masonry_block_alternation_text_image_text_template"
data-select-data-attribute="alternate_text_image_text"
data-img="/mass_mailing/static/src/img/snippets_options/masonry_template_alternate_text_image_text.svg"/>
</we-select>
</div>
</xpath>
</template>
<!-- Assets -->
<record id="mass_mailing.s_masonry_block_001_scss" model="ir.asset">
<field name="name">Masonry block 001 SCSS</field>
<field name="bundle">web.assets_frontend</field>
<field name="path">mass_mailing/static/src/snippets/s_masonry_block/001.scss</field>
</record>
</odoo>

View file

@ -0,0 +1,54 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="s_media_list" name="Media List">
<div class="s_media_list o_mail_snippet_general pt8 pb8 o_cc o_cc2" data-vcss="001">
<div class="container">
<div class="row s_nb_column_fixed">
<div class="col-lg-12 s_media_list_item pt8 pb8" data-name="Media item">
<div class="row s_col_no_resize s_col_no_bgcolor align-items-center o_cc o_cc1">
<div class="col-lg-4 s_media_list_img_wrapper align-self-stretch px-0">
<img src="/web/image/mass_mailing.s_media_list_default_image_1" class="s_media_list_img h-100 w-100" alt=""/>
</div>
<div class="col-lg-8 s_media_list_body">
<h3>Media heading</h3>
<p>Use this snippet to build various types of components that feature a left- or right-aligned image alongside textual content. Duplicate the element to create a list that fits your needs.</p>
<a href="#" class="btn btn-primary">Discover</a>
</div>
</div>
</div>
<div class="col-lg-12 s_media_list_item pt8 pb8" data-name="Media item">
<div class="row s_col_no_resize s_col_no_bgcolor align-items-center o_cc o_cc1">
<div class="col-lg-4 s_media_list_img_wrapper align-self-stretch px-0">
<img src="/web/image/mass_mailing.s_media_list_default_image_2" class="s_media_list_img h-100 w-100" alt=""/>
</div>
<div class="col-lg-8 s_media_list_body">
<h3>Event heading</h3>
<p>Speakers from all over the world will join our experts to give inspiring talks on various topics. Stay on top of the latest business management trends &amp; technologies</p>
</div>
</div>
</div>
<div class="col-lg-12 s_media_list_item pt8 pb8" data-name="Media item">
<div class="row s_col_no_resize s_col_no_bgcolor align-items-center o_cc o_cc1">
<div class="col-lg-4 s_media_list_img_wrapper align-self-stretch px-0">
<img src="/web/image/mass_mailing.s_media_list_default_image_3" class="s_media_list_img h-100 w-100" alt=""/>
</div>
<div class="col-lg-8 s_media_list_body">
<h3>Post heading</h3>
<p>Use this component for creating a list of featured elements to which you want to bring attention.</p>
<a href="#">Continue reading <i class="fa fa-long-arrow-right align-middle ms-1"/></a>
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<record id="mass_mailing.s_media_list_001_scss" model="ir.asset">
<field name="name">Media list 001 SCSS</field>
<field name="bundle">web.assets_frontend</field>
<field name="path">mass_mailing/static/src/snippets/s_media_list/001.scss</field>
</record>
</odoo>

View file

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="s_numbers" name="Numbers">
<div class="s_numbers o_mail_snippet_general o_cc o_cc1">
<div class="container">
<div class="row">
<div class="col-lg-4 pt24 pb24 o_cc o_cc2" style="text-align: center;">
<span style="font-size: 48px;">12</span>
<p>Useful options</p>
</div>
<div class="col-lg-4 pt24 pb24 o_cc o_cc4" style="text-align: center;">
<span style="font-size: 48px;">45</span>
<p>Beautiful snippets</p>
</div>
<div class="col-lg-4 pt24 pb24 o_cc o_cc2" style="text-align: center;">
<span style="font-size: 48px;">8</span>
<p>Amazing pages</p>
</div>
</div>
</div>
</div>
</template>
</odoo>

View file

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="s_picture" name="Picture">
<div class="s_picture o_mail_snippet_general pt48 pb24 o_cc o_cc2" style="padding-left: 15px; padding-right: 15px;">
<div class="container s_allow_columns">
<h2 style="text-align: center;">
<font style="font-size: 48px;">A Punchy Headline</font>
</h2>
<p style="text-align: center;">With strong technical foundations, Odoo's framework is unique. It provides <span style="font-weight: bolder;">top notch usability that scales across all apps</span>.</p>
<img src="/web/image/mass_mailing.s_picture_default_image" style="padding: 10px;" class="mx-auto d-block mw-100" width="500" alt=""/>
<p style="text-align: center;"><font style="font-size: 12px;">Add a caption to enhance the meaning of this image.</font></p>
</div>
</div>
</template>
</odoo>

View file

@ -0,0 +1,34 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="s_product_list" name="Items">
<div class="s_mail_product_list o_mail_snippet_general">
<div class="container">
<div class="row">
<div class="col-lg-4 o_cc pt16 pb16">
<a href="">
<img src="/web/image/mass_mailing.s_product_list_default_image_1" alt="" class="img img-fluid" style="padding: 15px 0px"/>
</a>
<p style="text-align: center;">Check out all our furniture</p>
<p style="text-align: center;"><a class="btn btn-primary" href="#">Furniture</a></p>
</div>
<div class="col-lg-4 o_cc pt16 pb16">
<a href="">
<img src="/web/image/mass_mailing.s_product_list_default_image_2" alt="" class="img img-fluid" style="padding: 15px 0px"/>
</a>
<p style="text-align: center;">Check out all our clothes</p>
<p style="text-align: center;"><a class="btn btn-primary" href="#">Clothes</a></p>
</div>
<div class="col-lg-4 o_cc pt16 pb16">
<a href="">
<img src="/web/image/mass_mailing.s_product_list_default_image_3" alt="" class="img img-fluid" style="padding: 15px 0px"/>
</a>
<p style="text-align: center;">Check out all our books</p>
<p style="text-align: center;"><a class="btn btn-primary" href="#">Books</a></p>
</div>
</div>
</div>
</div>
</template>
</odoo>

View file

@ -0,0 +1,72 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="s_rating" name="Rating">
<div class="s_rating o_mail_snippet_general pt16 pb16" style="padding-left: 15px; padding-right: 15px;" data-vcss="001" data-icon="fa-star">
<h3>Quality</h3>
<div class="s_rating_icons o_not_editable">
<span class="s_rating_active_icons">
<i class="fa fa-star"></i>
<i class="fa fa-star"></i>
<i class="fa fa-star"></i>
</span>
<span class="s_rating_inactive_icons">
<i class="fa fa-star-o"></i>
<i class="fa fa-star-o"></i>
</span>
</div>
</div>
</template>
<template id="s_rating_options" inherit_id="mass_mailing.snippet_options">
<xpath expr="." position="inside">
<div data-js="Rating" data-selector=".s_rating">
<we-select string="Icon">
<we-button data-set-icons="fa-star"><i class="fa fa-fw fa-star"/> Stars</we-button>
<we-button data-set-icons="fa-thumbs-up"><i class="fa fa-fw fa-thumbs-up"/> Thumbs</we-button>
<we-button data-set-icons="fa-circle"><i class="fa fa-fw fa-circle"/> Circles</we-button>
<we-button data-set-icons="fa-square"><i class="fa fa-fw fa-square"/> Squares</we-button>
<we-button data-set-icons="fa-heart"><i class="fa fa-fw fa-heart"/> Hearts</we-button>
<we-button data-set-icons="custom" class="d-none">Custom</we-button>
</we-select>
<we-row string="&#8985; Active">
<we-colorpicker data-select-style="" data-apply-to=".s_rating_active_icons" data-css-property="color" data-color-prefix="text-"/>
<we-button data-custom-icon="true" data-custom-active-icon="true" data-no-preview="true">
<i class="fa fa-fw fa-refresh me-1"/> Replace Icon
</we-button>
</we-row>
<we-row string="&#8985; Inactive">
<we-colorpicker data-select-style="" data-apply-to=".s_rating_inactive_icons" data-css-property="color" data-color-prefix="text-"/>
<we-button data-custom-icon="true" data-custom-active-icon="false" data-no-preview="true">
<i class="fa fa-fw fa-refresh me-1"/> Replace Icon
</we-button>
</we-row>
<we-row string="Score">
<we-input data-active-icons-number="true" data-step="1"/>
<span class="mx-2">/</span>
<we-input data-total-icons-number="true" data-step="1"/>
</we-row>
<we-button-group string="Size" data-apply-to=".s_rating_icons">
<we-button data-select-class="" title="Small" data-img="/website/static/src/img/snippets_options/size_small.svg"/>
<we-button data-select-class="fa-2x" title="Medium" data-img="/website/static/src/img/snippets_options/size_medium.svg"/>
<we-button data-select-class="fa-3x" title="Large" data-img="/website/static/src/img/snippets_options/size_large.svg"/>
</we-button-group>
<we-checkbox string="Display Inline" data-select-class="s_rating_inline" data-no-preview="true"/>
</div>
</xpath>
</template>
<record id="mass_mailing.s_rating_000_scss" model="ir.asset">
<field name="name">Rating 000 SCSS</field>
<field name="bundle">web.assets_frontend</field>
<field name="path">mass_mailing/static/src/snippets/s_rating/000.scss</field>
<field name="active" eval="False"/>
</record>
<record id="mass_mailing.s_rating_001_scss" model="ir.asset">
<field name="name">Rating 001 SCSS</field>
<field name="bundle">web.assets_frontend</field>
<field name="path">mass_mailing/static/src/snippets/s_rating/001.scss</field>
</record>
</odoo>

View file

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="s_references" name="References">
<div class="s_references o_mail_snippet_general pt32 pb32">
<div class="container">
<h2 style="text-align: center;">Our References</h2>
<p style="text-align: center;">We are in good company.</p>
<div class="row">
<div class="col-lg-3 pt16 pb16">
<img src="/web/image/mass_mailing.s_reference_default_image_1" class="img img-fluid mx-auto" alt=""/>
</div>
<div class="col-lg-3 pt16 pb16">
<img src="/web/image/mass_mailing.s_reference_default_image_2" class="img img-fluid mx-auto" alt=""/>
</div>
<div class="col-lg-3 pt16 pb16">
<img src="/web/image/mass_mailing.s_reference_default_image_3" class="img img-fluid mx-auto" alt=""/>
</div>
<div class="col-lg-3 pt16 pb16">
<img src="/web/image/mass_mailing.s_reference_default_image_4" class="img img-fluid mx-auto" alt=""/>
</div>
</div>
</div>
</div>
</template>
</odoo>

View file

@ -0,0 +1,48 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="s_showcase" name="Showcase">
<div class="s_showcase o_mail_snippet_general pt48 pb48">
<!-- TODO: (below) issue with height: `fit-content` is not supported, can we calculate it in px in translation ?
empty div height is 0 unless table has defined height (div.col-1 > div.w-50.h100.border-end)-->
<div class="container" style="height: fit-content;">
<div class="row g-0 s_col_no_resize s_col_no_bgcolor s_nb_column_fixed">
<div class="col-lg-6 pb24" style="text-align: right; padding-right: 70px;" align="right">
<div class="mb-2">
<h3 class="d-inline-block">First feature</h3>
<i class="fa fa-2x fa-desktop text-secondary ms-3"/>
</div>
<p>A short description of this great feature.</p>
</div>
<div class="col-lg-6 pb24 border-start" style="padding-left: 70px;" align="left">
<div class="mb-2">
<i class="fa fa-2x fa-heart text-secondary me-3"/>
<h3 class="d-inline-block">Another feature</h3>
</div>
<p>A short description of this great feature.</p>
</div>
</div>
<div class="row g-0 s_col_no_resize s_col_no_bgcolor s_nb_column_fixed">
<div class="col-lg-6" style="text-align: right; padding-right: 70px;" align="right">
<div class="mb-2">
<h3 class="d-inline-block">Second feature</h3>
<i class="fa fa-2x fa-paint-brush text-secondary ms-3"/>
</div>
<p>A short description of this great feature.</p>
</div>
<div class="col-lg-6 border-start" style="padding-left: 70px;" align="left">
<div class="mb-2">
<i class="fa fa-2x fa-gift text-secondary me-3"/>
<h3 class="d-inline-block">Last Feature</h3>
</div>
<p>A short description of this great feature.</p>
</div>
</div>
</div>
<div class="container pt32" style="text-align: center;" align="center">
<a href="#" class="btn btn-primary">Discover all the features</a>
</div>
</div>
</template>
</odoo>

View file

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="s_text_block" name="Text">
<div class="s_text_block o_mail_snippet_general pt40 pb40" style="padding-left: 15px; padding-right: 15px;">
<div class="container s_allow_columns">
<p> The open source model of Odoo has allowed us to leverage thousands of developers and
business experts to build hundreds of apps in just a few years.</p>
<p> With strong technical foundations, Odoo's framework is unique.
It provides top notch usability that scales across all apps.</p>
<p> Usability improvements made on Odoo will automatically apply to all
of our fully integrated apps.</p>
<p> That way, Odoo evolves much faster than any other solution.</p>
</div>
</div>
</template>
</odoo>

View file

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="s_text_highlight" name="Text Highlight">
<div class="s_mail_text_highlight o_mail_snippet_general o_cc o_cc3 pt32 pb32 w-100">
<h3 style="text-align: center;">Text Highlight</h3>
<p style="text-align: center;">Put the focus on what you have to say!</p>
</div>
</template>
</odoo>

View file

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="s_text_image" name="Text - Image">
<div class="s_text_image o_mail_snippet_general">
<div class="container">
<div class="row align-items-center">
<div class="col-lg-6 o_cc pt16 pb16">
<h3>A unique value</h3>
<p style="text-align: justify;">The open source model of Odoo has allowed us to leverage thousands of developers and business experts to build hundreds of apps in just a few years.</p>
<div style="text-align: left;">
<a href="#" class="btn btn-link">Read More</a>
</div>
</div>
<div class="col-lg-6 px-0">
<img src="/web/image/mass_mailing.s_text_image_default_image" class="img w-100"/>
</div>
</div>
</div>
</div>
</template>
</odoo>

View file

@ -0,0 +1,40 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="s_three_columns" name="Columns">
<div class="s_three_columns o_mail_snippet_general o_cc o_cc2 pt32 pb32">
<div class="container">
<div class="row d-flex align-items-stretch">
<div class="col-lg-4 s_col_no_bgcolor pt16 pb16">
<div class="card text-bg-white h-100">
<img class="card-img-top" src="/web/image/mass_mailing.s_three_columns_default_image_1" alt=""/>
<div class="card-body">
<h3 class="card-title">Feature One</h3>
<p class="card-text">Adapt these three columns to fit your design need. To duplicate, delete or move columns, select the column and use the top icons to perform your action.</p>
</div>
</div>
</div>
<div class="col-lg-4 s_col_no_bgcolor pt16 pb16">
<div class="card text-bg-white h-100">
<img class="card-img-top" src="/web/image/mass_mailing.s_three_columns_default_image_2" alt=""/>
<div class="card-body">
<h3 class="card-title">Feature Two</h3>
<p class="card-text">To add a fourth column, reduce the size of these three columns using the right icon of each block. Then, duplicate one of the columns to create a new one as a copy.</p>
</div>
</div>
</div>
<div class="col-lg-4 s_col_no_bgcolor pt16 pb16">
<div class="card text-bg-white h-100">
<img class="card-img-top" src="/web/image/mass_mailing.s_three_columns_default_image_3" alt=""/>
<div class="card-body">
<h3 class="card-title">Feature Three</h3>
<p class="card-text">Delete the above image or replace it with a picture that illustrates your message. Click on the picture to change its <em>rounded corner</em> style.</p>
</div>
</div>
</div>
</div>
</div>
</div>
</template>
</odoo>

View file

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="s_title" name="Title">
<div class="s_title o_mail_snippet_general pt32 pb32">
<div class="container s_allow_columns">
<h1 style="text-align:center">Your Title</h1>
</div>
</div>
</template>
</odoo>

View file

@ -0,0 +1,839 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Snippets & Themes Menu -->
<template id="email_designer_snippets" inherit_id="web_editor.snippets" primary="True" groups="base.group_user">
<xpath expr="//div[hasclass('o_we_website_top_actions')]" position="inside">
<div class="email_designer_top_actions">
<button class="o_codeview_btn btn btn-primary">
<i class="fa fa-code"></i>
</button>
<button class="o_mobile_preview_btn btn btn-primary">
<i class="fa fa-lg fa-mobile"/>
</button>
<button class="o_fullscreen_btn btn btn-primary">
<img class="img-fluid" src="/web_editor/font_to_img/61541/rgb(255,255,255)/16" alt="Fullscreen"/>
</button>
</div>
</xpath>
<xpath expr="//div[@id='snippets_menu']" position="inside">
<button type="button" tabindex="3" class="o_we_customize_design_btn text-uppercase" accesskey="2">
<span>Design</span>
</button>
</xpath>
<xpath expr="//t[@id='default_snippets']" position="replace">
<t id="default_snippets">
<t t-set="company_id" t-value="res_company"/>
<div id="email_designer_themes" class="d-none">
<div data-name="basic"
title="Plain Text"
data-nowrap="1"
data-img="/mass_mailing/static/src/img/theme_imgs/basic_thumb"
data-images-info='{"logo": {"format": "png"}}'>
<t t-call="mass_mailing.theme_basic_template"/>
</div>
<div data-name="empty"
title="Start From Scratch"
data-img="/mass_mailing/static/src/img/theme_imgs/empty_thumb"
data-images-info='{"logo": {"format": "png"}}'
data-hide-from-mobile="true">
<t t-call="mass_mailing.theme_empty_template"/>
</div>
<div data-name="default"
title="Welcome Message"
data-img="/mass_mailing/static/src/img/theme_imgs/default_thumb"
data-images-info='{"logo": {"format": "png"}, "header_logo": {"format": "png"}}'>
<t t-call="mass_mailing.theme_default_template"/>
</div>
</div>
<div id="email_designer_default_headers" class="o_panel">
<div class="o_panel_header">Headers</div>
<div class="o_panel_body" id="email_designer_header_elements">
<t t-snippet="mass_mailing.s_mail_block_header_social" string="Left Logo" t-thumbnail="/mass_mailing/static/src/img/snippets_thumbs/block_header_social.png"/>
<t t-snippet="mass_mailing.s_mail_block_header_text_social" string="Left Text" t-thumbnail="/mass_mailing/static/src/img/snippets_thumbs/block_header_text_social.png"/>
<t t-snippet="mass_mailing.s_mail_block_header_logo" string="Centered Logo" t-thumbnail="/mass_mailing/static/src/img/snippets_thumbs/block_header_logo.png"/>
<t t-snippet="mass_mailing.s_cover" string="Cover" t-thumbnail="/mass_mailing/static/src/img/snippets_thumbs/s_cover.svg"/>
<t t-snippet="mass_mailing.s_mail_block_header_view" string="View Online" t-thumbnail="/mass_mailing/static/src/img/snippets_thumbs/block_header_browser.png"/>
</div>
</div>
<div id="email_designer_default_body" class="o_panel">
<div class="o_panel_header">Body</div>
<div class="o_panel_body" id="email_designer_body_elements">
<t t-snippet="mass_mailing.s_title" string="Title" t-thumbnail="/mass_mailing/static/src/img/snippets_thumbs/s_title.svg"/>
<t t-snippet="mass_mailing.s_text_block" string="Text" t-thumbnail="/mass_mailing/static/src/img/snippets_thumbs/s_text_block.svg"/>
<t t-snippet="mass_mailing.s_comparisons" string="Comparisons" t-thumbnail="/mass_mailing/static/src/img/snippets_thumbs/s_comparisons.svg"/>
<t t-snippet="mass_mailing.s_color_blocks_2" string="Big Boxes" t-thumbnail="/mass_mailing/static/src/img/snippets_thumbs/s_color_blocks_2.svg"/>
<t t-snippet="mass_mailing.s_three_columns" string="Columns" t-thumbnail="/mass_mailing/static/src/img/snippets_thumbs/s_three_columns.svg"/>
<t t-snippet="mass_mailing.s_image_text" string="Image - Text" t-thumbnail="/mass_mailing/static/src/img/snippets_thumbs/s_image_text.svg"/>
<t t-snippet="mass_mailing.s_text_image" string="Text - Image" t-thumbnail="/mass_mailing/static/src/img/snippets_thumbs/s_text_image.svg"/>
<t t-snippet="mass_mailing.s_picture" string="Picture" t-thumbnail="/mass_mailing/static/src/img/snippets_thumbs/s_picture.svg"/>
<t t-snippet="mass_mailing.s_features" string="Features" t-thumbnail="/mass_mailing/static/src/img/snippets_thumbs/s_features.svg"/>
<t t-snippet="mass_mailing.s_numbers" string="Numbers" t-thumbnail="/mass_mailing/static/src/img/snippets_thumbs/s_numbers.svg"/>
<t t-snippet="mass_mailing.s_masonry_block" string="Masonry" t-thumbnail="/mass_mailing/static/src/img/snippets_thumbs/s_masonry_block.svg"/>
<t t-snippet="mass_mailing.s_media_list" string="Media List" t-thumbnail="/mass_mailing/static/src/img/snippets_thumbs/s_media_list.svg"/>
<t t-snippet="mass_mailing.s_showcase" string="Showcase" t-thumbnail="/mass_mailing/static/src/img/snippets_thumbs/s_showcase.svg"/>
</div>
</div>
<div id="email_designer_default_extra" class="o_panel">
<div class="o_panel_header">Marketing Content</div>
<div class="o_panel_body" id="email_designer_marketing_elements">
<t t-snippet="mass_mailing.s_company_team" string="Team" t-thumbnail="/mass_mailing/static/src/img/snippets_thumbs/s_company_team.svg"/>
<t t-snippet="mass_mailing.s_call_to_action" string="Call to Action" t-thumbnail="/mass_mailing/static/src/img/snippets_thumbs/s_call_to_action.svg"/>
<t t-snippet="mass_mailing.s_references" string="References" t-thumbnail="/mass_mailing/static/src/img/snippets_thumbs/s_references.svg"/>
<t t-snippet="mass_mailing.s_coupon_code" string="Promo Code" t-thumbnail="/mass_mailing/static/src/img/snippets_thumbs/block_discount2.png"/>
<t t-snippet="mass_mailing.s_mail_block_discount1" string="Discount Offer" t-thumbnail="/mass_mailing/static/src/img/snippets_thumbs/block_discount1.png"/>
<t t-snippet="mass_mailing.s_event" string="Event" t-thumbnail="/mass_mailing/static/src/img/snippets_thumbs/s_event.svg"/>
<t t-snippet="mass_mailing.s_product_list" string="Items" t-thumbnail="/mass_mailing/static/src/img/snippets_thumbs/s_product_list.svg"/>
<t t-snippet="mass_mailing.s_features_grid" string="Features Grid" t-thumbnail="/mass_mailing/static/src/img/snippets_thumbs/s_features_grid.svg"/>
</div>
</div>
<div id="email_designer_default_inner" class="o_panel">
<div class="o_panel_header">Inner Content</div>
<div class="o_panel_body" id="email_designer_inner_elements">
<t t-snippet="mass_mailing.s_alert" string="Alert" t-thumbnail="/mass_mailing/static/src/img/snippets_thumbs/s_alert.svg"/>
<t t-snippet="mass_mailing.s_rating" string="Rating" t-thumbnail="/mass_mailing/static/src/img/snippets_thumbs/s_rating.svg"/>
<t t-snippet="mass_mailing.s_blockquote" string="Blockquote" t-thumbnail="/mass_mailing/static/src/img/snippets_thumbs/s_blockquote.svg"/>
<t t-snippet="mass_mailing.s_hr" string="Separator" t-thumbnail="/web_editor/static/src/img/snippets_thumbs/s_hr.svg"/>
<t t-snippet="mass_mailing.s_text_highlight" string="Text Highlight" t-thumbnail="/mass_mailing/static/src/img/snippets_thumbs/s_text_highlight.svg"/>
</div>
</div>
<div id="email_designer_default_footer" class="o_panel">
<div class="o_panel_header">Footers</div>
<div class="o_panel_body" id="email_designer_footer_elements">
<t t-snippet="mass_mailing.s_mail_block_footer_social" string="Footer Center" t-thumbnail="/mass_mailing/static/src/img/snippets_thumbs/block_footer_social.png"/>
<t t-snippet="mass_mailing.s_mail_block_footer_social_left" string="Footer Left" t-thumbnail="/mass_mailing/static/src/img/snippets_thumbs/block_footer_social_left.png"/>
</div>
</div>
</t>
</xpath>
<xpath expr="//div[@id='snippet_options']/t" position="attributes">
<attribute name="t-call">mass_mailing.snippet_options</attribute>
</xpath>
</template>
<!-- Snippet Templates -->
<template id="s_mail_block_header_social" name="Left Logo">
<div class="s_header_social o_mail_block_header_social o_mail_snippet_general pt16 pb16">
<div class="container">
<div class="row">
<div class="col-lg-4 pt16 pb16">
<a t-att-href="(company_id.website) or '#'" style="text-decoration:none;float:none;" target="_blank">
<img t-if="company_id.logo" border="0" t-att-src="image_data_uri(company_id.logo)" style="height:auto;max-width:100%;" />
</a>
</div>
<div class="col-lg-8 o_mail_header_social" style="text-align: right;">
<t t-call="mass_mailing.social_links"/>
</div>
</div>
</div>
</div>
</template>
<template id="s_mail_block_header_text_social" name="Left Text">
<div class="s_header_text_social o_mail_block_header_text_social o_mail_snippet_general">
<div class="container">
<div class="row">
<div class="col-lg-4 pt16 pb16">
<h1>
<a t-att-href="(company_id.website) or '#'" target="_blank">
My Company
</a>
</h1>
</div>
<div class="col-lg-8 o_mail_header_social" style="text-align: right;">
<t t-call="mass_mailing.social_links"/>
</div>
</div>
</div>
</div>
</template>
<template id="s_mail_block_header_logo" name="Centered Logo">
<div class="s_header_logo o_mail_block_header_logo o_mail_snippet_general">
<div class="container">
<div class="row">
<div class="col-lg-3"/>
<div class="col-lg-6" style="text-align: center;">
<a t-att-href="(company_id.website) or '#'" style="text-decoration:none;" target="_blank">
<img t-if="company_id.logo" border="0" t-att-src="image_data_uri(company_id.logo)" style="height:auto;max-width:100%;"/>
</a>
</div>
<div class="col-lg-3" style="text-align: right;"/>
</div>
</div>
</div>
</template>
<template id="s_mail_block_header_view" name="View Online">
<div class="o_snippet_view_in_browser o_mail_snippet_general pt16 pb16" style="text-align: center; padding-left: 15px; padding-right: 15px;">
<a href="/view">
View Online
</a>
</div>
</template>
<template id="s_mail_block_discount1" name="Discount Offer">
<div class="s_discount1 o_mail_block_discount1 o_mail_snippet_general pt0 pb16">
<div class="container">
<div class="row">
<div class="col-lg-6 pt16">
<h3 style="text-align: center;"><font class="text-o-color-2"><span style="font-weight:bolder;">-20%</span></font></h3>
<p style="text-align: center;">ON YOUR NEXT ORDER!</p>
<div style="text-align: center;">
<a role="button" href="#" class="btn btn-primary">Redeem Discount!</a>
</div>
</div>
<div class="col-lg-6 pt16">
<p>We are continuing to grow and we miss seeing you be a part of it! We've increased store hours and have lot's of new brands available. To welcome you back please accept this 20% discount on you next purchase by clicking the button.</p>
</div>
</div>
</div>
</div>
</template>
<template id="s_mail_block_footer_social" name="Footer Center">
<div class="s_footer_social o_mail_block_footer_social o_mail_footer_social_center o_mail_snippet_general bg-200 pt16">
<div class="container">
<div class="row">
<div class="col-lg o_mail_footer_social" style="text-align: center;">
<t t-call="mass_mailing.social_links"/>
</div>
</div>
<div class="row">
<div class="col-lg o_mail_footer_links" style="text-align: center;">
<a role="button" href="/unsubscribe_from_list" class="btn btn-link">Unsubscribe</a>
</div>
</div>
<div class="row">
<div class="col-lg">
<p style="text-align: center;">
© <t t-esc="datetime.datetime.now().year"/> All Rights Reserved
</p>
</div>
</div>
</div>
</div>
</template>
<template id="s_mail_block_footer_social_left" name="Footer Left">
<div class="s_footer_social o_mail_block_footer_social o_mail_footer_social_left o_mail_snippet_general pt16">
<div class="container">
<div class="row">
<div class="col-lg o_mail_footer_description">
<p t-if="res_company">
<strong><t t-esc="res_company.partner_id.name"/></strong>
</p>
<div class="o_mail_footer_links">
<a role="button" href="/unsubscribe_from_list" class="btn btn-link">Unsubscribe</a>
</div>
</div>
<div class="col-lg" align="right">
<div class="o_mail_footer_social pb16"><t t-call="mass_mailing.social_links"/></div>
<p class="o_mail_footer_copy">© <t t-esc="datetime.datetime.now().year"/> All Rights Reserved</p>
</div>
</div>
</div>
</div>
</template>
<template id="social_links">
<t t-set="social_links" t-value="company_id._get_social_media_links()"/>
<a t-att-href="social_links.get('social_facebook')" aria-label="Facebook" title="Facebook">
<span class="fa fa-facebook"></span>
</a>&amp;nbsp;&amp;nbsp;
<a t-att-href="social_links.get('social_linkedin')" style="margin-left:10px" aria-label="LinkedIn" title="LinkedIn">
<span class="fa fa-linkedin"></span>
</a>&amp;nbsp;&amp;nbsp;
<a t-att-href="social_links.get('social_twitter')" style="margin-left:10px" aria-label="Twitter" title="Twitter">
<span class="fa fa-twitter"></span>
</a>&amp;nbsp;&amp;nbsp;
<a t-att-href="social_links.get('social_instagram')" style="margin-left:10px" aria-label="Instagram" title="Instagram">
<span class="fa fa-instagram"></span>
</a>
</template>
<!-- Border -->
<template id="snippet_options_border_line_widgets">
<we-row t-att-string="label">
<we-input data-name="border_width_opt"
t-att-data-apply-to="apply_to"
data-select-style="0"
t-attf-data-css-property="border-#{direction and ('%s-' % direction) or ''}width"
data-unit="px"
t-att-data-extra-class="with_bs_class and 'border'"
t-att-data-variable="width_variable"/>
<we-select t-attf-data-css-property="border-#{direction and ('%s-' % direction) or ''}style"
data-dependencies="border_width_opt"
t-att-data-apply-to="apply_to"
t-att-data-variable="style_variable">
<we-button title="Solid" data-select-style="solid"><div class="o_we_fake_img_item o_we_border_preview" style="border-style: solid;"/></we-button>
<we-button title="Dashed" data-select-style="dashed"><div class="o_we_fake_img_item o_we_border_preview" style="border-style: dashed;"/></we-button>
<we-button title="Dotted" data-select-style="dotted"><div class="o_we_fake_img_item o_we_border_preview" style="border-style: dotted;"/></we-button>
<we-button title="Double" data-select-style="double"><div class="o_we_fake_img_item o_we_border_preview" style="border-style: double; border-left: none; border-right: none;"/></we-button>
</we-select>
<we-colorpicker data-dependencies="border_width_opt"
t-att-data-apply-to="apply_to"
data-select-style="true"
t-attf-data-css-property="border-#{direction and ('%s-' % direction) or ''}color"
data-color-prefix="border-"
t-att-data-color="color_variable"/>
</we-row>
</template>
<template id="snippet_options_border_widgets">
<t t-call="mass_mailing.snippet_options_border_line_widgets">
<t t-set="label">Border</t>
<t t-set="with_bs_class" t-value="True"/>
</t>
<we-input string="Round Corners"
t-att-data-apply-to="apply_to"
t-att-data-dependencies="not so_rounded_no_dependencies and 'border_width_opt,bg_color_opt'"
data-select-style="0" data-css-property="border-radius"
data-unit="px" data-extra-class="rounded"
t-att-data-variable="radius_variable"/>
</template>
<template id="snippet_options_background_options" inherit_id="web_editor.snippet_options_background_options" primary="True">
<xpath expr="//div[@data-js='BackgroundImage']" position="attributes">
<attribute name="data-js">MassMailingBackgroundImage</attribute>
</xpath>
</template>
<!--
TODO these next two templates should have been removed in 16.0 as they were
emptied pre-release while waiting for a proper upgrade script to remove them
after backport. They will now be removed in master.
-->
<template id="snippet_options_extra_shapes" inherit_id="web_editor.snippet_options">
<xpath expr="//div"><!-- TODO remove me in master (do not xpath this) --></xpath>
</template>
<template id="snippet_options_image_styles" inherit_id="web_editor.snippet_options">
<xpath expr="//div"><!-- TODO remove me in master (do not xpath this) --></xpath>
</template>
<!-- Mass Mailing Snippet Options -->
<template id="snippet_options" inherit_id="web_editor.snippet_options" primary="True">
<!-- =================================================================== -->
<!-- Modify generic snippet options -->
<!-- =================================================================== -->
<xpath expr="//t[@t-set='no_animations']" position="attributes">
<attribute name="t-value">True</attribute>
</xpath>
<!-- Extra shapes -->
<xpath expr="//div[hasclass('o_we_image_shape')]//we-select-page[hasclass('o_we_basic_shapes')]" position="inside">
<we-button data-set-img-shape="mass_mailing/basic/circle" data-select-label="Circle"/>
<we-button data-set-img-shape="mass_mailing/basic/triangle" data-select-label="Triangle"/>
<we-button data-set-img-shape="mass_mailing/basic/slanted" data-select-label="Slanted"/>
</xpath>
<xpath expr="//div[hasclass('o_we_image_shape')]//we-select-page[hasclass('o_we_basic_shapes')]" position="attributes">
<attribute name="t-if">True</attribute>
</xpath>
<!-- Image styles -->
<!-- TODO review to only modify what's really necessary and potentially -->
<!-- make the changes in web_editor directly so that website can benefit -->
<!-- from it. -->
<xpath expr="//div[hasclass('o_we_image_options')]" position="replace">
<div data-selector="span.fa, i.fa, img">
<we-select string="Alignment" data-state-to-first-class="true">
<we-button data-select-class="float-start" title="Align Left">Left</we-button>
<we-button data-select-class="mx-auto" title="Align Center">Center</we-button>
<we-button data-select-class="float-end" title="Align Right">Right</we-button>
</we-select>
<t t-call="mass_mailing.snippet_options_border_line_widgets">
<t t-set="label">Border</t>
<t t-set="with_bs_class" t-value="True"></t>
</t>
<we-input string="Round Corners"
data-select-style="0" data-css-property="border-radius"
data-unit="px" data-extra-class="rounded"
t-att-data-variable="radius_variable"/>
<we-row string="Padding ⭤">
<we-input data-select-style="" data-unit="px" data-css-property="padding-left"/>
<we-input data-select-style="" data-unit="px" data-css-property="padding-right"/>
</we-row>
<we-row string="Padding ↕">
<we-input data-select-style="" data-unit="px" data-css-property="padding-top"/>
<we-input data-select-style="" data-unit="px" data-css-property="padding-bottom"/>
</we-row>
</div>
</xpath>
<!-- Transform is _very_ badly supported in mail clients -->
<xpath expr="//we-button[@data-name='image_transform_opt']" position="replace" />
<xpath expr="//div[@data-js='ImageTools']" position="attributes">
<attribute name="data-js">MassMailingImageTools</attribute>
</xpath>
<!-- =================================================================== -->
<!-- Adding mass_mailing specific snippet options -->
<!-- =================================================================== -->
<xpath expr="." position="inside">
<!-- Border | Columns -->
<div data-js="Box"
data-selector=".row > div"
data-exclude=".o_mail_wrapper_td, .s_col_no_bgcolor, .s_col_no_bgcolor.row > div, .s_image_gallery .row > div">
<t t-call="mass_mailing.snippet_options_border_widgets"/>
</div>
<div data-js="layout_column"
data-selector=".o_mail_snippet_general"
data-target="> *:has(> .row:not(.s_nb_column_fixed)), > .s_allow_columns">
<we-select string="Columns" data-no-preview="true">
<we-button data-select-count="0" data-name="zero_cols_opt">None</we-button>
<we-button data-select-count="1">1</we-button>
<we-button data-select-count="2">2</we-button>
<we-button data-select-count="3">3</we-button>
<we-button data-select-count="4">4</we-button>
<we-button data-select-count="5">5</we-button>
<we-button data-select-count="6">6</we-button>
</we-select>
</div>
<!-- Move snippets around -->
<div data-js="SnippetMove" data-selector=".o_mail_snippet_general">
<we-button class="fa fa-fw fa-angle-up" data-move-snippet="prev" data-no-preview="true" data-name="move_up_opt"/>
<we-button class="fa fa-fw fa-angle-down" data-move-snippet="next" data-no-preview="true" data-name="move_down_opt"/>
</div>
<div data-js="SnippetMove"
data-selector=".row:not(.s_col_no_resize) > div"
data-exclude=".s_showcase .row > div"
data-name="move_horizontally_opt">
<we-button class="fa fa-fw fa-angle-left" data-move-snippet="prev" data-no-preview="true" data-name="move_left_opt"/>
<we-button class="fa fa-fw fa-angle-right" data-move-snippet="next" data-no-preview="true" data-name="move_right_opt"/>
</div>
<div id="so_width" data-selector=".s_mail_alert .s_alert, .s_mail_blockquote, .s_mail_text_highlight">
<we-select string="Width">
<we-button data-select-class="w-25">25%</we-button>
<we-button data-select-class="w-50">50%</we-button>
<we-button data-select-class="w-75">75%</we-button>
<we-button data-select-class="w-100" data-name="so_width_100">100%</we-button>
</we-select>
</div>
<div id="so_block_align" data-selector=".s_mail_alert .s_alert, .s_mail_blockquote, .s_mail_text_highlight">
<we-button-group string="Alignment" data-dependencies="!so_width_100">
<we-button class="fa fa-fw fa-align-left" title="Left" data-select-class="me-auto"/>
<we-button class="fa fa-fw fa-align-center" title="Center" data-select-class="mx-auto"/>
<we-button class="fa fa-fw fa-align-right" title="Right" data-select-class="ms-auto"/>
</we-button-group>
</div>
<!-- TODO there is no data-js associated to this but a data-option-name, -->
<!-- somehow it acts as data-js... it will be reviewed in master. -->
<div data-option-name="minHeight" data-selector=".o_mail_snippet_general" data-exclude=".o_mail_snippet_general .row > div *">
<we-button-group string="Height">
<we-button data-name="minheight_auto_opt" data-select-class="" title="Fit content">Auto</we-button>
<we-button data-select-class="o_height_400" title="400px">50%</we-button>
<we-button data-select-class="o_height_800" title="800px">100%</we-button>
</we-button-group>
</div>
<div data-js="mass_mailing_sizing_x"
data-selector="img, .mv, .col_mv, td, th"
data-exclude=".o_mail_no_resize, .o_mail_no_options"/>
<div data-js="table_row"
data-selector="tr:has(> .row), tr:has(> .col_mv)"
data-exclude=".o_mail_no_options"
data-drop-near="tr:has(> .row), tr:has(> .col_mv)"/>
<div data-js="table_column"
data-selector=".col>td, .col>th"
data-exclude=".o_mail_no_options"
data-drop-near=".col>td, .col>th"/>
<div data-js="table_column_mv"
data-selector=".col_mv, td, th"
data-exclude=".o_mail_no_options"
data-drop-near=".col_mv, td, th"/>
<t t-set="mailing_content_selector" t-translation="off">.note-editable > div:not(.o_layout), .note-editable .oe_structure > div, .oe_snippet_body</t>
<div data-js="content"
t-att-data-selector="mailing_content_selector"
data-exclude=".o_mail_no_options"
data-drop-near="[data-oe-field='body_html']:not(:has(.o_layout)) > *, .oe_structure > *"
data-drop-in="[data-oe-field='body_html']:not(:has(.o_layout)), .oe_structure"/>
<t t-set="so_snippet_addition_selector" t-translation="off">.o_mail_snippet_general</t>
<div id="so_snippet_addition"
t-att-data-selector="so_snippet_addition_selector"
data-drop-in=":not(p).oe_structure:not(.oe_structure_solo), :not(.o_mega_menu):not(p)[data-oe-type=html], :not(p).oe_structure.oe_structure_solo:not(:has(> section, > div))"/>
<t t-set="so_content_addition_selector" t-translation="off">.s_mail_blockquote, .s_mail_alert, .s_rating, .s_hr, .s_mail_text_highlight</t>
<div id="so_content_addition"
t-att-data-selector="so_content_addition_selector"
t-attf-data-drop-near="p, h1, h2, h3, ul, ol, .row > div > img, #{so_content_addition_selector}"
data-drop-in=".content, nav"/>
<div data-js="sizing_y"
data-selector=".o_mail_snippet_general, .o_mail_snippet_general .row > div"
data-exclude=".o_mail_no_resize, .o_mail_no_options"/>
<div data-js="sizing_x"
data-selector=".row > div"
data-drop-near=".row:not(.s_col_no_resize) > div"
data-exclude=".o_mail_no_resize, .o_mail_no_options"/>
<div data-selector=".note-editable .oe_structure > div:not(:has(> .o_mail_snippet_general)),
.note-editable .oe_structure > div.o_mail_snippet_general,
.note-editable .oe_structure > div.o_mail_snippet_general .o_cc,
.note-editable .oe_structure > div.o_mail_snippet_general .btn:not(.btn-link)"
data-exclude=".o_mail_no_colorpicker, .o_mail_no_options, .s_mail_color_blocks_2, .s_mail_color_blocks_2 .row > div">
<we-colorpicker string="Background Color"
data-select-style="true"
data-no-transparency="true"
data-css-property="background-color"
data-color-prefix="bg-"/>
</div>
<div data-selector=".s_mail_color_blocks_2 .row > div">
<we-colorpicker string="Background Color"
data-select-style="true"
data-no-transparency="true"
data-css-property="background-color"
data-color-prefix="bg-"/>
</div>
<!-- Allow customised padding-x on snippets -->
<div data-selector="[class*='col-lg-'], .s_discount2, .s_text_block, .s_media_list, .s_picture, .s_rating">
<we-row string="Padding ⭤">
<we-input data-select-style="" data-unit="px" data-css-property="padding-left"/>
<we-input data-select-style="" data-unit="px" data-css-property="padding-right"/>
</we-row>
</div>
<!-- Allow changing background images in Masonry and Cover -->
<t t-call="mass_mailing.snippet_options_background_options">
<t t-set="selector" t-value="'.s_masonry_block .row > div, .s_cover .oe_img_bg'"/>
<t t-set="with_images" t-value="True"/>
<t t-set="with_videos" t-value="false"/>
<t t-set="with_shapes" t-value="false"/>
</t>
<!-- COLOR | .s_three_columns | .s_comparisons | .s_event -->
<div data-js="Box"
data-selector=".s_three_columns .row > div, .s_comparisons .row > div, .s_mail_block_event .row > div"
data-target=".card-body">
<we-colorpicker string="Background Color"
data-select-style="true"
data-no-transparency="true"
data-css-property="background-color"
data-color-prefix="bg-"/>
</div>
<!-- BORDER | .s_three_columns | .s_comparisons | .s_event -->
<div data-js="Box"
data-selector=".s_three_columns .row > div, .s_comparisons .row > div, .s_mail_block_event .row > div"
data-target=".card">
<t t-call="mass_mailing.snippet_options_border_widgets">
<t t-set="so_rounded_no_dependencies" t-value="True"/>
</t>
</div>
<!-- COLOR, BORDER | .o_mail_block_discount2 -->
<div data-js="Box"
data-selector=".o_mail_block_discount2"
data-target="table">
<t t-call="mass_mailing.snippet_options_border_widgets">
</t>
</div>
<!-- Vertical Alignment -->
<div data-option-name="vAlignment" id="row_valign_snippet_option" data-selector=".s_text_image, .s_image_text, .s_three_columns, s_mail_block_event" data-target=".row">
<we-button-group string="Vert. Alignment" title="Vertical Alignment">
<we-button title="Align Top"
data-select-class="align-items-start"
data-img="/mass_mailing/static/src/img/snippets_options/align_top.svg"/>
<we-button title="Align Middle"
data-select-class="align-items-center"
data-img="/mass_mailing/static/src/img/snippets_options/align_middle.svg"/>
<we-button title="Align Bottom"
data-select-class="align-items-end"
data-img="/mass_mailing/static/src/img/snippets_options/align_bottom.svg"/>
<we-button title="Stretch to Equal Height"
data-select-class="align-items-stretch"
data-img="/mass_mailing/static/src/img/snippets_options/align_stretch.svg"/>
</we-button-group>
</div>
<!-- DESIGN OPTIONS -->
<div data-js="DesignTab" data-selector="design-options" data-no-check="true">
<!-- BODY WIDTH -->
<we-button-group string="Body Width" data-apply-to=".o_mail_wrapper" data-no-preview="true">
<we-button data-select-class="o_mail_small"
data-img="/mass_mailing/static/src/img/snippets_options/content_width_small.svg"
title="Small"/>
<we-button data-select-class="o_mail_regular"
data-img="/mass_mailing/static/src/img/snippets_options/content_width_normal.svg"
title="Regular"/>
<we-button data-select-class=""
data-img="/mass_mailing/static/src/img/snippets_options/content_width_full.svg"
title="Full"/>
</we-button-group>
<we-colorpicker string="Background Color"
data-apply-to=".o_layout, > div:not(.o_layout)"
data-select-style="true"
data-no-transparency="true"
data-css-property="background-color"
data-color-prefix="bg-"/>
<!-- HEADING 1 -->
<we-row string="Heading 1" class="o_design_tab_title">
<we-input data-customize-css-property=""
data-css-property="font-size"
data-selector-text="h1"
data-unit="px"/>
<we-colorpicker data-customize-css-property=""
data-css-property="color"
data-selector-text="h1"
data-no-transparency="true"
data-color-prefix="text-"/>
</we-row>
<we-row string="" class="o_we_sublevel_1 o_short_title">
<we-fontfamilypicker data-selector-text="h1"/>
<span></span> <!-- Separate the select from the buttons (styling) -->
<we-button title="Bold" class="fa fa-fw fa-bold" data-no-preview="true" data-toggle="true"
data-customize-css-property="bolder"
data-selector-text="h1"
data-css-property="font-weight"/>
<we-button title="Italic" class="fa fa-fw fa-italic" data-no-preview="true" data-toggle="true"
data-customize-css-property="italic"
data-selector-text="h1"
data-css-property="font-style"/>
<we-button title="Underline" class="fa fa-fw fa-underline" data-no-preview="true" data-toggle="true"
data-customize-css-property="underline"
data-selector-text="h1"
data-css-property="text-decoration-line"/>
</we-row>
<!-- HEADING 2 -->
<we-row string="Heading 2" class="o_design_tab_title">
<we-input data-customize-css-property=""
data-css-property="font-size"
data-selector-text="h2"
data-unit="px"/>
<we-colorpicker data-customize-css-property=""
data-css-property="color"
data-selector-text="h2"
data-no-transparency="true"
data-color-prefix="text-"/>
</we-row>
<we-row string="" class="o_we_sublevel_1 o_short_title">
<we-fontfamilypicker data-selector-text="h2"/>
<span></span> <!-- Separate the select from the buttons (styling) -->
<we-button title="Bold" class="fa fa-fw fa-bold" data-no-preview="true" data-toggle="true"
data-customize-css-property="bolder"
data-selector-text="h2"
data-css-property="font-weight"/>
<we-button title="Italic" class="fa fa-fw fa-italic" data-no-preview="true" data-toggle="true"
data-customize-css-property="italic"
data-selector-text="h2"
data-css-property="font-style"/>
<we-button title="Underline" class="fa fa-fw fa-underline" data-no-preview="true" data-toggle="true"
data-customize-css-property="underline"
data-selector-text="h2"
data-css-property="text-decoration-line"/>
</we-row>
<!-- HEADING 3 -->
<we-row string="Heading 3" class="o_design_tab_title">
<we-input data-customize-css-property=""
data-css-property="font-size"
data-selector-text="h3"
data-unit="px"/>
<we-colorpicker data-customize-css-property=""
data-css-property="color"
data-selector-text="h3"
data-no-transparency="true"
data-color-prefix="text-"/>
</we-row>
<we-row string="" class="o_we_sublevel_1 o_short_title">
<we-fontfamilypicker data-selector-text="h3"/>
<span></span> <!-- Separate the select from the buttons (styling) -->
<we-button title="Bold" class="fa fa-fw fa-bold" data-no-preview="true" data-toggle="true"
data-customize-css-property="bolder"
data-selector-text="h3"
data-css-property="font-weight"/>
<we-button title="Italic" class="fa fa-fw fa-italic" data-no-preview="true" data-toggle="true"
data-customize-css-property="italic"
data-selector-text="h3"
data-css-property="font-style"/>
<we-button title="Underline" class="fa fa-fw fa-underline" data-no-preview="true" data-toggle="true"
data-customize-css-property="underline"
data-selector-text="h3"
data-css-property="text-decoration-line"/>
</we-row>
<!-- TEXT -->
<we-row string="Text" class="o_design_tab_title">
<we-input data-customize-css-property=""
data-css-property="font-size"
data-selector-text="p, p > *, li, li > *"
data-unit="px"/>
<we-colorpicker data-customize-css-property=""
data-css-property="color"
data-selector-text="p, p > *, li, li > *"
data-no-transparency="true"
data-color-prefix="text-"/>
</we-row>
<we-row string="" class="o_we_sublevel_1 o_short_title">
<we-fontfamilypicker data-selector-text="p, p > *, li, li > *"/>
<span></span> <!-- Separate the select from the buttons (styling) -->
<we-button title="Bold" class="fa fa-fw fa-bold" data-no-preview="true" data-toggle="true"
data-customize-css-property="bolder"
data-selector-text="p, p > *, li, li > *"
data-css-property="font-weight"/>
<we-button title="Italic" class="fa fa-fw fa-italic" data-no-preview="true" data-toggle="true"
data-customize-css-property="italic"
data-selector-text="p, p > *, li, li > *"
data-css-property="font-style"/>
<we-button title="Underline" class="fa fa-fw fa-underline" data-no-preview="true" data-toggle="true"
data-customize-css-property="underline"
data-selector-text="p, p > *, li, li > *"
data-css-property="text-decoration-line"/>
</we-row>
<!-- LINKS -->
<we-row string="Links" class="o_design_tab_title">
<we-colorpicker data-customize-css-property=""
data-css-property="color"
data-selector-text="a:not(.btn), a.btn.btn-link"
data-no-transparency="true"
data-color-prefix="text-"/>
<we-button title="Underline" class="fa fa-fw fa-underline" data-no-preview="true" data-toggle="true"
data-customize-css-property="underline"
data-selector-text="a:not(.btn), a.btn.btn-link"
data-css-property="text-decoration-line"/>
</we-row>
<!-- PRIMARY BUTTONS -->
<we-row string="Primary Buttons" class="o_design_tab_title">
<we-input data-customize-css-property=""
data-css-property="font-size"
data-selector-text="a.btn.btn-primary, a.btn.btn-outline-primary, a.btn.btn-fill-primary"
data-unit="px"/>
<we-colorpicker data-customize-css-property=""
data-css-property="color"
data-selector-text="a.btn.btn-primary, a.btn.btn-outline-primary, a.btn.btn-fill-primary"
data-no-transparency="true"
data-color-prefix="text-"/>
<we-colorpicker data-customize-css-property=""
data-css-property="background-color"
data-selector-text="a.btn.btn-primary, a.btn.btn-outline-primary, a.btn.btn-fill-primary"
data-no-transparency="true"
data-color-prefix="bg-"/>
</we-row>
<we-select string="Size" class="o_we_sublevel_1" data-selector-text="a.btn.btn-primary, a.btn.btn-outline-primary, a.btn.btn-fill-primary">
<we-button data-apply-button-size="btn-sm">Small</we-button>
<we-button data-apply-button-size="btn-md">Medium</we-button>
<we-button data-apply-button-size="btn-lg">Large</we-button>
</we-select>
<we-row string="Border" class="o_we_sublevel_1">
<we-input data-customize-css-property=""
data-css-property="border-width"
data-selector-text="a.btn.btn-primary, a.btn.btn-outline-primary, a.btn.btn-fill-primary"
data-unit="px"/>
<we-select data-selector-text="a.btn.btn-primary, a.btn.btn-outline-primary, a.btn.btn-fill-primary" data-css-property="border-style">
<we-button title="Solid" data-customize-css-property="solid">
<div class="o_we_fake_img_item o_we_border_preview" style="border-style: solid;"/>
</we-button>
<we-button title="Dashed" data-customize-css-property="dashed">
<div class="o_we_fake_img_item o_we_border_preview" style="border-style: dashed;"/>
</we-button>
<we-button title="Dotted" data-customize-css-property="dotted">
<div class="o_we_fake_img_item o_we_border_preview" style="border-style: dotted;"/>
</we-button>
<we-button title="Double" data-customize-css-property="double">
<div class="o_we_fake_img_item o_we_border_preview" style="border-style: double; border-left: none; border-right: none;"/>
</we-button>
</we-select>
<we-colorpicker data-customize-css-property=""
data-css-property="border-color"
data-selector-text="a.btn.btn-primary, a.btn.btn-outline-primary, a.btn.btn-fill-primary"
data-no-transparency="true"
data-color-prefix="border-"/>
</we-row>
<!-- SECONDARY BUTTONS -->
<we-row string="Secondary Buttons" class="o_design_tab_title">
<we-input data-customize-css-property=""
data-css-property="font-size"
data-selector-text="a.btn.btn-secondary, a.btn.btn-outline-secondary, a.btn.btn-fill-secondary"
data-unit="px"/>
<we-colorpicker data-customize-css-property=""
data-css-property="color"
data-selector-text="a.btn.btn-secondary, a.btn.btn-outline-secondary, a.btn.btn-fill-secondary"
data-no-transparency="true"
data-color-prefix="text-"/>
<we-colorpicker data-customize-css-property=""
data-css-property="background-color"
data-selector-text="a.btn.btn-secondary, a.btn.btn-outline-secondary, a.btn.btn-fill-secondary"
data-no-transparency="true"
data-color-prefix="bg-"/>
</we-row>
<we-select string="Size" class="o_we_sublevel_1" data-selector-text="a.btn.btn-secondary, a.btn.btn-outline-secondary, a.btn.btn-fill-secondary">
<we-button data-apply-button-size="btn-sm">Small</we-button>
<we-button data-apply-button-size="btn-md">Medium</we-button>
<we-button data-apply-button-size="btn-lg">Large</we-button>
</we-select>
<we-row string="Border" class="o_we_sublevel_1">
<we-input data-customize-css-property=""
data-css-property="border-width"
data-selector-text="a.btn.btn-secondary, a.btn.btn-outline-secondary, a.btn.btn-fill-secondary"
data-unit="px"/>
<we-select data-selector-text="a.btn.btn-secondary, a.btn.btn-outline-secondary, a.btn.btn-fill-secondary" data-css-property="border-style">
<we-button title="Solid" data-customize-css-property="solid">
<div class="o_we_fake_img_item o_we_border_preview" style="border-style: solid;"/>
</we-button>
<we-button title="Dashed" data-customize-css-property="dashed">
<div class="o_we_fake_img_item o_we_border_preview" style="border-style: dashed;"/>
</we-button>
<we-button title="Dotted" data-customize-css-property="dotted">
<div class="o_we_fake_img_item o_we_border_preview" style="border-style: dotted;"/>
</we-button>
<we-button title="Double" data-customize-css-property="double">
<div class="o_we_fake_img_item o_we_border_preview" style="border-style: double; border-left: none; border-right: none;"/>
</we-button>
</we-select>
<we-colorpicker data-customize-css-property=""
data-css-property="border-color"
data-selector-text="a.btn.btn-secondary, a.btn.btn-outline-secondary, a.btn.btn-fill-secondary"
data-no-transparency="true"
data-color-prefix="border-"/>
</we-row>
<!-- SEPARATORS -->
<we-row string="Separators" class="o_design_tab_title">
<we-input data-customize-css-property=""
data-css-property="border-top-width"
data-selector-text="hr"
data-unit="px"/>
<we-select data-selector-text="hr" data-css-property="border-top-style">
<we-button title="Solid" data-customize-css-property="solid">
<div class="o_we_fake_img_item o_we_border_preview" style="border-style: solid;"/>
</we-button>
<we-button title="Dashed" data-customize-css-property="dashed">
<div class="o_we_fake_img_item o_we_border_preview" style="border-style: dashed;"/>
</we-button>
<we-button title="Dotted" data-customize-css-property="dotted">
<div class="o_we_fake_img_item o_we_border_preview" style="border-style: dotted;"/>
</we-button>
<we-button title="Double" data-customize-css-property="double">
<div class="o_we_fake_img_item o_we_border_preview" style="border-style: double; border-left: none; border-right: none;"/>
</we-button>
</we-select>
<we-colorpicker data-customize-css-property=""
data-css-property="border-top-color"
data-selector-text="hr"
data-no-transparency="true"
data-color-prefix="border-"/>
</we-row>
<we-select string="Width" class="o_we_sublevel_1" data-selector-text="hr" data-css-property="width">
<we-button data-customize-css-property="25%">25%</we-button>
<we-button data-customize-css-property="50%">50%</we-button>
<we-button data-customize-css-property="75%">75%</we-button>
<we-button data-customize-css-property="100%">100%</we-button>
</we-select>
</div>
</xpath>
</template>
</odoo>

View file

@ -0,0 +1,63 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Theme "Basic" template -->
<template id="theme_basic_template">
<div class="o_mail_no_options">
<p><br/></p>
<p><br/></p>
<p>
<br/>
<a href="/unsubscribe_from_list">Unsubscribe</a>
</p>
</div>
</template>
<template id="theme_empty_template">
</template>
<!-- Default Theme -->
<template id="theme_default_template">
<style id="design-element">
h2 {
font-weight: bolder;
}
p, p > *, li, li > * {
color: #6c757d;
}
hr {
border-top-color: #ced4da !important;
}
</style>
<div class="s_header_logo o_mail_block_header_logo o_mail_snippet_general pt16 pb16">
<div class="container">
<div class="row">
<div class="col-lg-4"/>
<div class="col-lg-4" style="text-align: center;">
<a t-att-href="(company_id.website) or '#'" style="text-decoration:none;" target="_blank">
<img border="0" src="/mass_mailing/static/src/img/theme_default/s_default_image_header_logo.png" style="height:auto; max-width:100%;" width="180" class="img-fluid"/>
</a>
</div>
<div class="col-lg-4" style="text-align: right;"/>
</div>
</div>
</div>
<div class="s_text_block o_mail_snippet_general pt40 pb16" style="padding-left: 15px; padding-right: 15px;">
<div class="container s_allow_columns">
<h2>Thank you for joining us!</h2>
<p><br/>We want to take this opportunity to welcome you to our ever-growing community!
<br/>Your platform is ready for work, it will help you reduce the costs of digital signatures, attract new customers and increase sales.</p>
<p><img src="/mass_mailing/static/src/img/theme_default/signature.png" style="width:125px; margin-top:8px;margin-bottom:-25px;" alt="Signature" class="img-fluid"/></p>
<p>Michael Fletcher<br/>
<span style="font-size: 12px; font-weight: bolder;">Customer Service</span>
</p>
<p style="text-align: center;">
<a role="button" href="#" class="btn btn-primary">LOGIN</a>
</p>
</div>
</div>
<div class="s_hr pt16 pb16" data-snippet="s_hr" data-name="Separator">
<hr class="s_hr_1px s_hr_solid"/>
</div>
<t t-call="mass_mailing.s_mail_block_footer_social_left"/>
</template>
</odoo>

View file

@ -0,0 +1,94 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record model="ir.ui.view" id="utm_campaign_view_form">
<field name="name">utm.campaign.view.form</field>
<field name="model">utm.campaign</field>
<field name="inherit_id" ref="utm.utm_campaign_view_form"/>
<field name="arch" type="xml">
<xpath expr="//header" position="inside">
<field name="is_mailing_campaign_activated" invisible="1"/>
<button name="%(action_create_mass_mailings_from_campaign)d"
type="action" class="oe_highlight" attrs="{'invisible': [('is_mailing_campaign_activated', '=', False)]}"
groups="mass_mailing.group_mass_mailing_user" string="Send Mailing"/>
</xpath>
<xpath expr="//div[hasclass('oe_button_box')]" position="inside">
<button name="%(action_view_mass_mailings_from_campaign)d"
type="action" class="oe_stat_button order-9" icon="fa-envelope-o"
attrs="{'invisible': ['|', ('mailing_mail_count', '=', 0), ('is_mailing_campaign_activated', '=', False)]}"
groups="mass_mailing.group_mass_mailing_user">
<field name="mailing_mail_count" widget="statinfo" string="Mailings"/>
</button>
</xpath>
<xpath expr="//notebook" position="inside">
<page string="Mailings" name="mailings"
attrs="{'invisible': ['|', ('mailing_mail_count', '=', 0), ('is_mailing_campaign_activated', '=', False)]}"
groups="mass_mailing.group_mass_mailing_user">
<field name="mailing_mail_ids" nolabel="1">
<tree>
<field name="calendar_date" string="Date"/>
<field name="subject" attrs="{'readonly': [('state', 'in', ('sending', 'done'))]}"/>
<field name="mailing_model_id" string="Recipients" optional="hide"/>
<field name="user_id" widget="many2one_avatar_user"/>
<field name="ab_testing_enabled" string="A/B Test"
groups="mass_mailing.group_mass_mailing_campaign"
attrs="{'column_invisible': [('parent.ab_testing_mailings_count', '=', 0)]}"/>
<field name="campaign_id" string="Campaign" groups="mass_mailing.group_mass_mailing_campaign" optional="hide"/>
<field name="received_ratio" string="Delivered (%)" avg="Average of Delivered"/>
<field name="opened_ratio" string="Opened (%)" avg="Average of Opened"/>
<field name="bounced_ratio" string="Bounced (%)" optional="hide" avg="Average of Bounced"/>
<field name="clicks_ratio" string="Clicked (%)" avg="Average of Clicked"/>
<field name="replied_ratio" string="Replied (%)" avg="Average of Replied"/>
<field name="state" decoration-info="state in ('draft', 'in_queue')" decoration-success="state in ('sending', 'done')" widget="badge"/>
<button name="action_duplicate" type="object" string="Duplicate"/>
</tree>
</field>
</page>
</xpath>
<xpath expr="//notebook" position="after">
<field name="ab_testing_mailings_count" invisible="1"/>
<group name="ab_test_group" groups="mass_mailing.group_mass_mailing_campaign" attrs="{'invisible': [('ab_testing_mailings_count', '=', 0)]}">
<group string="A/B Test">
<field name="ab_testing_completed" invisible="1"/>
<field name="ab_testing_winner_selection" attrs="{'readonly': [('ab_testing_completed', '=', True)]}"/>
<field name="ab_testing_schedule_datetime"
attrs="{'invisible': [('ab_testing_winner_selection', '=', 'manual')], 'readonly': [('ab_testing_completed', '=', True)]}"/>
</group>
</group>
</xpath>
</field>
</record>
<record model="ir.ui.view" id="utm_campaign_view_kanban">
<field name="name">utm.campaign.view.kanban</field>
<field name="model">utm.campaign</field>
<field name="inherit_id" ref="utm.utm_campaign_view_kanban"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='user_id']" position="after">
<field name="mailing_mail_ids" groups="mass_mailing.group_mass_mailing_user"/>
<field name="is_mailing_campaign_activated"/>
</xpath>
<xpath expr="//ul[@id='o_utm_actions']">
<a name="%(action_view_mass_mailings_from_campaign)d" type="action"
t-attf-class="oe_mailings #{record.mailing_mail_ids.raw_value.length === 0 ? 'text-muted' : ''}"
t-if="record.is_mailing_campaign_activated.raw_value"
groups="mass_mailing.group_mass_mailing_user">
<t t-out="record.mailing_mail_ids.raw_value.length"/> Mailings
</a>
</xpath>
</field>
</record>
<record id="action_view_utm_campaigns" model="ir.actions.act_window">
<field name="name">Campaigns</field>
<field name="res_model">utm.campaign</field>
<field name="view_mode">kanban,tree,form</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Create a mailing campaign
</p><p>
Campaigns are the perfect tool to track results across multiple mailings.
</p>
</field>
<field name="domain">[('is_auto_campaign', '=', False)]</field>
</record>
</odoo>