| @ -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> | |||