[IMP] mail, *: simplify discuss template (no templateGetter)
This commit simplifies discuss template by putting record accessors in the context of template. *: calendar, hr_holidays, im_livechat, sms, snailmail, website_livechat Task-3055022 Part-of: odoo/odoo#105099
This commit is contained in:
@@ -3,11 +3,11 @@
|
||||
|
||||
<t t-inherit="mail.ActivityView" t-inherit-mode="extension">
|
||||
<xpath expr="//button[hasclass('o_ActivityView_editButton')]" position="attributes">
|
||||
<attribute name="t-if">!activityView.activity.calendar_event_id</attribute>
|
||||
<attribute name="t-if">!activity.calendar_event_id</attribute>
|
||||
</xpath>
|
||||
<xpath expr="//button[hasclass('o_ActivityView_editButton')]" position="after">
|
||||
<t t-if="activityView.activity.calendar_event_id">
|
||||
<button class="o_ActivityView_toolButton o_ActivityView_editButton btn btn-link pt-0" t-on-click="activityView.onClickEdit">
|
||||
<t t-if="activity.calendar_event_id">
|
||||
<button class="o_ActivityView_toolButton o_ActivityView_editButton btn btn-link pt-0" t-on-click="onClickEdit">
|
||||
<i class="fa fa-calendar"/> Reschedule
|
||||
</button>
|
||||
</t>
|
||||
|
||||
+3
-3
@@ -2,13 +2,13 @@
|
||||
<templates xml:space="preserve">
|
||||
<t t-inherit="mail.PersonaImStatusIconView" t-inherit-mode="extension">
|
||||
<xpath expr="//*[@name='root']" position="inside">
|
||||
<t t-if="personaImStatusIconView.persona.im_status === 'leave_online'">
|
||||
<t t-if="persona.im_status === 'leave_online'">
|
||||
<i class="o_PersonaImStatusIconView_icon o-online fa fa-plane fa-stack-1x" title="Online" role="img" aria-label="User is online"/>
|
||||
</t>
|
||||
<t t-if="personaImStatusIconView.persona.im_status === 'leave_away'">
|
||||
<t t-if="persona.im_status === 'leave_away'">
|
||||
<i class="o_PersonaImStatusIconView_icon o-away fa fa-plane fa-stack-1x text-warning" title="Away" role="img" aria-label="User is away"/>
|
||||
</t>
|
||||
<t t-if="personaImStatusIconView.persona.im_status === 'leave_offline'">
|
||||
<t t-if="persona.im_status === 'leave_offline'">
|
||||
<i class="o_PersonaImStatusIconView_icon o-offline fa fa-plane fa-stack-1x text-700" title="Out of office" role="img" aria-label="User is out of office"/>
|
||||
</t>
|
||||
</xpath>
|
||||
|
||||
@@ -2,13 +2,13 @@
|
||||
<templates xml:space="preserve">
|
||||
<t t-inherit="mail.ThreadIconView" t-inherit-mode="extension">
|
||||
<xpath expr="//*[@name='noImStatusCondition']" position="before">
|
||||
<t t-elif="threadIconView.thread.channel.correspondent.im_status === 'leave_online'">
|
||||
<t t-elif="thread.channel.correspondent.im_status === 'leave_online'">
|
||||
<div class="o_ThreadIconView_online fa fa-fw fa-plane" title="Online"/>
|
||||
</t>
|
||||
<t t-elif="threadIconView.thread.channel.correspondent.im_status === 'leave_away'">
|
||||
<t t-elif="thread.channel.correspondent.im_status === 'leave_away'">
|
||||
<div class="o_ThreadIconView_away fa fa-fw fa-plane text-warning" title="Away"/>
|
||||
</t>
|
||||
<t t-elif="threadIconView.thread.channel.correspondent.im_status === 'leave_offline'">
|
||||
<t t-elif="thread.channel.correspondent.im_status === 'leave_offline'">
|
||||
<div class="o_ThreadIconView_offline fa fa-fw fa-plane" title="Out of office"/>
|
||||
</t>
|
||||
</xpath>
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
<templates xml:space="preserve">
|
||||
<t t-inherit="mail.ThreadView" t-inherit-mode="extension">
|
||||
<xpath expr="//*[@name='loadingCondition']" position="before">
|
||||
<t t-if="threadView.thread.channel and threadView.thread.channel.correspondent and threadView.thread.channel.correspondent.outOfOfficeText">
|
||||
<div class="o_ThreadView_outOfOffice alert alert-primary" t-esc="threadView.thread.channel.correspondent.outOfOfficeText" role="alert"/>
|
||||
<t t-if="thread.channel and thread.channel.correspondent and thread.channel.correspondent.outOfOfficeText">
|
||||
<div class="o_ThreadView_outOfOffice alert alert-primary" t-esc="thread.channel.correspondent.outOfOfficeText" role="alert"/>
|
||||
</t>
|
||||
</xpath>
|
||||
</t>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
<t t-inherit="mail.ComposerView" t-inherit-mode="extension">
|
||||
<xpath expr="//*[hasclass('o_ComposerView_buttonAttachment')]" position="replace">
|
||||
<t t-if="!composerView.composer.activeThread or !composerView.composer.activeThread.channel or composerView.composer.activeThread.channel.channel_type !== 'livechat'">$0</t>
|
||||
<t t-if="!composer.activeThread or !composer.activeThread.channel or composer.activeThread.channel.channel_type !== 'livechat'">$0</t>
|
||||
</xpath>
|
||||
</t>
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
<templates xml:space="preserve">
|
||||
<t t-inherit="mail.DiscussSidebarView" t-inherit-mode="extension">
|
||||
<xpath expr="//*[@name='beforeCategoryChat']" position="before">
|
||||
<t t-set="categoryLivechat" t-value="discussSidebarView.owner.discuss.categoryLivechat"/>
|
||||
<t t-set="categoryLivechat" t-value="owner.discuss.categoryLivechat"/>
|
||||
<t t-if="categoryLivechat and categoryLivechat.categoryItems.length">
|
||||
<DiscussSidebarCategory
|
||||
className="'o_DiscussSidebarView_category o_DiscussSidebarView_categoryLivechat'"
|
||||
|
||||
@@ -2,11 +2,11 @@
|
||||
<templates xml:space="preserve">
|
||||
<t t-inherit="mail.ThreadIconView" t-inherit-mode="extension">
|
||||
<xpath expr="//*[@name='root']" position="inside">
|
||||
<t t-elif="threadIconView.thread.channel and threadIconView.thread.channel.channel_type === 'livechat'">
|
||||
<t t-if="threadIconView.threadTypingIconView">
|
||||
<t t-elif="thread.channel and thread.channel.channel_type === 'livechat'">
|
||||
<t t-if="threadTypingIconView">
|
||||
<ThreadTypingIconView
|
||||
className="'o_ThreadIconView_typing'"
|
||||
record="threadIconView.threadTypingIconView"
|
||||
record="threadTypingIconView"
|
||||
/>
|
||||
</t>
|
||||
<t t-else="">
|
||||
|
||||
+2
-2
@@ -2,8 +2,8 @@
|
||||
<templates xml:space="preserve">
|
||||
|
||||
<t t-name="mail.ActivityButtonView" owl="1">
|
||||
<a class="o_ActivityButtonView" role="button" t-on-click.prevent="activityButtonView.onClick" t-ref="button">
|
||||
<i class="o_ActivityButtonView_icon fa fa-fw fa-lg" t-att-class="activityButtonView.buttonClass" role="img"/>
|
||||
<a class="o_ActivityButtonView" role="button" t-on-click.prevent="onClick" t-ref="button">
|
||||
<i class="o_ActivityButtonView_icon fa fa-fw fa-lg" t-att-class="buttonClass" role="img"/>
|
||||
</a>
|
||||
</t>
|
||||
|
||||
|
||||
+11
-11
@@ -3,41 +3,41 @@
|
||||
<t t-name="mail.ActivityListView" owl="1">
|
||||
<div class="o_ActivityListView d-flex flex-column" t-ref="root">
|
||||
<div class="o_ActivityListView_activityList d-flex flex-column flex-grow-1">
|
||||
<t t-if="activityListView.activityListViewItems.length === 0">
|
||||
<t t-if="activityListViewItems.length === 0">
|
||||
<span class="p-3 text-center fst-italic text-500 border-bottom">Schedule activities to help you get things done.</span>
|
||||
</t>
|
||||
<t t-if="activityListView.overdueActivityListViewItems.length > 0">
|
||||
<t t-if="overdueActivityListViewItems.length > 0">
|
||||
<div class="d-flex bg-100 py-2 border-bottom">
|
||||
<span class="o_ActivityListView_overdueTitle text-danger fw-bold mx-3">Overdue</span>
|
||||
<span class="flex-grow-1"/>
|
||||
<span class="badge rounded-pill text-bg-danger mx-3 align-self-center" t-esc="activityListView.overdueActivityListViewItems.length"/>
|
||||
<span class="badge rounded-pill text-bg-danger mx-3 align-self-center" t-esc="overdueActivityListViewItems.length"/>
|
||||
</div>
|
||||
<t t-foreach="activityListView.overdueActivityListViewItems" t-as="activityListViewItem" t-key="activityListViewItem">
|
||||
<t t-foreach="overdueActivityListViewItems" t-as="activityListViewItem" t-key="activityListViewItem">
|
||||
<ActivityListViewItem record="activityListViewItem"/>
|
||||
</t>
|
||||
</t>
|
||||
<t t-if="activityListView.todayActivityListViewItems.length > 0">
|
||||
<t t-if="todayActivityListViewItems.length > 0">
|
||||
<div class="d-flex bg-100 py-2 border-bottom">
|
||||
<span class="o_ActivityListView_todayTitle text-warning fw-bold mx-3">Today</span>
|
||||
<span class="flex-grow-1"/>
|
||||
<span class="badge rounded-pill text-bg-warning mx-3 align-self-center" t-esc="activityListView.todayActivityListViewItems.length"/>
|
||||
<span class="badge rounded-pill text-bg-warning mx-3 align-self-center" t-esc="todayActivityListViewItems.length"/>
|
||||
</div>
|
||||
<t t-foreach="activityListView.todayActivityListViewItems" t-as="activityListViewItem" t-key="activityListViewItem">
|
||||
<t t-foreach="todayActivityListViewItems" t-as="activityListViewItem" t-key="activityListViewItem">
|
||||
<ActivityListViewItem record="activityListViewItem"/>
|
||||
</t>
|
||||
</t>
|
||||
<t t-if="activityListView.plannedActivityListViewItems.length > 0">
|
||||
<t t-if="plannedActivityListViewItems.length > 0">
|
||||
<div class="d-flex bg-100 py-2 border-bottom">
|
||||
<span class="o_ActivityListView_plannedTitle text-success fw-bold mx-3">Planned</span>
|
||||
<span class="flex-grow-1"/>
|
||||
<span class="badge rounded-pill text-bg-success mx-3 align-self-center" t-esc="activityListView.plannedActivityListViewItems.length"/>
|
||||
<span class="badge rounded-pill text-bg-success mx-3 align-self-center" t-esc="plannedActivityListViewItems.length"/>
|
||||
</div>
|
||||
<t t-foreach="activityListView.plannedActivityListViewItems" t-as="activityListViewItem" t-key="activityListViewItem">
|
||||
<t t-foreach="plannedActivityListViewItems" t-as="activityListViewItem" t-key="activityListViewItem">
|
||||
<ActivityListViewItem record="activityListViewItem"/>
|
||||
</t>
|
||||
</t>
|
||||
</div>
|
||||
<button class="o_ActivityListView_addActivityButton btn btn-secondary p-3 text-center" t-on-click="activityListView.onClickAddActivityButton">
|
||||
<button class="o_ActivityListView_addActivityButton btn btn-secondary p-3 text-center" t-on-click="onClickAddActivityButton">
|
||||
<i class="fa fa-plus fa-fw"></i><strong>Schedule an activity</strong>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
+16
-16
@@ -3,33 +3,33 @@
|
||||
<t t-name="mail.ActivityListViewItem" owl="1">
|
||||
<div class="o_ActivityListViewItem d-flex flex-column border-bottom py-2">
|
||||
<div class="o_ActivityListViewItem_container d-flex align-items-baseline ms-3 me-1">
|
||||
<i t-if="activityListViewItem.activity.icon" class="fa small me-2" t-attf-class="{{ activityListViewItem.activity.icon }}" role="img"/>
|
||||
<t t-if="activityListViewItem.activity.summary">
|
||||
<b class="text-900 me-2 text-truncate flex-grow-1 flex-basis-0" t-esc="activityListViewItem.activity.summary"/>
|
||||
<i t-if="activity.icon" class="fa small me-2" t-attf-class="{{ activity.icon }}" role="img"/>
|
||||
<t t-if="activity.summary">
|
||||
<b class="text-900 me-2 text-truncate flex-grow-1 flex-basis-0" t-esc="activity.summary"/>
|
||||
</t>
|
||||
<t t-if="!activityListViewItem.activity.summary and activityListViewItem.activity.type">
|
||||
<b class="text-900 me-2 text-truncate flex-grow-1" t-esc="activityListViewItem.activity.type.displayName"/>
|
||||
<t t-if="!activity.summary and activity.type">
|
||||
<b class="text-900 me-2 text-truncate flex-grow-1" t-esc="activity.type.displayName"/>
|
||||
</t>
|
||||
<button t-if="activityListViewItem.hasEditButton" class="o_ActivityListViewItem_editButton btn btn-sm btn-link" t-on-click="activityListViewItem.onClickEditActivityButton">
|
||||
<button t-if="hasEditButton" class="o_ActivityListViewItem_editButton btn btn-sm btn-link" t-on-click="onClickEditActivityButton">
|
||||
<i class="fa fa-pencil"/>
|
||||
</button>
|
||||
<t t-if="activityListViewItem.activity.canWrite">
|
||||
<button t-if="activityListViewItem.fileUploader" class="o_ActivityListViewItem_actionLink btn btn-link shadow-none fs-4 fa fa-upload" title="Upload file" aria-label="Upload File" t-on-click="activityListViewItem.onClickUploadDocument"/>
|
||||
<button t-if="activityListViewItem.hasMarkDoneButton" class="o_ActivityListViewItem_actionLink o_ActivityListViewItem_markAsDone btn btn-link shadow-none fs-4 fa fa-check-circle" title="Mark as done" aria-label="Mark as done" t-on-click="activityListViewItem.onClickMarkAsDone" t-ref="markDoneButton"/>
|
||||
<t t-if="activity.canWrite">
|
||||
<button t-if="fileUploader" class="o_ActivityListViewItem_actionLink btn btn-link shadow-none fs-4 fa fa-upload" title="Upload file" aria-label="Upload File" t-on-click="onClickUploadDocument"/>
|
||||
<button t-if="hasMarkDoneButton" class="o_ActivityListViewItem_actionLink o_ActivityListViewItem_markAsDone btn btn-link shadow-none fs-4 fa fa-check-circle" title="Mark as done" aria-label="Mark as done" t-on-click="onClickMarkAsDone" t-ref="markDoneButton"/>
|
||||
</t>
|
||||
</div>
|
||||
<div t-if="activityListViewItem.activity.state !== 'today'" class="d-flex align-items-baseline flex-wrap mx-3">
|
||||
<div t-if="activity.state !== 'today'" class="d-flex align-items-baseline flex-wrap mx-3">
|
||||
<i class="fa fa-clock-o me-2 text-muted" role="img" aria-label="Deadline" title="Deadline"/>
|
||||
<t t-if="!activityListViewItem.activity.isCurrentPartnerAssignee and activityListViewItem.activity.assignee">
|
||||
<small class="text-truncate" t-esc="activityListViewItem.activity.assignee.displayName"/>
|
||||
<t t-if="!activity.isCurrentPartnerAssignee and activity.assignee">
|
||||
<small class="text-truncate" t-esc="activity.assignee.displayName"/>
|
||||
<small class="mx-1">-</small>
|
||||
</t>
|
||||
<small t-att-title="activityListViewItem.activity.dateDeadline" t-esc="activityListViewItem.delayLabel"/>
|
||||
<small t-att-title="activity.dateDeadline" t-esc="delayLabel"/>
|
||||
</div>
|
||||
<ActivityMarkDonePopoverContentView t-if="activityListViewItem.markDoneView" record="activityListViewItem.markDoneView"/>
|
||||
<div t-if="activityListViewItem.mailTemplateViews.length > 0" class="mx-3 mt-2">
|
||||
<ActivityMarkDonePopoverContentView t-if="markDoneView" record="markDoneView"/>
|
||||
<div t-if="mailTemplateViews.length > 0" class="mx-3 mt-2">
|
||||
<MailTemplateView
|
||||
t-foreach="activityListViewItem.mailTemplateViews" t-as="mailTemplateView" t-key="mailTemplateView"
|
||||
t-foreach="mailTemplateViews" t-as="mailTemplateView" t-key="mailTemplateView"
|
||||
record="mailTemplateView"
|
||||
/>
|
||||
</div>
|
||||
|
||||
@@ -2,21 +2,20 @@
|
||||
<templates xml:space="preserve">
|
||||
|
||||
<t t-name="mail.ActivityView" owl="1">
|
||||
<t t-if="activityView">
|
||||
<div class="o_ActivityView d-flex py-2 px-3" t-attf-class="{{ className }}" t-on-click="activityView.onClickActivity" t-ref="root">
|
||||
<div class="o_ActivityView d-flex py-2 px-3" t-attf-class="{{ className }}" t-on-click="onClickActivity" t-ref="root">
|
||||
<div class="o_ActivityView_sidebar me-3">
|
||||
<div class="o_ActivityView_user position-relative h-100 w-100">
|
||||
<t t-if="activityView.activity.assignee">
|
||||
<img class="o_ActivityView_userAvatar rounded-circle h-100 w-100 o_object_fit_cover" t-attf-src="/web/image/res.users/{{ activityView.activity.assignee.id }}/avatar_128" t-att-alt="activityView.activity.assignee.nameOrDisplayName"/>
|
||||
<t t-if="activity.assignee">
|
||||
<img class="o_ActivityView_userAvatar rounded-circle h-100 w-100 o_object_fit_cover" t-attf-src="/web/image/res.users/{{ activity.assignee.id }}/avatar_128" t-att-alt="activity.assignee.nameOrDisplayName"/>
|
||||
</t>
|
||||
<div class="o_ActivityView_iconContainer d-flex align-items-center justify-content-center rounded-circle w-50 h-50"
|
||||
t-att-class="{
|
||||
'text-bg-success': activityView.activity.state === 'planned',
|
||||
'text-bg-warning': activityView.activity.state === 'today',
|
||||
'text-bg-danger': activityView.activity.state === 'overdue',
|
||||
'text-bg-success': activity.state === 'planned',
|
||||
'text-bg-warning': activity.state === 'today',
|
||||
'text-bg-danger': activity.state === 'overdue',
|
||||
}"
|
||||
>
|
||||
<i class="o_ActivityView_icon fa small" t-attf-class="{{ activityView.activity.icon }}"/>
|
||||
<i class="o_ActivityView_icon fa small" t-attf-class="{{ activity.icon }}"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -24,64 +23,64 @@
|
||||
<div class="o_ActivityView_info d-flex align-items-baseline">
|
||||
<div class="o_ActivityView_dueDateText me-2"
|
||||
t-att-class="{
|
||||
'text-danger': activityView.activity.state === 'overdue',
|
||||
'text-success': activityView.activity.state === 'planned',
|
||||
'text-warning': activityView.activity.state === 'today',
|
||||
'text-danger': activity.state === 'overdue',
|
||||
'text-success': activity.state === 'planned',
|
||||
'text-warning': activity.state === 'today',
|
||||
}"
|
||||
>
|
||||
<b t-esc="activityView.delayLabel"/>
|
||||
<b t-esc="delayLabel"/>
|
||||
</div>
|
||||
<t t-if="activityView.activity.summary">
|
||||
<t t-if="activity.summary">
|
||||
<b class="o_ActivityView_summary text-900 me-2">
|
||||
<t t-esc="activityView.summary"/>
|
||||
<t t-esc="summary"/>
|
||||
</b>
|
||||
</t>
|
||||
<t t-elif="activityView.activity.type">
|
||||
<t t-elif="activity.type">
|
||||
<b class="o_ActivityView_summary o_ActivityView_type text-900 me-2">
|
||||
<t t-esc="activityView.activity.type.displayName"/>
|
||||
<t t-esc="activity.type.displayName"/>
|
||||
</b>
|
||||
</t>
|
||||
<t t-if="activityView.activity.assignee">
|
||||
<t t-if="activity.assignee">
|
||||
<div class="o_ActivityView_userName">
|
||||
<t t-esc="activityView.assignedUserText"/>
|
||||
<t t-esc="assignedUserText"/>
|
||||
</div>
|
||||
</t>
|
||||
<a
|
||||
href="#"
|
||||
class="o_ActivityView_detailsButton btn py-0"
|
||||
t-att-class="activityView.areDetailsVisible ? 'text-primary' : 'btn-link btn-primary'"
|
||||
t-att-aria-expanded="activityView.areDetailsVisible ? 'true' : 'false'"
|
||||
t-on-click="activityView.onClickDetailsButton"
|
||||
t-att-class="areDetailsVisible ? 'text-primary' : 'btn-link btn-primary'"
|
||||
t-att-aria-expanded="areDetailsVisible ? 'true' : 'false'"
|
||||
t-on-click="onClickDetailsButton"
|
||||
role="button"
|
||||
>
|
||||
<i class="fa fa-info-circle" role="img" title="Info" aria-label="Info"/>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<t t-if="activityView.areDetailsVisible">
|
||||
<t t-if="areDetailsVisible">
|
||||
<div class="o_ActivityView_details">
|
||||
<div class="d-md-table table table-sm mt-2 mb-3">
|
||||
<div t-if="activityView.activity.type" class="d-md-table-row mb-3">
|
||||
<div t-if="activity.type" class="d-md-table-row mb-3">
|
||||
<div class="d-md-table-cell fw-bold text-md-end m-0 py-md-1 px-md-4">Activity type</div>
|
||||
<div class="o_ActivityView_type d-md-table-cell py-md-1 pe-4">
|
||||
<t t-esc="activityView.activity.type.displayName"/>
|
||||
<t t-esc="activity.type.displayName"/>
|
||||
</div>
|
||||
</div>
|
||||
<div t-if="activityView.activity.creator" class="d-md-table-row mb-3">
|
||||
<div t-if="activity.creator" class="d-md-table-row mb-3">
|
||||
<div class="d-md-table-cell fw-bold text-md-end m-0 py-md-1 px-md-4">Created</div>
|
||||
<div class="o_ActivityView_detailsCreation d-md-table-cell py-md-1 pe-4">
|
||||
<t t-esc="activityView.formattedCreateDatetime"/>, <br t-if="messaging.device.isSmall"/>by
|
||||
<img class="o_ActivityView_detailsUserAvatar o_ActivityView_detailsCreatorAvatar ms-1 me-1 rounded-circle align-text-bottom p-0" t-attf-src="/web/image/res.users/{{ activityView.activity.creator.id }}/avatar_128" t-att-title="activityView.activity.creator.nameOrDisplayName" t-att-alt="activityView.activity.creator.nameOrDisplayName"/>
|
||||
<t t-esc="formattedCreateDatetime"/>, <br t-if="messaging.device.isSmall"/>by
|
||||
<img class="o_ActivityView_detailsUserAvatar o_ActivityView_detailsCreatorAvatar ms-1 me-1 rounded-circle align-text-bottom p-0" t-attf-src="/web/image/res.users/{{ activity.creator.id }}/avatar_128" t-att-title="activity.creator.nameOrDisplayName" t-att-alt="activity.creator.nameOrDisplayName"/>
|
||||
<b class="o_ActivityView_detailsCreator">
|
||||
<t t-esc="activityView.activity.creator.nameOrDisplayName"/>
|
||||
<t t-esc="activity.creator.nameOrDisplayName"/>
|
||||
</b>
|
||||
</div>
|
||||
</div>
|
||||
<div t-if="activityView.activity.assignee" class="d-md-table-row mb-3">
|
||||
<div t-if="activity.assignee" class="d-md-table-row mb-3">
|
||||
<div class="d-md-table-cell fw-bold text-md-end m-0 py-md-1 px-md-4">Assigned to</div>
|
||||
<div class="o_ActivityView_detailsAssignation d-md-table-cell py-md-1 pe-4">
|
||||
<img class="o_ActivityView_detailsUserAvatar o_ActivityView_detailsAssignationUserAvatar me-1 rounded-circle align-text-bottom p-0" t-attf-src="/web/image/res.users/{{ activityView.activity.assignee.id }}/avatar_128" t-att-title="activityView.activity.assignee.nameOrDisplayName" t-att-alt="activityView.activity.assignee.nameOrDisplayName"/>
|
||||
<b t-esc="activityView.activity.assignee.nameOrDisplayName"/>
|
||||
<img class="o_ActivityView_detailsUserAvatar o_ActivityView_detailsAssignationUserAvatar me-1 rounded-circle align-text-bottom p-0" t-attf-src="/web/image/res.users/{{ activity.assignee.id }}/avatar_128" t-att-title="activity.assignee.nameOrDisplayName" t-att-alt="activity.assignee.nameOrDisplayName"/>
|
||||
<b t-esc="activity.assignee.nameOrDisplayName"/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="d-md-table-row">
|
||||
@@ -89,12 +88,12 @@
|
||||
<div class="o_ActivityView_detailsDueDate d-md-table-cell py-md-1 pe-4">
|
||||
<span class="o_ActivityView_deadlineDateText"
|
||||
t-att-class="{
|
||||
'text-danger': activityView.activity.state === 'overdue',
|
||||
'text-success': activityView.activity.state === 'planned',
|
||||
'text-warning': activityView.activity.state === 'today',
|
||||
'text-danger': activity.state === 'overdue',
|
||||
'text-success': activity.state === 'planned',
|
||||
'text-warning': activity.state === 'today',
|
||||
}"
|
||||
>
|
||||
<t t-esc="activityView.formattedDeadlineDate"/>
|
||||
<t t-esc="formattedDeadlineDate"/>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
@@ -102,15 +101,15 @@
|
||||
</div>
|
||||
</t>
|
||||
|
||||
<t t-if="activityView.activity.note">
|
||||
<t t-if="activity.note">
|
||||
<div class="o_ActivityView_note">
|
||||
<t t-out="activityView.activity.noteAsMarkup"/>
|
||||
<t t-out="activity.noteAsMarkup"/>
|
||||
</div>
|
||||
</t>
|
||||
|
||||
<t t-if="activityView.mailTemplateViews.length > 0">
|
||||
<t t-if="mailTemplateViews.length > 0">
|
||||
<div class="o_ActivityView_mailTemplates">
|
||||
<t t-foreach="activityView.mailTemplateViews" t-as="mailTemplateView" t-key="mailTemplateView.localId">
|
||||
<t t-foreach="mailTemplateViews" t-as="mailTemplateView" t-key="mailTemplateView.localId">
|
||||
<MailTemplateView
|
||||
className="'o_ActivityView_mailTemplate'"
|
||||
record="mailTemplateView"
|
||||
@@ -119,27 +118,26 @@
|
||||
</div>
|
||||
</t>
|
||||
|
||||
<t t-if="activityView.activity.canWrite">
|
||||
<t t-if="activity.canWrite">
|
||||
<div name="tools" class="o_ActivityView_tools d-flex">
|
||||
<button class="o_ActivityView_toolButton o_ActivityView_markDoneButton btn btn-link btn-primary pt-0 ps-0" t-att-title="activityView.markDoneText" t-ref="markDoneButton" t-on-click="activityView.onClickMarkDoneButton">
|
||||
<button class="o_ActivityView_toolButton o_ActivityView_markDoneButton btn btn-link btn-primary pt-0 ps-0" t-att-title="markDoneText" t-ref="markDoneButton" t-on-click="onClickMarkDoneButton">
|
||||
<i class="fa fa-check"/> Mark Done
|
||||
</button>
|
||||
<t t-if="activityView.fileUploader">
|
||||
<button class="o_ActivityView_toolButton o_ActivityView_uploadButton btn btn-link btn-primary pt-0 ps-0" t-on-click="activityView.onClickUploadDocument">
|
||||
<t t-if="fileUploader">
|
||||
<button class="o_ActivityView_toolButton o_ActivityView_uploadButton btn btn-link btn-primary pt-0 ps-0" t-on-click="onClickUploadDocument">
|
||||
<i class="fa fa-upload"/> Upload Document
|
||||
</button>
|
||||
</t>
|
||||
<button class="o_ActivityView_toolButton o_ActivityView_editButton btn btn-link btn-primary pt-0" t-on-click="activityView.onClickEdit">
|
||||
<button class="o_ActivityView_toolButton o_ActivityView_editButton btn btn-link btn-primary pt-0" t-on-click="onClickEdit">
|
||||
<i class="fa fa-pencil"/> Edit
|
||||
</button>
|
||||
<button class="o_ActivityView_toolButton o_ActivityView_cancelButton btn btn-link btn-primary pt-0" t-on-click="activityView.onClickCancel" >
|
||||
<button class="o_ActivityView_toolButton o_ActivityView_cancelButton btn btn-link btn-primary pt-0" t-on-click="onClickCancel" >
|
||||
<i class="fa fa-times"/> Cancel
|
||||
</button>
|
||||
</div>
|
||||
</t>
|
||||
</div>
|
||||
</div>
|
||||
</t>
|
||||
</t>
|
||||
|
||||
</templates>
|
||||
|
||||
@@ -2,44 +2,42 @@
|
||||
<templates xml:space="preserve">
|
||||
|
||||
<t t-name="mail.ActivityBoxView" owl="1">
|
||||
<t t-if="activityBoxView">
|
||||
<div class="o_ActivityBoxView" t-attf-class="{{ className }}" t-ref="root">
|
||||
<a href="#" role="button" class="o_ActivityBoxView_title btn d-flex align-items-center mt-4 p-0 w-100 fw-bold" t-att-aria-expanded="activityBoxView.isActivityListVisible ? 'true' : 'false'" t-on-click="activityBoxView.onClickActivityBoxTitle">
|
||||
<a href="#" role="button" class="o_ActivityBoxView_title btn d-flex align-items-center mt-4 p-0 w-100 fw-bold" t-att-aria-expanded="isActivityListVisible ? 'true' : 'false'" t-on-click="onClickActivityBoxTitle">
|
||||
<hr class="o_ActivityBoxView_titleLine w-auto flex-grow-1 me-3" />
|
||||
<span class="o_ActivityBoxView_titleText">
|
||||
<i class="fa fa-fw" t-att-class="activityBoxView.isActivityListVisible ? 'fa-caret-down' : 'fa-caret-right'"/>
|
||||
<i class="fa fa-fw" t-att-class="isActivityListVisible ? 'fa-caret-down' : 'fa-caret-right'"/>
|
||||
Planned activities
|
||||
</span>
|
||||
<t t-if="!activityBoxView.isActivityListVisible">
|
||||
<t t-if="!isActivityListVisible">
|
||||
<span class="o_ActivityBoxView_titleBadges ms-2">
|
||||
<t t-if="activityBoxView.chatter.thread.overdueActivities.length > 0">
|
||||
<t t-if="chatter.thread.overdueActivities.length > 0">
|
||||
<span class="o_ActivityBoxView_titleBadge me-1 badge text-bg-danger">
|
||||
<t t-esc="activityBoxView.chatter.thread.overdueActivities.length"/>
|
||||
<t t-esc="chatter.thread.overdueActivities.length"/>
|
||||
</span>
|
||||
</t>
|
||||
<t t-if="activityBoxView.chatter.thread.todayActivities.length > 0">
|
||||
<t t-if="chatter.thread.todayActivities.length > 0">
|
||||
<span class="o_ActivityBoxView_titleBadge me-1 badge text-bg-warning">
|
||||
<t t-esc="activityBoxView.chatter.thread.todayActivities.length"/>
|
||||
<t t-esc="chatter.thread.todayActivities.length"/>
|
||||
</span>
|
||||
</t>
|
||||
<t t-if="activityBoxView.chatter.thread.futureActivities.length > 0">
|
||||
<t t-if="chatter.thread.futureActivities.length > 0">
|
||||
<span class="o_ActivityBoxView_titleBadge me-1 badge text-bg-success">
|
||||
<t t-esc="activityBoxView.chatter.thread.futureActivities.length"/>
|
||||
<t t-esc="chatter.thread.futureActivities.length"/>
|
||||
</span>
|
||||
</t>
|
||||
</span>
|
||||
</t>
|
||||
<hr class="o_ActivityBoxView_titleLine w-auto flex-grow-1 ms-3"/>
|
||||
</a>
|
||||
<t t-if="activityBoxView.isActivityListVisible">
|
||||
<t t-if="isActivityListVisible">
|
||||
<div class="o_ActivityBoxView_activityList">
|
||||
<t t-foreach="activityBoxView.activityViews" t-as="activityView" t-key="activityView.localId">
|
||||
<t t-foreach="activityViews" t-as="activityView" t-key="activityView.localId">
|
||||
<ActivityView className="'o_ActivityBoxView_activity'" record="activityView"/>
|
||||
</t>
|
||||
</div>
|
||||
</t>
|
||||
</div>
|
||||
</t>
|
||||
</t>
|
||||
|
||||
</templates>
|
||||
|
||||
+7
-9
@@ -2,27 +2,25 @@
|
||||
<templates xml:space="preserve">
|
||||
|
||||
<t t-name="mail.ActivityMarkDonePopoverContentView" owl="1">
|
||||
<t t-if="activityMarkDonePopoverContentView">
|
||||
<div class="o_ActivityMarkDonePopoverContentView" t-attf-class="{{ className }}" t-on-keydown="activityMarkDonePopoverContentView.onKeydown" t-ref="root">
|
||||
<h6 t-if="activityMarkDonePopoverContentView.hasHeader" class="o_ActivityMarkDonePopoverContentView_header p-2 fw-bolder bg-200 border-bottom" t-esc="activityMarkDonePopoverContentView.headerText"/>
|
||||
<div class="o_ActivityMarkDonePopoverContentView" t-attf-class="{{ className }}" t-on-keydown="onKeydown" t-ref="root">
|
||||
<h6 t-if="hasHeader" class="o_ActivityMarkDonePopoverContentView_header p-2 fw-bolder bg-200 border-bottom" t-esc="headerText"/>
|
||||
<div class="o_ActivityMarkDonePopoverContentView_content py-2 px-3">
|
||||
<textarea class="form-control o_ActivityMarkDonePopoverContentView_feedback" rows="3" placeholder="Write Feedback" t-on-blur="activityMarkDonePopoverContentView.onBlur" t-ref="feedbackTextarea"/>
|
||||
<textarea class="form-control o_ActivityMarkDonePopoverContentView_feedback" rows="3" placeholder="Write Feedback" t-on-blur="onBlur" t-ref="feedbackTextarea"/>
|
||||
<div class="o_ActivityMarkDonePopoverContentView_buttons mt-2">
|
||||
<button type="button" class="o_ActivityMarkDonePopoverContentView_doneScheduleNextButton btn btn-sm btn-primary" t-on-click="activityMarkDonePopoverContentView.onClickDoneAndScheduleNext">
|
||||
<button type="button" class="o_ActivityMarkDonePopoverContentView_doneScheduleNextButton btn btn-sm btn-primary" t-on-click="onClickDoneAndScheduleNext">
|
||||
Done & Schedule Next
|
||||
</button>
|
||||
<t t-if="activityMarkDonePopoverContentView.activity.chaining_type === 'suggest'">
|
||||
<button type="button" class="o_ActivityMarkDonePopoverContentView_doneButton btn btn-sm btn-primary mx-2" t-on-click="activityMarkDonePopoverContentView.onClickDone">
|
||||
<t t-if="activity.chaining_type === 'suggest'">
|
||||
<button type="button" class="o_ActivityMarkDonePopoverContentView_doneButton btn btn-sm btn-primary mx-2" t-on-click="onClickDone">
|
||||
Done
|
||||
</button>
|
||||
</t>
|
||||
<button type="button" class="o_ActivityMarkDonePopoverContentView_discardButton btn btn-sm btn-link" t-on-click="activityMarkDonePopoverContentView.onClickDiscard">
|
||||
<button type="button" class="o_ActivityMarkDonePopoverContentView_discardButton btn btn-sm btn-link" t-on-click="onClickDiscard">
|
||||
Discard
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</t>
|
||||
</t>
|
||||
|
||||
</templates>
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
<templates xml:space="preserve">
|
||||
|
||||
<t t-name="mail.AttachmentBoxView" owl="1">
|
||||
<t t-if="attachmentBoxView">
|
||||
<div class="o_AttachmentBoxView position-relative" t-attf-class="{{ className }}" t-ref="root">
|
||||
<div class="o_AttachmentBoxView_title d-flex align-items-center">
|
||||
<hr class="o_AttachmentBoxView_dashedLine flex-grow-1"/>
|
||||
@@ -12,19 +11,18 @@
|
||||
<hr class="o_AttachmentBoxView_dashedLine flex-grow-1"/>
|
||||
</div>
|
||||
<div class="o_AttachmentBoxView_content d-flex flex-column">
|
||||
<t t-if="attachmentBoxView.attachmentList">
|
||||
<t t-if="attachmentList">
|
||||
<AttachmentList
|
||||
className="'o_attachmentBox_attachmentList'"
|
||||
record="attachmentBoxView.attachmentList"
|
||||
record="attachmentList"
|
||||
/>
|
||||
</t>
|
||||
<button class="o_AttachmentBoxView_buttonAdd btn btn-link" type="button" t-on-click="attachmentBoxView.onClickAddAttachment" t-att-disabled="!attachmentBoxView.chatter.hasWriteAccess">
|
||||
<button class="o_AttachmentBoxView_buttonAdd btn btn-link" type="button" t-on-click="onClickAddAttachment" t-att-disabled="!chatter.hasWriteAccess">
|
||||
<i class="fa fa-plus-square"/>
|
||||
Attach files
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</t>
|
||||
</t>
|
||||
|
||||
</templates>
|
||||
|
||||
@@ -1,60 +1,58 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<templates xml:space="preserve">
|
||||
<t t-name="mail.AttachmentCard" owl="1">
|
||||
<t t-if="attachmentCard">
|
||||
<div t-attf-class="{{ className }}" t-ref="root">
|
||||
<div class="o_AttachmentCard o-has-card-details d-flex rounded bg-300"
|
||||
t-att-class="{
|
||||
'o-isUploading': attachmentCard.attachment.isUploading,
|
||||
'o-viewable': attachmentCard.attachment.isViewable,
|
||||
}" t-att-title="attachmentCard.attachment.displayName ? attachmentCard.attachment.displayName : undefined" role="menu" t-att-aria-label="attachmentCard.attachment.displayName" t-att-data-id="attachmentCard.attachment.localId"
|
||||
'o-isUploading': attachment.isUploading,
|
||||
'o-viewable': attachment.isViewable,
|
||||
}" t-att-title="attachment.displayName ? attachment.displayName : undefined" role="menu" t-att-aria-label="attachment.displayName" t-att-data-id="attachment.localId"
|
||||
>
|
||||
<!-- Image style-->
|
||||
<!-- o_image from mimetype.scss -->
|
||||
<div class="o_AttachmentCard_image o_image flex-shrink-0 m-1" t-on-click="attachmentCard.onClickImage" t-att-class="{'o-attachment-viewable opacity-75-hover': attachmentCard.attachment.isViewable,}" role="menuitem" aria-label="Preview" t-att-tabindex="attachmentCard.attachment.isViewable ? 0 : -1" t-att-aria-disabled="!attachmentCard.attachment.isViewable" t-att-data-mimetype="attachmentCard.attachment.mimetype">
|
||||
<div class="o_AttachmentCard_image o_image flex-shrink-0 m-1" t-on-click="onClickImage" t-att-class="{'o-attachment-viewable opacity-75-hover': attachment.isViewable,}" role="menuitem" aria-label="Preview" t-att-tabindex="attachment.isViewable ? 0 : -1" t-att-aria-disabled="!attachment.isViewable" t-att-data-mimetype="attachment.mimetype">
|
||||
</div>
|
||||
<!-- Attachment details -->
|
||||
<div class="o_AttachmentCard_details d-flex justify-content-center flex-column px-1">
|
||||
<t t-if="attachmentCard.attachment.displayName">
|
||||
<t t-if="attachment.displayName">
|
||||
<div class="o_AttachmentCard_filename text-truncate">
|
||||
<t t-esc="attachmentCard.attachment.displayName"/>
|
||||
<t t-esc="attachment.displayName"/>
|
||||
</div>
|
||||
</t>
|
||||
<t t-if="attachmentCard.attachment.extension">
|
||||
<t t-if="attachment.extension">
|
||||
<small class="o_AttachmentCard_extension text-uppercase">
|
||||
<t t-esc="attachmentCard.attachment.extension"/>
|
||||
<t t-esc="attachment.extension"/>
|
||||
</small>
|
||||
</t>
|
||||
</div>
|
||||
<!-- Attachment aside -->
|
||||
<div class="o_AttachmentCard_aside position-relative rounded-end overflow-hidden" t-att-class="{ 'o-hasMultipleActions d-flex flex-column': attachmentCard.hasMultipleActions }">
|
||||
<div class="o_AttachmentCard_aside position-relative rounded-end overflow-hidden" t-att-class="{ 'o-hasMultipleActions d-flex flex-column': hasMultipleActions }">
|
||||
<!-- Uploading icon -->
|
||||
<t t-if="attachmentCard.attachment.isUploading and attachmentCard.attachmentList.composerViewOwner">
|
||||
<t t-if="attachment.isUploading and attachmentList.composerViewOwner">
|
||||
<div class="o_AttachmentCard_asideItem o_AttachmentCard_asideItemUploading d-flex justify-content-center align-items-center w-100 h-100" title="Uploading">
|
||||
<i class="fa fa-spin fa-spinner"/>
|
||||
</div>
|
||||
</t>
|
||||
<!-- Uploaded icon -->
|
||||
<t t-if="!attachmentCard.attachment.isUploading and attachmentCard.attachmentList.composerViewOwner">
|
||||
<t t-if="!attachment.isUploading and attachmentList.composerViewOwner">
|
||||
<div class="o_AttachmentCard_asideItem o_AttachmentCard_asideItemUploaded d-flex justify-content-center align-items-center w-100 h-100 text-primary" title="Uploaded">
|
||||
<i class="fa fa-check"/>
|
||||
</div>
|
||||
</t>
|
||||
<!-- Remove button -->
|
||||
<t t-if="attachmentCard.attachment.isDeletable">
|
||||
<button class="o_AttachmentCard_asideItem o_AttachmentCard_asideItemUnlink btn top-0 justify-content-center align-items-center d-flex w-100 h-100 rounded-0" t-attf-class="{{ attachmentCard.attachmentList.composerViewOwner ? 'o-pretty position-absolute btn-primary transition-base' : 'bg-300' }}" t-on-click="attachmentCard.onClickUnlink" title="Remove">
|
||||
<t t-if="attachment.isDeletable">
|
||||
<button class="o_AttachmentCard_asideItem o_AttachmentCard_asideItemUnlink btn top-0 justify-content-center align-items-center d-flex w-100 h-100 rounded-0" t-attf-class="{{ attachmentList.composerViewOwner ? 'o-pretty position-absolute btn-primary transition-base' : 'bg-300' }}" t-on-click="onClickUnlink" title="Remove">
|
||||
<i class="fa fa-trash" role="img" aria-label="Remove"/>
|
||||
</button>
|
||||
</t>
|
||||
<!-- Download button -->
|
||||
<t t-if="!attachmentCard.attachmentList.composerViewOwner and !attachmentCard.attachment.isUploading">
|
||||
<button class="o_AttachmentCard_asideItem o_AttachmentCard_asideItemDownload btn d-flex justify-content-center align-items-center w-100 h-100 rounded-0 bg-300" t-on-click="attachmentCard.attachment.onClickDownload" title="Download">
|
||||
<t t-if="!attachmentList.composerViewOwner and !attachment.isUploading">
|
||||
<button class="o_AttachmentCard_asideItem o_AttachmentCard_asideItemDownload btn d-flex justify-content-center align-items-center w-100 h-100 rounded-0 bg-300" t-on-click="attachment.onClickDownload" title="Download">
|
||||
<i class="fa fa-download" role="img" aria-label="Download"/>
|
||||
</button>
|
||||
</t>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</t>
|
||||
</t>
|
||||
</templates>
|
||||
|
||||
+3
-5
@@ -1,17 +1,15 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<templates xml:space="preserve">
|
||||
<t t-name="mail.AttachmentDeleteConfirmView" owl="1">
|
||||
<t t-if="attachmentDeleteConfirmView">
|
||||
<div class="o_AttachmentDeleteConfirmView card bg-view" t-attf-class="{{ className }}" t-ref="root">
|
||||
<h4 class="m-3">Confirmation</h4>
|
||||
<hr class="mt-0 mb-3"/>
|
||||
<p class="o_AttachmentDeleteConfirmView_mainText mx-3 mb-3" t-esc="attachmentDeleteConfirmView.body"/>
|
||||
<p class="o_AttachmentDeleteConfirmView_mainText mx-3 mb-3" t-esc="body"/>
|
||||
<hr class="mt-0 mb-3"/>
|
||||
<div class="o_AttachmentDeleteConfirmView_buttons mx-3 mb-3">
|
||||
<button class="o_AttachmentDeleteConfirmView_confirmButton btn btn-primary me-2" t-on-click="attachmentDeleteConfirmView.onClickOk">Ok</button>
|
||||
<button class="o_AttachmentDeleteConfirmView_cancelButton btn btn-secondary me-2" t-on-click="attachmentDeleteConfirmView.onClickCancel">Cancel</button>
|
||||
<button class="o_AttachmentDeleteConfirmView_confirmButton btn btn-primary me-2" t-on-click="onClickOk">Ok</button>
|
||||
<button class="o_AttachmentDeleteConfirmView_cancelButton btn btn-secondary me-2" t-on-click="onClickCancel">Cancel</button>
|
||||
</div>
|
||||
</div>
|
||||
</t>
|
||||
</t>
|
||||
</templates>
|
||||
|
||||
@@ -1,38 +1,36 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<templates xml:space="preserve">
|
||||
<t t-name="mail.AttachmentImage" owl="1">
|
||||
<t t-if="attachmentImage">
|
||||
<div t-attf-class="{{ className }}" role="menu" t-att-aria-label="attachmentImage.attachment.displayName" t-ref="root">
|
||||
<div t-attf-class="{{ className }}" role="menu" t-att-aria-label="attachment.displayName" t-ref="root">
|
||||
<div class="o_AttachmentImage d-flex position-relative flex-shrink-0"
|
||||
t-att-class="{
|
||||
'o-isUploading': attachmentImage.attachment.isUploading,
|
||||
'o-isUploading': attachment.isUploading,
|
||||
}"
|
||||
t-att-title="attachmentImage.attachment.displayName ? attachmentImage.attachment.displayName : undefined"
|
||||
t-att-data-id="attachmentImage.attachment.localId"
|
||||
t-att-title="attachment.displayName ? attachment.displayName : undefined"
|
||||
t-att-data-id="attachment.localId"
|
||||
tabindex="0"
|
||||
aria-label="View image"
|
||||
role="menuitem"
|
||||
t-on-click="attachmentImage.onClickImage"
|
||||
t-att-data-mimetype="attachmentImage.attachment.mimetype"
|
||||
t-on-click="onClickImage"
|
||||
t-att-data-mimetype="attachment.mimetype"
|
||||
>
|
||||
<t t-if="!attachmentImage.attachment.isUploading">
|
||||
<img class="img img-fluid my-0 mx-auto" t-att-src="attachmentImage.imageUrl" t-att-alt="attachmentImage.attachment.name" t-attf-style="max-width: min(100%, {{ attachmentImage.width }}px); max-height: {{ attachmentImage.height }}px;"/>
|
||||
<t t-if="!attachment.isUploading">
|
||||
<img class="img img-fluid my-0 mx-auto" t-att-src="imageUrl" t-att-alt="attachment.name" t-attf-style="max-width: min(100%, {{ width }}px); max-height: {{ height }}px;"/>
|
||||
</t>
|
||||
<t t-if="attachmentImage.attachment.isUploading">
|
||||
<t t-if="attachment.isUploading">
|
||||
<div class="o_AttachmentImageUploading position-absolute top-0 bottom-0 start-0 end-0 d-flex align-items-center justify-content-center" title="Uploading">
|
||||
<i class="fa fa-spin fa-spinner"/>
|
||||
</div>
|
||||
</t>
|
||||
<div class="o_AttachmentImage_imageOverlay position-absolute top-0 bottom-0 start-0 end-0 p-2 text-white opacity-0 opacity-100-hover d-flex align-items-end flax-wrap flex-column">
|
||||
<div t-if="attachmentImage.attachment.isDeletable" class="o_AttachmentImage_action o_AttachmentImage_actionUnlink btn btn-sm btn-dark rounded opacity-75 opacity-100-hover" t-att-class="{'o-pretty': attachmentImage.attachmentList.composerViewOwner}" tabindex="0" aria-label="Remove" role="menuitem" t-on-click="attachmentImage.onClickUnlink" title="Remove">
|
||||
<div t-if="attachment.isDeletable" class="o_AttachmentImage_action o_AttachmentImage_actionUnlink btn btn-sm btn-dark rounded opacity-75 opacity-100-hover" t-att-class="{'o-pretty': attachmentList.composerViewOwner}" tabindex="0" aria-label="Remove" role="menuitem" t-on-click="onClickUnlink" title="Remove">
|
||||
<i class="fa fa-trash"/>
|
||||
</div>
|
||||
<div t-if="attachmentImage.hasDownloadButton" class="o_AttachmentImage_action o_AttachmentImage_actionDownload btn btn-sm btn-dark rounded opacity-75 opacity-100-hover mt-auto" t-on-click="attachmentImage.onClickDownload" title="Download">
|
||||
<div t-if="hasDownloadButton" class="o_AttachmentImage_action o_AttachmentImage_actionDownload btn btn-sm btn-dark rounded opacity-75 opacity-100-hover mt-auto" t-on-click="onClickDownload" title="Download">
|
||||
<i class="fa fa-download"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</t>
|
||||
</t>
|
||||
</templates>
|
||||
|
||||
@@ -2,20 +2,18 @@
|
||||
<templates xml:space="preserve">
|
||||
|
||||
<t t-name="mail.AttachmentList" owl="1">
|
||||
<t t-if="attachmentList">
|
||||
<div class="o_AttachmentList d-flex flex-column mt-1" t-att-class="{ 'me-2 pe-4': attachmentList.isInChatWindowAndIsAlignedLeft and !attachmentList.composerViewOwner, 'ms-2 ps-4': attachmentList.isInChatWindowAndIsAlignedRight and !attachmentList.composerViewOwner }" t-attf-class="{{ className }}" t-ref="root">
|
||||
<div t-if="attachmentList.attachmentImages.length > 0" class="o_AttachmentList_partialList o_AttachmentList_partialListImages d-flex flex-grow-1 flex-wrap" t-att-class="{ 'justify-content-end': attachmentList.isInChatWindowAndIsAlignedRight and !attachmentList.composerViewOwner }">
|
||||
<t t-foreach="attachmentList.attachmentImages" t-as="attachmentImage" t-key="attachmentImage.localId">
|
||||
<AttachmentImage className="'o_AttachmentList_attachment mw-100 mb-1'" classNameObj="{ 'ms-1': attachmentList.isInChatWindowAndIsAlignedRight, 'me-1': !attachmentList.isInChatWindowAndIsAlignedRight }" record="attachmentImage"/>
|
||||
<div class="o_AttachmentList d-flex flex-column mt-1" t-att-class="{ 'me-2 pe-4': isInChatWindowAndIsAlignedLeft and !composerViewOwner, 'ms-2 ps-4': isInChatWindowAndIsAlignedRight and !composerViewOwner }" t-attf-class="{{ className }}" t-ref="root">
|
||||
<div t-if="attachmentImages.length > 0" class="o_AttachmentList_partialList o_AttachmentList_partialListImages d-flex flex-grow-1 flex-wrap" t-att-class="{ 'justify-content-end': isInChatWindowAndIsAlignedRight and !composerViewOwner }">
|
||||
<t t-foreach="attachmentImages" t-as="attachmentImage" t-key="attachmentImage.localId">
|
||||
<AttachmentImage className="'o_AttachmentList_attachment mw-100 mb-1'" classNameObj="{ 'ms-1': isInChatWindowAndIsAlignedRight, 'me-1': !isInChatWindowAndIsAlignedRight }" record="attachmentImage"/>
|
||||
</t>
|
||||
</div>
|
||||
<div t-if="attachmentList.attachmentCards.length > 0" class="o_AttachmentList_partialList o_AttachmentList_partialListNonImages d-flex flex-grow-1 flex-wrap mt-1" t-att-class="{ 'justify-content-end': attachmentList.isInChatWindowAndIsAlignedRight and !attachmentList.composerViewOwner }">
|
||||
<t t-foreach="attachmentList.attachmentCards" t-as="attachmentCard" t-key="attachmentCard.localId">
|
||||
<AttachmentCard className="'o_AttachmentList_attachment mw-100 mb-1'" classNameObj="{ 'ms-1': attachmentList.isInChatWindowAndIsAlignedRight, 'me-1': !attachmentList.isInChatWindowAndIsAlignedRight }" record="attachmentCard"/>
|
||||
<div t-if="attachmentCards.length > 0" class="o_AttachmentList_partialList o_AttachmentList_partialListNonImages d-flex flex-grow-1 flex-wrap mt-1" t-att-class="{ 'justify-content-end': isInChatWindowAndIsAlignedRight and !composerViewOwner }">
|
||||
<t t-foreach="attachmentCards" t-as="attachmentCard" t-key="attachmentCard.localId">
|
||||
<AttachmentCard className="'o_AttachmentList_attachment mw-100 mb-1'" classNameObj="{ 'ms-1': isInChatWindowAndIsAlignedRight, 'me-1': !isInChatWindowAndIsAlignedRight }" record="attachmentCard"/>
|
||||
</t>
|
||||
</div>
|
||||
</div>
|
||||
</t>
|
||||
</t>
|
||||
|
||||
</templates>
|
||||
|
||||
+1
-1
@@ -2,7 +2,7 @@
|
||||
<templates xml:space="preserve">
|
||||
|
||||
<t t-name="mail.AutocompleteInputView" owl="1">
|
||||
<input class="o_AutocompleteInputView form-control" t-attf-class="{{ className }}" t-on-blur="autocompleteInputView.onBlur" t-on-focusin="autocompleteInputView.onFocusin" t-on-keydown="autocompleteInputView.onKeydown" t-att-placeholder="autocompleteInputView.placeholder" t-ref="root"/>
|
||||
<input class="o_AutocompleteInputView form-control" t-attf-class="{{ className }}" t-on-blur="onBlur" t-on-focusin="onFocusin" t-on-keydown="onKeydown" t-att-placeholder="placeholder" t-ref="root"/>
|
||||
</t>
|
||||
|
||||
</templates>
|
||||
|
||||
@@ -2,18 +2,17 @@
|
||||
<templates xml:space="preserve">
|
||||
|
||||
<t t-name="mail.CallActionListView" owl="1">
|
||||
<t t-if="callActionListView">
|
||||
<div class="o_CallActionListView d-flex justify-content-between" t-attf-class="{{ className }}" t-ref="root">
|
||||
<div class="o_CallActionListView_buttons d-flex align-items-center flex-wrap">
|
||||
<t t-if="callActionListView.thread.rtc and messaging.rtc.currentRtcSession">
|
||||
<t t-if="thread.rtc and messaging.rtc.currentRtcSession">
|
||||
<button class="o_CallActionListView_button btn d-flex m-1 border-0 rounded-circle shadow-none opacity-100 opacity-75-hover"
|
||||
t-att-class="{ 'o-isActive': !messaging.rtc.currentRtcSession.isMute, 'o-isSmall p-2': callActionListView.isSmall, 'p-3': !callActionListView.isSmall }"
|
||||
t-att-aria-label="callActionListView.microphoneButtonTitle"
|
||||
t-att-title="callActionListView.microphoneButtonTitle"
|
||||
t-on-click="callActionListView.onClickMicrophone">
|
||||
<div class="o_CallActionListView_buttonIconWrapper fa-stack" t-att-class="{ 'o-isSmall': callActionListView.isSmall }">
|
||||
t-att-class="{ 'o-isActive': !messaging.rtc.currentRtcSession.isMute, 'o-isSmall p-2': isSmall, 'p-3': !isSmall }"
|
||||
t-att-aria-label="microphoneButtonTitle"
|
||||
t-att-title="microphoneButtonTitle"
|
||||
t-on-click="onClickMicrophone">
|
||||
<div class="o_CallActionListView_buttonIconWrapper fa-stack" t-att-class="{ 'o-isSmall': isSmall }">
|
||||
<i class="fa fa-stack-1x" t-att-class="{
|
||||
'fa-lg': !callActionListView.isSmall,
|
||||
'fa-lg': !isSmall,
|
||||
'fa-microphone': !messaging.rtc.currentRtcSession.isMute,
|
||||
'fa-microphone-slash': messaging.rtc.currentRtcSession.isMute,
|
||||
'text-danger': messaging.rtc.currentRtcSession.isMute,
|
||||
@@ -21,13 +20,13 @@
|
||||
</div>
|
||||
</button>
|
||||
<button class="o_CallActionListView_button btn d-flex m-1 border-0 rounded-circle shadow-none opacity-100 opacity-75-hover"
|
||||
t-att-class="{ 'o-isActive': !messaging.rtc.currentRtcSession.isDeaf, 'o-isSmall p-2': callActionListView.isSmall, 'p-3': !callActionListView.isSmall }"
|
||||
t-att-aria-label="callActionListView.headphoneButtonTitle"
|
||||
t-att-title="callActionListView.headphoneButtonTitle"
|
||||
t-on-click="callActionListView.onClickDeafen">
|
||||
<div class="o_CallActionListView_buttonIconWrapper fa-stack" t-att-class="{ 'o-isSmall': callActionListView.isSmall }">
|
||||
t-att-class="{ 'o-isActive': !messaging.rtc.currentRtcSession.isDeaf, 'o-isSmall p-2': isSmall, 'p-3': !isSmall }"
|
||||
t-att-aria-label="headphoneButtonTitle"
|
||||
t-att-title="headphoneButtonTitle"
|
||||
t-on-click="onClickDeafen">
|
||||
<div class="o_CallActionListView_buttonIconWrapper fa-stack" t-att-class="{ 'o-isSmall': isSmall }">
|
||||
<i class="fa fa-stack-1x" t-att-class="{
|
||||
'fa-lg': !callActionListView.isSmall,
|
||||
'fa-lg': !isSmall,
|
||||
'fa-headphones': !messaging.rtc.currentRtcSession.isDeaf,
|
||||
'fa-deaf': messaging.rtc.currentRtcSession.isDeaf,
|
||||
'text-danger': messaging.rtc.currentRtcSession.isDeaf,
|
||||
@@ -37,52 +36,52 @@
|
||||
<button class="o_CallActionListView_button o_CallActionListView_videoButton btn d-flex m-1 border-0 rounded-circle shadow-none opacity-100 opacity-75-hover"
|
||||
t-att-class="{
|
||||
'o-isActive': messaging.rtc.sendUserVideo,
|
||||
'o-isSmall p-2': callActionListView.isSmall,
|
||||
'p-3': !callActionListView.isSmall,
|
||||
'o-isSmall p-2': isSmall,
|
||||
'p-3': !isSmall,
|
||||
}"
|
||||
t-att-aria-label="callActionListView.cameraButtonTitle"
|
||||
t-att-title="callActionListView.cameraButtonTitle"
|
||||
t-on-click="callActionListView.onClickCamera">
|
||||
<div class="o_CallActionListView_buttonIconWrapper fa-stack" t-att-class="{ 'o-isSmall': callActionListView.isSmall }">
|
||||
<i class="fa fa-video-camera fa-stack-1x" t-att-class="{ 'fa-lg': !callActionListView.isSmall, 'text-success': messaging.rtc.sendUserVideo }"/>
|
||||
t-att-aria-label="cameraButtonTitle"
|
||||
t-att-title="cameraButtonTitle"
|
||||
t-on-click="onClickCamera">
|
||||
<div class="o_CallActionListView_buttonIconWrapper fa-stack" t-att-class="{ 'o-isSmall': isSmall }">
|
||||
<i class="fa fa-video-camera fa-stack-1x" t-att-class="{ 'fa-lg': !isSmall, 'text-success': messaging.rtc.sendUserVideo }"/>
|
||||
</div>
|
||||
</button>
|
||||
<t t-if="!messaging.device.isMobileDevice">
|
||||
<button class="o_CallActionListView_button o_CallActionListView_videoButton btn d-flex m-1 border-0 rounded-circle shadow-none opacity-100 opacity-75-hover"
|
||||
t-att-class="{
|
||||
'o-isActive': messaging.rtc.sendDisplay,
|
||||
'o-isSmall p-2': callActionListView.isSmall,
|
||||
'p-3': !callActionListView.isSmall,
|
||||
'o-isSmall p-2': isSmall,
|
||||
'p-3': !isSmall,
|
||||
}"
|
||||
t-att-aria-label="callActionListView.screenSharingButtonTitle"
|
||||
t-att-title="callActionListView.screenSharingButtonTitle"
|
||||
t-on-click="callActionListView.onClickScreen">
|
||||
<div class="o_CallActionListView_buttonIconWrapper fa-stack" t-att-class="{ 'o-isSmall': callActionListView.isSmall }">
|
||||
<i class="fa fa-desktop fa-stack-1x" t-att-class="{ 'fa-lg': !callActionListView.isSmall, 'text-success': messaging.rtc.sendDisplay }"/>
|
||||
t-att-aria-label="screenSharingButtonTitle"
|
||||
t-att-title="screenSharingButtonTitle"
|
||||
t-on-click="onClickScreen">
|
||||
<div class="o_CallActionListView_buttonIconWrapper fa-stack" t-att-class="{ 'o-isSmall': isSmall }">
|
||||
<i class="fa fa-desktop fa-stack-1x" t-att-class="{ 'fa-lg': !isSmall, 'text-success': messaging.rtc.sendDisplay }"/>
|
||||
</div>
|
||||
</button>
|
||||
</t>
|
||||
<t t-if="!callActionListView.callView.isFullScreen">
|
||||
<t t-if="!callView.isFullScreen">
|
||||
<button class="o_CallActionListView_button btn d-flex m-1 border-0 rounded-circle shadow-none opacity-100 opacity-75-hover"
|
||||
aria-label="Activate Full Screen"
|
||||
title="Activate Full Screen"
|
||||
t-att-class="{ 'o-isSmall p-2': callActionListView.isSmall, 'p-3': !callActionListView.isSmall }"
|
||||
t-on-click="callActionListView.callView.activateFullScreen"
|
||||
t-att-class="{ 'o-isSmall p-2': isSmall, 'p-3': !isSmall }"
|
||||
t-on-click="callView.activateFullScreen"
|
||||
>
|
||||
<div class="o_CallActionListView_buttonIconWrapper fa-stack" t-att-class="{ 'o-isSmall': callActionListView.isSmall }">
|
||||
<i class="fa fa-arrows-alt fa-stack-1x" t-att-class="{ 'fa-lg': !callActionListView.isSmall }"/>
|
||||
<div class="o_CallActionListView_buttonIconWrapper fa-stack" t-att-class="{ 'o-isSmall': isSmall }">
|
||||
<i class="fa fa-arrows-alt fa-stack-1x" t-att-class="{ 'fa-lg': !isSmall }"/>
|
||||
</div>
|
||||
</button>
|
||||
</t>
|
||||
<t t-if="callActionListView.callView.isFullScreen">
|
||||
<t t-if="callView.isFullScreen">
|
||||
<button class="o_CallActionListView_button btn d-flex m-1 border-0 rounded-circle shadow-none opacity-100 opacity-75-hover"
|
||||
aria-label="Deactivate Full Screen"
|
||||
title="Deactivate Full Screen"
|
||||
t-att-class="{ 'o-isSmall p-2': callActionListView.isSmall, 'p-3': !callActionListView.isSmall }"
|
||||
t-on-click="callActionListView.callView.deactivateFullScreen"
|
||||
t-att-class="{ 'o-isSmall p-2': isSmall, 'p-3': !isSmall }"
|
||||
t-on-click="callView.deactivateFullScreen"
|
||||
>
|
||||
<div class="o_CallActionListView_buttonIconWrapper fa-stack" t-att-class="{ 'o-isSmall': callActionListView.isSmall }">
|
||||
<i class="fa fa-compress fa-stack-1x" t-att-class="{ 'fa-lg': !callActionListView.isSmall }"/>
|
||||
<div class="o_CallActionListView_buttonIconWrapper fa-stack" t-att-class="{ 'o-isSmall': isSmall }">
|
||||
<i class="fa fa-compress fa-stack-1x" t-att-class="{ 'fa-lg': !isSmall }"/>
|
||||
</div>
|
||||
</button>
|
||||
</t>
|
||||
@@ -90,55 +89,54 @@
|
||||
<button class="o_CallActionListView_button btn d-flex m-1 border-0 rounded-circle shadow-none opacity-100 opacity-75-hover"
|
||||
aria-label="More"
|
||||
title="More"
|
||||
t-att-class="{ 'o-isSmall p-2': callActionListView.isSmall, 'p-3': !callActionListView.isSmall }"
|
||||
t-on-click="callActionListView.onClickMore"
|
||||
t-att-class="{ 'o-isSmall p-2': isSmall, 'p-3': !isSmall }"
|
||||
t-on-click="onClickMore"
|
||||
t-ref="moreButton"
|
||||
>
|
||||
<div class="o_CallActionListView_buttonIconWrapper fa-stack" t-att-class="{ 'o-isSmall': callActionListView.isSmall }">
|
||||
<i class="fa fa-ellipsis-h fa-stack-1x" t-att-class="{ 'fa-lg': !callActionListView.isSmall }"/>
|
||||
<div class="o_CallActionListView_buttonIconWrapper fa-stack" t-att-class="{ 'o-isSmall': isSmall }">
|
||||
<i class="fa fa-ellipsis-h fa-stack-1x" t-att-class="{ 'fa-lg': !isSmall }"/>
|
||||
</div>
|
||||
</button>
|
||||
</t>
|
||||
</t>
|
||||
<t t-if="!callActionListView.thread">
|
||||
<t t-if="!thread">
|
||||
<button class="o_CallActionListView_button o_CallActionListView_callToggle btn btn-success d-flex m-1 border-0 rounded-circle shadow-none"
|
||||
t-att-class="{ 'o-isSmall p-2': callActionListView.isSmall, 'p-3': !callActionListView.isSmall }"
|
||||
t-att-class="{ 'o-isSmall p-2': isSmall, 'p-3': !isSmall }"
|
||||
aria-label="Join Video Call"
|
||||
title="Join Video Call"
|
||||
t-att-disabled="callActionListView.thread.hasPendingRtcRequest"
|
||||
t-on-click="callActionListView.onClickToggleVideoCall">
|
||||
<div class="o_CallActionListView_buttonIconWrapper fa-stack" t-att-class="{ 'o-isSmall': callActionListView.isSmall }">
|
||||
<i class="fa fa-video-camera fa-stack-1x" t-att-class="{ 'fa-lg': !callActionListView.isSmall }"/>
|
||||
t-att-disabled="thread.hasPendingRtcRequest"
|
||||
t-on-click="onClickToggleVideoCall">
|
||||
<div class="o_CallActionListView_buttonIconWrapper fa-stack" t-att-class="{ 'o-isSmall': isSmall }">
|
||||
<i class="fa fa-video-camera fa-stack-1x" t-att-class="{ 'fa-lg': !isSmall }"/>
|
||||
</div>
|
||||
</button>
|
||||
</t>
|
||||
<t t-if="callActionListView.thread">
|
||||
<t t-if="callActionListView.thread.rtcInvitingSession and !callActionListView.thread.rtc">
|
||||
<t t-if="thread">
|
||||
<t t-if="thread.rtcInvitingSession and !thread.rtc">
|
||||
<button class="o_CallActionListView_button o_CallActionListView_callToggle o-isActive btn btn-danger d-flex m-1 border-0 rounded-circle shadow-none"
|
||||
t-att-class="{ 'o-isSmall p-2': callActionListView.isSmall, 'p-3': !callActionListView.isSmall }"
|
||||
t-att-class="{ 'o-isSmall p-2': isSmall, 'p-3': !isSmall }"
|
||||
aria-label="Reject"
|
||||
title="Reject"
|
||||
t-att-disabled="callActionListView.thread.hasPendingRtcRequest"
|
||||
t-on-click="callActionListView.onClickRejectCall">
|
||||
<div class="o_CallActionListView_buttonIconWrapper fa-stack" t-att-class="{ 'o-isSmall': callActionListView.isSmall }">
|
||||
<i class="fa fa-phone fa-stack-1x" t-att-class="{ 'fa-lg': !callActionListView.isSmall }"/>
|
||||
t-att-disabled="thread.hasPendingRtcRequest"
|
||||
t-on-click="onClickRejectCall">
|
||||
<div class="o_CallActionListView_buttonIconWrapper fa-stack" t-att-class="{ 'o-isSmall': isSmall }">
|
||||
<i class="fa fa-phone fa-stack-1x" t-att-class="{ 'fa-lg': !isSmall }"/>
|
||||
</div>
|
||||
</button>
|
||||
</t>
|
||||
<button class="o_CallActionListView_button o_CallActionListView_callToggle btn d-flex m-1 border-0 rounded-circle shadow-none"
|
||||
t-att-aria-label="callActionListView.callButtonTitle"
|
||||
t-att-class="{ 'o-isActive btn-danger': !!callActionListView.thread.rtc, 'o-isSmall p-2': callActionListView.isSmall, 'p-3': !callActionListView.isSmall, 'btn-success': !callActionListView.thread.rtc }"
|
||||
t-att-disabled="callActionListView.thread.hasPendingRtcRequest"
|
||||
t-att-title="callActionListView.callButtonTitle"
|
||||
t-on-click="callActionListView.onClickToggleAudioCall">
|
||||
<div class="o_CallActionListView_buttonIconWrapper fa-stack" t-att-class="{ 'o-isSmall': callActionListView.isSmall }">
|
||||
<i class="fa fa-phone fa-stack-1x" t-att-class="{ 'fa-lg': !callActionListView.isSmall }"/>
|
||||
t-att-aria-label="callButtonTitle"
|
||||
t-att-class="{ 'o-isActive btn-danger': !!thread.rtc, 'o-isSmall p-2': isSmall, 'p-3': !isSmall, 'btn-success': !thread.rtc }"
|
||||
t-att-disabled="thread.hasPendingRtcRequest"
|
||||
t-att-title="callButtonTitle"
|
||||
t-on-click="onClickToggleAudioCall">
|
||||
<div class="o_CallActionListView_buttonIconWrapper fa-stack" t-att-class="{ 'o-isSmall': isSmall }">
|
||||
<i class="fa fa-phone fa-stack-1x" t-att-class="{ 'fa-lg': !isSmall }"/>
|
||||
</div>
|
||||
</button>
|
||||
</t>
|
||||
</div>
|
||||
</div>
|
||||
</t>
|
||||
</t>
|
||||
|
||||
</templates>
|
||||
|
||||
@@ -2,24 +2,22 @@
|
||||
<templates xml:space="preserve">
|
||||
|
||||
<t t-name="mail.CallDemoView" owl="1">
|
||||
<t t-if="callDemoView">
|
||||
<div class="o_CallDemoView position-relative d-flex justify-content-center" t-attf-class="{{ className }}" t-ref="root">
|
||||
<video class="o_CallDemoView_videoDisplay shadow rounded bg-dark" height="480" width="640" autoplay="" t-ref="video"/>
|
||||
<p t-if="callDemoView.doesBrowserSupportMediaDevices and !callDemoView.isVideoEnabled" class="o_CallDemoView_mediaDevicesStatus position-absolute text-light">
|
||||
<p t-if="doesBrowserSupportMediaDevices and !isVideoEnabled" class="o_CallDemoView_mediaDevicesStatus position-absolute text-light">
|
||||
Camera is off
|
||||
</p>
|
||||
<p t-if="!callDemoView.doesBrowserSupportMediaDevices" class="o_CallDemoView_mediaDevicesStatus text-light">
|
||||
<p t-if="!doesBrowserSupportMediaDevices" class="o_CallDemoView_mediaDevicesStatus text-light">
|
||||
Your browser does not support videoconference
|
||||
</p>
|
||||
<div class="o_CallDemoView_buttonsContainer">
|
||||
<button t-if="!callDemoView.isMicrophoneEnabled" class="o_CallDemoView_enableMicrophoneButton o_CallDemoView_button btn btn-danger btn-lg rounded-circle p-0 m-3 fa fa-microphone-slash" t-on-click="callDemoView.onClickEnableMicrophoneButton"/>
|
||||
<button t-if="callDemoView.isMicrophoneEnabled" class="o_CallDemoView_disableMicrophoneButton o_CallDemoView_button btn btn-dark btn-lg p-0 m-3 rounded-circle border-light fa fa-microphone" t-on-click="callDemoView.onClickDisableMicrophoneButton"/>
|
||||
<button t-if="!callDemoView.isVideoEnabled" class="o_CallDemoView_enableVideoButton o_CallDemoView_button btn btn-danger btn-lg p-0 m-3 rounded-circle fa fa-eye-slash" t-on-click="callDemoView.onClickEnableVideoButton"/>
|
||||
<button t-if="callDemoView.isVideoEnabled" class="o_CallDemoView_disableVideoButton o_CallDemoView_button btn btn-dark btn-lg p-0 m-3 rounded-circle border-light fa fa-video-camera" t-on-click="callDemoView.onClickDisableVideoButton"/>
|
||||
<button t-if="!isMicrophoneEnabled" class="o_CallDemoView_enableMicrophoneButton o_CallDemoView_button btn btn-danger btn-lg rounded-circle p-0 m-3 fa fa-microphone-slash" t-on-click="onClickEnableMicrophoneButton"/>
|
||||
<button t-if="isMicrophoneEnabled" class="o_CallDemoView_disableMicrophoneButton o_CallDemoView_button btn btn-dark btn-lg p-0 m-3 rounded-circle border-light fa fa-microphone" t-on-click="onClickDisableMicrophoneButton"/>
|
||||
<button t-if="!isVideoEnabled" class="o_CallDemoView_enableVideoButton o_CallDemoView_button btn btn-danger btn-lg p-0 m-3 rounded-circle fa fa-eye-slash" t-on-click="onClickEnableVideoButton"/>
|
||||
<button t-if="isVideoEnabled" class="o_CallDemoView_disableVideoButton o_CallDemoView_button btn btn-dark btn-lg p-0 m-3 rounded-circle border-light fa fa-video-camera" t-on-click="onClickDisableVideoButton"/>
|
||||
</div>
|
||||
<audio class="o_CallDemoView_audioPlayer" autoplay="" t-ref="audio"/>
|
||||
</div>
|
||||
</t>
|
||||
</t>
|
||||
|
||||
</templates>
|
||||
|
||||
+6
-8
@@ -2,15 +2,14 @@
|
||||
<templates xml:space="preserve">
|
||||
|
||||
<t t-name="mail.CallInviteRequestPopup" owl="1">
|
||||
<t t-if="callInviteRequestPopup">
|
||||
<div class="o_CallInviteRequestPopup d-flex flex-column m-2 p-5 border border-dark rounded-1 bg-900" t-attf-class="{{ className }}" t-ref="root">
|
||||
<t t-if="callInviteRequestPopup.thread.rtcInvitingSession">
|
||||
<t t-if="thread.rtcInvitingSession">
|
||||
<div class="o_CallInviteRequestPopup_partnerInfo d-flex flex-column justify-content-around align-items-center text-nowrap">
|
||||
<img class="o_CallInviteRequestPopup_partnerInfoImage mb-2 rounded-circle cursor-pointer"
|
||||
t-att-src="callInviteRequestPopup.thread.rtcInvitingSession.channelMember.avatarUrl"
|
||||
t-on-click="callInviteRequestPopup.onClickAvatar"
|
||||
t-att-src="thread.rtcInvitingSession.channelMember.avatarUrl"
|
||||
t-on-click="onClickAvatar"
|
||||
alt="Avatar"/>
|
||||
<span class="o_CallInviteRequestPopup_partnerInfoName w-100 fw-bolder text-truncate text-center overflow-hidden" t-esc="callInviteRequestPopup.thread.rtcInvitingSession.channelMember.persona.name"/>
|
||||
<span class="o_CallInviteRequestPopup_partnerInfoName w-100 fw-bolder text-truncate text-center overflow-hidden" t-esc="thread.rtcInvitingSession.channelMember.persona.name"/>
|
||||
<span class="o_CallInviteRequestPopup_partnerInfoText fst-italic opacity-75">Incoming Call...</span>
|
||||
</div>
|
||||
</t>
|
||||
@@ -18,18 +17,17 @@
|
||||
<button class="o_CallInviteRequestPopup_buttonListButton o_CallInviteRequestPopup_buttonListRefuse p-2 rounded-circle border-0 bg-danger"
|
||||
aria-label="Refuse"
|
||||
title="Refuse"
|
||||
t-on-click="callInviteRequestPopup.onClickRefuse">
|
||||
t-on-click="onClickRefuse">
|
||||
<i class="o_CallInviteRequestPopup_buttonListButtonIcon fa fa-lg fa-times m-3"/>
|
||||
</button>
|
||||
<button class="o_CallInviteRequestPopup_buttonListButton o_CallInviteRequestPopup_buttonListAccept p-2 rounded-circle border-0 bg-success"
|
||||
aria-label="Accept"
|
||||
title="Accept"
|
||||
t-on-click="callInviteRequestPopup.onClickAccept">
|
||||
t-on-click="onClickAccept">
|
||||
<i class="o_CallInviteRequestPopup_buttonListButtonIcon fa fa-lg fa-phone m-3"/>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</t>
|
||||
</t>
|
||||
|
||||
</templates>
|
||||
|
||||
@@ -2,16 +2,15 @@
|
||||
<templates xml:space="preserve">
|
||||
|
||||
<t t-name="mail.CallMainView" owl="1">
|
||||
<t t-if="callMainView">
|
||||
<div class="o_CallMainView d-flex flex-grow-1 flex-column align-items-center justify-content-center position-relative bg-black-50" t-ref="root" t-on-mouseleave="callMainView.onMouseleave">
|
||||
<div class="o_CallMainView d-flex flex-grow-1 flex-column align-items-center justify-content-center position-relative bg-black-50" t-ref="root" t-on-mouseleave="onMouseleave">
|
||||
<div
|
||||
class="o_CallMainView_grid d-flex align-items-center overflow-hidden h-100 w-100 flex-wrap justify-content-center"
|
||||
t-attf-style="--height:{{callMainView.tileHeight}}px; --width:{{callMainView.tileWidth}}px;"
|
||||
t-on-click="callMainView.onClick"
|
||||
t-on-mousemove="callMainView.onMouseMove"
|
||||
t-attf-style="--height:{{tileHeight}}px; --width:{{tileWidth}}px;"
|
||||
t-on-click="onClick"
|
||||
t-on-mousemove="onMouseMove"
|
||||
t-ref="tileContainer"
|
||||
>
|
||||
<t t-foreach="callMainView.mainTiles" t-as="tile" t-key="'grid_tile_'+tile.localId">
|
||||
<t t-foreach="mainTiles" t-as="tile" t-key="'grid_tile_'+tile.localId">
|
||||
<CallParticipantCard
|
||||
className="'o_CallMainView_gridParticipantCard'"
|
||||
record="tile.participantCard"
|
||||
@@ -20,19 +19,18 @@
|
||||
</div>
|
||||
|
||||
<!-- Buttons -->
|
||||
<t t-if="callMainView.hasSidebarButton">
|
||||
<i t-if="callMainView.callView.isSidebarOpen" class="o_CallMainView_sidebarButton cursor-pointer position-absolute fa fa-arrow-right" title="Hide sidebar" t-on-click="callMainView.onClickHideSidebar"/>
|
||||
<i t-else="" class="o_CallMainView_sidebarButton cursor-pointer position-absolute fa fa-arrow-left" title="Show sidebar" t-on-click="callMainView.onClickShowSidebar"/>
|
||||
<t t-if="hasSidebarButton">
|
||||
<i t-if="callView.isSidebarOpen" class="o_CallMainView_sidebarButton cursor-pointer position-absolute fa fa-arrow-right" title="Hide sidebar" t-on-click="onClickHideSidebar"/>
|
||||
<i t-else="" class="o_CallMainView_sidebarButton cursor-pointer position-absolute fa fa-arrow-left" title="Show sidebar" t-on-click="onClickShowSidebar"/>
|
||||
</t>
|
||||
<t t-if="callMainView.showOverlay or !callMainView.isControllerFloating">
|
||||
<div class="o_CallMainView_controls d-flex justify-content-center w-100 pb-1" t-att-class="{ 'o-isFloating position-absolute bottom-0 pb-3': callMainView.isControllerFloating }">
|
||||
<div class="o_CallMainView_controlsOverlayContainer" t-on-mousemove="callMainView.onMouseMoveOverlay">
|
||||
<CallActionListView record="callMainView.callActionListView"/>
|
||||
<t t-if="showOverlay or !isControllerFloating">
|
||||
<div class="o_CallMainView_controls d-flex justify-content-center w-100 pb-1" t-att-class="{ 'o-isFloating position-absolute bottom-0 pb-3': isControllerFloating }">
|
||||
<div class="o_CallMainView_controlsOverlayContainer" t-on-mousemove="onMouseMoveOverlay">
|
||||
<CallActionListView record="callActionListView"/>
|
||||
</div>
|
||||
</div>
|
||||
</t>
|
||||
</div>
|
||||
</t>
|
||||
</t>
|
||||
|
||||
</templates>
|
||||
|
||||
@@ -2,14 +2,12 @@
|
||||
<templates xml:space="preserve">
|
||||
|
||||
<t t-name="mail.CallOptionMenu" owl="1">
|
||||
<t t-if="callOptionMenu">
|
||||
<div class="o_CallOptionMenu d-flex flex-column p-3" t-attf-class="{{ className }}" t-ref="root">
|
||||
<button class="o_CallOptionMenu_button btn d-flex align-items-center border-0 rounded text-800 fw-normal" t-on-click="callOptionMenu.onClickDownloadLogs">
|
||||
<button class="o_CallOptionMenu_button btn d-flex align-items-center border-0 rounded text-800 fw-normal" t-on-click="onClickDownloadLogs">
|
||||
<i class="o_CallOptionMenu_buttonIcon fa fa-lg fa-file-text-o m-1 p-1"/>
|
||||
<span class="o_CallOptionMenu_buttonText text-truncate">Download logs</span>
|
||||
</button>
|
||||
</div>
|
||||
</t>
|
||||
</t>
|
||||
|
||||
</templates>
|
||||
|
||||
@@ -2,71 +2,70 @@
|
||||
<templates xml:space="preserve">
|
||||
|
||||
<t t-name="mail.CallParticipantCard" owl="1">
|
||||
<t t-if="callParticipantCard">
|
||||
<div class="o_CallParticipantCard position-relative cursor-pointer d-flex flex-column align-items-center justify-content-center mh-100 mw-100 p-1 rounded-1"
|
||||
t-att-class="{
|
||||
'o-isTalking': !callParticipantCard.isMinimized and callParticipantCard.isTalking,
|
||||
'o-isInvitation opacity-50': !callParticipantCard.rtcSession,
|
||||
'o-isTalking': !isMinimized and isTalking,
|
||||
'o-isInvitation opacity-50': !rtcSession,
|
||||
}"
|
||||
t-att-title="callParticipantCard.channelMember.persona.name"
|
||||
t-att-aria-label="callParticipantCard.channelMember.persona.name"
|
||||
t-att-title="channelMember.persona.name"
|
||||
t-att-aria-label="channelMember.persona.name"
|
||||
t-attf-class="{{ className }}"
|
||||
t-on-click="callParticipantCard.onClick"
|
||||
t-on-contextmenu="callParticipantCard.onContextMenu"
|
||||
t-on-click="onClick"
|
||||
t-on-contextmenu="onContextMenu"
|
||||
t-ref="root"
|
||||
>
|
||||
<!-- card -->
|
||||
<t t-if="callParticipantCard.callParticipantVideoView">
|
||||
<CallParticipantVideoView record="callParticipantCard.callParticipantVideoView"/>
|
||||
<t t-if="callParticipantVideoView">
|
||||
<CallParticipantVideoView record="callParticipantVideoView"/>
|
||||
</t>
|
||||
<t t-else="">
|
||||
<div class="o_CallParticipantCard_avatarFrame d-flex align-items-center justify-content-center h-100 w-100 rounded-1" t-att-class="{ 'o-isMinimized': callParticipantCard.isMinimized }" draggable="false">
|
||||
<div class="o_CallParticipantCard_avatarFrame d-flex align-items-center justify-content-center h-100 w-100 rounded-1" t-att-class="{ 'o-isMinimized': isMinimized }" draggable="false">
|
||||
<img alt="Avatar"
|
||||
t-att-class="{
|
||||
'o-isTalking': callParticipantCard.isTalking,
|
||||
'o-isInvitation': !callParticipantCard.rtcSession,
|
||||
'o-isTalking': isTalking,
|
||||
'o-isInvitation': !rtcSession,
|
||||
}"
|
||||
class="o_CallParticipantCard_avatarImage h-100 rounded-circle border-5 o_object_fit_cover"
|
||||
t-att-src="callParticipantCard.channelMember.avatarUrl"
|
||||
t-att-src="channelMember.avatarUrl"
|
||||
draggable="false"
|
||||
/>
|
||||
</div>
|
||||
</t>
|
||||
|
||||
<t t-if="callParticipantCard.rtcSession">
|
||||
<t t-if="rtcSession">
|
||||
<!-- overlay -->
|
||||
<span class="o_CallParticipantCard_overlay o_CallParticipantCard_overlayBottom position-absolute bottom-0 start-0 d-flex overflow-hidden">
|
||||
<t t-if="!callParticipantCard.isMinimized">
|
||||
<span class="o_CallParticipantCard_name p-1 rounded-1 bg-black-75 text-truncate" t-esc="callParticipantCard.channelMember.persona.name"/>
|
||||
<t t-if="!isMinimized">
|
||||
<span class="o_CallParticipantCard_name p-1 rounded-1 bg-black-75 text-truncate" t-esc="channelMember.persona.name"/>
|
||||
</t>
|
||||
<t t-if="callParticipantCard.rtcSession.isScreenSharingOn and callParticipantCard.isMinimized and !callParticipantCard.rtcSession.channel.rtc">
|
||||
<t t-if="rtcSession.isScreenSharingOn and isMinimized and !rtcSession.channel.rtc">
|
||||
<small class="o_CallParticipantCard_liveIndicator o-isMinimized rounded-pill text-bg-danger d-flex align-items-center fw-bolder" title="live" aria-label="live">
|
||||
LIVE
|
||||
</small>
|
||||
</t>
|
||||
</span>
|
||||
<div class="o_CallParticipantCard_overlay o_CallParticipantCard_overlayTop position-absolute top-0 end-0 d-flex flex-row-reverse">
|
||||
<t t-if="callParticipantCard.rtcSession.isSelfMuted and !callParticipantCard.rtcSession.isDeaf">
|
||||
<span class="o_CallParticipantCard_overlayTopElement d-flex flex-column justify-content-center me-1 rounded-circle bg-900" t-att-class="{'o-isMinimized p-1': callParticipantCard.isMinimized, 'p-2': !callParticipantCard.isMinimized }" title="muted" aria-label="muted">
|
||||
<t t-if="rtcSession.isSelfMuted and !rtcSession.isDeaf">
|
||||
<span class="o_CallParticipantCard_overlayTopElement d-flex flex-column justify-content-center me-1 rounded-circle bg-900" t-att-class="{'o-isMinimized p-1': isMinimized, 'p-2': !isMinimized }" title="muted" aria-label="muted">
|
||||
<i class="fa fa-microphone-slash"/>
|
||||
</span>
|
||||
</t>
|
||||
<t t-if="callParticipantCard.rtcSession.isDeaf">
|
||||
<span class="o_CallParticipantCard_overlayTopElement d-flex flex-column justify-content-center me-1 rounded-circle bg-900" t-att-class="{'o-isMinimized p-1': callParticipantCard.isMinimized, 'p-2': !callParticipantCard.isMinimized }" title="deaf" aria-label="deaf">
|
||||
<t t-if="rtcSession.isDeaf">
|
||||
<span class="o_CallParticipantCard_overlayTopElement d-flex flex-column justify-content-center me-1 rounded-circle bg-900" t-att-class="{'o-isMinimized p-1': isMinimized, 'p-2': !isMinimized }" title="deaf" aria-label="deaf">
|
||||
<i class="fa fa-deaf"/>
|
||||
</span>
|
||||
</t>
|
||||
<t t-if="callParticipantCard.rtcSession.channel.rtc and callParticipantCard.rtcSession.isAudioInError">
|
||||
<t t-if="rtcSession.channel.rtc and rtcSession.isAudioInError">
|
||||
<span class="o_CallParticipantCard_overlayTopElement d-flex flex-column justify-content-center me-1 p-2 rounded-circle bg-900 text-danger" title="Issue with audio">
|
||||
<i class="fa fa-exclamation-triangle"/>
|
||||
</span>
|
||||
</t>
|
||||
<t t-if="callParticipantCard.rtcSession.channel.rtc and !callParticipantCard.rtcSession.rtcAsCurrentSession and !['connected', 'completed'].includes(callParticipantCard.rtcSession.connectionState)">
|
||||
<span class="o_CallParticipantCard_overlayTopElement d-flex flex-column justify-content-center me-1 p-2 rounded-circle bg-900" t-att-title="callParticipantCard.rtcSession.connectionState">
|
||||
<t t-if="rtcSession.channel.rtc and !rtcSession.rtcAsCurrentSession and !['connected', 'completed'].includes(rtcSession.connectionState)">
|
||||
<span class="o_CallParticipantCard_overlayTopElement d-flex flex-column justify-content-center me-1 p-2 rounded-circle bg-900" t-att-title="rtcSession.connectionState">
|
||||
<i class="fa fa-exclamation-triangle o_CallParticipantCard_connectionState text-warning"/>
|
||||
</span>
|
||||
</t>
|
||||
<t t-if="callParticipantCard.rtcSession.isScreenSharingOn and !callParticipantCard.isMinimized and !callParticipantCard.rtcSession.channel.rtc">
|
||||
<t t-if="rtcSession.isScreenSharingOn and !isMinimized and !rtcSession.channel.rtc">
|
||||
<span class="o_CallParticipantCard_liveIndicator rounded-pill text-bg-danger d-flex align-items-center me-1 fw-bolder" title="live" aria-label="live">
|
||||
LIVE
|
||||
</span>
|
||||
@@ -74,12 +73,11 @@
|
||||
</div>
|
||||
|
||||
<!-- volume popover -->
|
||||
<t t-if="!callParticipantCard.rtcSession.isOwnSession">
|
||||
<i class="o_CallParticipantCard_volumeMenuAnchor position-absolute bottom-0 start-50" t-on-click="callParticipantCard.onClickVolumeAnchor" t-ref="volumeMenuAnchor"/>
|
||||
<t t-if="!rtcSession.isOwnSession">
|
||||
<i class="o_CallParticipantCard_volumeMenuAnchor position-absolute bottom-0 start-50" t-on-click="onClickVolumeAnchor" t-ref="volumeMenuAnchor"/>
|
||||
</t>
|
||||
</t>
|
||||
</div>
|
||||
</t>
|
||||
</t>
|
||||
|
||||
</templates>
|
||||
|
||||
+4
-4
@@ -2,11 +2,11 @@
|
||||
<templates xml:space="preserve">
|
||||
<t t-name="mail.CallParticipantCardPopoverContentView" owl="1">
|
||||
<div class="d-flex flex-column p-3">
|
||||
<input type="range" min="0.0" max="1" step="0.01" t-att-value="callParticipantCardPopoverContentView.callParticipantCard.rtcSession.volume" t-on-change="callParticipantCardPopoverContentView.onChangeVolume" class="form-range"/>
|
||||
<t t-if="callParticipantCardPopoverContentView.hasConnectionInfo">
|
||||
<input type="range" min="0.0" max="1" step="0.01" t-att-value="callParticipantCard.rtcSession.volume" t-on-change="onChangeVolume" class="form-range"/>
|
||||
<t t-if="hasConnectionInfo">
|
||||
<hr class="o_CallParticipantCardPopoverContentView_volumeMenuAnchorSeparator w-100 border-top"/>
|
||||
<div t-esc="callParticipantCardPopoverContentView.inboundConnectionTypeText"/>
|
||||
<div t-esc="callParticipantCardPopoverContentView.outboundConnectionTypeText"/>
|
||||
<div t-esc="inboundConnectionTypeText"/>
|
||||
<div t-esc="outboundConnectionTypeText"/>
|
||||
</t>
|
||||
</div>
|
||||
</t>
|
||||
|
||||
@@ -2,16 +2,14 @@
|
||||
<templates xml:space="preserve">
|
||||
|
||||
<t t-name="mail.CallParticipantVideoView" owl="1">
|
||||
<t t-if="callParticipantVideoView">
|
||||
<video class="o_CallParticipantVideoView w-100 h-100 rounded-1 cursor-pointer"
|
||||
t-attf-class="{{ className }}"
|
||||
playsinline="true"
|
||||
autoplay="true"
|
||||
muted="true"
|
||||
t-on-loadedmetadata="callParticipantVideoView.onVideoLoadedMetaData"
|
||||
t-on-loadedmetadata="onVideoLoadedMetaData"
|
||||
t-ref="root"
|
||||
/>
|
||||
</t>
|
||||
</t>
|
||||
|
||||
</templates>
|
||||
|
||||
@@ -9,9 +9,9 @@
|
||||
<label class="o_CallSettingsMenu_optionLabel d-flex align-items-center flex-wrap mw-100 cursor-pointer" title="Input device" aria-label="Input device">
|
||||
<span class="o_CallSettingsMenuoptionName me-2 text-truncate">Input device</span>
|
||||
<div>
|
||||
<select name="inputDevice" class="o_CallSettingsMenu_optionDeviceSelect form-select" t-att-value="messaging.userSetting.audioInputDeviceId" t-on-change="callSettingsMenu.onChangeSelectAudioInput">
|
||||
<select name="inputDevice" class="o_CallSettingsMenu_optionDeviceSelect form-select" t-att-value="messaging.userSetting.audioInputDeviceId" t-on-change="onChangeSelectAudioInput">
|
||||
<option value="">Browser default</option>
|
||||
<t t-foreach="callSettingsMenu.userDevices" t-as="device" t-key="device_index">
|
||||
<t t-foreach="userDevices" t-as="device" t-key="device_index">
|
||||
<CallSettingsMenuDevice device="device"/>
|
||||
</t>
|
||||
</select>
|
||||
@@ -20,7 +20,7 @@
|
||||
</div>
|
||||
<div class="o_CallSettingsMenu_option mb-3 d-flex align-items-center flex-wrap">
|
||||
<label class="o_CallSettingsMenu_optionLabel o_CallSettingsMenu_pushToTalkOption d-flex align-items-center flex-wrap mw-100 cursor-pointer" title="Enable Push-to-talk" aria-label="Enable Push-to-talk">
|
||||
<input type="checkbox" aria-label="toggle push-to-talk" title="toggle push-to-talk" t-on-change="callSettingsMenu.onChangePushToTalk" t-att-checked="messaging.userSetting.usePushToTalk ? 'checked' : ''" class="form-check-input"/>
|
||||
<input type="checkbox" aria-label="toggle push-to-talk" title="toggle push-to-talk" t-on-change="onChangePushToTalk" t-att-checked="messaging.userSetting.usePushToTalk ? 'checked' : ''" class="form-check-input"/>
|
||||
<span class="o_CallSettingsMenu_optionName ms-2 text-truncate">Enable Push-to-talk</span>
|
||||
</label>
|
||||
</div>
|
||||
@@ -30,10 +30,10 @@
|
||||
<span class="o_CallSettingsMenu_optionName me-2 text-truncate">Push-to-talk key</span>
|
||||
<span class="o_CallSettingsMenu_optionPushToTalkGroup d-flex">
|
||||
<t t-if="messaging.userSetting.pushToTalkKey">
|
||||
<span class="o_CallSettingsMenu_optionPushToTalkGroupKey ms-1 px-3 border border-2 rounded fs-3" t-attf-class="{{ callSettingsMenu.userSetting.isRegisteringKey ? 'o-isRegistering border-danger' : 'border-primary' }}" t-esc="messaging.userSetting.pushToTalkKeyToString()"/>
|
||||
<span class="o_CallSettingsMenu_optionPushToTalkGroupKey ms-1 px-3 border border-2 rounded fs-3" t-attf-class="{{ userSetting.isRegisteringKey ? 'o-isRegistering border-danger' : 'border-primary' }}" t-esc="messaging.userSetting.pushToTalkKeyToString()"/>
|
||||
</t>
|
||||
<button class="o_CallSettingsMenu_button btn btn-link px-2 py-0 text-black" t-on-click="callSettingsMenu.onClickRegisterKeyButton">
|
||||
<t t-if="callSettingsMenu.userSetting.isRegisteringKey">
|
||||
<button class="o_CallSettingsMenu_button btn btn-link px-2 py-0 text-black" t-on-click="onClickRegisterKeyButton">
|
||||
<t t-if="userSetting.isRegisteringKey">
|
||||
<i title="Cancel" aria-label="Cancel" class="fa fa-2x fa-times-circle"/>
|
||||
</t>
|
||||
<t t-else="">
|
||||
@@ -44,12 +44,12 @@
|
||||
</label>
|
||||
|
||||
</div>
|
||||
<div t-if="callSettingsMenu.userSetting.isRegisteringKey">Press a key to register it as the push-to-talk shortcut</div>
|
||||
<div t-if="userSetting.isRegisteringKey">Press a key to register it as the push-to-talk shortcut</div>
|
||||
<div class="o_CallSettingsMenu_option mb-3 d-flex align-items-center flex-wrap">
|
||||
<label class="o_CallSettingsMenu_optionLabel o_CallSettingsMenu_pushToTalkDelayOption d-flex align-items-center flex-wrap mw-100 cursor-pointer" title="Delay after releasing push-to-talk" aria-label="Delay after releasing push-to-talk">
|
||||
<span class="o_CallSettingsMenu_optionName me-2 text-truncate">Delay after releasing push-to-talk</span>
|
||||
<div class="o_CallSettingsMenu_optionInputGroup d-flex w-100">
|
||||
<input class="o_CallSettingsMenu_optionInputGroupInput form-range" type="range" min="1" max="2000" step="1" t-att-value="messaging.userSetting.voiceActiveDuration" t-on-change="callSettingsMenu.onChangeDelay"/>
|
||||
<input class="o_CallSettingsMenu_optionInputGroupInput form-range" type="range" min="1" max="2000" step="1" t-att-value="messaging.userSetting.voiceActiveDuration" t-on-change="onChangeDelay"/>
|
||||
</div>
|
||||
</label>
|
||||
</div>
|
||||
@@ -59,7 +59,7 @@
|
||||
<label class="o_CallSettingsMenu_optionLabel o_CallSettingsMenu_voiceThresholdOption d-flex align-items-center flex-wrap mw-100 cursor-pointer" title="Voice detection threshold" aria-label="Voice detection threshold">
|
||||
<span class="o_CallSettingsMenu_optionName me-2 text-truncate">Voice detection threshold</span>
|
||||
<div class="o_CallSettingsMenu_optionInputGroup d-flex w-100">
|
||||
<input class="o_CallSettingsMenu_optionInputGroupInput form-range" type="range" min="0.001" max="1" step="0.001" t-att-value="messaging.userSetting.voiceActivationThreshold" t-on-change="callSettingsMenu.onChangeThreshold"/>
|
||||
<input class="o_CallSettingsMenu_optionInputGroupInput form-range" type="range" min="0.001" max="1" step="0.001" t-att-value="messaging.userSetting.voiceActivationThreshold" t-on-change="onChangeThreshold"/>
|
||||
</div>
|
||||
</label>
|
||||
</div>
|
||||
@@ -69,14 +69,14 @@
|
||||
<div class="o_CallSettingsMenu_categoryTitle py-2 fw-bolder text-700 text-truncate text-uppercase">Video Settings</div>
|
||||
<div class="o_CallSettingsMenu_option mb-3 d-flex align-items-center flex-wrap">
|
||||
<label class="o_CallSettingsMenu_optionLabel o_CallSettingsMenu_showOnlyVideoOption d-flex align-items-center flex-wrap mw-100 cursor-pointer" title="Show video participants only" aria-label="Show video participants only">
|
||||
<input type="checkbox" aria-label="toggle push-to-talk" title="Show video participants only" t-on-change="callSettingsMenu.onChangeVideoFilterCheckbox" t-att-checked="callSettingsMenu.thread.channel.showOnlyVideo ? 'checked' : ''" class="form-check-input"/>
|
||||
<input type="checkbox" aria-label="toggle push-to-talk" title="Show video participants only" t-on-change="onChangeVideoFilterCheckbox" t-att-checked="thread.channel.showOnlyVideo ? 'checked' : ''" class="form-check-input"/>
|
||||
<span class="o_CallSettingsMenu_optionName ms-2 text-truncate">Show video participants only</span>
|
||||
</label>
|
||||
</div>
|
||||
<t t-if="messaging.device.hasCanvasFilterSupport">
|
||||
<div class="o_CallSettingsMenu_option mb-3 d-flex align-items-center flex-wrap">
|
||||
<label class="o_CallSettingsMenu_optionLabel o_CallSettingsMenu_blurOption d-flex align-items-center flex-wrap mw-100 cursor-pointer" title="Blur video background" aria-label="Blur video background">
|
||||
<input type="checkbox" aria-label="Blur video background" title="Blur video background" t-on-change="callSettingsMenu.onChangeBlur" t-att-checked="messaging.userSetting.useBlur ? 'checked' : ''" class="form-check-input"/>
|
||||
<input type="checkbox" aria-label="Blur video background" title="Blur video background" t-on-change="onChangeBlur" t-att-checked="messaging.userSetting.useBlur ? 'checked' : ''" class="form-check-input"/>
|
||||
<span class="o_CallSettingsMenu_optionName ms-2 text-truncate">Blur video background</span>
|
||||
</label>
|
||||
</div>
|
||||
@@ -86,7 +86,7 @@
|
||||
<label class="o_CallSettingsMenu_optionLabel o_CallSettingsMenu_backgroundBlurIntensityOption d-flex align-items-center flex-wrap mw-100 cursor-pointer" title="Background blur intensity" aria-label="Background blur intensity">
|
||||
<span class="o_CallSettingsMenu_optionName me-2 text-truncate">Background blur intensity</span>
|
||||
<div class="o_CallSettingsMenu_optionInputGroup d-flex w-100">
|
||||
<input class="o_CallSettingsMenu_optionInputGroupInput form-range" type="range" min="0" max="20" step="1" t-att-value="messaging.userSetting.backgroundBlurAmount" t-on-change="callSettingsMenu.onChangeBackgroundBlurAmount"/>
|
||||
<input class="o_CallSettingsMenu_optionInputGroupInput form-range" type="range" min="0" max="20" step="1" t-att-value="messaging.userSetting.backgroundBlurAmount" t-on-change="onChangeBackgroundBlurAmount"/>
|
||||
</div>
|
||||
</label>
|
||||
</div>
|
||||
@@ -94,7 +94,7 @@
|
||||
<label class="o_CallSettingsMenu_optionLabel o_CallSettingsMenu_edgeBlurIntensityOption d-flex align-items-center flex-wrap mw-100 cursor-pointer" title="Edge blur intensity" aria-label="Edge blur intensity">
|
||||
<span class="o_CallSettingsMenu_optionName me-2 text-truncate">Edge blur intensity</span>
|
||||
<div class="o_CallSettingsMenu_optionInputGroup d-flex w-100">
|
||||
<input class="o_CallSettingsMenu_optionInputGroupInput form-range" type="range" min="0" max="20" step="1" t-att-value="messaging.userSetting.edgeBlurAmount" t-on-change="callSettingsMenu.onChangeEdgeBlurAmount"/>
|
||||
<input class="o_CallSettingsMenu_optionInputGroupInput form-range" type="range" min="0" max="20" step="1" t-att-value="messaging.userSetting.edgeBlurAmount" t-on-change="onChangeEdgeBlurAmount"/>
|
||||
</div>
|
||||
</label>
|
||||
</div>
|
||||
|
||||
@@ -2,16 +2,14 @@
|
||||
<templates xml:space="preserve">
|
||||
|
||||
<t t-name="mail.CallSidebarView" owl="1">
|
||||
<t t-if="callSidebarView">
|
||||
<div class="o_CallSidebarView d-flex align-items-center h-100 flex-column">
|
||||
<t t-foreach="callSidebarView.sidebarTiles" t-as="tile" t-key="tile.localId">
|
||||
<t t-foreach="sidebarTiles" t-as="tile" t-key="tile.localId">
|
||||
<CallParticipantCard
|
||||
className="'o_CallSidebarView_participantCard w-100'"
|
||||
record="tile.participantCard"
|
||||
/>
|
||||
</t>
|
||||
</div>
|
||||
</t>
|
||||
</t>
|
||||
|
||||
</templates>
|
||||
|
||||
@@ -2,15 +2,13 @@
|
||||
<templates xml:space="preserve">
|
||||
|
||||
<t t-name="mail.CallView" owl="1">
|
||||
<t t-if="callView">
|
||||
<div class="o_CallView d-flex" t-att-class="{'o-fullScreen fixed-top vw-100 vh-100': callView.isFullScreen, 'o-isMinimized': callView.isMinimized, 'position-relative': !callView.isFullScreen }" t-attf-class="{{ className }}" t-ref="root">
|
||||
<div class="o_CallView d-flex" t-att-class="{'o-fullScreen fixed-top vw-100 vh-100': isFullScreen, 'o-isMinimized': isMinimized, 'position-relative': !isFullScreen }" t-attf-class="{{ className }}" t-ref="root">
|
||||
<!-- Used to make the component depend on the window size and trigger an update when the window size changes. -->
|
||||
|
||||
<CallMainView record="callView.callMainView"/>
|
||||
<CallSidebarView t-if="callView.callSidebarView" record="callView.callSidebarView"/>
|
||||
<CallMainView record="callMainView"/>
|
||||
<CallSidebarView t-if="callSidebarView" record="callSidebarView"/>
|
||||
|
||||
</div>
|
||||
</t>
|
||||
</t>
|
||||
|
||||
</templates>
|
||||
|
||||
+14
-16
@@ -2,58 +2,56 @@
|
||||
<templates xml:space="preserve">
|
||||
|
||||
<t t-name="mail.ChannelInvitationForm" owl="1">
|
||||
<t t-if="channelInvitationForm">
|
||||
<div class="o_ChannelInvitationForm d-flex flex-column" t-attf-class="{{ className }}" t-ref="root">
|
||||
<h3 class="mx-3 mt-3 mb-2">Invite people</h3>
|
||||
<t t-if="!messaging.isCurrentUserGuest">
|
||||
<div class="mx-3 my-2">
|
||||
<input class="o_ChannelInvitationForm_searchInput form-control" type="text" t-att-value="channelInvitationForm.searchTerm" placeholder="Type the name of a person" t-on-input="channelInvitationForm.onInputSearch" t-ref="searchInput"/>
|
||||
<input class="o_ChannelInvitationForm_searchInput form-control" type="text" t-att-value="searchTerm" placeholder="Type the name of a person" t-on-input="onInputSearch" t-ref="searchInput"/>
|
||||
</div>
|
||||
<div class="d-flex flex-column flex-grow-1 mx-0 py-2 overflow-auto">
|
||||
<t t-foreach="channelInvitationForm.selectablePartnerViews" t-as="selectablePartnerView" t-key="selectablePartnerView.localId">
|
||||
<t t-foreach="selectablePartnerViews" t-as="selectablePartnerView" t-key="selectablePartnerView.localId">
|
||||
<ChannelInvitationFormSelectablePartnerView record="selectablePartnerView"/>
|
||||
</t>
|
||||
<t t-if="channelInvitationForm.selectablePartners.length === 0">
|
||||
<t t-if="selectablePartners.length === 0">
|
||||
<div class="mx-3">No user found that is not already a member of this channel.</div>
|
||||
</t>
|
||||
<t t-if="channelInvitationForm.searchResultCount > channelInvitationForm.selectablePartners.length">
|
||||
<t t-if="searchResultCount > selectablePartners.length">
|
||||
<div class="mx-3">
|
||||
Showing <t t-esc="channelInvitationForm.selectablePartners.length"/> results out of <t t-esc="channelInvitationForm.searchResultCount"/>. Narrow your search to see more choices.
|
||||
Showing <t t-esc="selectablePartners.length"/> results out of <t t-esc="searchResultCount"/>. Narrow your search to see more choices.
|
||||
</div>
|
||||
</t>
|
||||
</div>
|
||||
<t t-if="channelInvitationForm.selectedPartners.length > 0">
|
||||
<t t-if="selectedPartners.length > 0">
|
||||
<div class="mx-3 mt-3">
|
||||
<h4>Selected users:</h4>
|
||||
<div class="o_ChannelInvitationForm_selectedPartners overflow-auto">
|
||||
<t t-foreach="channelInvitationForm.selectedPartnerViews" t-as="selectedPartnerView" t-key="selectedPartnerView.localId">
|
||||
<t t-foreach="selectedPartnerViews" t-as="selectedPartnerView" t-key="selectedPartnerView.localId">
|
||||
<ChannelInvitationFormSelectedPartnerView record="selectedPartnerView"/>
|
||||
</t>
|
||||
</div>
|
||||
</div>
|
||||
</t>
|
||||
<div class="mx-3 mt-2 mb-3">
|
||||
<button class="o_ChannelInvitationForm_inviteButton btn btn-primary w-100" t-att-disabled="channelInvitationForm.selectedPartners.length === 0" t-on-click="channelInvitationForm.onClickInvite">
|
||||
<t t-esc="channelInvitationForm.inviteButtonText"/>
|
||||
<button class="o_ChannelInvitationForm_inviteButton btn btn-primary w-100" t-att-disabled="selectedPartners.length === 0" t-on-click="onClickInvite">
|
||||
<t t-esc="inviteButtonText"/>
|
||||
</button>
|
||||
</div>
|
||||
</t>
|
||||
<t t-if="channelInvitationForm.thread and channelInvitationForm.thread.invitationLink">
|
||||
<t t-if="thread and thread.invitationLink">
|
||||
<h4 class="mx-3 mt-3 mb-2">Invitation Link</h4>
|
||||
<div class="mx-3 mt-2 mb-3">
|
||||
<div class="input-group">
|
||||
<input class="form-control" type="text" t-att-value="channelInvitationForm.thread.invitationLink" readonly="" t-on-focus="channelInvitationForm.onFocusInvitationLinkInput" />
|
||||
<button class="btn btn-primary" t-on-click="channelInvitationForm.onClickCopy">
|
||||
<input class="form-control" type="text" t-att-value="thread.invitationLink" readonly="" t-on-focus="onFocusInvitationLinkInput" />
|
||||
<button class="btn btn-primary" t-on-click="onClickCopy">
|
||||
<i class="fa fa-copy"/>
|
||||
</button>
|
||||
</div>
|
||||
<t t-if="channelInvitationForm.accessRestrictedToGroupText">
|
||||
<div class="o_ChannelInvitationForm_accessRestrictedToGroup mt-2" t-esc="channelInvitationForm.accessRestrictedToGroupText"/>
|
||||
<t t-if="accessRestrictedToGroupText">
|
||||
<div class="o_ChannelInvitationForm_accessRestrictedToGroup mt-2" t-esc="accessRestrictedToGroupText"/>
|
||||
</t>
|
||||
</div>
|
||||
</t>
|
||||
</div>
|
||||
</t>
|
||||
</t>
|
||||
|
||||
</templates>
|
||||
|
||||
+6
-6
@@ -2,24 +2,24 @@
|
||||
<templates xml:space="preserve">
|
||||
|
||||
<t t-name="mail.ChannelInvitationFormSelectablePartnerView" owl="1">
|
||||
<div class="o_ChannelInvitationFormSelectablePartnerView d-flex align-items-center px-3 py-1 btn-light" t-on-click="() => channelInvitationFormSelectablePartnerView.channelInvitationFormOwner.onClickSelectablePartner(channelInvitationFormSelectablePartnerView.partner)" t-att-data-partner-id="channelInvitationFormSelectablePartnerView.partner.id" t-attf-class="{{ className }}" t-ref="root">
|
||||
<div class="o_ChannelInvitationFormSelectablePartnerView d-flex align-items-center px-3 py-1 btn-light" t-on-click="() => channelInvitationFormOwner.onClickSelectablePartner(partner)" t-att-data-partner-id="partner.id" t-attf-class="{{ className }}" t-ref="root">
|
||||
<div class="o_ChannelInvitationFormSelectablePartnerView_avatarContainer position-relative flex-shrink-0">
|
||||
<img class="o_ChannelInvitationFormSelectablePartnerView_avatar w-100 h-100 rounded-circle" t-att-src="channelInvitationFormSelectablePartnerView.partner.avatarUrl" alt="Avatar"/>
|
||||
<t t-if="channelInvitationFormSelectablePartnerView.personaImStatusIconView">
|
||||
<img class="o_ChannelInvitationFormSelectablePartnerView_avatar w-100 h-100 rounded-circle" t-att-src="partner.avatarUrl" alt="Avatar"/>
|
||||
<t t-if="personaImStatusIconView">
|
||||
<PersonaImStatusIconView
|
||||
className="'o_ChannelInvitationFormSelectablePartnerView_imStatusIcon position-absolute bottom-0 end-0 d-flex align-items-center justify-content-center text-white'"
|
||||
classNameObj="{
|
||||
'o_ChannelInvitationFormSelectablePartnerView_imStatusIcon-mobile': messaging.device.isSmall,
|
||||
'small' : !messaging.device.isSmall,
|
||||
}"
|
||||
record="channelInvitationFormSelectablePartnerView.personaImStatusIconView"
|
||||
record="personaImStatusIconView"
|
||||
/>
|
||||
</t>
|
||||
</div>
|
||||
<span class="o_ChannelInvitationFormSelectablePartnerView_name flex-grow-1 mx-2 text-truncate">
|
||||
<t t-esc="channelInvitationFormSelectablePartnerView.partner.nameOrDisplayName"/>
|
||||
<t t-esc="partner.nameOrDisplayName"/>
|
||||
</span>
|
||||
<input class="o_ChannelInvitationFormSelectablePartnerView_checkbox form-check-input flex-shrink-0" type="checkbox" t-att-checked="channelInvitationFormSelectablePartnerView.channelInvitationFormOwner.selectedPartners.includes(channelInvitationFormSelectablePartnerView.partner) ? 'checked' : undefined" t-on-input="ev => channelInvitationFormSelectablePartnerView.channelInvitationFormOwner.onInputPartnerCheckbox(channelInvitationFormSelectablePartnerView.partner, ev)" t-ref="selection-status"/>
|
||||
<input class="o_ChannelInvitationFormSelectablePartnerView_checkbox form-check-input flex-shrink-0" type="checkbox" t-att-checked="channelInvitationFormOwner.selectedPartners.includes(partner) ? 'checked' : undefined" t-on-input="ev => channelInvitationFormOwner.onInputPartnerCheckbox(partner, ev)" t-ref="selection-status"/>
|
||||
</div>
|
||||
</t>
|
||||
|
||||
|
||||
+2
-2
@@ -2,8 +2,8 @@
|
||||
<templates xml:space="preserve">
|
||||
|
||||
<t t-name="mail.ChannelInvitationFormSelectedPartnerView" owl="1">
|
||||
<button class="btn btn-secondary" t-on-click="() => channelInvitationFormSelectedPartnerView.channelInvitationFormOwner.onClickSelectedPartner(channelInvitationFormSelectedPartnerView.partner)">
|
||||
<t t-esc="channelInvitationFormSelectedPartnerView.partner.nameOrDisplayName"/> <i class="fa fa-times"/>
|
||||
<button class="btn btn-secondary" t-on-click="() => channelInvitationFormOwner.onClickSelectedPartner(partner)">
|
||||
<t t-esc="partner.nameOrDisplayName"/> <i class="fa fa-times"/>
|
||||
</button>
|
||||
</t>
|
||||
|
||||
|
||||
@@ -2,23 +2,23 @@
|
||||
<templates xml:space="preserve">
|
||||
|
||||
<t t-name="mail.ChannelMemberView" owl="1">
|
||||
<div class="o_ChannelMemberView d-flex align-items-center mx-2 p-2" t-att-class="{'cursor-pointer': channelMemberView.hasOpenChat}" t-attf-class="{{ className }}" t-att-data-partner-id="channelMemberView.channelMember.persona.partner and channelMemberView.channelMember.persona.partner.id" t-att-title="channelMemberView.memberTitleText" t-on-click="channelMemberView.onClickMember" t-ref="root">
|
||||
<div class="o_ChannelMemberView d-flex align-items-center mx-2 p-2" t-att-class="{'cursor-pointer': hasOpenChat}" t-attf-class="{{ className }}" t-att-data-partner-id="channelMember.persona.partner and channelMember.persona.partner.id" t-att-title="memberTitleText" t-on-click="onClickMember" t-ref="root">
|
||||
<div class="o_ChannelMemberView_avatarContainer position-relative flex-shrink-0">
|
||||
<img class="o_ChannelMemberView_avatar rounded-circle w-100 h-100" t-att-src="channelMemberView.channelMember.avatarUrl" alt="Avatar"/>
|
||||
<img class="o_ChannelMemberView_avatar rounded-circle w-100 h-100" t-att-src="channelMember.avatarUrl" alt="Avatar"/>
|
||||
|
||||
<t t-if="channelMemberView.personaImStatusIconView">
|
||||
<t t-if="personaImStatusIconView">
|
||||
<PersonaImStatusIconView
|
||||
className="'o_ChannelMemberView_personaImStatusIcon position-absolute bottom-0 end-0 d-flex align-items-center justify-content-center text-light'"
|
||||
classNameObj="{
|
||||
'o-isDeviceSmall': messaging.device.isSmall,
|
||||
'small': !messaging.device.isSmall,
|
||||
}"
|
||||
record="channelMemberView.personaImStatusIconView"
|
||||
record="personaImStatusIconView"
|
||||
/>
|
||||
</t>
|
||||
</div>
|
||||
<span class="o_ChannelMemberView_name ms-2 flex-column-1 text-truncate">
|
||||
<t t-esc="channelMemberView.channelMember.channel.thread.getMemberName(channelMemberView.channelMember.persona)"/>
|
||||
<t t-esc="channelMember.channel.thread.getMemberName(channelMember.persona)"/>
|
||||
</span>
|
||||
</div>
|
||||
</t>
|
||||
|
||||
@@ -2,27 +2,25 @@
|
||||
<templates xml:space="preserve">
|
||||
|
||||
<t t-name="mail.ChannelMemberListView" owl="1">
|
||||
<t t-if="channelMemberListView">
|
||||
<div class="o_ChannelMemberListView d-flex flex-column overflow-auto bg-light" t-attf-class="{{ className }}" t-ref="root">
|
||||
<t t-if="channelMemberListView.onlineCategoryView">
|
||||
<ChannelMemberListCategoryView record="channelMemberListView.onlineCategoryView"/>
|
||||
<t t-if="onlineCategoryView">
|
||||
<ChannelMemberListCategoryView record="onlineCategoryView"/>
|
||||
</t>
|
||||
<t t-if="channelMemberListView.offlineCategoryView">
|
||||
<ChannelMemberListCategoryView record="channelMemberListView.offlineCategoryView"/>
|
||||
<t t-if="offlineCategoryView">
|
||||
<ChannelMemberListCategoryView record="offlineCategoryView"/>
|
||||
</t>
|
||||
<t t-if="channelMemberListView.channel.unknownMemberCount === 1">
|
||||
<t t-if="channel.unknownMemberCount === 1">
|
||||
<span class="mx-2 mt-2">And 1 other member.</span>
|
||||
</t>
|
||||
<t t-if="channelMemberListView.channel.unknownMemberCount > 1">
|
||||
<span class="mx-2 mt-2">And <t t-esc="channelMemberListView.channel.unknownMemberCount"/> other members.</span>
|
||||
<t t-if="channel.unknownMemberCount > 1">
|
||||
<span class="mx-2 mt-2">And <t t-esc="channel.unknownMemberCount"/> other members.</span>
|
||||
</t>
|
||||
<t t-if="!channelMemberListView.channel.areAllMembersLoaded">
|
||||
<t t-if="!channel.areAllMembersLoaded">
|
||||
<div class="mx-2 my-1">
|
||||
<button class="o_ChannelMemberListView_loadMoreButton btn btn-secondary" t-on-click="channelMemberListView.onClickLoadMoreMembers">Load more</button>
|
||||
<button class="o_ChannelMemberListView_loadMoreButton btn btn-secondary" t-on-click="onClickLoadMoreMembers">Load more</button>
|
||||
</div>
|
||||
</t>
|
||||
</div>
|
||||
</t>
|
||||
</t>
|
||||
|
||||
</templates>
|
||||
|
||||
+2
-2
@@ -2,8 +2,8 @@
|
||||
<templates xml:space="preserve">
|
||||
|
||||
<t t-name="mail.ChannelMemberListCategoryView" owl="1">
|
||||
<h6 class="m-2" t-esc="record.title"/>
|
||||
<t t-foreach="record.channelMemberViews" t-as="channelMemberView" t-key="channelMemberView.localId">
|
||||
<h6 class="m-2" t-esc="title"/>
|
||||
<t t-foreach="channelMemberViews" t-as="channelMemberView" t-key="channelMemberView.localId">
|
||||
<ChannelMemberView record="channelMemberView"/>
|
||||
</t>
|
||||
</t>
|
||||
|
||||
@@ -2,74 +2,72 @@
|
||||
<templates xml:space="preserve">
|
||||
|
||||
<t t-name="mail.ChannelPreviewView" owl="1">
|
||||
<t t-if="channelPreviewView">
|
||||
<!--
|
||||
The preview template is used by the discuss in mobile, and by the systray
|
||||
menu in order to show preview of threads.
|
||||
-->
|
||||
<div class="o_NotificationListItem o_ChannelPreviewView d-flex flex-shrink-0 align-items-center p-1 cursor-pointer"
|
||||
t-att-class="{ 'o-muted': channelPreviewView.channel.localMessageUnreadCounter === 0 }"
|
||||
t-att-class="{ 'o-muted': channel.localMessageUnreadCounter === 0 }"
|
||||
t-attf-class="{{ className }}"
|
||||
t-on-click="channelPreviewView.onClick"
|
||||
t-att-data-channel-id="channelPreviewView.channel.id"
|
||||
t-on-click="onClick"
|
||||
t-att-data-channel-id="channel.id"
|
||||
t-ref="root"
|
||||
>
|
||||
<div class="o_NotificationListItem_sidebar o_ChannelPreviewView_sidebar m-1">
|
||||
<div class="o_NotificationListItem_imageContainer o_ChannelPreviewView_imageContainer o_ChannelPreviewView_sidebarItem position-relative">
|
||||
<img class="o_NotificationListItem_image o_ChannelPreviewView_image w-100 h-100 rounded-circle" t-att-src="channelPreviewView.imageUrl" alt="Thread Image"/>
|
||||
<t t-if="channelPreviewView.personaImStatusIconView">
|
||||
<img class="o_NotificationListItem_image o_ChannelPreviewView_image w-100 h-100 rounded-circle" t-att-src="imageUrl" alt="Thread Image"/>
|
||||
<t t-if="personaImStatusIconView">
|
||||
<PersonaImStatusIconView
|
||||
className="'o_NotificationListItem_personaImStatusIcon o_ChannelPreviewView_personaImStatusIcon position-absolute bottom-0 end-0 d-flex align-items-center justify-content-center'"
|
||||
classNameObj="{
|
||||
'o-isDeviceSmall': messaging.device.isSmall,
|
||||
'small': !messaging.device.isSmall,
|
||||
'o-muted': channelPreviewView.channel.localMessageUnreadCounter === 0,
|
||||
'o-muted': channel.localMessageUnreadCounter === 0,
|
||||
}"
|
||||
record="channelPreviewView.personaImStatusIconView"
|
||||
record="personaImStatusIconView"
|
||||
/>
|
||||
</t>
|
||||
</div>
|
||||
</div>
|
||||
<div class="o_NotificationListItem_content o_ChannelPreviewView_content d-flex flex-column flex-grow-1 align-self-start m-2">
|
||||
<div class="o_NotificationListItem_header o_ChannelPreviewView_header d-flex align-items-baseline">
|
||||
<span class="o_NotificationListItem_name o_ChannelPreviewView_name text-truncate fw-bold" t-att-class="{ 'o-isDeviceSmall fs-5': messaging.device.isSmall, 'o-muted text-600': channelPreviewView.channel.localMessageUnreadCounter === 0 }">
|
||||
<t t-esc="channelPreviewView.channel.displayName"/>
|
||||
<span class="o_NotificationListItem_name o_ChannelPreviewView_name text-truncate fw-bold" t-att-class="{ 'o-isDeviceSmall fs-5': messaging.device.isSmall, 'o-muted text-600': channel.localMessageUnreadCounter === 0 }">
|
||||
<t t-esc="channel.displayName"/>
|
||||
</span>
|
||||
<t t-if="channelPreviewView.channel.localMessageUnreadCounter > 1">
|
||||
<t t-if="channel.localMessageUnreadCounter > 1">
|
||||
<span class="o_NotificationListItem_counter o_ChannelPreviewView_counter mx-1 fw-bold">
|
||||
(<t t-esc="channelPreviewView.channel.localMessageUnreadCounter"/>)
|
||||
(<t t-esc="channel.localMessageUnreadCounter"/>)
|
||||
</span>
|
||||
</t>
|
||||
<t t-if="channelPreviewView.thread.rtcSessions.length > 0">
|
||||
<span class="o_ChannelPreviewView_callIndicator fa fa-volume-up mx-2" t-att-class="{ 'o-isCalling text-danger': channelPreviewView.thread.rtc }"/>
|
||||
<t t-if="thread.rtcSessions.length > 0">
|
||||
<span class="o_ChannelPreviewView_callIndicator fa fa-volume-up mx-2" t-att-class="{ 'o-isCalling text-danger': thread.rtc }"/>
|
||||
</t>
|
||||
<span class="flex-grow-1"/>
|
||||
<t t-if="channelPreviewView.thread.lastMessage and channelPreviewView.thread.lastMessage.date">
|
||||
<small class="o_NotificationListItem_date o_ChannelPreviewView_date flex-shrink-0 text-500" t-att-class="{ 'o-muted': channelPreviewView.channel.localMessageUnreadCounter === 0 }">
|
||||
<t t-esc="channelPreviewView.thread.lastMessage.momentDate.fromNow()"/>
|
||||
<t t-if="thread.lastMessage and thread.lastMessage.date">
|
||||
<small class="o_NotificationListItem_date o_ChannelPreviewView_date flex-shrink-0 text-500" t-att-class="{ 'o-muted': channel.localMessageUnreadCounter === 0 }">
|
||||
<t t-esc="thread.lastMessage.momentDate.fromNow()"/>
|
||||
</small>
|
||||
</t>
|
||||
</div>
|
||||
<div class="o_ChannelPreviewView_core d-flex align-items-baseline">
|
||||
<span class="o_NotificationListItem_coreItem o_NotificationListItem_inlineText o_ChannelPreviewView_coreItem o_ChannelPreviewView_inlineText me-2 text-truncate" t-att-class="{ 'o-empty': channelPreviewView.isEmpty }">
|
||||
<t t-if="channelPreviewView.lastTrackingValue">
|
||||
<TrackingValue value="channelPreviewView.lastTrackingValue"/>
|
||||
<span class="o_NotificationListItem_coreItem o_NotificationListItem_inlineText o_ChannelPreviewView_coreItem o_ChannelPreviewView_inlineText me-2 text-truncate" t-att-class="{ 'o-empty': isEmpty }">
|
||||
<t t-if="lastTrackingValue">
|
||||
<TrackingValue value="lastTrackingValue"/>
|
||||
</t>
|
||||
<t t-else="">
|
||||
<t t-if="channelPreviewView.messageAuthorPrefixView">
|
||||
<MessageAuthorPrefixView record="channelPreviewView.messageAuthorPrefixView"/>
|
||||
<t t-if="messageAuthorPrefixView">
|
||||
<MessageAuthorPrefixView record="messageAuthorPrefixView"/>
|
||||
</t>
|
||||
<span class="o_ChannelPreviewView_messageBody" t-esc="channelPreviewView.inlineLastMessageBody"/>
|
||||
<span class="o_ChannelPreviewView_messageBody" t-esc="inlineLastMessageBody"/>
|
||||
</t>
|
||||
</span>
|
||||
<span class="flex-grow-1"/>
|
||||
<t t-if="channelPreviewView.channel.localMessageUnreadCounter > 0">
|
||||
<span class="o_NotificationListItem_coreItem o_NotificationListItem_markAsRead o_ChannelPreviewView_coreItem o_ChannelPreviewView_markAsRead fa fa-check d-flex flex-shrink-0 ms-2 text-600 opacity-50 opacity-100-hover" title="Mark as Read" t-on-click="channelPreviewView.onClickMarkAsRead" t-ref="markAsRead"/>
|
||||
<t t-if="channel.localMessageUnreadCounter > 0">
|
||||
<span class="o_NotificationListItem_coreItem o_NotificationListItem_markAsRead o_ChannelPreviewView_coreItem o_ChannelPreviewView_markAsRead fa fa-check d-flex flex-shrink-0 ms-2 text-600 opacity-50 opacity-100-hover" title="Mark as Read" t-on-click="onClickMarkAsRead" t-ref="markAsRead"/>
|
||||
</t>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</t>
|
||||
</t>
|
||||
|
||||
</templates>
|
||||
|
||||
@@ -2,82 +2,80 @@
|
||||
<templates xml:space="preserve">
|
||||
|
||||
<t t-name="mail.ChatWindowHeaderView" owl="1">
|
||||
<t t-if="chatWindowHeaderView">
|
||||
<div class="o_ChatWindowHeaderView d-flex align-items-center" t-att-class="{ 'o-isDeviceSmall': messaging.device.isSmall, 'cursor-pointer': !messaging.device.isSmall }" t-attf-class="{{ className }}" t-on-click="chatWindowHeaderView.onClick" t-ref="root">
|
||||
<t t-if="chatWindowHeaderView.chatWindowOwner.hasCloseAsBackButton">
|
||||
<div class="o_ChatWindowHeaderView_command o_ChatWindowHeaderView_commandBack o_ChatWindowHeaderView_commandClose cursor-pointer d-flex align-items-center h-100 px-3 py-0 me-2" t-att-class="{ 'o-isDeviceSmall': messaging.device.isSmall }" t-on-click="chatWindowHeaderView.chatWindowOwner.onClickClose" title="Close conversation">
|
||||
<div class="o_ChatWindowHeaderView d-flex align-items-center" t-att-class="{ 'o-isDeviceSmall': messaging.device.isSmall, 'cursor-pointer': !messaging.device.isSmall }" t-attf-class="{{ className }}" t-on-click="onClick" t-ref="root">
|
||||
<t t-if="chatWindowOwner.hasCloseAsBackButton">
|
||||
<div class="o_ChatWindowHeaderView_command o_ChatWindowHeaderView_commandBack o_ChatWindowHeaderView_commandClose cursor-pointer d-flex align-items-center h-100 px-3 py-0 me-2" t-att-class="{ 'o-isDeviceSmall': messaging.device.isSmall }" t-on-click="chatWindowOwner.onClickClose" title="Close conversation">
|
||||
<i class="fa fa-arrow-left"/>
|
||||
</div>
|
||||
</t>
|
||||
<t t-if="chatWindowHeaderView.threadIconView">
|
||||
<t t-if="threadIconView">
|
||||
<ThreadIconView
|
||||
className="'o_ChatWindowHeaderView_icon o_ChatWindowHeaderView_item ms-3 me-1 my-0'"
|
||||
record="chatWindowHeaderView.threadIconView"
|
||||
record="threadIconView"
|
||||
/>
|
||||
</t>
|
||||
<div class="o_ChatWindowHeaderView_item o_ChatWindowHeaderView_name mh-100 mx-1 my-0 text-truncate" t-att-class="{'ms-3':!chatWindowHeaderView.chatWindowOwner.thread or !chatWindowHeaderView.chatWindowOwner.thread.channel}" t-att-title="chatWindowHeaderView.chatWindowOwner.name">
|
||||
<t t-esc="chatWindowHeaderView.chatWindowOwner.name"/>
|
||||
<div class="o_ChatWindowHeaderView_item o_ChatWindowHeaderView_name mh-100 mx-1 my-0 text-truncate" t-att-class="{'ms-3':!chatWindowOwner.thread or !chatWindowOwner.thread.channel}" t-att-title="chatWindowOwner.name">
|
||||
<t t-esc="chatWindowOwner.name"/>
|
||||
</div>
|
||||
<t t-if="chatWindowHeaderView.chatWindowOwner.thread and chatWindowHeaderView.chatWindowOwner.thread.channel and chatWindowHeaderView.chatWindowOwner.thread.channel.localMessageUnreadCounter > 0">
|
||||
<t t-if="chatWindowOwner.thread and chatWindowOwner.thread.channel and chatWindowOwner.thread.channel.localMessageUnreadCounter > 0">
|
||||
<div class="o_ChatWindowHeaderView_counter o_ChatWindowHeaderView_item mx-1 my-0">
|
||||
(<t t-esc="chatWindowHeaderView.chatWindowOwner.thread.channel.localMessageUnreadCounter"/>)
|
||||
(<t t-esc="chatWindowOwner.thread.channel.localMessageUnreadCounter"/>)
|
||||
</div>
|
||||
</t>
|
||||
<div class="flex-grow-1"/>
|
||||
<div class="o_ChatWindowHeaderView_item o_ChatWindowHeaderView_rightArea d-flex align-items-center h-100 ms-1 me-0 my-0" t-att-class="{'opacity-75 opacity-100-hover': !messaging.device.isSmall }">
|
||||
<t t-if="chatWindowHeaderView.chatWindowOwner.hasCallButtons">
|
||||
<div class="o_ChatWindowHeaderView_command o_ChatWindowHeaderView_commandCamera cursor-pointer d-flex align-items-center h-100 px-3 py-0 m-0" t-att-class="{ 'o-isDeviceSmall': messaging.device.isSmall, 'opacity-50 opacity-100-hover': !messaging.device.isSmall }" t-att-disabled="chatWindowHeaderView.chatWindowOwner.thread.hasPendingRtcRequest" t-on-click="chatWindowHeaderView.chatWindowOwner.onClickCamera" title="Start a Video Call">
|
||||
<t t-if="chatWindowOwner.hasCallButtons">
|
||||
<div class="o_ChatWindowHeaderView_command o_ChatWindowHeaderView_commandCamera cursor-pointer d-flex align-items-center h-100 px-3 py-0 m-0" t-att-class="{ 'o-isDeviceSmall': messaging.device.isSmall, 'opacity-50 opacity-100-hover': !messaging.device.isSmall }" t-att-disabled="chatWindowOwner.thread.hasPendingRtcRequest" t-on-click="chatWindowOwner.onClickCamera" title="Start a Video Call">
|
||||
<i class="fa fa-video-camera"/>
|
||||
</div>
|
||||
<div class="o_ChatWindowHeaderView_command o_ChatWindowHeaderView_commandPhone cursor-pointer d-flex align-items-center h-100 px-3 py-0 m-0" t-att-class="{ 'o-isDeviceSmall': messaging.device.isSmall, 'opacity-50 opacity-100-hover': !messaging.device.isSmall }" t-att-disabled="chatWindowHeaderView.chatWindowOwner.thread.hasPendingRtcRequest" t-on-click="chatWindowHeaderView.chatWindowOwner.onClickPhone" title="Start a Call">
|
||||
<div class="o_ChatWindowHeaderView_command o_ChatWindowHeaderView_commandPhone cursor-pointer d-flex align-items-center h-100 px-3 py-0 m-0" t-att-class="{ 'o-isDeviceSmall': messaging.device.isSmall, 'opacity-50 opacity-100-hover': !messaging.device.isSmall }" t-att-disabled="chatWindowOwner.thread.hasPendingRtcRequest" t-on-click="chatWindowOwner.onClickPhone" title="Start a Call">
|
||||
<i class="fa fa-phone"/>
|
||||
</div>
|
||||
</t>
|
||||
<t t-if="chatWindowHeaderView.chatWindowOwner.hasInviteFeature">
|
||||
<t t-if="!chatWindowHeaderView.chatWindowOwner.channelInvitationForm">
|
||||
<div class="o_ChatWindowHeaderView_command cursor-pointer d-flex align-items-center h-100 px-3 py-0 m-0" t-att-class="{ 'opacity-50 opacity-100-hover': !messaging.device.isSmall }" title="Add users" t-on-click="chatWindowHeaderView.chatWindowOwner.onClickShowInviteForm">
|
||||
<t t-if="chatWindowOwner.hasInviteFeature">
|
||||
<t t-if="!chatWindowOwner.channelInvitationForm">
|
||||
<div class="o_ChatWindowHeaderView_command cursor-pointer d-flex align-items-center h-100 px-3 py-0 m-0" t-att-class="{ 'opacity-50 opacity-100-hover': !messaging.device.isSmall }" title="Add users" t-on-click="chatWindowOwner.onClickShowInviteForm">
|
||||
<i class="fa fa-lg fa-user-plus"/>
|
||||
</div>
|
||||
</t>
|
||||
<t t-if="chatWindowHeaderView.chatWindowOwner.channelInvitationForm">
|
||||
<div class="o_ChatWindowHeaderView_command cursor-pointer d-flex align-items-center h-100 px-3 py-0 m-0" t-att-class="{ 'opacity-50 opacity-100-hover': !messaging.device.isSmall }" title="Stop adding users" t-on-click="chatWindowHeaderView.chatWindowOwner.onClickHideInviteForm">
|
||||
<t t-if="chatWindowOwner.channelInvitationForm">
|
||||
<div class="o_ChatWindowHeaderView_command cursor-pointer d-flex align-items-center h-100 px-3 py-0 m-0" t-att-class="{ 'opacity-50 opacity-100-hover': !messaging.device.isSmall }" title="Stop adding users" t-on-click="chatWindowOwner.onClickHideInviteForm">
|
||||
<i class="fa fa-lg fa-user-plus"/>
|
||||
</div>
|
||||
</t>
|
||||
</t>
|
||||
<t t-if="chatWindowHeaderView.chatWindowOwner.thread and chatWindowHeaderView.chatWindowOwner.thread.hasMemberListFeature and !chatWindowHeaderView.chatWindowOwner.isMemberListOpened">
|
||||
<div class="o_ChatWindowHeaderView_command o_ChatWindowHeaderView_commandShowMemberList cursor-pointer d-flex align-items-center h-100 px-3 py-0 m-0" t-att-class="{ 'o-isDeviceSmall': messaging.device.isSmall, 'opacity-50 opacity-100-hover': !messaging.device.isSmall}" title="Show Member List" t-on-click="chatWindowHeaderView.chatWindowOwner.onClickShowMemberList">
|
||||
<t t-if="chatWindowOwner.thread and chatWindowOwner.thread.hasMemberListFeature and !chatWindowOwner.isMemberListOpened">
|
||||
<div class="o_ChatWindowHeaderView_command o_ChatWindowHeaderView_commandShowMemberList cursor-pointer d-flex align-items-center h-100 px-3 py-0 m-0" t-att-class="{ 'o-isDeviceSmall': messaging.device.isSmall, 'opacity-50 opacity-100-hover': !messaging.device.isSmall}" title="Show Member List" t-on-click="chatWindowOwner.onClickShowMemberList">
|
||||
<i class="fa fa-users"/>
|
||||
</div>
|
||||
</t>
|
||||
<t t-if="chatWindowHeaderView.chatWindowOwner.thread and chatWindowHeaderView.chatWindowOwner.thread.hasMemberListFeature and chatWindowHeaderView.chatWindowOwner.isMemberListOpened">
|
||||
<div class="o_ChatWindowHeaderView_command o_ChatWindowHeaderView_commandHideMemberList cursor-pointer d-flex align-items-center h-100 px-3 py-0 m-0" t-att-class="{ 'o-isDeviceSmall': messaging.device.isSmall, 'opacity-50 opacity-100-hover': !messaging.device.isSmall }" title="Hide Member List" t-on-click="chatWindowHeaderView.chatWindowOwner.onClickHideMemberList">
|
||||
<t t-if="chatWindowOwner.thread and chatWindowOwner.thread.hasMemberListFeature and chatWindowOwner.isMemberListOpened">
|
||||
<div class="o_ChatWindowHeaderView_command o_ChatWindowHeaderView_commandHideMemberList cursor-pointer d-flex align-items-center h-100 px-3 py-0 m-0" t-att-class="{ 'o-isDeviceSmall': messaging.device.isSmall, 'opacity-50 opacity-100-hover': !messaging.device.isSmall }" title="Hide Member List" t-on-click="chatWindowOwner.onClickHideMemberList">
|
||||
<i class="fa fa-users"/>
|
||||
</div>
|
||||
</t>
|
||||
<t t-if="chatWindowHeaderView.chatWindowOwner.thread and chatWindowHeaderView.chatWindowOwner.thread.hasCallFeature and !chatWindowHeaderView.chatWindowOwner.isCallSettingsMenuOpen">
|
||||
<div class="o_ChatWindowHeaderView_command o_ChatWindowHeaderView_commandShowCallSettingsMenu cursor-pointer d-flex align-items-center h-100 px-3 py-0 m-0" t-att-class="{ 'o-isDeviceSmall': messaging.device.isSmall, 'opacity-50 opacity-100-hover': !messaging.device.isSmall}" title="Show Member List" t-on-click="chatWindowHeaderView.chatWindowOwner.onClickShowCallSettingsMenu">
|
||||
<t t-if="chatWindowOwner.thread and chatWindowOwner.thread.hasCallFeature and !chatWindowOwner.isCallSettingsMenuOpen">
|
||||
<div class="o_ChatWindowHeaderView_command o_ChatWindowHeaderView_commandShowCallSettingsMenu cursor-pointer d-flex align-items-center h-100 px-3 py-0 m-0" t-att-class="{ 'o-isDeviceSmall': messaging.device.isSmall, 'opacity-50 opacity-100-hover': !messaging.device.isSmall}" title="Show Member List" t-on-click="chatWindowOwner.onClickShowCallSettingsMenu">
|
||||
<i class="fa fa-gear"/>
|
||||
</div>
|
||||
</t>
|
||||
<t t-if="chatWindowHeaderView.chatWindowOwner.thread and chatWindowHeaderView.chatWindowOwner.thread.hasCallFeature and chatWindowHeaderView.chatWindowOwner.isCallSettingsMenuOpen">
|
||||
<div class="o_ChatWindowHeaderView_command cursor-pointer d-flex align-items-center h-100 px-3 py-0 m-0" t-att-class="{ 'o-isDeviceSmall': messaging.device.isSmall, 'opacity-50 opacity-100-hover': !messaging.device.isSmall }" title="Hide Member List" t-on-click="chatWindowHeaderView.chatWindowOwner.onClickHideCallSettingsMenu">
|
||||
<t t-if="chatWindowOwner.thread and chatWindowOwner.thread.hasCallFeature and chatWindowOwner.isCallSettingsMenuOpen">
|
||||
<div class="o_ChatWindowHeaderView_command cursor-pointer d-flex align-items-center h-100 px-3 py-0 m-0" t-att-class="{ 'o-isDeviceSmall': messaging.device.isSmall, 'opacity-50 opacity-100-hover': !messaging.device.isSmall }" title="Hide Member List" t-on-click="chatWindowOwner.onClickHideCallSettingsMenu">
|
||||
<i class="fa fa-gear"/>
|
||||
</div>
|
||||
</t>
|
||||
<t t-if="chatWindowHeaderView.chatWindowOwner.isExpandable">
|
||||
<div class="o_ChatWindowHeaderView_command o_ChatWindowHeaderView_commandExpand cursor-pointer d-flex align-items-center h-100 px-3 py-0 m-0" t-att-class="{ 'o-isDeviceSmall': messaging.device.isSmall, 'opacity-50 opacity-100-hover': !messaging.device.isSmall }" t-on-click="chatWindowHeaderView.chatWindowOwner.onClickExpand" title="Open in Discuss">
|
||||
<t t-if="chatWindowOwner.isExpandable">
|
||||
<div class="o_ChatWindowHeaderView_command o_ChatWindowHeaderView_commandExpand cursor-pointer d-flex align-items-center h-100 px-3 py-0 m-0" t-att-class="{ 'o-isDeviceSmall': messaging.device.isSmall, 'opacity-50 opacity-100-hover': !messaging.device.isSmall }" t-on-click="chatWindowOwner.onClickExpand" title="Open in Discuss">
|
||||
<i class="fa fa-expand"/>
|
||||
</div>
|
||||
</t>
|
||||
<t t-if="!chatWindowHeaderView.chatWindowOwner.hasCloseAsBackButton">
|
||||
<div class="o_ChatWindowHeaderView_command o_ChatWindowHeaderView_commandClose cursor-pointer d-flex align-items-center h-100 px-3 py-0 m-0" t-att-class="{ 'o-isDeviceSmall': messaging.device.isSmall, 'opacity-50 opacity-100-hover': !messaging.device.isSmall }" t-on-click="chatWindowHeaderView.chatWindowOwner.onClickClose" title="Close chat window">
|
||||
<t t-if="!chatWindowOwner.hasCloseAsBackButton">
|
||||
<div class="o_ChatWindowHeaderView_command o_ChatWindowHeaderView_commandClose cursor-pointer d-flex align-items-center h-100 px-3 py-0 m-0" t-att-class="{ 'o-isDeviceSmall': messaging.device.isSmall, 'opacity-50 opacity-100-hover': !messaging.device.isSmall }" t-on-click="chatWindowOwner.onClickClose" title="Close chat window">
|
||||
<i class="fa fa-close"/>
|
||||
</div>
|
||||
</t>
|
||||
</div>
|
||||
</div>
|
||||
</t>
|
||||
</t>
|
||||
|
||||
</templates>
|
||||
|
||||
+3
-3
@@ -3,14 +3,14 @@
|
||||
|
||||
<t t-name="mail.ChatWindowHiddenMenuView" owl="1">
|
||||
<div class="o_ChatWindowHiddenMenuView dropup position-fixed bottom-0 align-items-stretch d-flex px-2 py-1 rounded-top-3 bg-900 cursor-pointer" t-attf-class="{{ className }}" t-ref="root">
|
||||
<div class="o_ChatWindowHiddenMenuView_dropdownToggle dropdown-toggle justify-content-center align-items-center flex-grow-1 d-flex mw-100" t-att-class="{ 'show opacity-50': chatWindowHiddenMenuView.isOpen }" data-bs-toggle="dropdown" t-on-click="messaging.chatWindowManager.onClickHiddenMenuToggler">
|
||||
<div class="o_ChatWindowHiddenMenuView_dropdownToggle dropdown-toggle justify-content-center align-items-center flex-grow-1 d-flex mw-100" t-att-class="{ 'show opacity-50': isOpen }" data-bs-toggle="dropdown" t-on-click="messaging.chatWindowManager.onClickHiddenMenuToggler">
|
||||
<div class="o_ChatWindowHiddenMenuView_dropdownToggleIcon o_ChatWindowHiddenMenuView_dropdownToggleItem me-1 fa fa-comments-o"/>
|
||||
<div class="o_ChatWindowHiddenMenuView_dropdownToggleItem o_ChatWindowHiddenMenuView_windowCounter mx-1 text-truncate">
|
||||
<t t-esc="messaging.chatWindowManager.allOrderedHidden.length"/>
|
||||
</div>
|
||||
</div>
|
||||
<ul class="o_ChatWindowHiddenMenuView_list dropdown-menu dropdown-menu-end m-0 p-0 overflow-auto" t-att-class="{ show: chatWindowHiddenMenuView.isOpen }" role="menu" t-ref="list">
|
||||
<t t-foreach="chatWindowHiddenMenuView.items" t-as="item" t-key="item.localId">
|
||||
<ul class="o_ChatWindowHiddenMenuView_list dropdown-menu dropdown-menu-end m-0 p-0 overflow-auto" t-att-class="{ show: isOpen }" role="menu" t-ref="list">
|
||||
<t t-foreach="items" t-as="item" t-key="item.localId">
|
||||
<ChatWindowHiddenMenuItemView record="item"/>
|
||||
</t>
|
||||
</ul>
|
||||
|
||||
+2
-2
@@ -2,10 +2,10 @@
|
||||
<templates xml:space="preserve">
|
||||
|
||||
<t t-name="mail.ChatWindowHiddenMenuItemView" owl="1">
|
||||
<li class="o_ChatWindowHiddenMenuItemView" t-att-class="{ 'border-bottom' : !chatWindowHiddenMenuItemView.isLast }" role="menuitem" t-attf-class="{{ className }}" t-ref="root">
|
||||
<li class="o_ChatWindowHiddenMenuItemView" t-att-class="{ 'border-bottom' : !isLast }" role="menuitem" t-attf-class="{{ className }}" t-ref="root">
|
||||
<ChatWindowHeaderView
|
||||
className="'o_ChatWindowHiddenMenuItemView_chatWindowHeader opacity-100-hover'"
|
||||
record="chatWindowHiddenMenuItemView.chatWindowHeaderView"
|
||||
record="chatWindowHeaderView"
|
||||
/>
|
||||
</li>
|
||||
</t>
|
||||
|
||||
@@ -2,31 +2,30 @@
|
||||
<templates xml:space="preserve">
|
||||
|
||||
<t t-name="mail.ChatterTopbar" owl="1">
|
||||
<t t-if="chatterTopbar">
|
||||
<div class="o_ChatterTopbar justify-content-between d-flex" t-attf-class="{{ className }}" t-ref="root">
|
||||
<div class="o_ChatterTopbar_actions flex-fill d-flex border-transparent">
|
||||
<div class="o_ChatterTopbar_controllers d-flex pe-2" t-if="chatterTopbar.chatter.threadView">
|
||||
<div class="o_ChatterTopbar_controllers d-flex pe-2" t-if="chatter.threadView">
|
||||
<button class="o_ChatterTopbar_button o_ChatterTopbar_buttonSendMessage btn text-nowrap me-2"
|
||||
type="button"
|
||||
t-att-class="{
|
||||
'o-active btn-odoo': chatterTopbar.chatter.composerView and !chatterTopbar.chatter.composerView.composer.isLog,
|
||||
'btn-odoo': !chatterTopbar.chatter.composerView,
|
||||
'btn-light': chatterTopbar.chatter.composerView and chatterTopbar.chatter.composerView.composer.isLog,
|
||||
'o-active btn-odoo': chatter.composerView and !chatter.composerView.composer.isLog,
|
||||
'btn-odoo': !chatter.composerView,
|
||||
'btn-light': chatter.composerView and chatter.composerView.composer.isLog,
|
||||
}"
|
||||
t-att-disabled="!chatterTopbar.chatter.hasWriteAccess"
|
||||
t-att-disabled="!chatter.hasWriteAccess"
|
||||
data-hotkey="m"
|
||||
t-on-click="chatterTopbar.chatter.onClickSendMessage"
|
||||
t-on-click="chatter.onClickSendMessage"
|
||||
>
|
||||
Send message
|
||||
</button>
|
||||
<button class="o_ChatterTopbar_button o_ChatterTopbar_buttonLogNote btn text-nowrap"
|
||||
type="button"
|
||||
t-att-class="{
|
||||
'o-active btn-odoo': chatterTopbar.chatter.composerView and chatterTopbar.chatter.composerView.composer.isLog,
|
||||
'btn-light': chatterTopbar.chatter.composerView and !chatterTopbar.chatter.composerView.composer.isLog or !chatterTopbar.chatter.composerView,
|
||||
'o-active btn-odoo': chatter.composerView and chatter.composerView.composer.isLog,
|
||||
'btn-light': chatter.composerView and !chatter.composerView.composer.isLog or !chatter.composerView,
|
||||
}"
|
||||
t-att-disabled="!chatterTopbar.chatter.hasWriteAccess"
|
||||
t-on-click="chatterTopbar.chatter.onClickLogNote"
|
||||
t-att-disabled="!chatter.hasWriteAccess"
|
||||
t-on-click="chatter.onClickLogNote"
|
||||
data-hotkey="shift+m"
|
||||
>
|
||||
Log note
|
||||
@@ -34,58 +33,57 @@
|
||||
</div>
|
||||
<div class="o_ChatterTopbar_tools position-relative d-flex flex-grow-1 border-bottom"
|
||||
t-att-class="{
|
||||
'border-start ps-2': chatterTopbar.chatter.hasActivities,
|
||||
'border-start ps-2': chatter.hasActivities,
|
||||
}"
|
||||
>
|
||||
<t t-if="chatterTopbar.chatter.hasActivities">
|
||||
<button class="o_ChatterTopbar_button o_ChatterTopbar_buttonScheduleActivity btn btn-light text-nowrap" type="button" t-att-disabled="!chatterTopbar.chatter.hasWriteAccess" t-on-click="chatterTopbar.chatter.onClickScheduleActivity" data-hotkey="shift+a">
|
||||
<t t-if="chatter.hasActivities">
|
||||
<button class="o_ChatterTopbar_button o_ChatterTopbar_buttonScheduleActivity btn btn-light text-nowrap" type="button" t-att-disabled="!chatter.hasWriteAccess" t-on-click="chatter.onClickScheduleActivity" data-hotkey="shift+a">
|
||||
<i class="fa fa-clock-o me-1"/>
|
||||
<span>Activities</span>
|
||||
</button>
|
||||
</t>
|
||||
<div class="flex-grow-1 border-start pe-2"
|
||||
t-att-class="{
|
||||
'ms-2': chatterTopbar.chatter.hasActivities,
|
||||
'ms-2': chatter.hasActivities,
|
||||
}"
|
||||
/>
|
||||
<div class="o_ChatterTopbar_rightSection flex-grow-1 flex-shrink-0 justify-content-end d-flex">
|
||||
<button t-if="chatterTopbar.chatter.thread.allAttachments.length === 0" class="o_ChatterTopbar_button o_ChatterTopbar_buttonAddAttachments btn btn-light btn-primary" type="button" t-att-disabled="!chatterTopbar.chatter.hasWriteAccess" t-on-click="chatterTopbar.chatter.onClickButtonAddAttachments" >
|
||||
<button t-if="chatter.thread.allAttachments.length === 0" class="o_ChatterTopbar_button o_ChatterTopbar_buttonAddAttachments btn btn-light btn-primary" type="button" t-att-disabled="!chatter.hasWriteAccess" t-on-click="chatter.onClickButtonAddAttachments" >
|
||||
<i class="fa fa-paperclip fa-lg me-1" role="img" aria-label="Attachments"/>
|
||||
<t t-if="chatterTopbar.chatter.isShowingAttachmentsLoading">
|
||||
<t t-if="chatter.isShowingAttachmentsLoading">
|
||||
<i class="o_ChatterTopbar_buttonAttachmentsCountLoader fa fa-circle-o-notch fa-spin" aria-label="Attachment counter loading..."/>
|
||||
</t>
|
||||
</button>
|
||||
<button t-if="chatterTopbar.chatter.thread.allAttachments.length > 0" class="o_ChatterTopbar_button o_ChatterTopbar_buttonToggleAttachments btn btn-light btn-primary" type="button" t-att-disabled="!chatterTopbar.chatter.hasReadAccess" t-att-aria-expanded="chatterTopbar.chatter.attachmentBoxView ? 'true' : 'false'" t-on-click="chatterTopbar.chatter.onClickButtonToggleAttachments">
|
||||
<button t-if="chatter.thread.allAttachments.length > 0" class="o_ChatterTopbar_button o_ChatterTopbar_buttonToggleAttachments btn btn-light btn-primary" type="button" t-att-disabled="!chatter.hasReadAccess" t-att-aria-expanded="chatter.attachmentBoxView ? 'true' : 'false'" t-on-click="chatter.onClickButtonToggleAttachments">
|
||||
<i class="fa fa-paperclip fa-lg me-1" role="img" aria-label="Attachments"/>
|
||||
<t t-if="!chatterTopbar.chatter.isShowingAttachmentsLoading">
|
||||
<span class="o_ChatterTopbar_buttonCount o_ChatterTopbar_buttonAttachmentsCount" t-esc="chatterTopbar.attachmentButtonText"/>
|
||||
<t t-if="!chatter.isShowingAttachmentsLoading">
|
||||
<span class="o_ChatterTopbar_buttonCount o_ChatterTopbar_buttonAttachmentsCount" t-esc="attachmentButtonText"/>
|
||||
</t>
|
||||
<t t-if="chatterTopbar.chatter.isShowingAttachmentsLoading">
|
||||
<t t-if="chatter.isShowingAttachmentsLoading">
|
||||
<i class="o_ChatterTopbar_buttonAttachmentsCountLoader fa fa-circle-o-notch fa-spin" aria-label="Attachment counter loading..."/>
|
||||
</t>
|
||||
</button>
|
||||
<t t-if="chatterTopbar.chatter.hasFollowers and chatterTopbar.chatter.thread">
|
||||
<t t-if="chatter.hasFollowers and chatter.thread">
|
||||
<FollowerListMenuView
|
||||
className="'o_ChatterTopbar_followerListMenu'"
|
||||
record="chatterTopbar.chatter.followerListMenuView"
|
||||
record="chatter.followerListMenuView"
|
||||
/>
|
||||
<t t-if="chatterTopbar.chatter.followButtonView">
|
||||
<t t-if="chatter.followButtonView">
|
||||
<FollowButtonView
|
||||
className="'o_ChatterTopbar_followButton'"
|
||||
record="chatterTopbar.chatter.followButtonView"
|
||||
record="chatter.followButtonView"
|
||||
/>
|
||||
</t>
|
||||
</t>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<t t-if="chatterTopbar.chatter.hasTopbarCloseButton">
|
||||
<button class="o_ChatterTopbar_buttonClose btn btn-dark flex-shrink-0 rounded-bottom-3" aria-label="Close" t-on-click="chatterTopbar.chatter.onClickChatterTopbarClose">
|
||||
<t t-if="chatter.hasTopbarCloseButton">
|
||||
<button class="o_ChatterTopbar_buttonClose btn btn-dark flex-shrink-0 rounded-bottom-3" aria-label="Close" t-on-click="chatter.onClickChatterTopbarClose">
|
||||
<i class="oi oi-large oi-close"/>
|
||||
</button>
|
||||
</t>
|
||||
</div>
|
||||
</t>
|
||||
</t>
|
||||
|
||||
</templates>
|
||||
|
||||
@@ -2,167 +2,165 @@
|
||||
<templates xml:space="preserve">
|
||||
|
||||
<t t-name="mail.ComposerView" owl="1">
|
||||
<t t-if="composerView">
|
||||
<div class="o_ComposerView"
|
||||
t-att-class="{
|
||||
'o-focused': composerView.isFocused,
|
||||
'o-has-current-partner-avatar pe-3 ps-1': composerView.hasCurrentPartnerAvatar,
|
||||
'o-has-footer': composerView.hasFooter,
|
||||
'o-has-header': composerView.hasHeader,
|
||||
'o-is-in-thread-view bg-view': composerView.threadView,
|
||||
'o-is-compact': composerView.isCompact,
|
||||
'o-messaging-in-editing': composerView.messageViewInEditing,
|
||||
'pt-3 pb-4': composerView.hasCurrentPartnerAvatar and composerView.hasHeader,
|
||||
'py-4': composerView.hasCurrentPartnerAvatar and !composerView.hasHeader and !composerView.threadView,
|
||||
'py-1': composerView.hasCurrentPartnerAvatar and !composerView.hasHeader and composerView.threadView,
|
||||
'o-focused': isFocused,
|
||||
'o-has-current-partner-avatar pe-3 ps-1': hasCurrentPartnerAvatar,
|
||||
'o-has-footer': hasFooter,
|
||||
'o-has-header': hasHeader,
|
||||
'o-is-in-thread-view bg-view': threadView,
|
||||
'o-is-compact': isCompact,
|
||||
'o-messaging-in-editing': messageViewInEditing,
|
||||
'pt-3 pb-4': hasCurrentPartnerAvatar and hasHeader,
|
||||
'py-4': hasCurrentPartnerAvatar and !hasHeader and !threadView,
|
||||
'py-1': hasCurrentPartnerAvatar and !hasHeader and threadView,
|
||||
}"
|
||||
t-attf-class="{{ className }}"
|
||||
t-on-keydown="composerView.onKeydown"
|
||||
t-on-keydown="onKeydown"
|
||||
t-ref="root"
|
||||
>
|
||||
<t t-if="composerView.dropZoneView">
|
||||
<t t-if="dropZoneView">
|
||||
<DropZoneView
|
||||
className="'o_ComposerView_dropZone'"
|
||||
record="composerView.dropZoneView"
|
||||
record="dropZoneView"
|
||||
/>
|
||||
</t>
|
||||
<t t-if="composerView.hasHeader">
|
||||
<div class="o_ComposerView_coreHeader text-truncate" t-att-class="{ 'small p-2': composerView.isInChatWindow or composerView.isInDiscuss }">
|
||||
<t t-if="composerView.threadView and composerView.threadView.replyingToMessageView">
|
||||
<span class="cursor-pointer" t-on-click="composerView.onClickReplyingToMessage">
|
||||
Replying to <b t-esc="composerView.threadView.replyingToMessageView.message.authorName"/>
|
||||
<t t-if="hasHeader">
|
||||
<div class="o_ComposerView_coreHeader text-truncate" t-att-class="{ 'small p-2': isInChatWindow or isInDiscuss }">
|
||||
<t t-if="threadView and threadView.replyingToMessageView">
|
||||
<span class="cursor-pointer" t-on-click="onClickReplyingToMessage">
|
||||
Replying to <b t-esc="threadView.replyingToMessageView.message.authorName"/>
|
||||
</span>
|
||||
<i t-if="composerView.threadView.thread !== messaging.inbox.thread" class="o_ComposerView_cancelReply fa fa-lg fa-times-circle rounded-circle p-0 ms-1 cursor-pointer" title="Stop replying" t-on-click="composerView.onClickStopReplying"/>
|
||||
<i t-if="threadView.thread !== messaging.inbox.thread" class="o_ComposerView_cancelReply fa fa-lg fa-times-circle rounded-circle p-0 ms-1 cursor-pointer" title="Stop replying" t-on-click="onClickStopReplying"/>
|
||||
</t>
|
||||
<t t-if="composerView.hasThreadName">
|
||||
<t t-if="hasThreadName">
|
||||
<span class="o_ComposerView_threadName">
|
||||
on: <b><t t-esc="composerView.composer.activeThread.displayName"/></b>
|
||||
on: <b><t t-esc="composer.activeThread.displayName"/></b>
|
||||
</span>
|
||||
</t>
|
||||
<t t-if="composerView.hasFollowers and !composerView.composer.isLog">
|
||||
<t t-if="hasFollowers and !composer.isLog">
|
||||
<!-- Text for followers -->
|
||||
<small class="o_ComposerView_followers flex-shrink-0">
|
||||
<b class="text-muted">To: </b>
|
||||
<em class="text-muted">Followers of </em>
|
||||
<b>
|
||||
<t t-if="composerView.composer.activeThread.displayName">
|
||||
 "<t t-esc="composerView.composer.activeThread.displayName"/>"
|
||||
<t t-if="composer.activeThread.displayName">
|
||||
 "<t t-esc="composer.activeThread.displayName"/>"
|
||||
</t>
|
||||
<t t-else="">
|
||||
this document
|
||||
</t>
|
||||
</b>
|
||||
</small>
|
||||
<ComposerSuggestedRecipientListView record="composerView.composerSuggestedRecipientListView"/>
|
||||
<ComposerSuggestedRecipientListView record="composerSuggestedRecipientListView"/>
|
||||
</t>
|
||||
</div>
|
||||
</t>
|
||||
<t t-if="composerView.hasCurrentPartnerAvatar">
|
||||
<t t-if="hasCurrentPartnerAvatar">
|
||||
<div class="o_ComposerView_sidebarMain">
|
||||
<t t-if="!messaging.currentGuest or composerView.composer.activeThread.model !== 'mail.channel'">
|
||||
<img class="o_ComposerView_currentPartnerAvatar mt-1 rounded-circle o_object_fit_cover" t-att-src="composerView.currentPartnerAvatar" alt="Avatar of user"/>
|
||||
<t t-if="!messaging.currentGuest or composer.activeThread.model !== 'mail.channel'">
|
||||
<img class="o_ComposerView_currentPartnerAvatar mt-1 rounded-circle o_object_fit_cover" t-att-src="currentPartnerAvatar" alt="Avatar of user"/>
|
||||
</t>
|
||||
<t t-if="messaging.currentGuest and composerView.composer.activeThread.model === 'mail.channel'">
|
||||
<img class="o_ComposerView_currentPartnerAvatar mt-1 rounded-circle o_object_fit_cover" t-attf-src="/mail/channel/{{ composerView.composer.activeThread.id }}/guest/{{ messaging.currentGuest.id }}/avatar_128?unique={{ messaging.currentGuest.name }}" alt="Avatar of guest"/>
|
||||
<t t-if="messaging.currentGuest and composer.activeThread.model === 'mail.channel'">
|
||||
<img class="o_ComposerView_currentPartnerAvatar mt-1 rounded-circle o_object_fit_cover" t-attf-src="/mail/channel/{{ composer.activeThread.id }}/guest/{{ messaging.currentGuest.id }}/avatar_128?unique={{ messaging.currentGuest.name }}" alt="Avatar of guest"/>
|
||||
</t>
|
||||
</div>
|
||||
</t>
|
||||
<div
|
||||
class="o_ComposerView_coreMain d-flex flex-nowrap align-items-start flex-grow-1"
|
||||
t-att-class="{
|
||||
'o-composer-is-compact': composerView.isCompact,
|
||||
'flex-column border rounded-3 bg-view': !composerView.isCompact,
|
||||
'o-composer-is-compact': isCompact,
|
||||
'flex-column border rounded-3 bg-view': !isCompact,
|
||||
}"
|
||||
>
|
||||
<ComposerTextInputView
|
||||
className="'o_ComposerView_textInput flex-grow-1 align-self-stretch'"
|
||||
classNameObj="{
|
||||
'o-composer-is-compact': composerView.isCompact,
|
||||
'rounded-3': !composerView.isCompact,
|
||||
'o-composer-is-compact': isCompact,
|
||||
'rounded-3': !isCompact,
|
||||
'o_ComposerView_textInput-mobile': messaging.device.isSmall,
|
||||
'o-has-current-partner-avatar': composerView.hasCurrentPartnerAvatar,
|
||||
'rounded-start-3': composerView.isCompact and composerView.hasCurrentPartnerAvatar,
|
||||
'o-has-current-partner-avatar': hasCurrentPartnerAvatar,
|
||||
'rounded-start-3': isCompact and hasCurrentPartnerAvatar,
|
||||
}"
|
||||
record="composerView.textInput"
|
||||
t-key="composerView.localId"
|
||||
record="textInput"
|
||||
t-key="localId"
|
||||
/>
|
||||
<div class="o_ComposerView_buttons d-flex align-items-stretch align-self-stretch flex-shrink-0" t-att-class="{ 'o-composer-is-compact': composerView.isCompact, 'h-auto w-100 px-3': !composerView.isCompact, 'o-isDeviceSmall': messaging.device.isSmall, 'o-messaging-in-editing': composerView and composerView.messageViewInEditing, 'border-end': composerView.messageViewInEditing and !composerView.hasCurrentPartnerAvatar }">
|
||||
<div class="o_ComposerView_buttons d-flex align-items-stretch align-self-stretch flex-shrink-0" t-att-class="{ 'o-composer-is-compact': isCompact, 'h-auto w-100 px-3': !isCompact, 'o-isDeviceSmall': messaging.device.isSmall, 'o-messaging-in-editing': messageViewInEditing, 'border-end': messageViewInEditing and !hasCurrentPartnerAvatar }">
|
||||
<div class="o_ComposerView_toolButtons d-flex py-1 border-top bg-view"
|
||||
t-att-class="{
|
||||
'o-composer-has-current-partner-avatar': composerView.hasCurrentPartnerAvatar,
|
||||
'o-composer-is-compact border-bottom': composerView.isCompact,
|
||||
'flex-row flex-grow-1 justify-content-between': !composerView.isCompact,
|
||||
'o-composer-has-current-partner-avatar': hasCurrentPartnerAvatar,
|
||||
'o-composer-is-compact border-bottom': isCompact,
|
||||
'flex-row flex-grow-1 justify-content-between': !isCompact,
|
||||
}">
|
||||
<div class="o_ComposerView_primaryToolButtons d-flex align-items-center" t-att-class="{ 'o-composer-is-compact px-2': composerView.isCompact, 'flex-column': composerView.messageViewInEditing and composerView.messageViewInEditing.isInChatWindow }">
|
||||
<div class="o_ComposerView_primaryToolButtons d-flex align-items-center" t-att-class="{ 'o-composer-is-compact px-2': isCompact, 'flex-column': messageViewInEditing and messageViewInEditing.isInChatWindow }">
|
||||
<button class="o_ComposerView_button o_ComposerView_buttonEmojis o_ComposerView_toolButton btn btn-light border-0 rounded-pill bg-view"
|
||||
t-att-class="{
|
||||
'o-open bg-200': composerView.emojisPopoverView,
|
||||
'o-open bg-200': emojisPopoverView,
|
||||
'o-isDeviceSmall': messaging.device.isSmall,
|
||||
}"
|
||||
t-attf-class="{{ composerView.messageViewInEditing ? 'my-1' : 'mx-1' }}"
|
||||
t-att-aria-expanded="composerView.emojisPopoverView ? 'true' : 'false'"
|
||||
t-on-keydown="composerView.onKeydownButtonEmojis"
|
||||
t-on-click="composerView.onClickButtonEmojis"
|
||||
t-attf-class="{{ messageViewInEditing ? 'my-1' : 'mx-1' }}"
|
||||
t-att-aria-expanded="emojisPopoverView ? 'true' : 'false'"
|
||||
t-on-keydown="onKeydownButtonEmojis"
|
||||
t-on-click="onClickButtonEmojis"
|
||||
t-ref="buttonEmojis"
|
||||
>
|
||||
<i class="fa fa-smile-o" role="img" aria-label="Emojis"/>
|
||||
</button>
|
||||
<button class="o_ComposerView_button o_ComposerView_buttonAttachment o_ComposerView_toolButton btn btn-light fa fa-paperclip border-0 rounded-pill bg-view" t-att-class="{ 'o-isDeviceSmall': messaging.device.isSmall }" t-attf-class="{{ composerView.messageViewInEditing ? 'my-1' : 'mx-1' }}" title="Add attachment" aria-label="Add attachment" type="button" t-on-click="composerView.onClickAddAttachment"/>
|
||||
<button class="o_ComposerView_button o_ComposerView_buttonAttachment o_ComposerView_toolButton btn btn-light fa fa-paperclip border-0 rounded-pill bg-view" t-att-class="{ 'o-isDeviceSmall': messaging.device.isSmall }" t-attf-class="{{ messageViewInEditing ? 'my-1' : 'mx-1' }}" title="Add attachment" aria-label="Add attachment" type="button" t-on-click="onClickAddAttachment"/>
|
||||
</div>
|
||||
<t t-if="composerView.isExpandable">
|
||||
<t t-if="isExpandable">
|
||||
<div class="o_ComposerView_secondaryToolButtons">
|
||||
<button class="o_ComposerView_button o_ComposerView_buttonFullComposer o_ComposerView_toolButton btn btn-light fa fa-expand mx-1 border-0 rounded-pill bg-view" t-att-class="{ 'o-isDeviceSmall': messaging.device.isSmall }" title="Full composer" aria-label="Full composer" type="button" t-on-click="composerView.onClickFullComposer"/>
|
||||
<button class="o_ComposerView_button o_ComposerView_buttonFullComposer o_ComposerView_toolButton btn btn-light fa fa-expand mx-1 border-0 rounded-pill bg-view" t-att-class="{ 'o-isDeviceSmall': messaging.device.isSmall }" title="Full composer" aria-label="Full composer" type="button" t-on-click="onClickFullComposer"/>
|
||||
</div>
|
||||
</t>
|
||||
</div>
|
||||
<t t-if="composerView.isCompact">
|
||||
<t t-if="isCompact">
|
||||
<t t-call="mail.ComposerView.actionButtons"/>
|
||||
</t>
|
||||
</div>
|
||||
</div>
|
||||
<t t-if="composerView.hasFooter">
|
||||
<div class="o_ComposerView_coreFooter overflow-auto" t-att-class="{ 'o-composer-is-compact': composerView.isCompact, 'ms-0': !composerView.isCompact }">
|
||||
<t t-if="composerView.threadTextualTypingStatusView">
|
||||
<ThreadTextualTypingStatusView className="'o_ComposerView_threadTextualTypingStatus small'" record="composerView.threadTextualTypingStatusView"/>
|
||||
<t t-if="hasFooter">
|
||||
<div class="o_ComposerView_coreFooter overflow-auto" t-att-class="{ 'o-composer-is-compact': isCompact, 'ms-0': !isCompact }">
|
||||
<t t-if="threadTextualTypingStatusView">
|
||||
<ThreadTextualTypingStatusView className="'o_ComposerView_threadTextualTypingStatus small'" record="threadTextualTypingStatusView"/>
|
||||
</t>
|
||||
<AttachmentList
|
||||
t-if="composerView.attachmentList"
|
||||
t-if="attachmentList"
|
||||
className="'o_ComposerView_attachmentList flex-grow-1'"
|
||||
classNameObj="{ 'o-composer-is-compact': composerView.isCompact, 'overflow-auto': !composerView.isCompact }"
|
||||
record="composerView.attachmentList"
|
||||
classNameObj="{ 'o-composer-is-compact': isCompact, 'overflow-auto': !isCompact }"
|
||||
record="attachmentList"
|
||||
/>
|
||||
<t t-if="!composerView.isCompact">
|
||||
<t t-if="!isCompact">
|
||||
<t t-call="mail.ComposerView.actionButtons"/>
|
||||
</t>
|
||||
<t t-if="composerView.messageViewInEditing">
|
||||
<span class="text-muted">escape to <a href="#" t-on-click="composerView.onClickCancelLink">cancel</a>, enter to <a href="#" t-on-click="composerView.onClickSaveLink">save</a></span>
|
||||
<t t-if="messageViewInEditing">
|
||||
<span class="text-muted">escape to <a href="#" t-on-click="onClickCancelLink">cancel</a>, enter to <a href="#" t-on-click="onClickSaveLink">save</a></span>
|
||||
</t>
|
||||
</div>
|
||||
</t>
|
||||
</div>
|
||||
</t>
|
||||
</t>
|
||||
|
||||
<t t-name="mail.ComposerView.actionButtons" owl="1">
|
||||
<div class="o_ComposerView_actionButtons" t-att-class="{ 'o-composer-is-compact d-flex': composerView.isCompact, 'mt-2': !composerView.isCompact }">
|
||||
<t t-if="composerView.hasSendButton">
|
||||
<div class="o_ComposerView_actionButtons" t-att-class="{ 'o-composer-is-compact d-flex': isCompact, 'mt-2': !isCompact }">
|
||||
<t t-if="hasSendButton">
|
||||
<button class="o_ComposerView_actionButton o_ComposerView_button o_ComposerView_buttonSend btn btn-primary"
|
||||
t-att-class="{
|
||||
'o-last': !composerView.hasDiscardButton,
|
||||
'o-composer-is-compact border-start-0': composerView.isCompact,
|
||||
'o-has-current-partner-avatar': composerView.hasCurrentPartnerAvatar,
|
||||
'rounded-0 rounded-end-3': !composerView.hasDiscardButton and composerView.hasCurrentPartnerAvatar and composerView.isCompact,
|
||||
'o-last': !hasDiscardButton,
|
||||
'o-composer-is-compact border-start-0': isCompact,
|
||||
'o-has-current-partner-avatar': hasCurrentPartnerAvatar,
|
||||
'rounded-0 rounded-end-3': !hasDiscardButton and hasCurrentPartnerAvatar and isCompact,
|
||||
}"
|
||||
t-att-disabled="!composerView.composer.canPostMessage ? 'disabled' : ''"
|
||||
t-att-disabled="!composer.canPostMessage ? 'disabled' : ''"
|
||||
type="button"
|
||||
t-on-click="composerView.onClickSend"
|
||||
t-on-click="onClickSend"
|
||||
>
|
||||
<t t-if="!messaging.device.isSmall"><t t-esc="composerView.sendButtonText"/></t>
|
||||
<t t-if="!messaging.device.isSmall"><t t-esc="sendButtonText"/></t>
|
||||
<t t-else=""><i class="fa fa-paper-plane-o"/></t>
|
||||
</button>
|
||||
</t>
|
||||
<t t-if="composerView.hasDiscardButton">
|
||||
<button class="o_ComposerView_actionButton o-last o_ComposerView_button o_ComposerView_buttonDiscard btn btn-secondary" t-att-class="{ 'o-composer-is-compact border-start-0': composerView.isCompact, 'o-has-current-partner-avatar': composerView.hasCurrentPartnerAvatar, 'rounded-0 rounded-end-3': composerView.hasCurrentPartnerAvatar and composerView.isCompact }" type="button" t-on-click="composerView.onClickDiscard">
|
||||
<t t-if="hasDiscardButton">
|
||||
<button class="o_ComposerView_actionButton o-last o_ComposerView_button o_ComposerView_buttonDiscard btn btn-secondary" t-att-class="{ 'o-composer-is-compact border-start-0': isCompact, 'o-has-current-partner-avatar': hasCurrentPartnerAvatar, 'rounded-0 rounded-end-3': hasCurrentPartnerAvatar and isCompact }" type="button" t-on-click="onClickDiscard">
|
||||
Discard
|
||||
</button>
|
||||
</t>
|
||||
|
||||
+5
-7
@@ -1,24 +1,22 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<templates xml:space="preserve">
|
||||
<t t-name="mail.ComposerSuggestedRecipientListView" owl="1">
|
||||
<t t-if="composerSuggestedRecipientListView">
|
||||
<div class="o_ComposerSuggestedRecipientListView mb-2" t-attf-class="{{ className }}" t-ref="root">
|
||||
<t t-foreach="composerSuggestedRecipientListView.composerSuggestedRecipientViews" t-as="composerSuggestedRecipientView" t-key="composerSuggestedRecipientView.localId">
|
||||
<t t-foreach="composerSuggestedRecipientViews" t-as="composerSuggestedRecipientView" t-key="composerSuggestedRecipientView.localId">
|
||||
<ComposerSuggestedRecipientView record="composerSuggestedRecipientView"/>
|
||||
</t>
|
||||
<t t-if="composerSuggestedRecipientListView.thread.suggestedRecipientInfoList.length > 3">
|
||||
<t t-if="!composerSuggestedRecipientListView.hasShowMoreButton" >
|
||||
<button class="o_ComposerSuggestedRecipientListView_showMore btn btn-sm btn-link" t-on-click="composerSuggestedRecipientListView.onClickShowMore">
|
||||
<t t-if="thread.suggestedRecipientInfoList.length > 3">
|
||||
<t t-if="!hasShowMoreButton" >
|
||||
<button class="o_ComposerSuggestedRecipientListView_showMore btn btn-sm btn-link" t-on-click="onClickShowMore">
|
||||
Show more
|
||||
</button>
|
||||
</t>
|
||||
<t t-else="">
|
||||
<button class="o_ComposerSuggestedRecipientListView_showLess btn btn-sm btn-link" t-on-click="composerSuggestedRecipientListView.onClickShowLess">
|
||||
<button class="o_ComposerSuggestedRecipientListView_showLess btn btn-sm btn-link" t-on-click="onClickShowLess">
|
||||
Show less
|
||||
</button>
|
||||
</t>
|
||||
</t>
|
||||
</div>
|
||||
</t>
|
||||
</t>
|
||||
</templates>
|
||||
|
||||
+6
-8
@@ -2,23 +2,21 @@
|
||||
<templates xml:space="preserve">
|
||||
|
||||
<t t-name="mail.ComposerSuggestionListView" owl="1">
|
||||
<t t-if="composerSuggestionListView">
|
||||
<div class="o_ComposerSuggestionListView position-absolute w-100" t-att-class="{ 'o-lowPosition bottom-0': composerSuggestionListView.composerViewOwner.hasMentionSuggestionsBelowPosition }" t-attf-class="{{ className }}" t-ref="root">
|
||||
<div class="o_ComposerSuggestionListView_drop w-100" t-att-class="{ 'dropdown': composerSuggestionListView.composerViewOwner.hasMentionSuggestionsBelowPosition, 'dropup': !composerSuggestionListView.composerViewOwner.hasMentionSuggestionsBelowPosition }">
|
||||
<div class="o_ComposerSuggestionListView_list dropdown-menu show w-100 overflow-auto" t-att-class="{ 'bottom-100': !composerSuggestionListView.composerViewOwner.hasMentionSuggestionsBelowPosition }">
|
||||
<t t-foreach="composerSuggestionListView.composerSuggestionListViewMainComposerSuggestionViewItems" t-as="composerSuggestionListViewMainComposerSuggestionViewItem" t-key="composerSuggestionListViewMainComposerSuggestionViewItem.localId">
|
||||
<div class="o_ComposerSuggestionListView position-absolute w-100" t-att-class="{ 'o-lowPosition bottom-0': composerViewOwner.hasMentionSuggestionsBelowPosition }" t-attf-class="{{ className }}" t-ref="root">
|
||||
<div class="o_ComposerSuggestionListView_drop w-100" t-att-class="{ 'dropdown': composerViewOwner.hasMentionSuggestionsBelowPosition, 'dropup': !composerViewOwner.hasMentionSuggestionsBelowPosition }">
|
||||
<div class="o_ComposerSuggestionListView_list dropdown-menu show w-100 overflow-auto" t-att-class="{ 'bottom-100': !composerViewOwner.hasMentionSuggestionsBelowPosition }">
|
||||
<t t-foreach="composerSuggestionListViewMainComposerSuggestionViewItems" t-as="composerSuggestionListViewMainComposerSuggestionViewItem" t-key="composerSuggestionListViewMainComposerSuggestionViewItem.localId">
|
||||
<ComposerSuggestionView record="composerSuggestionListViewMainComposerSuggestionViewItem.composerSuggestionView"/>
|
||||
</t>
|
||||
<t t-if="composerSuggestionListView.composerSuggestionListViewMainComposerSuggestionViewItems.length > 0 and composerSuggestionListView.composerSuggestionListViewExtraComposerSuggestionViewItems.length > 0">
|
||||
<t t-if="composerSuggestionListViewMainComposerSuggestionViewItems.length > 0 and composerSuggestionListViewExtraComposerSuggestionViewItems.length > 0">
|
||||
<div role="separator" class="dropdown-divider"/>
|
||||
</t>
|
||||
<t t-foreach="composerSuggestionListView.composerSuggestionListViewExtraComposerSuggestionViewItems" t-as="composerSuggestionListViewExtraComposerSuggestionViewItem" t-key="composerSuggestionListViewExtraComposerSuggestionViewItem.localId">
|
||||
<t t-foreach="composerSuggestionListViewExtraComposerSuggestionViewItems" t-as="composerSuggestionListViewExtraComposerSuggestionViewItem" t-key="composerSuggestionListViewExtraComposerSuggestionViewItem.localId">
|
||||
<ComposerSuggestionView record="composerSuggestionListViewExtraComposerSuggestionViewItem.composerSuggestionView"/>
|
||||
</t>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</t>
|
||||
</t>
|
||||
|
||||
</templates>
|
||||
|
||||
+15
-17
@@ -2,33 +2,31 @@
|
||||
<templates xml:space="preserve">
|
||||
|
||||
<t t-name="mail.ComposerSuggestionView" owl="1">
|
||||
<t t-if="composerSuggestionView">
|
||||
<a class="o_ComposerSuggestionView dropdown-item d-flex w-100 py-2 px-4" t-att-class="{ 'active bg-300': composerSuggestionView.composerSuggestionListViewOwnerAsActiveSuggestionView }" t-attf-class="{{ className }}" href="#" t-att-title="composerSuggestionView.title" role="menuitem" t-on-click="composerSuggestionView.onClick" t-ref="root">
|
||||
<t t-if="composerSuggestionView.suggestable.cannedResponse">
|
||||
<strong class="o_ComposerSuggestionView_part1 flex-shrink-0 mw-100 pe-2 text-truncate"><t t-esc="composerSuggestionView.suggestable.cannedResponse.source"/></strong>
|
||||
<em class="o_ComposerSuggestionView_part2 text-600 text-truncate"><t t-esc="composerSuggestionView.suggestable.cannedResponse.substitution"/></em>
|
||||
<a class="o_ComposerSuggestionView dropdown-item d-flex w-100 py-2 px-4" t-att-class="{ 'active bg-300': composerSuggestionListViewOwnerAsActiveSuggestionView }" t-attf-class="{{ className }}" href="#" t-att-title="title" role="menuitem" t-on-click="onClick" t-ref="root">
|
||||
<t t-if="suggestable.cannedResponse">
|
||||
<strong class="o_ComposerSuggestionView_part1 flex-shrink-0 mw-100 pe-2 text-truncate"><t t-esc="suggestable.cannedResponse.source"/></strong>
|
||||
<em class="o_ComposerSuggestionView_part2 text-600 text-truncate"><t t-esc="suggestable.cannedResponse.substitution"/></em>
|
||||
</t>
|
||||
<t t-if="composerSuggestionView.suggestable.thread">
|
||||
<strong class="o_ComposerSuggestionView_part1 flex-shrink-0 mw-100 pe-2 text-truncate"><t t-esc="composerSuggestionView.suggestable.thread.name"/></strong>
|
||||
<t t-if="suggestable.thread">
|
||||
<strong class="o_ComposerSuggestionView_part1 flex-shrink-0 mw-100 pe-2 text-truncate"><t t-esc="suggestable.thread.name"/></strong>
|
||||
</t>
|
||||
<t t-if="composerSuggestionView.suggestable.channelCommand">
|
||||
<strong class="o_ComposerSuggestionView_part1 flex-shrink-0 mw-100 pe-2 text-truncate"><t t-esc="composerSuggestionView.suggestable.channelCommand.name"/></strong>
|
||||
<em class="o_ComposerSuggestionView_part2 text-600 text-truncate"><t t-esc="composerSuggestionView.suggestable.channelCommand.help"/></em>
|
||||
<t t-if="suggestable.channelCommand">
|
||||
<strong class="o_ComposerSuggestionView_part1 flex-shrink-0 mw-100 pe-2 text-truncate"><t t-esc="suggestable.channelCommand.name"/></strong>
|
||||
<em class="o_ComposerSuggestionView_part2 text-600 text-truncate"><t t-esc="suggestable.channelCommand.help"/></em>
|
||||
</t>
|
||||
<t t-if="composerSuggestionView.suggestable.partner">
|
||||
<t t-if="composerSuggestionView.personaImStatusIconView">
|
||||
<t t-if="suggestable.partner">
|
||||
<t t-if="personaImStatusIconView">
|
||||
<PersonaImStatusIconView
|
||||
className="'o_ComposerSuggestionView_personaImStatusIcon flex-shrink-0 me-1'"
|
||||
record="composerSuggestionView.personaImStatusIconView"
|
||||
record="personaImStatusIconView"
|
||||
/>
|
||||
</t>
|
||||
<strong class="o_ComposerSuggestionView_part1 flex-shrink-0 mw-100 pe-2 text-truncate"><t t-esc="composerSuggestionView.suggestable.partner.nameOrDisplayName"/></strong>
|
||||
<t t-if="composerSuggestionView.suggestable.partner.email">
|
||||
<em class="o_ComposerSuggestionView_part2 text-600 text-truncate">(<t t-esc="composerSuggestionView.suggestable.partner.email"/>)</em>
|
||||
<strong class="o_ComposerSuggestionView_part1 flex-shrink-0 mw-100 pe-2 text-truncate"><t t-esc="suggestable.partner.nameOrDisplayName"/></strong>
|
||||
<t t-if="suggestable.partner.email">
|
||||
<em class="o_ComposerSuggestionView_part2 text-600 text-truncate">(<t t-esc="suggestable.partner.email"/>)</em>
|
||||
</t>
|
||||
</t>
|
||||
</a>
|
||||
</t>
|
||||
</t>
|
||||
|
||||
</templates>
|
||||
|
||||
@@ -2,20 +2,18 @@
|
||||
<templates xml:space="preserve">
|
||||
|
||||
<t t-name="mail.ComposerTextInputView" owl="1">
|
||||
<t t-if="composerTextInputView">
|
||||
<div class="o_ComposerTextInputView position-relative bg-view" t-attf-class="{{ className }} {{ composerTextInputView.owner.isCompact ? 'border border-end-0' : 'border-0' }}" t-att-class="{ 'border-start-0': composerTextInputView.owner.isInChatWindow }" t-on-paste="composerTextInputView.owner.onPasteTextInput" t-ref="root">
|
||||
<t t-if="composerTextInputView.owner.composerSuggestionListView">
|
||||
<ComposerSuggestionListView record="composerTextInputView.owner.composerSuggestionListView"/>
|
||||
<div class="o_ComposerTextInputView position-relative bg-view" t-attf-class="{{ className }} {{ owner.isCompact ? 'border border-end-0' : 'border-0' }}" t-att-class="{ 'border-start-0': owner.isInChatWindow }" t-on-paste="owner.onPasteTextInput" t-ref="root">
|
||||
<t t-if="owner.composerSuggestionListView">
|
||||
<ComposerSuggestionListView record="owner.composerSuggestionListView"/>
|
||||
</t>
|
||||
<textarea class="o_ComposerTextInputView_textarea o_ComposerTextInputView_textareaStyle form-control px-3 border-0 shadow-none overflow-auto" t-att-class="{ 'o-composer-is-compact rounded-0 rounded-start-3': composerTextInputView.owner.isCompact, 'rounded-3': !composerTextInputView.owner.isCompact }" t-esc="composerTextInputView.owner.composer.textInputContent" t-att-placeholder="composerTextInputView.owner.composer.placeholder" t-on-click="composerTextInputView.owner.onClickTextarea" t-on-focusin="composerTextInputView.owner.onFocusinTextarea" t-on-focusout="composerTextInputView.owner.onFocusoutTextarea" t-on-keydown="composerTextInputView.owner.onKeydownTextarea" t-on-keyup="composerTextInputView.owner.onKeyupTextarea" t-on-input="composerTextInputView.owner.onInputTextarea" t-ref="textarea"/>
|
||||
<textarea class="o_ComposerTextInputView_textarea o_ComposerTextInputView_textareaStyle form-control px-3 border-0 shadow-none overflow-auto" t-att-class="{ 'o-composer-is-compact rounded-0 rounded-start-3': owner.isCompact, 'rounded-3': !owner.isCompact }" t-esc="owner.composer.textInputContent" t-att-placeholder="owner.composer.placeholder" t-on-click="owner.onClickTextarea" t-on-focusin="owner.onFocusinTextarea" t-on-focusout="owner.onFocusoutTextarea" t-on-keydown="owner.onKeydownTextarea" t-on-keyup="owner.onKeyupTextarea" t-on-input="owner.onInputTextarea" t-ref="textarea"/>
|
||||
<!--
|
||||
This is an invisible textarea used to compute the composer
|
||||
height based on the text content. We need it to downsize
|
||||
the textarea properly without flicker.
|
||||
-->
|
||||
<textarea class="o_ComposerTextInputView_mirroredTextarea o_ComposerTextInputView_textareaStyle position-absolute px-3 border-0 overflow-hidden opacity-0" t-att-class="{ 'o-composer-is-compact rounded-0 rounded-start-3': composerTextInputView.owner.isCompact, 'rounded-3': !composerTextInputView.owner.isCompact }" t-esc="composerTextInputView.owner.composer.textInputContent" t-ref="mirroredTextarea" disabled="1"/>
|
||||
<textarea class="o_ComposerTextInputView_mirroredTextarea o_ComposerTextInputView_textareaStyle position-absolute px-3 border-0 overflow-hidden opacity-0" t-att-class="{ 'o-composer-is-compact rounded-0 rounded-start-3': owner.isCompact, 'rounded-3': !owner.isCompact }" t-esc="owner.composer.textInputContent" t-ref="mirroredTextarea" disabled="1"/>
|
||||
</div>
|
||||
</t>
|
||||
</t>
|
||||
|
||||
</templates>
|
||||
|
||||
@@ -1,21 +1,19 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<templates xml:space="preserve">
|
||||
<t t-name="mail.DeleteMessageConfirmView" owl="1">
|
||||
<t t-if="deleteMessageConfirmView">
|
||||
<div class="o_DeleteMessageConfirmView card bg-view" t-attf-class="{{ className }}" t-ref="root">
|
||||
<h4 class="m-3">Confirmation</h4>
|
||||
<hr class="mt-0 mb-3"/>
|
||||
<p class="mx-3 mb-3">Are you sure you want to delete this message?</p>
|
||||
<blockquote class="o_DeleteMessageConfirmView_blockquote mx-3 mb-3 fst-normal">
|
||||
<MessageView record="deleteMessageConfirmView.messageView"/>
|
||||
<MessageView record="messageView"/>
|
||||
</blockquote>
|
||||
<small t-if="!deleteMessageConfirmView.message.originThread or deleteMessageConfirmView.message.originThread.model !== 'mail.channel'" class="mx-3 mb-3">Pay attention: The followers of this document who were notified by email will still be able to read the content of this message and reply to it.</small>
|
||||
<small t-if="!message.originThread or message.originThread.model !== 'mail.channel'" class="mx-3 mb-3">Pay attention: The followers of this document who were notified by email will still be able to read the content of this message and reply to it.</small>
|
||||
<hr class="mt-0 mb-3"/>
|
||||
<div class="o_DeleteMessageConfirmView_buttons mx-3 mb-3">
|
||||
<button class="btn btn-primary me-2" t-on-click="deleteMessageConfirmView.onClickDelete">Delete</button>
|
||||
<button class="btn btn-secondary me-2" t-on-click="deleteMessageConfirmView.onClickCancel">Cancel</button>
|
||||
<button class="btn btn-primary me-2" t-on-click="onClickDelete">Delete</button>
|
||||
<button class="btn btn-secondary me-2" t-on-click="onClickCancel">Cancel</button>
|
||||
</div>
|
||||
</div>
|
||||
</t>
|
||||
</t>
|
||||
</templates>
|
||||
|
||||
+1
-1
@@ -3,7 +3,7 @@
|
||||
|
||||
<t t-name="mail.DiscussMobileMailboxSelectionView" owl="1">
|
||||
<div class="o_DiscussMobileMailboxSelectionView d-flex" t-attf-class="{{ className }}" t-ref="root">
|
||||
<t t-foreach="discussMobileMailboxSelectionView.items" t-as="item" t-key="item.localId">
|
||||
<t t-foreach="items" t-as="item" t-key="item.localId">
|
||||
<DiscussMobileMailboxSelectionItemView record="item"/>
|
||||
</t>
|
||||
</div>
|
||||
|
||||
+3
-3
@@ -4,10 +4,10 @@
|
||||
<t t-name="mail.DiscussMobileMailboxSelectionItemView" owl="1">
|
||||
<button class="o_DiscussMobileMailboxSelectionItemView btn btn-secondary flex-grow-1 p-2"
|
||||
t-att-class="{
|
||||
'active o-active shadow-none': discussMobileMailboxSelectionItemView.owner.owner.discuss.activeThread === discussMobileMailboxSelectionItemView.mailbox.thread,
|
||||
}" t-attf-class="{{ className }}" t-on-click="discussMobileMailboxSelectionItemView.onClick" t-att-data-mailbox-local-id="discussMobileMailboxSelectionItemView.mailbox.localId" type="button" t-ref="root"
|
||||
'active o-active shadow-none': owner.owner.discuss.activeThread === mailbox.thread,
|
||||
}" t-attf-class="{{ className }}" t-on-click="onClick" t-att-data-mailbox-local-id="mailbox.localId" type="button" t-ref="root"
|
||||
>
|
||||
<t t-esc="discussMobileMailboxSelectionItemView.mailbox.name"/>
|
||||
<t t-esc="mailbox.name"/>
|
||||
</button>
|
||||
</t>
|
||||
|
||||
|
||||
@@ -2,36 +2,34 @@
|
||||
<templates xml:space="preserve">
|
||||
|
||||
<t t-name="mail.DiscussSidebarView" owl="1">
|
||||
<t t-if="discussSidebarView">
|
||||
<div name="root" class="o_DiscussSidebarView d-flex flex-column overflow-auto" t-attf-class="{{ className }}" t-ref="root">
|
||||
<div class="d-flex justify-content-center">
|
||||
<button class="o_DiscussSidebarView_startAMeetingButton btn btn-primary rounded" title="Start a meeting" t-on-click="discussSidebarView.owner.onClickStartAMeetingButton">
|
||||
<button class="o_DiscussSidebarView_startAMeetingButton btn btn-primary rounded" title="Start a meeting" t-on-click="owner.onClickStartAMeetingButton">
|
||||
Start a meeting
|
||||
</button>
|
||||
</div>
|
||||
<hr class="o_DiscussSidebarView_separator w-100 border-top"/>
|
||||
<div class="o_DiscussSidebarView_category o_DiscussSidebarView_categoryMailbox d-flex flex-column flex-grow-0">
|
||||
<DiscussSidebarMailboxView record="discussSidebarView.owner.inboxView"/>
|
||||
<DiscussSidebarMailboxView record="discussSidebarView.owner.starredView"/>
|
||||
<DiscussSidebarMailboxView record="discussSidebarView.owner.historyView"/>
|
||||
<DiscussSidebarMailboxView record="owner.inboxView"/>
|
||||
<DiscussSidebarMailboxView record="owner.starredView"/>
|
||||
<DiscussSidebarMailboxView record="owner.historyView"/>
|
||||
</div>
|
||||
<hr class="o_DiscussSidebarView_separator w-100 border-top"/>
|
||||
<t t-if="messaging.models['Thread'].all(thread => thread.isPinned and thread.model === 'mail.channel').length > 19">
|
||||
<input class="o_DiscussSidebarView_quickSearch form-control mx-4 mb-2 rounded-3 w-auto" t-on-input="discussSidebarView.owner.onInputQuickSearch" placeholder="Quick search..." t-ref="quickSearchInput" t-esc="discussSidebarView.owner.discuss.sidebarQuickSearchValue"/>
|
||||
<input class="o_DiscussSidebarView_quickSearch form-control mx-4 mb-2 rounded-3 w-auto" t-on-input="owner.onInputQuickSearch" placeholder="Quick search..." t-ref="quickSearchInput" t-esc="owner.discuss.sidebarQuickSearchValue"/>
|
||||
</t>
|
||||
<DiscussSidebarCategory
|
||||
t-if="discussSidebarView.owner.discuss.categoryChannel"
|
||||
t-if="owner.discuss.categoryChannel"
|
||||
className="'o_DiscussSidebarView_category o_DiscussSidebarView_categoryChannel'"
|
||||
record="discussSidebarView.owner.discuss.categoryChannel"
|
||||
record="owner.discuss.categoryChannel"
|
||||
/>
|
||||
<t name="beforeCategoryChat"/>
|
||||
<DiscussSidebarCategory
|
||||
t-if="discussSidebarView.owner.discuss.categoryChat"
|
||||
t-if="owner.discuss.categoryChat"
|
||||
className="'o_DiscussSidebarView_category o_DiscussSidebarView_categoryChat'"
|
||||
record="discussSidebarView.owner.discuss.categoryChat"
|
||||
record="owner.discuss.categoryChat"
|
||||
/>
|
||||
</div>
|
||||
</t>
|
||||
</t>
|
||||
|
||||
</templates>
|
||||
|
||||
+16
-18
@@ -2,54 +2,52 @@
|
||||
|
||||
<templates xml:space="preserve">
|
||||
<t t-name="mail.DiscussSidebarCategory" owl="1">
|
||||
<t t-if="category">
|
||||
<t t-set="o_DiscussSidebarCategory_hoverItem" t-value="'btn p-0 text-start text-700 opacity-100-hover opacity-75'"/>
|
||||
<div class="o_DiscussSidebarCategory" t-attf-class="{{ className }}" t-att-data-category-local-id="category.localId" t-ref="root">
|
||||
<div class="o_DiscussSidebarCategory" t-attf-class="{{ className }}" t-att-data-category-local-id="localId" t-ref="root">
|
||||
<div class="o_DiscussSidebarCategory_header d-flex align-items-center my-1">
|
||||
<div t-attf-class="o_DiscussSidebarCategory_title o_DiscussSidebarCategory_headerItem d-flex align-items-baseline mx-1 {{ o_DiscussSidebarCategory_hoverItem }}" t-on-click="category.onClick">
|
||||
<i class="o_DiscussSidebarCategory_titleIcon small" t-att-class="category.isOpen ? 'fa fa-chevron-down' : 'fa fa-chevron-right'"/>
|
||||
<span class="o_DiscussSidebarCategory_titleText btn-sm p-0 text-uppercase fw-bolder"><t t-esc="category.name"/></span>
|
||||
<div t-attf-class="o_DiscussSidebarCategory_title o_DiscussSidebarCategory_headerItem d-flex align-items-baseline mx-1 {{ o_DiscussSidebarCategory_hoverItem }}" t-on-click="onClick">
|
||||
<i class="o_DiscussSidebarCategory_titleIcon small" t-att-class="isOpen ? 'fa fa-chevron-down' : 'fa fa-chevron-right'"/>
|
||||
<span class="o_DiscussSidebarCategory_titleText btn-sm p-0 text-uppercase fw-bolder"><t t-esc="name"/></span>
|
||||
</div>
|
||||
<div class="o_DiscussSidebarCategory_headerItem flex-grow-1"/>
|
||||
<div class="o_DiscussSidebarCategory_commands o_DiscussSidebarCategory_headerItem d-flex me-3">
|
||||
<t t-if="category.hasViewCommand">
|
||||
<i t-attf-class="o_DiscussSidebarCategory_command o_DiscussSidebarCategory_commandView fa fa-cog {{ o_DiscussSidebarCategory_hoverItem }}" title="View or join channels" t-on-click="category.onClickCommandView" role="img"/>
|
||||
<t t-if="hasViewCommand">
|
||||
<i t-attf-class="o_DiscussSidebarCategory_command o_DiscussSidebarCategory_commandView fa fa-cog {{ o_DiscussSidebarCategory_hoverItem }}" title="View or join channels" t-on-click="onClickCommandView" role="img"/>
|
||||
</t>
|
||||
<t t-if="category.hasAddCommand and category.isOpen">
|
||||
<i t-attf-class="o_DiscussSidebarCategory_command o_DiscussSidebarCategory_commandAdd fa fa-plus {{ o_DiscussSidebarCategory_hoverItem }} ms-1" t-on-click="category.onClickCommandAdd" t-att-title="category.commandAddTitleText" role="img"/>
|
||||
<t t-if="hasAddCommand and isOpen">
|
||||
<i t-attf-class="o_DiscussSidebarCategory_command o_DiscussSidebarCategory_commandAdd fa fa-plus {{ o_DiscussSidebarCategory_hoverItem }} ms-1" t-on-click="onClickCommandAdd" t-att-title="commandAddTitleText" role="img"/>
|
||||
</t>
|
||||
</div>
|
||||
<t t-if="!category.isOpen and category.counter > 0">
|
||||
<t t-if="!isOpen and counter > 0">
|
||||
<div class="o_DiscussSidebarCategory_counter o_DiscussSidebarCategory_headerItem badge rounded-pill text-bg-primary me-3">
|
||||
<t t-esc="category.counter"/>
|
||||
<t t-esc="counter"/>
|
||||
</div>
|
||||
</t>
|
||||
</div>
|
||||
<div class="o_DiscussSidebarCategory_content">
|
||||
<t t-if="category.isOpen">
|
||||
<t t-if="category.addingItemAutocompleteInputView">
|
||||
<t t-if="isOpen">
|
||||
<t t-if="addingItemAutocompleteInputView">
|
||||
<div class="o_DiscussSidebarCategory_addingItem d-flex mb-2">
|
||||
<AutocompleteInputView
|
||||
className="'o_DiscussSidebarCategory_addingItemInput form-control mx-4 rounded'"
|
||||
record="category.addingItemAutocompleteInputView"
|
||||
record="addingItemAutocompleteInputView"
|
||||
/>
|
||||
</div>
|
||||
</t>
|
||||
<t t-foreach="category.filteredCategoryItems" t-as="item" t-key="item.localId">
|
||||
<t t-foreach="filteredCategoryItems" t-as="item" t-key="item.localId">
|
||||
<DiscussSidebarCategoryItem
|
||||
className="'o_DiscussSidebarCategory_item'"
|
||||
record="item"
|
||||
/>
|
||||
</t>
|
||||
</t>
|
||||
<t t-if="!category.isOpen and category.activeItem">
|
||||
<t t-if="!isOpen and activeItem">
|
||||
<DiscussSidebarCategoryItem
|
||||
className="'o_DiscussSidebarCategory_item'"
|
||||
record="category.activeItem"
|
||||
record="activeItem"
|
||||
/>
|
||||
</t>
|
||||
</div>
|
||||
</div>
|
||||
</t>
|
||||
</t>
|
||||
</templates>
|
||||
|
||||
+20
-22
@@ -1,48 +1,46 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<templates xml:space="preserve">
|
||||
<t t-name="mail.DiscussSidebarCategoryItem" owl="1">
|
||||
<t t-if="categoryItem">
|
||||
<t t-set="o_DiscussSidebarCategoryItem_hoverItem" t-value="'btn p-0 text-start text-700 opacity-100-hover opacity-75'"/>
|
||||
<button class="o_DiscussSidebarCategoryItem btn d-flex align-items-center w-100 px-0 py-2 border-0 rounded-0 fw-normal text-reset"
|
||||
t-att-class="{
|
||||
'bg-100': !categoryItem.isActive,
|
||||
'o-active bg-200': categoryItem.isActive,
|
||||
'o-unread': categoryItem.isUnread,
|
||||
}" t-attf-class="{{ className }}" t-on-click="categoryItem.onClick" t-att-data-channel-id="categoryItem.channel.id" t-att-data-channel-name="categoryItem.channel.displayName"
|
||||
'bg-100': !isActive,
|
||||
'o-active bg-200': isActive,
|
||||
'o-unread': isUnread,
|
||||
}" t-attf-class="{{ className }}" t-on-click="onClick" t-att-data-channel-id="channel.id" t-att-data-channel-name="channel.displayName"
|
||||
t-ref="root"
|
||||
>
|
||||
<div class="o_DiscussSidebarCategoryItem_item o_DiscussSidebarCategoryItem_avatar ms-4">
|
||||
<div class="o_DiscussSidebarCategoryItem_imageContainer position-relative d-flex">
|
||||
<img class="o_DiscussSidebarCategoryItem_image w-100 h-100 rounded-circle" t-att-src="categoryItem.avatarUrl" alt="Thread Image"/>
|
||||
<t t-if="categoryItem.threadIconView">
|
||||
<ThreadIconView className="'o_DiscussSidebarCategoryItem_threadIcon position-absolute bottom-0 end-0 d-flex align-items-center justify-content-center rounded-circle bg-100'" record="categoryItem.threadIconView"/>
|
||||
<img class="o_DiscussSidebarCategoryItem_image w-100 h-100 rounded-circle" t-att-src="avatarUrl" alt="Thread Image"/>
|
||||
<t t-if="threadIconView">
|
||||
<ThreadIconView className="'o_DiscussSidebarCategoryItem_threadIcon position-absolute bottom-0 end-0 d-flex align-items-center justify-content-center rounded-circle bg-100'" record="threadIconView"/>
|
||||
</t>
|
||||
</div>
|
||||
</div>
|
||||
<span class="o_DiscussSidebarCategoryItem_item o_DiscussSidebarCategoryItem_name ms-3 me-2 text-truncate" t-att-class="{ 'o-item-unread fw-bolder': categoryItem.isUnread }">
|
||||
<t t-esc="categoryItem.thread.displayName"/>
|
||||
<span class="o_DiscussSidebarCategoryItem_item o_DiscussSidebarCategoryItem_name ms-3 me-2 text-truncate" t-att-class="{ 'o-item-unread fw-bolder': isUnread }">
|
||||
<t t-esc="thread.displayName"/>
|
||||
</span>
|
||||
<div class="o_DiscussSidebarCategoryItem_item flex-grow-1"/>
|
||||
<div t-attf-class="o_DiscussSidebarCategoryItem_item o_DiscussSidebarCategoryItem_commands ms-1 {{ categoryItem.thread and categoryItem.thread.rtcSessions.length ? 'me-1' : 'me-3' }}">
|
||||
<t t-if="categoryItem.hasSettingsCommand">
|
||||
<div t-attf-class="o_DiscussSidebarCategoryItem_command o_DiscussSidebarCategoryItem_commandSettings fa fa-cog {{ o_DiscussSidebarCategoryItem_hoverItem }}" t-on-click="categoryItem.onClickCommandSettings" title="Channel settings" role="img"/>
|
||||
<div t-attf-class="o_DiscussSidebarCategoryItem_item o_DiscussSidebarCategoryItem_commands ms-1 {{ thread and thread.rtcSessions.length ? 'me-1' : 'me-3' }}">
|
||||
<t t-if="hasSettingsCommand">
|
||||
<div t-attf-class="o_DiscussSidebarCategoryItem_command o_DiscussSidebarCategoryItem_commandSettings fa fa-cog {{ o_DiscussSidebarCategoryItem_hoverItem }}" t-on-click="onClickCommandSettings" title="Channel settings" role="img"/>
|
||||
</t>
|
||||
<t t-if="categoryItem.hasLeaveCommand">
|
||||
<div t-attf-class="o_DiscussSidebarCategoryItem_command o_DiscussSidebarCategoryItem_commandLeave fa fa-times {{ o_DiscussSidebarCategoryItem_hoverItem }} ms-1" t-on-click="categoryItem.onClickCommandLeave" title="Leave this channel" role="img"/>
|
||||
<t t-if="hasLeaveCommand">
|
||||
<div t-attf-class="o_DiscussSidebarCategoryItem_command o_DiscussSidebarCategoryItem_commandLeave fa fa-times {{ o_DiscussSidebarCategoryItem_hoverItem }} ms-1" t-on-click="onClickCommandLeave" title="Leave this channel" role="img"/>
|
||||
</t>
|
||||
<t t-if="categoryItem.hasUnpinCommand">
|
||||
<div t-attf-class="o_DiscussSidebarCategoryItem_command o_DiscussSidebarCategoryItem_commandUnpin fa fa-times {{ o_DiscussSidebarCategoryItem_hoverItem }} ms-1" t-on-click="categoryItem.onClickCommandUnpin" title="Unpin Conversation" role="img"/>
|
||||
<t t-if="hasUnpinCommand">
|
||||
<div t-attf-class="o_DiscussSidebarCategoryItem_command o_DiscussSidebarCategoryItem_commandUnpin fa fa-times {{ o_DiscussSidebarCategoryItem_hoverItem }} ms-1" t-on-click="onClickCommandUnpin" title="Unpin Conversation" role="img"/>
|
||||
</t>
|
||||
</div>
|
||||
<t t-if="categoryItem.thread and categoryItem.thread.rtcSessions.length">
|
||||
<div class="o_DiscussSidebarCategoryItem_item o_DiscussSidebarCategoryItem_callIndicator fa fa-volume-up ms-1 me-3" t-att-class="{ 'o-isCalling text-danger': categoryItem.thread.rtc }"/>
|
||||
<t t-if="thread and thread.rtcSessions.length">
|
||||
<div class="o_DiscussSidebarCategoryItem_item o_DiscussSidebarCategoryItem_callIndicator fa fa-volume-up ms-1 me-3" t-att-class="{ 'o-isCalling text-danger': thread.rtc }"/>
|
||||
</t>
|
||||
<t t-if="categoryItem.counter > 0">
|
||||
<t t-if="counter > 0">
|
||||
<div class="o_DiscussSidebarCategoryItem_counter o_DiscussSidebarCategoryItem_item badge rounded-pill text-bg-primary ms-1 me-3">
|
||||
<t t-esc="categoryItem.counter"/>
|
||||
<t t-esc="counter"/>
|
||||
</div>
|
||||
</t>
|
||||
</button>
|
||||
</t>
|
||||
</t>
|
||||
</templates>
|
||||
|
||||
+10
-10
@@ -3,20 +3,20 @@
|
||||
<t t-name="mail.DiscussSidebarMailboxView" owl="1">
|
||||
<button class="o_DiscussSidebarMailboxView btn d-flex align-items-center py-1 px-0 border-0 rounded-0 fw-normal text-dark"
|
||||
t-att-class="{
|
||||
'bg-100': discussSidebarMailboxView.mailbox.thread !== messaging.discuss.activeThread,
|
||||
'o-active bg-200': discussSidebarMailboxView.mailbox.thread === messaging.discuss.activeThread,
|
||||
'o-starred-box': discussSidebarMailboxView.mailbox === messaging.starred,
|
||||
}" t-attf-class="{{ className }}" t-on-click="discussSidebarMailboxView.mailbox.thread.onClick" t-att-data-mailbox-local-id="discussSidebarMailboxView.mailbox.localId" t-att-data-mailbox-name="discussSidebarMailboxView.mailbox.name"
|
||||
'bg-100': mailbox.thread !== messaging.discuss.activeThread,
|
||||
'o-active bg-200': mailbox.thread === messaging.discuss.activeThread,
|
||||
'o-starred-box': mailbox === messaging.starred,
|
||||
}" t-attf-class="{{ className }}" t-on-click="mailbox.thread.onClick" t-att-data-mailbox-local-id="mailbox.localId" t-att-data-mailbox-name="mailbox.name"
|
||||
t-ref="root"
|
||||
>
|
||||
<ThreadIconView className="'o_DiscussSidebarMailboxView_item ms-4 me-2'" record="discussSidebarMailboxView.threadIconView"/>
|
||||
<ThreadIconView className="'o_DiscussSidebarMailboxView_item ms-4 me-2'" record="threadIconView"/>
|
||||
<div class="o_DiscussSidebarMailboxView_item o_DiscussSidebarMailboxView_name me-2 text-truncate">
|
||||
<t t-esc="discussSidebarMailboxView.mailbox.name"/>
|
||||
<t t-esc="mailbox.name"/>
|
||||
</div>
|
||||
<div t-attf-class="o_DiscussSidebarMailboxView_item flex-grow-1 {{ discussSidebarMailboxView.mailbox.counter === 0 ? 'me-3': '' }}"/>
|
||||
<t t-if="discussSidebarMailboxView.mailbox.counter > 0">
|
||||
<div t-attf-class="o_DiscussSidebarMailboxView_counter o_DiscussSidebarMailboxView_item badge rounded-pill {{ discussSidebarMailboxView.mailbox === messaging.starred ? 'bg-400 text-light' : 'text-bg-primary' }} ms-1 me-3">
|
||||
<t t-esc="discussSidebarMailboxView.mailbox.counter"/>
|
||||
<div t-attf-class="o_DiscussSidebarMailboxView_item flex-grow-1 {{ mailbox.counter === 0 ? 'me-3': '' }}"/>
|
||||
<t t-if="mailbox.counter > 0">
|
||||
<div t-attf-class="o_DiscussSidebarMailboxView_counter o_DiscussSidebarMailboxView_item badge rounded-pill {{ mailbox === messaging.starred ? 'bg-400 text-light' : 'text-bg-primary' }} ms-1 me-3">
|
||||
<t t-esc="mailbox.counter"/>
|
||||
</div>
|
||||
</t>
|
||||
</button>
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
<templates xml:space="preserve">
|
||||
|
||||
<t t-name="mail.DropZoneView" owl="1">
|
||||
<div class="o_DropZoneView position-absolute top-0 start-0 align-items-center justify-content-center d-flex w-100 h-100 border-primary bg-view text-primary opacity-75" t-att-class="{ 'o-dragging-inside': dropZoneView.isDraggingInside }" t-attf-class="{{ className }}" t-on-dragenter="dropZoneView.onDragenter" t-on-dragleave="dropZoneView.onDragleave" t-on-dragover="dropZoneView.onDragover" t-on-drop="dropZoneView.onDrop" t-ref="root">
|
||||
<div class="o_DropZoneView position-absolute top-0 start-0 align-items-center justify-content-center d-flex w-100 h-100 border-primary bg-view text-primary opacity-75" t-att-class="{ 'o-dragging-inside': isDraggingInside }" t-attf-class="{{ className }}" t-on-dragenter="onDragenter" t-on-dragleave="onDragleave" t-on-dragover="onDragover" t-on-drop="onDrop" t-ref="root">
|
||||
<h4>
|
||||
Drag Files Here <i class="fa fa-download"/>
|
||||
</h4>
|
||||
|
||||
+1
-1
@@ -3,7 +3,7 @@
|
||||
|
||||
<t t-name="mail.EmojiCategoryBarView" owl="1">
|
||||
<div class="o_EmojiCategoryBarView d-flex flex-shrink-0 overflow-auto border-end" t-attf-class="{{ className }}" t-ref="root">
|
||||
<t t-foreach="emojiCategoryBarView.emojiCategoryViews" t-as="emojiCategoryView" t-key="emojiCategoryView.localId">
|
||||
<t t-foreach="emojiCategoryViews" t-as="emojiCategoryView" t-key="emojiCategoryView.localId">
|
||||
<EmojiCategoryView record="emojiCategoryView"/>
|
||||
</t>
|
||||
</div>
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
<templates xml:space="preserve">
|
||||
|
||||
<t t-name="mail.EmojiCategoryView" owl="1">
|
||||
<span class="o_EmojiCategoryView flex-grow-1 px-2 py-1 fs-5 cursor-pointer" t-att-class="(emojiCategoryView.isHovered or emojiCategoryView.isActive) ? 'active bg-view' : 'border-bottom'" t-att-title="emojiCategoryView.category.name" t-on-click="emojiCategoryView.onClick" t-on-mouseenter="emojiCategoryView.onMouseenter" t-on-mouseleave="emojiCategoryView.onMouseleave" t-attf-class="{{ className }}" t-ref="root">
|
||||
<t t-esc="emojiCategoryView.category.title"/>
|
||||
<span class="o_EmojiCategoryView flex-grow-1 px-2 py-1 fs-5 cursor-pointer" t-att-class="(isHovered or isActive) ? 'active bg-view' : 'border-bottom'" t-att-title="category.name" t-on-click="onClick" t-on-mouseenter="onMouseenter" t-on-mouseleave="onMouseleave" t-attf-class="{{ className }}" t-ref="root">
|
||||
<t t-esc="category.title"/>
|
||||
</span>
|
||||
</t>
|
||||
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
<templates xml:space="preserve">
|
||||
|
||||
<t t-name="mail.EmojiGridItemView" owl="1">
|
||||
<div class="o_EmojiGridItemView d-flex justify-content-center" t-attf-style="width: {{emojiGridItemView.width}}px;">
|
||||
<EmojiView t-if="emojiGridItemView.emojiView" className="'o_EmojiGrid_emoji w-100 h-100'" record="emojiGridItemView.emojiView"/>
|
||||
<div class="o_EmojiGridItemView d-flex justify-content-center" t-attf-style="width: {{width}}px;">
|
||||
<EmojiView t-if="emojiView" className="'o_EmojiGrid_emoji w-100 h-100'" record="emojiView"/>
|
||||
</div>
|
||||
</t>
|
||||
</templates>
|
||||
|
||||
+1
-1
@@ -4,7 +4,7 @@
|
||||
<t t-name="mail.EmojiGridLoadingScreen" owl="1">
|
||||
<div class="o_EmojiGridLoadingScreen d-flex flex-column justify-content-center align-items-center w-100 h-100" t-attf-class="{{ className }}" t-ref="root">
|
||||
<div class="o_EmojiGridLoadingScreen_spinner fa fa-circle-o-notch fa-spin fs-1"/>
|
||||
<span class="o_EmojiGridLoadingScreen_text text-muted mt-4" t-out="EmojiGridLoadingScreen.text"/>
|
||||
<span class="o_EmojiGridLoadingScreen_text text-muted mt-4" t-out="text"/>
|
||||
</div>
|
||||
</t>
|
||||
</templates>
|
||||
|
||||
@@ -3,9 +3,9 @@
|
||||
|
||||
<t t-name="mail.EmojiGridRowView" owl="1">
|
||||
<div class="o_EmojiGridRowView">
|
||||
<EmojiGridSectionView t-if="emojiGridRowView.sectionView" record="emojiGridRowView.sectionView"/>
|
||||
<EmojiGridSectionView t-if="sectionView" record="sectionView"/>
|
||||
<t t-else="">
|
||||
<t t-foreach="emojiGridRowView.items" t-as="item" t-key="item">
|
||||
<t t-foreach="items" t-as="item" t-key="item">
|
||||
<EmojiGridItemView className="'o_EmojiGridRowView_item'" record="item"/>
|
||||
</t>
|
||||
</t>
|
||||
|
||||
+1
-1
@@ -4,7 +4,7 @@
|
||||
<t t-name="mail.EmojiGridSearchNoContentView" owl="1">
|
||||
<div class="o_EmojiGridSearchNoContentView d-flex flex-column justify-content-center align-items-center w-100 h-100" t-attf-class="{{ className }}" t-ref="root">
|
||||
<div class="o_EmojiGridSearchNoContentView_image">😢</div>
|
||||
<span class="o_EmojiGridSearchNoContentView_text text-muted" t-out="emojiGridSearchNoContentView.text"/>
|
||||
<span class="o_EmojiGridSearchNoContentView_text text-muted" t-out="text"/>
|
||||
</div>
|
||||
</t>
|
||||
</templates>
|
||||
|
||||
+1
-1
@@ -3,7 +3,7 @@
|
||||
|
||||
<t t-name="mail.EmojiGridSectionView" owl="1">
|
||||
<div class="o_EmojiGridSectionView d-flex justify-content-center align-items-end mx-2 text-truncate">
|
||||
<span t-out="emojiGridSectionView.category.name"/>
|
||||
<span t-out="category.name"/>
|
||||
</div>
|
||||
</t>
|
||||
</templates>
|
||||
|
||||
@@ -2,12 +2,12 @@
|
||||
<templates xml:space="preserve">
|
||||
|
||||
<t t-name="mail.EmojiGridView" owl="1">
|
||||
<div class="o_EmojiGridView o_EmojiGridView_container" t-attf-style="--rowHeight: {{emojiGridView.rowHeight}}px; --itemWidth: {{emojiGridView.itemWidth}}px; height: {{emojiGridView.height}}px; width: {{emojiGridView.width}}px;" t-on-scroll="emojiGridView.onScroll" t-ref="containerRef">
|
||||
<EmojiGridLoadingScreen t-if="!this.messaging.emojiRegistry.isLoaded" record="emojiGridView.loadingScreenView"/>
|
||||
<EmojiGridSearchNoContentView t-if="emojiGridView.searchNoContentView" record="emojiGridView.searchNoContentView"/>
|
||||
<div t-if="!emojiGridView.searchNoContentView" class="o_EmojiGridView_list" t-attf-style="height: {{emojiGridView.listHeight}}px; min-height: {{emojiGridView.listHeight}}px;" t-ref="listRef">
|
||||
<div t-if="emojiGridView.lastRenderedRowIndex >= emojiGridView.firstRenderedRowIndex" class="o_EmojiGridView_viewBlock" t-attf-style="top: {{ emojiGridView.distanceFromTop - emojiGridView.distanceInRowOffset }}px; width: {{ emojiGridView.width }}px;" t-ref="viewBlockRef">
|
||||
<EmojiGridRowView t-foreach="emojiGridView.renderedRows" t-as="row" t-key="row" record="row"/>
|
||||
<div class="o_EmojiGridView o_EmojiGridView_container" t-attf-style="--rowHeight: {{rowHeight}}px; --itemWidth: {{itemWidth}}px; height: {{height}}px; width: {{width}}px;" t-on-scroll="onScroll" t-ref="containerRef">
|
||||
<EmojiGridLoadingScreen t-if="!this.messaging.emojiRegistry.isLoaded" record="loadingScreenView"/>
|
||||
<EmojiGridSearchNoContentView t-if="searchNoContentView" record="searchNoContentView"/>
|
||||
<div t-if="!searchNoContentView" class="o_EmojiGridView_list" t-attf-style="height: {{listHeight}}px; min-height: {{listHeight}}px;" t-ref="listRef">
|
||||
<div t-if="lastRenderedRowIndex >= firstRenderedRowIndex" class="o_EmojiGridView_viewBlock" t-attf-style="top: {{ distanceFromTop - distanceInRowOffset }}px; width: {{ width }}px;" t-ref="viewBlockRef">
|
||||
<EmojiGridRowView t-foreach="renderedRows" t-as="row" t-key="row" record="row"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
+1
-1
@@ -3,7 +3,7 @@
|
||||
|
||||
<t t-name="mail.EmojiPickerHeaderActionListView" owl="1">
|
||||
<div class="o_EmojiPickerHeaderActionListView d-flex" t-attf-class="{{ className }}" t-ref="root">
|
||||
<EmojiPickerHeaderActionView t-foreach="emojiPickerHeaderActionListView.actionViews" t-as="actionView" t-key="actionView" record="actionView"/>
|
||||
<EmojiPickerHeaderActionView t-foreach="actionViews" t-as="actionView" t-key="actionView" record="actionView"/>
|
||||
</div>
|
||||
</t>
|
||||
|
||||
|
||||
+2
-2
@@ -4,10 +4,10 @@
|
||||
<t t-name="mail.EmojiPickerHeaderActionView" owl="1">
|
||||
<div class="o_EmojiPickerHeaderActionView d-flex" t-attf-class="{{ className }}" t-ref="root">
|
||||
<t
|
||||
t-component="constructor.components[emojiPickerHeaderActionView.contentComponentName]"
|
||||
t-component="constructor.components[contentComponentName]"
|
||||
t-props="{
|
||||
className: `o_EmojiPickerHeaderActionView_content`,
|
||||
record: emojiPickerHeaderActionView.content,
|
||||
record: content,
|
||||
}"
|
||||
/>
|
||||
</div>
|
||||
|
||||
+2
-2
@@ -3,9 +3,9 @@
|
||||
|
||||
<t t-name="mail.EmojiPickerHeaderView" owl="1">
|
||||
<div class="o_EmojiPickerHeaderView d-flex bg-100 border-bottom" t-attf-class="{{ className }}" t-ref="root">
|
||||
<EmojiCategoryBarView record="emojiPickerHeaderView.emojiCategoryBarView"/>
|
||||
<EmojiCategoryBarView record="emojiCategoryBarView"/>
|
||||
<span class="flex-grow-1"/>
|
||||
<EmojiPickerHeaderActionListView t-if="emojiPickerHeaderView.actionListView" record="emojiPickerHeaderView.actionListView"/>
|
||||
<EmojiPickerHeaderActionListView t-if="actionListView" record="actionListView"/>
|
||||
</div>
|
||||
</t>
|
||||
|
||||
|
||||
@@ -3,9 +3,9 @@
|
||||
|
||||
<t t-name="mail.EmojiPickerView" owl="1">
|
||||
<div class="o_EmojiPickerView d-flex flex-column" t-attf-class="{{ className }}" t-ref="root">
|
||||
<EmojiPickerHeaderView record="emojiPickerView.headerView"/>
|
||||
<EmojiSearchBarView record="emojiPickerView.emojiSearchBarView"/>
|
||||
<EmojiGridView record="emojiPickerView.emojiGridView"/>
|
||||
<EmojiPickerHeaderView record="headerView"/>
|
||||
<EmojiSearchBarView record="emojiSearchBarView"/>
|
||||
<EmojiGridView record="emojiGridView"/>
|
||||
</div>
|
||||
</t>
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<t t-name="mail.EmojiSearchBarView" owl="1">
|
||||
<div class="o_EmojiSearchBarView overflow-auto d-flex flex-shrink-0 p-2 flex-column border-bottom" t-attf-class="{{ className }}" t-ref="root">
|
||||
<div class="o_EmojiSearchBarView_inputContainer d-flex flex-grow-1 align-items-center">
|
||||
<input class="o_EmojiSearchBarView_searchInput o_input form-control overflow-auto flex-fill" t-att-placeholder="emojiSearchBarView.placeholder" t-on-focusin="emojiSearchBarView.onFocusinInput" t-on-focusout="emojiSearchBarView.onFocusoutInput" t-on-input="emojiSearchBarView.onInput" t-ref="input"/>
|
||||
<input class="o_EmojiSearchBarView_searchInput o_input form-control overflow-auto flex-fill" t-att-placeholder="placeholder" t-on-focusin="onFocusinInput" t-on-focusout="onFocusoutInput" t-on-input="onInput" t-ref="input"/>
|
||||
<i class="o_EmojiSearchBarView_icon oi oi-search ps-2" title="Search..." role="img" aria-label="Search..."/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
<templates xml:space="preserve">
|
||||
|
||||
<t t-name="mail.EmojiView" owl="1">
|
||||
<span class="o_EmojiView p-1 fs-3 cursor-pointer" t-att-class="emojiView.emojiGridViewAsHovered ? 'bg-200' : ''" t-on-click="emojiView.onClick" t-on-mouseenter="emojiView.onMouseenter" t-on-mouseleave="emojiView.onMouseleave" t-att-title="emojiView.emoji.name" t-att-data-source="emojiView.emoji.sources[0]" t-att-data-codepoints="emojiView.emoji.codepoints" t-attf-class="{{ className }}" t-ref="root">
|
||||
<t t-esc="emojiView.emoji.codepoints"/>
|
||||
<span class="o_EmojiView p-1 fs-3 cursor-pointer" t-att-class="emojiGridViewAsHovered ? 'bg-200' : ''" t-on-click="onClick" t-on-mouseenter="onMouseenter" t-on-mouseleave="onMouseleave" t-att-title="emoji.name" t-att-data-source="emoji.sources[0]" t-att-data-codepoints="emoji.codepoints" t-attf-class="{{ className }}" t-ref="root">
|
||||
<t t-esc="emoji.codepoints"/>
|
||||
</span>
|
||||
</t>
|
||||
|
||||
|
||||
@@ -2,31 +2,29 @@
|
||||
<templates xml:space="preserve">
|
||||
|
||||
<t t-name="mail.FollowButtonView" owl="1">
|
||||
<t t-if="followButtonView">
|
||||
<div class="o_FollowButtonView d-flex" t-attf-class="{{ className }}" t-ref="root">
|
||||
<t t-if="followButtonView.chatterOwner.thread and followButtonView.chatterOwner.thread.isCurrentPartnerFollowing">
|
||||
<button class="o_FollowButtonView_unfollow btn px-0" t-att-class="{ 'o_ChatterTopbar_button': followButtonView.chatterOwner, 'o-following text-success': !followButtonView.isUnfollowButtonHighlighted, 'o-unfollow text-warning': followButtonView.isUnfollowButtonHighlighted }" t-att-disabled="followButtonView.isDisabled" t-on-click="followButtonView.onClickUnfollow" t-on-mouseenter="followButtonView.onMouseEnterUnfollow" t-on-mouseleave="followButtonView.onMouseleaveUnfollow">
|
||||
<t t-if="chatterOwner.thread and chatterOwner.thread.isCurrentPartnerFollowing">
|
||||
<button class="o_FollowButtonView_unfollow btn px-0" t-att-class="{ 'o_ChatterTopbar_button': chatterOwner, 'o-following text-success': !isUnfollowButtonHighlighted, 'o-unfollow text-warning': isUnfollowButtonHighlighted }" t-att-disabled="isDisabled" t-on-click="onClickUnfollow" t-on-mouseenter="onMouseEnterUnfollow" t-on-mouseleave="onMouseleaveUnfollow">
|
||||
<div class="position-relative">
|
||||
<!-- Hidden element used to set the button maximum size -->
|
||||
<span class="invisible">
|
||||
<i class="fa fa-fw fa fa-eye-slash"/> <t t-out="followButtonView.followingText.length > followButtonView.unfollowingText.length ? followButtonView.followingText : followButtonView.unfollowingText"></t>
|
||||
<i class="fa fa-fw fa fa-eye-slash"/> <t t-out="followingText.length > unfollowingText.length ? followingText : unfollowingText"></t>
|
||||
</span>
|
||||
<span t-if="followButtonView.isUnfollowButtonHighlighted" class="o_FollowButtonView_text position-absolute end-0 top-0 bottom-0 text-warning">
|
||||
<i class="fa fa-fw fa-times"/> <span t-out="followButtonView.unfollowingText"/>
|
||||
<span t-if="isUnfollowButtonHighlighted" class="o_FollowButtonView_text position-absolute end-0 top-0 bottom-0 text-warning">
|
||||
<i class="fa fa-fw fa-times"/> <span t-out="unfollowingText"/>
|
||||
</span>
|
||||
<span t-else="" class="o_FollowButtonView_text d-block position-absolute end-0 top-0 bottom-0">
|
||||
<i class="fa fa-fw fa-check"/> <span t-out="followButtonView.followingText"/>
|
||||
<i class="fa fa-fw fa-check"/> <span t-out="followingText"/>
|
||||
</span>
|
||||
</div>
|
||||
</button>
|
||||
</t>
|
||||
<t t-else="">
|
||||
<button class="o_FollowButtonView_follow btn btn-link text-600 pe-0" t-att-disabled="followButtonView.isDisabled" t-on-click="followButtonView.onClickFollow" t-att-class="{ 'o_ChatterTopbar_button': followButtonView.chatterOwner }">
|
||||
<button class="o_FollowButtonView_follow btn btn-link text-600 pe-0" t-att-disabled="isDisabled" t-on-click="onClickFollow" t-att-class="{ 'o_ChatterTopbar_button': chatterOwner }">
|
||||
Follow
|
||||
</button>
|
||||
</t>
|
||||
</div>
|
||||
</t>
|
||||
</t>
|
||||
|
||||
</templates>
|
||||
|
||||
@@ -2,22 +2,20 @@
|
||||
<templates xml:space="preserve">
|
||||
|
||||
<t t-name="mail.FollowerView" owl="1">
|
||||
<t t-if="followerView">
|
||||
<div class="o_FollowerView d-flex justify-content-between p-0" t-attf-class="{{ className }}" t-ref="root">
|
||||
<a class="o_FollowerView_details d-flex align-items-center flex-grow-1 px-3 text-700" t-att-class="{ 'o-inactive fst-italic opacity-25': !followerView.follower.isActive }" href="#" role="menuitem" t-on-click="followerView.onClickDetails">
|
||||
<img class="o_FollowerView_avatar me-2 rounded-circle" t-att-src="followerView.follower.partner.avatarUrl" alt=""/>
|
||||
<span class="o_FollowerView_name flex-shrink text-truncate" t-esc="followerView.follower.partner.nameOrDisplayName"/>
|
||||
<a class="o_FollowerView_details d-flex align-items-center flex-grow-1 px-3 text-700" t-att-class="{ 'o-inactive fst-italic opacity-25': !follower.isActive }" href="#" role="menuitem" t-on-click="onClickDetails">
|
||||
<img class="o_FollowerView_avatar me-2 rounded-circle" t-att-src="follower.partner.avatarUrl" alt=""/>
|
||||
<span class="o_FollowerView_name flex-shrink text-truncate" t-esc="follower.partner.nameOrDisplayName"/>
|
||||
</a>
|
||||
<t t-if="followerView.follower.isEditable">
|
||||
<button class="o_FollowerView_button o_FollowerView_editButton btn btn-icon rounded-0" title="Edit subscription" aria-label="Edit subscription" t-on-click="followerView.onClickEdit">
|
||||
<t t-if="follower.isEditable">
|
||||
<button class="o_FollowerView_button o_FollowerView_editButton btn btn-icon rounded-0" title="Edit subscription" aria-label="Edit subscription" t-on-click="onClickEdit">
|
||||
<i class="fa fa-pencil"/>
|
||||
</button>
|
||||
<button class="o_FollowerView_button o_FollowerView_removeButton btn btn-icon rounded-0" title="Remove this follower" aria-label="Remove this follower" t-on-click="followerView.onClickRemove">
|
||||
<button class="o_FollowerView_button o_FollowerView_removeButton btn btn-icon rounded-0" title="Remove this follower" aria-label="Remove this follower" t-on-click="onClickRemove">
|
||||
<i class="fa fa-remove"/>
|
||||
</button>
|
||||
</t>
|
||||
</div>
|
||||
</t>
|
||||
</t>
|
||||
|
||||
</templates>
|
||||
|
||||
@@ -2,32 +2,31 @@
|
||||
<templates xml:space="preserve">
|
||||
|
||||
<t t-name="mail.FollowerListMenuView" owl="1">
|
||||
<t t-if="followerListMenuView">
|
||||
<div class="o_FollowerListMenuView position-relative d-flex" t-attf-class="{{ className }}" t-on-keydown="followerListMenuView.onKeydown" t-ref="root">
|
||||
<div class="o_FollowerListMenuView position-relative d-flex" t-attf-class="{{ className }}" t-on-keydown="onKeydown" t-ref="root">
|
||||
<div class="o_FollowerListMenuView_followers d-flex" t-ref="dropdown">
|
||||
<button class="o_FollowerListMenuView_buttonFollowers o_ChatterTopbar_button btn btn-light" t-att-disabled="followerListMenuView.isDisabled" t-att-aria-expanded="followerListMenuView.isDropdownOpen ? 'true' : 'false'" t-on-click="followerListMenuView.onClickFollowersButton" aria-label="Show Followers">
|
||||
<button class="o_FollowerListMenuView_buttonFollowers o_ChatterTopbar_button btn btn-light" t-att-disabled="isDisabled" t-att-aria-expanded="isDropdownOpen ? 'true' : 'false'" t-on-click="onClickFollowersButton" aria-label="Show Followers">
|
||||
<i class="fa fa-user-o" role="img"/>
|
||||
<span class="o_FollowerListMenuView_buttonFollowersCount ps-1" t-esc="followerListMenuView.followerViews.length"/>
|
||||
<span class="o_FollowerListMenuView_buttonFollowersCount ps-1" t-esc="followerViews.length"/>
|
||||
</button>
|
||||
|
||||
<t t-if="followerListMenuView.isDropdownOpen">
|
||||
<t t-if="isDropdownOpen">
|
||||
<div class="o_FollowerListMenuView_dropdown o-dropdown-menu dropdown-menu-end flex-column d-flex" role="menu">
|
||||
<t t-if="followerListMenuView.chatterOwner.thread.model !== 'channel' and followerListMenuView.chatterOwner.thread.hasWriteAccess">
|
||||
<a class="o_FollowerListMenuView_addFollowersButton dropdown-item" href="#" role="menuitem" t-on-click="followerListMenuView.onClickAddFollowers">
|
||||
<t t-if="chatterOwner.thread.model !== 'channel' and chatterOwner.thread.hasWriteAccess">
|
||||
<a class="o_FollowerListMenuView_addFollowersButton dropdown-item" href="#" role="menuitem" t-on-click="onClickAddFollowers">
|
||||
Add Followers
|
||||
</a>
|
||||
<t t-if="followerListMenuView.followerViews.length > 0">
|
||||
<t t-if="followerViews.length > 0">
|
||||
<div role="separator" class="dropdown-divider"/>
|
||||
</t>
|
||||
</t>
|
||||
<t t-if="followerListMenuView.followerViews.length > 0">
|
||||
<t t-if="followerViews.length > 0">
|
||||
<FollowerView
|
||||
t-foreach="followerListMenuView.followerViews" t-as="followerView" t-key="followerView.localId"
|
||||
t-foreach="followerViews" t-as="followerView" t-key="followerView.localId"
|
||||
className="'o_FollowerMenu_follower dropdown-item'"
|
||||
record="followerView"
|
||||
/>
|
||||
</t>
|
||||
<t t-elif="!followerListMenuView.chatterOwner.thread.hasWriteAccess">
|
||||
<t t-elif="!chatterOwner.thread.hasWriteAccess">
|
||||
<div class="o_FollowerListMenuView_noFollowers dropdown-item disabled">
|
||||
No Followers
|
||||
</div>
|
||||
@@ -36,7 +35,6 @@
|
||||
</t>
|
||||
</div>
|
||||
</div>
|
||||
</t>
|
||||
</t>
|
||||
|
||||
</templates>
|
||||
|
||||
@@ -2,14 +2,12 @@
|
||||
<templates xml:space="preserve">
|
||||
|
||||
<t t-name="mail.FollowerSubtypeView" owl="1">
|
||||
<t t-if="followerSubtypeView">
|
||||
<div class="o_FollowerSubtypeView" t-attf-class="{{ className }}" t-att-data-follower-subtype-id="followerSubtypeView.subtype.id" t-ref="root">
|
||||
<div class="o_FollowerSubtypeView" t-attf-class="{{ className }}" t-att-data-follower-subtype-id="subtype.id" t-ref="root">
|
||||
<label class="o_FollowerSubtypeView_label flex-grow-1 align-items-center d-flex mb-0 p-2 cursor-pointer">
|
||||
<input class="o_FollowerSubtypeView_checkbox form-check-input me-2" type="checkbox" t-att-checked="followerSubtypeView.follower.selectedSubtypes.includes(followerSubtypeView.subtype) ? 'checked': ''" t-on-change="followerSubtypeView.onChangeCheckbox"/>
|
||||
<t t-esc="followerSubtypeView.subtype.name"/>
|
||||
<input class="o_FollowerSubtypeView_checkbox form-check-input me-2" type="checkbox" t-att-checked="follower.selectedSubtypes.includes(subtype) ? 'checked': ''" t-on-change="onChangeCheckbox"/>
|
||||
<t t-esc="subtype.name"/>
|
||||
</label>
|
||||
</div>
|
||||
</t>
|
||||
</t>
|
||||
|
||||
</templates>
|
||||
|
||||
@@ -2,18 +2,17 @@
|
||||
<templates xml:space="preserve">
|
||||
|
||||
<t t-name="mail.FollowerSubtypeList" owl="1">
|
||||
<t t-if="followerSubtypeList">
|
||||
<div class="o_FollowerSubtypeList modal-dialog" t-attf-class="{{ className }}" t-ref="root">
|
||||
<div class="modal-content">
|
||||
<header class="modal-header">
|
||||
<h4 class="modal-title">
|
||||
Edit Subscription of <t t-esc="followerSubtypeList.follower.partner.nameOrDisplayName"/>
|
||||
Edit Subscription of <t t-esc="follower.partner.nameOrDisplayName"/>
|
||||
</h4>
|
||||
<i class="o_FollowerSubtypeList_closeButton close fa fa-times" aria-label="Close" t-on-click="followerSubtypeList.onClickCancel"/>
|
||||
<i class="o_FollowerSubtypeList_closeButton close fa fa-times" aria-label="Close" t-on-click="onClickCancel"/>
|
||||
</header>
|
||||
<main class="modal-body">
|
||||
<div class="o_FollowerSubtypeList_subtypes flex-column d-flex">
|
||||
<t t-foreach="followerSubtypeList.followerSubtypeViews" t-as="followerSubtypeView" t-key="followerSubtypeView.localId">
|
||||
<t t-foreach="followerSubtypeViews" t-as="followerSubtypeView" t-key="followerSubtypeView.localId">
|
||||
<FollowerSubtypeView
|
||||
className="'o_FollowerSubtypeList_subtype'"
|
||||
record="followerSubtypeView"
|
||||
@@ -22,16 +21,15 @@
|
||||
</div>
|
||||
</main>
|
||||
<div class="modal-footer">
|
||||
<button class="o-apply btn btn-primary" t-on-click="followerSubtypeList.onClickApply">
|
||||
<button class="o-apply btn btn-primary" t-on-click="onClickApply">
|
||||
Apply
|
||||
</button>
|
||||
<button class="o-cancel btn btn-secondary" t-on-click="followerSubtypeList.onClickCancel">
|
||||
<button class="o-cancel btn btn-secondary" t-on-click="onClickCancel">
|
||||
Cancel
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</t>
|
||||
</t>
|
||||
|
||||
</templates>
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<templates xml:space="preserve">
|
||||
<t t-name="mail.LinkPreviewAsideView" owl="1">
|
||||
<button class="o_LinkPreviewAside btn" t-attf-class="{{ className }}" t-on-click="linkPreviewAsideView.onClick" t-ref="root">
|
||||
<button class="o_LinkPreviewAside btn" t-attf-class="{{ className }}" t-on-click="onClick" t-ref="root">
|
||||
<i class="o_LinkPreviewAside_itemUnlinkIcon fa fa-times"/>
|
||||
</button>
|
||||
</t>
|
||||
|
||||
@@ -1,27 +1,27 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<templates xml:space="preserve">
|
||||
<t t-name="mail.LinkPreviewCardView" owl="1">
|
||||
<div class="o_LinkPreviewCardView card position-relative w-100 mb-2 rounded bg-view shadow-sm overflow-hidden" t-att-class="{ 'me-2': !linkPreviewCardView.linkPreviewListViewOwner.messageViewOwner.isInChatWindow }" t-attf-class="{{ className }}" t-on-mouseenter="linkPreviewCardView.onMouseEnter" t-on-mouseleave="linkPreviewCardView.onMouseLeave" t-ref="root">
|
||||
<div class="o_LinkPreviewCardView card position-relative w-100 mb-2 rounded bg-view shadow-sm overflow-hidden" t-att-class="{ 'me-2': !linkPreviewListViewOwner.messageViewOwner.isInChatWindow }" t-attf-class="{{ className }}" t-on-mouseenter="onMouseEnter" t-on-mouseleave="onMouseLeave" t-ref="root">
|
||||
<div class="row g-0 flex-row-reverse h-100">
|
||||
<div class="col min-w-0" t-att-class="{ 'd-flex align-items-center': !linkPreviewCardView.linkPreview.og_description }">
|
||||
<div class="col min-w-0" t-att-class="{ 'd-flex align-items-center': !linkPreview.og_description }">
|
||||
<div class="o_LinkPreviewCardView_content p-3">
|
||||
<h6 class="o_LinkPreviewCardView_title card-title mb-0 me-2" t-attf-class="{{ linkPreviewCardView.linkPreview.og_description ? 'text-truncate' : 'o_LinkPreviewCardView_hasMultineLines overflow-hidden' }}">
|
||||
<a t-att-href="linkPreviewCardView.linkPreview.source_url" target="_blank" t-out="linkPreviewCardView.linkPreview.og_title"/>
|
||||
<h6 class="o_LinkPreviewCardView_title card-title mb-0 me-2" t-attf-class="{{ linkPreview.og_description ? 'text-truncate' : 'o_LinkPreviewCardView_hasMultineLines overflow-hidden' }}">
|
||||
<a t-att-href="linkPreview.source_url" target="_blank" t-out="linkPreview.og_title"/>
|
||||
</h6>
|
||||
<p t-if="linkPreviewCardView.linkPreview.og_description" class="o_LinkPreviewCardView_description o_LinkPreviewCardView_hasMultineLines card-text mb-0 mt-2 text-muted small overflow-hidden" t-out="linkPreviewCardView.linkPreview.og_description"/>
|
||||
<p t-if="linkPreview.og_description" class="o_LinkPreviewCardView_description o_LinkPreviewCardView_hasMultineLines card-text mb-0 mt-2 text-muted small overflow-hidden" t-out="linkPreview.og_description"/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="o_LinkPreviewCardView_imageLinkWrap col-4 d-block">
|
||||
<a t-att-href="linkPreviewCardView.linkPreview.source_url" class="o_LinkPreviewCardView_imageLink" target="_blank">
|
||||
<img t-if="linkPreviewCardView.linkPreview.og_image" class="o_LinkPreviewCardView_image w-100 h-100 o_object_fit_cover" t-att-src="linkPreviewCardView.linkPreview.og_image" t-att-alt="linkPreviewCardView.linkPreview.og_title"/>
|
||||
<a t-att-href="linkPreview.source_url" class="o_LinkPreviewCardView_imageLink" target="_blank">
|
||||
<img t-if="linkPreview.og_image" class="o_LinkPreviewCardView_image w-100 h-100 o_object_fit_cover" t-att-src="linkPreview.og_image" t-att-alt="linkPreview.og_title"/>
|
||||
<span t-else="" class="o_LinkPreviewCardView_imageEmpty d-flex align-items-center justify-content-center w-100 h-100 bg-100 text-300">
|
||||
<i class="fa fa-camera fa-2x"/>
|
||||
</span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div t-if="linkPreviewCardView.linkPreviewAsideView" class="o_LinkPreviewCardView_aside position-absolute top-0 end-0 small">
|
||||
<LinkPreviewAsideView className="'fa fa-stack p-0 opacity-75 opacity-100-hover'" record="linkPreviewCardView.linkPreviewAsideView"/>
|
||||
<div t-if="linkPreviewAsideView" class="o_LinkPreviewCardView_aside position-absolute top-0 end-0 small">
|
||||
<LinkPreviewAsideView className="'fa fa-stack p-0 opacity-75 opacity-100-hover'" record="linkPreviewAsideView"/>
|
||||
</div>
|
||||
</div>
|
||||
</t>
|
||||
|
||||
+2
-2
@@ -7,8 +7,8 @@
|
||||
<p class="o_LinkPreviewDeleteConfirmView_mainText mx-3 mb-3">Do you really want to delete this preview?</p>
|
||||
<hr class="mt-0 mb-3"/>
|
||||
<div class="o_LinkPreviewDeleteConfirmView_buttons mx-3 mb-3">
|
||||
<button class="o_LinkPreviewDeleteConfirmView_confirmButton btn btn-primary me-2" t-on-click="linkPreviewDeleteConfirmView.onClickOk">Ok</button>
|
||||
<button class="o_LinkPreviewDeleteConfirmView_cancelButton btn btn-secondary me-2" t-on-click="linkPreviewDeleteConfirmView.onClickCancel">Cancel</button>
|
||||
<button class="o_LinkPreviewDeleteConfirmView_confirmButton btn btn-primary me-2" t-on-click="onClickOk">Ok</button>
|
||||
<button class="o_LinkPreviewDeleteConfirmView_cancelButton btn btn-secondary me-2" t-on-click="onClickCancel">Cancel</button>
|
||||
</div>
|
||||
</div>
|
||||
</t>
|
||||
|
||||
+5
-5
@@ -1,12 +1,12 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<templates xml:space="preserve">
|
||||
<t t-name="mail.LinkPreviewImageView" owl="1">
|
||||
<div class="o_LinkPreviewImageView position-relative mb-2" t-att-class="{ 'me-2': !linkPreviewImageView.linkPreviewListViewOwner.messageViewOwner.isInChatWindow }" t-attf-class="{{ className }}" t-on-mouseenter="linkPreviewImageView.onMouseEnter" t-on-mouseleave="linkPreviewImageView.onMouseLeave" t-ref="root">
|
||||
<a t-if="linkPreviewImageView.imageUrl" t-att-href="linkPreviewImageView.imageUrl" target="_blank">
|
||||
<img class="h-auto w-auto rounded" t-att-src="linkPreviewImageView.imageUrl"/>
|
||||
<div class="o_LinkPreviewImageView position-relative mb-2" t-att-class="{ 'me-2': !linkPreviewListViewOwner.messageViewOwner.isInChatWindow }" t-attf-class="{{ className }}" t-on-mouseenter="onMouseEnter" t-on-mouseleave="onMouseLeave" t-ref="root">
|
||||
<a t-if="imageUrl" t-att-href="imageUrl" target="_blank">
|
||||
<img class="h-auto w-auto rounded" t-att-src="imageUrl"/>
|
||||
</a>
|
||||
<div t-if="linkPreviewImageView.linkPreviewAsideView" class="o_LinkPreviewCardView_aside position-absolute top-0 end-0 small">
|
||||
<LinkPreviewAsideView className="'btn btn-sm btn-dark mt-2 me-2 rounded opacity-75 opacity-100-hover'" record="linkPreviewImageView.linkPreviewAsideView"/>
|
||||
<div t-if="linkPreviewAsideView" class="o_LinkPreviewCardView_aside position-absolute top-0 end-0 small">
|
||||
<LinkPreviewAsideView className="'btn btn-sm btn-dark mt-2 me-2 rounded opacity-75 opacity-100-hover'" record="linkPreviewAsideView"/>
|
||||
</div>
|
||||
</div>
|
||||
</t>
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<templates xml:space="preserve">
|
||||
<t t-name="mail.LinkPreviewListView" owl="1">
|
||||
<div class="o_LinkPreviewListView d-flex flex-column mt-2" t-att-class="{ 'me-2 pe-4': linkPreviewListView.messageViewOwner.isInChatWindowAndIsAlignedLeft, 'ms-2 ps-4': linkPreviewListView.messageViewOwner.isInChatWindowAndIsAlignedRight }" t-attf-class="{{ className }}" t-ref="root">
|
||||
<div class="o_LinkPreviewListView_partialList o_LinkPreviewListView_partialListImages d-flex flex-grow-1 flex-wrap" t-att-class="{ 'justify-content-end': linkPreviewListView.messageViewOwner.isInChatWindowAndIsAlignedRight }">
|
||||
<LinkPreviewImageView t-foreach="linkPreviewListView.linkPreviewAsImageViews" t-as="linkPreviewImageView" t-key="linkPreviewImageView" record="linkPreviewImageView"/>
|
||||
<div class="o_LinkPreviewListView d-flex flex-column mt-2" t-att-class="{ 'me-2 pe-4': messageViewOwner.isInChatWindowAndIsAlignedLeft, 'ms-2 ps-4': messageViewOwner.isInChatWindowAndIsAlignedRight }" t-attf-class="{{ className }}" t-ref="root">
|
||||
<div class="o_LinkPreviewListView_partialList o_LinkPreviewListView_partialListImages d-flex flex-grow-1 flex-wrap" t-att-class="{ 'justify-content-end': messageViewOwner.isInChatWindowAndIsAlignedRight }">
|
||||
<LinkPreviewImageView t-foreach="linkPreviewAsImageViews" t-as="linkPreviewImageView" t-key="linkPreviewImageView" record="linkPreviewImageView"/>
|
||||
</div>
|
||||
<div class="o_LinkPreviewListView_partialList o_LinkPreviewListView_partialListCards d-flex flex-grow-1 flex-wrap" t-att-class="{ 'justify-content-end': linkPreviewListView.messageViewOwner.isInChatWindowAndIsAlignedRight }">
|
||||
<LinkPreviewCardView t-foreach="linkPreviewListView.linkPreviewAsCardViews" t-as="linkPreviewCardView" t-key="linkPreviewCardView" record="linkPreviewCardView"/>
|
||||
<LinkPreviewVideoView t-foreach="linkPreviewListView.linkPreviewAsVideoViews" t-as="linkPreviewVideoView" t-key="linkPreviewVideoView" record="linkPreviewVideoView"/>
|
||||
<div class="o_LinkPreviewListView_partialList o_LinkPreviewListView_partialListCards d-flex flex-grow-1 flex-wrap" t-att-class="{ 'justify-content-end': messageViewOwner.isInChatWindowAndIsAlignedRight }">
|
||||
<LinkPreviewCardView t-foreach="linkPreviewAsCardViews" t-as="linkPreviewCardView" t-key="linkPreviewCardView" record="linkPreviewCardView"/>
|
||||
<LinkPreviewVideoView t-foreach="linkPreviewAsVideoViews" t-as="linkPreviewVideoView" t-key="linkPreviewVideoView" record="linkPreviewVideoView"/>
|
||||
</div>
|
||||
</div>
|
||||
</t>
|
||||
|
||||
+10
-10
@@ -1,20 +1,20 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<templates xml:space="preserve">
|
||||
<t t-name="mail.LinkPreviewVideoView" owl="1">
|
||||
<div class="o_LinkPreview o_LinkPreviewVideoView card position-relative w-100 mb-2 rounded bg-view shadow-sm overflow-hidden" t-att-class="{ 'me-2': !linkPreviewVideoView.linkPreviewListViewOwner.messageViewOwner.isInChatWindow }" t-attf-class="{{ className }}" t-on-mouseenter="linkPreviewVideoView.onMouseEnter" t-on-mouseleave="linkPreviewVideoView.onMouseLeave" t-ref="root">
|
||||
<div class="o_LinkPreview o_LinkPreviewVideoView card position-relative w-100 mb-2 rounded bg-view shadow-sm overflow-hidden" t-att-class="{ 'me-2': !linkPreviewListViewOwner.messageViewOwner.isInChatWindow }" t-attf-class="{{ className }}" t-on-mouseenter="onMouseEnter" t-on-mouseleave="onMouseLeave" t-ref="root">
|
||||
<div class="row g-0 flex-row-reverse h-100">
|
||||
<div class="col min-w-0" t-att-class="{ 'd-flex align-items-center': !linkPreviewVideoView.linkPreview.og_description }">
|
||||
<div class="col min-w-0" t-att-class="{ 'd-flex align-items-center': !linkPreview.og_description }">
|
||||
<div class="o_LinkPreviewVideoView_content p-3 bg-view">
|
||||
<h6 class="o_LinkPreviewVideoView_title card-title mb-0 me-2" t-attf-class="{{ linkPreviewVideoView.linkPreview.og_description ? 'text-truncate' : 'o_LinkPreviewVideoView_hasMultineLines overflow-hidden' }}">
|
||||
<a t-att-href="linkPreviewVideoView.linkPreview.source_url" target="_blank" t-esc="linkPreviewVideoView.linkPreview.og_title"/>
|
||||
<h6 class="o_LinkPreviewVideoView_title card-title mb-0 me-2" t-attf-class="{{ linkPreview.og_description ? 'text-truncate' : 'o_LinkPreviewVideoView_hasMultineLines overflow-hidden' }}">
|
||||
<a t-att-href="linkPreview.source_url" target="_blank" t-esc="linkPreview.og_title"/>
|
||||
</h6>
|
||||
<p t-if="linkPreviewVideoView.linkPreview.og_description" class="o_LinkPreviewVideoView_description o_LinkPreviewVideoView_hasMultineLines card-text mb-0 mt-2 text-muted small overflow-hidden" t-out="linkPreviewVideoView.linkPreview.og_description"></p>
|
||||
<p t-if="linkPreview.og_description" class="o_LinkPreviewVideoView_description o_LinkPreviewVideoView_hasMultineLines card-text mb-0 mt-2 text-muted small overflow-hidden" t-out="linkPreview.og_description"></p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="o_LinkPreviewVideoView_imageLinkWrap col-4 d-block">
|
||||
<a t-att-href="linkPreviewVideoView.linkPreview.source_url" class="o_LinkPreviewVideoView_imageLink" target="_blank">
|
||||
<div t-if="linkPreviewVideoView.linkPreview.og_image" class="o_linkPreviewVideo_overlay position-relative h-100 opacity-trigger-hover">
|
||||
<img class="o_LinkPreviewVideoView_image img-fluid h-100 rounded-bottom o_object_fit_cover" t-att-src="linkPreviewVideoView.linkPreview.og_image" t-att-alt="linkPreviewVideoView.linkPreview.og_title"/>
|
||||
<a t-att-href="linkPreview.source_url" class="o_LinkPreviewVideoView_imageLink" target="_blank">
|
||||
<div t-if="linkPreview.og_image" class="o_linkPreviewVideo_overlay position-relative h-100 opacity-trigger-hover">
|
||||
<img class="o_LinkPreviewVideoView_image img-fluid h-100 rounded-bottom o_object_fit_cover" t-att-src="linkPreview.og_image" t-att-alt="linkPreview.og_title"/>
|
||||
<div class="position-absolute top-50 start-50 translate-middle">
|
||||
<div class="o_LinkPreviewVideoView_playBtn btn btn-lg rounded opacity-75 opacity-100-hover transition-base">
|
||||
<i class="fa fa-play"/>
|
||||
@@ -27,8 +27,8 @@
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div t-if="linkPreviewVideoView.linkPreviewAsideView" class="o_LinkPreviewVideoView_aside position-absolute top-0 end-0 small">
|
||||
<LinkPreviewAsideView className="'fa fa-stack p-0 opacity-75 opacity-100-hover'" record="linkPreviewVideoView.linkPreviewAsideView"/>
|
||||
<div t-if="linkPreviewAsideView" class="o_LinkPreviewVideoView_aside position-absolute top-0 end-0 small">
|
||||
<LinkPreviewAsideView className="'fa fa-stack p-0 opacity-75 opacity-100-hover'" record="linkPreviewAsideView"/>
|
||||
</div>
|
||||
</div>
|
||||
</t>
|
||||
|
||||
@@ -2,32 +2,30 @@
|
||||
<templates xml:space="preserve">
|
||||
|
||||
<t t-name="mail.MailTemplateView" owl="1">
|
||||
<t t-if="mailTemplateView">
|
||||
<div class="o_MailTemplateView d-flex align-items-baseline flex-wrap" t-attf-class="{{ className }}" t-ref="root">
|
||||
<div class="text-truncate">
|
||||
<i class="fa fa-envelope-o" title="Mail" role="img"/>
|
||||
<span class="o_MailTemplateView_name ms-2" t-esc="mailTemplateView.mailTemplate.name"/>
|
||||
<span class="o_MailTemplateView_name ms-2" t-esc="mailTemplate.name"/>
|
||||
<span>:</span>
|
||||
</div>
|
||||
<div class="d-flex align-items-baseline">
|
||||
<button
|
||||
class="o_MailTemplateView_button o_MailTemplateView_preview btn btn-link py-0"
|
||||
t-att-data-mail-template-id="mailTemplateView.mailTemplate.id"
|
||||
t-on-click="mailTemplateView.onClickPreview"
|
||||
t-att-data-mail-template-id="mailTemplate.id"
|
||||
t-on-click="onClickPreview"
|
||||
>
|
||||
Preview
|
||||
</button>
|
||||
<em class="o_MailTemplateView_text text-500">or</em>
|
||||
<button
|
||||
class="o_MailTemplateView_button o_MailTemplateView_send btn btn-link py-0"
|
||||
t-att-data-mail-template-id="mailTemplateView.mailTemplate.id"
|
||||
t-on-click="mailTemplateView.onClickSend"
|
||||
t-att-data-mail-template-id="mailTemplate.id"
|
||||
t-on-click="onClickSend"
|
||||
>
|
||||
Send Now
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</t>
|
||||
</t>
|
||||
|
||||
</templates>
|
||||
|
||||
@@ -2,86 +2,85 @@
|
||||
<templates xml:space="preserve">
|
||||
|
||||
<t t-name="mail.MessageView" owl="1">
|
||||
<t t-if="messageView">
|
||||
<div class="o_MessageView position-relative py-1"
|
||||
t-att-class="{
|
||||
'o_MessageView_active': messageView.isActive,
|
||||
'o-clicked': messageView.messagingAsClickedMessageView,
|
||||
'o-discussion': messageView.message.isDiscussionOrNotification,
|
||||
'o-has-message-selection': messageView.messageListViewItemOwner and messageView.messageListViewItemOwner.messageListViewOwner.threadViewOwner.replyingToMessageView,
|
||||
'o-highlighted': messageView.message.isHighlighted or messageView.isHighlighted,
|
||||
'o-isReplyHighlighted bg-view shadow-lg': messageView.isHighlighted,
|
||||
'o_MessageView_active': isActive,
|
||||
'o-clicked': messagingAsClickedMessageView,
|
||||
'o-discussion': message.isDiscussionOrNotification,
|
||||
'o-has-message-selection': messageListViewItemOwner and messageListViewItemOwner.messageListViewOwner.threadViewOwner.replyingToMessageView,
|
||||
'o-highlighted': message.isHighlighted or isHighlighted,
|
||||
'o-isReplyHighlighted bg-view shadow-lg': isHighlighted,
|
||||
'o-isDeviceSmall': messaging.device.isSmall,
|
||||
'o-not-discussion': !messageView.message.isDiscussionOrNotification,
|
||||
'o-notification': messageView.message.message_type === 'notification',
|
||||
'o-selected': messageView.isSelected,
|
||||
'o-squashed pt-1': messageView.isSquashed,
|
||||
'o-starred': messageView.message.isStarred,
|
||||
'o-currentAuthor': messageView.message.isCurrentUserOrGuestAuthor,
|
||||
'mt-1': !messageView.isSquashed and messageView.messageListViewItemOwner,
|
||||
'px-3': !messageView.isInChatWindow,
|
||||
'px-1': messageView.isInChatWindow,
|
||||
'opacity-50': (messageView.messageListViewItemOwner and messageView.messageListViewItemOwner.messageListViewOwner.threadViewOwner.replyingToMessageView) and !messageView.isSelected,
|
||||
}" t-attf-class="{{ messageView.extraClass }} {{ className }}" role="group" t-att-aria-label="messageView.message.messageTypeText" t-on-click="messageView.onClick" t-on-mouseenter="messageView.onMouseenter" t-on-mouseleave="messageView.onMouseleave" t-att-data-id="messageView.message.id" t-att-data-message-id="messageView.message.id"
|
||||
'o-not-discussion': !message.isDiscussionOrNotification,
|
||||
'o-notification': message.message_type === 'notification',
|
||||
'o-selected': isSelected,
|
||||
'o-squashed pt-1': isSquashed,
|
||||
'o-starred': message.isStarred,
|
||||
'o-currentAuthor': message.isCurrentUserOrGuestAuthor,
|
||||
'mt-1': !isSquashed and messageListViewItemOwner,
|
||||
'px-3': !isInChatWindow,
|
||||
'px-1': isInChatWindow,
|
||||
'opacity-50': (messageListViewItemOwner and messageListViewItemOwner.messageListViewOwner.threadViewOwner.replyingToMessageView) and !isSelected,
|
||||
}" t-attf-class="{{ extraClass }} {{ className }}" role="group" t-att-aria-label="message.messageTypeText" t-on-click="onClick" t-on-mouseenter="onMouseenter" t-on-mouseleave="onMouseleave" t-att-data-id="message.id" t-att-data-message-id="message.id"
|
||||
t-ref="root"
|
||||
>
|
||||
<div class="o_MessageView_inReplyToWrap" t-att-class="{ 'me-5': messageView.isInDiscuss or messageView.isInChatWindowAndIsAlignedLeft, 'd-flex justify-content-end ms-5': messageView.isInChatWindowAndIsAlignedRight }">
|
||||
<MessageInReplyToView t-if="messageView.messageInReplyToView" record="messageView.messageInReplyToView" className="'mb-1'" classNameObj="{ 'me-5': messageView.isInChatWindowAndIsAlignedLeft, 'ms-5': messageView.isInChatWindowAndIsAlignedRight }"/>
|
||||
<div class="o_MessageView_inReplyToWrap" t-att-class="{ 'me-5': isInDiscuss or isInChatWindowAndIsAlignedLeft, 'd-flex justify-content-end ms-5': isInChatWindowAndIsAlignedRight }">
|
||||
<MessageInReplyToView t-if="messageInReplyToView" record="messageInReplyToView" className="'mb-1'" classNameObj="{ 'me-5': isInChatWindowAndIsAlignedLeft, 'ms-5': isInChatWindowAndIsAlignedRight }"/>
|
||||
</div>
|
||||
<div class="position-relative d-flex flex-shrink-0" t-att-class="{ 'flex-row-reverse': messageView.isInChatWindowAndIsAlignedRight }">
|
||||
<div class="o_MessageView_sidebar d-flex flex-shrink-0" t-att-class="{ 'o-message-squashed align-items-start': messageView.isSquashed, 'justify-content-center': messageView.isInChatWindow }">
|
||||
<t t-if="!messageView.isSquashed">
|
||||
<div class="position-relative d-flex flex-shrink-0" t-att-class="{ 'flex-row-reverse': isInChatWindowAndIsAlignedRight }">
|
||||
<div class="o_MessageView_sidebar d-flex flex-shrink-0" t-att-class="{ 'o-message-squashed align-items-start': isSquashed, 'justify-content-center': isInChatWindow }">
|
||||
<t t-if="!isSquashed">
|
||||
<div class="o_MessageView_authorAvatarContainer o_MessageView_sidebarItem position-relative">
|
||||
<img class="o_MessageView_authorAvatar w-100 h-100 rounded-circle o_object_fit_cover" t-att-class="{ 'cursor-pointer': messageView.hasAuthorOpenChat, o_redirect: messageView.hasAuthorOpenChat }" t-att-src="messageView.message.avatarUrl" t-att-role="messageView.hasAuthorOpenChat ? 'button' : ''" t-att-tabindex="messageView.hasAuthorOpenChat ? '0' : ''" t-on-click="messageView.onClickAuthorAvatar" t-att-title="messageView.authorTitleText" t-att-alt="messageView.authorTitleText"/>
|
||||
<t t-if="messageView.personaImStatusIconView">
|
||||
<img class="o_MessageView_authorAvatar w-100 h-100 rounded-circle o_object_fit_cover" t-att-class="{ 'cursor-pointer': hasAuthorOpenChat, o_redirect: hasAuthorOpenChat }" t-att-src="message.avatarUrl" t-att-role="hasAuthorOpenChat ? 'button' : ''" t-att-tabindex="hasAuthorOpenChat ? '0' : ''" t-on-click="onClickAuthorAvatar" t-att-title="authorTitleText" t-att-alt="authorTitleText"/>
|
||||
<t t-if="personaImStatusIconView">
|
||||
<PersonaImStatusIconView
|
||||
className="'o_MessageView_personaImStatusIcon position-absolute bottom-0 end-0 d-flex align-items-center justify-content-center text-white'"
|
||||
classNameObj="{
|
||||
'o-message-selected': messageView.isSelected,
|
||||
'o-message-selected': isSelected,
|
||||
'o_MessageView_personaImStatusIcon-mobile': messaging.device.isSmall,
|
||||
'small': !messaging.device.isSmall,
|
||||
'text-100': messageView.message.is_note and !messageView.isSelected,
|
||||
'text-100': message.is_note and !isSelected,
|
||||
}"
|
||||
record="messageView.personaImStatusIconView"
|
||||
record="personaImStatusIconView"
|
||||
/>
|
||||
</t>
|
||||
</div>
|
||||
</t>
|
||||
<t t-else="">
|
||||
<t t-if="messageView.isActive and messageView.message.date">
|
||||
<t t-if="isActive and message.date">
|
||||
<small class="o_MessageView_date o_MessageView_sidebarItem mt-3 mx-1 text-muted opacity-50">
|
||||
<t t-esc="messageView.message.shortTime"/>
|
||||
<t t-esc="message.shortTime"/>
|
||||
</small>
|
||||
</t>
|
||||
<t t-if="!messageView.isActive and messageView.messageSeenIndicatorView">
|
||||
<div t-att-class="{ 'position-absolute bottom-0 mb-1': !messageView.isInChatter }">
|
||||
<MessageSeenIndicatorView className="'o_MessageView_seenIndicator me-1'" record="messageView.messageSeenIndicatorView"/>
|
||||
<t t-if="!isActive and messageSeenIndicatorView">
|
||||
<div t-att-class="{ 'position-absolute bottom-0 mb-1': !isInChatter }">
|
||||
<MessageSeenIndicatorView className="'o_MessageView_seenIndicator me-1'" record="messageSeenIndicatorView"/>
|
||||
</div>
|
||||
</t>
|
||||
</t>
|
||||
</div>
|
||||
<div class="o_MessageView_core flex-grow-1">
|
||||
<t t-if="!messageView.isSquashed">
|
||||
<div class="o_MessageView_header d-flex flex-wrap align-items-baseline" t-att-class="{ 'justify-content-end': messageView.isInChatWindowAndIsAlignedRight }">
|
||||
<t t-if="messageView.message.author">
|
||||
<strong t-if="messageView.isShowingAuthorName" class="o_MessageView_authorName o_redirect me-1 text-truncate" t-att-class="{ 'cursor-pointer': messageView.hasAuthorOpenChat }" t-att-role="messageView.hasAuthorOpenChat ? 'button' : ''" t-att-tabindex="messageView.hasAuthorOpenChat ? '0' : ''" t-on-click="messageView.onClickAuthorName" t-att-title="messageView.authorTitleText">
|
||||
<t t-if="messageView.message.originThread">
|
||||
<t t-esc="messageView.message.originThread.getMemberName(messageView.message.author.persona)"/>
|
||||
<t t-if="!isSquashed">
|
||||
<div class="o_MessageView_header d-flex flex-wrap align-items-baseline" t-att-class="{ 'justify-content-end': isInChatWindowAndIsAlignedRight }">
|
||||
<t t-if="message.author">
|
||||
<strong t-if="isShowingAuthorName" class="o_MessageView_authorName o_redirect me-1 text-truncate" t-att-class="{ 'cursor-pointer': hasAuthorOpenChat }" t-att-role="hasAuthorOpenChat ? 'button' : ''" t-att-tabindex="hasAuthorOpenChat ? '0' : ''" t-on-click="onClickAuthorName" t-att-title="authorTitleText">
|
||||
<t t-if="message.originThread">
|
||||
<t t-esc="message.originThread.getMemberName(message.author.persona)"/>
|
||||
</t>
|
||||
<t t-else="">
|
||||
<t t-esc="messageView.message.author.nameOrDisplayName"/>
|
||||
<t t-esc="message.author.nameOrDisplayName"/>
|
||||
</t>
|
||||
</strong>
|
||||
</t>
|
||||
<t t-elif="messageView.message.guestAuthor">
|
||||
<t t-elif="message.guestAuthor">
|
||||
<strong class="o_MessageView_authorName me-2 text-truncate text-muted">
|
||||
<t t-esc="messageView.message.guestAuthor.name"/>
|
||||
<t t-esc="message.guestAuthor.name"/>
|
||||
</strong>
|
||||
</t>
|
||||
<t t-elif="messageView.message.email_from">
|
||||
<a class="o_MessageView_authorName me-2 text-truncate text-muted" t-attf-href="mailto:{{ messageView.message.email_from }}?subject=Re: {{ messageView.message.subject ? messageView.message.subject : '' }}">
|
||||
<t t-elif="message.email_from">
|
||||
<a class="o_MessageView_authorName me-2 text-truncate text-muted" t-attf-href="mailto:{{ message.email_from }}?subject=Re: {{ message.subject ? message.subject : '' }}">
|
||||
<strong>
|
||||
<t t-esc="messageView.message.email_from"/>
|
||||
<t t-esc="message.email_from"/>
|
||||
</strong>
|
||||
</a>
|
||||
</t>
|
||||
@@ -90,34 +89,34 @@
|
||||
Anonymous
|
||||
</strong>
|
||||
</t>
|
||||
<t t-if="messageView.message.date">
|
||||
<small class="o_MessageView_date o_MessageView_headerDate text-muted opacity-50" t-att-class="{ 'o-message-selected': messageView.isSelected, 'me-2': !(messageView.isInChatWindowAndIsAlignedRight) }" t-att-title="messageView.message.datetime">
|
||||
<span t-if="messageView.isShowingAuthorName">-</span> <t t-esc="messageView.dateFromNow"/>
|
||||
<t t-if="message.date">
|
||||
<small class="o_MessageView_date o_MessageView_headerDate text-muted opacity-50" t-att-class="{ 'o-message-selected': isSelected, 'me-2': !(isInChatWindowAndIsAlignedRight) }" t-att-title="message.datetime">
|
||||
<span t-if="isShowingAuthorName">-</span> <t t-esc="dateFromNow"/>
|
||||
</small>
|
||||
</t>
|
||||
<t t-if="messageView.messageSeenIndicatorView">
|
||||
<MessageSeenIndicatorView className="'o_MessageView_seenIndicator ms-1'" record="messageView.messageSeenIndicatorView"/>
|
||||
<t t-if="messageSeenIndicatorView">
|
||||
<MessageSeenIndicatorView className="'o_MessageView_seenIndicator ms-1'" record="messageSeenIndicatorView"/>
|
||||
</t>
|
||||
<t t-if="messageView.messageListViewItemOwner and messageView.message.originThread and messageView.message.originThread !== messageView.messageListViewItemOwner.messageListViewOwner.threadViewOwner.thread">
|
||||
<small class="o_MessageView_originThread me-2" t-att-class="{ 'o-message-selected text-600': messageView.isSelected, 'text-500': !messageView.isSelected }">
|
||||
<t t-if="messageView.message.originThread.model === 'mail.channel'">
|
||||
(from <a class="o_MessageView_originThreadLink fs-6" t-att-href="messageView.message.originThread.url" t-on-click="messageView.onClickOriginThread"><t t-if="messageView.message.originThread.displayName">#<t t-esc="messageView.message.originThread.displayName"/></t><t t-else="">channel</t></a>)
|
||||
<t t-if="messageListViewItemOwner and message.originThread and message.originThread !== messageListViewItemOwner.messageListViewOwner.threadViewOwner.thread">
|
||||
<small class="o_MessageView_originThread me-2" t-att-class="{ 'o-message-selected text-600': isSelected, 'text-500': !isSelected }">
|
||||
<t t-if="message.originThread.model === 'mail.channel'">
|
||||
(from <a class="o_MessageView_originThreadLink fs-6" t-att-href="message.originThread.url" t-on-click="onClickOriginThread"><t t-if="message.originThread.displayName">#<t t-esc="message.originThread.displayName"/></t><t t-else="">channel</t></a>)
|
||||
</t>
|
||||
<t t-else="">
|
||||
on <a class="o_MessageView_originThreadLink fs-6" t-att-href="messageView.message.originThread.url" t-on-click="messageView.onClickOriginThread"><t t-if="messageView.message.originThread.displayName"><t t-esc="messageView.message.originThread.displayName"/></t><t t-else="">document</t></a>
|
||||
on <a class="o_MessageView_originThreadLink fs-6" t-att-href="message.originThread.url" t-on-click="onClickOriginThread"><t t-if="message.originThread.displayName"><t t-esc="message.originThread.displayName"/></t><t t-else="">document</t></a>
|
||||
</t>
|
||||
</small>
|
||||
</t>
|
||||
<t t-if="messageView.messageListViewItemOwner and messageView.message.originThread and messageView.message.originThread === messageView.messageListViewItemOwner.messageListViewOwner.threadViewOwner.thread and messageView.message.notifications.length > 0">
|
||||
<div t-att-class="{ 'ms-2': messageView.isInChatWindowAndIsAlignedRight }">
|
||||
<t t-if="messageView.message.failureNotifications.length > 0">
|
||||
<span class="o_MessageView_notificationIconClickable o-error cursor-pointer text-danger" role="button" tabindex="0" t-on-click="messageView.onClickFailure">
|
||||
<i class="o_MessageView_notificationIcon" t-att-class="messageView.failureNotificationIconClassName" role="img" aria-label="Delivery failure"/> <span t-if="messageView.failureNotificationIconLabel" t-out="messageView.failureNotificationIconLabel"/>
|
||||
<t t-if="messageListViewItemOwner and message.originThread and message.originThread === messageListViewItemOwner.messageListViewOwner.threadViewOwner.thread and message.notifications.length > 0">
|
||||
<div t-att-class="{ 'ms-2': isInChatWindowAndIsAlignedRight }">
|
||||
<t t-if="message.failureNotifications.length > 0">
|
||||
<span class="o_MessageView_notificationIconClickable o-error cursor-pointer text-danger" role="button" tabindex="0" t-on-click="onClickFailure">
|
||||
<i class="o_MessageView_notificationIcon" t-att-class="failureNotificationIconClassName" role="img" aria-label="Delivery failure"/> <span t-if="failureNotificationIconLabel" t-out="failureNotificationIconLabel"/>
|
||||
</span>
|
||||
</t>
|
||||
<t t-else="">
|
||||
<span class="o_MessageView_notificationIconClickable text-600 cursor-pointer" t-on-click="messageView.onClickNotificationIcon" t-ref="notificationIcon">
|
||||
<i class="o_MessageView_notificationIcon" t-att-class="messageView.notificationIconClassName"/> <span t-if="messageView.notificationIconLabel" t-out="messageView.notificationIconLabel"/>
|
||||
<span class="o_MessageView_notificationIconClickable text-600 cursor-pointer" t-on-click="onClickNotificationIcon" t-ref="notificationIcon">
|
||||
<i class="o_MessageView_notificationIcon" t-att-class="notificationIconClassName"/> <span t-if="notificationIconLabel" t-out="notificationIconLabel"/>
|
||||
</span>
|
||||
</t>
|
||||
</div>
|
||||
@@ -127,56 +126,56 @@
|
||||
<div
|
||||
class="o_MessageView_bubbleWrap position-relative d-flex align-items-start"
|
||||
t-att-class="{
|
||||
'd-flex justify-content-end': messageView.isInChatWindowAndIsAlignedRight,
|
||||
'pe-4': messageView.isInChatWindowAndIsAlignedLeft and !messageView.composerViewInEditing,
|
||||
'ps-4': messageView.isInChatWindowAndIsAlignedRight and !messageView.composerViewInEditing,
|
||||
'pe-2': messageView.isInChatWindowAndIsAlignedLeft and messageView.composerViewInEditing,
|
||||
'ps-2': messageView.isInChatWindowAndIsAlignedRight and messageView.composerViewInEditing,
|
||||
'd-flex justify-content-end': isInChatWindowAndIsAlignedRight,
|
||||
'pe-4': isInChatWindowAndIsAlignedLeft and !composerViewInEditing,
|
||||
'ps-4': isInChatWindowAndIsAlignedRight and !composerViewInEditing,
|
||||
'pe-2': isInChatWindowAndIsAlignedLeft and composerViewInEditing,
|
||||
'ps-2': isInChatWindowAndIsAlignedRight and composerViewInEditing,
|
||||
}"
|
||||
>
|
||||
<div
|
||||
class="o_MessageView_bubble position-relative"
|
||||
t-att-class="{
|
||||
'flex-grow-1': messageView.composerViewInEditing,
|
||||
'w-100': !(messageView.message.isDiscussionOrNotification or messageView.message.message_type === 'sms') and !messageView.isInChatWindow,
|
||||
'me-2': messageView.isInChatWindowAndIsAlignedLeft and !messageView.composerViewInEditing,
|
||||
'ms-2': messageView.isInChatWindowAndIsAlignedRight and !messageView.composerViewInEditing,
|
||||
'p-3': messageView.message.prettyBody !== '' and !messageView.composerViewInEditing and (messageView.message.isDiscussionOrNotification or messageView.message.message_type === 'sms'),
|
||||
'p-2': messageView.composerViewInEditing,
|
||||
'text-muted': messageView.message.is_note and messageView.message.message_type !== 'sms',
|
||||
'flex-grow-1': composerViewInEditing,
|
||||
'w-100': !(message.isDiscussionOrNotification or message.message_type === 'sms') and !isInChatWindow,
|
||||
'me-2': isInChatWindowAndIsAlignedLeft and !composerViewInEditing,
|
||||
'ms-2': isInChatWindowAndIsAlignedRight and !composerViewInEditing,
|
||||
'p-3': message.prettyBody !== '' and !composerViewInEditing and (message.isDiscussionOrNotification or message.message_type === 'sms'),
|
||||
'p-2': composerViewInEditing,
|
||||
'text-muted': message.is_note and message.message_type !== 'sms',
|
||||
}"
|
||||
>
|
||||
<div
|
||||
t-if="messageView.message.prettyBody !== '' || messageView.composerViewInEditing"
|
||||
t-if="message.prettyBody !== '' || composerViewInEditing"
|
||||
class="o_MessageView_background position-absolute start-0 top-0 w-100 h-100"
|
||||
t-att-class="{
|
||||
'rounded-end-3': !messageView.isInChatWindowAndIsAlignedRight and (messageView.message.isDiscussionOrNotification or messageView.message.message_type === 'sms'),
|
||||
'rounded-start-3': messageView.isInChatWindowAndIsAlignedRight and (messageView.message.isDiscussionOrNotification or messageView.message.message_type === 'sms'),
|
||||
'rounded-bottom-3 border': messageView.message.isDiscussionOrNotification or messageView.message.message_type === 'sms',
|
||||
'o-isAuthorNotCurrentUserOrGuest border-info bg-info-light': !messageView.message.isCurrentUserOrGuestAuthor and !messageView.message.isHighlighted and (messageView.message.isDiscussionOrNotification or messageView.message.message_type === 'sms'),
|
||||
'border-success bg-success-light opacity-25': messageView.message.isCurrentUserOrGuestAuthor and !messageView.message.isHighlighted and (messageView.message.isDiscussionOrNotification or messageView.message.message_type === 'sms'),
|
||||
'border-warning bg-warning-light opacity-50': messageView.message.isHighlighted and (messageView.message.isDiscussionOrNotification or messageView.message.message_type === 'sms'),
|
||||
'rounded-end-3': !isInChatWindowAndIsAlignedRight and (message.isDiscussionOrNotification or message.message_type === 'sms'),
|
||||
'rounded-start-3': isInChatWindowAndIsAlignedRight and (message.isDiscussionOrNotification or message.message_type === 'sms'),
|
||||
'rounded-bottom-3 border': message.isDiscussionOrNotification or message.message_type === 'sms',
|
||||
'o-isAuthorNotCurrentUserOrGuest border-info bg-info-light': !message.isCurrentUserOrGuestAuthor and !message.isHighlighted and (message.isDiscussionOrNotification or message.message_type === 'sms'),
|
||||
'border-success bg-success-light opacity-25': message.isCurrentUserOrGuestAuthor and !message.isHighlighted and (message.isDiscussionOrNotification or message.message_type === 'sms'),
|
||||
'border-warning bg-warning-light opacity-50': message.isHighlighted and (message.isDiscussionOrNotification or message.message_type === 'sms'),
|
||||
}"
|
||||
/>
|
||||
<t t-if="messageView.message.subject and !messageView.message.isSubjectSimilarToOriginThreadName">
|
||||
<em class="o_MessageView_subject position-relative mb-1 me-2">Subject: <t t-esc="messageView.message.subject"/></em>
|
||||
<t t-if="message.subject and !message.isSubjectSimilarToOriginThreadName">
|
||||
<em class="o_MessageView_subject position-relative mb-1 me-2">Subject: <t t-esc="message.subject"/></em>
|
||||
</t>
|
||||
<div class="o_MessageView_content position-relative text-break" t-ref="content">
|
||||
<t t-if="!messageView.composerViewInEditing">
|
||||
<div class="o_MessageView_prettyBody" t-ref="prettyBody"/><!-- messageView.message.prettyBody is inserted here from _update() -->
|
||||
<t t-if="!composerViewInEditing">
|
||||
<div class="o_MessageView_prettyBody" t-ref="prettyBody"/><!-- message.prettyBody is inserted here from _update() -->
|
||||
</t>
|
||||
<t t-if="messageView.composerViewInEditing">
|
||||
<t t-if="composerViewInEditing">
|
||||
<ComposerView
|
||||
className="'o_MessageView_composer'"
|
||||
record="messageView.composerViewInEditing"
|
||||
record="composerViewInEditing"
|
||||
/>
|
||||
</t>
|
||||
<t t-if="messageView.message.subtype_description and !messageView.message.isBodyEqualSubtypeDescription">
|
||||
<p t-esc="messageView.message.subtype_description" class="mb-0"/>
|
||||
<t t-if="message.subtype_description and !message.isBodyEqualSubtypeDescription">
|
||||
<p t-esc="message.subtype_description" class="mb-0"/>
|
||||
</t>
|
||||
<t t-if="messageView.message.trackingValues.length > 0">
|
||||
<t t-if="message.trackingValues.length > 0">
|
||||
<ul class="o_MessageView_trackingValues mb-0 ps-4">
|
||||
<t t-foreach="messageView.message.trackingValues" t-as="trackingValue" t-key="trackingValue.id">
|
||||
<t t-foreach="message.trackingValues" t-as="trackingValue" t-key="trackingValue.id">
|
||||
<li>
|
||||
<TrackingValue value="trackingValue"/>
|
||||
</li>
|
||||
@@ -186,36 +185,35 @@
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
t-if="messageView.messageActionList and !messageView.composerViewInEditing"
|
||||
t-if="messageActionList and !composerViewInEditing"
|
||||
class="o_MessageView_actionListContainer"
|
||||
t-att-class="{
|
||||
'o-squashed': messageView.isSquashed,
|
||||
'position-absolute top-0': !messageView.isInDiscuss,
|
||||
'start-0 ms-3': messageView.isInChatWindowAndIsAlignedRight,
|
||||
'end-0 me-3': messageView.isInChatWindowAndIsAlignedLeft || messageView.isInChatter,
|
||||
'mt-n4': messageView.isInChatter and (messageView.message.isDiscussionOrNotification or messageView.message.message_type === 'sms'),
|
||||
'mt-n5': messageView.isInChatter and !(messageView.message.isDiscussionOrNotification or messageView.message.message_type === 'sms'),
|
||||
'mt-2': messageView.isInDiscuss and (messageView.message.isDiscussionOrNotification or messageView.message.message_type === 'sms'),
|
||||
'mt-n3': messageView.isInChatWindow,
|
||||
'ms-2': messageView.isInDiscuss,
|
||||
'o-squashed': isSquashed,
|
||||
'position-absolute top-0': !isInDiscuss,
|
||||
'start-0 ms-3': isInChatWindowAndIsAlignedRight,
|
||||
'end-0 me-3': isInChatWindowAndIsAlignedLeft || isInChatter,
|
||||
'mt-n4': isInChatter and (message.isDiscussionOrNotification or message.message_type === 'sms'),
|
||||
'mt-n5': isInChatter and !(message.isDiscussionOrNotification or message.message_type === 'sms'),
|
||||
'mt-2': isInDiscuss and (message.isDiscussionOrNotification or message.message_type === 'sms'),
|
||||
'mt-n3': isInChatWindow,
|
||||
'ms-2': isInDiscuss,
|
||||
}"
|
||||
t-attf-class="{{ messageView.isActive ? 'visible' : 'invisible' }}"
|
||||
t-attf-class="{{ isActive ? 'visible' : 'invisible' }}"
|
||||
>
|
||||
<MessageActionList record="messageView.messageActionList" classNameObj="{ 'mt-3': messageView.isInChatter and !(messageView.message.isDiscussionOrNotification or messageView.message.message_type === 'sms') }"/>
|
||||
<MessageActionList record="messageActionList" classNameObj="{ 'mt-3': isInChatter and !(message.isDiscussionOrNotification or message.message_type === 'sms') }"/>
|
||||
</div>
|
||||
</div>
|
||||
<AttachmentList t-if="messageView.attachmentList" record="messageView.attachmentList" className="'position-relative'"/>
|
||||
<LinkPreviewListView t-if="messageView.linkPreviewListView" record="messageView.linkPreviewListView"/>
|
||||
<div t-if="messageView.message.messageReactionGroups.length > 0" class="position-relative d-flex flex-wrap"
|
||||
t-att-class="{ 'flex-row-reverse me-3': messageView.isInChatWindowAndIsAlignedRight, 'ms-3': !messageView.isInChatWindowAndIsAlignedRight and (messageView.message.isDiscussionOrNotification or messageView.message.message_type === 'sms')}" t-attf-class="{{ messageView.message.isDiscussionOrNotification or messageView.message.message_type === 'sms' ? 'mt-n2' : 'mt-1' }}">
|
||||
<t t-foreach="messageView.message.messageReactionGroups" t-as="messageReactionGroup" t-key="messageReactionGroup.localId">
|
||||
<MessageReactionGroup className="'mb-1'" classNameObj="{ 'ms-1': messageView.isInChatWindowAndIsAlignedRight, 'me-1': !(messageView.isInChatWindowAndIsAlignedRight) }" record="messageReactionGroup"/>
|
||||
<AttachmentList t-if="attachmentList" record="attachmentList" className="'position-relative'"/>
|
||||
<LinkPreviewListView t-if="linkPreviewListView" record="linkPreviewListView"/>
|
||||
<div t-if="message.messageReactionGroups.length > 0" class="position-relative d-flex flex-wrap"
|
||||
t-att-class="{ 'flex-row-reverse me-3': isInChatWindowAndIsAlignedRight, 'ms-3': !isInChatWindowAndIsAlignedRight and (message.isDiscussionOrNotification or message.message_type === 'sms')}" t-attf-class="{{ message.isDiscussionOrNotification or message.message_type === 'sms' ? 'mt-n2' : 'mt-1' }}">
|
||||
<t t-foreach="message.messageReactionGroups" t-as="messageReactionGroup" t-key="messageReactionGroup.localId">
|
||||
<MessageReactionGroup className="'mb-1'" classNameObj="{ 'ms-1': isInChatWindowAndIsAlignedRight, 'me-1': !(isInChatWindowAndIsAlignedRight) }" record="messageReactionGroup"/>
|
||||
</t>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</t>
|
||||
</t>
|
||||
|
||||
</templates>
|
||||
|
||||
@@ -1,12 +1,10 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<templates>
|
||||
<t t-name="mail.MessageActionList" owl="1">
|
||||
<t t-if="messageActionList">
|
||||
<div class="o_MessageActionList d-flex rounded-1 shadow-sm overflow-hidden" t-att-class="{ 'o-isDeviceSmall': messaging.device.isSmall, 'flex-row-reverse': messageActionList.messageView.isInChatWindowAndIsAlignedRight }" t-attf-class="{{ className }}" t-ref="root">
|
||||
<t t-foreach="messageActionList.messageActionViews" t-as="messageActionView" t-key="messageActionView.localId">
|
||||
<div class="o_MessageActionList d-flex rounded-1 shadow-sm overflow-hidden" t-att-class="{ 'o-isDeviceSmall': messaging.device.isSmall, 'flex-row-reverse': messageView.isInChatWindowAndIsAlignedRight }" t-attf-class="{{ className }}" t-ref="root">
|
||||
<t t-foreach="messageActionViews" t-as="messageActionView" t-key="messageActionView.localId">
|
||||
<MessageActionView record="messageActionView"/>
|
||||
</t>
|
||||
</div>
|
||||
</t>
|
||||
</t>
|
||||
</templates>
|
||||
|
||||
@@ -3,13 +3,13 @@
|
||||
<t t-name="mail.MessageActionView" owl="1">
|
||||
<i
|
||||
class="o_MessageActionView cursor-pointer"
|
||||
t-att-class="messageActionView.classNames"
|
||||
t-att-tabindex="messageActionView.tabindex"
|
||||
t-att-title="messageActionView.title"
|
||||
t-att-aria-pressed="messageActionView.ariaPressedState"
|
||||
t-att-aria-label="messageActionView.title"
|
||||
t-att-class="classNames"
|
||||
t-att-tabindex="tabindex"
|
||||
t-att-title="title"
|
||||
t-att-aria-pressed="ariaPressedState"
|
||||
t-att-aria-label="title"
|
||||
role="button"
|
||||
t-on-click="messageActionView.onClick"
|
||||
t-on-click="onClick"
|
||||
t-ref="action"
|
||||
/>
|
||||
</t>
|
||||
|
||||
@@ -2,18 +2,16 @@
|
||||
<templates xml:space="preserve">
|
||||
|
||||
<t t-name="mail.MessageAuthorPrefixView" owl="1">
|
||||
<t t-if="messageAuthorPrefixView">
|
||||
<span class="o_MessageAuthorPrefixView" t-attf-class="{{ className }}" t-ref="root">
|
||||
<t t-if="messageAuthorPrefixView.message">
|
||||
<t t-if="messageAuthorPrefixView.message.author and messageAuthorPrefixView.message.author === messaging.currentPartner">
|
||||
<t t-if="message">
|
||||
<t t-if="message.author and message.author === messaging.currentPartner">
|
||||
<i class="o_MessageAuthorPrefixView_icon fa fa-mail-reply me-1"/>You:
|
||||
</t>
|
||||
<t t-elif="messageAuthorPrefixView.thread and (!messageAuthorPrefixView.thread.channel or messageAuthorPrefixView.message.author !== messageAuthorPrefixView.thread.channel.correspondent)">
|
||||
<t t-esc="messageAuthorPrefixView.message.author.nameOrDisplayName"/>:
|
||||
<t t-elif="thread and (!thread.channel or message.author !== thread.channel.correspondent)">
|
||||
<t t-esc="message.author.nameOrDisplayName"/>:
|
||||
</t>
|
||||
</t>
|
||||
</span>
|
||||
</t>
|
||||
</t>
|
||||
|
||||
</templates>
|
||||
|
||||
+10
-12
@@ -1,19 +1,18 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<templates xml:space="preserve">
|
||||
<t t-name="mail.MessageInReplyToView" owl="1">
|
||||
<t t-if="messageInReplyToView">
|
||||
<small class="o_MessageInReplyToView position-relative d-block text-small" t-attf-class="{{ className }} {{ messageInReplyToView.messageView.isInChatWindowAndIsAlignedRight ? 'justify-content-end pe-5': 'ps-5' }}" t-ref="root">
|
||||
<span class="o_MessageInReplyToView_corner position-absolute bottom-0 top-50 pe-4 border-top text-300" t-attf-class="{{ messageInReplyToView.messageView.isInChatWindowAndIsAlignedRight ? 'o-isRightAlign border-end' : 'o-isLeftAlign border-start' }}" t-att-class="{ 'ms-n2': messageInReplyToView.messageView.isInDiscuss }"/>
|
||||
<t t-if="!messageInReplyToView.messageView.message.parentMessage.isEmpty">
|
||||
<span class="o_MessageInReplyToView_wrapOuter d-flex align-items-center text-muted opacity-75 opacity-100-hover cursor-pointer" t-attf-class="{{ messageInReplyToView.messageView.isInChatWindowAndIsAlignedRight ? 'pe-3': 'ps-3' }}" t-on-click="messageInReplyToView.onClickReply">
|
||||
<img class="o_MessageInReplyToView_avatar me-2 rounded-circle" t-att-src="messageInReplyToView.messageView.message.parentMessage.avatarUrl" t-att-title="messageInReplyToView.messageView.message.parentMessage.authorName" alt="Avatar"/>
|
||||
<small class="o_MessageInReplyToView position-relative d-block text-small" t-attf-class="{{ className }} {{ messageView.isInChatWindowAndIsAlignedRight ? 'justify-content-end pe-5': 'ps-5' }}" t-ref="root">
|
||||
<span class="o_MessageInReplyToView_corner position-absolute bottom-0 top-50 pe-4 border-top text-300" t-attf-class="{{ messageView.isInChatWindowAndIsAlignedRight ? 'o-isRightAlign border-end' : 'o-isLeftAlign border-start' }}" t-att-class="{ 'ms-n2': messageView.isInDiscuss }"/>
|
||||
<t t-if="!messageView.message.parentMessage.isEmpty">
|
||||
<span class="o_MessageInReplyToView_wrapOuter d-flex align-items-center text-muted opacity-75 opacity-100-hover cursor-pointer" t-attf-class="{{ messageView.isInChatWindowAndIsAlignedRight ? 'pe-3': 'ps-3' }}" t-on-click="onClickReply">
|
||||
<img class="o_MessageInReplyToView_avatar me-2 rounded-circle" t-att-src="messageView.message.parentMessage.avatarUrl" t-att-title="messageView.message.parentMessage.authorName" alt="Avatar"/>
|
||||
<span class="o_MessageInReplyToView_wrapInner overflow-hidden">
|
||||
<b class="o_MessageInReplyToView_author">@<t t-out="messageInReplyToView.messageView.message.parentMessage.authorName"/></b>:
|
||||
<b class="o_MessageInReplyToView_author">@<t t-out="messageView.message.parentMessage.authorName"/></b>:
|
||||
<span class="o_MessageInReplyToView_body ms-1 text-break">
|
||||
<t t-if="messageInReplyToView.hasBodyBackLink">
|
||||
<t t-out="messageInReplyToView.messageView.message.parentMessage.prettyBodyAsMarkup"/>
|
||||
<t t-if="hasBodyBackLink">
|
||||
<t t-out="messageView.message.parentMessage.prettyBodyAsMarkup"/>
|
||||
</t>
|
||||
<t t-if="messageInReplyToView.hasAttachmentBackLink">
|
||||
<t t-if="hasAttachmentBackLink">
|
||||
<span class="me-2 fst-italic">Click to see the attachments</span>
|
||||
<i class="fa fa-image"/>
|
||||
</t>
|
||||
@@ -21,10 +20,9 @@
|
||||
</span>
|
||||
</span>
|
||||
</t>
|
||||
<t t-if="messageInReplyToView.messageView.message.parentMessage.isEmpty">
|
||||
<t t-if="messageView.message.parentMessage.isEmpty">
|
||||
<i class="o_MessageInReplyToView_deletedMessage text-muted ms-2">Original message was deleted</i>
|
||||
</t>
|
||||
</small>
|
||||
</t>
|
||||
</t>
|
||||
</templates>
|
||||
|
||||
+1
-1
@@ -3,7 +3,7 @@
|
||||
|
||||
<t t-name="mail.MessageNotificationPopoverContentView" owl="1">
|
||||
<div class="o_MessageNotificationPopoverContentView m-2" t-attf-class="{{ className }}" t-ref="root">
|
||||
<t t-foreach="messageNotificationPopoverContentView.messageView.message.notifications" t-as="notification" t-key="notification.localId">
|
||||
<t t-foreach="messageView.message.notifications" t-as="notification" t-key="notification.localId">
|
||||
<div class="o_MessageNotificationPopoverContentView_notification">
|
||||
<i class="o_MessageNotificationPopoverContentView_notificationIcon me-2" t-att-class="notification.iconClass" t-att-title="notification.iconTitle" role="img"/>
|
||||
<t t-if="notification.partner">
|
||||
|
||||
@@ -2,16 +2,14 @@
|
||||
<templates xml:space="preserve">
|
||||
|
||||
<t t-name="mail.MessageReactionGroup" owl="1">
|
||||
<t t-if="messageReactionGroup">
|
||||
<button class="o_MessageReactionGroup btn d-flex p-0 border rounded-1" t-att-class="{'o-hasUserReacted border-primary': messageReactionGroup.hasUserReacted, 'bg-view': !messageReactionGroup.hasUserReacted}" t-attf-class="{{ className }}" t-att-title="messageReactionGroup.summary" t-on-click="messageReactionGroup.onClick" t-ref="root">
|
||||
<button class="o_MessageReactionGroup btn d-flex p-0 border rounded-1" t-att-class="{'o-hasUserReacted border-primary': hasUserReacted, 'bg-view': !hasUserReacted}" t-attf-class="{{ className }}" t-att-title="summary" t-on-click="onClick" t-ref="root">
|
||||
<span class="o_MessageReactionGroup_content mx-1">
|
||||
<t t-esc="messageReactionGroup.content"/>
|
||||
<t t-esc="content"/>
|
||||
</span>
|
||||
<span class="o_MessageReactionGroup_count mx-1" t-att-class="{'o-hasUserReacted text-primary fw-bolder': messageReactionGroup.hasUserReacted}">
|
||||
<t t-esc="messageReactionGroup.count"/>
|
||||
<span class="o_MessageReactionGroup_count mx-1" t-att-class="{'o-hasUserReacted text-primary fw-bolder': hasUserReacted}">
|
||||
<t t-esc="count"/>
|
||||
</span>
|
||||
</button>
|
||||
</t>
|
||||
</t>
|
||||
|
||||
</templates>
|
||||
|
||||
@@ -2,13 +2,13 @@
|
||||
<templates xml:space="preserve">
|
||||
|
||||
<t t-name="mail.MessageSeenIndicatorView" owl="1">
|
||||
<t t-if="messageSeenIndicatorView and messageSeenIndicatorView.messageSeenIndicator">
|
||||
<span class="o_MessageSeenIndicatorView position-relative d-flex opacity-75-hover opacity-50" t-att-class="{ 'o-all-seen text-odoo': messageSeenIndicatorView.messageSeenIndicator.hasEveryoneSeen }" t-attf-class="{{ className }}" t-att-title="messageSeenIndicatorView.messageSeenIndicator.text" t-ref="root">
|
||||
<t t-if="!messageSeenIndicatorView.messageSeenIndicator.isMessagePreviousToLastCurrentPartnerMessageSeenByEveryone">
|
||||
<t t-if="messageSeenIndicatorView.messageSeenIndicator.hasSomeoneFetched or messageSeenIndicatorView.messageSeenIndicator.hasSomeoneSeen">
|
||||
<t t-if="messageSeenIndicator">
|
||||
<span class="o_MessageSeenIndicatorView position-relative d-flex opacity-75-hover opacity-50" t-att-class="{ 'o-all-seen text-odoo': messageSeenIndicator.hasEveryoneSeen }" t-attf-class="{{ className }}" t-att-title="messageSeenIndicator.text" t-ref="root">
|
||||
<t t-if="!messageSeenIndicator.isMessagePreviousToLastCurrentPartnerMessageSeenByEveryone">
|
||||
<t t-if="messageSeenIndicator.hasSomeoneFetched or messageSeenIndicator.hasSomeoneSeen">
|
||||
<i class="o_MessageSeenIndicatorView_icon o-first fa fa-check ps-1"/>
|
||||
</t>
|
||||
<t t-if="messageSeenIndicatorView.messageSeenIndicator.hasSomeoneSeen">
|
||||
<t t-if="messageSeenIndicator.hasSomeoneSeen">
|
||||
<i class="o_MessageSeenIndicatorView_icon o-second fa fa-check position-absolute"/>
|
||||
</t>
|
||||
</t>
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
<templates xml:space="preserve">
|
||||
|
||||
<t t-name="mail.MessagingMenuTabView" owl="1">
|
||||
<button class="o_MessagingMenuTabView o-desktop btn btn-link" t-att-class="{ 'o-active fw-bolder': messagingMenuTabView.isActive, 'text-dark': !messagingMenuTabView.isActive }" t-on-click="messagingMenuTabView.onClick" type="button" role="tab" t-att-data-tab-id="messagingMenuTabView.id" t-attf-class="{{ className }}" t-ref="root">
|
||||
<t t-out="messagingMenuTabView.name"/>
|
||||
<button class="o_MessagingMenuTabView o-desktop btn btn-link" t-att-class="{ 'o-active fw-bolder': isActive, 'text-dark': !isActive }" t-on-click="onClick" type="button" role="tab" t-att-data-tab-id="id" t-attf-class="{{ className }}" t-ref="root">
|
||||
<t t-out="name"/>
|
||||
</button>
|
||||
</t>
|
||||
|
||||
|
||||
+2
-4
@@ -2,10 +2,9 @@
|
||||
<templates xml:space="preserve">
|
||||
|
||||
<t t-name="mail.MobileMessagingNavbarView" owl="1">
|
||||
<t t-if="mobileMessagingNavbarView">
|
||||
<div class="o_MobileMessagingNavbarView d-flex flex-shrink-0 border-top bg-view shadow-lg" t-attf-class="{{ className }}" t-ref="root">
|
||||
<t t-foreach="mobileMessagingNavbarView.tabs" t-as="tab" t-key="tab.id">
|
||||
<div class="o_MobileMessagingNavbarView_tab d-flex flex-column align-items-center flex-grow-1 p-2" t-att-class="{ 'o-active text-primary': mobileMessagingNavbarView.activeTabId === tab.id, 'border-start': tab_index !== 0 }" t-on-click="ev => mobileMessagingNavbarView.onClick(tab.id, ev)" t-att-data-tab-id="tab.id">
|
||||
<t t-foreach="tabs" t-as="tab" t-key="tab.id">
|
||||
<div class="o_MobileMessagingNavbarView_tab d-flex flex-column align-items-center flex-grow-1 p-2" t-att-class="{ 'o-active text-primary': activeTabId === tab.id, 'border-start': tab_index !== 0 }" t-on-click="ev => onClick(tab.id, ev)" t-att-data-tab-id="tab.id">
|
||||
<t t-if="tab.icon">
|
||||
<span class="o_MobileMessagingNavbarView_tabIcon fs-4" t-att-class="tab.icon"/>
|
||||
</t>
|
||||
@@ -13,7 +12,6 @@
|
||||
</div>
|
||||
</t>
|
||||
</div>
|
||||
</t>
|
||||
</t>
|
||||
|
||||
</templates>
|
||||
|
||||
@@ -2,42 +2,40 @@
|
||||
<templates xml:space="preserve">
|
||||
|
||||
<t t-name="mail.NotificationGroupView" owl="1">
|
||||
<t t-if="notificationGroupView">
|
||||
<div class="o_NotificationListItem o_NotificationGroupView d-flex flex-shrink-0 align-items-center p-1 cursor-pointer" t-attf-class="{{ className }}" t-on-click="notificationGroupView.onClick" t-ref="root">
|
||||
<div class="o_NotificationListItem o_NotificationGroupView d-flex flex-shrink-0 align-items-center p-1 cursor-pointer" t-attf-class="{{ className }}" t-on-click="onClick" t-ref="root">
|
||||
<div class="o_NotificationListItem_sidebar o_NotificationGroupView_sidebar m-1">
|
||||
<div class="o_NotificationListItem_imageContainer o_NotificationGroupView_imageContainer o_NotificationGroupView_sidebarItem position-relative">
|
||||
<img class="o_NotificationListItem_image o_NotificationGroupView_image w-100 h-100 rounded-circle" t-att-src="notificationGroupView.imageSrc" alt="Message delivery failure image"/>
|
||||
<img class="o_NotificationListItem_image o_NotificationGroupView_image w-100 h-100 rounded-circle" t-att-src="imageSrc" alt="Message delivery failure image"/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="o_NotificationListItem_content o_NotificationGroupView_content d-flex flex-column flex-grow-1 align-self-start m-2">
|
||||
<div class="o_NotificationGroupView_header o_NotificationListItem_header d-flex">
|
||||
<span class="o_NotificationListItem_name o_NotificationGroupView_name text-truncate fw-bold" t-att-class="{ 'o-mobile fs-5': messaging.device.isSmall }">
|
||||
<t t-esc="notificationGroupView.notificationGroup.res_model_name"/>
|
||||
<t t-esc="notificationGroup.res_model_name"/>
|
||||
</span>
|
||||
<t t-if="notificationGroupView.notificationGroup.notifications.length > 1">
|
||||
<t t-if="notificationGroup.notifications.length > 1">
|
||||
<span class="o_NotificationListItem_counter o_NotificationGroupView_counter mx-1 fw-bold">
|
||||
(<t t-esc="notificationGroupView.notificationGroup.notifications.length"/>)
|
||||
(<t t-esc="notificationGroup.notifications.length"/>)
|
||||
</span>
|
||||
</t>
|
||||
<span class="flex-grow-1"/>
|
||||
<t t-if="notificationGroupView.notificationGroup.date">
|
||||
<t t-if="notificationGroup.date">
|
||||
<small class="o_NotificationListItem_date o_NotificationGroupView_date flex-shrink-0 text-500">
|
||||
<t t-esc="notificationGroupView.notificationGroup.date.fromNow()"/>
|
||||
<t t-esc="notificationGroup.date.fromNow()"/>
|
||||
</small>
|
||||
</t>
|
||||
</div>
|
||||
<div class="o_NotificationGroupView_core d-flex align-items-baseline">
|
||||
<span class="o_NotificationListItem_coreItem o_NotificationListItem_inlineText o_NotificationGroupView_coreItem o_NotificationGroupView_inlineText me-2 text-truncate">
|
||||
<t t-if="notificationGroupView.notificationGroup.notification_type === 'email'">
|
||||
<t t-if="notificationGroup.notification_type === 'email'">
|
||||
An error occurred when sending an email.
|
||||
</t>
|
||||
</span>
|
||||
<span class="flex-grow-1"/>
|
||||
<span class="o_NotificationListItem_coreItem o_NotificationListItem_markAsRead o_NotificationGroupView_coreItem o_NotificationGroupView_markAsRead fa fa-check d-flex flex-shrink-0 ms-2 text-600 opacity-50 opacity-100-hover" title="Discard message delivery failures" t-on-click="notificationGroupView.onClickMarkAsRead" t-ref="markAsRead"/>
|
||||
<span class="o_NotificationListItem_coreItem o_NotificationListItem_markAsRead o_NotificationGroupView_coreItem o_NotificationGroupView_markAsRead fa fa-check d-flex flex-shrink-0 ms-2 text-600 opacity-50 opacity-100-hover" title="Discard message delivery failures" t-on-click="onClickMarkAsRead" t-ref="markAsRead"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</t>
|
||||
</t>
|
||||
|
||||
</templates>
|
||||
|
||||
@@ -2,15 +2,14 @@
|
||||
<templates xml:space="preserve">
|
||||
|
||||
<t t-name="mail.NotificationListView" owl="1">
|
||||
<t t-if="notificationListView">
|
||||
<div class="o_NotificationListView d-flex flex-column overflow-auto" t-att-class="{ 'o-empty justify-content-center': notificationListView.notificationViews.length === 0 }" t-attf-class="{{ className }}" t-ref="root">
|
||||
<t t-if="notificationListView.notificationViews.length === 0">
|
||||
<div class="o_NotificationListView d-flex flex-column overflow-auto" t-att-class="{ 'o-empty justify-content-center': notificationViews.length === 0 }" t-attf-class="{{ className }}" t-ref="root">
|
||||
<t t-if="notificationViews.length === 0">
|
||||
<div class="o_NotificationListView_noConversation d-flex align-items-center justify-content-center py-4 px-2 text-muted">
|
||||
No conversation yet...
|
||||
</div>
|
||||
</t>
|
||||
<t t-else="">
|
||||
<t t-foreach="notificationListView.notificationViews" t-as="notificationView" t-key="notificationView.localId">
|
||||
<t t-foreach="notificationViews" t-as="notificationView" t-key="notificationView.localId">
|
||||
<t t-if="notificationView.constructor.name === 'ChannelPreviewView'">
|
||||
<ChannelPreviewView
|
||||
className="'o_NotificationListView_preview'"
|
||||
@@ -45,7 +44,6 @@
|
||||
</t>
|
||||
</t>
|
||||
</div>
|
||||
</t>
|
||||
</t>
|
||||
|
||||
</templates>
|
||||
|
||||
+1
-1
@@ -4,7 +4,7 @@
|
||||
<div class="o_NotificationMessageView d-flex justify-content-center" t-ref="root">
|
||||
<div class="flex-grow-1"/>
|
||||
<div class="text-500 small px-3">
|
||||
<span class="d-inline" t-esc="notificationMessageView.message.authorName"/> <t t-out="notificationMessageView.message.prettyBodyAsMarkup"/>
|
||||
<span class="d-inline" t-esc="message.authorName"/> <t t-out="message.prettyBodyAsMarkup"/>
|
||||
</div>
|
||||
<div class="flex-grow-1"/>
|
||||
</div>
|
||||
|
||||
@@ -2,23 +2,22 @@
|
||||
<templates xml:space="preserve">
|
||||
|
||||
<t t-name="mail.NotificationRequestView" owl="1">
|
||||
<t t-if="notificationRequestView">
|
||||
<div class="o_NotificationListItem o_NotificationRequestView d-flex flex-shrink-0 align-items-center p-1 cursor-pointer" t-attf-class="{{ className }}" t-on-click="notificationRequestView.onClick" t-ref="root">
|
||||
<div class="o_NotificationListItem o_NotificationRequestView d-flex flex-shrink-0 align-items-center p-1 cursor-pointer" t-attf-class="{{ className }}" t-on-click="onClick" t-ref="root">
|
||||
<div class="o_NotificationListItem_sidebar o_NotificationRequestView_sidebar m-1">
|
||||
<div class="o_NotificationListItem_imageContainer o_NotificationRequestView_imageContainer o_NotificationRequestView_sidebarItem position-relative">
|
||||
<img class="o_NotificationListItem_image o_NotificationRequestView_image w-100 h-100 rounded-circle" t-att-src="messaging.partnerRoot.avatarUrl" alt="Avatar of OdooBot"/>
|
||||
<PersonaImStatusIconView
|
||||
t-if="notificationRequestView.personaImStatusIconView"
|
||||
t-if="personaImStatusIconView"
|
||||
className="'o_NotificationListItem_personaImStatusIcon o_NotificationRequestView_personaImStatusIcon position-absolute bottom-0 end-0 d-flex align-items-center justify-content-center'"
|
||||
classNameObj="{ 'o-isDeviceSmall': messaging.device.isSmall, 'small': !messaging.device.isSmall }"
|
||||
record="notificationRequestView.personaImStatusIconView"
|
||||
record="personaImStatusIconView"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="o_NotificationListItem_content o_NotificationRequestView_content d-flex flex-column flex-grow-1 align-self-start m-2">
|
||||
<div class="o_NotificationListItem_header o_NotificationRequestView_header d-flex">
|
||||
<span class="o_NotificationListItem_name o_NotificationRequestView_name text-truncate fw-bold" t-att-class="{ 'o-isDeviceSmall fs-5': messaging.device.isSmall }">
|
||||
<t t-esc="notificationRequestView.headerText"/>
|
||||
<t t-esc="headerText"/>
|
||||
</span>
|
||||
</div>
|
||||
<div class="o_NotificationRequestView_core">
|
||||
@@ -28,7 +27,6 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</t>
|
||||
</t>
|
||||
|
||||
</templates>
|
||||
|
||||
+11
-11
@@ -4,31 +4,31 @@
|
||||
<t t-name="mail.PersonaImStatusIconView" owl="1">
|
||||
<span class="o_PersonaImStatusIconView d-flex flex-column fa-stack"
|
||||
t-att-class="{
|
||||
'o-away': personaImStatusIconView.persona.im_status === 'away',
|
||||
'o-bot': messaging.partnerRoot.persona === personaImStatusIconView.persona,
|
||||
'o-has-open-chat cursor-pointer': personaImStatusIconView.hasOpenChat,
|
||||
'o-offline': personaImStatusIconView.persona.im_status === 'offline',
|
||||
'o-online': personaImStatusIconView.persona.im_status === 'online',
|
||||
'o-away': persona.im_status === 'away',
|
||||
'o-bot': messaging.partnerRoot.persona === persona,
|
||||
'o-has-open-chat cursor-pointer': hasOpenChat,
|
||||
'o-offline': persona.im_status === 'offline',
|
||||
'o-online': persona.im_status === 'online',
|
||||
}"
|
||||
t-attf-class="{{ className }}"
|
||||
t-on-click="personaImStatusIconView.onClick"
|
||||
t-on-click="onClick"
|
||||
t-ref="root"
|
||||
name="root"
|
||||
>
|
||||
<t t-if="personaImStatusIconView.hasBackground">
|
||||
<t t-if="hasBackground">
|
||||
<i class="o_PersonaImStatusIconView_outerBackground fa fa-circle fa-stack-1x"/>
|
||||
<i class="o_PersonaImStatusIconView_innerBackground fa fa-circle fa-stack-1x"/>
|
||||
</t>
|
||||
<t t-if="personaImStatusIconView.persona.im_status === 'online'">
|
||||
<t t-if="persona.im_status === 'online'">
|
||||
<i class="o_PersonaImStatusIconView_icon o-online fa fa-circle fa-stack-1x text-primary" title="Online" role="img" aria-label="User is online"/>
|
||||
</t>
|
||||
<t t-if="personaImStatusIconView.persona.im_status === 'away'">
|
||||
<t t-if="persona.im_status === 'away'">
|
||||
<i class="o_PersonaImStatusIconView_icon o-away fa fa-circle fa-stack-1x text-warning" title="Idle" role="img" aria-label="User is idle"/>
|
||||
</t>
|
||||
<t t-if="personaImStatusIconView.persona.im_status === 'offline'">
|
||||
<t t-if="persona.im_status === 'offline'">
|
||||
<i class="o_PersonaImStatusIconView_icon o-offline fa fa-circle-o fa-stack-1x text-700" title="Offline" role="img" aria-label="User is offline"/>
|
||||
</t>
|
||||
<t t-if="personaImStatusIconView.persona === messaging.partnerRoot.persona">
|
||||
<t t-if="persona === messaging.partnerRoot.persona">
|
||||
<i class="o_PersonaImStatusIconView_icon o-bot fa fa-heart fa-stack-1x text-primary" title="Bot" role="img" aria-label="User is a bot"/>
|
||||
</t>
|
||||
</span>
|
||||
|
||||
@@ -2,15 +2,13 @@
|
||||
<templates xml:space="preserve">
|
||||
|
||||
<t t-name="mail.PopoverView" owl="1">
|
||||
<t t-if="popoverView">
|
||||
<div class="o_PopoverView border bg-view shadow-sm" t-attf-class="{{ className }}" t-ref="root">
|
||||
<t
|
||||
t-component="constructor.components[popoverView.contentComponentName]"
|
||||
className="popoverView.contentClassName"
|
||||
t-props="{ record: popoverView.content }"
|
||||
t-component="constructor.components[contentComponentName]"
|
||||
className="contentClassName"
|
||||
t-props="{ record: content }"
|
||||
/>
|
||||
</div>
|
||||
</t>
|
||||
</t>
|
||||
|
||||
</templates>
|
||||
|
||||
@@ -2,55 +2,53 @@
|
||||
<templates xml:space="preserve">
|
||||
|
||||
<t t-name="mail.ThreadIconView" owl="1">
|
||||
<t t-if="threadIconView">
|
||||
<div class="o_ThreadIconView d-flex justify-content-center flex-shrink-0" t-attf-class="{{ className }}" t-ref="root" name="root">
|
||||
<t t-if="threadIconView.thread.channel and threadIconView.thread.channel.channel_type === 'channel'">
|
||||
<t t-if="threadIconView.thread.authorizedGroupFullName">
|
||||
<div class="o_ThreadIconView_groupRestrictedChannel fa fa-fw fa-hashtag" t-att-title="threadIconView.thread.accessRestrictedToGroupText"/>
|
||||
<t t-if="thread.channel and thread.channel.channel_type === 'channel'">
|
||||
<t t-if="thread.authorizedGroupFullName">
|
||||
<div class="o_ThreadIconView_groupRestrictedChannel fa fa-fw fa-hashtag" t-att-title="thread.accessRestrictedToGroupText"/>
|
||||
</t>
|
||||
<t t-if="!threadIconView.thread.authorizedGroupFullName">
|
||||
<t t-if="!thread.authorizedGroupFullName">
|
||||
<div class="o_ThreadIconView_publicChannel fa fa-fw fa-globe" title="Public Channel"/>
|
||||
</t>
|
||||
</t>
|
||||
<t t-elif="threadIconView.thread.channel and threadIconView.thread.channel.channel_type === 'chat' and threadIconView.thread.channel.correspondent">
|
||||
<t t-if="threadIconView.threadTypingIconView">
|
||||
<t t-elif="thread.channel and thread.channel.channel_type === 'chat' and thread.channel.correspondent">
|
||||
<t t-if="threadTypingIconView">
|
||||
<ThreadTypingIconView
|
||||
className="'o_ThreadIconView_typing flex-grow-1'"
|
||||
record="threadIconView.threadTypingIconView"
|
||||
record="threadTypingIconView"
|
||||
/>
|
||||
</t>
|
||||
<t t-elif="threadIconView.thread.channel.correspondent.im_status === 'online'">
|
||||
<t t-elif="thread.channel.correspondent.im_status === 'online'">
|
||||
<div class="o_ThreadIconView_online fa fa-fw fa-circle" title="Online"/>
|
||||
</t>
|
||||
<t t-elif="threadIconView.thread.channel.correspondent.im_status === 'offline'">
|
||||
<t t-elif="thread.channel.correspondent.im_status === 'offline'">
|
||||
<div class="o_ThreadIconView_offline fa fa-fw fa-circle-o" title="Offline"/>
|
||||
</t>
|
||||
<t t-elif="threadIconView.thread.channel.correspondent.im_status === 'away'">
|
||||
<t t-elif="thread.channel.correspondent.im_status === 'away'">
|
||||
<div class="o_ThreadIconView_away fa fa-fw fa-circle text-warning" title="Away"/>
|
||||
</t>
|
||||
<t t-elif="threadIconView.thread.channel.correspondent === messaging.partnerRoot">
|
||||
<t t-elif="thread.channel.correspondent === messaging.partnerRoot">
|
||||
<div class="o_ThreadIconView_online fa fa-fw fa-heart" title="Bot"/>
|
||||
</t>
|
||||
<t t-else="" name="noImStatusCondition">
|
||||
<div class="o_ThreadIconView_noImStatus fa fa-fw fa-question-circle" title="No IM status available"/>
|
||||
</t>
|
||||
</t>
|
||||
<t t-elif="threadIconView.thread.channel and threadIconView.thread.channel.channel_type === 'group'">
|
||||
<t t-elif="thread.channel and thread.channel.channel_type === 'group'">
|
||||
<div class="o_ThreadIconView fa fa-fw fa-users" title="Grouped Chat"/>
|
||||
</t>
|
||||
<t t-elif="threadIconView.thread.mailbox">
|
||||
<t t-if="threadIconView.thread.mailbox === messaging.inbox">
|
||||
<t t-elif="thread.mailbox">
|
||||
<t t-if="thread.mailbox === messaging.inbox">
|
||||
<div class="o_ThreadIconView_mailboxInbox fa fa-fw fa-inbox"/>
|
||||
</t>
|
||||
<t t-elif="threadIconView.thread.mailbox === messaging.starred">
|
||||
<t t-elif="thread.mailbox === messaging.starred">
|
||||
<div class="o_ThreadIconView_mailboxStarred fa fa-fw fa-star-o"/>
|
||||
</t>
|
||||
<t t-elif="threadIconView.thread.mailbox === messaging.history">
|
||||
<t t-elif="thread.mailbox === messaging.history">
|
||||
<div class="o_ThreadIconView_mailboxHistory fa fa-fw fa-history"/>
|
||||
</t>
|
||||
</t>
|
||||
</div>
|
||||
</t>
|
||||
</t>
|
||||
|
||||
</templates>
|
||||
|
||||
+3
-5
@@ -2,15 +2,13 @@
|
||||
<templates xml:space="preserve">
|
||||
|
||||
<t t-name="mail.ThreadTextualTypingStatusView" owl="1">
|
||||
<t t-if="threadTextualTypingStatusView">
|
||||
<div class="o_ThreadTextualTypingStatusView d-flex" t-attf-class="{{ className }}" t-ref="root">
|
||||
<t t-if="threadTextualTypingStatusView.threadTypingIconView">
|
||||
<ThreadTypingIconView record="threadTextualTypingStatusView.threadTypingIconView"/>
|
||||
<t t-if="threadTypingIconView">
|
||||
<ThreadTypingIconView record="threadTypingIconView"/>
|
||||
<span class="o_ThreadTextualTypingStatusView_separator ms-1"/>
|
||||
<span class="text-truncate" t-esc="threadTextualTypingStatusView.thread.typingStatusText"/>
|
||||
<span class="text-truncate" t-esc="thread.typingStatusText"/>
|
||||
</t>
|
||||
</div>
|
||||
</t>
|
||||
</t>
|
||||
|
||||
</templates>
|
||||
|
||||
@@ -2,20 +2,20 @@
|
||||
<templates xml:space="preserve">
|
||||
|
||||
<t t-name="mail.ThreadTypingIconView" owl="1">
|
||||
<div class="o_ThreadTypingIconView d-flex align-items-center" t-attf-class="{{ className }}" t-att-title="threadTypingIconView.title" t-ref="root">
|
||||
<div class="o_ThreadTypingIconView d-flex align-items-center" t-attf-class="{{ className }}" t-att-title="title" t-ref="root">
|
||||
<span class="o_ThreadTypingIconView_dot o_ThreadTypingIconView_dot1 d-flex flex-shrink-0 rounded-pill bg-500" t-att-class="{
|
||||
'o-sizeMedium': threadTypingIconView.size === 'medium',
|
||||
'o-sizeSmall': threadTypingIconView.size === 'small',
|
||||
'o-sizeMedium': size === 'medium',
|
||||
'o-sizeSmall': size === 'small',
|
||||
}"/>
|
||||
<span class="o_ThreadTypingIconView_separator flex-grow-1 flex-shrink-0"/>
|
||||
<span class="o_ThreadTypingIconView_dot o_ThreadTypingIconView_dot2 d-flex flex-shrink-0 rounded-pill bg-500" t-att-class="{
|
||||
'o-sizeMedium': threadTypingIconView.size === 'medium',
|
||||
'o-sizeSmall': threadTypingIconView.size === 'small',
|
||||
'o-sizeMedium': size === 'medium',
|
||||
'o-sizeSmall': size === 'small',
|
||||
}"/>
|
||||
<span class="o_ThreadTypingIconView_separator flex-grow-1 flex-shrink-0"/>
|
||||
<span class="o_ThreadTypingIconView_dot o_ThreadTypingIconView_dot3 d-flex flex-shrink-0 rounded-pill bg-500" t-att-class="{
|
||||
'o-sizeMedium': threadTypingIconView.size === 'medium',
|
||||
'o-sizeSmall': threadTypingIconView.size === 'small',
|
||||
'o-sizeMedium': size === 'medium',
|
||||
'o-sizeSmall': size === 'small',
|
||||
}"/>
|
||||
</div>
|
||||
</t>
|
||||
|
||||
@@ -2,64 +2,62 @@
|
||||
<templates xml:space="preserve">
|
||||
|
||||
<t t-name="mail.ThreadView" owl="1">
|
||||
<t t-if="threadView">
|
||||
<div class="o_ThreadView position-relative d-flex flex-column bg-100"
|
||||
t-att-class="threadView.extraClass"
|
||||
t-att-class="extraClass"
|
||||
t-attf-class="{{ className }}"
|
||||
t-att-data-correspondent-id="threadView.thread.channel and threadView.thread.channel.correspondent and threadView.thread.channel.correspondent.id"
|
||||
t-att-data-thread-id="threadView.thread and threadView.thread.id"
|
||||
t-att-data-thread-model="threadView.thread and threadView.thread.model"
|
||||
t-on-focusin="threadView.onFocusin"
|
||||
t-att-data-correspondent-id="thread.channel and thread.channel.correspondent and thread.channel.correspondent.id"
|
||||
t-att-data-thread-id="thread and thread.id"
|
||||
t-att-data-thread-model="thread and thread.model"
|
||||
t-on-focusin="onFocusin"
|
||||
t-ref="root"
|
||||
>
|
||||
<t t-if="threadView.topbar">
|
||||
<ThreadViewTopbar className="'border-bottom'" record="threadView.topbar"/>
|
||||
<t t-if="topbar">
|
||||
<ThreadViewTopbar className="'border-bottom'" record="topbar"/>
|
||||
</t>
|
||||
<div class="o_ThreadView_bottomPart d-flex flex-grow-1" t-att-class="{ 'border-start border-end': threadView.threadViewer.chatWindow }">
|
||||
<div class="o_ThreadView_bottomPart d-flex flex-grow-1" t-att-class="{ 'border-start border-end': threadViewer.chatWindow }">
|
||||
<div class="o_ThreadView_core d-flex flex-column flex-grow-1">
|
||||
<t t-if="threadView.callView">
|
||||
<CallView record="threadView.callView"/>
|
||||
<t t-if="callView">
|
||||
<CallView record="callView"/>
|
||||
</t>
|
||||
<t t-if="threadView.isLoading and !threadView.threadCache.isLoaded" name="loadingCondition">
|
||||
<t t-if="isLoading and !threadCache.isLoaded" name="loadingCondition">
|
||||
<div class="o_ThreadView_loading d-flex align-self-center flex-grow-1 align-items-center">
|
||||
<span><i class="o_ThreadView_loadingIcon fa fa-circle-o-notch fa-spin me-1" title="Loading..." role="img"/>Loading...</span>
|
||||
</div>
|
||||
</t>
|
||||
<t t-elif="threadView.messageListView">
|
||||
<t t-elif="messageListView">
|
||||
<MessageListView
|
||||
className="'o_ThreadView_messageList flex-grow-1'"
|
||||
record="threadView.messageListView"
|
||||
record="messageListView"
|
||||
/>
|
||||
</t>
|
||||
<t t-elif="threadView.threadCache.hasLoadingFailed">
|
||||
<t t-elif="threadCache.hasLoadingFailed">
|
||||
<div class="o_ThreadView_loadingFailed d-flex flex-grow-1 align-items-center justify-content-center flex-column">
|
||||
<div class="o_ThreadView_loadingFailedText">
|
||||
An error occurred while fetching messages.
|
||||
</div>
|
||||
<button class="o_ThreadView_loadingFailedRetryButton btn btn-link" t-on-click="threadView.onClickRetryLoadMessages">
|
||||
<button class="o_ThreadView_loadingFailedRetryButton btn btn-link" t-on-click="onClickRetryLoadMessages">
|
||||
Click here to retry
|
||||
</button>
|
||||
</div>
|
||||
</t>
|
||||
<t t-elif="threadView.composerView">
|
||||
<t t-elif="composerView">
|
||||
<div class="flex-grow-1"/>
|
||||
</t>
|
||||
<t t-if="threadView.composerView">
|
||||
<t t-if="composerView">
|
||||
<ComposerView
|
||||
className="'o_ThreadView_composer flex-shrink-0'"
|
||||
record="threadView.composerView"
|
||||
record="composerView"
|
||||
/>
|
||||
</t>
|
||||
</div>
|
||||
<t t-if="threadView.channelMemberListView">
|
||||
<ChannelMemberListView className="'o_ThreadView_channelMemberList flex-shrink-0 border-start'" record="threadView.channelMemberListView"/>
|
||||
<t t-if="channelMemberListView">
|
||||
<ChannelMemberListView className="'o_ThreadView_channelMemberList flex-shrink-0 border-start'" record="channelMemberListView"/>
|
||||
</t>
|
||||
<t t-if="threadView.isCallSettingsMenuOpen">
|
||||
<CallSettingsMenu className="'o_ThreadView_callSettingsMenu flex-shrink-0 border-start'" record="threadView.callSettingsMenu"/>
|
||||
<t t-if="isCallSettingsMenuOpen">
|
||||
<CallSettingsMenu className="'o_ThreadView_callSettingsMenu flex-shrink-0 border-start'" record="callSettingsMenu"/>
|
||||
</t>
|
||||
</div>
|
||||
</div>
|
||||
</t>
|
||||
</t>
|
||||
|
||||
</templates>
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user