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