Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion files/lib/data/conversation/ConversationAction.class.php
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,8 @@ public function create()
);
}

return $conversation;
// Reload the object so that `firstMessageID` is set.
return new Conversation($conversation->conversationID);
}

/**
Expand Down
2 changes: 1 addition & 1 deletion templates/__userInformationStartConversation.tpl
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{if MODULE_CONVERSATION && $__wcf->user->userID && $__wcf->session->getPermission('user.conversation.canUseConversation') && $__wcf->session->getPermission('user.conversation.canStartConversation') && $user->userID != $__wcf->user->userID}
<li>
<a class="jsTooltip" href="{link controller='ConversationAdd'}userID={@$user->userID}{/link}" title="{lang}wcf.conversation.button.add{/lang}">
<a class="jsTooltip" href="{link controller='ConversationAdd' userID=$user->userID}{/link}" title="{lang}wcf.conversation.button.add{/lang}">
{icon name='comments' type='solid'}
<span class="invisible">{lang}wcf.conversation.button.add{/lang}</span>
</a>
Expand Down
2 changes: 1 addition & 1 deletion templates/__userPanelConversationDropdown.tpl
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
{/if}
</a>
{if !OFFLINE || $__wcf->session->getPermission('admin.general.canViewPageDuringOfflineMode')}
<script data-relocate="true" src="{$__wcf->getPath()}js/WCF.Conversation{if !ENABLE_DEBUG_MODE}.min{/if}.js?v={@LAST_UPDATE_TIME}"></script>
<script data-relocate="true" src="{$__wcf->getPath()}js/WCF.Conversation{if !ENABLE_DEBUG_MODE}.min{/if}.js?v={LAST_UPDATE_TIME}"></script>
<script data-relocate="true">
require(["WoltLabSuite/Core/Conversation/Ui/User/Menu/Data/Conversation"], ({ setup }) => {
setup({
Expand Down
24 changes: 12 additions & 12 deletions templates/conversationAdd.tpl
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
{elseif $errorType == 'censoredWordsFound'}
{lang}wcf.message.error.censoredWordsFound{/lang}
{else}
{lang}wcf.conversation.subject.error.{@$errorType}{/lang}
{lang}wcf.conversation.subject.error.{$errorType}{/lang}
{/if}
</small>
{/if}
Expand All @@ -40,10 +40,10 @@
{lang}wcf.global.form.error.empty{/lang}
{elseif $errorType|is_array}
{foreach from=$errorType item='errorData'}
{lang}wcf.conversation.participants.error.{@$errorData.type}{/lang}
{lang}wcf.conversation.participants.error.{$errorData.type}{/lang}
{/foreach}
{else}
{lang}wcf.conversation.participants.error.{@$errorType}{/lang}
{lang}wcf.conversation.participants.error.{$errorType}{/lang}
{/if}
</small>
{/if}
Expand All @@ -62,10 +62,10 @@
{lang}wcf.global.form.error.empty{/lang}
{elseif $errorType|is_array}
{foreach from=$errorType item='errorData'}
{lang}wcf.conversation.participants.error.{@$errorData.type}{/lang}
{lang}wcf.conversation.participants.error.{$errorData.type}{/lang}
{/foreach}
{else}
{lang}wcf.conversation.participants.error.{@$errorType}{/lang}
{lang}wcf.conversation.participants.error.{$errorType}{/lang}
{/if}
</small>
{/if}
Expand Down Expand Up @@ -108,7 +108,7 @@
{elseif $errorType == 'disallowedBBCodes'}
{lang}wcf.message.error.disallowedBBCodes{/lang}
{else}
{lang}wcf.conversation.message.error.{@$errorType}{/lang}
{lang}wcf.conversation.message.error.{$errorType}{/lang}
{/if}
</small>
{/if}
Expand All @@ -133,29 +133,29 @@
<script data-relocate="true">
require(['WoltLabSuite/Core/Ui/ItemList/User'], function(UiItemListUser) {
UiItemListUser.init('participants', {
maxItems: {@$__wcf->getSession()->getPermission('user.conversation.maxParticipants')},
maxItems: {$__wcf->getSession()->getPermission('user.conversation.maxParticipants')},
includeUserGroups: {if $__wcf->getSession()->getPermission('user.conversation.canAddGroupParticipants')}true{else}false{/if},
restrictUserGroupIDs: [-1, {implode from=$allowedUserGroupIDs item=allowedUserGroupID}{@$allowedUserGroupID}{/implode}],
restrictUserGroupIDs: [-1, {implode from=$allowedUserGroupIDs item=allowedUserGroupID}{$allowedUserGroupID}{/implode}],
csvPerType: true,
callbackSetupValues: function() {
return [
{implode from=$participantsData item=participant}
{ objectId: {@$participant['objectId']}, value: '{@$participant['value']|encodeJS}', type: '{@$participant['type']}' }
{ objectId: {$participant['objectId']}, value: '{unsafe:$participant['value']|encodeJS}', type: '{unsafe:$participant['type']|encodeJS}' }
{/implode}
];
}
});

{if $__wcf->session->getPermission('user.conversation.canAddInvisibleParticipants')}
UiItemListUser.init('invisibleParticipants', {
maxItems: {@$__wcf->getSession()->getPermission('user.conversation.maxParticipants')},
maxItems: {$__wcf->getSession()->getPermission('user.conversation.maxParticipants')},
includeUserGroups: {if $__wcf->getSession()->getPermission('user.conversation.canAddGroupParticipants')}true{else}false{/if},
restrictUserGroupIDs: [-1, {implode from=$allowedUserGroupIDs item=allowedUserGroupID}{@$allowedUserGroupID}{/implode}],
restrictUserGroupIDs: [-1, {implode from=$allowedUserGroupIDs item=allowedUserGroupID}{$allowedUserGroupID}{/implode}],
csvPerType: true,
callbackSetupValues: function() {
return [
{implode from=$invisibleParticipantsData item=participant}
{ objectId: {@$participant['objectId']}, value: '{@$participant['value']|encodeJS}', type: '{@$participant['type']}' }
{ objectId: {$participant['objectId']}, value: '{unsafe:$participant['value']|encodeJS}', type: '{unsafe:$participant['type']|encodeJS}' }
{/implode}
];
}
Expand Down
62 changes: 36 additions & 26 deletions templates/conversationList.tpl
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
{/capture}

{capture assign='headContent'}
<link rel="alternate" type="application/rss+xml" title="{lang}wcf.global.button.rss{/lang}" href="{link controller='ConversationRssFeed'}at={@$__wcf->getUser()->userID}-{@$__wcf->getUser()->accessToken}{/link}">
<link rel="alternate" type="application/rss+xml" title="{lang}wcf.global.button.rss{/lang}" href="{link controller='ConversationRssFeed'}at={$__wcf->getUser()->userID}-{$__wcf->getUser()->accessToken}{/link}">
{/capture}

{capture assign='sidebarRight'}
Expand Down Expand Up @@ -58,7 +58,7 @@
<h2 class="boxTitle">{lang}wcf.conversation.filter.participants{/lang}</h2>

<div class="boxContent">
<form action="{link controller='ConversationList'}{if $filter}filter={@$filter}&{/if}sortField={$sortField}&sortOrder={$sortOrder}&pageNo={@$pageNo}{/link}" method="post">
<form action="{link controller='ConversationList' sortField=$sortField sortOrder=$sortOrder pageNo=$pageNo}{if $filter}filter={$filter}{/if}{/link}" method="post">
<dl>
<dt></dt>
<dd><label><textarea id="participants" name="participants" class="long">{implode from=$participants item=participant glue=','}{$participant}{/implode}</textarea></label></dd>
Expand Down Expand Up @@ -92,12 +92,12 @@
<div class="dropdownMenu">
<ul class="scrollableDropdownMenu">
{foreach from=$labelList item=label}
<li><a href="{link controller='ConversationList'}{if $filter}filter={@$filter}&{/if}{if !$participants|empty}participants={implode from=$participants item=participant}{$participant|rawurlencode}{/implode}&{/if}sortField={$sortField}&sortOrder={$sortOrder}&pageNo={@$pageNo}&labelID={@$label->labelID}{/link}"><span class="badge label{if $label->cssClassName} {@$label->cssClassName}{/if}" data-css-class-name="{if $label->cssClassName}{@$label->cssClassName}{/if}" data-label-id="{$label->labelID}">{$label->label}</span></a></li>
<li><a href="{link controller='ConversationList' sortField=$sortField sortOrder=$sortOrder pageNo=$pageNo labelID=$label->labelID}{if $filter}filter={$filter}&{/if}{if !$participants|empty}participants={implode from=$participants item=participant}{unsafe:$participant|rawurlencode}{/implode}{/if}{/link}"><span class="badge label{if $label->cssClassName} {$label->cssClassName}{/if}" data-css-class-name="{if $label->cssClassName}{$label->cssClassName}{/if}" data-label-id="{$label->labelID}">{$label->label}</span></a></li>
{/foreach}
</ul>
<ul>
<li class="dropdownDivider"{if !$labelList|count} style="display: none;"{/if}></li>
<li><a href="{link controller='ConversationList'}{if $filter}filter={@$filter}&{/if}{if !$participants|empty}participants={implode from=$participants item=participant}{$participant|rawurlencode}{/implode}&{/if}sortField={$sortField}&sortOrder={$sortOrder}&pageNo={@$pageNo}{/link}"><span class="badge label">{lang}wcf.conversation.label.disableFilter{/lang}</span></a></li>
<li><a href="{link controller='ConversationList' sortField=$sortField sortOrder=$sortOrder pageNo=$pageNo}{if $filter}filter={$filter}&{/if}{if !$participants|empty}participants={implode from=$participants item=participant}{unsafe:$participant|rawurlencode}{/implode}{/if}{/link}"><span class="badge label">{lang}wcf.conversation.label.disableFilter{/lang}</span></a></li>
</ul>
</div>
</div>
Expand Down Expand Up @@ -130,12 +130,18 @@
{event name='boxes'}
{/capture}

{assign var='linkParameters' value=''}
{if $participants}{capture append='linkParameters'}&participants={implode from=$participants item=participant}{unsafe:$participant|rawurlencode}{/implode}{/capture}{/if}
{if $labelID}{capture append='linkParameters'}&labelID={$labelID}{/capture}{/if}

{capture assign='contentInteractionPagination'}
{assign var='participantsParameter' value=''}
{if $participants}{capture assign='participantsParameter'}&participants={implode from=$participants item=participant}{$participant|rawurlencode}{/implode}{/capture}{/if}
{assign var='labelIDParameter' value=''}
{if $labelID}{assign var='labelIDParameter' value="&labelID=$labelID"}{/if}
{pages print=true assign=pagesLinks controller='ConversationList' link="filter=$filter$participantsParameter&pageNo=%d&sortField=$sortField&sortOrder=$sortOrder$labelIDParameter"}
{if $pages > 1}
<woltlab-core-pagination
page="{$pageNo}"
count="{$pages}"
url="{link controller='ConversationList' filter=$filter sortField=$sortField sortOrder=$sortOrder}{unsafe:$linkParameters}{/link}"
></woltlab-core-pagination>
{/if}
{/capture}

{capture assign='contentInteractionButtons'}
Expand All @@ -146,7 +152,7 @@
{/capture}

{capture assign='contentInteractionDropdownItems'}
<li><a rel="alternate" href="{link controller='ConversationRssFeed'}at={@$__wcf->getUser()->userID}-{@$__wcf->getUser()->accessToken}{/link}">{lang}wcf.global.button.rss{/lang}</a></li>
<li><a rel="alternate" href="{link controller='ConversationRssFeed'}at={$__wcf->getUser()->userID}-{$__wcf->getUser()->accessToken}{/link}">{lang}wcf.global.button.rss{/lang}</a></li>
{/capture}

{include file='header'}
Expand All @@ -163,7 +169,7 @@
<li class="columnSort">
<ul class="inlineList">
<li>
<a rel="nofollow" href="{link controller='ConversationList'}{if $filter}filter={@$filter}&{/if}{if !$participants|empty}participants={implode from=$participants item=participant}{$participant|rawurlencode}{/implode}&{/if}pageNo={@$pageNo}&sortField={$sortField}&sortOrder={if $sortOrder == 'ASC'}DESC{else}ASC{/if}{if $labelID}&labelID={@$labelID}{/if}{/link}">
<a rel="nofollow" href="{link controller='ConversationList' pageNo=$pageNo sortField=$sortField}{if $filter}filter={$filter}&{/if}{if !$participants|empty}participants={implode from=$participants item=participant}{unsafe:$participant|rawurlencode}{/implode}&{/if}sortOrder={if $sortOrder == 'ASC'}DESC{else}ASC{/if}{if $labelID}&labelID={$labelID}{/if}{/link}">
{if $sortOrder === 'ASC'}
<span class="jsTooltip" title="{lang}wcf.global.sorting{/lang} ({lang}wcf.global.sortOrder.ascending{/lang})">
{icon name='arrow-down-wide-short'}
Expand All @@ -181,7 +187,7 @@

<ul class="dropdownMenu">
{foreach from=$validSortFields item=_sortField}
<li{if $_sortField === $sortField} class="active"{/if}><a rel="nofollow" href="{link controller='ConversationList'}{if $filter}filter={@$filter}&{/if}{if !$participants|empty}participants={implode from=$participants item=participant}{$participant|rawurlencode}{/implode}&{/if}pageNo={@$pageNo}&sortField={$_sortField}&sortOrder={if $sortField === $_sortField}{if $sortOrder === 'DESC'}ASC{else}DESC{/if}{else}{$sortOrder}{/if}{if $labelID}&labelID={@$labelID}{/if}{/link}">{if $_sortField == 'subject'}{lang}wcf.global.subject{/lang}{else}{lang}wcf.conversation.{$_sortField}{/lang}{/if}</a></li>
<li{if $_sortField === $sortField} class="active"{/if}><a rel="nofollow" href="{link controller='ConversationList' pageNo=$pageNo sortField=$_sortField}{if $filter}filter={$filter}&{/if}{if !$participants|empty}participants={implode from=$participants item=participant}{unsafe:$participant|rawurlencode}{/implode}&{/if}sortOrder={if $sortField === $_sortField}{if $sortOrder === 'DESC'}ASC{else}DESC{/if}{else}{$sortOrder}{/if}{if $labelID}&labelID={$labelID}{/if}{/link}">{if $_sortField == 'subject'}{lang}wcf.global.subject{/lang}{else}{lang}wcf.conversation.{$_sortField}{/lang}{/if}</a></li>
{/foreach}
</ul>
</div>
Expand All @@ -200,11 +206,11 @@
<li class="columnIcon columnAvatar">
{if $conversation->getUserProfile()->getAvatar()}
<div>
<p{if $conversation->isNew()} title="{lang}wcf.conversation.markAsRead.doubleClick{/lang}"{/if}>{@$conversation->getUserProfile()->getAvatar()->getImageTag(48)}</p>
<p{if $conversation->isNew()} title="{lang}wcf.conversation.markAsRead.doubleClick{/lang}"{/if}>{unsafe:$conversation->getUserProfile()->getAvatar()->getImageTag(48)}</p>

{if $conversation->ownPosts && $conversation->userID != $__wcf->user->userID}
{if $__wcf->getUserProfileHandler()->getAvatar()}
<small class="myAvatar jsTooltip" title="{lang}wcf.conversation.ownPosts{/lang}">{@$__wcf->getUserProfileHandler()->getAvatar()->getImageTag(24)}</small>
<small class="myAvatar jsTooltip" title="{lang}wcf.conversation.ownPosts{/lang}">{unsafe:$__wcf->getUserProfileHandler()->getAvatar()->getImageTag(24)}</small>
{/if}
{/if}
</div>
Expand All @@ -215,7 +221,7 @@
<ul class="labelList">
{content}
{foreach from=$conversation->getAssignedLabels() item=label}
<li><a href="{link controller='ConversationList'}{if $filter}filter={@$filter}&{/if}{if !$participants|empty}participants={implode from=$participants item=participant}{$participant|rawurlencode}{/implode}&{/if}sortField={$sortField}&sortOrder={$sortOrder}&pageNo={@$pageNo}&labelID={@$label->labelID}{/link}" class="badge label{if $label->cssClassName} {@$label->cssClassName}{/if}">{$label->label}</a></li>
<li><a href="{link controller='ConversationList' sortField=$sortField sortOrder=$sortOrder pageNo=$pageNo labelID=$label->labelID}{if $filter}filter={$filter}&{/if}{if !$participants|empty}participants={implode from=$participants item=participant}{$participant|rawurlencode}{/implode}{/if}{/link}" class="badge label{if $label->cssClassName} {$label->cssClassName}{/if}">{$label->label}</a></li>
{/foreach}
{/content}
</ul>
Expand All @@ -224,7 +230,7 @@
<h3>
<a href="{if $conversation->isNew()}{link controller='Conversation' object=$conversation}action=firstNew{/link}{else}{$conversation->getLink()}{/if}" class="conversationLink messageGroupLink" data-object-id="{$conversation->conversationID}">{$conversation->subject}</a>
{if $conversation->replies}
<span class="badge messageGroupCounterMobile">{@$conversation->replies|shortUnit}</span>
<span class="badge messageGroupCounterMobile">{$conversation->replies|shortUnit}</span>
{/if}
</h3>

Expand Down Expand Up @@ -272,26 +278,26 @@
<li class="columnStats">
<dl class="plain statsDataList">
<dt>{lang}wcf.conversation.replies{/lang}</dt>
<dd>{@$conversation->replies|shortUnit}</dd>
<dd>{$conversation->replies|shortUnit}</dd>
</dl>
<dl class="plain statsDataList">
<dt>{lang}wcf.conversation.participants{/lang}</dt>
<dd>{@$conversation->participants|shortUnit}</dd>
<dd>{$conversation->participants|shortUnit}</dd>
</dl>

<div class="messageGroupListStatsSimple">
{if $conversation->replies}
<span aria-label="{lang}wcf.conversation.replies{/lang}">
{icon name='comment'}
</span>
{@$conversation->replies|shortUnit}
{$conversation->replies|shortUnit}
{/if}
</div>
</li>
<li class="columnLastPost">
{if $conversation->replies != 0 && $conversation->lastPostTime}
<div class="box32">
<a href="{link controller='Conversation' object=$conversation}action=lastPost{/link}" class="jsTooltip" title="{lang}wcf.conversation.gotoLastPost{/lang}">{@$conversation->getLastPosterProfile()->getAvatar()->getImageTag(32)}</a>
<a href="{link controller='Conversation' object=$conversation action='lastPost'}{/link}" class="jsTooltip" title="{lang}wcf.conversation.gotoLastPost{/lang}">{unsafe:$conversation->getLastPosterProfile()->getAvatar()->getImageTag(32)}</a>

<div>
<p>
Expand All @@ -312,11 +318,15 @@
{/if}

<footer class="contentFooter">
{hascontent}
{if $pages > 1}
<div class="paginationBottom">
{content}{@$pagesLinks}{/content}
<woltlab-core-pagination
page="{$pageNo}"
count="{$pages}"
url="{link controller='ConversationList' filter=$filter sortField=$sortField sortOrder=$sortOrder}{unsafe:$linkParameters}{/link}"
></woltlab-core-pagination>
</div>
{/hascontent}
{/if}

{hascontent}
<nav class="contentFooterNavigation">
Expand All @@ -337,7 +347,7 @@
{/hascontent}
</footer>

<script data-relocate="true" src="{$__wcf->getPath()}js/WCF.Conversation{if !ENABLE_DEBUG_MODE}.min{/if}.js?v={@LAST_UPDATE_TIME}"></script>
<script data-relocate="true" src="{$__wcf->getPath()}js/WCF.Conversation{if !ENABLE_DEBUG_MODE}.min{/if}.js?v={LAST_UPDATE_TIME}"></script>
<script data-relocate="true">
require([
'WoltLabSuite/Core/Language',
Expand Down Expand Up @@ -373,13 +383,13 @@
hasMarkedItems: {if $hasMarkedItems}true{else}false{/if},
});

const availableLabels = [{implode from=$labelList item=label}{ cssClassName: '{if $label->cssClassName}{unsafe:$label->cssClassName|encodeJS}{/if}', labelID: {@$label->labelID}, label: '{$label->label|encodeJS}', url: '{link controller='ConversationList' encode=false}labelID={$label->labelID}{if $filter}&filter={@$filter}&{/if}{if !$participants|empty}participants={implode from=$participants item=participant}{$participant|rawurlencode}{/implode}&{/if}sortField={$sortField}&sortOrder={$sortOrder}&pageNo={@$pageNo}{/link}' }{/implode} ];
const availableLabels = [{implode from=$labelList item=label}{ cssClassName: '{if $label->cssClassName}{unsafe:$label->cssClassName|encodeJS}{/if}', labelID: {$label->labelID}, label: '{$label->label|encodeJS}', url: '{link controller='ConversationList' encode=false sortField=$sortField sortOrder=$sortOrder pageNo=$pageNo}labelID={$label->labelID}{if $filter}&filter={$filter}&{/if}{if !$participants|empty}participants={implode from=$participants item=participant}{unsafe:$participant|rawurlencode}{/implode}{/if}{/link}' }{/implode} ];
var $editorHandler = new WCF.Conversation.EditorHandler(availableLabels);
var $inlineEditor = new WCF.Conversation.InlineEditor('.conversation');
$inlineEditor.setEditorHandler($editorHandler, 'list');

ConversationClipboard.setup($editorHandler);
new LabelManager('{link controller='ConversationLabelForm'}{/link}', '{link controller='ConversationList' encode=false}{if $filter}filter={@$filter}&{/if}{if !$participants|empty}participants={implode from=$participants item=participant}{$participant|rawurlencode}{/implode}&{/if}sortField={$sortField}&sortOrder={$sortOrder}&pageNo={@$pageNo}{/link}');
new LabelManager('{link controller='ConversationLabelForm'}{/link}', '{link controller='ConversationList' encode=false sortField=$sortField sortOrder=$sortOrder pageNo=$pageNo}{if $filter}filter={$filter}&{/if}{if !$participants|empty}participants={implode from=$participants item=participant}{unsafe:$participant|rawurlencode}{/implode}{/if}{/link}');

// mobile safari hover workaround
if ($(window).width() <= 800) {
Expand Down
Loading