[IMP] * : kanban, unify dropdown definition in archs

This commit separate the templates, one for the card and another one for
the menu (the ellipsis dropdown).

The new template, called 'kanban-menu', will only contain the dropdown.
Note that, this behaviour is the same as the one used for the kanban
tooltips.

closes odoo/odoo#107589

Task-id: 3096776
Related: odoo/documentation#3284
Related: odoo/enterprise#34962
Signed-off-by: Aaron Bohy (aab) <aab@odoo.com>
This commit is contained in:
Jorge Pinna Puissant
2023-01-05 15:37:04 +01:00
parent 1d77762c19
commit 5b68871097
39 changed files with 759 additions and 1241 deletions
@@ -87,9 +87,10 @@
<AccountDropZone
visible="state.dropzoneVisible"
hideZone="() => state.dropzoneVisible = false"/>
<t t-call="{{ templates['kanban-box'] }}" t-call-context="renderingContext"/>
<t t-call="{{ templates[this.constructor.KANBAN_BOX_ATTRIBUTE] }}" t-call-context="renderingContext"/>
</t>
</AccountFileUploader>
<t t-call="{{ this.constructor.menuTemplate }}"/>
</div>
</t>
@@ -33,9 +33,6 @@
<t t-if="['bank', 'cash', 'sale', 'purchase'].includes(journal_type)" t-call="JournalBodyGraph"/>
</div>
</div>
<div class="container o_kanban_card_manage_pane dropdown-menu" role="menu">
<t t-call="JournalManage"/>
</div>
</div>
</t>
@@ -52,9 +49,6 @@
<field name="alias_id"/>
</div>
</div>
<div class="o_kanban_manage_button_section">
<a class="o_kanban_manage_toggle_button" href="#"><i class="fa fa-ellipsis-v" aria-label="Selection" role="img" title="Selection"/></a>
</div>
</div>
</t>
@@ -66,158 +60,161 @@
</a>
</t>
<t t-name="JournalManage">
<t t-name="kanban-menu">
<t t-value="JSON.parse(record.kanban_dashboard.raw_value)" t-set="dashboard"/>
<t t-value="record.type.raw_value" t-set="journal_type"/>
<div class="container">
<!-- For bank and cash -->
<div t-if="journal_type == 'bank' || journal_type == 'cash'" class="row">
<div class="col-4 o_kanban_card_manage_section o_kanban_manage_view">
<div id="card_action_view_menus" class="o_kanban_card_manage_title">
<span role="separator">View</span>
</div>
<div id="action_card_statements">
<a t-if="journal_type == 'bank'" role="menuitem" type="object" name="open_action_with_context" context="{'action_name': 'action_bank_statement_tree', 'search_default_journal': True}">Statements</a>
<a t-if="journal_type == 'cash'" role="menuitem" type="object" name="open_action_with_context" context="{'action_name': 'action_view_bank_statement_tree', 'search_default_journal': True}">Statements</a>
</div>
<div>
<a role="menuitem" type="object" name="open_collect_money">Cust. Payments</a>
</div>
<div>
<a role="menuitem" type="object" name="open_spend_money">Vendor Payments</a>
</div>
<div>
<a role="menuitem" type="object" name="open_transfer_money">Internal Transfers</a>
</div>
<div>
<a role="menuitem" type="object" name="open_action" context="{'action_name': 'action_account_moves_all_a'}">Journal Items</a>
</div>
</div>
<!-- For bank and cash -->
<div t-if="journal_type == 'bank' || journal_type == 'cash'" class="row">
<div class="col-4 o_kanban_card_manage_section o_kanban_manage_view">
<div id="card_action_view_menus" class="o_kanban_card_manage_title">
<span role="separator">View</span>
<div class="col-4 o_kanban_card_manage_section o_kanban_manage_new" groups="account.group_account_user">
<div class="o_kanban_card_manage_title">
<span role="separator">New</span>
</div>
<div name="bank_customer_payment">
<a role="menuitem" type="object" name="create_customer_payment">Cust. Payment</a>
</div>
<div>
<a role="menuitem" type="object" name="create_supplier_payment">Vendor Payment</a>
</div>
<div>
<a role="menuitem" type="object" name="create_internal_transfer">Internal Transfer</a>
</div>
</div>
<div id="action_card_statements">
<a t-if="journal_type == 'bank'" role="menuitem" type="object" name="open_action_with_context" context="{'action_name': 'action_bank_statement_tree', 'search_default_journal': True}">Statements</a>
<a t-if="journal_type == 'cash'" role="menuitem" type="object" name="open_action_with_context" context="{'action_name': 'action_view_bank_statement_tree', 'search_default_journal': True}">Statements</a>
</div>
<div>
<a role="menuitem" type="object" name="open_collect_money">Cust. Payments</a>
</div>
<div>
<a role="menuitem" type="object" name="open_spend_money">Vendor Payments</a>
</div>
<div>
<a role="menuitem" type="object" name="open_transfer_money">Internal Transfers</a>
</div>
<div>
<a role="menuitem" type="object" name="open_action" context="{'action_name': 'action_account_moves_all_a'}">Journal Items</a>
<div class="col-4 o_kanban_card_manage_section o_kanban_manage_reconciliation">
<div class="o_kanban_card_manage_title">
<span role="separator">Reconciliation</span>
</div>
<div>
<a role="menuitem" type="object" name="open_action_with_context" context="{'action_name': 'action_account_reconcile_model', 'use_domain': ['|', ('match_journal_ids', '=', False), ('match_journal_ids', 'in', active_id)]}" groups="account.group_account_manager">Reconciliation Models</a>
</div>
</div>
</div>
<div class="col-4 o_kanban_card_manage_section o_kanban_manage_new" groups="account.group_account_user">
<div class="o_kanban_card_manage_title">
<span role="separator">New</span>
<!-- For purchase and sale -->
<div t-if="journal_type == 'purchase' || journal_type == 'sale'" class="row">
<div class="col-4 o_kanban_card_manage_section o_kanban_manage_view">
<div class="o_kanban_card_manage_title">
<span>View</span>
</div>
<div>
<a t-if="journal_type == 'sale'" type="object" name="open_action" context="{'action_name': 'action_move_out_invoice_type'}">Invoices</a>
<a t-if="journal_type == 'purchase'" type="object" name="open_action" context="{'action_name': 'action_move_in_invoice_type'}">Bills</a>
</div>
<div id="sale_purchase_refund">
<a t-if="journal_type == 'sale'" type="object" name="open_action" context="{'action_name': 'action_move_out_refund_type'}">Credit Notes</a>
<a t-if="journal_type == 'purchase'" type="object" name="open_action" context="{'action_name': 'action_move_in_refund_type'}">Refund</a>
</div>
<div>
<a type="object" name="open_action" context="{'action_name': 'action_account_moves_all_a'}" groups="base.group_no_one">Journal Items</a>
</div>
</div>
<div name="bank_customer_payment">
<a role="menuitem" type="object" name="create_customer_payment">Cust. Payment</a>
<div class="col-4 o_kanban_card_manage_section o_kanban_manage_new" groups="account.group_account_invoice">
<div class="o_kanban_card_manage_title">
<span>New</span>
</div>
<div>
<a type="object" name="action_create_new">
<span t-if="journal_type == 'sale'">Invoice</span>
<span t-if="journal_type == 'purchase'">Bill</span>
</a>
</div>
<div>
<a type="object" name="action_create_new" context="{'refund':True}">
<span t-if="journal_type == 'sale'">Credit Note</span>
<span t-if="journal_type == 'purchase'">Refund</span>
</a>
</div>
<div t-if="journal_type == 'sale'">
<widget name="account_file_uploader" linkText="Upload Invoices" btnClass="file_upload_kanban_action_a"/>
</div>
</div>
<div>
<a role="menuitem" type="object" name="create_supplier_payment">Vendor Payment</a>
</div>
<div>
<a role="menuitem" type="object" name="create_internal_transfer">Internal Transfer</a>
<div class="col-4 o_kanban_card_manage_section o_kanban_manage_reports">
<div class="o_kanban_card_manage_title">
<span>Reporting</span>
</div>
<div>
<a t-if="journal_type == 'sale'" type="action" name="%(action_account_invoice_report_all)d" groups="account.group_account_readonly">Invoices Analysis</a>
<a t-if="journal_type == 'purchase'" type="action" name="%(action_account_invoice_report_all_supp)d" groups="account.group_account_readonly">Bills Analysis</a>
</div>
</div>
</div>
<div class="col-4 o_kanban_card_manage_section o_kanban_manage_reconciliation">
<div class="o_kanban_card_manage_title">
<span role="separator">Reconciliation</span>
<!-- For general and situation -->
<div t-if="journal_type == 'general' || journal_type == 'situation'" class="row">
<div class="col-4 o_kanban_card_manage_section o_kanban_manage_view">
<div class="o_kanban_card_manage_title">
<span>View</span>
</div>
<div>
<a type="object" name="open_action" context="{'action_name': 'action_move_journal_line'}">Journal Entries</a>
</div>
<div>
<a type="object" name="open_action" context="{'action_name': 'action_move_journal_line', 'search_default_unposted': 1}">Entries to Review</a>
</div>
<div>
<a type="object" name="open_action" context="{'action_name': 'action_account_moves_all_a'}" groups="base.group_no_one">Journal Items</a>
</div>
</div>
<div>
<a role="menuitem" type="object" name="open_action_with_context" context="{'action_name': 'action_account_reconcile_model', 'use_domain': ['|', ('match_journal_ids', '=', False), ('match_journal_ids', 'in', active_id)]}" groups="account.group_account_manager">Reconciliation Models</a>
</div>
</div>
</div>
<!-- For purchase and sale -->
<div t-if="journal_type == 'purchase' || journal_type == 'sale'" class="row">
<div class="col-4 o_kanban_card_manage_section o_kanban_manage_view">
<div class="o_kanban_card_manage_title">
<span>View</span>
<div class="col-4 o_kanban_card_manage_section o_kanban_manage_new" groups="account.group_account_user">
<div class="o_kanban_card_manage_title">
<span>New</span>
</div>
<div>
<a type="object" name="action_create_new">Journal Entry</a>
</div>
</div>
<div>
<a t-if="journal_type == 'sale'" type="object" name="open_action" context="{'action_name': 'action_move_out_invoice_type'}">Invoices</a>
<a t-if="journal_type == 'purchase'" type="object" name="open_action" context="{'action_name': 'action_move_in_invoice_type'}">Bills</a>
</div>
<div id="sale_purchase_refund">
<a t-if="journal_type == 'sale'" type="object" name="open_action" context="{'action_name': 'action_move_out_refund_type'}">Credit Notes</a>
<a t-if="journal_type == 'purchase'" type="object" name="open_action" context="{'action_name': 'action_move_in_refund_type'}">Refund</a>
</div>
<div>
<a type="object" name="open_action" context="{'action_name': 'action_account_moves_all_a'}" groups="base.group_no_one">Journal Items</a>
<div class="col-4 o_kanban_card_manage_section o_kanban_manage_operations">
<div class="o_kanban_card_manage_title">
<span>Operations</span>
</div>
<div>
<a type="object" name="open_action_with_context" context="{'action_name': 'action_validate_account_move', 'search_default_journal': True}" groups="account.group_account_user">Post All Entries</a>
</div>
</div>
</div>
<div class="col-4 o_kanban_card_manage_section o_kanban_manage_new" groups="account.group_account_invoice">
<div class="o_kanban_card_manage_title">
<span>New</span>
</div>
<div>
<a type="object" name="action_create_new">
<span t-if="journal_type == 'sale'">Invoice</span>
<span t-if="journal_type == 'purchase'">Bill</span>
</a>
</div>
<div>
<a type="object" name="action_create_new" context="{'refund':True}">
<span t-if="journal_type == 'sale'">Credit Note</span>
<span t-if="journal_type == 'purchase'">Refund</span>
</a>
</div>
<div t-if="journal_type == 'sale'">
<widget name="account_file_uploader" linkText="Upload Invoices" btnClass="file_upload_kanban_action_a"/>
<div t-if="widget.editable" class="o_kanban_card_manage_settings row">
<div class="col-8">
<ul class="oe_kanban_colorpicker" data-field="color"/>
</div>
</div>
<div class="col-4 o_kanban_card_manage_section o_kanban_manage_reports">
<div class="o_kanban_card_manage_title">
<span>Reporting</span>
<div groups="account.group_account_manager" class="row o_kanban_card_manage_settings">
<div class="col-6 position-relative">
<field name="show_on_dashboard" widget="boolean_favorite" />
</div>
<div>
<a t-if="journal_type == 'sale'" type="action" name="%(action_account_invoice_report_all)d" groups="account.group_account_readonly">Invoices Analysis</a>
<a t-if="journal_type == 'purchase'" type="action" name="%(action_account_invoice_report_all_supp)d" groups="account.group_account_readonly">Bills Analysis</a>
<div class="col-6 text-end mt-1">
<a class="dropdown-item" t-if="widget.editable" type="edit">Configuration</a>
</div>
</div>
</div>
<!-- For general and situation -->
<div t-if="journal_type == 'general' || journal_type == 'situation'" class="row">
<div class="col-4 o_kanban_card_manage_section o_kanban_manage_view">
<div class="o_kanban_card_manage_title">
<span>View</span>
</div>
<div>
<a type="object" name="open_action" context="{'action_name': 'action_move_journal_line'}">Journal Entries</a>
</div>
<div>
<a type="object" name="open_action" context="{'action_name': 'action_move_journal_line', 'search_default_unposted': 1}">Entries to Review</a>
</div>
<div>
<a type="object" name="open_action" context="{'action_name': 'action_account_moves_all_a'}" groups="base.group_no_one">Journal Items</a>
</div>
</div>
<div class="col-4 o_kanban_card_manage_section o_kanban_manage_new" groups="account.group_account_user">
<div class="o_kanban_card_manage_title">
<span>New</span>
</div>
<div>
<a type="object" name="action_create_new">Journal Entry</a>
</div>
</div>
<div class="col-4 o_kanban_card_manage_section o_kanban_manage_operations">
<div class="o_kanban_card_manage_title">
<span>Operations</span>
</div>
<div>
<a type="object" name="open_action_with_context" context="{'action_name': 'action_validate_account_move', 'search_default_journal': True}" groups="account.group_account_user">Post All Entries</a>
</div>
</div>
</div>
<div t-if="widget.editable" class="o_kanban_card_manage_settings row">
<div class="col-8">
<ul class="oe_kanban_colorpicker" data-field="color"/>
</div>
</div>
<div groups="account.group_account_manager" class="row o_kanban_card_manage_settings">
<div class="col-6 position-relative">
<field name="show_on_dashboard" widget="boolean_favorite" />
</div>
<div class="col-6 text-end mt-1">
<a class="dropdown-item" t-if="widget.editable" type="edit">Configuration</a>
</div>
</div>
</t>
<t t-name="JournalMiscelaneous">
+5 -10
View File
@@ -554,6 +554,11 @@
sum_field="expected_revenue" recurring_revenue_sum_field="recurring_revenue_monthly"
help="This bar allows to filter the opportunities based on scheduled activities."/>
<templates>
<t t-name="kanban-menu">
<t t-if="widget.editable"><a role="menuitem" type="edit" class="dropdown-item">Edit</a></t>
<t t-if="widget.deletable"><a role="menuitem" type="delete" class="dropdown-item">Delete</a></t>
<ul class="oe_kanban_colorpicker" data-field="color"/>
</t>
<t t-name="kanban-box">
<t t-set="lost_ribbon" t-value="!record.active.raw_value and record.probability and record.probability.raw_value == 0"/>
<div t-attf-class="#{!selection_mode ? kanban_color(record.color.raw_value) : ''} #{lost_ribbon ? 'oe_kanban_card_ribbon' : ''} oe_kanban_global_click oe_kanban_card d-flex flex-column">
@@ -562,16 +567,6 @@
<span class="bg-danger">Lost</span>
</div>
<div class="o_dropdown_kanban dropdown">
<a class="dropdown-toggle o-no-caret btn" role="button" data-bs-toggle="dropdown" data-bs-display="static" href="#" aria-label="Dropdown menu" title="Dropdown menu">
<span class="fa fa-ellipsis-v"/>
</a>
<div class="dropdown-menu" role="menu">
<t t-if="widget.editable"><a role="menuitem" type="edit" class="dropdown-item">Edit</a></t>
<t t-if="widget.deletable"><a role="menuitem" type="delete" class="dropdown-item">Delete</a></t>
<ul class="oe_kanban_colorpicker" data-field="color"/>
</div>
</div>
<div class="oe_kanban_content flex-grow-1">
<div class="o_kanban_record_title oe_kanban_details">
<strong><field name="name"/></strong>
@@ -204,16 +204,11 @@
<field name="id"/>
<field name="name" />
<templates>
<t t-name="kanban-menu">
<a role="menuitem" type="open" class="dropdown-item">Configuration</a>
</t>
<t t-name="kanban-box">
<div class="oe_kanban_vignette oe_semantic_html_override oe_kanban_global_click">
<div class="o_dropdown_kanban dropdown">
<a class="dropdown-toggle o-no-caret btn" role="button" 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 role="menuitem" type="open" class="dropdown-item">Configuration</a>
</div>
</div>
<div class="o_kanban_image">
<img alt="img" t-att-src="kanban_image('fleet.vehicle.model.brand', 'image_128', record.id.raw_value)" class="o_image_64_max" height="52"/>
</div>
+11 -14
View File
@@ -77,6 +77,17 @@
<field name="color"/>
<field name="total_employee"/>
<templates>
<t t-name="kanban-menu" t-if="!selection_mode">
<div class="o_kanban_card_manage_section">
<div role="menuitem" class="o_kanban_manage_reports">
<div class="o_kanban_card_manage_title ps-4 pb-1">
<span class="fw-bolder">Reporting</span>
</div>
</div>
</div>
<a t-if="widget.editable" role="menuitem" class="dropdown-item" type="edit">Configuration</a>
<ul t-if="widget.editable" class="oe_kanban_colorpicker" data-field="color" role="menu"/>
</t>
<t t-name="kanban-box">
<div t-attf-class="#{!selection_mode ? kanban_color(record.color.raw_value) : ''}">
<div t-attf-class="o_kanban_card_header">
@@ -88,9 +99,6 @@
</small>
</div>
</div>
<div class="o_kanban_manage_button_section" t-if="!selection_mode">
<a class="o_kanban_manage_toggle_button" href="#"><i class="fa fa-ellipsis-v" role="img" aria-label="Manage" title="Manage"/></a>
</div>
</div>
<div class="container o_kanban_card_content" t-if="!selection_mode">
<div class="row o_kanban_card_upper_content">
@@ -107,17 +115,6 @@
<!-- placeholder for bottom content -->
</div>
</div>
<div class="o_kanban_card_manage_pane dropdown-menu" role="menu">
<div class="o_kanban_card_manage_section">
<div role="menuitem" class="o_kanban_manage_reports">
<div class="o_kanban_card_manage_title ps-4 pb-1">
<span class="fw-bolder">Reporting</span>
</div>
</div>
</div>
<a t-if="widget.editable" role="menuitem" class="dropdown-item" type="edit">Configuration</a>
<ul t-if="widget.editable" class="oe_kanban_colorpicker" data-field="color" role="menu"/>
</div>
</div>
</t>
</templates>
@@ -288,17 +288,12 @@
<field name="state"/>
<progressbar field="activity_state" colors='{"planned": "success", "today": "warning", "overdue": "danger"}'/>
<templates>
<t t-name="kanban-menu" groups="hr_contract.group_hr_contract_manager">
<t t-if="widget.editable"><a role="menuitem" type="edit" class="dropdown-item">Edit Contract</a></t>
<t t-if="widget.deletable"><a role="menuitem" type="delete" class="dropdown-item">Delete</a></t>
</t>
<t t-name="kanban-box">
<div class="oe_kanban_card oe_kanban_global_click">
<div class="o_dropdown_kanban dropdown" t-if="!selection_mode" groups="hr_contract.group_hr_contract_manager">
<a class="dropdown-toggle o-no-caret btn" role="button" data-bs-toggle="dropdown" data-bs-display="static" href="#" aria-label="Dropdown menu" title="Dropdown menu">
<span class="fa fa-ellipsis-v"/>
</a>
<div class="dropdown-menu" role="menu">
<t t-if="widget.editable"><a role="menuitem" type="edit" class="dropdown-item">Edit Contract</a></t>
<t t-if="widget.deletable"><a role="menuitem" type="delete" class="dropdown-item">Delete</a></t>
</div>
</div>
<div class="oe_kanban_content">
<div class="o_hr_contract_state">
<strong class="o_kanban_record_title">
@@ -358,6 +358,10 @@
<field name="state"/>
<field name="holiday_status_id"/>
<templates>
<t t-name="kanban-menu" groups="base.group_user">
<a t-if="widget.editable" role="menuitem" type="edit" class="dropdown-item">Edit Allocation</a>
<a t-if="widget.deletable" role="menuitem" type="delete" class="dropdown-item">Delete</a>
</t>
<t t-name="kanban-box">
<div class="oe_kanban_global_click container">
<div class="row g-0">
@@ -373,15 +377,6 @@
<div class="text-muted o_kanban_record_subtitle">
<t t-esc="record.holiday_status_id.value"/>
</div>
<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-if="widget.editable" role="menuitem" type="edit" class="dropdown-item">Edit Allocation</a>
<a t-if="widget.deletable" role="menuitem" type="delete" class="dropdown-item">Delete</a>
</div>
</div>
<div t-if="['validate', 'refuse'].includes(record.state.raw_value)">
<span t-if="record.state.raw_value === 'validate'" class="fa fa-check text-muted" aria-label="validated"/>
<span t-else="" class="fa fa-ban text-muted" aria-label="refused"/>
+4 -9
View File
@@ -106,6 +106,10 @@
<field name="state"/>
<field name="supported_attachment_ids_count"/>
<templates>
<t t-name="kanban-menu" groups="base.group_user">
<a t-if="widget.editable" role="menuitem" type="edit" class="dropdown-item">Edit Time Off</a>
<a t-if="widget.deletable" role="menuitem" type="delete" class="dropdown-item">Delete</a>
</t>
<t t-name="kanban-box">
<div class="d-flex flex-column justify-content-between oe_kanban_global_click container">
<div class="row g-0">
@@ -115,15 +119,6 @@
<div class="text-muted o_kanban_record_subtitle">
<t t-esc="record.holiday_status_id.value"/>
</div>
<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-if="widget.editable" role="menuitem" type="edit" class="dropdown-item">Edit Time Off</a>
<a t-if="widget.deletable" role="menuitem" type="delete" class="dropdown-item">Delete</a>
</div>
</div>
<div>
<span class="text-muted">from </span>
<field name="date_from" widget="date"/>
@@ -318,6 +318,12 @@
<field name="refuse_reason_id" />
<progressbar field="activity_state" colors='{"planned": "success", "overdue": "danger", "today": "warning"}'/>
<templates>
<t t-name="kanban-menu">
<t t-if="widget.deletable"><a role="menuitem" type="delete" class="dropdown-item">Delete</a></t>
<a role="menuitem" name="action_makeMeeting" type="object" class="dropdown-item">Schedule Interview</a>
<div role="separator" class="dropdown-divider"></div>
<ul class="oe_kanban_colorpicker text-center" data-field="color"/>
</t>
<t t-name="kanban-box">
<div t-attf-class="{{!selection_mode ? 'oe_kanban_color_' + kanban_getcolor(record.color.raw_value) : ''}} oe_kanban_card oe_kanban_global_click oe_applicant_kanban oe_semantic_html_override">
<field name="date_closed" invisible="1"/>
@@ -325,17 +331,6 @@
<span class="bg-success">Hired</span>
</div>
<span class="badge rounded-pill text-bg-danger float-end me-4" attrs="{'invisible': ['|', ('active', '=', True), ('refuse_reason_id', '=', False)]}">Refused</span>
<div class="o_dropdown_kanban dropdown">
<a class="dropdown-toggle o-no-caret btn" role="button" data-bs-toggle="dropdown" href="#" aria-label="Dropdown menu" title="Dropdown menu" data-bs-display="static">
<span class="fa fa-ellipsis-v"/>
</a>
<div class="dropdown-menu" role="menu">
<t t-if="widget.deletable"><a role="menuitem" type="delete" class="dropdown-item">Delete</a></t>
<a role="menuitem" name="action_makeMeeting" type="object" class="dropdown-item">Schedule Interview</a>
<div role="separator" class="dropdown-divider"></div>
<ul class="oe_kanban_colorpicker text-center" data-field="color"/>
</div>
</div>
<div class="oe_kanban_content">
<div class="o_kanban_record_top">
<div class="o_kanban_record_headings">
+46 -47
View File
@@ -26,6 +26,52 @@
<field name="user_id"/>
<field name="application_count"/>
<templates>
<t t-name="kanban-menu" groups="hr_recruitment.group_hr_recruitment_user">
<div class="container">
<div class="row">
<div class="col-6 o_kanban_card_manage_section">
<div role="menuitem" class="o_kanban_card_manage_title">
<span>View</span>
</div>
<div role="menuitem" name="menu_view_applications">
<a name="%(action_hr_job_applications)d" type="action">Applications</a>
</div>
<div role="menuitem">
<a name="action_open_activities" type="object">Activities</a>
</div>
<div role="menuitem">
<a name="%(action_hr_job_sources)d" type="action" context="{'default_job_id': active_id}">Trackers</a>
</div>
</div>
<div class="col-6 o_kanban_card_manage_section">
<div role="menuitem" class="o_kanban_card_manage_title">
<span>New</span>
</div>
<div role="menuitem" name="menu_new_applications">
<a name="%(hr_recruitment.action_hr_applicant_new)d" type="action">Application</a>
</div>
</div>
<div class="col-6 o_kanban_card_manage_section">
<div role="menuitem" class="o_kanban_card_manage_title">
<span>Reporting</span>
</div>
<div role="menuitem" name="o_kanban_job_reporting">
<a name="%(hr_recruitment.action_hr_recruitment_report_filtered_job)d" type="action">Analysis</a>
</div>
</div>
</div>
<div class="o_kanban_card_manage_settings row">
<div class="col-6" role="menuitem" aria-haspopup="true">
<ul class="oe_kanban_colorpicker" data-field="color" role="popup"/>
</div>
<div class="col-6" role="menuitem">
<a class="dropdown-item" t-if="widget.editable" name="edit_job" type="edit">Configuration</a>
<a class="dropdown-item" t-if="record.active.raw_value" name="toggle_active" type="object">Archive</a>
<a class="dropdown-item" t-if="!record.active.raw_value" name="toggle_active" type="object">Unarchive</a>
</div>
</div>
</div>
</t>
<t t-name="kanban-box">
<div t-attf-class="#{!selection_mode ? kanban_color(record.color.raw_value) : ''}">
<div class="o_kanban_card_header">
@@ -44,9 +90,6 @@
<small><i class="fa fa-envelope-o" role="img" aria-label="Alias" title="Alias"></i> <field name="alias_id"/></small>
</div>
</div>
<div class="o_kanban_manage_button_section" groups="hr_recruitment.group_hr_recruitment_user">
<a class="o_kanban_manage_toggle_button" href="#"><i class="fa fa-ellipsis-v" role="img" aria-label="Manage" title="Manage"/></a>
</div>
</div>
<div class="container o_recruitment_job_container o_kanban_card_content mt-0 mt-sm-3">
<div class="row">
@@ -77,50 +120,6 @@
</div>
<div name="kanban_boxes" class="row flex-nowrap" groups="hr_recruitment.group_hr_recruitment_user"></div>
</div>
<div class="container o_recruitment_job_container o_kanban_card_manage_pane dropdown-menu" role="menu">
<div class="row">
<div class="col-6 o_kanban_card_manage_section">
<div role="menuitem" class="o_kanban_card_manage_title">
<span>View</span>
</div>
<div role="menuitem" name="menu_view_applications">
<a name="%(action_hr_job_applications)d" type="action">Applications</a>
</div>
<div role="menuitem">
<a name="action_open_activities" type="object">Activities</a>
</div>
<div role="menuitem">
<a name="%(action_hr_job_sources)d" type="action" context="{'default_job_id': active_id}">Trackers</a>
</div>
</div>
<div class="col-6 o_kanban_card_manage_section">
<div role="menuitem" class="o_kanban_card_manage_title">
<span>New</span>
</div>
<div role="menuitem" name="menu_new_applications">
<a name="%(hr_recruitment.action_hr_applicant_new)d" type="action">Application</a>
</div>
</div>
<div class="col-6 o_kanban_card_manage_section">
<div role="menuitem" class="o_kanban_card_manage_title">
<span>Reporting</span>
</div>
<div role="menuitem" name="o_kanban_job_reporting">
<a name="%(hr_recruitment.action_hr_recruitment_report_filtered_job)d" type="action">Analysis</a>
</div>
</div>
</div>
<div class="o_kanban_card_manage_settings row">
<div class="col-6" role="menuitem" aria-haspopup="true">
<ul class="oe_kanban_colorpicker" data-field="color" role="popup"/>
</div>
<div class="col-6" role="menuitem">
<a class="dropdown-item" t-if="widget.editable" name="edit_job" type="edit">Configuration</a>
<a class="dropdown-item" t-if="record.active.raw_value" name="toggle_active" type="object">Archive</a>
<a class="dropdown-item" t-if="!record.active.raw_value" name="toggle_active" type="object">Unarchive</a>
</div>
</div>
</div>
</div>
</t>
</templates>
@@ -195,16 +195,11 @@
<kanban>
<field name="color"/>
<templates>
<t t-name="kanban-menu" t-if="!selection_mode">
<ul class="oe_kanban_colorpicker" data-field="color"/>
</t>
<t t-name="kanban-box">
<div t-attf-class="#{!selection_mode ? kanban_color(record.color.raw_value) : ''} oe_kanban_global_click">
<div class="o_dropdown_kanban dropdown" t-if="!selection_mode">
<a class="dropdown-toggle o-no-caret btn" role="button" 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">
<ul class="oe_kanban_colorpicker" data-field="color"/>
</div>
</div>
<div class="oe_kanban_content">
<div>
<strong class="o_kanban_record_title"><span><field name="name"/></span></strong>
+4 -13
View File
@@ -140,21 +140,12 @@
<field name="create_date"/>
<field name="name"/>
<templates>
<t t-name="kanban-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="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>
</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)"/>
+61 -73
View File
@@ -137,19 +137,13 @@
<li t-if="record.user_id.raw_value"><b>Request to:</b> <t t-esc="record.user_id.value"/></li>
</ul>
</t>
<t t-name="kanban-menu">
<t t-if="widget.editable"><a role="menuitem" type="edit" class="dropdown-item">Edit...</a></t>
<t t-if="widget.deletable"><a role="menuitem" type="delete" class="dropdown-item">Delete</a></t>
<ul class="oe_kanban_colorpicker" data-field="color"/>
</t>
<t t-name="kanban-box">
<div t-attf-class="{{!selection_mode ? 'oe_kanban_color_' + kanban_getcolor(record.color.raw_value) : ''}} oe_kanban_card oe_kanban_global_click oe_semantic_html_override">
<div class="o_dropdown_kanban dropdown">
<a role="button" class="dropdown-toggle o-no-caret btn" data-bs-toggle="dropdown" data-bs-display="static" href="#" aria-label="Dropdown menu" title="Dropdown menu">
<span class="fa fa-ellipsis-v"/>
</a>
<div class="dropdown-menu" role="menu">
<t t-if="widget.editable"><a role="menuitem" type="edit" class="dropdown-item">Edit...</a></t>
<t t-if="widget.deletable"><a role="menuitem" type="delete" class="dropdown-item">Delete</a></t>
<ul class="oe_kanban_colorpicker" data-field="color"/>
</div>
</div>
<div class="oe_kanban_content" tooltip="kanban-tooltip">
<div class="o_kanban_record_top">
<b class="o_kanban_record_title"><field name="name"/></b>
@@ -437,21 +431,15 @@
<li t-if="record.model.raw_value"><b>Model Number:</b> <t t-esc="record.model.value"/></li>
</ul>
</t>
<t t-name="kanban-menu">
<t t-if="widget.editable"><a role="menuitem" type="edit" class="dropdown-item">Edit...</a></t>
<t t-if="widget.deletable"><a role="menuitem" type="delete" class="dropdown-item">Delete</a></t>
<div role="separator" class="dropdown-divider"></div>
<div role="separator" class="dropdown-header">Record Colour</div>
<ul class="oe_kanban_colorpicker" data-field="color"/>
</t>
<t t-name="kanban-box">
<div t-attf-class="{{!selection_mode ? 'oe_kanban_color_' + kanban_getcolor(record.color.raw_value) : ''}} oe_kanban_card oe_kanban_global_click">
<div class="o_dropdown_kanban dropdown" t-if="!selection_mode">
<a role="button" class="dropdown-toggle o-no-caret btn" data-bs-toggle="dropdown" data-bs-display="static" href="#" aria-label="Dropdown menu" title="Dropdown menu">
<span class="fa fa-ellipsis-v"/>
</a>
<div class="dropdown-menu" role="menu">
<t t-if="widget.editable"><a role="menuitem" type="edit" class="dropdown-item">Edit...</a></t>
<t t-if="widget.deletable"><a role="menuitem" type="delete" class="dropdown-item">Delete</a></t>
<div role="separator" class="dropdown-divider"></div>
<div role="separator" class="dropdown-header">Record Colour</div>
<ul class="oe_kanban_colorpicker" data-field="color"/>
</div>
</div>
<div class="oe_kanban_content" tooltip="kanban-tooltip">
<div class="o_kanban_record_top">
<b class="o_kanban_record_title"><field name="name"/><small><span t-if="record.model.raw_value"> (<field name="model"/>)</span></small></b>
@@ -825,6 +813,55 @@
<field name="todo_request_count_block"/>
<field name="todo_request_count_unscheduled"/>
<templates>
<t t-name="kanban-menu">
<div class="container">
<div class="row">
<div class="col-6 o_kanban_card_manage_section o_kanban_manage_view">
<div role="menuitem" class="o_kanban_card_manage_title">
<span>Requests</span>
</div>
<div role="menuitem">
<a name="%(hr_equipment_todo_request_action_from_dashboard)d" type="action">
All
</a>
</div>
<div role="menuitem">
<a name="%(hr_equipment_todo_request_action_from_dashboard)d" type="action" context="{'search_default_todo': 1}">
To Do
</a>
</div>
<div role="menuitem">
<a name="%(hr_equipment_todo_request_action_from_dashboard)d" type="action" context="{'search_default_progress': 1}">
In Progress
</a>
</div>
<div role="menuitem">
<a name="%(hr_equipment_todo_request_action_from_dashboard)d" type="action" context="{'search_default_done': 1}">
Done
</a>
</div>
</div>
<div class="col-6 o_kanban_card_manage_section o_kanban_manage_new">
<div role="menuitem" class="o_kanban_card_manage_title">
<span>Reporting</span>
</div>
<div role="menuitem">
<a name="%(maintenance_request_action_reports)d" type="action" context="{'search_default_maintenance_team_id': active_id}">
Maintenance Requests
</a>
</div>
</div>
</div>
<div t-if="widget.editable" class="o_kanban_card_manage_settings row">
<div class="col-8" role="menuitem" aria-haspopup="true">
<ul role="menu" class="oe_kanban_colorpicker" data-field="color"/>
</div>
<div role="menuitem" class="col-4">
<a type="edit" class="dropdown-item">Configuration</a>
</div>
</div>
</div>
</t>
<t t-name="kanban-box">
<div t-attf-class="#{!selection_mode ? kanban_color(record.color.raw_value) : ''}">
<div t-attf-class="o_kanban_card_header">
@@ -834,9 +871,6 @@
<field name="name"/>
</a></div>
</div>
<div class="o_kanban_manage_button_section">
<a class="o_kanban_manage_toggle_button" href="#"><i class="fa fa-ellipsis-v" role="img" aria-label="Manage" title="Manage"/></a>
</div>
</div>
<div class="container o_kanban_card_content">
<div class="row">
@@ -872,52 +906,6 @@
</div>
</div>
</div>
</div><div class="container o_kanban_card_manage_pane dropdown-menu" role="menu">
<div class="row">
<div class="col-6 o_kanban_card_manage_section o_kanban_manage_view">
<div role="menuitem" class="o_kanban_card_manage_title">
<span>Requests</span>
</div>
<div role="menuitem">
<a name="%(hr_equipment_todo_request_action_from_dashboard)d" type="action">
All
</a>
</div>
<div role="menuitem">
<a name="%(hr_equipment_todo_request_action_from_dashboard)d" type="action" context="{'search_default_todo': 1}">
To Do
</a>
</div>
<div role="menuitem">
<a name="%(hr_equipment_todo_request_action_from_dashboard)d" type="action" context="{'search_default_progress': 1}">
In Progress
</a>
</div>
<div role="menuitem">
<a name="%(hr_equipment_todo_request_action_from_dashboard)d" type="action" context="{'search_default_done': 1}">
Done
</a>
</div>
</div>
<div class="col-6 o_kanban_card_manage_section o_kanban_manage_new">
<div role="menuitem" class="o_kanban_card_manage_title">
<span>Reporting</span>
</div>
<div role="menuitem">
<a name="%(maintenance_request_action_reports)d" type="action" context="{'search_default_maintenance_team_id': active_id}">
Maintenance Requests
</a>
</div>
</div>
</div>
<div t-if="widget.editable" class="o_kanban_card_manage_settings row">
<div class="col-8" role="menuitem" aria-haspopup="true">
<ul role="menu" class="oe_kanban_colorpicker" data-field="color"/>
</div>
<div role="menuitem" class="col-4">
<a type="edit" class="dropdown-item">Configuration</a>
</div>
</div>
</div>
</div>
</t>
@@ -490,23 +490,18 @@
<field name='next_departure'/>
<field name='active'/>
<templates>
<t t-name="kanban-menu" t-if="!selection_mode">
<ul class="oe_kanban_colorpicker" data-field="color"/>
<t t-if="widget.deletable">
<a role="menuitem" type="delete" class="dropdown-item">Delete</a>
</t>
<a role="menuitem" class="dropdown-item o_kanban_mailing_active" name="toggle_active" type="object">
<t t-if="record.active.raw_value">Archive</t>
<t t-if="!record.active.raw_value">Restore</t>
</a>
</t>
<t t-name="kanban-box">
<div t-attf-class="{{!selection_mode ? 'oe_kanban_color_' + kanban_getcolor(record.color.raw_value) : ''}} oe_kanban_card oe_kanban_global_click oe_kanban_mass_mailing">
<div class="o_dropdown_kanban dropdown" t-if="!selection_mode">
<a role="button" class="dropdown-toggle o-no-caret btn" data-bs-toggle="dropdown" href="#" data-bs-display="static" aria-label="Dropdown menu" title="Dropdown menu">
<span class="fa fa-ellipsis-v"/>
</a>
<div class="dropdown-menu" role="menu">
<ul class="oe_kanban_colorpicker" data-field="color"/>
<t t-if="widget.deletable">
<a role="menuitem" type="delete" class="dropdown-item">Delete</a>
</t>
<a role="menuitem" class="dropdown-item o_kanban_mailing_active" name="toggle_active" type="object">
<t t-if="record.active.raw_value">Archive</t>
<t t-if="!record.active.raw_value">Restore</t>
</a>
</div>
</div>
<div class="oe_kanban_content">
<div class="o_kanban_record_top">
<div class="o_kanban_record_headings">
+5 -10
View File
@@ -13,6 +13,11 @@
<field name="priority"/>
<field name="create_uid"/>
<templates>
<t t-name="kanban-menu">
<a t-if="widget.editable" type="edit" class="dropdown-item">Edit</a>
<a t-if="widget.deletable" type="delete" class="dropdown-item">Delete</a>
<a class="dropdown-item o_mrp_download">Download</a>
</t>
<t t-name="kanban-box">
<div class="oe_kanban_global_area o_kanban_attachment oe_kanban_global_click">
<div class="o_kanban_image">
@@ -41,16 +46,6 @@
<field name="create_uid" widget="many2one_avatar_user"/>
</div>
</div>
<div class="o_dropdown_kanban dropdown" tabindex="-1">
<a class="dropdown-toggle o-no-caret btn" data-bs-toggle="dropdown" href="#" role="button" aria-label="Dropdown menu" title="Dropdown menu">
<span class="fa fa-ellipsis-v"/>
</a>
<div class="dropdown-menu" role="menu" aria-labelledby="dLabel">
<a t-if="widget.editable" type="edit" class="dropdown-item">Edit</a>
<a t-if="widget.deletable" type="delete" class="dropdown-item">Delete</a>
<a class="dropdown-item o_mrp_download">Download</a>
</div>
</div>
</div>
</div>
</div>
+37 -39
View File
@@ -161,6 +161,43 @@
<field name="working_state"/>
<field name="oee_target"/>
<templates>
<t t-name="kanban-menu">
<div class="row">
<div class="col-6 o_kanban_card_manage_section o_kanban_manage_view">
<div role="menuitem" class="o_kanban_card_manage_title">
<span>Actions</span>
</div>
<div role="menuitem" name="plan_order">
<a name="action_work_order" type="object">Plan Orders</a>
</div>
</div>
<div class="col-6 o_kanban_card_manage_section o_kanban_manage_new">
<div role="menuitem" class="o_kanban_card_manage_title">
<span>Reporting</span>
</div>
<div role="menuitem">
<a name="%(mrp_workcenter_productivity_report_oee)d" type="action">OEE</a>
</div>
<div role="menuitem">
<a name="%(mrp_workorder_workcenter_report)d" type="action" context="{'search_default_thisyear':True}">
Performance
</a>
</div>
<div role="menuitem">
<a name="action_work_order" type="object" context="{'search_default_waiting': 1}">Waiting Availability</a>
</div>
</div>
</div>
<div t-if="widget.editable" class="o_kanban_card_manage_settings row">
<div role="menuitem" aria-haspopup="true" class="col-8">
<ul role="menu" class="oe_kanban_colorpicker" data-field="color"/>
</div>
<div role="menuitem" class="col-4">
<a type="edit">Settings</a>
</div>
</div>
</t>
<t t-name="kanban-box">
<div t-attf-class="#{!selection_mode ? kanban_color(record.color.raw_value) : ''}">
<div t-attf-class="o_kanban_card_header o_kanban_record_top">
@@ -169,9 +206,6 @@
<field name="name"/>
</span>
</div>
<div class="o_kanban_manage_button_section">
<a class="o_kanban_manage_toggle_button" href="#"><i class="fa fa-ellipsis-v" role="img" aria-label="Manage" title="Manage"/></a>
</div>
</div>
<div class="container o_kanban_card_content">
<div class="row mb16">
@@ -252,42 +286,6 @@
attrs="{'invisible': [('working_state','in',('normal','blocked'))]}"/>
</div>
</div>
</div><div class="container o_kanban_card_manage_pane dropdown-menu" role="menu">
<div class="row">
<div class="col-6 o_kanban_card_manage_section o_kanban_manage_view">
<div role="menuitem" class="o_kanban_card_manage_title">
<span>Actions</span>
</div>
<div role="menuitem" name="plan_order">
<a name="action_work_order" type="object">Plan Orders</a>
</div>
</div>
<div class="col-6 o_kanban_card_manage_section o_kanban_manage_new">
<div role="menuitem" class="o_kanban_card_manage_title">
<span>Reporting</span>
</div>
<div role="menuitem">
<a name="%(mrp_workcenter_productivity_report_oee)d" type="action">OEE</a>
</div>
<div role="menuitem">
<a name="%(mrp_workorder_workcenter_report)d" type="action" context="{'search_default_thisyear':True}">
Performance
</a>
</div>
<div role="menuitem">
<a name="action_work_order" type="object" context="{'search_default_waiting': 1}">Waiting Availability</a>
</div>
</div>
</div>
<div t-if="widget.editable" class="o_kanban_card_manage_settings row">
<div role="menuitem" aria-haspopup="true" class="col-8">
<ul role="menu" class="oe_kanban_colorpicker" data-field="color"/>
</div>
<div role="menuitem" class="col-4">
<a type="edit">Settings</a>
</div>
</div>
</div>
</div>
</t>
+39 -37
View File
@@ -11,6 +11,45 @@
<field name="count_mo_late"/>
</field>
<xpath expr="//t[@t-name='kanban-box']" position="before">
<t t-name="kanban-menu">
<div class="container">
<div class="row">
<div class="col-6 o_kanban_card_manage_section o_kanban_manage_view" name="picking_left_manage_pane">
<div role="menuitem" class="o_kanban_card_manage_title">
<span>Orders</span>
</div>
<div role="menuitem">
<a name="%(mrp_production_action_picking_deshboard)d" type="action">All</a>
</div>
<div role="menuitem">
<a name="%(mrp_production_action_picking_deshboard)d" type="action" context="{'search_default_inprogress': 1}">In Progress</a>
</div>
<div role="menuitem">
<a name="%(mrp_production_action_picking_deshboard)d" type="action" context="{'search_default_planned': 1}">Planned</a>
</div>
</div>
<div class="col-6 o_kanban_card_manage_section o_kanban_manage_new">
<div role="menuitem" class="o_kanban_card_manage_title">
<span>New</span>
</div>
<div role="menuitem">
<a name="%(action_mrp_production_form)d" context="{'default_picking_type_id': active_id}" type="action">Manufacturing Order</a>
</div>
</div>
</div>
<div t-if="widget.editable" class="o_kanban_card_manage_settings row">
<div role="menuitem" aria-haspopup="true" class="col-8">
<ul role="menu" class="oe_kanban_colorpicker" data-field="color"/>
</div>
<div class="col-4">
<a class="dropdown-item" role="menuitem" type="edit">Configuration</a>
</div>
</div>
</div>
</t>
</xpath>
<xpath expr='//div[@name="stock_picking"]' position="after">
<div t-if="record.code.raw_value == 'mrp_operation'" t-attf-class="#{!selection_mode ? kanban_color(record.color.raw_value) : ''}">
<div>
@@ -24,9 +63,6 @@
<span class="o_primary" t-if="selection_mode"><field name="name"/></span>
<div class="o_secondary"><field class="o_secondary" name="warehouse_id" readonly="1" groups="stock.group_stock_multi_warehouses"/></div>
</div>
<div class="o_kanban_manage_button_section" t-if="!selection_mode">
<a class="o_kanban_manage_toggle_button" href="#"><i class="fa fa-ellipsis-v" role="img" aria-label="Manage" title="Manage"/></a>
</div>
</div>
<div class="container o_kanban_card_content" t-if="!selection_mode">
<div class="row">
@@ -58,40 +94,6 @@
</div>
</div>
</div>
</div><div class="container o_kanban_card_manage_pane dropdown-menu" role="menu">
<div class="row">
<div class="col-6 o_kanban_card_manage_section o_kanban_manage_view" name="picking_left_manage_pane">
<div role="menuitem" class="o_kanban_card_manage_title">
<span>Orders</span>
</div>
<div role="menuitem">
<a name="%(mrp_production_action_picking_deshboard)d" type="action">All</a>
</div>
<div role="menuitem">
<a name="%(mrp_production_action_picking_deshboard)d" type="action" context="{'search_default_inprogress': 1}">In Progress</a>
</div>
<div role="menuitem">
<a name="%(mrp_production_action_picking_deshboard)d" type="action" context="{'search_default_planned': 1}">Planned</a>
</div>
</div>
<div class="col-6 o_kanban_card_manage_section o_kanban_manage_new">
<div role="menuitem" class="o_kanban_card_manage_title">
<span>New</span>
</div>
<div role="menuitem">
<a name="%(action_mrp_production_form)d" context="{'default_picking_type_id': active_id}" type="action">Manufacturing Order</a>
</div>
</div>
</div>
<div t-if="widget.editable" class="o_kanban_card_manage_settings row">
<div role="menuitem" aria-haspopup="true" class="col-8">
<ul role="menu" class="oe_kanban_colorpicker" data-field="color"/>
</div>
<div class="col-4">
<a class="dropdown-item" role="menuitem" type="edit">Configuration</a>
</div>
</div>
</div>
</div>
</div>
+4 -9
View File
@@ -90,6 +90,10 @@
<field name="activity_state" />
<progressbar field="activity_state" colors='{"planned": "success", "today": "warning", "overdue": "danger"}'/>
<templates>
<t t-name="kanban-menu">
<a role="menuitem" type="delete" class="dropdown-item">Delete</a>
<ul class="oe_kanban_colorpicker" data-field="color"/>
</t>
<t t-name="kanban-box">
<t t-set="noteHasFollowers" t-value="record.message_partner_ids.raw_value.length &gt; 1"/>
@@ -97,15 +101,6 @@
<field name="tag_ids" widget="many2many_tags" options="{'color_field': 'color'}"/>
<div class="o_dropdown_kanban dropdown">
<a role="button" class="dropdown-toggle o-no-caret btn" data-bs-toggle="dropdown" data-bs-display="static" href="#" aria-label="Dropdown menu" title="Dropdown menu">
<span class="fa fa-ellipsis-v"/>
</a>
<div class="dropdown-menu" role="menu">
<a role="menuitem" type="delete" class="dropdown-item">Delete</a>
<ul class="oe_kanban_colorpicker" data-field="color"/>
</div>
</div>
<div t-attf-class="d-flex #{noteHasFollowers ? 'flex-wrap' : 'flex-nowrap'}">
<div class="d-flex flex-grow-1">
<span class="me-2">
@@ -62,6 +62,37 @@
<field name="currency_id"/>
<field name="number_of_opened_session"/>
<templates>
<t t-name="kanban-menu">
<div class="container">
<div class="row">
<div class="col-6 o_kanban_card_manage_section o_kanban_manage_view">
<div role="menuitem" class="o_kanban_card_manage_title">
<span>View</span>
</div>
<div role="menuitem">
<a name="%(action_pos_order_filtered)d" type="action">Orders</a>
</div>
<div role="menuitem">
<a name="%(action_pos_session_filtered)d" type="action">Sessions</a>
</div>
</div>
<div class="col-6 o_kanban_card_manage_section o_kanban_manage_new">
<div role="menuitem" class="o_kanban_card_manage_title">
<span>Reporting</span>
</div>
<div role="menuitem">
<a name="%(action_report_pos_order_all_filtered)d" type="action">Orders</a>
</div>
</div>
</div>
<div t-if="widget.editable" class="o_kanban_card_manage_settings row" groups="point_of_sale.group_pos_manager">
<div role="menuitem" class="col-12">
<a name="action_pos_config_modal_edit" type="object">Edit</a>
</div>
</div>
</div>
</t>
<t t-name="kanban-box">
<div>
<div class="o_kanban_card_header">
@@ -85,9 +116,6 @@
</div>
</t>
</div>
<div class="o_kanban_manage_button_section">
<a class="o_kanban_manage_toggle_button" href="#"><i class="fa fa-ellipsis-v" role="img" aria-label="Manage" title="Manage"/></a>
</div>
</div>
<div class="container o_kanban_card_content">
<div class="row">
@@ -130,34 +158,6 @@
<field name="current_user_id" widget="many2one_avatar_user"/>
</div>
</div><div class="container o_kanban_card_manage_pane dropdown-menu" role="menu">
<div class="row">
<div class="col-6 o_kanban_card_manage_section o_kanban_manage_view">
<div role="menuitem" class="o_kanban_card_manage_title">
<span>View</span>
</div>
<div role="menuitem">
<a name="%(action_pos_order_filtered)d" type="action">Orders</a>
</div>
<div role="menuitem">
<a name="%(action_pos_session_filtered)d" type="action">Sessions</a>
</div>
</div>
<div class="col-6 o_kanban_card_manage_section o_kanban_manage_new">
<div role="menuitem" class="o_kanban_card_manage_title">
<span>Reporting</span>
</div>
<div role="menuitem">
<a name="%(action_report_pos_order_all_filtered)d" type="action">Orders</a>
</div>
</div>
</div>
<div t-if="widget.editable" class="o_kanban_card_manage_settings row" groups="point_of_sale.group_pos_manager">
<div role="menuitem" class="col-12">
<a name="action_pos_config_modal_edit" type="object">Edit</a>
</div>
</div>
</div>
</div>
</t>
@@ -10,7 +10,7 @@ tour.register('burndown_chart_tour', {
trigger: '.o_app[data-menu-xmlid="project.menu_main_pm"]',
}, {
content: 'Open "Burndown Chart Test" project menu',
trigger: '.o_kanban_record:contains("Burndown Chart Test") .o_kanban_manage_toggle_button',
trigger: '.o_kanban_record:contains("Burndown Chart Test") .o_dropdown_kanban .dropdown-toggle',
}, {
content: `Open "Burndown Chart Test" project's "Burndown Chart" view`,
trigger: '.o_kanban_record:contains("Burndown Chart Test") .o_kanban_manage_reporting div[role="menuitem"] a:contains("Burndown Chart")',
@@ -3,7 +3,7 @@
import tour from 'web_tour.tour';
const projectSharingSteps = [...tour.stepUtils.goToAppSteps("project.menu_main_pm", 'Go to the Project App.'), {
trigger: '.oe_kanban_global_click :contains("Project Sharing") button.o_dropdown_kanban',
trigger: '.o_kanban_record:contains("Project Sharing") .o_dropdown_kanban .dropdown-toggle',
content: 'Open the project dropdown.'
}, {
trigger: '.o_kanban_record:contains("Project Sharing") .dropdown-menu a:contains("Share")',
+5 -10
View File
@@ -48,6 +48,11 @@
<field name="has_late_and_unreached_milestone"/>
<progressbar field="kanban_state" colors='{"done": "success", "blocked": "danger", "normal": "200"}'/>
<templates>
<t t-name="kanban-menu" t-if="!selection_mode">
<a t-if="widget.editable" role="menuitem" type="edit" class="dropdown-item">Edit</a>
<div role="separator" class="dropdown-divider"></div>
<ul class="oe_kanban_colorpicker" data-field="color"/>
</t>
<t t-name="kanban-box">
<div t-attf-class="{{!selection_mode ? 'oe_kanban_color_' + kanban_getcolor(record.color.raw_value) : ''}} oe_kanban_card oe_kanban_global_click">
<div class="oe_kanban_content">
@@ -73,16 +78,6 @@
</t>
<t t-else="record.email_from.raw_value"><span><field name="email_from"/></span></t>
</div>
<div class="o_dropdown_kanban dropdown" t-if="!selection_mode">
<a role="button" class="dropdown-toggle o-no-caret btn" data-bs-toggle="dropdown" data-bs-display="static" href="#" aria-label="Dropdown menu" title="Dropdown menu">
<span class="fa fa-ellipsis-v"/>
</a>
<div class="dropdown-menu" role="menu">
<a t-if="widget.editable" role="menuitem" type="edit" class="dropdown-item">Edit</a>
<div role="separator" class="dropdown-divider"></div>
<ul class="oe_kanban_colorpicker" data-field="color"/>
</div>
</div>
</div>
<div class="o_kanban_record_body">
<field name="tag_ids" widget="many2many_tags" options="{'color_field': 'color'}" context="{'project_id': project_id}"/>
+49 -55
View File
@@ -829,6 +829,48 @@
<progressbar field="last_update_status" colors='{"on_track": "success", "at_risk": "warning", "off_track": "danger", "on_hold": "info", "done": "purple"}'/>
<field name="sequence" widget="handle"/>
<templates>
<t t-name="kanban-menu" groups="base.group_user">
<div class="container">
<div class="row">
<div class="col-6 o_kanban_card_manage_section o_kanban_manage_view">
<div role="menuitem" class="o_kanban_card_manage_title">
<span>View</span>
</div>
<div role="menuitem">
<a name="action_view_tasks" type="object">Tasks</a>
</div>
<div role="menuitem" groups="project.group_project_milestone" t-if="record.allow_milestones.raw_value">
<a name="action_get_list_view" type="object">Milestones</a>
</div>
</div>
<div class="col-6 o_kanban_card_manage_section o_kanban_manage_reporting">
<div role="menuitem" class="o_kanban_card_manage_title" groups="project.group_project_user">
<span>Reporting</span>
</div>
<div role="menuitem" groups="project.group_project_user">
<a name="action_view_tasks_analysis" type="object">Tasks Analysis</a>
</div>
<div role="menuitem" name="project_burndown_menu" groups="project.group_project_user">
<a name="action_project_task_burndown_chart_report" type="object">Burndown Chart</a>
</div>
</div>
</div>
<div class="o_kanban_card_manage_settings row">
<div role="menuitem" aria-haspopup="true" class="col-6" groups="project.group_project_manager">
<ul class="oe_kanban_colorpicker" data-field="color" role="popup"/>
</div>
<div role="menuitem" class="col-6" groups="project.group_project_manager">
<a t-if="record.privacy_visibility.raw_value == 'portal'" class="dropdown-item" role="menuitem" name="%(project.project_share_wizard_action)d" type="action">Share</a>
<a class="dropdown-item" role="menuitem" type="edit">Settings</a>
</div>
<div class="o_kanban_card_manage_section o_kanban_manage_view col-12 row ps-0" groups="!project.group_project_manager">
<div role="menuitem" class="w-100">
<a class="dropdown-item mx-0" role="menuitem" type="open">View</a>
</div>
</div>
</div>
</div>
</t>
<t t-name="kanban-box">
<div t-attf-class="#{kanban_color(record.color.raw_value)} oe_kanban_global_click o_has_icon oe_kanban_content oe_kanban_card">
<div class="o_project_kanban_main ">
@@ -859,49 +901,6 @@
</div>
</div>
</div>
<div class="container o_kanban_card_manage_pane dropdown-menu" role="menu" groups="base.group_user">
<div class="row">
<div class="col-6 o_kanban_card_manage_section o_kanban_manage_view">
<div role="menuitem" class="o_kanban_card_manage_title">
<span>View</span>
</div>
<div role="menuitem">
<a name="action_view_tasks" type="object">Tasks</a>
</div>
<div role="menuitem" groups="project.group_project_milestone" t-if="record.allow_milestones.raw_value">
<a name="action_get_list_view" type="object">Milestones</a>
</div>
</div>
<div class="col-6 o_kanban_card_manage_section o_kanban_manage_reporting">
<div role="menuitem" class="o_kanban_card_manage_title" groups="project.group_project_user">
<span>Reporting</span>
</div>
<div role="menuitem" groups="project.group_project_user">
<a name="action_view_tasks_analysis" type="object">Tasks Analysis</a>
</div>
<div role="menuitem" name="project_burndown_menu" groups="project.group_project_user">
<a name="action_project_task_burndown_chart_report" type="object">Burndown Chart</a>
</div>
</div>
</div>
<div class="o_kanban_card_manage_settings row">
<div role="menuitem" aria-haspopup="true" class="col-6" groups="project.group_project_manager">
<ul class="oe_kanban_colorpicker" data-field="color" role="popup"/>
</div>
<div role="menuitem" class="col-6" groups="project.group_project_manager">
<a t-if="record.privacy_visibility.raw_value == 'portal'" class="dropdown-item" role="menuitem" name="%(project.project_share_wizard_action)d" type="action">Share</a>
<a class="dropdown-item" role="menuitem" type="edit">Settings</a>
</div>
<div class="o_kanban_card_manage_section o_kanban_manage_view col-12 row ps-0" groups="!project.group_project_manager">
<div role="menuitem" class="w-100">
<a class="dropdown-item mx-0" role="menuitem" type="open">View</a>
</div>
</div>
</div>
</div>
<a class="o_kanban_manage_toggle_button o_dropdown_kanban" href="#" groups="base.group_user">
<i class="fa fa-ellipsis-v" role="img" aria-label="Manage" title="Manage"/>
</a>
<span>
<field name="is_favorite" widget="boolean_favorite" nolabel="1" force_save="1" />
</span>
@@ -1428,6 +1427,13 @@
<field name="allow_milestones" />
<progressbar field="kanban_state" colors='{"done": "success", "blocked": "danger", "normal": "200"}'/>
<templates>
<t t-name="kanban-menu" t-if="!selection_mode" groups="base.group_user">
<a t-if="widget.editable" role="menuitem" type="set_cover" class="dropdown-item" data-field="displayed_image_id">Set Cover Image</a>
<a name="%(portal.portal_share_action)d" role="menuitem" type="action" class="dropdown-item">Share</a>
<a t-if="widget.editable" role="menuitem" type="edit" class="dropdown-item">Edit</a>
<div role="separator" class="dropdown-divider"></div>
<ul class="oe_kanban_colorpicker" data-field="color"/>
</t>
<t t-name="kanban-box">
<div t-attf-class="{{!selection_mode ? 'oe_kanban_color_' + kanban_getcolor(record.color.raw_value) : ''}} oe_kanban_card oe_kanban_global_click">
<div class="oe_kanban_content">
@@ -1453,18 +1459,6 @@
</t>
<t t-else="record.email_from.raw_value"><span><field name="email_from"/></span></t>
</div>
<div class="o_dropdown_kanban dropdown" t-if="!selection_mode" groups="base.group_user">
<a role="button" class="dropdown-toggle o-no-caret btn" data-bs-toggle="dropdown" data-bs-display="static" href="#" aria-label="Dropdown menu" title="Dropdown menu">
<span class="fa fa-ellipsis-v"/>
</a>
<div class="dropdown-menu" role="menu">
<a t-if="widget.editable" role="menuitem" type="set_cover" class="dropdown-item" data-field="displayed_image_id">Set Cover Image</a>
<a name="%(portal.portal_share_action)d" role="menuitem" type="action" class="dropdown-item">Share</a>
<a t-if="widget.editable" role="menuitem" type="edit" class="dropdown-item">Edit</a>
<div role="separator" class="dropdown-divider"></div>
<ul class="oe_kanban_colorpicker" data-field="color"/>
</div>
</div>
</div>
<div class="o_kanban_record_body">
<field name="tag_ids" widget="many2many_tags" options="{'color_field': 'color'}"/>
@@ -181,7 +181,7 @@ tour.register('sale_timesheet_tour', {
trigger: '.dropdown-item[data-menu-xmlid="project.menu_main_pm"]',
content: 'Select Project main menu',
}, {
trigger: '.oe_kanban_global_click :contains("Project for Freeman") button.o_dropdown_kanban',
trigger: '.o_kanban_record:contains("Project for Freeman") .o_dropdown_kanban .dropdown-toggle',
content: 'Open the project dropdown',
}, {
trigger: '.o_kanban_record:contains("Project for Freeman") .dropdown-menu a:contains("Settings")',
+31 -31
View File
@@ -151,15 +151,43 @@
<field name="currency_id"/>
<field name="is_favorite"/>
<templates>
<t t-name="kanban-menu">
<div class="container">
<div class="row">
<div class="col-4 o_kanban_card_manage_section o_kanban_manage_view">
<div role="menuitem" class="o_kanban_card_manage_title">
<span>View</span>
</div>
</div>
<div class="col-4 o_kanban_card_manage_section o_kanban_manage_new">
<div role="menuitem" class="o_kanban_card_manage_title">
<span>New</span>
</div>
</div>
<div class="col-4 o_kanban_card_manage_section o_kanban_manage_reports">
<div role="menuitem" class="o_kanban_card_manage_title">
<span>Reporting</span>
</div>
<div name="o_team_kanban_report_separator"></div>
</div>
</div>
<div t-if="widget.editable" class="o_kanban_card_manage_settings row" groups="sales_team.group_sale_manager">
<div role="menuitem" aria-haspopup="true" class="col-8">
<ul class="oe_kanban_colorpicker" data-field="color" role="menu"/>
</div>
<div role="menuitem" class="col-4">
<a class="dropdown-item" type="edit">Configuration</a>
</div>
</div>
</div>
</t>
<t t-name="kanban-box">
<div t-attf-class="#{!selection_mode ? kanban_color(record.color.raw_value) : ''}">
<div t-attf-class="o_kanban_card_header">
<div class="o_kanban_card_header_title">
<div class="o_primary o_text_overflow"><field name="name"/></div>
</div>
<div class="o_kanban_manage_button_section">
<a class="o_kanban_manage_toggle_button" href="#"><i class="fa fa-ellipsis-v" role="img" aria-label="Manage" title="Manage"/></a>
</div>
</div>
<div class="container o_kanban_card_content">
<div class="row o_kanban_card_upper_content">
@@ -177,34 +205,6 @@
<t t-call="SalesTeamDashboardGraph"/>
</div>
</div>
</div><div class="container o_kanban_card_manage_pane dropdown-menu" role="menu">
<div class="row">
<div class="col-4 o_kanban_card_manage_section o_kanban_manage_view">
<div role="menuitem" class="o_kanban_card_manage_title">
<span>View</span>
</div>
</div>
<div class="col-4 o_kanban_card_manage_section o_kanban_manage_new">
<div role="menuitem" class="o_kanban_card_manage_title">
<span>New</span>
</div>
</div>
<div class="col-4 o_kanban_card_manage_section o_kanban_manage_reports">
<div role="menuitem" class="o_kanban_card_manage_title">
<span>Reporting</span>
</div>
<div name="o_team_kanban_report_separator"></div>
</div>
</div>
<div t-if="widget.editable" class="o_kanban_card_manage_settings row" groups="sales_team.group_sale_manager">
<div role="menuitem" aria-haspopup="true" class="col-8">
<ul class="oe_kanban_colorpicker" data-field="color" role="menu"/>
</div>
<div role="menuitem" class="col-4">
<a class="dropdown-item" type="edit">Configuration</a>
</div>
</div>
</div>
</div>
</t>
+44 -45
View File
@@ -138,6 +138,50 @@
<field name="count_picking_late"/>
<field name="count_picking_backorders"/>
<templates>
<t t-name="kanban-menu" t-if="!selection_mode">
<div class="container">
<div class="row">
<div class="col-6 o_kanban_card_manage_section o_kanban_manage_view">
<div role="menuitem" class="o_kanban_card_manage_title">
<span t-if="record.code.raw_value == 'internal'">Transfers</span>
<span t-else="">View</span>
</div>
<div role="menuitem">
<a name="get_stock_picking_action_picking_type" type="object">All</a>
</div>
<div role="menuitem">
<a name="get_action_picking_tree_ready" type="object">Ready</a>
</div>
<div role="menuitem">
<a name="get_action_picking_tree_waiting" type="object">Waiting</a>
</div>
<div role="menuitem">
<a name="get_action_picking_type_operations" type="object">Operations</a>
</div>
</div>
<div class="col-6 o_kanban_card_manage_section o_kanban_manage_new">
<div role="menuitem" class="o_kanban_card_manage_title">
<span>New</span>
</div>
<div role="menuitem">
<a name="%(action_picking_form)d" type="action" context="{'default_immediate_transfer': True}">Immediate Transfer</a>
</div>
<div role="menuitem">
<a name="%(action_picking_form)d" type="action">Planned Transfer</a>
</div>
</div>
</div>
<div t-if="widget.editable" class="o_kanban_card_manage_settings row">
<div class="col-8" role="menuitem" aria-haspopup="true">
<ul class="oe_kanban_colorpicker" data-field="color" role="menu"/>
</div>
<div role="menuitem" class="col-4">
<a class="dropdown-item" role="menuitem" type="edit">Configuration</a>
</div>
</div>
</div>
</t>
<t t-name="kanban-box">
<div t-if="['incoming', 'outgoing', 'internal'].indexOf(record.code.raw_value) > -1" t-attf-class="#{!selection_mode ? kanban_color(record.color.raw_value) : ''}" name="stock_picking">
<div t-attf-class="o_kanban_card_header">
@@ -152,9 +196,6 @@
</div>
<div class="o_secondary"><field class="o_secondary" name="warehouse_id" readonly="1" groups="stock.group_stock_multi_warehouses"/></div>
</div>
<div class="o_kanban_manage_button_section" t-if="!selection_mode">
<a class="o_kanban_manage_toggle_button" href="#"><i class="fa fa-ellipsis-v" role="img" aria-label="Manage" title="Manage"/></a>
</div>
</div>
<div class="container o_kanban_card_content" t-if="!selection_mode">
<div class="row">
@@ -198,48 +239,6 @@
</div>
</div>
</div>
<div class="container o_kanban_card_manage_pane dropdown-menu" role="menu">
<div class="row">
<div class="col-6 o_kanban_card_manage_section o_kanban_manage_view">
<div role="menuitem" class="o_kanban_card_manage_title">
<span t-if="record.code.raw_value == 'internal'">Transfers</span>
<span t-else="">View</span>
</div>
<div role="menuitem">
<a name="get_stock_picking_action_picking_type" type="object">All</a>
</div>
<div role="menuitem">
<a name="get_action_picking_tree_ready" type="object">Ready</a>
</div>
<div role="menuitem">
<a name="get_action_picking_tree_waiting" type="object">Waiting</a>
</div>
<div role="menuitem">
<a name="get_action_picking_type_operations" type="object">Operations</a>
</div>
</div>
<div class="col-6 o_kanban_card_manage_section o_kanban_manage_new">
<div role="menuitem" class="o_kanban_card_manage_title">
<span>New</span>
</div>
<div role="menuitem">
<a name="%(action_picking_form)d" type="action" context="{'default_immediate_transfer': True}">Immediate Transfer</a>
</div>
<div role="menuitem">
<a name="%(action_picking_form)d" type="action">Planned Transfer</a>
</div>
</div>
</div>
<div t-if="widget.editable" class="o_kanban_card_manage_settings row">
<div class="col-8" role="menuitem" aria-haspopup="true">
<ul class="oe_kanban_colorpicker" data-field="color" role="menu"/>
</div>
<div role="menuitem" class="col-4">
<a class="dropdown-item" role="menuitem" type="edit">Configuration</a>
</div>
</div>
</div>
</div>
</t>
</templates>
+8 -16
View File
@@ -213,6 +213,14 @@
<field name="session_state"/>
<field name="success_ratio"/>
<templates>
<div t-name="kanban-menu" t-if="widget.editable">
<a role="menuitem" type="edit" class="dropdown-item">Edit Survey</a>
<a t-if="record.active.raw_value" role="menuitem" type="object" class="dropdown-item" name="action_send_survey">Share</a>
<a t-if="widget.deletable" role="menuitem" type="delete" class="dropdown-item">Delete</a>
<div role="separator" class="dropdown-divider"/>
<div role="separator" class="dropdown-item-text">Color</div>
<ul class="oe_kanban_colorpicker" data-field="color"/>
</div>
<div t-name="kanban-box"
t-attf-class="oe_kanban_color_#{kanban_getcolor(record.color.raw_value)}
oe_kanban_card oe_kanban_global_click
@@ -311,22 +319,6 @@
<widget name="web_ribbon" title="Archived"
bg_color="bg-danger"
attrs="{'invisible': [('active', '=', True)]}"/>
<div class="o_dropdown_kanban dropdown" t-if="widget.editable">
<a href="#" role="button"
class="dropdown-toggle o-no-caret btn"
data-bs-toggle="dropdown" data-bs-display="static"
aria-label="Dropdown menu" title="Dropdown menu">
<span class="fa fa-ellipsis-v"/>
</a>
<div class="dropdown-menu" role="menu">
<a role="menuitem" type="edit" class="dropdown-item">Edit Survey</a>
<a t-if="record.active.raw_value" role="menuitem" type="object" class="dropdown-item" name="action_send_survey">Share</a>
<a t-if="widget.deletable" role="menuitem" type="delete" class="dropdown-item">Delete</a>
<div role="separator" class="dropdown-divider"/>
<div role="separator" class="dropdown-item-text">Color</div>
<ul class="oe_kanban_colorpicker" data-field="color"/>
</div>
</div>
<div class="o_kanban_record_top">
<h4 class="o_kanban_record_title p-0 mb4"><field name="title" /></h4>
</div>
+10 -15
View File
@@ -82,23 +82,18 @@
<field name='user_id'/>
<field name="stage_id"/>
<templates>
<t t-name="kanban-menu">
<t t-if="widget.editable">
<a role="menuitem" type="edit" class="dropdown-item">Edit</a>
</t>
<t t-if="widget.deletable">
<a role="menuitem" type="delete" class="dropdown-item">Delete</a>
</t>
<div role="separator" class="dropdown-divider"/>
<ul class="oe_kanban_colorpicker" data-field="color"/>
</t>
<t t-name="kanban-box">
<div t-attf-class="oe_kanban_color_#{kanban_getcolor(record.color.raw_value)} oe_kanban_card oe_kanban_global_click">
<div class="o_dropdown_kanban dropdown">
<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">
<t t-if="widget.editable">
<a role="menuitem" type="edit" class="dropdown-item">Edit</a>
</t>
<t t-if="widget.deletable">
<a role="menuitem" type="delete" class="dropdown-item">Delete</a>
</t>
<div role="separator" class="dropdown-divider"/>
<ul class="oe_kanban_colorpicker" data-field="color"/>
</div>
</div>
<div class="oe_kanban_content">
<div class="o_kanban_record_top">
<div class="o_kanban_record_headings">
@@ -25,6 +25,7 @@ import { Widget } from "@web/views/widgets/widget";
*/
export const KANBAN_BOX_ATTRIBUTE = "kanban-box";
export const KANBAN_MENU_ATTRIBUTE = "kanban-menu";
export const KANBAN_TOOLTIP_ATTRIBUTE = "kanban-tooltip";
export class KanbanArchParser extends XMLParser {
@@ -21,78 +21,13 @@ import { toInterpolatedStringExpression, ViewCompiler } from "@web/views/view_co
const ACTION_TYPES = ["action", "object"];
const SPECIAL_TYPES = [...ACTION_TYPES, "edit", "open", "delete", "url", "set_cover"];
let currentDropdownId = 1;
export class KanbanCompiler extends ViewCompiler {
setup() {
this.ctx.readonly = "read_only_mode";
this.compilers.push(
{ selector: ".oe_kanban_colorpicker", fn: this.compileColorPicker },
{
selector: ".dropdown:not(.kanban_ignore_dropdown),.o_kanban_manage_button_section",
fn: this.compileDropdown,
doNotCopyAttributes: true,
},
{
selector: ".dropdown-menu:not(.kanban_ignore_dropdown)",
fn: this.compileDropdownMenu,
doNotCopyAttributes: true,
},
{
selector:
".dropdown-toggle:not(.kanban_ignore_dropdown),.o_kanban_manage_toggle_button",
fn: this.compileDropdownToggler,
doNotCopyAttributes: true,
},
{ selector: "t[t-call]", fn: this.compileTCall }
);
/** @type {Record<number, DropdownDef>} */
this.dropdowns = {};
}
/**
* Renders a Dropdown component node definition object. It works as follows:
*
* The first time a node defining a dropdown component or component slot (dropdown
* root, toggler or default=menu), a new dropdown object will be generated,
* taking note of what parts have already been defined.
*
* It also creates the Dropdown component node that will be inserted in the
* template, at the position of the first node defining either the root dropdown
* or the dropdown toggler.
*
* Each next component or slot still not defined on the current dropdown object
* will be added to it.
*
* If a duplicate part or component is found, a new dropdown object is created
* and set as the new current dropdown.
*
* @param {"dropdown" | "toggler" | "menu"} part
* @returns {DropdownDef}
*/
renderDropdown(part) {
if (!this.dropdowns[currentDropdownId]) {
this.dropdowns[currentDropdownId] = {
parts: [],
inserted: false,
shouldInsert: false,
el: createElement("Dropdown", {
class: toStringExpression("o_dropdown_kanban"),
position: toStringExpression("bottom-end"),
}),
};
}
const dropdown = this.dropdowns[currentDropdownId];
if (dropdown.parts.includes(part)) {
// Duplicate part: generate new dropdown
currentDropdownId++;
return this.renderDropdown(part);
}
dropdown.parts.push(part);
if (part !== "menu" || dropdown.parts.includes("dropdown")) {
dropdown.shouldInsert = !dropdown.inserted;
dropdown.inserted = true;
}
return dropdown;
}
//-----------------------------------------------------------------------------
@@ -168,65 +103,6 @@ export class KanbanCompiler extends ViewCompiler {
return createElement("t", { "t-call": "web.KanbanColorPicker" });
}
/**
* @param {Element} el
* @param {Object} params
* @returns {Element | null}
*/
compileDropdown(el, params) {
const { shouldInsert, el: dropdownEl } = this.renderDropdown("dropdown");
const classes = [...el.classList].filter((cls) => cls && cls !== "dropdown").join(" ");
combineAttributes(dropdownEl, "class", toStringExpression(classes), "+' '+");
for (const child of el.childNodes) {
append(dropdownEl, this.compileNode(child, params));
}
return shouldInsert && dropdownEl;
}
/**
* @param {Element} el
* @param {Object} params
* @returns {Element | null}
*/
compileDropdownMenu(el, params) {
const { shouldInsert, el: dropdownEl } = this.renderDropdown("menu");
const cls = el.getAttribute("class") || "";
combineAttributes(dropdownEl, "menuClass", toStringExpression(cls), "+' '+");
const wrapper = createElement("KanbanDropdownMenuWrapper");
for (const child of el.childNodes) {
append(wrapper, this.compileNode(child, params));
}
append(dropdownEl, wrapper);
return shouldInsert && dropdownEl;
}
/**
* @param {Element} el
* @param {Object} params
* @returns {Element | null}
*/
compileDropdownToggler(el, params) {
const { shouldInsert, el: dropdownEl } = this.renderDropdown("toggler");
const classes = ["btn", ...el.classList].filter(Boolean).join(" ");
const togglerSlot = createElement("t", { "t-set-slot": "toggler" });
combineAttributes(dropdownEl, "togglerClass", toStringExpression(classes), "+' '+");
for (const child of el.childNodes) {
append(togglerSlot, this.compileNode(child, params));
}
append(dropdownEl, togglerSlot);
return shouldInsert && dropdownEl;
}
/**
* @override
*/
@@ -26,17 +26,12 @@
--o-view-nocontent-zindex: 1;
// ----------------------------------------------------------------------------
.dropdown,
.o_kanban_manage_button_section {
position: inherit;
}
@include media-breakpoint-down(md) {
--KanbanRecord-padding-h: #{$o-kanban-inside-hgutter * 2};
padding: 0px !important;
}
.o_kanban_record > div,
.o_kanban_record > div:not(.o_dropdown_kanban),
.o_kanban_quick_create {
border: 1px solid $border-color;
background-color: $o-view-background-color;
@@ -57,7 +52,7 @@
min-width: 150px;
margin: 0 0 -1px;
> div {
> div:not(.o_dropdown_kanban) {
padding: var(--KanbanRecord-padding-v) var(--KanbanRecord-padding-h);
width: 100%;
height: 100%;
@@ -258,13 +253,7 @@
// ------- v11 Layout + generic layouts (~v10) -------
// Kanban Record - Dropdown
.o_dropdown_kanban {
@include o-position-absolute(
calc(var(--KanbanRecord-padding-v) + var(--KanbanRecord__dropdown-gap)),
calc(var(--KanbanRecord-padding-h) + var(--KanbanRecord__dropdown-gap))
);
visibility: hidden;
margin: calc(var(--KanbanRecord-padding-v) * -1)
calc(var(--KanbanRecord-padding-h) * -1) 0 0;
@include media-breakpoint-down(md) {
visibility: visible;
}
@@ -8,7 +8,7 @@
--KanbanRecord__dropdown-gap: 0px;
// ----------------------------------------------------------------------------
.o_kanban_record > div {
.o_kanban_record > div:not(.o_dropdown_kanban) {
position: relative;
display: flex;
flex-flow: column nowrap;
@@ -24,108 +24,6 @@
max-width: none;
}
// ------- Dropdown toggle & menu -------
$o-kanban-manage-toggle-height: 35px;
.o_dropdown_kanban {
visibility: visible;
}
.o_kanban_manage_toggle_button {
@include o-kanban-dropdown($o-kanban-dashboard-hpadding);
@include o-position-absolute(0, 0);
height: $o-kanban-manage-toggle-height;
}
.o_kanban_card_manage_pane {
// Arbitrary value to place the dropdown-menu exactly below the
// dropdown-toggle (height is forced so that it works on Firefox)
top: $o-kanban-manage-toggle-height;
> div:not(.o_no_padding_kanban_colorpicker) {
padding: 3px 0 3px 20px;
visibility: visible;
margin-bottom: 5px;
}
> .o_kanban_card_manage_section {
margin-bottom: 10px;
+ .o_kanban_card_manage_section {
border-top: 1px solid map-get($grays, '200');
}
> div {
@include o-kanban-dashboard-dropdown-link;
}
}
// Dropdown menu with complex layout
&.container {
width: 95%;
max-width: 400px;
.row {
display: flex;
flex-flow: row nowrap;
justify-content: space-between;
margin-left: 0;
margin-right: 0;
padding-left: $o-kanban-dashboard-dropdown-complex-gap*2;
padding-right: $o-kanban-dashboard-dropdown-complex-gap*2;
}
div[class*="col-"] {
flex: 1 1 percentage(1/3);
padding-left: $o-kanban-dashboard-dropdown-complex-gap;
padding-right: $o-kanban-dashboard-dropdown-complex-gap;
max-width: none;
> .o_kanban_card_manage_title {
@extend .h5;
margin: (($font-size-base * $line-height-base) / 2) 0;
}
> div:not(.o_kanban_card_manage_title) {
@include o-kanban-dashboard-dropdown-link($link-padding-gap: $o-kanban-dashboard-dropdown-complex-gap);
}
}
.row.o_kanban_card_manage_settings {
padding-top: $o-kanban-dashboard-dropdown-complex-gap*3;
&:not(:first-child) {
border-top: 1px solid map-get($grays, '300');
}
.oe_kanban_colorpicker {
max-width: none;
padding: 0;
}
div[class*="col-"] + div[class*="col-"] {
border-left: 1px solid map-get($grays, '300');
}
> div:last-child {
@include o-kanban-dashboard-dropdown-link($link-padding-gap: $o-kanban-dashboard-dropdown-complex-gap);
padding-left: $dropdown-item-padding-x;
padding-right: $dropdown-item-padding-x;
}
}
}
}
&.o_dropdown_open,
.o-dropdown.show {
.o_kanban_card_manage_pane {
display: block;
}
.o_kanban_manage_toggle_button {
@include o-kanban-dropdown-open;
position: absolute;
}
}
// ------- Kanban Record Titles -------
// Uniform design across different HTML layouts
@@ -204,6 +102,90 @@
}
}
// ------- Dropdown toggle & menu -------
$o-kanban-manage-toggle-height: 35px;
.o_kanban_record .o_dropdown_kanban {
visibility: visible;
}
.o_kanban_record .dropdown-menu {
// Arbitrary value to place the dropdown-menu exactly below the
// dropdown-toggle (height is forced so that it works on Firefox)
top: $o-kanban-manage-toggle-height;
> div:not(.o_no_padding_kanban_colorpicker) {
padding: 3px 0 3px 20px;
visibility: visible;
margin-bottom: 5px;
}
> .o_kanban_card_manage_section {
margin-bottom: 10px;
+ .o_kanban_card_manage_section {
border-top: 1px solid map-get($grays, '200');
}
> div {
@include o-kanban-dashboard-dropdown-link;
}
}
// Dropdown menu with complex layout
.container {
max-width: 400px;
margin-left: 0;
margin-right: 0;
.row {
display: flex;
flex-flow: row nowrap;
justify-content: space-between;
padding-left: $o-kanban-dashboard-dropdown-complex-gap*2;
padding-right: $o-kanban-dashboard-dropdown-complex-gap*2;
}
div[class*="col-"] {
flex: 1 1 percentage(1/3);
padding-left: $o-kanban-dashboard-dropdown-complex-gap;
padding-right: $o-kanban-dashboard-dropdown-complex-gap;
max-width: none;
> .o_kanban_card_manage_title {
@extend .h5;
margin: (($font-size-base * $line-height-base) / 2) 0;
}
> div:not(.o_kanban_card_manage_title) {
@include o-kanban-dashboard-dropdown-link($link-padding-gap: $o-kanban-dashboard-dropdown-complex-gap);
}
}
.row.o_kanban_card_manage_settings {
padding-top: $o-kanban-dashboard-dropdown-complex-gap*3;
&:not(:first-child) {
border-top: 1px solid map-get($grays, '300');
}
.oe_kanban_colorpicker {
max-width: none;
padding: 0;
}
div[class*="col-"] + div[class*="col-"] {
border-left: 1px solid map-get($grays, '300');
}
> div:last-child {
@include o-kanban-dashboard-dropdown-link($link-padding-gap: $o-kanban-dashboard-dropdown-complex-gap);
padding-left: $dropdown-item-padding-x;
padding-right: $dropdown-item-padding-x;
}
}
}
}
.o_favorite {
@include o-position-absolute(
$top: 3px,
@@ -14,7 +14,11 @@ import { ViewButton } from "@web/views/view_button/view_button";
import { useViewCompiler } from "@web/views/view_compiler";
import { Widget } from "@web/views/widgets/widget";
import { evalDomain } from "../utils";
import { KANBAN_BOX_ATTRIBUTE, KANBAN_TOOLTIP_ATTRIBUTE } from "./kanban_arch_parser";
import {
KANBAN_BOX_ATTRIBUTE,
KANBAN_MENU_ATTRIBUTE,
KANBAN_TOOLTIP_ATTRIBUTE,
} from "./kanban_arch_parser";
import { KanbanCompiler } from "./kanban_compiler";
import { KanbanCoverImageDialog } from "./kanban_cover_image_dialog";
import { KanbanDropdownMenuWrapper } from "./kanban_dropdown_menu_wrapper";
@@ -122,6 +126,10 @@ export class KanbanRecord extends Component {
this.templates = useViewCompiler(ViewCompiler, arch, templates);
if (this.constructor.KANBAN_MENU_ATTRIBUTE in templates) {
this.showMenu = true;
}
if (KANBAN_TOOLTIP_ATTRIBUTE in templates) {
useTooltip("root", {
info: { ...this, record: this.props.record.formattedRecord },
@@ -327,4 +335,6 @@ KanbanRecord.props = [
];
KanbanRecord.Compiler = KanbanCompiler;
KanbanRecord.KANBAN_BOX_ATTRIBUTE = KANBAN_BOX_ATTRIBUTE;
KanbanRecord.KANBAN_MENU_ATTRIBUTE = KANBAN_MENU_ATTRIBUTE;
KanbanRecord.menuTemplate = "web.KanbanRecordMenu";
KanbanRecord.template = "web.KanbanRecord";
@@ -10,6 +10,23 @@
t-on-click="onGlobalClick"
t-ref="root">
<t t-call="{{ templates[this.constructor.KANBAN_BOX_ATTRIBUTE] }}" t-call-context="renderingContext"/>
<t t-call="{{ this.constructor.menuTemplate }}"/>
</div>
</t>
<t t-name="web.KanbanRecordMenu" owl="1">
<t t-if="showMenu">
<Dropdown class="'o_dropdown_kanban bg-transparent position-absolute end-0'"
menuClass="'dropdown-menu'"
togglerClass="'btn o-no-caret mt-0'"
position="'bottom-end'"
title="'Dropdown menu'">
<t t-set-slot="toggler">
<span class="fa fa-ellipsis-v"/>
</t>
<KanbanDropdownMenuWrapper>
<t t-call="{{ templates[this.constructor.KANBAN_MENU_ATTRIBUTE] }}" t-call-context="renderingContext"/>
</KanbanDropdownMenuWrapper>
</Dropdown>
</t>
</t>
</templates>
@@ -155,7 +155,12 @@
<t t-name="web.KanbanColorPicker" owl="1">
<ul class="oe_kanban_colorpicker">
<t t-foreach="props.colors" t-as="color" t-key="color">
<!--
Used in KanbanRecord
Note: `props` is only accessible through `this` as we call the compiled template with
`t-call-context` directive.
-->
<t t-foreach="this.props.colors" t-as="color" t-key="color">
<li role="menuitem" t-on-click="() => this.selectColor(color_index)" t-att-title="color" t-att-aria-label="color">
<a href="#" t-attf-class="oe_kanban_color_{{ color_index }}" />
</li>
@@ -397,34 +397,6 @@ QUnit.module("Views", (hooks) => {
assert.strictEqual(target.querySelector("span.o_text_block").textContent, "yop");
});
QUnit.test("dropdown without toggler are correctly rendered", async (assert) => {
serverData.models.partner.records = [serverData.models.partner.records[0]];
await makeView({
type: "kanban",
resModel: "partner",
serverData,
arch: `
<kanban class="o_kanban_test">
<templates><t t-name="kanban-box">
<div>
<div class="dropdown">
<div class="dropdown-menu">
<a class="someItem" />
</div>
</div>
</div>
</t></templates>
</kanban>`,
});
assert.containsOnce(target, ".o-dropdown.dropdown.o_dropdown_kanban");
await click(target, ".o_kanban_record .o-dropdown button.dropdown-toggle");
assert.containsOnce(
target,
".o_kanban_record .o-dropdown .o-dropdown--menu > div > a.someItem"
);
});
QUnit.test("basic grouped rendering", async (assert) => {
assert.expect(14);
@@ -8084,20 +8056,20 @@ QUnit.module("Views", (hooks) => {
type: "kanban",
resModel: "partner",
serverData,
arch:
"<kanban>" +
'<field name="foo"/>' +
'<field name="bar"/>' +
'<field name="category_ids"/>' +
"<templates>" +
'<t t-name="kanban-box">' +
"<div>" +
'<field name="foo"/>' +
"<button type=\"object\" attrs=\"{'invisible':['|', ('bar','=',True), ('category_ids', '!=', [])]}\" class=\"btn btn-primary float-end\" name=\"arbitrary\">Join</button>" +
"</div>" +
"</t>" +
"</templates>" +
"</kanban>",
arch: `
<kanban>
<field name="foo"/>
<field name="bar"/>
<field name="category_ids"/>
<templates>
<t t-name="kanban-box">
<div>
<field name="foo"/>
<button type="object" attrs="{'invisible':['|', ('bar','=',True), ('category_ids', '!=', [])]}" class="btn btn-primary float-end" name="arbitrary">Join</button>
</div>
</t>
</templates>
</kanban>`,
});
assert.containsOnce(
@@ -8114,27 +8086,20 @@ QUnit.module("Views", (hooks) => {
type: "kanban",
resModel: "category",
serverData,
arch:
"<kanban>" +
'<field name="color"/>' +
"<templates>" +
'<t t-name="kanban-box">' +
'<div color="color">' +
'<div class="o_dropdown_kanban dropdown">' +
'<a class="dropdown-toggle o-no-caret btn" data-bs-toggle="dropdown" href="#">' +
'<span class="fa fa-bars fa-lg"/>' +
"</a>" +
'<ul class="dropdown-menu" role="menu">' +
"<li>" +
'<ul class="oe_kanban_colorpicker"/>' +
"</li>" +
"</ul>" +
"</div>" +
'<field name="name"/>' +
"</div>" +
"</t>" +
"</templates>" +
"</kanban>",
arch: `
<kanban>
<field name="color"/>
<templates>
<t t-name="kanban-menu">
<div class="oe_kanban_colorpicker"/>
</t>
<t t-name="kanban-box">
<div color="color">
<field name="name"/>
</div>
</t>
</templates>
</kanban>`,
async mockRPC(route, { method, args }) {
if (method === "write") {
assert.step(`write-color-${args[1].color}`);
@@ -9840,27 +9805,22 @@ QUnit.module("Views", (hooks) => {
type: "kanban",
resModel: "partner",
serverData,
arch:
"<kanban>" +
"<templates>" +
'<t t-name="kanban-box">' +
'<div class="oe_kanban_global_click">' +
'<field name="name"/>' +
'<div class="o_dropdown_kanban dropdown">' +
'<a class="dropdown-toggle o-no-caret btn" data-bs-toggle="dropdown" href="#">' +
'<span class="fa fa-bars fa-lg"/>' +
"</a>" +
'<div class="dropdown-menu" role="menu">' +
'<a type="set_cover" data-field="displayed_image_id" class="dropdown-item">Set Cover Image</a>' +
"</div>" +
"</div>" +
"<div>" +
'<field name="displayed_image_id" widget="attachment_image"/>' +
"</div>" +
"</div>" +
"</t>" +
"</templates>" +
"</kanban>",
arch: `
<kanban>
<templates>
<t t-name="kanban-menu">
<a type="set_cover" data-field="displayed_image_id" class="dropdown-item">Set Cover Image</a>
</t>
<t t-name="kanban-box">
<div class="oe_kanban_global_click">
<field name="name"/>
<div>
<field name="displayed_image_id" widget="attachment_image"/>
</div>
</div>
</t>
</templates>
</kanban>`,
async mockRPC(_route, { model, method, args }) {
if (model === "partner" && method === "write") {
assert.step(String(args[0][0]));
@@ -9912,7 +9872,7 @@ QUnit.module("Views", (hooks) => {
assert.containsOnce(target, 'img[data-src*="/web/image/2"]');
await click(target, ".o_kanban_record:first-child .o_attachment_image");
// await click(target, ".o_kanban_record:first-child .o_attachment_image"); //Not sure, to discuss
assert.verifySteps(["1", "2"], "should writes on both kanban records");
});
@@ -10999,68 +10959,6 @@ QUnit.module("Views", (hooks) => {
assert.containsN(target, ".o_kanban_group:nth-child(2) .o_kanban_record", 3);
});
QUnit.test("classes on dropdown menu do not end on dropdown main div", async (assert) => {
serverData.models.partner.records.splice(1, 3); // keep one record only
await makeView({
type: "kanban",
resModel: "partner",
serverData,
arch: /* xml */ `
<kanban>
<templates>
<t t-name="kanban-box">
<div>
<field name="foo"/>
<div class="dropdown" />
<ul class="o_kanban_card_manage_pane dropdown-menu" role="menu">
<li>Hello</li>
</ul>
</div>
</t>
</templates>
</kanban>
`,
});
const dropdown = target.querySelector(".o_kanban_record .o-dropdown");
assert.isVisible(dropdown);
assert.hasClass(dropdown, "o_dropdown_kanban");
assert.doesNotHaveClass(dropdown, "dropdown-menu");
assert.doesNotHaveClass(dropdown, "o_kanban_card_manage_pane");
await click(dropdown, "button.dropdown-toggle");
assert.containsOnce(dropdown, ".o_kanban_card_manage_pane.dropdown-menu");
});
QUnit.test("classes on toggler do not end on dropdown main div", async (assert) => {
serverData.models.partner.records.splice(1, 3); // keep one record only
await makeView({
type: "kanban",
resModel: "partner",
serverData,
arch: /* xml */ `
<kanban>
<templates>
<t t-name="kanban-box">
<div>
<field name="foo"/>
<a class="o_kanban_manage_toggle_button o_left" href="#">
<i class="fa fa-ellipsis-v" role="img" aria-label="Manage" title="Manage"/>
</a>
</div>
</t>
</templates>
</kanban>
`,
});
const dropdown = target.querySelector(".o_kanban_record .o-dropdown");
assert.isVisible(dropdown);
assert.hasClass(dropdown, "o_dropdown_kanban");
assert.doesNotHaveClass(dropdown, "o_kanban_manage_toggle_button");
assert.doesNotHaveClass(dropdown, "o_left");
assert.containsOnce(dropdown, ".o_kanban_manage_toggle_button.o_left");
});
QUnit.test("dropdown is closed on item click", async (assert) => {
serverData.models.partner.records.splice(1, 3); // keep one record only
await makeView({
@@ -11070,17 +10968,11 @@ QUnit.module("Views", (hooks) => {
arch: /* xml */ `
<kanban>
<templates>
<t t-name="kanban-menu">
<a role="menuitem" class="dropdown-item">Item</a>
</t>
<t t-name="kanban-box">
<div>
<div class="o_dropdown_kanban dropdown">
<a role="button" class="dropdown-toggle o-no-caret btn" data-bs-toggle="dropdown" data-bs-display="static" href="#" aria-label="Dropdown menu" title="Dropdown menu">
<span class="fa fa-ellipsis-v"/>
</a>
<div class="dropdown-menu" role="menu">
<a role="menuitem" class="dropdown-item">Item</a>
</div>
</div>
</div>
<div/>
</t>
</templates>
</kanban>
@@ -11094,111 +10986,6 @@ QUnit.module("Views", (hooks) => {
assert.containsNone(target, ".dropdown-menu");
});
QUnit.test(
"classes on dropdown are on dropdown main div but not the other attributes",
async (assert) => {
serverData.models.partner.records.splice(1, 3); // keep one record only
await makeView({
type: "kanban",
resModel: "partner",
serverData,
arch: /* xml */ `
<kanban>
<templates>
<t t-name="kanban-box">
<div>
<field name="foo"/>
<div class="o_kanban_manage_button_section my_class" placeholder="Bouh"/>
</div>
</t>
</templates>
</kanban>
`,
});
const dropdown = target.querySelector(".o_kanban_record .o-dropdown");
assert.isVisible(dropdown);
assert.strictEqual(
dropdown.className,
"o-dropdown dropdown o_dropdown_kanban o_kanban_manage_button_section my_class o-dropdown--no-caret"
);
assert.notOk(dropdown.hasAttribute("placeholder"));
}
);
QUnit.test("declaring only the menu does not insert a dropdown", async (assert) => {
await makeView({
type: "kanban",
resModel: "partner",
serverData,
arch: /* xml */ `
<kanban>
<templates>
<t t-name="kanban-box">
<div>
<field name="foo"/>
<ul class="o_kanban_card_manage_pane dropdown-menu" role="menu">
<li>Hello</li>
</ul>
</div>
</t>
</templates>
</kanban>
`,
});
assert.containsNone(target, ".o_kanban_record .o-dropdown");
});
QUnit.test("support multiple dropdowns", async (assert) => {
assert.expect(4);
await makeView({
type: "kanban",
resModel: "partner",
serverData,
arch: /* xml */ `
<kanban>
<field name="bar" />
<templates>
<div t-name="kanban-box">
<field name="foo" />
<t t-if="record.bar.raw_value">
<div class="dropdown dropdown-true">
<div class="dropdown-toggle">
<span class="toggler-true">TOGGLER TRUE</span>
</div>
<div class="dropdown-menu">
<span class="menu-true">MENU TRUE</span>
</div>
</div>
</t>
<t t-else="">
<div class="dropdown-toggle">
<span class="toggler-false">TOGGLER FALSE</span>
</div>
<div class="dropdown-menu">
<span class="menu-false">MENU FALSE</span>
</div>
</t>
</div>
</templates>
</kanban>
`,
});
assert.containsN(target, ".o_kanban_renderer .dropdown-true", 3);
assert.containsN(target, ".o_kanban_renderer .dropdown", 4);
await toggleRecordDropdown(2);
assert.strictEqual(getCardTexts()[2], "gnap\nTOGGLER TRUE\nMENU TRUE");
await toggleRecordDropdown(3);
assert.strictEqual(getCardTexts()[3], "blip\nTOGGLER FALSE\nMENU FALSE");
});
QUnit.test("can use JSON in kanban template", async (assert) => {
serverData.models.partner.records = [{ id: 1, foo: '["g", "e", "d"]' }];
await makeView({
@@ -11223,37 +11010,6 @@ QUnit.module("Views", (hooks) => {
assert.strictEqual(target.querySelector(".o_kanban_record").innerText, "ged");
});
QUnit.test("Dropdowns in subtemplates", async (assert) => {
await makeView({
type: "kanban",
resModel: "partner",
serverData,
arch: /* xml */ `
<kanban>
<templates>
<div t-name="kanban-box">
<div class="dropdown-menu">
MENU
</div>
<field name="foo" />
<t t-call="another-template"/>
</div>
<span t-name="another-template">
<div class="dropdown-toggle">
TOGGLER
</div>
</span>
</templates>
</kanban>`,
});
assert.containsN(target, ".o_kanban_record .dropdown", 4);
await toggleRecordDropdown(0);
assert.strictEqual(getCardTexts()[0], "yop\nTOGGLER\nMENU");
});
QUnit.test(
"Color '200' (gray) can be used twice (for false value and another value) in progress bar",
async (assert) => {
@@ -43,20 +43,14 @@
<field name="legend_done"/>
<templates>
<progressbar field="kanban_state" colors='{"done": "success", "blocked": "danger"}'/>
<t t-name="kanban-menu" groups="base.group_user">
<a role="menuitem" t-att-href="record.website_url.value" class="dropdown-item">View Track</a>
<t t-if="widget.editable"><a role="menuitem" type="edit" class="dropdown-item">Edit Track</a></t>
<t t-if="widget.deletable"><a role="menuitem" type="delete" class="dropdown-item">Delete</a></t>
<ul class="oe_kanban_colorpicker" data-field="color"/>
</t>
<t t-name="kanban-box">
<div t-attf-class="{{!selection_mode ? 'oe_kanban_color_' + kanban_getcolor(record.color.raw_value) : ''}} oe_kanban_card oe_kanban_global_click">
<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 role="menuitem" t-att-href="record.website_url.value" class="dropdown-item">View Track</a>
<t t-if="widget.editable"><a role="menuitem" type="edit" class="dropdown-item">Edit Track</a></t>
<t t-if="widget.deletable"><a role="menuitem" type="delete" class="dropdown-item">Delete</a></t>
<ul class="oe_kanban_colorpicker" data-field="color"/>
</div>
</div>
<div class="oe_kanban_content">
<div class="o_kanban_record_top">
<h4 class="o_kanban_record_title"><field name="name"/></h4>
@@ -243,28 +243,23 @@
<field name="enroll"/>
<field name="website_published"/>
<templates>
<t t-name="kanban-menu">
<div role="menuitem" aria-haspopup="true" class="o_no_padding_kanban_colorpicker">
<ul class="oe_kanban_colorpicker" data-field="color" role="popup"/>
</div>
<div class="o_kanban_slides_card_manage_pane">
<t t-if="widget.deletable">
<a role="menuitem" type="delete" class="dropdown-item">Delete</a>
</t>
<a role="menuitem" type="edit" class="dropdown-item">Edit</a>
<a role="menuitem" name="action_channel_invite" class="dropdown-item"
type="object" attrs="{'invisible': [('enroll', '!=', 'invite')]}">
Invite
</a>
</div>
</t>
<t t-name="kanban-box">
<div t-attf-class="oe_kanban_color_#{kanban_getcolor(record.color.raw_value)} oe_kanban_card oe_kanban_global_click">
<div class="o_dropdown_kanban dropdown">
<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" aria-hidden="false"/>
</a>
<div class="o_kanban_card_manage_pane dropdown-menu" role="menu">
<div role="menuitem" aria-haspopup="true" class="o_no_padding_kanban_colorpicker">
<ul class="oe_kanban_colorpicker" data-field="color" role="popup"/>
</div>
<div class="o_kanban_slides_card_manage_pane">
<t t-if="widget.deletable">
<a role="menuitem" type="delete" class="dropdown-item">Delete</a>
</t>
<a role="menuitem" type="edit" class="dropdown-item">Edit</a>
<a role="menuitem" name="action_channel_invite" class="dropdown-item"
type="object" attrs="{'invisible': [('enroll', '!=', 'invite')]}">
Invite
</a>
</div>
</div>
</div>
<div class="o_kanban_card_header">
<div class="o_kanban_card_header_title mb16">
<div class="o_primary">
+6 -11
View File
@@ -174,20 +174,15 @@
<field name="website"/>
<field name="application"/>
<templates>
<t t-name="kanban-menu">
<a type="edit" class="dropdown-item">Module Info</a>
<a t-if="record.website.raw_value" role="menuitem" class="dropdown-item o-hidden-ios" t-att-href="record.website.raw_value" target="_blank">Learn More</a>
<a t-if="installed" name="button_immediate_upgrade" type="object" role="menuitem" class="dropdown-item" groups="base.group_system">Upgrade</a>
<a t-if="installed" name="button_uninstall_wizard" type="object" role="menuitem" class="dropdown-item" groups="base.group_system">Uninstall</a>
</t>
<t t-name="kanban-box">
<div class="oe_module_vignette">
<t t-set="installed" t-value="record.state.raw_value == 'installed'"/>
<div class="o_dropdown_kanban dropdown" tabindex="-1">
<a class="dropdown-toggle o-no-caret btn" data-bs-toggle="dropdown" data-bs-offset="0,-2" href="#" role="button" aria-label="Dropdown menu" title="Dropdown menu">
<span class="fa fa-ellipsis-v"/>
</a>
<div class="dropdown-menu dropdown-menu-end" role="menu" aria-labelledby="dLabel">
<a type="edit" class="dropdown-item">Module Info</a>
<a t-if="record.website.raw_value" role="menuitem" class="dropdown-item o-hidden-ios" t-att-href="record.website.raw_value" target="_blank">Learn More</a>
<a t-if="installed" name="button_immediate_upgrade" type="object" role="menuitem" class="dropdown-item" groups="base.group_system">Upgrade</a>
<a t-if="installed" name="button_uninstall_wizard" type="object" role="menuitem" class="dropdown-item" groups="base.group_system">Uninstall</a>
</div>
</div>
<img t-attf-src="#{record.icon.value}" class="oe_module_icon" alt="Icon"/>
<div class="oe_module_desc" t-att-title="record.shortdesc.value">
<h4 class="o_kanban_record_title">