19.0 vanilla

This commit is contained in:
Ernad Husremovic 2026-03-09 09:30:27 +01:00
parent d1963a3c3a
commit 2d3ee4855a
7430 changed files with 2687981 additions and 2965473 deletions

View file

@ -0,0 +1,44 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<record id="discuss_call_history_view_tree" model="ir.ui.view">
<field name="name">discuss.call.history.view.list</field>
<field name="model">discuss.call.history</field>
<field name="arch" type="xml">
<list string="Call History" sample="1">
<field name="channel_id"/>
<field name="start_dt"/>
<field name="end_dt"/>
<field name="duration_hour" widget="float_time" options="{'displaySeconds': True}"/>
</list>
</field>
</record>
<record id="discuss_call_history_view_form" model="ir.ui.view">
<field name="name">discuss.call.history.view.form</field>
<field name="model">discuss.call.history</field>
<field name="arch" type="xml">
<form string="Call History">
<group class="oe_form_field">
<field name="channel_id"/>
<field name="start_dt"/>
<field name="end_dt"/>
<field name="duration_hour" widget="float_time" options="{'displaySeconds': True}"/>
</group>
</form>
</field>
</record>
<record id="discuss_call_history_action" model="ir.actions.act_window">
<field name="name">Call History</field>
<field name="res_model">discuss.call.history</field>
<field name="view_mode">list,form</field>
<field name="context">{"create": False}</field>
</record>
<menuitem
action="discuss_call_history_action"
id="discuss_call_history_menu"
name="Call History"
parent="discuss_technical"
sequence="15"
/>
</data>
</odoo>

View file

@ -0,0 +1,39 @@
<?xml version="1.0"?>
<odoo>
<record id="discuss_gif_favorite_view_form" model="ir.ui.view">
<field name="name">discuss.gif.favorite.form</field>
<field name="model">discuss.gif.favorite</field>
<field name="arch" type="xml">
<form string="GIF favorite">
<sheet>
<group>
<field name="id"/>
<field name="tenor_gif_id"/>
<field name="create_uid"/>
</group>
</sheet>
</form>
</field>
</record>
<record id="discuss_gif_favorite_view_tree" model="ir.ui.view">
<field name="name">discuss.gif.favorite.list</field>
<field name="model">discuss.gif.favorite</field>
<field name="priority">10</field>
<field name="arch" type="xml">
<list string="GIF favorite">
<field name="id"/>
<field name="tenor_gif_id"/>
<field name="create_uid"/>
</list>
</field>
</record>
<record id="discuss_gif_favorite_action" model="ir.actions.act_window">
<field name="name">GIF favorite</field>
<field name="res_model">discuss.gif.favorite</field>
<field name="view_mode">list,form</field>
</record>
</odoo>

View file

@ -0,0 +1,12 @@
<?xml version="1.0"?>
<odoo>
<data>
<menuitem
id="discuss_technical"
name="Technical"
parent="mail.menu_root_discuss"
groups="base.group_no_one"
sequence="10"
/>
</data>
</odoo>

View file

@ -0,0 +1,53 @@
<?xml version="1.0"?>
<odoo><data>
<!-- discuss.channel.member -->
<record id="discuss_channel_member_view_tree" model="ir.ui.view">
<field name="name">discuss.channel.member.list</field>
<field name="model">discuss.channel.member</field>
<field name="priority">10</field>
<field name="arch" type="xml">
<list string="Channels">
<field name="channel_id"/>
<field name="partner_id"/>
<field name="guest_id"/>
<field name="is_pinned"/>
<field name="last_seen_dt"/>
<field name="last_interest_dt"/>
</list>
</field>
</record>
<record id="discuss_channel_member_view_form" model="ir.ui.view">
<field name="name">discuss.channel.member.form</field>
<field name="model">discuss.channel.member</field>
<field name="arch" type="xml">
<form string="Channel Member">
<sheet>
<group>
<field name="channel_id" readonly="id"/>
<field name="partner_id" readonly="id or guest_id" required="not guest_id"/>
<field name="guest_id" readonly="id or partner_id" required="not partner_id"/>
<field name="custom_channel_name"/>
<field name="fetched_message_id"/>
<field name="seen_message_id"/>
<field name="new_message_separator"/>
<field name="message_unread_counter"/>
<field name="custom_notifications"/>
<field name="mute_until_dt"/>
<field name="is_pinned"/>
<field name="last_interest_dt"/>
<field name="last_seen_dt"/>
<field name="rtc_inviting_session_id"/>
</group>
</sheet>
</form>
</field>
</record>
<record id="discuss_channel_member_action" model="ir.actions.act_window">
<field name="name">Channels/Members</field>
<field name="res_model">discuss.channel.member</field>
<field name="view_mode">list,form</field>
</record>
</data></odoo>

View file

@ -1,9 +1,9 @@
<?xml version="1.0"?>
<odoo>
<record id="mail_channel_rtc_session_view_search" model="ir.ui.view">
<field name="name">mail.channel.rtc.session.search</field>
<field name="model">mail.channel.rtc.session</field>
<record id="discuss_channel_rtc_session_view_search" model="ir.ui.view">
<field name="name">discuss.channel.rtc.session.search</field>
<field name="model">discuss.channel.rtc.session</field>
<field name="arch" type="xml">
<search string="Search RTC session">
<field name="channel_member_id"/>
@ -12,11 +12,11 @@
</field>
</record>
<record id="mail_channel_rtc_session_view_tree" model="ir.ui.view">
<field name="name">mail.channel.rtc.session.tree</field>
<field name="model">mail.channel.rtc.session</field>
<record id="discuss_channel_rtc_session_view_tree" model="ir.ui.view">
<field name="name">discuss.channel.rtc.session.list</field>
<field name="model">discuss.channel.rtc.session</field>
<field name="arch" type="xml">
<tree string="RTC Session">
<list string="RTC Session">
<header>
<button name="action_disconnect" type="object" string="Disconnect"/>
</header>
@ -24,13 +24,13 @@
<field name="channel_member_id"/>
<field name="channel_id"/>
<field name="write_date"/>
</tree>
</list>
</field>
</record>
<record id="mail_channel_rtc_session_view_form" model="ir.ui.view">
<field name="name">mail.channel.rtc.session.form</field>
<field name="model">mail.channel.rtc.session</field>
<record id="discuss_channel_rtc_session_view_form" model="ir.ui.view">
<field name="name">discuss.channel.rtc.session.form</field>
<field name="model">discuss.channel.rtc.session</field>
<field name="arch" type="xml">
<form string="RTC Session">
<sheet>
@ -55,11 +55,11 @@
</field>
</record>
<record id="mail_channel_rtc_session_action" model="ir.actions.act_window">
<record id="discuss_channel_rtc_session_action" model="ir.actions.act_window">
<field name="name">RTC sessions</field>
<field name="res_model">mail.channel.rtc.session</field>
<field name="res_model">discuss.channel.rtc.session</field>
<field name="context">{'search_default_group_by_channel': True}</field>
<field name="view_mode">tree,form</field>
<field name="view_mode">list,form</field>
</record>
</odoo>

View file

@ -0,0 +1,152 @@
<?xml version="1.0"?>
<odoo>
<data>
<!-- discuss.channel -->
<record id="mail.discuss_channel_view_kanban" model="ir.ui.view">
<field name="name">discuss.channel.kanban</field>
<field name="model">discuss.channel</field>
<field name="priority" eval="10"/>
<field name="arch" type="xml">
<kanban>
<field name="is_member"/>
<field name="group_ids"/>
<field name="active"/>
<templates>
<t t-name="card" class="row g-0">
<widget name="web_ribbon" class="d-flex" title="Archived" bg_color="text-bg-danger" invisible="active"/>
<aside class="col-2 my-auto">
<field name="avatar_128" widget="image" options="{'size': [50, 50], 'img_class': 'bg-transparent'}" alt="Channel"/>
</aside>
<main class="col me-4 ms-2">
<span class="fw-bold fs-5">#<field name="name"/></span>
<field name="channel_type" groups="base.group_no_one"/>
<field name="description" class="text-muted lh-1 small"/>
<button type="object" invisible="is_member or group_ids" class="btn btn-primary ms-auto mt-auto" name="channel_join">Join</button>
<button type="object" invisible="not is_member or group_ids" class="btn btn-secondary ms-auto mt-auto" name="action_unfollow">Leave</button>
</main>
</t>
</templates>
</kanban>
</field>
</record>
<record id="mail.discuss_channel_view_list" model="ir.ui.view">
<field name="name">discuss.channel.list</field>
<field name="model">discuss.channel</field>
<field name="priority" eval="10"/>
<field name="arch" type="xml">
<list string="Channels" default_order="name">
<field name="avatar_128" invisible="parent_channel_id" widget="image" options="{'size': [24, 24]}" width="30" string=""/>
<field name="name"/>
<field name="description"/>
<button type="object" invisible="is_member or group_ids" class="btn btn-primary ms-auto mt-auto" name="channel_join" string="Join"/>
<button type="object" invisible="not is_member or group_ids" class="btn btn-secondary ms-auto mt-auto" name="action_unfollow" string="Leave"/>
</list>
</field>
</record>
<record id="mail.discuss_channel_view_form" model="ir.ui.view">
<field name="name">discuss.channel.form</field>
<field name="model">discuss.channel</field>
<field name="priority" eval="10"/>
<field name="arch" type="xml">
<form string="Mail Channel Form">
<sheet>
<div class="oe_button_box" name="button_box"/>
<field name="avatar_128" invisible="1"/>
<field name="is_editable" invisible="1"/>
<field name="image_128" widget="image" class="oe_avatar" options="{'size': [90, 90], 'preview_image':'avatar_128'}" readonly="not is_editable"/>
<widget name="web_ribbon" title="Archived" bg_color="text-bg-danger" invisible="active"/>
<div class="oe_title">
<label for="name" string="Group Name"/>
<h1>
#<field name="name" class="oe_inline" default_focus="1" placeholder="e.g. support" readonly="not is_editable"/>
</h1>
</div>
<group class="o_label_nowrap">
<field name="active" invisible="1"/>
<field name="description" placeholder="Topics discussed in this group..." readonly="not is_editable"/>
</group>
<notebook>
<page string="Privacy" name="privacy">
<group class="o_label_nowrap">
<field name="group_public_id"
invisible="channel_type != 'channel' or parent_channel_id" readonly="not is_editable"/>
<field name="group_ids" widget="many2many_tags"
invisible="channel_type != 'channel'"
string="Auto Subscribe Groups" readonly="not is_editable"/>
</group>
</page>
<page string="Members" name="members">
<field name="channel_type" invisible="1"/>
<field name="channel_member_ids" mode="list" context="{'active_test': False}" readonly="channel_type == 'chat'">
<list string="Members" editable="bottom">
<field name="partner_id" readonly="id or guest_id" required="not guest_id"/>
<field name="guest_id" readonly="id or partner_id" required="not partner_id"/>
</list>
</field>
</page>
<page string="Extra info" name="extra_info" groups="base.group_no_one">
<group class="o_label_nowrap">
<field name="channel_type"/>
<field name="parent_channel_id"/>
<field name="sub_channel_ids"/>
<field name="from_message_id"/>
<field name="sfu_channel_uuid"/>
<field name="sfu_server_url"/>
</group>
</page>
<page string="Integrations" invisible="1" name="discuss_channel_integrations"></page>
</notebook>
</sheet>
</form>
</field>
</record>
<record id="mail.discuss_channel_view_tree" model="ir.ui.view">
<field name="name">discuss.channel.list</field>
<field name="model">discuss.channel</field>
<field name="priority" eval="10"/>
<field name="arch" type="xml">
<list string="Groups">
<field name="name"/>
</list>
</field>
</record>
<record id="mail.discuss_channel_view_search" model="ir.ui.view">
<field name="name">discuss.channel.search</field>
<field name="model">discuss.channel</field>
<field name="priority" eval="10"/>
<field name="arch" type="xml">
<search string="Search Groups">
<field name="name"/>
<filter string="Archived" name="inactive" domain="[('active', '=', False)]"/>
</search>
</field>
</record>
<record id="mail.discuss_channel_action_view" model="ir.actions.act_window">
<field name="name">Join a group</field>
<field name="res_model">discuss.channel</field>
<field name="view_mode">kanban,list,form</field>
<field name="search_view_id" ref="discuss_channel_view_search"/>
</record>
<record id="mail.discuss_channel_action" model="ir.actions.act_window">
<field name="name">Channels</field>
<field name="res_model">discuss.channel</field>
<field name="view_mode">kanban,form</field>
<field name="domain" eval="[(('channel_type', '=', 'channel'))]" />
<field name="search_view_id" ref="discuss_channel_view_search" />
</record>
<record id="mail.action_discuss" model="ir.actions.client">
<field name="name">Discuss</field>
<field name="tag">mail.action_discuss</field>
<field name="path">discuss</field>
<field name="params" eval="&quot;{ 'default_active_id': 'mail.box_inbox' }&quot;"/>
</record>
</data>
</odoo>

View file

@ -1,54 +1,32 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="mail.discuss_public_layout">&lt;!DOCTYPE html&gt;
<template id="mail.discuss_public_channel_template" name="Discuss Public Template">&lt;!DOCTYPE html&gt;
<html class="h-100">
<head>
<meta charset="utf-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no"/>
<title t-esc="title or 'Odoo'"/>
<link type="image/x-icon" rel="shortcut icon" t-att-href="x_icon or '/web/static/img/favicon.ico'"/>
<script>
window.odoo = {
__session_info__: <t t-out="json.dumps(session_info)"/>,
csrf_token: "<t t-out="request.csrf_token(None)"/>",
debug: "<t t-out="debug"/>",
discuss_data: <t t-out="json.dumps(data)"/>
};
{
const { user_context, cache_hashes } = odoo.__session_info__;
fetch(`/web/webclient/translations/${cache_hashes.translations}?lang=${user_context.lang}`);
}
</script>
<t t-call-assets="mail.assets_common_discuss_public"/>
<t t-call-assets="mail.assets_discuss_public"/>
<t t-call-assets="mail.assets_public"/>
<t t-call-assets="mail.assets_discuss_public_test_tours" t-if="'tests' in debug or test_mode_enabled"/>
<t t-out="head or ''"/>
<style>
body {
direction: <t t-out="env['res.lang']._get_data(code=lang or env.user.lang).direction or 'ltr'" />;
}
</style>
</head>
<body class="d-flex flex-column h-100">
<t t-out="body or ''"/>
</body>
</html>
</template>
<template id="mail.discuss_public_channel_template" name="Discuss Public Channel Template">
<t t-call="mail.discuss_public_layout">
<t t-set="head">
<style>
body {
direction: <t t-out="env['res.lang']._lang_get(lang or env.user.lang).direction or 'ltr'" />;
}
</style>
<script>
odoo.define('mail.discuss_public_channel_template', function() {
return {
data: <t t-out="json.dumps(data)"/>,
};
});
</script>
</t>
</t>
</template>
</odoo>

View file

@ -5,15 +5,15 @@
<field name="name">fetchmail.server.list</field>
<field name="model">fetchmail.server</field>
<field name="arch" type="xml">
<tree string="POP/IMAP Servers">
<list string="POP/IMAP Servers">
<field name="name"/>
<field name="server_type"/>
<field name="user"/>
<field name="user" readonly="state != 'draft'"/>
<field name="date"/>
<field name="state" widget="badge"
decoration-info="state == 'draft'"
decoration-success="state == 'done'"/>
</tree>
</list>
</field>
</record>
@ -22,25 +22,25 @@
<field name="model">fetchmail.server</field>
<field name="arch" type="xml">
<form string="Incoming Mail Server">
<header attrs="{'invisible' : [('server_type', '=', 'local')]}">
<button string="Test &amp; Confirm" type="object" name="button_confirm_login" states="draft"/>
<button string="Fetch Now" type="object" name="fetch_mail" states="done"/>
<button string="Reset Confirmation" type="object" name="set_draft" states="done"/>
<header invisible="server_type == 'local'">
<button string="Test &amp; Confirm" type="object" name="button_confirm_login" invisible="state != 'draft'"/>
<button string="Fetch Now" type="object" name="fetch_mail" invisible="state != 'done'"/>
<button string="Reset Confirmation" type="object" name="set_draft" invisible="state != 'done'"/>
<field name="state" widget="statusbar"/>
</header>
<sheet>
<field name="active" invisible="1"/>
<widget name="web_ribbon" title="Archived" bg_color="bg-danger"
attrs="{'invisible': [('active', '=', True)]}"/>
<widget name="web_ribbon" title="Archived" bg_color="text-bg-danger"
invisible="active"/>
<group>
<group>
<field name="name"/>
<field name="server_type" widget="radio" attrs="{'readonly': [('state', '=', 'done')]}"/>
<field name="server_type" widget="radio" readonly="state == 'done'"/>
</group>
<group>
<field name="date" attrs="{'invisible': [('date', '=', False)]}"/>
<field name="date" invisible="not date"/>
<div class="text-muted fst-italic" colspan="8" role="alert"
attrs="{'invisible': [('server_type_info', '=', False)]}">
invisible="not server_type_info">
<field name="server_type_info"/>
</div>
</group>
@ -48,23 +48,25 @@
<notebook>
<page string="Server &amp; Login" name="server_login_details">
<group>
<group attrs="{'invisible' : [('server_type', '=', 'local')]}" string="Server Information">
<field name="server" attrs="{'required' : [('server_type', '!=', 'local')]}" />
<group invisible="server_type == 'local'" string="Server Information">
<field name="server" readonly="state != 'draft'" required="server_type != 'local'" />
<field name="port"
required="1"
attrs="{'required' : [('server_type', '!=', 'local')]}"
readonly="state != 'draft'"
options="{'format': false}" />
<field name="is_ssl"/>
</group>
<group attrs="{'invisible' : [('server_type', '=', 'local')]}" string="Login Information">
<field name="user" attrs="{'required' : [('server_type', '!=', 'local')]}"/>
<group invisible="server_type == 'local'" string="Login Information">
<field name="user" readonly="state != 'draft'" required="server_type != 'local'"/>
<field name="password" password="True"
attrs="{'required' : [('server_type', 'in', ('imap', 'pop'))], 'invisible' : [('server_type', 'not in', ('imap', 'pop'))]}"/>
invisible="server_type not in ('imap', 'pop')"
readonly="state != 'draft'"
required="server_type in ('imap', 'pop')"/>
</group>
<group string="Actions to Perform on Incoming Mails">
<field name="object_id"/>
</group>
<group attrs="{'invisible' : [('server_type', '!=', 'local')]}" string="Configuration">
<group invisible="server_type != 'local'" string="Configuration">
<field name="configuration"/>
<field name="script" widget="url"/>
</group>
@ -73,10 +75,14 @@
<page string="Advanced" name="advanced_options" groups="base.group_no_one">
<group>
<group string="Advanced Options">
<field name="priority"/>
<field name="priority" readonly="state != 'draft'"/>
<field name="attach"/>
<field name="original"/>
</group>
<group string="Last Error">
<field name="error_date"/>
<field name="error_message"/>
</group>
</group>
</page>
</notebook>
@ -105,9 +111,16 @@
<record id="action_email_server_tree" model="ir.actions.act_window">
<field name="name">Incoming Mail Servers</field>
<field name="res_model">fetchmail.server</field>
<field name="view_mode">tree,form</field>
<field name="view_mode">list,form</field>
<field name="view_id" ref="view_email_server_tree"/>
<field name="search_view_id" ref="view_email_server_search"/>
<field name="help" type="html">
<div>
<b class="o_view_nocontent_smiling_face">
No Incoming Servers yet
</b>
</div>
</field>
</record>
</odoo>

View file

@ -7,50 +7,83 @@
<field name="model">ir.actions.server</field>
<field name="inherit_id" ref="base.view_server_action_form"/>
<field name="arch" type="xml">
<xpath expr="//page[@name='page_object']" position="after">
<page string="Activity" name="next_activity" autofocus="autofocus" attrs="{'invisible': [('state', '!=', 'next_activity')]}">
<group>
<group>
<field name="activity_type_id" options="{'no_create': True, 'no_open': True}"
attrs="{'required': [('state', '=', 'next_activity')]}"/>
<field name="activity_summary" placeholder="e.g. Discuss proposal"/>
</group>
<group>
<label for="activity_date_deadline_range"/>
<div class="o_row">
<field name="activity_date_deadline_range"/>
<field name="activity_date_deadline_range_type" attrs="{
'required': [('state', '=', 'next_activity'), ('activity_date_deadline_range', '>', 0)]
}"/>
</div>
<field name="activity_user_type" attrs="{
'required': [('state', '=', 'next_activity')]
}"/>
<field name="activity_user_field_name" attrs="{
'invisible': [('activity_user_type', '=', 'specific')],
'required': [('state', '=', 'next_activity'), ('activity_user_type', '=', 'generic')]
}"/>
<field name="activity_user_id" attrs="{
'invisible': [('activity_user_type', '=', 'generic')],
'required': [('state', '=', 'next_activity'), ('activity_user_type', '=', 'specific')]
}"/>
</group>
</group>
<field name="activity_note" class="oe-bordered-editor" placeholder="Log a note..."/>
</page>
<xpath expr="//form" position="inside">
<chatter/>
</xpath>
<xpath expr="//field[@name='link_field_id']" position="after">
<field name="partner_ids" widget="many2many_tags"
attrs="{'invisible': [('state', '!=', 'followers')]}"/>
<field name="template_id"
attrs="{'invisible': [('state', '!=', 'mail_post')],
'required': [('state', '=', 'mail_post')]}"
context="{'default_model': model_name,
'default_use_default_to': True}"/>
<field name="mail_post_method"
attrs="{'invisible': [('state', '!=', 'mail_post')],
'required': [('state', '=', 'mail_post')]}"/>
<field name="mail_post_autofollow" invisible="1"/>
<xpath expr="//t[@name='action_content']//notebook" position="before">
<!-- Create next activity -->
<group invisible="state != 'next_activity'">
<group>
<field name="activity_type_id" options="{'no_create': True, 'no_open': True}"
required="state == 'next_activity'"/>
<field name="activity_summary" placeholder="e.g. Discuss proposal"/>
</group>
<group>
<label for="activity_date_deadline_range"/>
<div class="o_row">
<field name="activity_date_deadline_range" class="oe_inline"/>
<field name="activity_date_deadline_range_type" class="oe_inline" required="state == 'next_activity' and activity_date_deadline_range &gt; 0"/>
</div>
<field name="activity_user_type" required="state == 'next_activity'"/>
<field name="activity_user_field_name"
widget="field_selector" options="{'model': 'model_name'}"
invisible="activity_user_type != 'generic'"
required="state == 'next_activity' and activity_user_type == 'generic'"/>
<field name="activity_user_id"
placeholder="Choose a user..."
invisible="activity_user_type != 'specific'"
required="state == 'next_activity' and activity_user_type == 'specific'"/>
<field name="activity_note" class="oe-bordered-editor" placeholder="Add a description to your activity..."/>
</group>
</group>
<!-- Add/Remove Followers -->
<group invisible="state not in ['followers', 'remove_followers']">
<group>
<field name="followers_type"
required="state in ['followers', 'remove_followers']"/>
<field name="partner_ids" string="Followers to add" widget="many2many_tags"
placeholder="Choose a contact..."
invisible="state != 'followers' or followers_type != 'specific'"
required="state == 'followers' and followers_type == 'specific'"/>
<field name="partner_ids" string="Followers to remove" widget="many2many_tags"
placeholder="Choose a contact..."
invisible="state != 'remove_followers' or followers_type != 'specific'"
required="state == 'remove_followers' and followers_type == 'specific'"/>
<field name="followers_partner_field_name"
widget="field_selector" options="{'model': 'model_name'}"
invisible="followers_type != 'generic'"
required="state in ['followers', 'remove_followers'] and followers_type == 'generic'"/>
</group>
</group>
<!-- Send Email -->
<group invisible="state != 'mail_post'">
<group>
<field name="template_id"
placeholder="Choose a template..."
required="state == 'mail_post'"
context="{'default_model': model_name,
'default_use_default_to': True}"/>
<label for="mail_post_method"/>
<div class="d-flex flex-column">
<field name="mail_post_method" required="state == 'mail_post'"/>
<div class="text-muted">
<span invisible="mail_post_method != 'email'">
The message will be sent as an email to the recipients of the
template and will not appear in the messaging history.
</span>
<span invisible="mail_post_method != 'note'">
The message will be posted as an internal note visible to internal
users in the messaging history.
</span>
<span invisible="mail_post_method != 'comment'">
The message will be posted as a message on the record,
notifying all followers. It will appear in the messaging history.
</span>
</div>
</div>
<field name="mail_post_autofollow" invisible="1"/>
</group>
</group>
</xpath>
</field>
</record>

View file

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="ir_cron_view_form" model="ir.ui.view">
<field name="name">ir.cron.view.form.inherit</field>
<field name="model">ir.cron</field>
<field name="inherit_id" ref="base.ir_cron_view_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='user_id']" position="attributes">
<attribute name="widget">many2one_avatar_user</attribute>
</xpath>
</field>
</record>
</odoo>

View file

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="ir_filters_view_form" model="ir.ui.view">
<field name="name">ir.filters.view.form.inherit</field>
<field name="model">ir.filters</field>
<field name="inherit_id" ref="base.ir_filters_view_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='user_ids']" position="attributes">
<attribute name="widget">many2many_avatar_user</attribute>
</xpath>
</field>
</record>
<record id="ir_filters_view_tree" model="ir.ui.view">
<field name="name">ir.filters.view.tree.inherit</field>
<field name="model">ir.filters</field>
<field name="inherit_id" ref="base.ir_filters_view_tree"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='user_ids']" position="attributes">
<attribute name="widget">many2many_avatar_user</attribute>
</xpath>
</field>
</record>
</odoo>

View file

@ -0,0 +1,23 @@
<?xml version="1.0" ?>
<odoo>
<record id="ir_mail_server_view_form" model="ir.ui.view">
<field name="name">ir.mail_server.view.form.inherit.mail</field>
<field name="model">ir.mail_server</field>
<field name="inherit_id" ref="base.ir_mail_server_form"/>
<field name="arch" type="xml">
<xpath expr="//label[@for='smtp_user']" position="attributes">
<attribute name="invisible" add="owner_user_id" separator="or"/>
</xpath>
<xpath expr="//label[@for='smtp_user']" position="after">
<label for="smtp_user" string="User email"
invisible="smtp_authentication == 'certificate' or not owner_user_id"/>
</xpath>
<xpath expr="//field[@name='smtp_pass']" position="after">
<field name="owner_user_id"
placeholder="Restrict usage to a user"
groups="base.group_no_one"
widget="many2one_avatar_user"/>
</xpath>
</field>
</record>
</odoo>

View file

@ -6,13 +6,13 @@
<field name="inherit_id" ref="base.view_model_form"/>
<field name="arch" type="xml">
<field name="transient" position="after">
<field name="is_mail_thread" attrs="{'readonly': [('state','!=', 'manual')]}" groups="base.group_no_one"/>
<field name="is_mail_activity" attrs="{'readonly': [('state','!=', 'manual')]}" groups="base.group_no_one"/>
<field name="is_mail_blacklist" attrs="{'readonly': [('state','!=', 'manual')]}" groups="base.group_no_one"/>
<field name="is_mail_thread" readonly="state != 'manual'" groups="base.group_no_one"/>
<field name="is_mail_activity" readonly="state != 'manual'" groups="base.group_no_one"/>
<field name="is_mail_blacklist" readonly="state != 'manual'" groups="base.group_no_one"/>
</field>
<xpath expr="//field[@name='field_id']//field[@name='copied']" position="after">
<field name="state" invisible="1"/>
<field name="tracking" attrs="{'readonly': [('state','!=', 'manual')]}"/>
<field name="tracking" readonly="state != 'manual'"/>
</xpath>
</field>
</record>
@ -35,7 +35,7 @@
<field name="arch" type="xml">
<field name="copied" position="after">
<field name="state" invisible="1"/>
<field name="tracking" attrs="{'invisible': [('ttype', '=', 'binary')], 'readonly': [('state','!=', 'manual')]}"/>
<field name="tracking" invisible="ttype in ['binary', 'html']" readonly="state != 'manual'"/>
</field>
</field>
</record>

View file

@ -0,0 +1,45 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<record id="mail_activity_plan_template_view_tree" model="ir.ui.view">
<field name="name">mail.activity.plan.template.view.list</field>
<field name="model">mail.activity.plan.template</field>
<field name="arch" type="xml">
<list string="Activities">
<field name="activity_type_id"/>
<field name="summary" placeholder="e.g. Discuss Proposal"/>
<field name="responsible_type"/>
<field name="delay_count"/>
<field name="delay_unit"/>
<field name="delay_from"/>
</list>
</field>
</record>
<record id="mail_activity_plan_template_view_form" model="ir.ui.view">
<field name="name">mail.activity.plan.template.view.form</field>
<field name="model">mail.activity.plan.template</field>
<field name="arch" type="xml">
<form string="Activity">
<field name="company_id" invisible="1"/>
<field name="res_model" invisible="1"/>
<sheet>
<group>
<field name="activity_type_id"/>
<field name="summary" placeholder="e.g. Discuss Proposal"/>
<field name="responsible_type"/>
<field name="responsible_id" invisible="responsible_type != 'other'" required="responsible_type == 'other'"/>
<label for="delay_count"/>
<div>
<field class="oe_inline pe-1 o_input_3ch" name="delay_count"/>
<field class="oe_inline ps-1 pe-2" name="delay_unit"/>
<field class="oe_inline" name="delay_from"/>
</div>
</group>
<field name="note" nolabel="1" class="oe-bordered-editor" placeholder="e.g. Log a note" widget="html_mail"/>
</sheet>
</form>
</field>
</record>
</data>
</odoo>

View file

@ -0,0 +1,193 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<record id="mail_activity_plan_view_search" model="ir.ui.view">
<field name="name">mail.activity.plan.view.search</field>
<field name="model">mail.activity.plan</field>
<field name="arch" type="xml">
<search string="Plan">
<field name="name"/>
<separator/>
<filter string="Archived" name="filter_inactive" domain="[('active', '=', False)]"/>
<filter string="Model" name="group_by_model" domain="[]" context="{'group_by': 'res_model_id'}"/>
</search>
</field>
</record>
<record id="mail_activity_plan_view_tree" model="ir.ui.view">
<field name="name">mail.activity.plan.view.list</field>
<field name="model">mail.activity.plan</field>
<field name="arch" type="xml">
<list string="Planning" sample="1">
<field name="name"/>
<field name="res_model_id" optional="hide"/>
<field name="steps_count"/>
<field name="company_id" groups="base.group_multi_company" optional="hide"/>
</list>
</field>
</record>
<record id="mail_activity_plan_view_tree_detailed" model="ir.ui.view">
<field name="name">mail.activity.plan.view.list.detailed</field>
<field name="model">mail.activity.plan</field>
<field name="inherit_id" ref="mail.mail_activity_plan_view_tree"/>
<field name="mode">primary</field>
<field name="priority">32</field>
<field name="arch" type="xml">
<xpath expr="//field[@name='res_model_id']" position="attributes">
<attribute name="optional">show</attribute>
</xpath>
</field>
</record>
<record id="mail_activity_plan_view_form" model="ir.ui.view">
<field name="name">mail.activity.plan.view.form</field>
<field name="model">mail.activity.plan</field>
<field name="priority">20</field>
<field name="arch" type="xml">
<form string="Planning">
<field name="company_id" invisible="1"/>
<field name="active" invisible="1"/>
<sheet>
<widget name="web_ribbon" title="Archived" bg_color="text-bg-danger" invisible="active"/>
<div class="oe_title">
<label for="name" string="Plan Name"/>
<h1>
<field name="name" placeholder="e.g. Onboarding" options="{'line_breaks': False}" widget="text"/>
</h1>
</div>
<group name="group_plan_fields">
<group>
<field name="res_model"/>
</group>
<group name="company_id" groups="base.group_multi_company">
<field name="company_id" domain="[('id', '=', allowed_company_ids)]" placeholder="Visible to all"/>
</group>
</group>
<notebook>
<page string="Activities To Create">
<!-- Pass on the model to ensure the correct dynamic selection (in e.g. hr) on unsaved plans -->
<field name="template_ids" nolabel="1" context="{'default_res_model': res_model}">
<list>
<field name="company_id" column_invisible="1"/>
<field name="note" column_invisible="1"/>
<field name="sequence" widget="handle"/>
<field name="activity_type_id"
options="{'no_quick_create': True}"/>
<field name="summary" placeholder="e.g. Discuss Proposal"/>
<field name="responsible_type"/>
<field name="responsible_id" readonly="responsible_type != 'other'"
widget="many2one_avatar_user"/>
<field name="delay_count"/>
<field name="delay_unit" string="Unit"/>
<field name="delay_from"/>
<field name="next_activity_ids"
widget="many2many_tags"
invisible="not next_activity_ids"
options="{
'no_quick_create': True,
'edit_tags': True,
}"
optional="hide"
/>
</list>
<kanban class="o_kanban_mobile">
<field name="icon"/>
<templates>
<t t-name="card">
<div class="fw-bold fs-5">
<i t-if="record.icon.value"
t-attf-class="fa #{record.icon.value} fa-fw "
role="img" aria-label="Activity Type" title="Activity Type"/>
<field name="activity_type_id"/>
</div>
<field name="summary"/>
<div>
<field name="delay_count"/> <field name="delay_unit"/>
(<field name="delay_from"/>)
</div>
<field name="next_activity_ids" widget="many2many_tags" invisible="not next_activity_ids"/>
<footer class="p-0">
<field name="responsible_type"/>
<field class="ms-auto" name="responsible_id" widget="many2one_avatar_user" readonly="1"/>
</footer>
</t>
</templates>
</kanban>
</field>
</page>
</notebook>
</sheet>
</form>
</field>
</record>
<record id="mail_activity_plan_view_kanban" model="ir.ui.view" >
<field name="name">mail.activity.plan.view.kanban</field>
<field name="model">mail.activity.plan</field>
<field name="arch" type="xml">
<kanban class="o_kanban_mobile">
<templates>
<t t-name="card">
<field name="name" class="fw-bolder"/>
<field name="res_model_id"/>
<div>
<i class="fa fa-cogs fa-fw me-2" role="img" aria-label="Steps count" title="Steps count"/>
<field name="steps_count"/>
</div>
</t>
</templates>
</kanban>
</field>
</record>
<record id="mail_activity_plan_view_form_fixed_model" model="ir.ui.view">
<field name="name">mail.activity.plan.view.form.fixed.model</field>
<field name="model">mail.activity.plan</field>
<field name="mode">primary</field>
<field name="priority">10</field>
<field name="inherit_id" ref="mail.mail_activity_plan_view_form"/>
<field name="arch" type="xml">
<xpath expr="//list" position="attributes">
<attribute name="editable">bottom</attribute>
</xpath>
<xpath expr="//field[@name='res_model']" position="attributes">
<attribute name="readonly">1</attribute>
</xpath>
</field>
</record>
<record id="mail_activity_plan_action" model="ir.actions.act_window">
<field name="name">Activity Plans</field>
<field name="res_model">mail.activity.plan</field>
<field name="view_mode">list,kanban,form</field>
<field name="search_view_id" ref="mail_activity_plan_view_search"/>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Create an Activity Plan
</p>
<p>
Activity plans are used to assign a list of activities in just a few clicks
(e.g. "Onboarding", "Prospect Follow-up", "Project Milestone Meeting", ...)
</p>
</field>
</record>
<!-- Force the detailed view as all the activity plans are displayed in the admin view. -->
<record id="mail_activity_plan_view_tree_action" model="ir.actions.act_window.view">
<field name="sequence">1</field>
<field name="view_mode">list</field>
<field name="view_id" ref="mail.mail_activity_plan_view_tree_detailed"/>
<field name="act_window_id" ref="mail.mail_activity_plan_action"/>
</record>
<!-- Force the admin view that allows to modify the target models of the plan. -->
<record id="mail_activity_plan_view_form_action" model="ir.actions.act_window.view">
<field name="sequence">2</field>
<field name="view_mode">form</field>
<field name="view_id" ref="mail.mail_activity_plan_view_form"/>
<field name="act_window_id" ref="mail.mail_activity_plan_action"/>
</record>
</data>
</odoo>

View file

@ -6,35 +6,22 @@
<field name="arch" type="xml">
<form string="Activities">
<sheet>
<widget name="web_ribbon" title="Archived" bg_color="bg-danger" attrs="{'invisible': [('active', '=', True)]}"/>
<widget name="web_ribbon" title="Archived" bg_color="text-bg-danger" invisible="active"/>
<div class="oe_title">
<label for="name" class="oe_edit_only"/>
<h1><field name="name" placeholder="e.g. Schedule a meeting"/></h1>
<h1><field name="name" placeholder="e.g. Schedule a meeting" options="{'line_breaks': False}" widget="text"/></h1>
</div>
<group>
<group name="activity_details" string="Activity Settings">
<field name="active" invisible="1"/>
<field name="category"/>
<field name="default_user_id" options="{'no_create': True}" domain="[('share', '=', False)]"/>
<field name="res_model" groups="base.group_no_one"/>
<field name="res_model" invisible="1"/>
<field name="res_model_change" invisible="1"/>
<field name="initial_res_model" invisible="1"/>
<field name="default_user_id" options="{'no_create': True}" domain="[('share', '=', False)]"
widget="many2one_avatar_user"/>
<field name="res_model" invisible="context.get('default_res_model')"
placeholder="Available everywhere"/>
<field name="summary" placeholder="e.g. &quot;Discuss proposal&quot;"/>
<field name="icon" groups="base.group_no_one"/>
<field name="decoration_type" groups="base.group_no_one"/>
</group>
<group name="activity_planning" string="Next Activity">
<field name="chaining_type" attrs="{'invisible': [('category', '=', 'upload_file')]}"/>
<field name="triggered_next_type_id" options="{'no_open': True}" context="{'default_res_model': res_model}"
attrs="{'required': ['&amp;', ('chaining_type', '=', 'trigger'), ('category', '!=', 'upload_file')],
'invisible': ['&amp;', ('chaining_type', '=', 'suggest'), ('category', '!=', 'upload_file')]}"/>
<field name="suggested_next_type_ids" widget="many2many_tags" context="{'default_res_model': res_model}"
attrs="{'invisible': ['|', ('chaining_type', '=', 'trigger'), ('category', '=', 'upload_file')]}"/>
<field name="mail_template_ids" widget="many2many_tags"
domain="[('model_id.model', '=', res_model)]"
attrs="{'invisible': [('res_model', '=', False)]}"
context="{'default_model': res_model}"/>
<label for="delay_count"/>
<div>
<field class="oe_inline pe-1 o_input_3ch" name="delay_count"/>
@ -42,10 +29,21 @@
<field class="oe_inline" name="delay_from"/>
</div>
</group>
<group name="activity_planning" string="Next Activity">
<field name="chaining_type" invisible="category == 'upload_file'"/>
<field name="triggered_next_type_id" options="{'no_open': True}" context="{'default_res_model': res_model}"
invisible="chaining_type == 'suggest' and category != 'upload_file'"
required="chaining_type == 'trigger' and category != 'upload_file'"/>
<field name="suggested_next_type_ids" widget="many2many_tags" context="{'default_res_model': res_model}"
invisible="chaining_type == 'trigger' or category == 'upload_file'"/>
<field name="mail_template_ids" widget="many2many_tags"
domain="[('model_id.model', '=', res_model)]"
invisible="not res_model"
context="{'default_model': res_model}"/>
</group>
</group>
<label for="default_note" class="fw-bold"/>
<field nolabel="1" name="default_note" placeholder="e.g. &quot;Go over the offer and discuss details&quot;" class="oe-bordered-editor"/>
<p class="alert alert-info" role="alert" attrs="{'invisible': [('res_model_change', '=', False)]}">Modifying the model can have an impact on existing activities using this activity type, be careful.</p>
</sheet>
</form>
</field>
@ -63,32 +61,67 @@
</record>
<record id="mail_activity_type_view_tree" model="ir.ui.view">
<field name="name">mail.activity.type.view.tree</field>
<field name="name">mail.activity.type.view.list</field>
<field name="model">mail.activity.type</field>
<field name="arch" type="xml">
<tree string="Activities" sample="1">
<list string="Activities" sample="1">
<field name="sequence" widget="handle"/>
<field name="name"/>
<field name="summary"/>
<field name="delay_label" string="Planned in" class="text-end"/>
<field name="delay_from" string="Type"/>
<field name="res_model" groups="base.group_no_one"/>
<field name="res_model" column_invisible="context.get('default_res_model')"/>
<field name="icon" groups="base.group_no_one"/>
</tree>
<field name="triggered_next_type_id" optional="hide"
string="Triggered Next"/>
<field name="suggested_next_type_ids" optional="hide" widget="many2many_tags"
string="Suggested Next"/>
</list>
</field>
</record>
<record id="mail_activity_type_view_kanban" model="ir.ui.view" >
<field name="name">mail.activity.type.view.kanban</field>
<field name="model">mail.activity.type</field>
<field name="arch" type="xml">
<kanban class="o_kanban_mobile">
<field name="icon"/>
<templates>
<t t-name="card">
<div class="fw-bold fs-5">
<i t-if="record.icon.value" t-attf-class="fa #{record.icon.value} fa-fw"
role="img" aria-label="Activity Type Name" title="Activity Type Name"/>
<field name="name"/>
</div>
<field t-if="record.res_model.value" name="res_model"/>
<div t-if="record.summary.raw_value">
Default Summary: <field name="summary"/>
</div>
<footer>
<field class="ms-auto" name="default_user_id"
widget="many2one_avatar_user" readonly="1"/>
</footer>
</t>
</templates>
</kanban>
</field>
</record>
<record id="mail_activity_type_action" model="ir.actions.act_window">
<field name="name">Activity Types</field>
<field name="res_model">mail.activity.type</field>
<field name="view_mode">tree,form</field>
<field name="view_mode">list,kanban,form</field>
</record>
<record id="mail_activity_action" model="ir.actions.act_window">
<field name="name">Activities</field>
<field name="name">Activity Overview</field>
<field name="res_model">mail.activity</field>
<field name="view_mode">tree,form</field>
<field name="view_mode">list,form</field>
<!-- ensure pagination works even if _search removes records after fetching -->
<field name="context">{
'force_search_count': 1,
}</field>
</record>
<record id="mail_activity_view_form_popup" model="ir.ui.view">
@ -99,9 +132,13 @@
<form string="Log an Activity" create="false">
<sheet string="Activity">
<div class="oe_button_box" name="button_box" invisible="1">
<button name="action_open_document" string="Open Document"
<button name="action_open_document"
type="object" class="oe_link" icon="fa-file-text-o"
attrs="{'invisible': ['|', ('res_model', '=', False), ('res_id', '=', 0)]}"/>
invisible="not res_model or res_id == 0">
<div class="o_field_widget o_stat_info">
<span class="o_stat_text">Open Document</span>
</div>
</button>
</div>
<group invisible="1">
<field name="activity_category" invisible="1" />
@ -112,38 +149,31 @@
<field name="previous_activity_type_id"/>
<field name="has_recommended_activities"/>
</group>
<group attrs="{'invisible': [('has_recommended_activities','=',False)]}">
<group invisible="not has_recommended_activities">
<field name="recommended_activity_type_id" widget="selection_badge"
domain="[('previous_type_ids', '=', previous_activity_type_id)]"
string="Recommended Activities"/>
</group>
<group>
<group>
<field name="activity_type_id" required="1" options="{'no_create': True, 'no_open': True}"/>
<field name="summary" placeholder="e.g. Discuss proposal"/>
</group>
<field name="activity_type_id" required="1" widget="selection_badge_icons" iconField="icon" nolabel="1"/>
<field name="summary" placeholder="e.g. Discuss Proposal" class="fs-3 pb-2"/>
<group>
<field name="date_deadline"/>
<field name="user_id"/>
</group>
<field name="user_id" widget="many2one_avatar_user"/>
</group>
<field name="note" class="oe-bordered-editor" placeholder="Log a note..."/>
<field name="note" class="oe-bordered-editor embedded-editor-height-4" placeholder="Log a note..." widget="html_mail"/>
<footer>
<field name="id" invisible="1"/>
<button id="mail_activity_schedule" string="Schedule" name="action_close_dialog" type="object" class="btn-primary"
attrs="{'invisible': [('id', '!=', False)]}" data-hotkey="q"/>
<button id="mail_activity_schedule" string="Schedule" close="1" name="action_close_dialog" type="object" class="btn-primary"
invisible="id" data-hotkey="q"/>
<button id="mail_activity_save" string="Save" name="action_close_dialog" type="object" class="btn-primary"
attrs="{'invisible': [('id', '=', False)]}" data-hotkey="q"/>
<button attrs="{'invisible': [('chaining_type', '=', 'trigger')]}" string="Mark as Done" name="action_done"
invisible="not id" data-hotkey="q"/>
<button invisible="chaining_type == 'trigger'" string="Mark Done" name="action_done"
type="object" class="btn-secondary" data-hotkey="w"
context="{'mail_activity_quick_update': True}"/>
<button attrs="{'invisible': [('chaining_type', '=', 'trigger')]}" string="Done &amp; Schedule Next" name="action_done_schedule_next"
type="object" class="btn-secondary" data-hotkey="x"
context="{'mail_activity_quick_update': True}"/>
<button attrs="{'invisible': [('chaining_type', '=', 'suggest')]}" string="Done &amp; Launch Next" name="action_done_schedule_next"
type="object" class="btn-secondary" data-hotkey="x"
context="{'mail_activity_quick_update': True}"/>
<button string="Discard" class="btn-secondary" special="cancel" data-hotkey="z" />
<button string="Discard" class="btn-secondary" special="cancel" data-hotkey="x" />
</footer>
</sheet>
</form>
@ -167,24 +197,72 @@
</field>
</record>
<record id="mail_activity_view_form_without_record_access" model="ir.ui.view">
<field name="name">mail.activity.view.form.without.record.access</field>
<field name="model">mail.activity</field>
<field name="priority">32</field>
<field name="arch" type="xml">
<form string="Log an Activity" create="false" delete="false">
<header>
<button string="Mark Done" class="btn-primary"
name="action_done_redirect_to_other" type="object"/>
</header>
<sheet string="Activity">
<field name="display_name" invisible="1"/>
<group>
<field name="activity_type_id" required="1"
widget="selection_badge_icons" iconField="icon" nolabel="1"/>
<field name="summary" placeholder="e.g. Discuss proposal"/>
<group>
<field name="date_deadline"/>
</group>
</group>
<field name="note" class="oe-bordered-editor embedded-editor-height-4" placeholder="Log a note..." widget="html_mail"/>
</sheet>
</form>
</field>
</record>
<record id="mail_activity_view_search" model="ir.ui.view">
<field name="name">mail.activity.view.search</field>
<field name="model">mail.activity</field>
<field name="arch" type="xml">
<search string="Activity">
<field name="res_model"/>
<field name="summary"/>
<field name="res_name" string="Name" filter_domain="[
'|',
('res_name', 'ilike', self),
('summary', 'ilike', self),
]"/>
<field name="user_id"/>
<field name="activity_type_id"/>
<filter invisible="1" string="Late Activities" name="activities_overdue"
domain="[('date_deadline', '&lt;', context_today().strftime('%Y-%m-%d'))]"
help="Show all records which has next action date is before today"/>
<filter invisible="1" string="Today Activities" name="activities_today"
domain="[('date_deadline', '=', context_today().strftime('%Y-%m-%d'))]"/>
<filter invisible="1" string="Future Activities" name="activities_upcoming_all"
domain="[('date_deadline', '&gt;', context_today().strftime('%Y-%m-%d'))
<filter name="filter_user_id_uid" string="My Activities" domain="[('user_id', '=', uid)]"/>
<filter name="filter_user_id_no_user" string="Unassigned Activities" domain="[('user_id', '=', False)]"/>
<separator/>
<separator invisible="1"/>
<filter string="Overdue" name="filter_date_deadline_past"
domain="[('date_deadline', '&lt;', 'today')]"
help="Show all records whose next activity date is past"/>
<filter string="Today" name="filter_date_deadline_today"
domain="[('date_deadline', '=', 'today')]"/>
<filter string="Tomorrow" name="filter_date_deadline_tomorrow"
help="Show all records whose next action date is tomorrow"
domain="[('date_deadline', '=', 'today +1d')]"/>
<filter string="This week" name="filter_date_deadline_week"
help="Show all records whose next action date is this week"
domain="[
('date_deadline', '&gt;=', '=week_start'),
('date_deadline', '&lt;', '=week_start +1w')
]"/>
<group expand="0" string="Group By">
<filter string="Future" name="filter_date_deadline_future"
domain="[('date_deadline', '&gt;', 'today')
]"/>
<separator/>
<filter string="Done" name="filter_archived" domain="[('active', '=', False)]"/>
<separator />
<group>
<filter string="Deadline" name="date_deadline" context="{'group_by': 'date_deadline'}"/>
<filter string="Document Model" name="group_by_res_model_id" context="{'group_by': 'res_model_id'}"/>
<filter string="Assigned To" name="group_by_user_id" context="{'group_by': 'user_id'}"/>
<filter string="Created By" name="createdby" context="{'group_by': 'create_uid'}"/>
<filter string="Activity Type" name="activittype" context="{'group_by': 'activity_type_id'}"/>
</group>
@ -193,24 +271,106 @@
</record>
<record id="mail_activity_view_tree" model="ir.ui.view">
<field name="name">mail.activity.view.tree</field>
<field name="name">mail.activity.view.list</field>
<field name="model">mail.activity</field>
<field name="arch" type="xml">
<tree string="Next Activities"
decoration-danger="date_deadline &lt; current_date"
decoration-success="date_deadline == current_date"
default_order="date_deadline" create="false">
<field name="res_name"/>
<list string="Next Activities"
default_order="date_deadline" create="true">
<header>
<button name="action_done" type="object" string="Done" icon="fa-check"/>
<button name="action_cancel" type="object" string="Cancel" icon="fa-times"/>
<button name="action_reschedule_today" type="object" string="Today" icon="fa-arrow-down"/>
<button name="action_reschedule_tomorrow" type="object" string="Tomorrow" icon="fa-calendar-plus-o"/>
<button name="action_reschedule_nextweek" type="object" string="Next Week" icon="fa-calendar-o"/>
</header>
<field name="summary" string="Summary"/>
<field name="activity_type_id"/>
<field name="summary"/>
<field name="date_deadline"/>
</tree>
<field name="user_id" widget="many2one_avatar_user"/>
<field name="res_name" string="Linked to"/>
<field name="date_deadline" widget="remaining_days"/>
<field name="date_done" string="Done Date" optional="hide"/>
<field name="feedback" optional="hide"/>
<widget name="mail_activity_list_reschedule_dropdown"/>
<button name="action_done" type="object" string="Done" icon="fa-check" invisible="active == False"/>
<button name="unlink" type="object" string="Cancel" icon="fa-times" class="text-danger" invisible="active == False"/>
</list>
</field>
</record>
<record id="mail_activity_view_tree_without_record_access" model="ir.ui.view">
<field name="name">mail.activity.view.list.without.record.access</field>
<field name="model">mail.activity</field>
<field name="inherit_id" ref="mail_activity_view_tree"/>
<field name="mode">primary</field>
<field name="priority">32</field>
<field name="arch" type="xml">
<xpath expr="//list" position="attributes">
<attribute name="delete">0</attribute>
<attribute name="edit">0</attribute>
<attribute name="duplicate">0</attribute>
<attribute name="js_class">archive_disabled_activity_list</attribute>
</xpath>
</field>
</record>
<record id="mail_activity_view_tree_open_target" model="ir.ui.view">
<field name="name">mail.activity.view.list.open.target</field>
<field name="model">mail.activity</field>
<field name="inherit_id" ref="mail_activity_view_tree"/>
<field name="mode">primary</field>
<field name="priority">32</field>
<field name="arch" type="xml">
<xpath expr="//list" position="attributes">
<attribute name="action">action_open_document</attribute>
<attribute name="type">object</attribute>
<attribute name="js_class">archive_disabled_activity_list</attribute>
<attribute name="multi_edit">1</attribute>
</xpath>
<xpath expr="//list//field[@name='activity_type_id']" position="attributes">
<attribute name="domain">[('res_model', '=', False)]</attribute>
</xpath>
</field>
</record>
<record id="mail_activity_view_kanban_open_target" model="ir.ui.view">
<field name="name">mail.activity.view.kanban.open.target</field>
<field name="model">mail.activity</field>
<field name="arch" type="xml">
<kanban string="Activity" action="action_open_document" type="object" js_class="mail_activity_my_kanban">
<templates>
<field name="active" invisible="1"/>
<field name="icon" invisible="1"/>
<t t-name="card">
<div class="d-flex justify-content-between">
<span class="text-truncate" invisible="not res_name">
<field name="res_name" class="fw-bold" />
(<field class="text-muted" name="res_model_id" />)
</span>
<field name="summary" class="text-truncate" invisible="res_name"/>
<span class="badge rounded-pill text-bg-300">
<i t-if="record.icon" t-attf-class="fa {{record.icon.raw_value}} me-1"/>
<field name="activity_type_id"/>
</span>
</div>
<field class="text-truncate" name="summary" invisible="not res_name"/>
<footer class="align-items-center">
<field name="user_id" widget="many2one_avatar_user" />
<field name="date_deadline" widget="remaining_days" class="ms-2"/>
<button type="object" name="action_done" class="btn btn-link btn-sm ms-auto me-1" invisible="active == False">
<i class="fa fa-check" /> Done
</button>
<button type="object" name="unlink" class="btn btn-link text-danger btn-sm">
<i class="fa fa-times" /> Cancel
</button>
</footer>
</t>
</templates>
</kanban>
</field>
</record>
<record id="mail_activity_action_view_tree" model="ir.actions.act_window.view">
<field name="sequence" eval="1"/>
<field name="view_mode">tree</field>
<field name="view_mode">list</field>
<field name="act_window_id" ref="mail.mail_activity_action"/>
</record>
<record id="mail_activity_action_view_form" model="ir.actions.act_window.view">
@ -220,14 +380,42 @@
<field name="act_window_id" ref="mail.mail_activity_action"/>
</record>
<record id="mail_activity_without_access_action" model="ir.actions.act_window">
<field name="name">Other activities</field>
<field name="res_model">mail.activity</field>
<field name="view_mode">list,form</field>
<field name="search_view_id" ref="mail.mail_activity_view_search"/>
<field name="domain">['|', ('id', 'in', context.get('active_ids')), '&amp;', ('res_model', '=', False), ('user_id', '=', uid)]</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
No activities.
</p>
</field>
<field name="target">main</field>
</record>
<record id="mail_activity_action_without_access_view_tree" model="ir.actions.act_window.view">
<field name="sequence">1</field>
<field name="view_mode">list</field>
<field name="view_id" ref="mail.mail_activity_view_tree_without_record_access"/>
<field name="act_window_id" ref="mail.mail_activity_without_access_action"/>
</record>
<record id="mail_activity_action_without_access_view_form" model="ir.actions.act_window.view">
<field name="sequence">2</field>
<field name="view_mode">form</field>
<field name="view_id" ref="mail.mail_activity_view_form_without_record_access"/>
<field name="act_window_id" ref="mail.mail_activity_without_access_action"/>
</record>
<record id="mail_activity_view_calendar" model="ir.ui.view">
<field name="name">mail.activity.view.calendar</field>
<field name="model">mail.activity</field>
<field name="priority" eval="2"/>
<field name="arch" type="xml">
<calendar string="Activity" date_start="date_deadline" color="activity_type_id">
<calendar string="Activity" date_start="date_deadline" color="activity_type_id" js_class="activity_calendar" create="0" mode="month">
<field name="user_id" avatar_field="avatar_128"/>
<field name="res_name"/>
<field name="res_name" string="Name"/>
<field name="date_deadline"/>
<field name="summary"/>
<field name="activity_type_id" filters="1" invisible="1"/>
@ -235,4 +423,39 @@
</field>
</record>
<record id="mail_activity_action_my" model="ir.actions.act_window">
<field name="name">My Activities</field>
<field name="res_model">mail.activity</field>
<field name="view_mode">list,kanban,calendar</field>
<field name="search_view_id" ref="mail.mail_activity_view_search"/>
<!-- ensure pagination works even if _search removes records after fetching -->
<field name="context">{
'force_search_count': 1,
'search_default_filter_user_id_uid': 1,
'search_default_filter_date_deadline_past': 1,
'search_default_filter_date_deadline_today': 1,
}</field>
</record>
<record id="mail_activity_action_my_view_tree" model="ir.actions.act_window.view">
<field name="sequence" eval="1"/>
<field name="view_mode">list</field>
<field name="act_window_id" ref="mail.mail_activity_action_my"/>
<field name="view_id" ref="mail.mail_activity_view_tree_open_target"/>
</record>
<record id="mail_activity_action_my_view_kanban" model="ir.actions.act_window.view">
<field name="sequence" eval="1"/>
<field name="view_mode">kanban</field>
<field name="act_window_id" ref="mail.mail_activity_action_my"/>
<field name="view_id" ref="mail.mail_activity_view_kanban_open_target"/>
</record>
<record id="mail_activity_action_my_view_calendar" model="ir.actions.act_window.view">
<field name="sequence" eval="1"/>
<field name="view_mode">calendar</field>
<field name="act_window_id" ref="mail.mail_activity_action_my"/>
<field name="view_id" ref="mail.mail_activity_view_calendar"/>
</record>
</odoo>

View file

@ -0,0 +1,80 @@
<?xml version="1.0"?>
<odoo>
<record id="mail_alias_domain_view_form" model="ir.ui.view">
<field name="name">mail.alias.domain.view.form</field>
<field name="model">mail.alias.domain</field>
<field name="arch" type="xml">
<form string="Alias Domain" duplicate="false">
<sheet>
<group>
<group>
<label for="name"/>
<div>
<span class="me-1 oe_inline">@</span>
<field name="name" string="Domain"
class="oe_inline"
placeholder='e.g. "mycompany.com"'/>
</div>
<field name="company_ids" widget="many2many_tags"
string="Used In"
readonly="True"
groups="base.group_multi_company"
placeholder="Visible to all"/>
</group>
<group>
<field name="bounce_alias" groups="base.group_no_one"
placeholder='e.g. "bounce"'/>
<field name="catchall_alias" groups="base.group_no_one"
placeholder='e.g. "catchall"'/>
<field name="default_from" groups="base.group_no_one"
placeholder='e.g. "notifications"'/>
</group>
</group>
</sheet>
</form>
</field>
</record>
<record id="mail_alias_domain_view_tree" model="ir.ui.view">
<field name="name">mail.alias.domain.view.list</field>
<field name="model">mail.alias.domain</field>
<field name="arch" type="xml">
<list string="Alias Domains" duplicate="false">
<field name="sequence" widget="handle"/>
<field name="name"/>
<field name="bounce_alias"/>
<field name="catchall_alias"/>
<field name="default_from"/>
<field name="company_ids" optional="hide"
widget="many2many_tags"
groups="base.group_multi_company"/>
</list>
</field>
</record>
<record id="mail_alias_domain_view_search" model="ir.ui.view">
<field name="name">mail.alias.domain.view.search</field>
<field name="model">mail.alias.domain</field>
<field name="arch" type="xml">
<search string="Alias Domains">
<field name="name"/>
<field name="bounce_alias"/>
<field name="catchall_alias"/>
<field name="company_ids" groups="base.group_multi_company"/>
<group>
<filter string="Company" name="group_by_company_ids"
domain="[]" context="{'group_by': 'company_ids'}"
groups="base.group_multi_company"/>
</group>
</search>
</field>
</record>
<record id="mail_alias_domain_action" model="ir.actions.act_window">
<field name="name">Alias Domains</field>
<field name="res_model">mail.alias.domain</field>
<field name="view_mode">list,form</field>
</record>
</odoo>

View file

@ -3,74 +3,115 @@
<data>
<!-- Alias Form View -->
<record model="ir.ui.view" id="view_mail_alias_form">
<field name="name">mail.alias.form</field>
<record model="ir.ui.view" id="mail_alias_view_form">
<field name="name">mail.alias.view.form</field>
<field name="model">mail.alias</field>
<field name="arch" type="xml">
<form string="Alias">
<field name="alias_status" invisible="1"/>
<div invisible="alias_status != 'invalid'"
class="alert alert-danger text-center" role="alert">
The last message received on this alias has caused an error.
</div>
<sheet>
<div class="oe_button_box" name="button_box">
<button name="open_document" string="Open Document"
type="object" class="oe_link"
attrs="{'invisible': ['|', ('alias_model_id', '=', False), ('alias_force_thread_id', '=', 0)]}"/>
<button name="open_parent_document" string="Open Parent Document"
type="object" class="oe_link" icon="fa-sitemap"
attrs="{'invisible': ['|', ('alias_parent_model_id', '=', False), ('alias_parent_thread_id', '=', 0)]}"/>
invisible="not alias_model_id or alias_force_thread_id == 0"/>
<button name="open_parent_document"
type="object" class="oe_link" icon="fa-sitemap"
invisible="not alias_parent_model_id or alias_parent_thread_id == 0">
<div class="o_field_widget o_stat_info">
<span class="o_stat_text">Open Parent Document</span>
</div>
</button>
</div>
<div class="d-flex">
<h2 class="flex-grow-1" dir="ltr">
<field name="alias_name" placeholder="alias" class="oe_inline"/>@
<field name="alias_domain_id" class="oe_inline" placeholder="e.g. mycompany.com"
options="{'no_create': True, 'no_open': True}"/>
</h2>
<field name="alias_status" widget="badge"
decoration-success="alias_status == 'valid'"
decoration-warning="alias_status == 'not_tested'"
decoration-danger="alias_status == 'invalid'"/>
</div>
<h2 dir="ltr"><field name="alias_name" class="oe_inline"/>@<field name="alias_domain" class="oe_inline"/></h2>
<group>
<field name="alias_model_id"/>
<field name="alias_force_thread_id"/>
<field name="alias_defaults"/>
<field name="alias_contact"/>
<field name="alias_user_id"/>
<field name="alias_incoming_local"/>
<field name="alias_parent_model_id"/>
<field name="alias_parent_thread_id"/>
</group>
<label for="alias_bounced_content" attrs="{'invisible':[('alias_contact', '=', 'everyone')]}"/>
<field name="alias_bounced_content" attrs="{'invisible':[('alias_contact', '=', 'everyone')]}"/>
<label for="alias_bounced_content" invisible="alias_contact == 'everyone'"/>
<field name="alias_bounced_content" invisible="alias_contact == 'everyone'"/>
</sheet>
</form>
</field>
</record>
<!-- Alias List View -->
<record model="ir.ui.view" id="view_mail_alias_tree">
<field name="name">mail.alias.tree</field>
<record model="ir.ui.view" id="mail_alias_view_tree">
<field name="name">mail.alias.view.list</field>
<field name="model">mail.alias</field>
<field name="arch" type="xml">
<tree string="Alias">
<list string="Alias">
<field name="alias_name"/>
<field name="alias_domain_id"/>
<field name="alias_model_id"/>
<field name="alias_user_id"/>
<field name="alias_defaults"/>
<field name="alias_force_thread_id" optional="hide"/>
<field name="alias_parent_model_id"/>
<field name="alias_parent_thread_id" optional="hide"/>
<field name="alias_defaults" optional="hide"/>
<field name="alias_contact"/>
</tree>
<field name="alias_incoming_local" optional="hide"/>
<field name="alias_status" widget="badge"
decoration-success="alias_status == 'valid'"
decoration-warning="alias_status == 'not_tested'"
decoration-danger="alias_status == 'invalid'"/>
<button name="open_document" type="object"
string="Open Document" icon="fa-sitemap"
invisible="not alias_model_id or alias_force_thread_id == 0"/>
<button name="open_parent_document" type="object"
string="Open Owner" icon="fa-sitemap"
invisible="not alias_parent_model_id or alias_parent_thread_id == 0"/>
</list>
</field>
</record>
<!-- Alias Search View -->
<record model="ir.ui.view" id="view_mail_alias_search">
<field name="name">mail.alias.search</field>
<record model="ir.ui.view" id="mail_alias_view_search">
<field name="name">mail.alias.view.search</field>
<field name="model">mail.alias</field>
<field name="arch" type="xml">
<search string="Search Alias">
<field name="alias_name"/>
<field name="alias_domain_id"/>
<field name="alias_model_id"/>
<field name="create_uid"/>
<field name="alias_force_thread_id"/>
<field name="alias_parent_model_id"/>
<field name="alias_parent_thread_id"/>
<separator/>
<filter string="Active" name="active" domain="[('alias_name', '!=', False)]"/>
<group expand="0" string="Group By">
<filter string="User" name="User" context="{'group_by':'alias_user_id'}"/>
<filter string="Model" name="Model" context="{'group_by':'alias_model_id'}"/>
<group>
<filter string="Creator" name="groupby_create_uid"
context="{'group_by': 'create_uid'}"/>
<filter string="Alias Domain" name="groupby_alias_domain_id"
context="{'group_by': 'alias_domain_id'}"/>
<filter string="Document Model" name="groupby_alias_model_id"
context="{'group_by': 'alias_model_id'}"/>
<filter string="Container Model" name="groupby_alias_model_id"
context="{'group_by': 'alias_parent_model_id'}"/>
</group>
</search>
</field>
</record>
<record id="action_view_mail_alias" model="ir.actions.act_window">
<record id="mail_alias_action" model="ir.actions.act_window">
<field name="name">Aliases</field>
<field name="res_model">mail.alias</field>
<field name="context">{

View file

@ -1,13 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<record id="mail_blacklist_view_tree" model="ir.ui.view">
<field name="name">mail.blacklist.view.tree</field>
<field name="name">mail.blacklist.view.list</field>
<field name="model">mail.blacklist</field>
<field name="arch" type="xml">
<tree string="Email Blacklist">
<list string="Email Blacklist">
<field name="create_date" string="Blacklist Date"/>
<field name="email"/>
</tree>
</list>
</field>
</record>
@ -19,25 +19,18 @@
<header>
<button name="mail_action_blacklist_remove" string="Unblacklist"
type="object" class="oe_highlight" context="{'default_email': email}"
attrs="{'invisible': ['|', ('active', '=', False), ('email', '=', False)]}"/>
invisible="not active or not email"/>
<button name="action_add" string="Blacklist"
type="object" class="oe_highlight"
attrs="{'invisible': ['|', ('active', '=', True), ('email', '=', False)]}"/>
invisible="active or not email"/>
</header>
<sheet>
<widget name="web_ribbon" title="Archived" bg_color="bg-danger" attrs="{'invisible': [('active', '=', True)]}"/>
<div class="badge rounded-pill text-bg-danger float-end fs-6 border-0" invisible="active">Archived</div>
<group>
<group>
<field name="email"/>
<field name="active" readonly="1"/>
<br/>
</group>
<field name="email"/>
</group>
</sheet>
<div class="oe_chatter">
<field name="message_follower_ids" groups="base.group_user"/>
<field name="message_ids"/>
</div>
<chatter/>
</form>
</field>
</record>

View file

@ -0,0 +1,94 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<record id="mail_canned_response_view_search" model="ir.ui.view">
<field name="name">mail.canned.response.view.search</field>
<field name="model">mail.canned.response</field>
<field name="arch" type="xml">
<search string="Canned Responses Search">
<field name="source"/>
<field name="substitution"/>
<filter string="Private" name="filter_create_uid" domain="[('is_shared', '=', False)]"/>
<filter string="Shared" name="filter_is_shared" domain="[('is_shared', '=', True)]"/>
<group>
<filter string="Authorized Groups" name="group_by_group_ids" context="{'group_by': 'group_ids'}"/>
</group>
</search>
</field>
</record>
<record id="mail_canned_response_view_tree" model="ir.ui.view">
<field name="name">mail.canned.response.list</field>
<field name="model">mail.canned.response</field>
<field name="arch" type="xml">
<list string="Canned responses" editable="bottom" default_order="is_shared" sample="1">
<field name="source" placeholder="e.g. hello" widget="shortcut" readonly="not is_editable"/>
<field name="substitution" placeholder="e.g. Hello, how may I help you?" readonly="not is_editable"/>
<field name="create_uid" widget="many2one_avatar_user" optional="hide"/>
<field name="group_ids" widget="many2many_tags" readonly="not is_editable" optional="hide"/>
<field name="last_used" readonly="1" optional="hide"/>
<field name="is_editable" column_invisible="True"/>
<field name="is_shared" column_invisible="True"/>
</list>
</field>
</record>
<record id="mail_canned_response_view_form" model="ir.ui.view">
<field name="name">mail.canned.response.form</field>
<field name="model">mail.canned.response</field>
<field name="arch" type="xml">
<form string="Canned response">
<sheet>
<group>
<field name="source" widget="shortcut" readonly="not is_editable"/>
<field name="substitution" placeholder="e.g. Hello, how may I help you?" readonly="not is_editable"/>
<field name="group_ids" widget="many2many_tags" readonly="not is_editable"/>
<field name="is_editable" invisible="True"/>
</group>
</sheet>
</form>
</field>
</record>
<record id="mail_canned_response_view_kanban" model="ir.ui.view">
<field name="name">mail.canned.response.kanban</field>
<field name="model">mail.canned.response</field>
<field name="arch" type="xml">
<kanban class="o_kanban_mobile" sample="1">
<templates>
<t t-name="card">
<div class="oe_kanban_global_click p-2 d-flex flex-column gap-1">
<div class="fw-bold fs-5">
<field name="source" widget="shortcut"/>
</div>
<div class="text-truncate" t-att-title="record.substitution.value">
<field name="substitution"/>
</div>
<div class="pt-1">
<field name="group_ids" widget="many2many_tags"/>
</div>
</div>
</t>
</templates>
</kanban>
</field>
</record>
<record id="mail_canned_response_action" model="ir.actions.act_window">
<field name="name">Canned Responses</field>
<field name="res_model">mail.canned.response</field>
<field name="view_mode">list,form,kanban</field>
<field name="search_view_id" ref="mail_canned_response_view_search"/>
<field name="context">{}</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
No canned response found. Let's create one!
</p><p>
Use canned responses to quickly insert prewritten messages with <i>::shortcut</i>. You can edit the text before sending.
</p>
</field>
</record>
</data>
</odoo>

View file

@ -1,49 +0,0 @@
<?xml version="1.0"?>
<odoo><data>
<!-- mail.channel.member -->
<record id="mail_channel_member_view_tree" model="ir.ui.view">
<field name="name">mail.channel.member.tree</field>
<field name="model">mail.channel.member</field>
<field name="priority">10</field>
<field name="arch" type="xml">
<tree string="Channels">
<field name="display_name"/>
<field name="channel_id"/>
<field name="seen_message_id"/>
</tree>
</field>
</record>
<record id="mail_channel_member_view_form" model="ir.ui.view">
<field name="name">mail.channel.member.form</field>
<field name="model">mail.channel.member</field>
<field name="arch" type="xml">
<form string="Channel">
<sheet>
<group>
<field name="partner_id"/>
<field name="guest_id"/>
<field name="channel_id"/>
<field name="custom_channel_name"/>
<field name="fetched_message_id"/>
<field name="seen_message_id"/>
<field name="message_unread_counter"/>
<field name="fold_state"/>
<field name="is_minimized"/>
<field name="is_pinned"/>
<field name="last_interest_dt"/>
<field name="last_seen_dt"/>
<field name="rtc_inviting_session_id"/>
</group>
</sheet>
</form>
</field>
</record>
<record id="mail_channel_member_action" model="ir.actions.act_window">
<field name="name">Channels/Member</field>
<field name="res_model">mail.channel.member</field>
<field name="view_mode">tree,form</field>
</record>
</data></odoo>

View file

@ -1,123 +0,0 @@
<?xml version="1.0"?>
<odoo>
<data>
<!-- mail.channel -->
<record id="mail_channel_view_kanban" model="ir.ui.view">
<field name="name">mail.channel.kanban</field>
<field name="model">mail.channel</field>
<field name="priority" eval="10"/>
<field name="arch" type="xml">
<kanban>
<field name="id"/>
<field name="description"/>
<field name="is_member"/>
<field name="group_ids"/>
<templates>
<t t-name="kanban-description">
<div class="oe_group_description" t-if="record.description.raw_value">
<field name="description"/>
</div>
</t>
<t t-name="kanban-box">
<div class="oe_module_vignette oe_kanban_global_click d-flex align-items-center">
<img t-att-src="kanban_image('mail.channel', 'avatar_128', record.id.raw_value)" class="oe_module_icon" alt="Channel"/>
<div class="oe_module_desc">
<h4 class="o_kanban_record_title">#<field name="name"/></h4>
<p class="oe_module_name">
<field name="description"/>
</p>
<button type="object" attrs="{'invisible':['|', ('is_member','=',True), ('group_ids', '!=', [])]}" class="btn btn-primary float-end" name="channel_join">Join</button>
<button type="object" attrs="{'invisible':['|', ('is_member','=',False), ('group_ids', '!=', [])]}" class="btn btn-secondary float-end" name="action_unfollow">Leave</button>
</div>
</div>
</t>
</templates>
</kanban>
</field>
</record>
<record id="mail_channel_view_form" model="ir.ui.view">
<field name="name">mail.channel.form</field>
<field name="model">mail.channel</field>
<field name="priority" eval="10"/>
<field name="arch" type="xml">
<form string="Mail Channel Form">
<sheet>
<div class="oe_button_box" name="button_box"/>
<field name="avatar_128" invisible="1"/>
<field name="image_128" widget="image" class="oe_avatar" options="{'size': [90, 90], 'preview_image':'avatar_128'}"/>
<div class="oe_title">
<label for="name" string="Group Name"/>
<h1>
#<field name="name" class="oe_inline" default_focus="1" placeholder="e.g. support" readonly="0"/>
</h1>
</div>
<group class="o_label_nowrap">
<field name="active" invisible="1"/>
<field name="description" placeholder="Topics discussed in this group..."/>
</group>
<notebook>
<page string="Privacy" name="privacy">
<group class="o_label_nowrap">
<field name="group_public_id"
attrs="{'invisible': [('channel_type', '!=', 'channel')]}"
/>
<field name="group_ids" widget="many2many_tags"
attrs="{'invisible': [('channel_type', '!=', 'channel')]}"
string="Auto Subscribe Groups"/>
</group>
</page>
<page string="Members" name="members">
<field name="channel_type" invisible="1"/>
<field name="channel_member_ids" mode="tree" context="{'active_test': False}" attrs="{'readonly': [('channel_type', '=', 'chat')]}">
<tree string="Members" editable="bottom">
<field name="partner_id" required="1" attrs="{'readonly': [('id', '!=', False)]}"/>
<field name="partner_email" readonly="1"/>
</tree>
</field>
</page>
<page string="Integrations" invisible="1" name="mail_channel_integrations"></page>
</notebook>
</sheet>
</form>
</field>
</record>
<record id="mail_channel_view_tree" model="ir.ui.view">
<field name="name">mail.channel.tree</field>
<field name="model">mail.channel</field>
<field name="priority" eval="10"/>
<field name="arch" type="xml">
<tree string="Groups">
<field name="name"/>
</tree>
</field>
</record>
<record id="mail_channel_view_search" model="ir.ui.view">
<field name="name">mail.channel.search</field>
<field name="model">mail.channel</field>
<field name="priority" eval="10"/>
<field name="arch" type="xml">
<search string="Search Groups">
<field name="name"/>
<filter string="Archived" name="inactive" domain="[('active', '=', False)]"/>
</search>
</field>
</record>
<record id="mail_channel_action_view" model="ir.actions.act_window">
<field name="name">Join a group</field>
<field name="res_model">mail.channel</field>
<field name="view_mode">kanban,tree,form</field>
<field name="search_view_id" ref="mail_channel_view_search"/>
</record>
<record id="action_discuss" model="ir.actions.client">
<field name="name">Discuss</field>
<field name="tag">mail.action_discuss</field>
<field name="params" eval="&quot;{ 'default_active_id': 'mail.box_inbox' }&quot;"/>
</record>
</data>
</odoo>

View file

@ -4,15 +4,15 @@
<!-- FOLLOWERS !-->
<record model="ir.ui.view" id="view_followers_tree">
<field name="name">mail.followers.tree</field>
<field name="name">mail.followers.list</field>
<field name="model">mail.followers</field>
<field name="priority">10</field>
<field name="arch" type="xml">
<tree string="Followers">
<list string="Followers">
<field name="res_model"/>
<field name="res_id"/>
<field name="partner_id"/>
</tree>
</list>
</field>
</record>
@ -40,7 +40,7 @@
<record id="action_view_followers" model="ir.actions.act_window">
<field name="name">Followers</field>
<field name="res_model">mail.followers</field>
<field name="view_mode">tree,form</field>
<field name="view_mode">list,form</field>
</record>
</data>

View file

@ -1,12 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<record id="mail_gateway_allowed_view_tree" model="ir.ui.view">
<field name="name">mail.gateway.allowed.view.tree</field>
<field name="name">mail.gateway.allowed.view.list</field>
<field name="model">mail.gateway.allowed</field>
<field name="arch" type="xml">
<tree string="Mail Gateway Allowed" editable="top">
<list string="Mail Gateway Allowed" editable="top">
<field name="email"/>
</tree>
</list>
</field>
</record>
@ -23,6 +23,6 @@
<record id="mail_gateway_allowed_action" model="ir.actions.act_window">
<field name="name">Mail Gateway Allowed</field>
<field name="res_model">mail.gateway.allowed</field>
<field name="view_mode">tree</field>
<field name="view_mode">list</field>
</record>
</odoo>

View file

@ -2,24 +2,46 @@
<odoo>
<record id="mail_guest_view_tree" model="ir.ui.view">
<field name="name">mail.guest.tree</field>
<field name="name">mail.guest.list</field>
<field name="model">mail.guest</field>
<field name="priority">10</field>
<field name="arch" type="xml">
<tree string="Guests">
<list string="Guests">
<field name="id"/>
<field name="name"/>
<field name="country_id"/>
<field name="lang"/>
<field name="timezone"/>
</tree>
</list>
</field>
</record>
<record id="mail_guest_view_form" model="ir.ui.view">
<field name="name">mail.guest.form</field>
<field name="model">mail.guest</field>
<field name="arch" type="xml">
<form string="Guest">
<sheet>
<group>
<group>
<field name="name"/>
<field name="country_id"/>
</group>
<group>
<field name="lang"/>
<field name="timezone"/>
<field name="channel_ids" widget="many2many_tags"/>
</group>
</group>
</sheet>
</form>
</field>
</record>
<record id="mail_guest_action" model="ir.actions.act_window">
<field name="name">Guests</field>
<field name="res_model">mail.guest</field>
<field name="view_mode">tree,form</field>
<field name="view_mode">list,form</field>
</record>
</odoo>

View file

@ -1,22 +1,25 @@
<?xml version="1.0"?>
<odoo>
<record id="action_ice_servers" model="ir.actions.act_window">
<field name="name">ICE servers</field>
<field name="type">ir.actions.act_window</field>
<field name="name">ICE Servers</field>
<field name="res_model">mail.ice.server</field>
<field name="view_mode">tree,form</field>
<field name="view_mode">list,form,kanban</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">No ICE servers found. Let's create one!</p>
<p>Use your own servers for calls to manage heavy traffic and ensure reliability if Twilio is unavailable.</p>
</field>
</record>
<record model="ir.ui.view" id="view_ice_server_tree">
<field name="name">mail.ice.server.tree</field>
<field name="name">mail.ice.server.list</field>
<field name="model">mail.ice.server</field>
<field name="arch" type="xml">
<tree editable="bottom">
<list editable="bottom" sample="1">
<field colspan="1" name="server_type"/>
<field name="uri"/>
<field name="username"/>
<field name="credential"/>
</tree>
</list>
</field>
</record>
@ -24,15 +27,13 @@
<field name="name">mail.ice.server.form</field>
<field name="model">mail.ice.server</field>
<field name="arch" type="xml">
<form string="ICE server">
<form string="ICE Server Configuration">
<sheet>
<group>
<label for="uri"/>
<div class="oe_inline" name="URI" style="display: inline;">
<field name="server_type" class="oe_inline"/><field name="uri" class="oe_inline"/>
</div>
<field name="server_type" class="oe_inline"/>
<field name="uri" placeholder="stun:stun.google.com:19302 or turn:turn.example.com:3478"/>
</group>
<group>
<group string="Authentication">
<field name="username"/>
<field name="credential"/>
</group>
@ -40,4 +41,62 @@
</form>
</field>
</record>
<record model="ir.ui.view" id="view_ice_server_kanban">
<field name="name">mail.ice.server.kanban</field>
<field name="model">mail.ice.server</field>
<field name="arch" type="xml">
<kanban class="o_kanban_mobile" sample="1">
<templates>
<t t-name="card">
<div class="oe_kanban_global_click">
<div class="oe_kanban_content p-2">
<div class="d-flex align-items-center mb-2">
<span class="fw-bold me-1">Type:</span>
<span class="fw-bold">
<field name="server_type"/>
</span>
</div>
<div class="d-flex align-items-center mb-2">
<span class="fw-bold me-1">URI:</span>
<span class="text-primary fw-bold">
<field name="uri"/>
</span>
</div>
<t t-if="record.username.raw_value">
<div class="d-flex align-items-center mb-2">
<span class="fw-bold me-1">Username:</span>
<field name="username"/>
</div>
</t>
<t t-if="record.credential.raw_value">
<div class="d-flex align-items-center">
<span class="fw-bold me-1">Credential:</span>
<field name="credential"/>
</div>
</t>
</div>
</div>
</t>
</templates>
</kanban>
</field>
</record>
<record id="view_ice_server_search" model="ir.ui.view" >
<field name="name">mail.ice.server.search</field>
<field name="model">mail.ice.server</field>
<field name="arch" type="xml">
<search string="Search ICE Servers">
<field name="uri"/>
<field name="username"/>
<field name="credential"/>
<filter string="STUN" name="stun" domain="[('server_type','=','stun')]"/>
<filter string="TURN" name="turn" domain="[('server_type','=','turn')]"/>
<group>
<filter string="Server Type" name="group_by_server_type" context="{'group_by': 'server_type'}"/>
</group>
</search>
</field>
</record>
</odoo>

View file

@ -1,25 +1,65 @@
<?xml version="1.0"?>
<odoo>
<record id="mail_link_preview_view_form" model="ir.ui.view">
<field name="name">mail.link.preview.form</field>
<field name="model">mail.link.preview</field>
<field name="arch" type="xml">
<form string="Link Previews">
<sheet>
<group>
<group>
<field name="source_url"/>
<field name="og_type"/>
<field name="og_title"/>
</group>
<group>
<field name="og_image"/>
<field name="og_image" nolabel="1" widget="image_url" options="{'size': [150, 150]}" />
<field name="og_mimetype"/>
<field name="image_mimetype"/>
<field name="create_date"/>
</group>
</group>
<label for="og_description"/>
<field name="og_description"/>
<field name="message_link_preview_ids"/>
</sheet>
</form>
</field>
</record>
<record id="mail_link_preview_view_tree" model="ir.ui.view">
<field name="name">mail.link.preview.tree</field>
<field name="name">mail.link.preview.list</field>
<field name="model">mail.link.preview</field>
<field name="priority">10</field>
<field name="arch" type="xml">
<tree string="Link Previews">
<list string="Link Previews">
<field name="id"/>
<field name="source_url"/>
<field name="og_title"/>
<field name="og_type"/>
<field name="image_mimetype"/>
</tree>
</list>
</field>
</record>
<record id="mail_link_preview_action" model="ir.actions.act_window">
<field name="name">Link Previews</field>
<field name="res_model">mail.link.preview</field>
<field name="view_mode">tree,form</field>
<field name="view_mode">list,form</field>
</record>
<record id="message_link_preview_list" model="ir.ui.view">
<field name="name">mail.message.link.preview.list</field>
<field name="model">mail.message.link.preview</field>
<field name="priority">10</field>
<field name="arch" type="xml">
<list string="messages">
<field name="author_id"/>
<field name="is_hidden"/>
</list>
</field>
</record>
</odoo>

View file

@ -8,32 +8,38 @@
<form string="Email message" duplicate="0">
<header>
<field name="message_type" invisible="1"/>
<button name="send" string="Send Now" type="object" class="oe_highlight" attrs="{'invisible': ['|', ('state', '!=', 'outgoing'), ('message_type', '=', 'user_notification')]}"/>
<button name="mark_outgoing" string="Retry" type="object" states='exception,cancel'/>
<button name="cancel" string="Cancel" type="object" states='outgoing'/>
<button name="action_send_and_close" string="Send &amp; Close" type="object" class="oe_highlight" invisible="state != 'outgoing' or message_type == 'user_notification'"/>
<button name="mark_outgoing" string="Retry" type="object" invisible="state not in ('exception', 'cancel')"/>
<button name="cancel" string="Cancel" type="object" invisible="state != 'outgoing'"/>
<field name="state" widget="statusbar" statusbar_visible="outgoing,sent,received,exception,cancel"/>
</header>
<sheet>
<field name="model" invisible="1"/>
<field name="res_id" invisible="1"/>
<div class="oe_button_box" name="button_box">
<button name="action_open_document" string="Open Document"
<button name="action_open_document"
type="object" class="oe_link" icon="fa-file-text-o"
attrs="{'invisible': ['|', ('model', '=', False), ('res_id', '=', 0)]}"/>
invisible="not model or res_id == 0">
<div class="o_field_widget o_stat_info">
<span class="o_stat_text">Open Document</span>
</div>
</button>
</div>
<field name="mail_message_id_int" required="0" invisible="1"/>
<label for="subject" class="oe_edit_only"/>
<h2><field name="subject"/></h2>
<div class="oe_title">
<label for="subject" class="oe_edit_only"/>
<h2><field name="subject"/></h2>
</div>
<div style="vertical-align: top;">
by <field name="author_id" class="oe_inline" string="User"/> on <field name="date" readonly="1" class="oe_inline"/>
<button name="%(action_email_compose_message_wizard)d" string="Reply" type="action" icon="fa-reply text-warning"
context="{'default_composition_mode':'comment', 'default_parent_id': mail_message_id_int}" states='received,sent,exception,cancel'/>
context="{'default_composition_mode':'comment', 'default_parent_id': mail_message_id_int}" invisible="state not in ('received', 'sent', 'exception', 'cancel')"/>
</div>
<group>
<field name="email_from"/>
<field name="email_to"/>
<field name="recipient_ids" widget="many2many_tags"
domain="[('type', '!=', 'private'), ('active', '=', True)]"/>
domain="[('active', '=', True)]"/>
<field name="email_cc"/>
<field name="reply_to"/>
<field name="scheduled_date" placeholder="YYYY-MM-DD HH:MM:SS"/>
@ -41,14 +47,12 @@
<notebook>
<page string="Body" name="body">
<field name="body_content"/>
<field name="body_html" attrs="{'invisible': 1}"/>
</page>
<page string="Advanced" name="advanced" groups="base.group_no_one">
<group>
<group string="Status">
<field name="auto_delete"
attrs="{'invisible': [('state', '!=', 'outgoing'), ('state', '!=', 'exception')]}"/>
<field name="to_delete" invisible="1"/>
invisible="state != 'outgoing' and state != 'exception'"/>
<field name="is_notification"/>
<field name="message_type"/>
<field name="mail_server_id"/>
@ -65,14 +69,14 @@
</page>
<page string="Attachments" name="attachments">
<div class="alert alert-warning" role="alert"
attrs="{'invisible': [('restricted_attachment_count', '=', 0)]}">
invisible="restricted_attachment_count == 0">
You do not have access to <field name="restricted_attachment_count"/>
attachment(s) of this email.
</div>
<field name="unrestricted_attachment_ids"
domain="[('res_field','=', False)]"/>
</page>
<page string="Failure Reason" name="failure_reason" attrs="{'invisible': [('state', '!=', 'exception')]}">
<page string="Failure Reason" name="failure_reason" invisible="state != 'exception'">
<field name="failure_reason"/>
</page>
</notebook>
@ -82,29 +86,28 @@
</record>
<record model="ir.ui.view" id="view_mail_tree">
<field name="name">mail.mail.tree</field>
<field name="name">mail.mail.list</field>
<field name="model">mail.mail</field>
<field name="arch" type="xml">
<tree string="Emails">
<list string="Emails">
<header>
<button name="action_retry" string="Retry" type="object"/>
</header>
<field name="date"/>
<field name="subject"/>
<field name="author_id" string="User"/>
<field name="message_id" invisible="1"/>
<field name="recipient_ids" invisible="1"/>
<field name="model" invisible="1"/>
<field name="res_id" invisible="1"/>
<field name="email_from" invisible="1"/>
<field name="message_type" invisible="1"/>
<field name="message_id" column_invisible="True"/>
<field name="recipient_ids" column_invisible="True"/>
<field name="model" column_invisible="True"/>
<field name="res_id" column_invisible="True"/>
<field name="email_from" column_invisible="True"/>
<field name="message_type" column_invisible="True"/>
<field name="state" widget="badge" decoration-muted="state in ('sent', 'cancel')"
decoration-info="state=='outgoing'" decoration-danger="state=='exception'"/>
<field name="to_delete" invisible="1"/>
<button name="send" string="Send Now" type="object" icon="fa-paper-plane" attrs="{'invisible': ['|', ('state', '!=', 'outgoing'), ('message_type', '=', 'user_notification')]}"/>
<button name="mark_outgoing" string="Retry" type="object" icon="fa-repeat" states='exception,cancel'/>
<button name="cancel" string="Cancel Email" type="object" icon="fa-times-circle" states='outgoing'/>
</tree>
<button name="send" string="Send Now" type="object" icon="fa-paper-plane" invisible="state != 'outgoing' or message_type == 'user_notification'"/>
<button name="mark_outgoing" string="Retry" type="object" icon="fa-repeat" invisible="state not in ('exception', 'cancel')"/>
<button name="cancel" string="Cancel Email" type="object" icon="fa-times-circle" invisible="state != 'outgoing'"/>
</list>
</field>
</record>
@ -120,16 +123,21 @@
<filter name="sent" string="Sent" domain="[('state','=','sent')]"/>
<filter name="exception" string="Failed" domain="[('state','=','exception')]"/>
<separator/>
<filter name="type_email" string="Email" domain="[('message_type','=','email')]"/>
<filter name="type_comment" string="Comment" domain="[('message_type','=','comment')]"/>
<filter name="type_notification" string="Notification" domain="[('message_type','=','notification')]"/>
<group expand="0" string="Extended Filters...">
<filter name="filter_type_email_outgoing" string="Outgoing Email"
domain="[('message_type','=','email_outgoing')]"/>
<filter name="filter_type_email" string="Incoming Email"
domain="[('message_type','=','email')]"/>
<filter name="filter_type_comment" string="Comment"
domain="[('message_type','=','comment')]"/>
<filter name="filter_type_notification" string="Notification"
domain="[('message_type','=','notification')]"/>
<group>
<field name="author_id"/>
<field name="recipient_ids"/>
<field name="model"/>
<field name="res_id"/>
</group>
<group expand="0" string="Group By">
<group>
<filter string="Status" name="status" domain="[]" context="{'group_by':'state'}"/>
<filter string="Author" name="author" context="{'group_by':'author_id'}"/>
<filter string="Thread" name="thread" domain="[]" context="{'group_by':'message_id'}"/>
@ -142,7 +150,7 @@
<record id="action_view_mail_mail" model="ir.actions.act_window">
<field name="name">Emails</field>
<field name="res_model">mail.mail</field>
<field name="view_mode">tree,form</field>
<field name="view_mode">list,form</field>
<field name="context">{}</field>
<field name="search_view_id" ref="view_mail_search"/>
</record>

View file

@ -3,10 +3,55 @@
<menuitem name="Discuss"
id="mail.menu_root_discuss"
action="action_discuss"
web_icon="mail,static/description/icon.svg"
web_icon="mail,static/description/icon.png"
groups="base.group_user"
sequence="5"
/>
<menuitem
id="mail.main_menu_discuss"
name="Discuss"
parent="mail.menu_root_discuss"
action="action_discuss"
sequence="1"
/>
<menuitem
id="mail.menu_channel"
name="Channels"
parent="mail.menu_root_discuss"
action="mail.discuss_channel_action"
sequence="2"
/>
<menuitem
id="mail.menu_configuration"
name="Configuration"
parent="mail.menu_root_discuss"
sequence="3"
/>
<menuitem name="Notifications"
id="mail.menu_notification_settings"
parent="mail.menu_configuration"
action="mail.discuss_notification_settings_action"
sequence="1"
/>
<menuitem
id="mail.menu_call_settings"
name="Voice &amp; Video"
parent="mail.menu_configuration"
action="mail.discuss_call_settings_action"
sequence="5"
/>
<menuitem name="Canned Responses"
id="mail.menu_canned_responses"
parent="mail.menu_configuration"
action="mail.mail_canned_response_action"
sequence="15"
/>
<menuitem name="Roles"
id="mail.menu_roles"
parent="mail.menu_configuration"
action="mail.res_role_action"
sequence="25"
/>
<record id="base.menu_email" model="ir.ui.menu">
<field name="sequence">3</field>
@ -18,6 +63,16 @@
parent="base.menu_email"
action="action_view_mail_mail"
sequence="1"/>
<menuitem id="mail_alias_menu"
parent="base.menu_email"
action="mail_alias_action"
sequence="11"
groups="base.group_no_one"/>
<menuitem id="mail_alias_domain_menu"
parent="base.menu_email"
action="mail_alias_domain_action"
sequence="12"
groups="base.group_no_one"/>
<menuitem name="Incoming Mail Servers"
id="menu_action_fetchmail_server_tree"
parent="base.menu_email"
@ -28,21 +83,16 @@
parent="base.menu_email"
action="action_email_template_tree_all"
sequence="10"/>
<menuitem id="mail_alias_menu"
parent="base.menu_email"
action="action_view_mail_alias"
sequence="11"
groups="base.group_no_one"/>
<menuitem id="mail_channel_menu_settings"
<menuitem id="mail.discuss_channel_menu_settings"
name="Channels"
parent="base.menu_email"
action="mail_channel_action_view"
action="mail.discuss_channel_action_view"
sequence="20"
groups="base.group_no_one"/>
<menuitem name="Channels/Partner"
id="mail_channel_member_menu"
<menuitem name="Channels/Members"
id="mail.discuss_channel_member_menu"
parent="base.menu_email"
action="mail_channel_member_action"
action="mail.discuss_channel_member_action"
sequence="21"
groups="base.group_no_one"/>
<menuitem id="mail_gateway_allowed_menu"
@ -78,19 +128,6 @@
action="action_view_mail_tracking_value"
sequence="5"/>
<menuitem
id="menu_mail_activity_type"
action="mail_activity_type_action"
parent="mail.mail_menu_technical"
sequence="10"
/>
<menuitem
id="menu_mail_activities"
action="mail_activity_action"
parent="mail.mail_menu_technical"
sequence="11"
/>
<menuitem name="Notifications"
id="mail_notification_menu"
parent="mail.mail_menu_technical"
@ -119,13 +156,13 @@
action="mail_guest_action"
parent="mail.mail_menu_technical"
sequence="51"/>
<menuitem id="mail_channel_rtc_session_menu"
<menuitem id="mail.discuss_channel_rtc_session_menu"
name="RTC sessions"
action="mail_channel_rtc_session_action"
action="mail.discuss_channel_rtc_session_action"
parent="mail.mail_menu_technical"
sequence="52"/>
<menuitem id="mail_channel_ice_servers_menu"
name="ICE servers"
<menuitem id="mail.ice_servers_menu"
name="ICE Servers"
action="action_ice_servers"
parent="mail.mail_menu_technical"
sequence="53"/>
@ -139,12 +176,37 @@
action="mail_link_preview_action"
parent="mail.mail_menu_technical"
sequence="55"/>
<menuitem id="discuss_gif_favorite_menu"
name="GIF favorite"
action="discuss_gif_favorite_action"
parent="mail.mail_menu_technical"
sequence="56"/>
<menuitem name="Activities"
id="menu_mail_activities_section"
parent="base.menu_custom"
sequence="2" />
<menuitem
id="menu_mail_activities"
action="mail_activity_action"
parent="mail.menu_mail_activities_section"
sequence="10"/>
<menuitem
id="menu_mail_activity_type"
action="mail_activity_type_action"
parent="mail.menu_mail_activities_section"
sequence="20"/>
<menuitem
id="menu_mail_activity_plan"
action="mail_activity_plan_action"
parent="mail.menu_mail_activities_section"
sequence="30"/>
<!--
This menuitem will be activated by integrations modules (like github, twitter, ...). It
is a hook to ease other modules to plug into mail.
-->
<record id="mail.mail_channel_integrations_menu" model="ir.ui.menu">
<record id="mail.discuss_channel_integrations_menu" model="ir.ui.menu">
<field name="name">Integrations</field>
<field name="parent_id" ref="mail.menu_root_discuss"></field>
<field name="active" eval="False"></field>

View file

@ -1,25 +1,46 @@
<?xml version="1.0"?>
<odoo>
<record id="mail_message_reaction_view_form" model="ir.ui.view">
<field name="name">mail.message.reaction.form</field>
<field name="model">mail.message.reaction</field>
<field name="arch" type="xml">
<form string="Reactions" create="0" edit="0">
<sheet>
<group>
<group>
<field name="message_id"/>
<field name="content"/>
</group>
<group>
<field name="partner_id"/>
<field name="guest_id"/>
</group>
</group>
</sheet>
</form>
</field>
</record>
<record id="mail_message_reaction_view_tree" model="ir.ui.view">
<field name="name">mail.message.reaction.tree</field>
<field name="name">mail.message.reaction.list</field>
<field name="model">mail.message.reaction</field>
<field name="priority">10</field>
<field name="arch" type="xml">
<tree string="Reactions">
<list string="Reactions" create="0" edit="0">
<field name="id"/>
<field name="message_id"/>
<field name="content"/>
<field name="partner_id"/>
<field name="guest_id"/>
</tree>
</list>
</field>
</record>
<record id="mail_message_reaction_action" model="ir.actions.act_window">
<field name="name">Message Reactions</field>
<field name="res_model">mail.message.reaction</field>
<field name="view_mode">tree,form</field>
<field name="view_mode">list,form</field>
</record>
</odoo>

View file

@ -22,13 +22,13 @@
</record>
<record id="mail_message_schedule_view_tree" model="ir.ui.view">
<field name="name">mail.message.schedule.view.tree</field>
<field name="name">mail.message.schedule.view.list</field>
<field name="model">mail.message.schedule</field>
<field name="arch" type="xml">
<tree string="Emails">
<list string="Emails">
<field name="mail_message_id"/>
<field name="scheduled_datetime"/>
</tree>
</list>
</field>
</record>
@ -45,7 +45,7 @@
<record id="mail_message_schedule_action" model="ir.actions.act_window">
<field name="name">Scheduled Messages</field>
<field name="res_model">mail.message.schedule</field>
<field name="view_mode">tree,form</field>
<field name="view_mode">list,form</field>
<field name="context">{}</field>
</record>

View file

@ -3,16 +3,16 @@
<data>
<record model="ir.ui.view" id="view_message_subtype_tree">
<field name="name">mail.message.subtype.tree</field>
<field name="name">mail.message.subtype.list</field>
<field name="model">mail.message.subtype</field>
<field name="priority">10</field>
<field name="arch" type="xml">
<tree string="Subtype">
<list string="Subtype">
<field name="sequence" widget="handle"/>
<field name="name"/>
<field name="res_model"/>
<field name="default"/>
</tree>
</list>
</field>
</record>
@ -43,10 +43,23 @@
</field>
</record>
<record model="ir.ui.view" id="mail_message_subtype_view_search">
<field name="name">mail.message.subtype.view.search</field>
<field name="model">mail.message.subtype</field>
<field name="arch" type="xml">
<search>
<field name="name"/>
<field name="res_model"/>
<field name="description"/>
<filter string="Default" name="filter_default" domain="[('default', '=', True)]"/>
</search>
</field>
</record>
<record model="ir.actions.act_window" id="action_view_message_subtype">
<field name="name">Subtypes</field>
<field name="res_model">mail.message.subtype</field>
<field name="view_mode">tree,form</field>
<field name="view_mode">list,form</field>
</record>
</data>

View file

@ -3,17 +3,17 @@
<data>
<!-- mail.message tree: short view !-->
<record model="ir.ui.view" id="view_message_tree">
<field name="name">mail.message.tree</field>
<field name="name">mail.message.list</field>
<field name="model">mail.message</field>
<field name="priority">20</field>
<field name="arch" type="xml">
<tree string="Messages">
<list string="Messages">
<field name="date"/>
<field name="subject"/>
<field name="author_id"/>
<field name="model"/>
<field name="res_id"/>
</tree>
</list>
</field>
</record>
@ -26,9 +26,13 @@
<form string="Message" duplicate="0">
<sheet>
<div class="oe_button_box" name="button_box">
<button name="action_open_document" string="Open Document"
<button name="action_open_document"
type="object" class="oe_link" icon="fa-file-text-o"
attrs="{'invisible': ['|', ('model', '=', False), ('res_id', '=', 0)]}"/>
invisible="not model or res_id == 0">
<div class="o_field_widget o_stat_info">
<span class="o_stat_text">Open Document</span>
</div>
</button>
</div>
<group>
<group>
@ -49,7 +53,7 @@
</group>
<notebook>
<page string="Body" name="body">
<field name="body" options="{'style-inline': true}"/>
<field name="body" widget="html_mail"/>
</page>
<page string="Gateway" name="gateway">
<group>
@ -67,6 +71,8 @@
<group>
<group>
<field name="partner_ids" widget="many2many_tags"/>
<field name="incoming_email_to"/>
<field name="incoming_email_cc"/>
</group>
<group>
<field name="notified_partner_ids" widget="many2many_tags"/>
@ -75,12 +81,12 @@
</group>
<group>
<field name="notification_ids">
<tree>
<list>
<field name="res_partner_id"/>
<field name="is_read"/>
<field name="notification_type"/>
<field name="notification_status"/>
</tree>
</list>
</field>
</group>
</page>
@ -123,7 +129,7 @@
<record id="action_view_mail_message" model="ir.actions.act_window">
<field name="name">Messages</field>
<field name="res_model">mail.message</field>
<field name="view_mode">tree,form</field>
<field name="view_mode">list,form</field>
<field name="search_view_id" ref="view_message_search"/>
</record>
@ -135,63 +141,41 @@
<field name="id"/>
<field name="mimetype"/>
<field name="type"/>
<field name="create_uid"/>
<field name="url"/>
<field name="create_date"/>
<field name="name"/>
<templates>
<t t-name="kanban-box">
<div class="oe_kanban_global_area oe_kanban_global_click o_kanban_attachment">
<div class="row">
<div class="offset-10">
<div class="o_dropdown_kanban dropdown" groups="base.group_user">
<a role="button" class="dropdown-toggle o-no-caret btn" data-bs-toggle="dropdown" href="#" aria-label="Dropdown menu" title="Dropdown menu">
<span class="fa fa-ellipsis-v"/>
</a>
<div class="dropdown-menu" role="menu">
<a t-attf-href="/web/content/ir.attachment/#{record.id.raw_value}/datas?download=true" download="" class="dropdown-item">Download</a>
<a t-if="widget.deletable" role="menuitem" type="delete" class="dropdown-item">Delete</a>
</div>
</div>
<t t-name="menu">
<a t-attf-href="/web/content/ir.attachment/#{record.id.raw_value}/datas?download=true" download="" class="dropdown-item">Download</a>
<a t-if="widget.deletable" role="menuitem" type="delete" class="dropdown-item">Delete</a>
</t>
<t t-name="card" class="o_kanban_attachment flex-row">
<aside class="o_kanban_image m-1">
<div class="o_kanban_image_wrapper d-flex align-items-center justify-content-center">
<t t-set="webimage" t-value="new RegExp('image.*(gif|jpeg|jpg|png|webp)').test(record.mimetype.value)"/>
<div t-if="record.type.raw_value == 'url'" class="fa fa-link fa-3x text-muted" aria-label="Image is a link"/>
<img t-elif="webimage" t-attf-src="/web/image/#{record.id.raw_value}" width="100" height="100" alt="Document" class="o_attachment_image"/>
<div t-else="!webimage" class="o_image o_image_thumbnail" t-att-data-mimetype="record.mimetype.value"/>
</div>
</aside>
<main class="ms-1">
<div class="o_kanban_details_wrapper d-flex flex-column">
<field name="name" class="text-truncate fw-bold fs-5"/>
<div class="d-flex flex-grow-1 align-items-center">
<t t-if="record.type.raw_value == 'url'">
<i class="fa fa-globe" aria-label="Document url"/> <field name="url" widget="url"/>
</t>
</div>
<div class="d-flex">
<field name="create_date"/>
<field name="create_uid" widget="many2one_avatar_user" class="ms-auto"/>
</div>
</div>
<div class="o_kanban_image">
<div class="o_kanban_image_wrapper">
<t t-set="webimage" t-value="new RegExp('image.*(gif|jpeg|jpg|png)').test(record.mimetype.value)"/>
<div t-if="record.type.raw_value == 'url'" class="o_url_image fa fa-link fa-3x text-muted" aria-label="Image is a link"/>
<img t-elif="webimage" t-attf-src="/web/image/#{record.id.raw_value}" width="100" height="100" alt="Document" class="o_attachment_image"/>
<div t-else="!webimage" class="o_image o_image_thumbnail" t-att-data-mimetype="record.mimetype.value"/>
</div>
</div>
<div class="o_kanban_details">
<div class="o_kanban_details_wrapper">
<div t-att-title="record.name.raw_value" class="o_kanban_record_title">
<field name="name" class="o_text_overflow"/>
</div>
<div class="o_kanban_record_body">
<t t-if="record.type.raw_value == 'url'">
<span class="o_document_url"><i class="fa fa-globe" aria-label="Document url"/> <field name="url" widget="url"/></span>
</t>
<samp t-else="" class="text-muted"> </samp>
</div>
<div class="o_kanban_record_bottom">
<time class="oe_kanban_bottom_left">
<field name="create_date" widget="date"/>
</time>
<div class="oe_kanban_bottom_right">
<field name="create_uid" widget="many2one_avatar_user"/>
</div>
</div>
</div>
</div>
</div>
</main>
</t>
</templates>
</kanban>
</field>
</record>
<record id="base.action_attachment" model="ir.actions.act_window">
<field name="view_mode">kanban,tree,form</field>
<field name="view_mode">kanban,list,form</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Attach a new document

View file

@ -1,16 +1,16 @@
<?xml version="1.0"?>
<odoo><data>
<record id="mail_notification_view_tree" model="ir.ui.view">
<field name="name">mail.notification.view.tree</field>
<field name="name">mail.notification.view.list</field>
<field name="model">mail.notification</field>
<field name="arch" type="xml">
<tree string="Notifications">
<list string="Notifications">
<field name="mail_message_id"/>
<field name="notification_type"/>
<field name="res_partner_id"/>
<field name="is_read"/>
<field name="failure_type"/>
</tree>
</list>
</field>
</record>
@ -20,7 +20,7 @@
<field name="arch" type="xml">
<form string="Notification" duplicate="0">
<header>
<field name="notification_status" widget="statusbar"/>
<field name="notification_status" widget="statusbar" statusbar_visible="ready,sent"/>
</header>
<sheet>
<group>
@ -34,7 +34,7 @@
<field name="is_read"/>
<field name="read_date"/>
<field name="failure_type"/>
<field name="failure_reason"/>
<field name="failure_reason" class="o_text_overflow"/>
</group>
</group>
</sheet>
@ -45,7 +45,7 @@
<record id="mail_notification_action" model="ir.actions.act_window">
<field name="name">Notifications</field>
<field name="res_model">mail.notification</field>
<field name="view_mode">tree,form</field>
<field name="view_mode">list,form</field>
</record>
</data></odoo>

View file

@ -0,0 +1,40 @@
<?xml version="1.0"?>
<odoo>
<data>
<record id="mail_scheduled_message_view_form" model="ir.ui.view">
<field name="name">mail.scheduled.message.view.form</field>
<field name="model">mail.scheduled.message</field>
<field name="arch" type="xml">
<form string="Scheduled Message">
<sheet>
<group>
<field name="composition_comment_option" invisible="1"/>
<label for="partner_ids" string="To" invisible="is_note"/>
<div invisible="is_note" class="d-flex gap-3">
<field name="partner_ids" widget="many2many_tags_email" class="w-auto flex-grow-1"
placeholder="Add contacts to notify..."
options="{'edit_tags': True}"
context="{'force_email': True, 'show_email': True, 'form_view_ref': 'base.view_partner_simple_form'}"/>
</div>
<field name="subject" required="True"/>
</group>
<group col="1">
<field name="body" widget="html_composer_message"
force_save="1" nolabel="1"
placeholder="Write your message here..."/>
<field name="attachment_ids" widget="mail_composer_attachment_list" nolabel="1"/>
</group>
</sheet>
<footer>
<button string="Save" class="btn-primary" special="save" invisible="not scheduled_date" data-hotkey="S"/>
<button string="Send Now" invisible="is_note" type="object" name="post_message" data-hotkey="q"/>
<button string="Log Now" invisible="not is_note" type="object" name="post_message" data-hotkey="q"/>
<button string="Discard" class="btn-secondary" special="cancel" data-hotkey="x"/>
<field name="attachment_ids" widget="mail_composer_attachment_selector"/>
<field name="scheduled_date" widget="datetime_scheduled_date"/>
</footer>
</form>
</field>
</record>
</data>
</odoo>

View file

@ -1,48 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<!-- mail.shortcode -->
<record id="mail_shortcode_action" model="ir.actions.act_window">
<field name="name">Chat Shortcode</field>
<field name="res_model">mail.shortcode</field>
<field name="view_mode">tree,form</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Define a new chat shortcode
</p><p>
A shortcode is a keyboard shortcut. For instance, you type #gm and it will be transformed into "Good Morning".
</p>
</field>
</record>
<record id="mail_shortcode_view_tree" model="ir.ui.view">
<field name="name">mail.shortcode.tree</field>
<field name="model">mail.shortcode</field>
<field name="arch" type="xml">
<tree string="Shortcodes">
<field name="source"/>
<field name="substitution"/>
<field name="description"/>
</tree>
</field>
</record>
<record id="mail_shortcode_view_form" model="ir.ui.view">
<field name="name">mail.shortcode.form</field>
<field name="model">mail.shortcode</field>
<field name="arch" type="xml">
<form string="Shortcodes">
<sheet>
<group>
<field name="source"/>
<field name="substitution"/>
<field name="description"/>
</group>
</sheet>
</form>
</field>
</record>
</data>
</odoo>

View file

@ -5,105 +5,119 @@
<field name="name">email.template.form</field>
<field name="model">mail.template</field>
<field name="arch" type="xml">
<form string="Templates">
<form string="Templates" class="o_mail_template_form_view">
<header>
<field name="ref_ir_act_window" invisible="1"/>
<field name="template_fs" invisible="1"/>
<field name="is_template_editor" invisible="1"/>
<button string="Preview"
name="action_open_mail_preview" type="object"
class="btn-primary" target="new"/>
<button string="Reset Template"
name="%(mail_template_reset_action)d" type="action"
groups="mail.group_mail_template_editor"
attrs="{'invisible': [('template_fs', '=', False)]}"/>
invisible="not template_fs"/>
<t groups="base.group_no_one">
<button string="Add Context Action"
class="btn btn-secondary"
name="create_action" type="object"
groups="base.group_system"
invisible="ref_ir_act_window"
help="Display an option on related documents to open a composition wizard with this template"/>
<button string="Remove Context Action"
class="btn btn-secondary"
name="unlink_action" type="object"
invisible="not ref_ir_act_window"
help="Remove the contextual action to use this template on related documents"/>
</t>
</header>
<sheet>
<div class="oe_button_box" name="button_box">
<field name="ref_ir_act_window" invisible="1"/>
<button class="oe_stat_button"
groups="base.group_no_one"
name="create_action" type="object"
attrs="{'invisible':[('ref_ir_act_window','!=',False)]}" icon="fa-plus"
help="Display an option on related documents to open a composition wizard with this template">
<div class="o_field_widget o_stat_info">
<span class="o_stat_text">Add</span>
<span class="o_stat_text">Context Action</span>
</div>
</button>
<button name="unlink_action" type="object"
groups="base.group_no_one"
class="oe_stat_button" icon="fa-minus"
attrs="{'invisible':[('ref_ir_act_window','=',False)]}"
help="Remove the contextual action to use this template on related documents" widget="statinfo">
<div class="o_field_widget o_stat_info">
<span class="o_stat_text">Remove</span>
<span class="o_stat_text">Context Action</span>
</div>
</button>
<button class="oe_stat_button" name="%(mail_template_preview_action)d" icon="fa-search-plus" string="Preview"
type="action" target="new"/>
</div>
<div class="oe_title">
<label for="name"/>
<h1><field name="name" class="w-100"
<h1><field name="name" class="w-100" string="Template Name"
required="1" placeholder='e.g. "Welcome email"'/></h1>
<group>
<field name="model_id" placeholder="e.g. Contact" required="1" options="{'no_create': True}"/>
<field name="subject" placeholder='e.g. "Welcome to MyCompany" or "Nice to meet you, {{ object.name }}"'/>
<field name="model_id" groups="!base.group_no_one" invisible="context.get('default_model')" placeholder="e.g. Contact" required="1" options="{'no_create': True}"/>
<field name="model_id" groups="base.group_no_one" placeholder="e.g. Contact" required="1" options="{'no_create': True}"/>
<field name="subject" options="{'dynamic_placeholder': true}"
placeholder='e.g. "Welcome to MyCompany" or "Nice to meet you, {{ object.name }}"'/>
<field name="model" invisible="1"/>
<field name="description"/>
</group>
</div>
<notebook>
<page string="Content" name="content">
<page string="Body" name="content">
<field name="can_write" invisible="1"/>
<field name="body_html" widget="html" class="oe-bordered-editor"
options="{'style-inline': true, 'codeview': true, 'dynamic_placeholder': true}"
attrs="{'readonly': [('can_write', '=', False), ('id', '!=', False)]}"/>
<field name="attachment_ids" widget="many2many_binary"/>
<field name="body_html" widget="html_mail" class="oe-bordered-editor"
placeholder="Write your message here..."
options="{'codeview': true, 'dynamic_placeholder': true, 'allowCommandVideo': false}"
readonly="not can_write and id"/>
<div invisible="not can_write" class="fst-italic text-muted">Tip: Write /field to insert dynamic content!</div>
</page>
<page string="Email Configuration" name="email_configuration">
<group>
<field name="email_from"
placeholder="Override author's email"/>
<field name="use_default_to"/>
<field name="email_to" attrs="{'invisible': [('use_default_to', '=', True)]}"
placeholder="Comma-separated recipient addresses"/>
<field name="partner_to" attrs="{'invisible': [('use_default_to', '=', True)]}"
placeholder="Comma-separated ids of recipient partners"/>
<field name="email_cc" attrs="{'invisible': [('use_default_to', '=', True)]}"
placeholder="Comma-separated carbon copy recipients addresses"/>
<field name="reply_to"
placeholder="Email address to which replies will be redirected when sending emails in mass"/>
<field name="scheduled_date" string="Scheduled Send Date"/>
<page string="Settings" name="email_configuration" groups="base.group_no_one">
<group col="2">
<group>
<separator string="Sender &amp; Recipients"/>
<field name="email_from" placeholder="Sender's email"/>
<field name="use_default_to"/>
<field name="email_to" invisible="use_default_to"
placeholder="Comma-separated recipient addresses"/>
<field name="partner_to" invisible="use_default_to"
placeholder="Comma-separated ids of recipient partners"/>
<field name="email_cc" invisible="use_default_to"
placeholder="Comma-separated carbon copy of recipients addresses"/>
<field name="reply_to" placeholder="Capture replies in the chatter"/>
</group>
<group>
<separator string="Technical"/>
<field name="lang" placeholder="Main partner's language" options="{'dynamic_placeholder': true}"/>
<field name="has_mail_server" invisible="1"/>
<field name="mail_server_id" invisible="not has_mail_server" placeholder="By order of server priority"/>
<field name="auto_delete"/>
<field name="scheduled_date" string="Scheduled Send Date" placeholder="Send Instantly" options="{'dynamic_placeholder': true}"/>
</group>
</group>
</page>
<page string="Settings" name="email_settings">
<group>
<field name="lang" placeholder="{{ object.partner_id.lang }}"/>
<field name="mail_server_id"/>
<field name="auto_delete"/>
<field name="report_template" domain="[('model','=',model)]"/>
<field name="report_name" attrs="{'invisible':[('report_template','=',False)]}"/>
<page string="Options" name="email_settings">
<group col="2">
<group>
<field name="has_dynamic_reports" invisible="1"/>
<field name="attachment_ids" widget="many2many_binary"/>
<field name="report_template_ids" widget="many2many_tags"
domain="[('model','=',model)]"
invisible="not has_dynamic_reports"
options="{'no_create': True}"
placeholder="None"/>
</group>
<group>
<field name="user_id" widget="many2one_avatar_user"
readonly="not is_template_editor"
invisible="not is_template_editor"
placeholder="Shared with all users"/>
<field name="description" placeholder="Describe when this template should be used"/>
</group>
</group>
</page>
</notebook>
</sheet>
</sheet>
</form>
</field>
</record>
<record model="ir.ui.view" id="email_template_tree">
<field name="name">email.template.tree</field>
<field name="name">email.template.list</field>
<field name="model">mail.template</field>
<field name="arch" type="xml">
<tree string="Templates">
<field name="mail_server_id" invisible="1"/>
<list string="Templates">
<field name="mail_server_id" column_invisible="True"/>
<field name="name"/>
<field name="model_id" groups="base.group_no_one"/>
<field name="user_id" optional="show" widget="many2one_avatar_user"/>
<field name="description"/>
<field name="subject" optional="hidden"/>
<field name="email_from" optional="hidden"/>
<field name="email_to" optional="hidden"/>
<field name="partner_to" optional="hidden"/>
<field name="report_name" optional="hidden"/>
</tree>
</list>
</field>
</record>
@ -112,14 +126,16 @@
<field name="model">mail.template</field>
<field name="arch" type="xml">
<search string="Templates">
<field name="name" filter_domain="['|', '|', '|',('name','ilike',self), ('report_name','ilike',self), ('subject','ilike',self), ('email_to','ilike',self)]" string="Templates"/>
<field name="name" filter_domain="['|', '|', ('name','ilike',self), ('subject','ilike',self), ('email_to','ilike',self)]" string="Templates"/>
<field name="lang"/>
<field name="model" filter_domain="[('model', '=', raw_value)]"/>
<field name="model_id"/>
<filter name="my_templates" string="My Templates" domain="[('user_id', '=', uid)]"/>
<filter name="base_templates" string="Base Templates" domain="[('template_category', '=', 'base_template')]"/>
<filter name="custom_templates" string="Custom Templates" domain="[('template_category', '=', 'custom_template')]"/>
<group expand="0" string="Group by...">
<group>
<filter string="SMTP Server" name="smtpserver" domain="[]" context="{'group_by':'mail_server_id'}"/>
<filter string="Model" name="model" domain="[]" context="{'group_by':'model_id'}"/>
<filter string="Model" name="group_by_model_id" domain="[]" context="{'group_by':'model_id'}"/>
</group>
</search>
</field>
@ -128,7 +144,8 @@
<record model="ir.actions.act_window" id="action_email_template_tree_all">
<field name="name">Email Templates</field>
<field name="res_model">mail.template</field>
<field name="view_mode">form,tree</field>
<field name="path">email-templates</field>
<field name="view_mode">form,list</field>
<field name="view_id" ref="email_template_tree" />
<field name="search_view_id" ref="view_email_template_search"/>
<field name="context">{'search_default_base_templates': 1}</field>

View file

@ -0,0 +1,33 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="mail.public_layout">
<t t-call="web.layout">
<t t-set="html_data" t-value="{'style': 'height: 100%;'}"/>
<t t-set="head">
<t t-call-assets="web.assets_frontend" t-js="false"/>
<title t-translation="off">
<t t-if="additional_title"><t t-out="additional_title"/> | </t><t t-out="res_company.name"/>
</title>
</t>
<t t-out="0"/>
</t>
</template>
<template id="mail.message_document_unfollowed">
<t t-call="mail.public_layout">
<t t-set="additional_title">&quot;<t t-out="name"/>&quot; no longer followed</t>
<div class="h-100 d-flex align-items-center justify-content-center">
<div>
<h1 t-out="model_name"/>
<div class="alert alert-success text-center p-5" role="status">
<strong>You are no longer following the document:</strong>
<div class="pt-4">
<a t-if="access_url" class="o_access_record_link" t-att-href="access_url" t-out="name"/>
<i t-else="" t-out="name"/>
</div>
</div>
</div>
</div>
</t>
</template>
</odoo>

View file

@ -3,12 +3,12 @@
<data>
<record model="ir.ui.view" id="view_mail_tracking_value_tree">
<field name="name">mail.tracking.value.tree</field>
<field name="name">mail.tracking.value.list</field>
<field name="model">mail.tracking.value</field>
<field name="priority">12</field>
<field name="arch" type="xml">
<tree string="Tracking Value">
<field name="field"/>
<list string="Tracking Value">
<field name="field_id"/>
<field name="old_value_integer"/>
<field name="old_value_float"/>
<field name="old_value_char"/>
@ -20,7 +20,7 @@
<field name="new_value_text"/>
<field name="new_value_datetime"/>
<field name="mail_message_id"/>
</tree>
</list>
</field>
</record>
@ -31,10 +31,7 @@
<form string="Tracking Value">
<sheet>
<group name="field_details" string="Field details">
<field name="field"/>
<field name="field_desc"/>
<field name="field_type"/>
<field name="tracking_sequence"/>
<field name="field_id"/>
</group>
<group name="values">
<group name="old_values" string="Old values">
@ -63,7 +60,7 @@
<record model="ir.actions.act_window" id="action_view_mail_tracking_value">
<field name="name">Tracking Values</field>
<field name="res_model">mail.tracking.value</field>
<field name="view_mode">tree,form</field>
<field name="view_mode">list,form</field>
</record>
</data>

View file

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<record id="res_company_view_form" model="ir.ui.view">
<field name="name">res.company.view.form.inherit.mail</field>
<field name="model">res.company</field>
<field name="inherit_id" ref="base.view_company_form"/>
<field name="arch" type="xml">
<field name="parent_id" position="after">
<field name="alias_domain_id"/>
<field name="bounce_formatted" groups="base.group_no_one"/>
<field name="catchall_formatted" groups="base.group_no_one"/>
<field name="default_from_email" groups="base.group_no_one"/>
</field>
</field>
</record>
</odoo>

View file

@ -8,156 +8,124 @@
<field name="inherit_id" ref="base_setup.res_config_settings_view_form"/>
<field name="arch" type="xml">
<div id="emails" position='replace'>
<h2>Discuss</h2>
<div class="row mt16 o_settings_container" id="emails">
<div class="col-12 col-lg-6 o_setting_box" id="activities_setting">
<div class="o_setting_left_pane"/>
<div class="o_setting_right_pane">
<span class="o_form_label">Activities</span>
<div class="text-muted">
Configure your activity types
</div>
<div class="content-group">
<div class="mt8">
<button name="%(mail.mail_activity_type_action)d" string="Activity Types" type="action" class="oe_link" icon="fa-arrow-right"/>
</div>
</div>
</div>
</div>
<div class="col-12 col-lg-6 o_setting_box"
id="email_servers_setting"
title="Using your own email server is required to send/receive emails in Community and Enterprise versions. Online users already benefit from a ready-to-use email server (@mycompany.odoo.com).">
<div class="o_setting_left_pane">
<field name="external_email_server_default"/>
</div>
<div class="o_setting_right_pane">
<label for="external_email_server_default"/>
<a href="https://www.odoo.com/documentation/16.0/applications/general/email_communication/email_servers.html" title="Documentation" class="o_doc_link" target="_blank"></a>
<div class="text-muted" id="external_email_server_default">
Configure your own email servers
</div>
<div class="content-group mb-3" attrs="{'invisible': [('external_email_server_default', '=', False)]}">
<div class="mt16" id="mail_alias_domain" dir="ltr">
<label for="alias_domain" class="o_light_label"/>
<span>@</span>
<field name="alias_domain" placeholder='e.g. "mycompany.com"'/>
</div>
<block title="Emails" id="emails">
<setting id="email_servers_setting" title="Using your own email server is required to send/receive emails in Community and Enterprise versions. Online users already benefit from a ready-to-use email server (@mycompany.odoo.com)." documentation="/applications/general/email_communication/email_servers.html" help="Configure your own email servers">
<field name="external_email_server_default"/>
<div class="content-group mb-3" invisible="not external_email_server_default">
<div>
<div class="mt8">
<button type="action"
name="%(action_email_server_tree)d"
string="Incoming Email Servers" icon="fa-arrow-right" class="btn-link"/>
string="Incoming Email Servers" icon="oi-arrow-right" class="btn-link"/>
</div>
<div class="mt8">
<button type="action"
name="%(base.action_ir_mail_server_list)d"
string="Outgoing Email Servers" icon="fa-arrow-right" class="btn-link"/>
</div>
</div>
<div class="mt-3 d-flex" attrs="{'invisible': [('external_email_server_default', '=', False)]}">
<field name="module_google_gmail"/>
<div>
<label string="Gmail Credentials" for="module_google_gmail"/>
<a href="https://console.developers.google.com/" title="Get Gmail API credentials" class="o_doc_link" target="_blank"/>
<div class="text-muted">
Send and receive emails through your Gmail account.
</div>
<div class="content-group" attrs="{'invisible': [('module_google_gmail','=',False)]}" id="msg_module_google_gmail">
<div class="mt16 text-warning"><strong>Save</strong> this page and come back here to set up the feature.</div>
</div>
</div>
</div>
<div class="mt-3 d-flex" attrs="{'invisible': [('external_email_server_default', '=', False)]}">
<field name="module_microsoft_outlook"/>
<div>
<label string="Outlook Credentials" for="module_microsoft_outlook"/>
<a href="https://docs.microsoft.com/en-us/azure/active-directory/develop/quickstart-register-app"
title="Get Outlook API credentials" class="o_doc_link" target="_blank"/>
<div class="text-muted">
Send and receive emails through your Outlook account.
</div>
<div class="content-group" id="msg_module_microsoft_outlook"
attrs="{'invisible': [('module_microsoft_outlook','=',False)]}">
<div class="mt16 text-warning">
<strong>Save</strong> this page and come back here to set up the feature.
</div>
</div>
string="Outgoing Email Servers" icon="oi-arrow-right" class="btn-link"/>
</div>
</div>
</div>
</div>
<div class="col-12 col-lg-6 o_setting_box">
<div class="o_setting_left_pane">
<field name="use_twilio_rtc_servers"/>
</setting>
<setting id="email-alias-setting" string="Alias Domain"
help="Use different domains for your mail aliases"
company_dependent="1"
documentation="/applications/general/email_communication/email_domain.html#be-spf-compliant">
<span class="me-1">@</span>
<field name="alias_domain_id" placeholder="e.g. mycompany.com"
options="{'no_create_edit': True}"/>
</setting>
<setting string="Use a Gmail Server"
help="Send and receive emails through your Gmail account."
documentation="https://console.developers.google.com/"
invisible="not external_email_server_default">
<field name="module_google_gmail"/>
<div class="content-group" invisible="not module_google_gmail" id="msg_module_google_gmail">
<div class="mt16 text-warning"><strong>Save</strong> this page and come back here to set up the feature.</div>
</div>
<div class="o_setting_right_pane">
<label for="use_twilio_rtc_servers"/>
<div class="text-muted col-md-12">
Add your twilio credentials for ICE servers
</div>
<div class="content-group" attrs="{'invisible': [('use_twilio_rtc_servers', '=', False)]}">
<div class="row mt16" id="mail_twilio_sid">
<label for="twilio_account_sid" class="col-lg-3"/>
<field name="twilio_account_sid" placeholder="e.g. ACd5543a0b450ar4c7t95f1b6e8a39t543"/>
</div>
<div class="row mt16" id="mail_twilio_auth_token">
<label for="twilio_account_token" class="col-lg-3"/>
<field name="twilio_account_token" placeholder="e.g. 65ea4f9e948b693N5156F350256bd152"/>
</div>
</setting>
<setting id="email-outlook-setting" string="Use an Outlook Server"
help="Send and receive emails through your Outlook account."
documentation="https://docs.microsoft.com/en-us/azure/active-directory/develop/quickstart-register-app"
invisible="not external_email_server_default">
<field name="module_microsoft_outlook"/>
<div class="content-group" id="msg_module_microsoft_outlook"
invisible="not module_microsoft_outlook">
<div class="mt16 text-warning">
<strong>Save</strong> this page and come back here to set up the feature.
</div>
</div>
</div>
<div class="col-12 col-lg-6 o_setting_box">
<div class="o_setting_right_pane">
<span class="o_form_label">Custom ICE server list</span>
<div class="row">
<div class="text-muted col-md-12">
Configure your ICE server list for webRTC
</div>
</div>
<div class="content-group">
<div class="row col-lg-4">
<button type="action" name="%(mail.action_ice_servers)d" string="ICE Servers" icon="fa-arrow-right" class="btn-link"/>
</div>
</setting>
<setting id="restrict_template_rendering_setting" help="Restrict mail templates edition and QWEB placeholders usage.">
<field name="restrict_template_rendering"/>
</setting>
</block>
<block title="Discuss" id="discuss">
<setting id="activities_setting" string="Activities" help="Configure your activity types">
<div class="content-group">
<div class="mt8">
<button name="%(mail.mail_activity_type_action)d" string="Activity Types" type="action" class="oe_link" icon="oi-arrow-right"/>
</div>
</div>
</div>
<div class="col-12 col-lg-6 o_setting_box"
id="restrict_template_rendering_setting">
<div class="o_setting_left_pane">
<field name="restrict_template_rendering"/>
</div>
<div class="o_setting_right_pane">
<label for="restrict_template_rendering"/>
<div class="text-muted" id="restrict_template_rendering">
Restrict mail templates edition and QWEB placeholders usage.
</setting>
<setting string="Custom ICE Server with Twilio"
help="Set up your own server for small group calls using peer-to-peer connections"
documentation="https://www.odoo.com/documentation/latest/applications/productivity/discuss/ice_servers.html">
<field name="use_twilio_rtc_servers"/>
<div class="content-group" invisible="not use_twilio_rtc_servers">
<div class="row mt16" id="mail_twilio_sid">
<label for="twilio_account_sid" class="col-lg-3"/>
<field name="twilio_account_sid" string="Account SID" placeholder="e.g. ACd5543a0b450ar4c7t95f1b6e8a39t543"/>
</div>
<div class="row mt16" id="mail_twilio_auth_token">
<label for="twilio_account_token" class="col-lg-3"/>
<field name="twilio_account_token" string="Account Auth Token" placeholder="e.g. 65ea4f9e948b693N5156F350256bd152"/>
</div>
</div>
</div>
</div>
</setting>
<setting string="Custom SFU Server" help="Set up your own server for large group calls by routing connections centrally">
<field name="use_sfu_server"/>
<div class="content-group" invisible="not use_sfu_server">
<div class="row mt16">
<label for="sfu_server_url" string="URL" class="col-lg-3"/>
<field name="sfu_server_url"/>
</div>
<div class="row mt16">
<label for="sfu_server_key" string="Key" class="col-lg-3"/>
<field name="sfu_server_key"/>
</div>
</div>
</setting>
<setting string="Custom ICE Servers" help="Use your own servers for calls to manage heavy traffic and ensure reliability if Twilio is unavailable"
documentation="https://www.odoo.com/documentation/latest/applications/productivity/discuss/ice_servers.html#define-a-list-of-custom-ice-servers">
<div class="content-group">
<button type="action" name="%(mail.action_ice_servers)d" string="Configure ICE Servers" icon="oi-arrow-right" class="btn-link"/>
</div>
</setting>
<setting id="tenor_api_key" string="Tenor GIF API key" help="Add a Tenor GIF API key to enable GIFs support." documentation="https://developers.google.com/tenor/guides/quickstart#setup">
<field name="tenor_api_key" placeholder="Paste your API key"/>
</setting>
<setting string="Message Translation" help="Google Translate Integration" id="message_translation_setting" documentation="https://cloud.google.com/translate/docs/setup">
<field name="google_translate_api_key" placeholder="Paste your API key"/>
</setting>
</block>
</div>
<div id="companies_setting" position="inside">
<br/>
<div class="o_setting_right_pane" id="mail_templates_setting"
groups="mail.group_mail_template_editor,base.group_system">
<span class="o_form_label">Email Templates</span>
<div class="text-muted">
Customize the look and feel of automated emails
</div>
<setting id="document_layout_setting" position="after">
<setting string="Email Templates" help="Customize the look and feel of automated emails" id="mail_templates_setting" groups="mail.group_mail_template_editor,base.group_system" company_dependent="1">
<div class="w-50 row">
<span class="d-block w-75 py-2">Header Color</span>
<field name="primary_color" class="d-block w-25 p-0 m-0" widget="color"/>
<span class="d-block w-75 py-2">Button Text</span>
<field name="email_primary_color" class="d-block w-25 p-0 m-0" widget="color"/>
</div>
<div class="w-50 row mt-1">
<span class="d-block w-75 py-2">Button Color</span>
<field name="secondary_color" class="d-block w-25 p-0 m-0" widget="color"/>
<field name="email_secondary_color" class="d-block w-25 p-0 m-0" widget="color"/>
</div>
<button name="open_email_layout" icon="fa-arrow-right"
<button name="open_email_layout" icon="oi-arrow-right"
type="object" string="Update Mail Layout"
groups="base.group_no_one" class="btn-link"/>
<br groups="base.group_no_one"/>
<button name="open_mail_templates" icon="fa-arrow-right" type="object" string="Review All Templates" class="btn-link"/>
</div>
</div>
<button name="open_mail_templates" icon="oi-arrow-right" type="object" string="Review All Templates" class="btn-link"/>
</setting>
</setting>
</field>
</record>
</data>

View file

@ -7,23 +7,15 @@
<field name="model">res.partner</field>
<field name="inherit_id" ref="base.view_partner_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='email']" position="replace">
<xpath expr="//field[@name='email']" position="before">
<field name="is_blacklisted" invisible="1"/>
<label for="email" class="oe_inline"/>
<div class="o_row o_row_readonly">
<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" context="{'gravatar_image': True}" attrs="{'required': [('user_ids','!=', [])]}"/>
</div>
<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"
invisible="not is_blacklisted"/>
</xpath>
<xpath expr="//sheet" position="after">
<div class="oe_chatter">
<field name="message_follower_ids"/>
<field name="activity_ids"/>
<field name="message_ids"/>
</div>
<chatter/>
</xpath>
</field>
</record>
@ -33,11 +25,8 @@
<field name="model">res.partner</field>
<field name="inherit_id" ref="base.res_partner_kanban_view"/>
<field name="arch" type="xml">
<field name="type" position="after">
<field name="activity_state"/>
</field>
<xpath expr="//div[hasclass('oe_kanban_bottom_right')]" position="inside">
<field name="activity_ids" widget="kanban_activity"/>
<xpath expr="//footer" position="inside">
<field name="activity_ids" widget="kanban_activity" class="ms-auto mt-auto"/>
</xpath>
</field>
</record>
@ -48,20 +37,23 @@
<field name="inherit_id" ref="base.view_res_partner_filter"/>
<field name="arch" type="xml">
<filter name="inactive" position="after">
<filter invisible="1" string="My Activities" name="filter_activities_my"
domain="[('activity_user_id', '=', uid)]"/>
<separator invisible="1"/>
<filter invisible="1" string="Late Activities" name="activities_overdue"
domain="[('my_activity_date_deadline', '&lt;', context_today().strftime('%Y-%m-%d'))]"
help="Show all records which has next action date is before today"/>
domain="[('my_activity_date_deadline', '&lt;', 'today')]"
help="Show all records whose next activity date is past"/>
<filter invisible="1" string="Today Activities" name="activities_today"
domain="[('my_activity_date_deadline', '=', context_today().strftime('%Y-%m-%d'))]"/>
domain="[('my_activity_date_deadline', '=', 'today')]"/>
<filter invisible="1" string="Future Activities" name="activities_upcoming_all"
domain="[('my_activity_date_deadline', '&gt;', context_today().strftime('%Y-%m-%d'))]"/>
domain="[('my_activity_date_deadline', '&gt;', 'today')]"/>
<separator/>
</filter>
</field>
</record>
<record id="res_partner_view_tree_inherit_mail" model="ir.ui.view">
<field name="name">res.partner.view.tree.inherit.mail</field>
<field name="name">res.partner.view.list.inherit.mail</field>
<field name="model">res.partner</field>
<field name="inherit_id" ref="base.view_partner_tree"/>
<field name="arch" type="xml">
@ -79,10 +71,10 @@
<field name="id"/>
<templates>
<div t-name="activity-box">
<img t-att-src="activity_image('res.partner', 'avatar_128', record.id.raw_value)" role="img" t-att-title="record.id.value" t-att-alt="record.id.value"/>
<div>
<field name="name" display="full"/>
<field name="parent_id" muted="1" display="full"/>
<img t-att-src="activity_image('res.partner', 'avatar_128', record.id.raw_value)" role="img" t-att-title="record.name.value" t-att-alt="record.name.value"/>
<div class="ms-2">
<field name="name" display="full" class="o_text_block"/>
<field name="parent_id" muted="1" display="full" class="o_text_block"/>
</div>
</div>
</templates>
@ -92,13 +84,13 @@
<!-- Add mail-defined activity view to standard action on partners to manage activities related to partner model -->
<record id="base.action_partner_form" model="ir.actions.act_window">
<field name="view_mode">kanban,tree,form,activity</field>
<field name="view_mode">list,kanban,form,activity</field>
</record>
<record id="base.action_partner_customer_form" model="ir.actions.act_window">
<field name="view_mode">kanban,tree,form,activity</field>
<field name="view_mode">list,kanban,form,activity</field>
</record>
<record id="base.action_partner_supplier_form" model="ir.actions.act_window">
<field name="view_mode">kanban,tree,form,activity</field>
<field name="view_mode">list,kanban,form,activity</field>
</record>
<!-- Replace the default mass-mailing wizard in base with the composition wizard -->
@ -107,14 +99,14 @@
<field name="res_model">mail.compose.message</field>
<field name="view_mode">form</field>
<field name="target">new</field>
<field name="context" eval="{
<field name="context">{
'default_composition_mode': 'mass_mail',
'default_partner_to': '{{ object.id or \'\' }}',
'default_use_template': False,
'default_subtype_xmlid': 'mail.mt_comment',
'default_reply_to_force_new': True,
}"/>
}</field>
<field name="binding_model_id" ref="base.model_res_partner"/>
<field name="binding_view_types">list</field>
<field name="binding_view_types">list,kanban</field>
</record>
</data>

View file

@ -0,0 +1,53 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<record id="res_role_view_search" model="ir.ui.view">
<field name="name">res.role.view.search</field>
<field name="model">res.role</field>
<field name="arch" type="xml">
<search string="Roles Search">
<field name="name" string="Role"/>
<field name="user_ids"/>
<filter string="My Roles" name="my_role_ids" domain="[('user_ids', '=', uid)]"/>
<group>
<filter string="Users" name="filter_user_ids" domain="[]" context="{'group_by': 'user_ids'}"/>
</group>
</search>
</field>
</record>
<record id="res_role_view_tree" model="ir.ui.view">
<field name="name">res.role.list</field>
<field name="model">res.role</field>
<field name="arch" type="xml">
<list string="Role" editable="bottom" sample="1">
<field name="name" string="Role"/>
<field name="user_ids" widget="many2many_avatar_user"/>
</list>
</field>
</record>
<record id="res_role_view_form" model="ir.ui.view">
<field name="name">res.role.form</field>
<field name="model">res.role</field>
<field name="arch" type="xml">
<form string="Role">
<sheet>
<group>
<field name="name" string="Role"/>
<field name="user_ids" widget="many2many_avatar_user" options="{'no_create': True}"/>
</group>
</sheet>
</form>
</field>
</record>
<record id="res_role_action" model="ir.actions.act_window">
<field name="name">Roles</field>
<field name="res_model">res.role</field>
<field name="view_mode">list,form</field>
<field name="search_view_id" ref="res_role_view_search"/>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">No roles found. Let's create one!</p>
<p>Notify multiple people at once by @-mentioning roles in conversations.</p>
</field>
</record>
</data>
</odoo>

View file

@ -2,15 +2,15 @@
<odoo>
<record id="res_users_settings_view_tree" model="ir.ui.view">
<field name="name">res.users.settings.tree</field>
<field name="name">res.users.settings.list</field>
<field name="model">res.users.settings</field>
<field name="priority">10</field>
<field name="arch" type="xml">
<tree string="User Settings">
<list string="User Settings">
<field name="id"/>
<field name="user_id"/>
<field name="use_push_to_talk"/>
</tree>
</list>
</field>
</record>
@ -21,7 +21,7 @@
<form string="User Settings">
<sheet>
<div class="oe_title">
<h1><field name="user_id" attrs="{'readonly': [('id', '!=', False)]}"/></h1>
<h1><field name="user_id" readonly="id != False"/></h1>
</div>
<group name="discuss_user_settings">
<group string="Discuss sidebar">
@ -30,17 +30,17 @@
</group>
<group string="Voice">
<field name="use_push_to_talk"/>
<field name="push_to_talk_key" placeholder="e.g. true.true..f" attrs="{'invisible': [('use_push_to_talk', '=', False)]}"/>
<field name="voice_active_duration" attrs="{'invisible': [('use_push_to_talk', '=', True)]}"/>
<field name="push_to_talk_key" placeholder="e.g. true.true..f" invisible="not use_push_to_talk"/>
<field name="voice_active_duration" invisible="use_push_to_talk"/>
</group>
</group>
<notebook colspan="4">
<page string="Volume per partner">
<page string="Volume per partner" name="page_volume_per_partner">
<field name="volume_settings_ids">
<tree editable="bottom">
<list editable="bottom">
<field name="partner_id"/>
<field name="volume"/>
</tree>
</list>
</field>
</page>
</notebook>
@ -52,7 +52,7 @@
<record id="res_users_settings_action" model="ir.actions.act_window">
<field name="name">User Settings</field>
<field name="res_model">res.users.settings</field>
<field name="view_mode">tree,form</field>
<field name="view_mode">list,form</field>
</record>
</odoo>

View file

@ -1,6 +1,19 @@
<?xml version="1.0"?>
<odoo>
<data>
<record id="action_res_users_my_fullpage" model="ir.actions.act_window">
<!-- Like action_res_users_my, but in full page -->
<field name="name">Change My Preferences</field>
<field name="res_model">res.users</field>
<field name="view_mode">form</field>
<field name="path">my-preferences</field>
</record>
<record id="action_res_users_my_fullpage_view" model="ir.actions.act_window.view">
<field eval="50" name="sequence"/>
<field name="view_mode">form</field>
<field name="view_id" ref="base.view_users_form_simple_modif"/>
<field name="act_window_id" ref="mail.action_res_users_my_fullpage"/>
</record>
<!-- Update Preferences form !-->
<record id="view_users_form_simple_modif_mail" model="ir.ui.view">
@ -9,12 +22,27 @@
<field name="inherit_id" ref="base.view_users_form_simple_modif"/>
<field name="arch" type="xml">
<data>
<field name="email" position="before">
<field name="notification_type" widget="radio" readonly="0"/>
</field>
<xpath expr="//field[@name='image_1920']" position="before">
<widget name="notification_alert"/>
<xpath expr="//group[@name='other_preferences']" position="inside">
<field name="notification_type" widget="radio" readonly="0" options="{'horizontal': true}"/>
<field name="outgoing_mail_server_id" invisible="1"/> <!-- Used by the mail_server_configurator_selection widget -->
<span class="o_form_label fw-bold" invisible="not has_external_mail_server">Outgoing Mail Server</span>
<field name="outgoing_mail_server_type"
nolabel="1"
string="Outgoing Mail Server"
widget="mail_server_configurator_selection"
invisible="not has_external_mail_server"/>
</xpath>
<field name="signature" position="attributes">
<attribute name="widget">html_mail</attribute>
</field>
<group name="calendar_preferences" position="inside">
<label for="out_of_office_from" string="Out-of-office" />
<div class="o_row">
<field name="out_of_office_from" widget="daterange" options="{'end_date_field': 'out_of_office_to', 'show_time': False}" placeholder="None planned"/>
<field name="out_of_office_to" invisible="1"/> <!-- otherwise it is visible, smort -->
</div>
<field name="out_of_office_message" string="" options="{'height': 112}" class="border border-secondary w-100" placeholder="Your out-of-office message..."/>
</group>
</data>
</field>
</record>
@ -26,10 +54,27 @@
<field name="inherit_id" ref="base.view_users_form"/>
<field name="arch" type="xml">
<data>
<field name="signature" position="before">
<field name="notification_type" widget="radio"
attrs="{'invisible': [('share', '=', True)]}"/>
<xpath expr="//group[@name='other_preferences']" position="inside">
<field name="notification_type" widget="radio" invisible="share" options="{'horizontal': true}"/>
<field name="outgoing_mail_server_id" invisible="1"/> <!-- Used by the mail_server_configurator_selection widget -->
<span class="o_form_label fw-bold" invisible="not has_external_mail_server">Outgoing Mail Server</span>
<field name="outgoing_mail_server_type"
nolabel="1"
string="Outgoing Mail Server"
widget="mail_server_configurator_selection"
invisible="not has_external_mail_server"/>
</xpath>
<field name="signature" position="attributes">
<attribute name="widget">html_mail</attribute>
</field>
<group name="calendar_preferences" position="inside">
<label for="out_of_office_from" string="Out-of-office" />
<div class="o_row">
<field name="out_of_office_from" widget="daterange" options="{'end_date_field': 'out_of_office_to', 'show_time': False}" placeholder="None planned"/>
<field name="out_of_office_to" invisible="1"/> <!-- otherwise it is visible, smort -->
</div>
<field name="out_of_office_message" string="" options="{'height': 112}" class="border border-secondary w-100" placeholder="Your out-of-office message..."/>
</group>
</data>
</field>
</record>