| @ -0,0 +1,49 @@ | |||||
|  | .. image:: https://img.shields.io/badge/license-LGPL--3-green.svg | ||||
|  |     :target: https://www.gnu.org/licenses/lgpl-3.0-standalone.html | ||||
|  |     :alt: License: LGPL-3 | ||||
|  | 
 | ||||
|  | Advanced Chatter View | ||||
|  | ===================== | ||||
|  | This module is used to view advanced chatter view. | ||||
|  | 
 | ||||
|  | Configuration | ||||
|  | ============= | ||||
|  | * No additional configuration is needed. | ||||
|  | 
 | ||||
|  | Company | ||||
|  | ------- | ||||
|  | * `Cybrosys Techno Solutions <https://cybrosys.com/>`__ | ||||
|  | 
 | ||||
|  | License | ||||
|  | ------- | ||||
|  | Lesser General Public License, Version 3 (LGPL v3). | ||||
|  | (https://www.gnu.org/licenses/lgpl-3.0-standalone.html) | ||||
|  | 
 | ||||
|  | Credits | ||||
|  | ------- | ||||
|  | * Developers: (V16) Afra M P, | ||||
|  |               (V17) Gayathri V, | ||||
|  |               (V18) Aysha Shalin | ||||
|  |   Contact: odoo@cybrosys.com | ||||
|  | 
 | ||||
|  | Contacts | ||||
|  | -------- | ||||
|  | * Mail Contact : odoo@cybrosys.com | ||||
|  | * Website : https://cybrosys.com | ||||
|  | 
 | ||||
|  | Bug Tracker | ||||
|  | ----------- | ||||
|  | Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. | ||||
|  | 
 | ||||
|  | Maintainer | ||||
|  | ========== | ||||
|  | .. image:: https://cybrosys.com/images/logo.png | ||||
|  |    :target: https://cybrosys.com | ||||
|  | 
 | ||||
|  | This module is maintained by Cybrosys Technologies. | ||||
|  | 
 | ||||
|  | For support and more information, please visit `Our Website <https://cybrosys.com/>`__ | ||||
|  | 
 | ||||
|  | Further information | ||||
|  | =================== | ||||
|  | HTML Description: `<static/description/index.html>`__ | ||||
| @ -0,0 +1,21 @@ | |||||
|  | # -*- coding: utf-8 -*- | ||||
|  | ############################################################################## | ||||
|  | # | ||||
|  | #    Cybrosys Technologies Pvt. Ltd. | ||||
|  | # | ||||
|  | #    Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) | ||||
|  | #    Author: Aysha Shalin (odoo@cybrosys.com) | ||||
|  | # | ||||
|  | #    You can modify it under the terms of the GNU LESSER | ||||
|  | #    GENERAL PUBLIC LICENSE (LGPL v3), Version 3. | ||||
|  | # | ||||
|  | #    This program is distributed in the hope that it will be useful, | ||||
|  | #    but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  | #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  | #    GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. | ||||
|  | # | ||||
|  | #    You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE | ||||
|  | #    (LGPL v3) along with this program. | ||||
|  | #    If not, see <http://www.gnu.org/licenses/>. | ||||
|  | # | ||||
|  | ############################################################################## | ||||
| @ -0,0 +1,46 @@ | |||||
|  | # -*- coding: utf-8 -*- | ||||
|  | ############################################################################## | ||||
|  | # | ||||
|  | #    Cybrosys Technologies Pvt. Ltd. | ||||
|  | # | ||||
|  | #    Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) | ||||
|  | #    Author: Aysha Shalin (odoo@cybrosys.com) | ||||
|  | # | ||||
|  | #    You can modify it under the terms of the GNU LESSER | ||||
|  | #    GENERAL PUBLIC LICENSE (LGPL v3), Version 3. | ||||
|  | # | ||||
|  | #    This program is distributed in the hope that it will be useful, | ||||
|  | #    but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  | #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  | #    GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. | ||||
|  | # | ||||
|  | #    You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE | ||||
|  | #    (LGPL v3) along with this program. | ||||
|  | #    If not, see <http://www.gnu.org/licenses/>. | ||||
|  | # | ||||
|  | ############################################################################## | ||||
|  | { | ||||
|  |     'name': 'Advanced Chatter View', | ||||
|  |     'version': '18.0.1.0.0', | ||||
|  |     'category': 'Discuss', | ||||
|  |     'summary': """Advanced odoo chatter view.""", | ||||
|  |     'description': """This module is used to view advanced chatter view.""", | ||||
|  |     'author': 'Cybrosys Techno Solutions', | ||||
|  |     'company': 'Cybrosys Techno Solutions', | ||||
|  |     'maintainer': 'Cybrosys Techno Solutions', | ||||
|  |     'website': "https://www.cybrosys.com", | ||||
|  |     'depends': ['base', 'mail'], | ||||
|  |     'assets': { | ||||
|  |         'web.assets_backend': [ | ||||
|  |             "https://cdn.jsdelivr.net/npm/bootstrap-icons@1.10.3/font/bootstrap-icons.css", | ||||
|  |             'advanced_chatter_view/static/src/css/chatter_topbar.css', | ||||
|  |             'advanced_chatter_view/static/src/js/chatter_container.js', | ||||
|  |             'advanced_chatter_view/static/src/xml/chatter.xml', | ||||
|  |         ], | ||||
|  |     }, | ||||
|  |     'images': ['static/description/banner.png'], | ||||
|  |     'license': 'LGPL-3', | ||||
|  |     'installable': True, | ||||
|  |     'auto_install': False, | ||||
|  |     'application': False, | ||||
|  | } | ||||
| @ -0,0 +1,6 @@ | |||||
|  | ## Module <advanced_chatter_view> | ||||
|  | 
 | ||||
|  | #### 18.11.2024 | ||||
|  | #### Version 18.0.1.0.0 | ||||
|  | ##### ADD | ||||
|  | - Initial commit for Advanced Chatter View | ||||
| After Width: | Height: | Size: 2.2 KiB | 
| After Width: | Height: | Size: 28 KiB | 
| After Width: | Height: | Size: 628 KiB | 
| After Width: | Height: | Size: 1.1 KiB | 
| After Width: | Height: | Size: 210 KiB | 
| After Width: | Height: | Size: 209 KiB | 
| After Width: | Height: | Size: 109 KiB | 
| After Width: | Height: | Size: 495 B | 
| After Width: | Height: | Size: 1.0 KiB | 
| After Width: | Height: | Size: 624 B | 
| After Width: | Height: | Size: 136 KiB | 
| After Width: | Height: | Size: 214 KiB | 
| After Width: | Height: | Size: 36 KiB | 
| After Width: | Height: | Size: 3.6 KiB | 
| After Width: | Height: | Size: 310 B | 
| After Width: | Height: | Size: 929 B | 
| After Width: | Height: | Size: 1.3 KiB | 
| After Width: | Height: | Size: 3.3 KiB | 
| After Width: | Height: | Size: 1.4 KiB | 
| After Width: | Height: | Size: 17 KiB | 
| After Width: | Height: | Size: 542 B | 
| After Width: | Height: | Size: 576 B | 
| After Width: | Height: | Size: 733 B | 
| After Width: | Height: | Size: 4.3 KiB | 
| After Width: | Height: | Size: 1.2 KiB | 
| After Width: | Height: | Size: 4.0 KiB | 
| After Width: | Height: | Size: 1.7 KiB | 
| After Width: | Height: | Size: 738 KiB | 
| After Width: | Height: | Size: 2.2 KiB | 
| After Width: | Height: | Size: 911 B | 
| After Width: | Height: | Size: 1.1 KiB | 
| After Width: | Height: | Size: 1.2 KiB | 
| After Width: | Height: | Size: 1.2 KiB | 
| After Width: | Height: | Size: 600 B | 
| After Width: | Height: | Size: 673 B | 
| After Width: | Height: | Size: 2.0 KiB | 
| After Width: | Height: | Size: 462 B | 
| After Width: | Height: | Size: 2.1 KiB | 
| After Width: | Height: | Size: 926 B | 
| After Width: | Height: | Size: 9.0 KiB | 
| After Width: | Height: | Size: 23 KiB | 
| After Width: | Height: | Size: 7.0 KiB | 
| After Width: | Height: | Size: 878 B | 
| After Width: | Height: | Size: 1.2 KiB | 
| After Width: | Height: | Size: 653 B | 
| After Width: | Height: | Size: 800 B | 
| After Width: | Height: | Size: 905 B | 
| After Width: | Height: | Size: 189 KiB | 
| After Width: | Height: | Size: 4.3 KiB | 
| After Width: | Height: | Size: 839 B | 
| After Width: | Height: | Size: 1.7 KiB | 
| After Width: | Height: | Size: 5.9 KiB | 
| After Width: | Height: | Size: 1.6 KiB | 
| After Width: | Height: | Size: 34 KiB | 
| After Width: | Height: | Size: 26 KiB | 
| After Width: | Height: | Size: 3.8 KiB | 
| After Width: | Height: | Size: 23 KiB | 
| After Width: | Height: | Size: 1.9 KiB | 
| After Width: | Height: | Size: 2.3 KiB | 
| After Width: | Height: | Size: 427 B | 
| After Width: | Height: | Size: 627 B | 
| After Width: | Height: | Size: 1.1 KiB | 
| After Width: | Height: | Size: 1.2 KiB | 
| After Width: | Height: | Size: 988 B | 
| After Width: | Height: | Size: 3.7 KiB | 
| After Width: | Height: | Size: 5.0 KiB | 
| After Width: | Height: | Size: 875 B | 
| After Width: | Height: | Size: 1.2 KiB | 
| After Width: | Height: | Size: 92 KiB | 
| After Width: | Height: | Size: 85 KiB | 
| After Width: | Height: | Size: 90 KiB | 
| After Width: | Height: | Size: 86 KiB | 
| After Width: | Height: | Size: 139 KiB | 
| After Width: | Height: | Size: 86 KiB | 
| After Width: | Height: | Size: 99 KiB | 
| After Width: | Height: | Size: 105 KiB | 
| After Width: | Height: | Size: 105 KiB | 
| After Width: | Height: | Size: 105 KiB | 
| After Width: | Height: | Size: 149 KiB | 
| After Width: | Height: | Size: 880 KiB | 
| After Width: | Height: | Size: 89 KiB | 
| After Width: | Height: | Size: 9.1 KiB | 
| @ -0,0 +1,99 @@ | |||||
|  | .icon { | ||||
|  |     background-color: #F8F8F8; | ||||
|  |     border-radius: 50%; | ||||
|  |     width: 55px; | ||||
|  |     height: 55px; | ||||
|  |     font-size: 22px; | ||||
|  |     border-color: #F8F8F8; | ||||
|  | } | ||||
|  | 
 | ||||
|  | .o-mail-Form-chatter { | ||||
|  |     width: 80px !important; | ||||
|  |     height: calc(100vh - 35px); | ||||
|  |     background-color: white; | ||||
|  |     right: 0; | ||||
|  |     align-items: flex-start; | ||||
|  |     justify-content: center; | ||||
|  |     position: absolute; | ||||
|  | } | ||||
|  | 
 | ||||
|  | @media screen and (max-width: 767.98px) { | ||||
|  |     .o-mail-Form-chatter { | ||||
|  |         width: 100% !important; | ||||
|  |         height: unset; | ||||
|  |         position: relative; | ||||
|  |         top: unset; | ||||
|  |         right: unset; | ||||
|  |     } | ||||
|  | } | ||||
|  | 
 | ||||
|  | .chatter-remove-position { | ||||
|  |     position: relative !important; | ||||
|  | } | ||||
|  | 
 | ||||
|  | .o_form_sheet_bg { | ||||
|  |     width: calc(100vw - 80px); | ||||
|  | } | ||||
|  | 
 | ||||
|  | .o_ChatterContainer { | ||||
|  |     display: grid; | ||||
|  |     justify-content: center; | ||||
|  |     padding-bottom: 80px; | ||||
|  |     margin-bottom: -81px; | ||||
|  |     margin-top: 70px; | ||||
|  | } | ||||
|  | 
 | ||||
|  | .hide { | ||||
|  |     display: none; | ||||
|  | } | ||||
|  | 
 | ||||
|  | .icon:hover + .hide { | ||||
|  |     display: block; | ||||
|  | } | ||||
|  | 
 | ||||
|  | .o_form_editable { | ||||
|  |     flex-direction: row !important; | ||||
|  | } | ||||
|  | 
 | ||||
|  | @media (max-width: 768px) { | ||||
|  |     .o_form_editable { | ||||
|  |         flex-direction: column !important; | ||||
|  |     } | ||||
|  | 
 | ||||
|  |     .o-mail-Form-chatter:not(.o-aside):not(.o-full-width) .o_ChatterContainer { | ||||
|  |         display: flex; | ||||
|  |         margin-top: 22px; | ||||
|  |         padding-bottom: initial; | ||||
|  |     } | ||||
|  | 
 | ||||
|  |     .icon { | ||||
|  |         margin-left: 48px; | ||||
|  |         width: 457px; | ||||
|  |     } | ||||
|  | 
 | ||||
|  |     .hide { | ||||
|  |         margin-top: 62px; | ||||
|  |         margin-left: -53px; | ||||
|  |     } | ||||
|  | 
 | ||||
|  |     .chatter-remove-position .o_ChatterContainer { | ||||
|  |         display: unset !important; | ||||
|  |     } | ||||
|  | } | ||||
|  | 
 | ||||
|  | .o_form_statusbar { | ||||
|  |     width: calc(100vw - 120px); | ||||
|  | } | ||||
|  | 
 | ||||
|  | .o_form_view .o_form_sheet_bg { | ||||
|  |     max-width: unset !important; | ||||
|  | } | ||||
|  | 
 | ||||
|  | .o_form_sheet { | ||||
|  |     margin: 1rem auto !important; | ||||
|  |     max-width: 1543px; | ||||
|  | } | ||||
|  | 
 | ||||
|  | .o_form_view .o_form_renderer { | ||||
|  |     position: relative; | ||||
|  | } | ||||
| @ -0,0 +1,57 @@ | |||||
|  | /** @odoo-module **/ | ||||
|  | import { Chatter } from "@mail/chatter/web_portal/chatter"; | ||||
|  | import { patch } from "@web/core/utils/patch"; | ||||
|  | import { useRef } from "@odoo/owl"; | ||||
|  | // Patch the class ChatterContainer to added the click function
 | ||||
|  | patch(Chatter.prototype ,{ | ||||
|  |     setup(...args) { | ||||
|  |         super.setup(...args); | ||||
|  |         this.root = useRef("main_root") | ||||
|  |     }, | ||||
|  |     // Click function of SendMessage button
 | ||||
|  |     _onClickSendMessage(ev) { | ||||
|  |         this.root.el.querySelector('#chatter_message').classList.remove("d-none"); | ||||
|  |         this.root.el.offsetParent.classList.add('chatter-remove-position') | ||||
|  |         this.root.el.querySelector('.cross').classList.remove("d-none"); | ||||
|  |         this.root.el.querySelector('.o-mail-Chatter-content').classList.remove("d-none"); | ||||
|  |         this.root.el.querySelector('.o_ChatterTopbar_rightSection').classList.remove("d-none"); | ||||
|  |         this.root.el.querySelector('#send_message').classList.add("d-none"); | ||||
|  |         this.root.el.querySelector('#log_note').classList.add("d-none"); | ||||
|  |         this.root.el.querySelector('#active').classList.add("d-none"); | ||||
|  |     }, | ||||
|  |     // Click function for LogNote button
 | ||||
|  |     _onClickLogNote(ev) { | ||||
|  |         this.root.el.querySelector('#chatter_note').classList.remove("d-none"); | ||||
|  |         this.root.el.offsetParent.classList.add('chatter-remove-position') | ||||
|  |         this.root.el.querySelector('.cross').classList.remove("d-none"); | ||||
|  |         this.root.el.querySelector('.o_ChatterTopbar_rightSection').classList.remove("d-none"); | ||||
|  |         this.root.el.querySelector('.o-mail-Chatter-content').classList.remove("d-none"); | ||||
|  |         this.root.el.querySelector('#send_message').classList.add("d-none"); | ||||
|  |         this.root.el.querySelector('#log_note').classList.add("d-none"); | ||||
|  |         this.root.el.querySelector('#active').classList.add("d-none"); | ||||
|  |     }, | ||||
|  |     // Click function for Active button
 | ||||
|  |     _onClickActive(ev) { | ||||
|  |         this.root.el.querySelector('#chatter_activity').classList.remove("d-none"); | ||||
|  |         this.root.el.offsetParent.classList.add('chatter-remove-position') | ||||
|  |         this.root.el.querySelector('.cross').classList.remove("d-none"); | ||||
|  |         this.root.el.querySelector('.o_ChatterTopbar_rightSection').classList.remove("d-none"); | ||||
|  |         this.root.el.querySelector('.o-mail-Chatter-content').classList.remove("d-none"); | ||||
|  |         this.root.el.querySelector('#send_message').classList.add("d-none"); | ||||
|  |         this.root.el.querySelector('#log_note').classList.add("d-none"); | ||||
|  |         this.root.el.querySelector('#active').classList.add("d-none"); | ||||
|  |     }, | ||||
|  |     // Click function to close chatter
 | ||||
|  |     _onClickCross(ev) { | ||||
|  |         this.root.el.offsetParent.classList.remove('chatter-remove-position') | ||||
|  |         this.root.el.querySelector('#chatter_activity').classList.add("d-none"); | ||||
|  |         this.root.el.querySelector('#chatter_note').classList.add("d-none"); | ||||
|  |         this.root.el.querySelector('#chatter_message').classList.add("d-none"); | ||||
|  |         this.root.el.querySelector('.o_ChatterTopbar_rightSection').classList.add("d-none"); | ||||
|  |         this.root.el.querySelector('.o-mail-Chatter-content').classList.add("d-none"); | ||||
|  |         this.root.el.querySelector('.cross').classList.add("d-none"); | ||||
|  |         this.root.el.querySelector('#send_message').classList.remove("d-none"); | ||||
|  |         this.root.el.querySelector('#log_note').classList.remove("d-none"); | ||||
|  |         this.root.el.querySelector('#active').classList.remove("d-none"); | ||||
|  |     }, | ||||
|  | }); | ||||
| @ -0,0 +1,246 @@ | |||||
|  | <?xml version="1.0" encoding="UTF-8"?> | ||||
|  | <!-- Overwrite the templates "mail.Chatter" to rearrange the view and added features --> | ||||
|  | <templates id="template" xml:space="preserve"> | ||||
|  |     <t name="mail.ChatterAdvanced" t-inherit="mail.Chatter" | ||||
|  |        t-inherit-mode="extension" owl="1"> | ||||
|  |         <xpath expr="//div[hasclass('o-mail-Chatter')]" position="replace"> | ||||
|  |             <div t-if="state.thread" | ||||
|  |                  class="position-relative flex-grow-1 flex-column d-flex w-100 bg-view" | ||||
|  |                  t-attf-class="{{ className }}" t-ref="main_root"> | ||||
|  |                  <div class="o_ChatterContainer" | ||||
|  |                       t-att-class="{ 'o-isInFormSheetBg mx-auto': props.isInFormSheetBg }" | ||||
|  |                       t-attf-class="{{ props.className }}" | ||||
|  |                       data-command-category="mail" t-ref="root"> | ||||
|  |                       <button class="cross fa fa-times d-none" | ||||
|  |                               style="width: 30px; margin-left: auto; height: 30px;" | ||||
|  |                               t-on-click="_onClickCross"/> | ||||
|  |                      <t t-if="state and state.thread"> | ||||
|  |                           <!-- button to view send message chatter --> | ||||
|  |                          <button class="icon bi bi-chat-left-text" | ||||
|  |                                  id="send_message" | ||||
|  |                                  type="button" style="color: #FA035A;" | ||||
|  |                                  t-on-click="_onClickSendMessage"/> | ||||
|  |                          <div class="hide" | ||||
|  |                               style="color: #FA035A;">Message</div> | ||||
|  |                          <!-- button to view log note chatter --> | ||||
|  |                          <button class="icon bi bi-journal-text" | ||||
|  |                                  id="log_note" | ||||
|  |                                  type="button" style="color: #24A72F;" | ||||
|  |                                  t-on-click="_onClickLogNote"/> | ||||
|  |                          <div class="hide" style="color: #24A72F;">Log Note</div> | ||||
|  |                          <!-- button to view activity box --> | ||||
|  |                          <button class="icon bi bi-clock-history" | ||||
|  |                                  id="active" | ||||
|  |                                  type="button" style="color: #0349F6;" | ||||
|  |                                  t-on-click="_onClickActive"/> | ||||
|  |                          <div class="hide" | ||||
|  |                               style="color: #0349F6;">Activities</div> | ||||
|  |                       </t> | ||||
|  |                      <t t-else=""> | ||||
|  |                           <div class="o_ChatterContainer_noChatter flex-grow-1 align-items-center justify-content-center d-flex"><i class="o_ChatterContainer_noChatterIcon fa fa-circle-o-notch fa-spin me-2"/> | ||||
|  |                               Please wait... | ||||
|  |                           </div> | ||||
|  |                       </t> | ||||
|  |                      <div class="o-mail-Chatter-top position-sticky top-0" | ||||
|  |                           t-att-class="{ 'shadow-sm': state.isTopStickyPinned }" | ||||
|  |                           t-ref="top"> | ||||
|  |                          <div class="o-mail-Chatter-topbar d-flex flex-shrink-0 flex-grow-0 overflow-x-auto" | ||||
|  |                               t-ref="chatter_message"> | ||||
|  |                              <button | ||||
|  |                                      id="chatter_message" | ||||
|  |                                      style="color: white; background-color: #FA035A; border-radius: 20px;" | ||||
|  |                                      class="o-mail-Chatter-sendMessage btn text-nowrap me-1 bi bi-chat-left-text d-none" | ||||
|  |                                      t-att-class="{'btn-primary': state.composerType !== 'note','btn-secondary': state.composerType === 'note','active': state.composerType === 'message','my-2': !props.compactHeight}" | ||||
|  |                                      t-att-disabled="!state.thread.hasWriteAccess and !(state.thread.hasReadAccess and state.thread.canPostOnReadonly) and props.threadId" | ||||
|  |                                      data-hotkey="m" | ||||
|  |                                      t-on-click="() => this.toggleComposer('message')"> | ||||
|  |                                   Send message | ||||
|  |                              </button> | ||||
|  |                              <button | ||||
|  |                                      id="chatter_note" | ||||
|  |                                      t-ref="chatter_note" | ||||
|  |                                      class="o-mail-Chatter-logNote btn text-nowrap me-2 bi bi-journal-text d-none" | ||||
|  |                                      style="background-color: #24A72F; border-radius: 20px; color: white;" | ||||
|  |                                      t-att-class="{ | ||||
|  |                                   'btn-primary active': state.composerType === 'note', | ||||
|  |                                   'btn-secondary': state.composerType !== 'note', | ||||
|  |                                   'my-2': !props.compactHeight | ||||
|  |                               }" data-hotkey="shift+m" | ||||
|  |                                      t-on-click="() => this.toggleComposer('note')"> | ||||
|  |                                   Log note | ||||
|  |                               </button> | ||||
|  |                              <div class="flex-grow-1 d-flex"> | ||||
|  |                                   <button t-if="props.has_activities" | ||||
|  |                                           class="o-mail-Chatter-activity btn btn-secondary text-nowrap d-none" | ||||
|  |                                           id="chatter_activity" | ||||
|  |                                           type="button" | ||||
|  |                                           t-ref="chatter_activity" | ||||
|  |                                           t-att-class="{ 'my-2': !props.compactHeight }" | ||||
|  |                                           data-hotkey="shift+a" | ||||
|  |                                           t-on-click="scheduleActivity" | ||||
|  |                                           style="background-color: #0349F6; border-radius: 20px; color: white;"> | ||||
|  |                                       <i class="fa fa-clock-o me-1"/> | ||||
|  |                                       <span>Activities</span> | ||||
|  |                                   </button> | ||||
|  |                                  <div class="o_ChatterTopbar_rightSection flex-grow-1 flex-shrink-0 justify-content-end d-flex d-none"> | ||||
|  |                                       <span class="o-mail-Chatter-topbarGrow flex-grow-1 pe-2"/> | ||||
|  |                                      <button class="btn btn-link text-action" | ||||
|  |                                              t-att-class="{ 'o-active': state.isSearchOpen }" | ||||
|  |                                              aria-label="Search Messages" | ||||
|  |                                              title="Search Messages" | ||||
|  |                                              t-on-click="onClickSearch"> | ||||
|  |                                           <i class="oi oi-search" | ||||
|  |                                              role="img"/> | ||||
|  |                                       </button> | ||||
|  |                                      <FileUploader | ||||
|  |                                              t-if="attachments.length === 0" | ||||
|  |                                              fileUploadClass="'o-mail-Chatter-fileUploader'" | ||||
|  |                                              multiUpload="true" | ||||
|  |                                              onUploaded.bind="onUploaded" | ||||
|  |                                              onClick="(ev) => this.onClickAttachFile(ev)"> | ||||
|  |                                           <t t-set-slot="toggler"> | ||||
|  |                                               <t t-call="mail.Chatter.attachFiles"/> | ||||
|  |                                           </t> | ||||
|  |                                       </FileUploader> | ||||
|  |                                      <t t-else="" t-call="mail.Chatter.attachFiles"/> | ||||
|  |                                      <div class="o-mail-Followers d-flex me-1"> | ||||
|  |                                          <Dropdown position="'bottom-end'" menuClass="'o-mail-Followers-dropdown d-flex flex-column'" state="followerListDropdown"> | ||||
|  |                                              <button t-att-class="'o-mail-Followers-button btn btn-link d-flex align-items-center text-action px-1 ' + (props.compactHeight ? '' : 'my-2')" t-att-disabled="isDisabled" t-att-title="followerButtonLabel"> | ||||
|  |                                                  <i class="fa fa-user-o" role="img"/> | ||||
|  |                                                  <i t-if="state.thread.id and state.thread.followersCount === undefined" class="fa fa-circle-o-notch fa-spin"/> | ||||
|  |                                                  <sup t-else="" class="o-mail-Followers-counter" t-esc="state.thread.followersCount ?? 0"/> | ||||
|  |                                              </button> | ||||
|  |                                              <t t-set-slot="content"> | ||||
|  |                                                  <FollowerList onAddFollowers.bind="onAddFollowers" onFollowerChanged.bind="onFollowerChanged" thread="state.thread" dropdown="followerListDropdown"/> | ||||
|  |                                              </t> | ||||
|  |                                          </Dropdown> | ||||
|  |                                      </div> | ||||
|  |                                      <button t-if="state.thread.selfFollower" | ||||
|  |                                              class="btn px-0" | ||||
|  |                                              t-att-class="{ 'text-success': !unfollowHover.isHover, 'text-warning': unfollowHover.isHover, 'my-2': !props.compactHeight }" | ||||
|  |                                              t-att-disabled="!props.threadId" | ||||
|  |                                              t-on-click="onClickUnfollow" | ||||
|  |                                              t-ref="unfollow"> | ||||
|  |                                           <div class="position-relative"> | ||||
|  |                                               <!-- Hidden element used to set the button maximum size --> | ||||
|  |                                               <span class="d-flex invisible text-nowrap"> | ||||
|  |                                                   <i class="me-1 fa fa-fw fa-eye-slash"/> | ||||
|  |                                                   <t t-out="followingText.length > unfollowText.length ? followingText : unfollowText"/> | ||||
|  |                                               </span> | ||||
|  |                                               <span class="position-absolute end-0 top-0" | ||||
|  |                                                     t-att-class="{ 'text-warning': unfollowHover.isHover }"> | ||||
|  |                                                   <i class="me-1" | ||||
|  |                                                      t-att-class="{ 'fa fa-fw fa-times': unfollowHover.isHover, 'fa fa-fw fa-check': !unfollowHover.isHover }"/> | ||||
|  |                                                   <span t-out="unfollowHover.isHover ? unfollowText : followingText"/> | ||||
|  |                                               </span> | ||||
|  |                                           </div> | ||||
|  |                                      </button> | ||||
|  |                                      <button t-if="!state.thread.selfFollower" | ||||
|  |                                              class="o-mail-Chatter-follow btn btn-link  px-0 text-600" | ||||
|  |                                              t-on-click="onClickFollow"> | ||||
|  |                                           <div class="position-relative"> | ||||
|  |                                               <span class="d-flex invisible text-nowrap"> | ||||
|  |                                                   <i class="me-1 fa fa-fw fa-eye-slash"/> | ||||
|  |                                                   <t t-out="followingText.length > unfollowText.length ? followingText : unfollowText"/> | ||||
|  |                                               </span> | ||||
|  |                                               <span class="position-absolute end-0 top-0"> | ||||
|  |                                                   Follow | ||||
|  |                                               </span> | ||||
|  |                                           </div> | ||||
|  |                                       </button> | ||||
|  |                                   </div> | ||||
|  |                               </div> | ||||
|  |                              <button t-if="props.close" | ||||
|  |                                      class="o-mail-Chatter-close btn btn-secondary flex-shrink-0 ms-2" | ||||
|  |                                      aria-label="Close" | ||||
|  |                                      t-on-click="props.close"> | ||||
|  |                                   <i class="oi oi-large oi-close"/> | ||||
|  |                               </button> | ||||
|  |                          </div> | ||||
|  |                          <t t-if="state.composerType"> | ||||
|  |                               <t t-if="state.composerType === 'message' and state.thread.recipients.length > 0"> | ||||
|  |                                   <div class="flex-shrink-0 px-3 pt-3 text-truncate small mb-2" | ||||
|  |                                        style="margin-left:48px"> | ||||
|  |                                       <span class="fw-bold">To:</span> | ||||
|  |                                       <t t-out="toRecipientsText"/> | ||||
|  |                                       <button class="o-mail-Chatter-recipientListButton btn btn-link badge rounded-pill border-0 p-1 ms-1" | ||||
|  |                                               title="Show all recipients" | ||||
|  |                                               t-on-click="onClickRecipientList"> | ||||
|  |                                           <i class="fa fa-caret-down"/> | ||||
|  |                                       </button> | ||||
|  |                                   </div> | ||||
|  |                               </t> | ||||
|  |                              <t t-set="type" | ||||
|  |                                 t-value="state.composerType === 'message' ? 'message' : 'note'"/> | ||||
|  |                              <SuggestedRecipientsList | ||||
|  |                                      t-if="state.composerType !== 'note'" | ||||
|  |                                      className="'px-3'" | ||||
|  |                                      styleString="'margin-left:48px;'" | ||||
|  |                                      thread="state.thread"/> | ||||
|  |                              <Composer composer="state.thread.composer" | ||||
|  |                                        autofocus="true" | ||||
|  |                                        className="state.composerType === 'message' ? '' : 'pt-4'" | ||||
|  |                                        mode="'extended'" | ||||
|  |                                        onPostCallback.bind="onPostCallback" | ||||
|  |                                        dropzoneRef="rootRef" | ||||
|  |                                        type="state.composerType" | ||||
|  |                                        t-key="props.threadId"/> | ||||
|  |                          </t> | ||||
|  |                      </div> | ||||
|  |                      <div class="o-mail-Chatter-content d-none"> | ||||
|  |                           <div t-if="state.isSearchOpen" | ||||
|  |                                class="o-mail-Chatter-search"> | ||||
|  |                               <SearchMessagesPanel | ||||
|  |                                       closeSearch.bind="closeSearch" | ||||
|  |                                       thread="state.thread" | ||||
|  |                                       onClickJump.bind="closeSearch" | ||||
|  |                               /> | ||||
|  |                           </div> | ||||
|  |                          <t t-else=""> | ||||
|  |                               <t t-if="props.has_activities and activities.length and !state.isSearchOpen"> | ||||
|  |                                   <t t-call="mail.ActivityList"/> | ||||
|  |                               </t> | ||||
|  |                              <div t-if="state.isAttachmentBoxOpened" | ||||
|  |                                   class="o-mail-AttachmentBox position-relative" | ||||
|  |                                   t-ref="attachment-box"> | ||||
|  |                                  <div class="d-flex align-items-center"> | ||||
|  |                                       <hr class="flex-grow-1"/> | ||||
|  |                                      <span class="p-3 fw-bold"> | ||||
|  |                                           Files | ||||
|  |                                       </span> | ||||
|  |                                      <hr class="flex-grow-1"/> | ||||
|  |                                   </div> | ||||
|  |                                  <div class="d-flex flex-column"> | ||||
|  |                                       <AttachmentList | ||||
|  |                                               attachments="attachments" | ||||
|  |                                               unlinkAttachment.bind="unlinkAttachment" | ||||
|  |                                               imagesHeight="100" | ||||
|  |                                       /> | ||||
|  |                                      <FileUploader multiUpload="true" | ||||
|  |                                                    fileUploadClass="'o-mail-Chatter-fileUploader'" | ||||
|  |                                                    onUploaded.bind="onUploaded" | ||||
|  |                                                    onClick="(ev) => this.onClickAttachFile(ev)"> | ||||
|  |                                           <t t-set-slot="toggler"> | ||||
|  |                                               <button class="btn btn-link" | ||||
|  |                                                       type="button" | ||||
|  |                                                       t-att-disabled="!state.thread.hasWriteAccess"> | ||||
|  |                                                   <i class="fa fa-plus-square"/> | ||||
|  |                                                   Attach files | ||||
|  |                                               </button> | ||||
|  |                                           </t> | ||||
|  |                                       </FileUploader> | ||||
|  |                                  </div> | ||||
|  |                              </div> | ||||
|  |                              <Thread t-if="!state.isSearchOpen" | ||||
|  |                                      thread="state.thread" | ||||
|  |                                      t-key="state.thread.localId" | ||||
|  |                                      order="'desc'" | ||||
|  |                                      scrollRef="rootRef" | ||||
|  |                                      jumpPresent="state.jumpThreadPresent"/> | ||||
|  |                          </t> | ||||
|  |                      </div> | ||||
|  |                  </div> | ||||
|  |             </div> | ||||
|  |         </xpath> | ||||
|  |     </t> | ||||
|  | </templates> | ||||