[IMP] crm,crm_iap{_enrich}{_mine},*: improve UI

*: sale,sales_team

Improve UI of the CRM app:

- Add placeholders and underline m2o fields in the CRM quick create
- In the lead generation form, underline the industries field, add
the avatar widget on the user_id field, add the color attributes on
the tag field, add a placeholder for the states field and set a
longer selection field to avoid the caret from overlapping the content.
- In the opportunity form, align the expected revenue and probability
headers, set a longer width for the expected revenue field,
change the recurring plan placeholder.
- In the contact opportunities page, change the "Open Opportunities"
filter to exclude lost opportunities.
- In the Sales team page, add a groupby on the company_id.
- In the Sales team form, change the assigned lead count to be
a muted text, the pipeline checkbox should be visible only when leads
has been activated, the quotations/pipeline/leads options should be
aligned.
- In the lost lead modal, change the title from "Lost Reason"
to "Lost Lead" and the validate button from "Submit" to
"Mark as lost".
- In the Sales team member form, align the fields on the left and hide
the Create Employee field as it should not be displayed there because
this is not an hr module.
- In the lead analysis tree view, add the lost reason field with optional
hide.
- Align the enrichment company not found message to the left of the chatter.
- Update the crm iap lead role "Search More" list to display human
readable names instead of the technical names.

Task-3204763

Part-of: odoo/odoo#115326
This commit is contained in:
amdi-odoo
2023-05-05 12:43:58 +02:00
parent cdde6575e4
commit b47f73bf4e
9 changed files with 86 additions and 89 deletions
@@ -142,6 +142,9 @@
<field name="type" groups="crm.group_use_lead" optional="show"/>
<field name="stage_id" optional="show"/>
</xpath>
<xpath expr="field[@name='probability']" position="after">
<field name="lost_reason_id" optional="hide"/>
</xpath>
</field>
</record>
+34 -38
View File
@@ -50,43 +50,37 @@
<widget name="web_ribbon" title="Won" attrs="{'invisible': [('probability', '&lt;', 100)]}" />
<div class="oe_title">
<h1><field class="text-break" options="{'line_breaks': False}" widget="text" name="name" placeholder="e.g. Product Pricing"/></h1>
<h2 class="d-flex gap-2 g-0 align-items-end pb-3">
<div attrs="{'invisible': [('type', '=', 'lead')]}">
<label for="expected_revenue" class="oe_edit_only pb-1" />
<div class="d-flex align-items-end">
<h2 class="row g-0 pb-3 pb-sm-4">
<div class="col-auto pb-2 pb-md-0" attrs="{'invisible': [('type', '=', 'lead')]}">
<label for="expected_revenue" class="oe_edit_only"/>
<div class="d-flex align-items-baseline">
<field name="company_currency" invisible="1"/>
<field name="expected_revenue" class="oe_inline o_input_8ch" widget='monetary' options="{'currency_field': 'company_currency'}"/>
<field name="expected_revenue" class="o_input_13ch" widget='monetary' options="{'currency_field': 'company_currency'}"/>
<span class="oe_grey p-2" groups="crm.group_use_recurring_revenues"> + </span>
<span class="oe_grey p-2" groups="!crm.group_use_recurring_revenues"> at </span>
</div>
</div>
<div attrs="{'invisible': [('type', '=', 'lead')]}" groups="crm.group_use_recurring_revenues">
<field name="recurring_revenue" class="oe_inline o_input_10ch" widget="monetary" options="{'currency_field': 'company_currency'}"/>
</div>
<div attrs="{'invisible': [('type', '=', 'lead')]}" groups="crm.group_use_recurring_revenues">
<div class="d-flex align-items-end ps-2">
<field name="recurring_plan" class="oe_inline o_input_12ch" placeholder="E.g. Monthly"
attrs="{'required': [('recurring_revenue', '!=', 0)]}" options="{'no_create': True, 'no_open': True}"/>
<span class="oe_grey p-2"> at </span>
</div>
</div>
<div>
<div class="oe_edit_only d-md-flex align-items-center">
<label for="probability"/>
<div class="d-flex align-items-center">
<button class="ps-0 ps-md-2 btn btn-link" name="action_set_automated_probability" type="object"
attrs="{'invisible': [('is_automated_probability', '=', True)]}">
<i class="fa fa-gear" role="img" title="Switch to automatic probability" aria-label="Switch to automatic probability"></i>
</button>
<small class="oe_grey h6 mb0 d-flex" attrs="{'invisible': [('is_automated_probability', '=', True)]}">
<field class="mb0" name="automated_probability" force_save="1"/> %
</small>
<div class="d-flex align-items-baseline gap-3" groups="crm.group_use_recurring_revenues">
<field name="recurring_revenue" class="o_input_10ch" widget="monetary" options="{'currency_field': 'company_currency'}"/>
<div class="d-flex align-items-baseline">
<field name="recurring_plan" class="oe_inline o_input_13ch" placeholder='e.g. "Monthly"'
attrs="{'required': [('recurring_revenue', '!=', 0)]}" options="{'no_create': True, 'no_open': True}"/>
<span class="oe_grey p-2 text-nowrap"> at </span>
</div>
</div>
</div>
<div id="probability" class="d-inline-block">
</div>
<div class="col-auto">
<label for="probability" class="d-inline-block"/>
<button class="d-inline-block px-2 py-0 btn btn-link" name="action_set_automated_probability" type="object"
attrs="{'invisible': [('is_automated_probability', '=', True)]}">
<i class="fa fa-gear" role="img" title="Switch to automatic probability" aria-label="Switch to automatic probability"></i>
</button>
<small class="d-inline-block oe_grey h6 mb-0" attrs="{'invisible': [('is_automated_probability', '=', True)]}">
<field class="mb-0" name="automated_probability" force_save="1"/> %
</small>
<div id="probability" class="d-flex align-items-baseline">
<field name="is_automated_probability" invisible="1"/>
<field name="probability" widget="float" class="oe_inline o_input_6ch"/>
<span class="oe_grey"> %</span>
<span class="oe_grey p-2"> %</span>
</div>
</div>
</h2>
@@ -460,6 +454,7 @@
<form>
<group>
<field name="partner_id" widget="res_partner_many2one"
class="o_field_highlight"
string='Organization / Contact'
context="{
'res_partner_search_mode': type == 'opportunity' and 'customer' or False,
@@ -472,17 +467,17 @@
'default_team_id': team_id,
'show_vat': True}"/>
<field name="name" placeholder="e.g. Product Pricing" />
<field name="email_from" string="Email" />
<field name="phone" string="Phone" />
<field name="email_from" string="Email" placeholder='e.g. "email@address.com"' />
<field name="phone" string="Phone" placeholder='e.g. "0123456789"' />
<label for="expected_revenue"/>
<div>
<div class="o_row">
<field name="expected_revenue" class="oe_inline me-5" widget="monetary" options="{'currency_field': 'company_currency'}"/>
<field name="expected_revenue" class="oe_inline me-5 o_field_highlight" widget="monetary" options="{'currency_field': 'company_currency'}"/>
<field name="priority" class="oe_inline" nolabel="1" widget="priority"/>
</div>
<div class="o_row" groups="crm.group_use_recurring_revenues">
<field name="recurring_revenue" class="oe_inline" widget="monetary" options="{'currency_field': 'company_currency'}"/>
<field name="recurring_plan" class="oe_inline" placeholder="E.g. Monthly"
<field name="recurring_revenue" class="oe_inline o_field_highlight" widget="monetary" options="{'currency_field': 'company_currency'}"/>
<field name="recurring_plan" class="oe_inline" placeholder='e.g. "Monthly"'
attrs="{'required': [('recurring_revenue', '!=', 0)]}" options="{'no_create': True, 'no_open': True}"/>
</div>
</div>
@@ -786,9 +781,9 @@
domain="[('share', '=', False)]"/>
<field name="team_id" optional="hide"/>
<field name="priority" optional="hide" widget="priority"/>
<field name="activity_ids" widget="list_activity"/>
<field name="activity_ids" optional="hide" widget="list_activity"/>
<field name="activity_user_id" optional="hide" string="Activity by" widget="many2one_avatar_user"/>
<field name="my_activity_date_deadline" string="My Deadline" widget="remaining_days" options="{'allow_order': '1'}"/>
<field name="my_activity_date_deadline" optional="hide" string="My Deadline" widget="remaining_days" options="{'allow_order': '1'}"/>
<field name="activity_calendar_event_id" invisible="1"/>
<field name="campaign_id" optional="hide"/>
<field name="medium_id" optional="hide"/>
@@ -804,6 +799,7 @@
<field name="stage_id" optional="show" decoration-bf="1"/>
<field name="active" invisible="1"/>
<field name="probability" string="Probability (%)" optional="hide"/>
<field name="lost_reason_id" optional="hide"/>
<field name="tag_ids" optional="hide" widget="many2many_tags" options="{'color_field': 'color'}"/>
<field name="referred" invisible="1"/>
<field name="message_needaction" invisible="1"/>
@@ -994,7 +990,7 @@
<filter string="Unassigned" name="unassigned"
domain="[('user_id', '=', False)]" help="No salesperson"/>
<filter string="Open Opportunities" name="open_opportunities"
domain="[('probability', '&lt;', 100), ('type', '=', 'opportunity')]"
domain="[('probability', '&lt;', 100), ('type', '=', 'opportunity'), ('active', '=', True)]"
help="Open Opportunities"/>
<separator/>
<filter string="Unread Messages" name="message_needaction" domain="[('message_needaction', '=', True)]" groups="mail.group_mail_notification_type_inbox"/>
+13 -16
View File
@@ -138,6 +138,7 @@
<field name="arch" type="xml">
<xpath expr="//sheet" position="before">
<field name="use_leads" invisible="1"/>
<field name="use_opportunities" invisible="1"/>
<header>
<button name="action_assign_leads" type="object"
string="Assign Leads"
@@ -147,16 +148,14 @@
</header>
</xpath>
<xpath expr="//div[@name='options_active']" position="inside">
<div class="o_row">
<span name="opportunities">
<field name="use_opportunities"/>
<label for="use_opportunities"/>
</span>
<span class="o_row" groups="crm.group_use_lead">
<field name="use_leads"/>
<label for="use_leads" string="Leads"/>
</span>
</div>
<span name="opportunities" groups="crm.group_use_lead">
<field name="use_opportunities"/>
<label for="use_opportunities"/>
</span>
<span name="leads" groups="crm.group_use_lead">
<field name="use_leads"/>
<label for="use_leads" string="Leads"/>
</span>
</xpath>
<xpath expr="//field[@name='user_id']" position="after">
<label for="alias_name" string="Email Alias"
@@ -184,15 +183,13 @@
<xpath expr="//group[@name='right']" position="inside">
<field name="assignment_enabled" invisible="1"/>
<field name="assignment_auto_enabled" invisible="1"/>
<div class="text-muted" colspan="2" attrs="{'invisible': [('assignment_enabled', '=', False)]}">
<field name="lead_all_assigned_month_count" class="oe_inline"/><span> leads assigned this month
on a maximum of </span><field name="assignment_max" class="oe_inline"/>
</div>
<field name="assignment_domain" widget="domain" string="Domain"
options="{'model': 'crm.lead', 'in_dialog': True}"
attrs="{'invisible': [('assignment_enabled', '=', False)]}"/>
<label for="lead_all_assigned_month_count" string="Assigned Leads Count"
attrs="{'invisible': [('assignment_enabled', '=', False)]}"/>
<div attrs="{'invisible': [('assignment_enabled', '=', False)]}">
<field name="lead_all_assigned_month_count" class="oe_inline"/> /
<field name="assignment_max" class="oe_inline"/>
</div>
<field name="assignment_optout" attrs="{'invisible': [('assignment_auto_enabled', '=', False)]}"/>
</xpath>
<xpath expr="//field[@name='member_ids']" position="attributes">
+3 -3
View File
@@ -4,13 +4,13 @@
<field name="name">crm.lead.lost.form</field>
<field name="model">crm.lead.lost</field>
<field name="arch" type="xml">
<form string="Lost Reason">
<form string="Lost Lead">
<group>
<field name="lost_reason_id" options="{'no_create_edit': True}" />
</group>
<field name="lost_feedback" placeholder="What went wrong?"/>
<footer>
<button name="action_lost_reason_apply" string="Submit" type="object" class="btn-primary" data-hotkey="q"/>
<button name="action_lost_reason_apply" string="Mark as Lost" type="object" class="btn-primary" data-hotkey="q"/>
<button string="Cancel" class="btn-secondary" special="cancel" data-hotkey="z"/>
</footer>
</form>
@@ -18,7 +18,7 @@
</record>
<record id="crm_lead_lost_action" model="ir.actions.act_window">
<field name="name">Lost Reason</field>
<field name="name">Lost Lead</field>
<field name="res_model">crm.lead.lost</field>
<field name="view_mode">form</field>
<field name="view_id" ref="crm_lead_lost_view_form"/>
@@ -3,14 +3,14 @@
<!-- VIEWS USED FOR MESSAGING -->
<template id="mail_message_lead_enrich_notfound">
<p>Lead Enrichment (based on email address)</p>
<div style="background-color:#ffffff;padding:15px;">
<div style="background-color:#ffffff;padding:15px;padding-left:0px;">
<span> No company data found based on the email address or email address is one of an email provider. No credit was consumed. </span>
</div>
</template>
<template id="mail_message_lead_enrich_no_email">
<p>Lead Enrichment (based on email address)</p>
<div style="background-color:#ffffff;padding:15px;">
<div style="background-color:#ffffff;padding:15px;padding-left:0px;">
<span>Enrichment could not be done because the email address does not look valid.</span>
</div>
</template>
+21 -21
View File
@@ -1,23 +1,23 @@
"id",name,reveal_id
"crm_iap_mine_role_1","CEO","CEO"
"crm_iap_mine_role_2","communications","communications"
"crm_iap_mine_role_3","consulting","consulting"
"crm_iap_mine_role_4","customer_service","customer_service"
"crm_iap_mine_role_5","education","education"
"crm_iap_mine_role_6","engineering","engineering"
"crm_iap_mine_role_7","finance","finance"
"crm_iap_mine_role_8","founder","founder"
"crm_iap_mine_role_9","health_professional","health_professional"
"crm_iap_mine_role_10","human_resources","human_resources"
"crm_iap_mine_role_11","information_technology","information_technology"
"crm_iap_mine_role_12","legal","legal"
"crm_iap_mine_role_13","marketing","marketing"
"crm_iap_mine_role_14","operations","operations"
"crm_iap_mine_role_15","owner","owner"
"crm_iap_mine_role_16","president","president"
"crm_iap_mine_role_17","product","product"
"crm_iap_mine_role_18","public_relations","public_relations"
"crm_iap_mine_role_19","real_estate","real_estate"
"crm_iap_mine_role_20","recruiting","recruiting"
"crm_iap_mine_role_21","research","research"
"crm_iap_mine_role_22","sale","sale"
"crm_iap_mine_role_2","Communications","communications"
"crm_iap_mine_role_3","Consulting","consulting"
"crm_iap_mine_role_4","Customer Service","customer_service"
"crm_iap_mine_role_5","Education","education"
"crm_iap_mine_role_6","Engineering","engineering"
"crm_iap_mine_role_7","Finance","finance"
"crm_iap_mine_role_8","Founder","founder"
"crm_iap_mine_role_9","Health Professional","health_professional"
"crm_iap_mine_role_10","Human Resources","human_resources"
"crm_iap_mine_role_11","Information Technology","information_technology"
"crm_iap_mine_role_12","Legal","legal"
"crm_iap_mine_role_13","Marketing","marketing"
"crm_iap_mine_role_14","Operations","operations"
"crm_iap_mine_role_15","Owner","owner"
"crm_iap_mine_role_16","President","president"
"crm_iap_mine_role_17","Product","product"
"crm_iap_mine_role_18","Public Relations","public_relations"
"crm_iap_mine_role_19","Real Estate","real_estate"
"crm_iap_mine_role_20","Recruiting","recruiting"
"crm_iap_mine_role_21","Research","research"
"crm_iap_mine_role_22","Sale","sale"
1 id name reveal_id
2 crm_iap_mine_role_1 CEO CEO
3 crm_iap_mine_role_2 communications Communications communications
4 crm_iap_mine_role_3 consulting Consulting consulting
5 crm_iap_mine_role_4 customer_service Customer Service customer_service
6 crm_iap_mine_role_5 education Education education
7 crm_iap_mine_role_6 engineering Engineering engineering
8 crm_iap_mine_role_7 finance Finance finance
9 crm_iap_mine_role_8 founder Founder founder
10 crm_iap_mine_role_9 health_professional Health Professional health_professional
11 crm_iap_mine_role_10 human_resources Human Resources human_resources
12 crm_iap_mine_role_11 information_technology Information Technology information_technology
13 crm_iap_mine_role_12 legal Legal legal
14 crm_iap_mine_role_13 marketing Marketing marketing
15 crm_iap_mine_role_14 operations Operations operations
16 crm_iap_mine_role_15 owner Owner owner
17 crm_iap_mine_role_16 president President president
18 crm_iap_mine_role_17 product Product product
19 crm_iap_mine_role_18 public_relations Public Relations public_relations
20 crm_iap_mine_role_19 real_estate Real Estate real_estate
21 crm_iap_mine_role_20 recruiting Recruiting recruiting
22 crm_iap_mine_role_21 research Research research
23 crm_iap_mine_role_22 sale Sale sale
@@ -52,8 +52,8 @@
<group name="requests">
<group>
<div class="o_row py-3">
<field name="lead_number" attrs="{'readonly': [('state', '=', 'done')]}" nolabel="1" class="oe_inline pe-2 o_input_3ch"/>
<field name="search_type" widget="selection" attrs="{'readonly': [('state', '=', 'done')]}" nolabel="1" class="oe_inline"/>
<field name="lead_number" attrs="{'readonly': [('state', '=', 'done')]}" nolabel="1" class="oe_inline pe-2 o_input_3ch o_field_highlight"/>
<field name="search_type" widget="selection" attrs="{'readonly': [('state', '=', 'done')]}" nolabel="1" class="oe_inline o_field_highlight"/>
</div>
</group>
</group>
@@ -62,10 +62,10 @@
<group name="companies">
<field name="country_ids" widget="many2many_tags" attrs="{'readonly': [('state', '=', 'done')]}" required="True" options="{'no_create': True, 'no_open': True}"/>
<field name="available_state_ids" invisible="1"/>
<field name="state_ids" widget="many2many_tags"
<field name="state_ids" widget="many2many_tags" placeholder="Pick States..."
attrs="{'invisible': ['|', ('country_ids', '=', []), ('available_state_ids', '=', [])], 'readonly': [('state', '=', 'done')]}"
domain="[('id', 'in', available_state_ids)]" options="{'no_create': True, 'no_open': True}"/>
<field name="industry_ids" widget="many2many_tags" attrs="{'readonly': [('state', '=', 'done')]}" options="{'no_create': True, 'no_open': True}" class="o_industry" required="1"/>
<field name="industry_ids" widget="many2many_tags" attrs="{'readonly': [('state', '=', 'done')]}" options="{'no_create': True, 'no_open': True}" class="o_industry o_field_highlight" required="1"/>
<field name="filter_on_size" attrs="{'readonly': [('state', '=', 'done')]}"/>
<label for="company_size_min" attrs="{'invisible': [('filter_on_size', '=', False)]}"/>
<div attrs="{'invisible': [('filter_on_size', '=', False)]}">
@@ -80,8 +80,8 @@
<group name="lead_info">
<field name="lead_type" groups="crm.group_use_lead" invisible="context.get('is_modal')" attrs="{'readonly': [('state', '=', 'done')]}"/>
<field name="team_id" no_create="1" no_open="1" attrs="{'readonly': [('state', '=', 'done')]}" context="{'kanban_view_ref': 'sales_team.crm_team_view_kanban'}"/>
<field name="user_id" no_create="1" no_open="1" attrs="{'readonly': [('state', '=', 'done')]}"/>
<field name="tag_ids" string="Default Tags" widget="many2many_tags" attrs="{'readonly': [('state', '=', 'done')]}"/>
<field name="user_id" no_create="1" no_open="1" attrs="{'readonly': [('state', '=', 'done')]}" widget="many2one_avatar_user"/>
<field name="tag_ids" string="Default Tags" widget="many2many_tags" options="{'color_field': 'color', 'no_create_edit': True}" attrs="{'readonly': [('state', '=', 'done')]}"/>
</group>
</group>
@@ -120,7 +120,7 @@
<group name="group_owner">
<field name="crm_team_id" context="{'kanban_view_ref': 'sales_team.crm_team_view_kanban'}"/>
</group>
<group name="group_user">
<group class="ps-0" name="group_user">
<field name="company_id" attrs="{'invisible': [('user_id', '=', False)]}"
groups="base.group_multi_company"/>
<field name="email" attrs="{'invisible': [('user_id', '=', False)]}"/>
+3 -2
View File
@@ -11,6 +11,7 @@
<field name="user_id"/>
<field name="member_ids"/>
<group expand="0" string="Group By...">
<filter string="Company" name="company" domain="[]" context="{'group_by': 'company_id'}" groups="base.group_multi_company"/>
<filter string="Team Leader" name="team_leader" domain="[]" context="{'group_by': 'user_id'}"/>
</group>
</search>
@@ -34,7 +35,7 @@
<h1>
<field class="text-break" name="name" placeholder="e.g. North America"/>
</h1>
<div name="options_active"/>
<div name="options_active" class="o_row"/>
</div>
<group>
<group name="left" string="Team Details">
@@ -52,7 +53,7 @@
<notebook>
<page string="Members" name="members_users">
<field name="member_ids" mode="kanban"
class="w-100">
class="w-100" context="{'allow_create_employee': False}">
<kanban>
<field name="id"/>
<field name="name"/>