summaryrefslogtreecommitdiff
path: root/addons/mail/static/src/xml/thread.xml
diff options
context:
space:
mode:
Diffstat (limited to 'addons/mail/static/src/xml/thread.xml')
-rw-r--r--addons/mail/static/src/xml/thread.xml536
1 files changed, 0 insertions, 536 deletions
diff --git a/addons/mail/static/src/xml/thread.xml b/addons/mail/static/src/xml/thread.xml
index 05f9f04f6f7..5a3205ed2cb 100644
--- a/addons/mail/static/src/xml/thread.xml
+++ b/addons/mail/static/src/xml/thread.xml
@@ -10,33 +10,6 @@
</t>
</t>
<!--
- @param {mail.model.AbstractThread} thread
- @param {Object} options
- @param {boolean} [options.displayEmptyThread]
- @param {boolean} [options.displayModerationCommands]
- @param {boolean} [options.displayNoMatchFound]
- @param {Array} [options.domain=[]] the domain to restrict messages on the thread.
- -->
- <t t-name="mail.widget.Thread">
- <t t-if="thread.hasMessages({ 'domain': options.domain || [] })">
- <t t-call="mail.widget.Thread.Content"/>
- </t>
- <t t-elif="options.displayEmptyThread">
- <t t-call="mail.widget.Thread.Empty" />
- </t>
- <div t-elif="options.displayNoMatchFound" class="o_mail_no_content">
- <div class="o_thread_title">No matches found</div>
- <div>No message matches your search. Try to change your search filters.</div>
- </div>
- </t>
-
- <!-- Rendering of thread when messaging not yet ready -->
- <div t-name="mail.widget.ThreadLoading" class="o_mail_thread_loading">
- <i class="o_mail_thread_loading_icon fa fa-spinner fa-spin"/>
- <span>Please wait...</span>
- </div>
-
- <!--
@param {mail.DocumentViewer} widget
-->
<t t-name="DocumentViewer.Content">
@@ -126,513 +99,4 @@
</html>
</t>
- <!--
- When a thread is empty
-
- @param {mail.model.Thread} thread
- -->
- <div t-name="mail.widget.Thread.Empty" class="o_mail_no_content">
- <t t-if="thread.getID() === 'mailbox_inbox'">
- <div class="o_thread_title">Congratulations, your inbox is empty</div>
- <div>New messages appear here.</div>
- </t>
- <t t-if="thread.getID() === 'mailbox_starred'">
- <div class="o_thread_title">No starred messages</div>
- <div>You can mark any message as 'starred', and it shows up in this mailbox.</div>
- </t>
- <t t-if="thread.getID() === 'mailbox_history'">
- <div class="o_thread_title o_neutral_face_icon">No history messages</div>
- <div>Messages marked as read will appear in the history.</div>
- </t>
- <t t-if="thread.getID() === 'mailbox_moderation'">
- <div class="o_thread_title">You have no message to moderate</div>
- <div>Pending moderation messages appear here.</div>
- </t>
- </div>
-
- <!--
- @param {mail.model.AbstractThread} thread
- @param {Object} options
- @param {integer} [options.displayOrder] 1 or -1 ascending (respectively, descending) order for
- the thread messages (from top to bottom)
- @param {Array} [options.domain=[]] the domain to restrict messages on the thread.
- @param {Object} ORDER
- @param {integer} ORDER.ASC=1 messages are ordered by ascending order of IDs, (from top to bottom)
- @param {integer} ORDER.DESC=-1 messages are ordered by descending IDs, (from top to bottom)
-
- _____________ _____________
- | | | |
- | message 1 | | message n |
- | message 2 | | ... |
- | ... | | message 2 |
- | message n | | message 1 |
- |_____________| |_____________|
-
- ORDER: ASC DESC
-
- -->
- <t t-name="mail.widget.Thread.Content">
- <t t-set="messages" t-value="thread.getMessages({ 'domain': options.domain || [] })"/>
- <t t-if="options.displayOrder === ORDER.ASC" t-call="mail.widget.Thread.Content.ASC"/>
- <t t-else="" t-call="mail.widget.Thread.Content.DESC"/>
- </t>
-
- <!--
- @param {mail.model.AbstractThread} thread
- @param {Object} options
- @param {boolean} [options.displayBottomThreadFreeSpace=false]
- @param {boolean} [options.displayLoadMore=false]
-
- _____________
- | |
- | message 1 |
- | message 2 |
- | ... |
- | message n |
- |_____________|
-
- ASC Order
- -->
- <t t-name="mail.widget.Thread.Content.ASC">
- <div class="o_mail_thread_content">
- <t t-if="options.displayLoadMore" t-call="mail.widget.Thread.LoadMore"/>
- <t t-call="mail.widget.Thread.Messages"/>
- <t t-if="options.displayBottomThreadFreeSpace">
- <div class="o_thread_bottom_free_space"/>
- </t>
- </div>
- </t>
-
- <!--
- @param {mail.model.AbstractThread} thread
- @param {Object} options
- @param {boolean} [options.displayLoadMore=false]
- @param {string|integer} [options.messagesSeparatorPosition] 'top' or
- message ID, the separator is placed just after this message.
-
- _____________
- | |
- | message n |
- | ... |
- | message 2 |
- | message 1 |
- |_____________|
-
- DESC Order
-
- -->
- <t t-name="mail.widget.Thread.Content.DESC">
- <div class="o_mail_thread_content">
- <t t-if="options.messagesSeparatorPosition == 'top'" t-call="mail.MessagesSeparator"/>
- <t t-set="messages" t-value="messages.slice().reverse()"/>
- <t t-call="mail.widget.Thread.Messages"/>
- <t t-if="options.displayLoadMore" t-call="mail.widget.Thread.LoadMore"/>
- </div>
- </t>
-
- <!--
- @param {mail.model.AbstractMessage[]} messages messages are ordered based
- on desired display order
- -->
- <t t-name="mail.widget.Thread.Messages">
- <t t-set="current_day" t-value="0"/>
- <t t-foreach="messages" t-as="message">
- <div t-if="current_day !== message.getDateDay()" class="o_thread_date_separator">
- <span class="o_thread_date">
- <t t-esc="message.getDateDay()"/>
- </span>
- <t t-set="current_day" t-value="message.getDateDay()"/>
- </div>
-
- <t t-call="mail.widget.Thread.Message"/>
- </t>
- </t>
-
- <!--
- @param {mail.model.AbstractThread} thread
- @param {string} dateFormat
- @param {Object} options
- @param {mail.model.AbstractMessage} message
- @param {Object} options
- @param {boolean} [options.displayAvatars]
- @param {boolean} [options.displayDocumentLinks]
- @param {boolean} [options.displayNotificationIcons]
- @param {boolean} [options.displayMarkAsRead]
- @param {boolean} [options.displayModerationCommands] when set, display the moderation commands on
- the message. This includes the moderation checkboxes (needs a control panel such as in Discuss app).
- @param {boolean} [options.displayReplyIcons]
- @param {boolean} [options.displayStars]
- @param {boolean} [options.displaySubjectsOnMessages]
- @param {boolean} options.hasMessageAttachmentDeletable
- @param {string|integer} [options.messagesSeparatorPosition] 'top' or
- message ID, the separator is placed just after this message.
- @param {integer} [options.selectedMessageID]
- -->
- <t t-name="mail.widget.Thread.Message">
- <div t-if="!message.isEmpty()" t-att-class="'o_thread_message ' + (message.getID() === options.selectedMessageID ? 'o_thread_selected_message ' : ' ') + (message.isDiscussion() or message.isNotification() ? ' o_mail_discussion ' : ' o_mail_not_discussion ')" t-att-data-message-id="message.getID()">
- <div t-if="options.displayAvatars" class="o_thread_message_sidebar">
- <t t-if="message.hasAuthor()">
- <div t-if="displayAuthorMessages[message.getID()]" class="o_thread_message_sidebar_image">
- <img
- alt=""
- t-att-src="message.getAvatarSource()"
- data-oe-model="res.partner"
- t-att-data-oe-id="message.shouldRedirectToAuthor() ? message.getAuthorID() : ''"
- t-attf-class="o_thread_message_avatar rounded-circle #{message.shouldRedirectToAuthor() ? 'o_mail_redirect' : ''}"/>
- <t t-call="mail.UserStatus">
- <t t-set="status" t-value="message.getAuthorImStatus()"/>
- <t t-set="partnerID" t-value="message.getAuthorID()"/>
- </t>
- </div>
- </t>
- <t t-else="">
- <img t-if="displayAuthorMessages[message.getID()]"
- alt=""
- t-att-src="message.getAvatarSource()"
- class="o_thread_message_avatar rounded-circle"/>
- </t>
- <span t-if="!displayAuthorMessages[message.getID()]" t-att-title="message.getDate().format(dateFormat)" class="o_thread_message_side_date">
- <t t-esc="message.getDate().format('hh:mm')"/>
- </span>
- <i t-if="!displayAuthorMessages[message.getID()] and options.displayStars and message.getType() !== 'notification'"
- t-att-class="'fa o_thread_message_star o_thread_icon ' + (message.isStarred() ? 'fa-star' : 'fa-star-o')"
- t-att-data-message-id="message.getID()" title="Mark as Todo" role="img" aria-label="Mark as todo"/>
- <t t-if="!displayAuthorMessages[message.getID()] and thread.hasSeenFeature()" t-call="mail.widget.Thread.Message.SeenIcon"/>
- </div>
- <div class="o_thread_message_core">
- <p t-if="displayAuthorMessages[message.getID()]" class="o_mail_info text-muted">
- <input t-if="message.needsModeration() and message.needsModerationByUser() and options.displayModerationCommands" type="checkbox" class="moderation_checkbox" t-att-data-message-id="message.getID()"/>
- <t t-if="message.isNote()">
- Note by
- </t>
-
- <strong t-if="message.hasAuthor()"
- data-oe-model="res.partner" t-att-data-oe-id="message.shouldRedirectToAuthor() ? message.getAuthorID() : ''"
- t-attf-class="o_thread_author #{message.shouldRedirectToAuthor() ? 'o_mail_redirect' : ''}">
- <t t-esc="message.getDisplayedAuthor()"/>
- </strong>
- <strong t-elif="message.hasEmailFrom()">
- <a class="text-muted" t-attf-href="mailto:#{message.getEmailFrom()}?subject=Re: #{message.hasSubject() ? message.getSubject() : ''}">
- <t t-esc="message.getEmailFrom()"/>
- </a>
- </strong>
- <strong t-else="" class="o_thread_author">
- <t t-esc="message.getDisplayedAuthor()"/>
- </strong>
-
- - <small class="o_mail_timestamp" t-att-title="message.getDate().format(dateFormat)"><t t-esc="message.getTimeElapsed()"/></small>
- <t t-if="message.isLinkedToDocumentThread() and options.displayDocumentLinks">
- <small>on</small> <a t-att-href="message.getURL()" t-att-data-oe-model="message.getDocumentModel()" t-att-data-oe-id="message.getDocumentID()" class="o_document_link"><t t-esc="message.getDocumentName()"/></a>
- </t>
- <t t-if="message.originatesFromChannel() and (message.getOriginChannelID() !== thread.getID())">
- (<small>from</small> <a t-att-data-oe-id="message.getOriginChannelID()" href="#">#<t t-esc="message.getOriginChannelName()"/></a>)
- </t>
- <span t-if="options.displayNotificationIcons and message.hasNotifications()" class="o_thread_tooltip_container">
- <span name="notification_icon" t-attf-class="d-inline-flex align-items-center o_thread_tooltip o_thread_message_notification {{ message.hasNotificationsError() ? 'o_thread_message_notification_error' : '' }}" t-att-data-message-id="message.getID()" t-att-data-message-type="message.getType()">
- <i t-att-class="message.getNotificationIcon()"/>
- <small t-if="message.getNotificationText()" t-esc="message.getNotificationText()" class="font-weight-bold ml-1"/>
- </span>
- </span>
- <span t-attf-class="o_thread_icons">
- <t t-if="thread.hasSeenFeature()" t-call="mail.widget.Thread.Message.SeenIcon"/>
- <i t-if="options.displayStars and !message.isSystemNotification() and !message.needsModeration()"
- t-att-class="'fa fa-lg o_thread_icon o_thread_message_star ' + (message.isStarred() ? 'fa-star' : 'fa-star-o')"
- t-att-data-message-id="message.getID()" title="Mark as Todo" role="img" aria-label="Mark as Todo"/>
- <i t-if="message.isLinkedToDocumentThread() and options.displayReplyIcons"
- class="fa fa-reply o_thread_icon o_thread_message_reply"
- t-att-data-message-id="message.getID()" title="Reply" role="img" aria-label="Reply"/>
- <i t-if="message.isNeedaction() and options.displayMarkAsRead"
- class="fa fa-check o_thread_icon o_thread_message_needaction"
- t-att-data-message-id="message.getID()" title="Mark as Read" role="img" aria-label="Mark as Read"/>
-
- <t t-if="message.needsModeration() and message.originatesFromChannel()">
- <t t-call="mail.MessageModeration"/>
- </t>
- </span>
- </p>
- <div class="o_thread_message_content">
- <t t-raw="message.getBody()"/>
- <t t-if="message.hasTrackingValues()">
- <t t-if="message.hasSubtypeDescription()">
- <p><t t-esc="message.getSubtypeDescription()"/></p>
- </t>
- <t t-call="mail.widget.Thread.MessageTracking"/>
- </t>
- <p t-if="options.displaySubjectOnMessages and message.shouldDisplaySubject()" class="o_mail_subject">Subject: <t t-esc="message.getSubject()"/></p>
- <t t-if="message.hasAttachments()">
- <div t-if="message.hasImageAttachments()" class="o_attachments_previews">
- <t t-foreach="message.getImageAttachments()" t-as="attachment">
- <t t-call="mail.AttachmentPreview">
- <t t-set="isDeletable" t-value="options.hasMessageAttachmentDeletable"/>
- </t>
- </t>
- </div>
- <div t-if="message.hasNonImageAttachments()" class="o_attachments_list">
- <t t-foreach="message.getNonImageAttachments()" t-as="attachment">
- <t t-call="mail.Attachment">
- <t t-set="isDeletable" t-value="options.hasMessageAttachmentDeletable"/>
- </t>
- </t>
- </div>
- </t>
- </div>
- </div>
- </div>
- <t t-if="options.messagesSeparatorPosition == message.getID()">
- <t t-call="mail.MessagesSeparator"/>
- </t>
- </t>
-
- <!--
- Display the seen icon of a message in the thread.
- It shows the fetch 'check' before the seen 'check'. We change the order in the template
- so that fetch 'check' is on top of 'seen' check (z-index does not work with absolute positioning)
-
- @param {mail.model.Thread} thread
- @param {mail.model.Message} message
- -->
- <t t-name="mail.widget.Thread.Message.SeenIcon">
- <t t-if="message.isMyselfAuthor() and message.getID() >= thread.getLastMessageIDSeenByEveryone()">
- <span t-attf-class="o_mail_thread_message_seen_icon #{thread.hasEveryoneSeen(message) ? 'o_all_seen' : ''}" t-att-data-message-id="message.getID()">
- <t t-if="thread.hasSomeoneFetched(message)">
- <i class="fa fa-check"/>
- </t>
- <t t-if="thread.hasSomeoneSeen(message)">
- <i class="fa fa-check"/>
- </t>
- </span>
- </t>
- </t>
-
- <!--
- Display the popover content when clicking the seen icion of a message in the thread.
-
- List the members that have received the messages, and the members that have seen it.
-
- @param {mail.model.Thread} thread
- @param {mail.model.Message} message
- -->
- <t t-name="mail.widget.Thread.Message.SeenIconPopoverContent">
- <div class="o_mail_thread_message_seen_icon_content">
- <t t-if="thread.hasEveryoneSeen(message)">
- <p>Seen by Everyone</p>
- </t>
- <t t-else="">
- <t t-if="thread.hasSomeoneSeen(message)">
- <t t-set="seen_members" t-value="thread.getSeenMembers(message)"/>
- Seen by:
- <ul>
- <li t-foreach="seen_members" t-as="member">
- <t t-esc="member.name"/> (<t t-esc="member.email"/>)
- </li>
- </ul>
- </t>
- <t t-if="thread.hasSomeoneFetched(message)">
- <t t-if="thread.hasEveryoneFetched(message)">
- <p>Received by Everyone</p>
- </t>
- <t t-else="">
- <t t-set="fetched_members" t-value="thread.getFetchedNotSeenMembers(message)"/>
- <t t-if="!_.isEmpty(fetched_members)">
- Received by:
- <ul>
- <li t-foreach="fetched_members" t-as="member">
- <t t-esc="member.name"/> (<t t-esc="member.email"/>)
- </li>
- </ul>
- </t>
- </t>
- </t>
- </t>
- </div>
- </t>
-
- <!--
- @param {Object[]} notifications: list of notifications
- A notification is an object with at least the following keys:
- {notification_status, partner_name}
- -->
- <t t-name="mail.widget.Thread.Message.MailTooltip">
- <div t-foreach="notifications" t-as="notification">
- <span name="notification_status" class="d-inline-block text-center o_thread_tooltip_icon">
- <i t-if="notification.notification_status === 'sent'" class='fa fa-check' title="Sent" role="img" aria-label="Sent"/>
- <i t-if="notification.notification_status === 'bounce'" class='fa fa-exclamation text-danger' title="Bounced" role="img" aria-label="Bounced"/>
- <i t-if="notification.notification_status === 'exception'" class='fa fa-exclamation text-danger' title="Error" role="img" aria-label="Error"/>
- <i t-if="notification.notification_status === 'ready'" class='fa fa-send-o' title="Ready" role="img" aria-label="Ready"/>
- <i t-if="notification.notification_status === 'canceled'" class='fa fa-trash-o' title="Canceled" role="img" aria-label="Canceled"/>
- </span>
- <span name="partner_name" t-esc="notification.partner_name"/>
- </div>
- </t>
- <!--
- @param {mail.model.Message} message
- @param {Object} options
- @param {boolean} [options.displayModerationCommands]
- -->
- <t t-name="mail.MessageModeration">
- <i t-if="message.isMyselfAuthor()" class="text-danger" title="Your message is pending moderation"><b>Pending moderation</b></i>
- <t t-elif="message.needsModerationByUser()">
- <t t-if="options.displayModerationCommands" t-call="mail.MessageModerationDecision"/>
- <i t-else="" class="text-danger" title="Open Channel in Discuss to moderate"><b>Pending moderation</b></i>
- </t>
- </t>
-
- <!--
- @param {mail.model.Message} message
- -->
- <t t-name="mail.MessageModerationDecision">
- <i class="o_thread_icon ml4 o_thread_message_moderation text-success"
- t-att-data-message-id="message.getID()" data-decision="accept" title="Accept"><b>Accept |</b></i>
- <i class="o_thread_icon ml4 o_thread_message_moderation text-danger"
- t-att-data-message-id="message.getID()" data-decision="reject" title="Remove message with explanation"><b>Reject |</b></i>
- <i class="o_thread_icon ml4 o_thread_message_moderation text-danger"
- t-att-data-message-id="message.getID()" data-decision="discard" title="Remove message without explanation"><b>Discard |</b></i>
- <i class="o_thread_icon ml4 o_thread_message_moderation text-success"
- t-att-data-message-id="message.getID()" data-decision="allow" title="Add this email address to white list of people"><b>Always Allow |</b></i>
- <i class="o_thread_icon ml4 o_thread_message_moderation text-danger"
- t-att-data-message-id="message.getID()" data-decision="ban" title="Ban this email address"><b>Ban</b></i>
- </t>
-
- <t t-name="mail.MessagesSeparator">
- <div class="o_thread_new_messages_separator">
- <span class="o_thread_separator_label">New messages</span>
- </div>
- </t>
-
- <!--
- @param {mail.model.Message} message
- -->
- <t t-name="mail.widget.Thread.MessageTracking">
- <ul class="o_mail_thread_message_tracking">
- <t t-foreach='message.getTrackingValues()' t-as='value'>
- <li>
- <t t-esc="value.changed_field"/>:
- <t t-if="value.old_value">
- <span> <t t-esc="value.old_value || ((value.field_type !== 'boolean') and '')"/> </span>
- <span t-if="value.old_value !== value.new_value" class="fa fa-long-arrow-right" role="img" aria-label="Changed" title="Changed"/>
- </t>
- <span t-if="value.old_value !== value.new_value">
- <t t-esc="value.new_value || ((value.field_type !== 'boolean') and '')"/>
- </span>
- </li>
- </t>
- </ul>
- </t>
-
- <!--
- @param {Array} attachments
- -->
- <t t-name="mail.composer.Attachments">
- <div t-if="attachments.length > 0" class="o_attachments o_attachments_list">
- <t t-foreach="attachments" t-as='attachment'>
- <t t-call="mail.Attachment">
- <t t-set="editable" t-value="true"/>
- </t>
- </t>
- </div>
- </t>
-
- <!--
- @param {Object} attachment
- @param {integer} attachment.id
- @param {string} attachment.name
- @param {string} attachment.url
- @param {boolean} [isDeletable=false]
- -->
- <t t-name="mail.AttachmentPreview">
- <div class="o_attachment" t-att-title="attachment.name">
- <div class="o_attachment_wrap">
- <div class="o_image_box">
- <div class="o_attachment_image" t-attf-style="background-image:url('/web/image/#{attachment.id}/160x160/?crop=true')"/>
- <div t-attf-class="o_image_overlay o_attachment_view" t-att-data-id="attachment.id">
- <span t-if="isDeletable" class="fa fa-times o_attachment_delete_cross" t-att-title="'Delete ' + attachment.name" t-att-data-id="attachment.id" t-att-data-name="attachment.name"/>
- <span class="o_attachment_title text-white"><t t-esc="attachment.name"/></span>
- <a class="o_attachment_download" t-att-href='attachment.url'>
- <i t-attf-class="fa fa-download text-white" t-att-title="'Download ' + attachment.name" role="img" aria-label="Download"></i>
- </a>
- </div>
- </div>
- </div>
- </div>
- </t>
-
- <!--
- @param {Object} attachment
- @param {string} attachment.filename
- @param {integer} attachment.id
- @param {string} [attachment.mimetype]
- @param {string} attachment.name
- @param {boolean} attachment.upload
- @param {string} attachment.url
- @param {boolean} [editable=false] if set, it means the attachment is rendered in the composer.
- Some changes are required in that case, such as "delete" button is not visible (pretty unlink is used instead).
- @param {boolean} [isDeletable=false]
- -->
- <t t-name="mail.Attachment">
- <t t-set="type" t-value="attachment.mimetype and attachment.mimetype.split('/').shift()"/>
- <div t-attf-class="o_attachment #{ editable ? 'o_attachment_editable' : '' } #{attachment.upload ? 'o_attachment_uploading' : ''}" t-att-title="attachment.name">
- <div class="o_attachment_wrap">
- <span t-if="!editable and isDeletable" class="fa fa-times o_attachment_delete_cross" t-att-title="'Delete ' + attachment.name" t-att-data-id="attachment.id" t-att-data-name="attachment.name"/>
- <t t-set="has_preview" t-value="type == 'image' or type == 'video' or attachment.mimetype == 'application/pdf'"/>
- <t t-set="ext" t-value="attachment.filename.split('.').pop()"/>
-
- <div t-attf-class="o_image_box float-left #{has_preview ? 'o_attachment_view' : ''}" t-att-data-id="attachment.id">
- <div t-if="has_preview"
- class="o_image o_hover"
- t-att-style="type == 'image' ? 'background-image:url(/web/image/' + attachment.id + '/38x38/?crop=true' : '' "
- t-att-data-mimetype="attachment.mimetype">
- </div>
- <a t-elif="!editable" t-att-href='attachment.url' t-att-title="'Download ' + attachment.name" aria-label="Download">
- <span class="o_image o_hover" t-att-data-mimetype="attachment.mimetype" t-att-data-ext="ext"/>
- </a>
- <span t-else="" class="o_image" t-att-data-mimetype="attachment.mimetype" t-att-data-ext="ext" role="img" aria-label="Document not downloadable"/>
- </div>
-
- <div class="caption">
- <span t-if="has_preview or editable" t-attf-class="ml4 #{has_preview? 'o_attachment_view' : ''}" t-att-data-id="attachment.id"><t t-esc='attachment.name'/></span>
- <a t-else="" class="ml4" t-att-href="attachment.url" t-att-title="'Download ' + attachment.name"><t t-esc='attachment.name'/></a>
- </div>
- <div t-if="editable" class="caption small">
- <b t-attf-class="ml4 small text-uppercase #{has_preview? 'o_attachment_view' : ''}" t-att-data-id="attachment.id"><t t-esc="ext"/></b>
- <div class="progress o_attachment_progress_bar">
- <div class="progress-bar progress-bar-striped active" style="width: 100%">Uploading</div>
- </div>
- </div>
- <div t-if="!editable" class="caption small">
- <b t-if="has_preview" class="ml4 small text-uppercase o_attachment_view" t-att-data-id="attachment.id"><t t-esc="ext"/></b>
- <a t-else="" class="ml4 small text-uppercase" t-att-href="attachment.url" t-att-title="'Download ' + attachment.name"><b><t t-esc='ext'/></b></a>
- <a class="ml4 o_attachment_download float-right" t-att-title="'Download ' + attachment.name" t-att-href='attachment.url'><i t-attf-class="fa fa-download" role="img" aria-label="Download"/></a>
- </div>
- <div t-if="editable" class="o_attachment_uploaded"><i class="text-success fa fa-check" role="img" aria-label="Uploaded" title="Uploaded"/></div>
- <div t-if="editable" class="o_attachment_delete" t-att-data-id="attachment.id"><span class="text-white" role="img" aria-label="Delete" title="Delete">×</span></div>
- </div>
- </div>
- </t>
-
- <!--
- @param {Object} options
- @param {boolean} [options.loadMoreOnScroll]
- -->
- <t t-name="mail.widget.Thread.LoadMore">
- <div class="o_thread_show_more">
- <t t-if="options.loadMoreOnScroll">
- <span><i class="fa fa-spinner fa-spin" role="img" aria-label="Please wait" title="Please wait"/> Loading older messages... </span>
- </t>
- <t t-else="">
- <button class="btn btn-link">-------- Show older messages --------</button>
- </t>
- </div>
- </t>
-
- <!--
- @param {mail.model.Thread} thread with typing feature
- -->
- <t t-name="mail.ThreadTypingIcon">
- <span class="o_mail_thread_typing_icon" t-att-title="thread.getTypingMembersToText()">
- <span class="o_mail_thread_typing_icon_dot"/>
- <span class="o_mail_thread_typing_icon_dot"/>
- <span class="o_mail_thread_typing_icon_dot"/>
- </span>
- </t>
-
</templates>