Enable new RSS feed dialog
[GitHub/WoltLab/com.woltlab.wcf.conversation.git] / templates / conversationList.tpl
CommitLineData
cd6fe228 1{capture assign='pageTitle'}{if $filter}{lang}wcf.conversation.folder.{$filter}{/lang}{else}{$__wcf->getActivePage()->getTitle()}{/if}{if $pageNo > 1} - {lang}wcf.page.pageNo{/lang}{/if}{/capture}
9544b6b4 2
583b412e
MW
3{capture assign='contentHeader'}
4 <header class="contentHeader">
5 <div class="contentHeaderTitle">
cd6fe228 6 <h1 class="contentTitle">{if $filter}{lang}wcf.conversation.folder.{$filter}{/lang}{else}{$__wcf->getActivePage()->getTitle()}{/if}</h1>
583b412e
MW
7 </div>
8
0d511ff2
AE
9 {hascontent}
10 <nav class="contentHeaderNavigation">
11 <ul>
12 {content}
13 {if $__wcf->session->getPermission('user.conversation.canStartConversation')}<li><a href="{link controller='ConversationAdd'}{/link}" title="{lang}wcf.conversation.add{/lang}" class="button"><span class="icon icon16 fa-plus"></span> <span>{lang}wcf.conversation.button.add{/lang}</span></a></li>{/if}
14 {event name='contentHeaderNavigation'}
15 {/content}
16 </ul>
17 </nav>
18 {/hascontent}
583b412e
MW
19 </header>
20{/capture}
9544b6b4 21
583b412e 22{capture assign='headContent'}
685e9e7e 23 <link rel="alternate" type="application/rss+xml" title="{lang}wcf.global.button.rss{/lang}" href="{link controller='ConversationFeed'}at={@$__wcf->getUser()->userID}-{@$__wcf->getUser()->accessToken}{/link}">
583b412e 24{/capture}
9544b6b4 25
fd8ee5b1 26{capture assign='sidebarRight'}
7cd36813
MW
27 <section class="box">
28 <h2 class="boxTitle">{lang}wcf.conversation.folders{/lang}</h2>
331b1cdf 29
7cd36813
MW
30 <div class="boxContent">
31 <nav>
7961609e
MW
32 <ol class="boxMenu">
33 <li{if $filter == ''} class="active"{/if}>
34 <a class="boxMenuLink" href="{link controller='ConversationList'}{/link}"><span class="boxMenuLinkTitle">{lang}wcf.conversation.conversations{/lang}</span>{if $conversationCount} <span class="badge">{#$conversationCount}</span>{/if}</a>
7961609e
MW
35 </li>
36 <li{if $filter == 'draft'} class="active"{/if}>
37 <a class="boxMenuLink" href="{link controller='ConversationList'}filter=draft{/link}"><span class="boxMenuLinkTitle">{lang}wcf.conversation.folder.draft{/lang}</span>{if $draftCount} <span class="badge">{#$draftCount}</span>{/if}</a>
38 </li>
39 <li{if $filter == 'outbox'} class="active"{/if}>
40 <a class="boxMenuLink" href="{link controller='ConversationList'}filter=outbox{/link}"><span class="boxMenuLinkTitle">{lang}wcf.conversation.folder.outbox{/lang}</span>{if $outboxCount} <span class="badge">{#$outboxCount}</span>{/if}</a>
41 </li>
42 <li{if $filter == 'hidden'} class="active"{/if}>
43 <a class="boxMenuLink" href="{link controller='ConversationList'}filter=hidden{/link}"><span class="boxMenuLinkTitle">{lang}wcf.conversation.folder.hidden{/lang}</span>{if $hiddenCount} <span class="badge">{#$hiddenCount}</span>{/if}</a>
44 </li>
45 </ol>
7cd36813
MW
46 </nav>
47 </div>
48 </section>
3d6dd2ed
MS
49
50 <section class="box">
51 <h2 class="boxTitle">{lang}wcf.conversation.filter.participants{/lang}</h2>
52
53 <div class="boxContent">
54 <form action="{link controller='ConversationList'}{if $filter}filter={@$filter}&{/if}sortField={$sortField}&sortOrder={$sortOrder}&pageNo={@$pageNo}{/link}" method="post">
55 <dl>
56 <dt></dt>
57 <dd><label><textarea id="participants" name="participants" class="long">{implode from=$participants item=participant glue=','}{$participant}{/implode}</textarea></label></dd>
58 </dl>
59
60 <div class="formSubmit">
0b498318 61 <input type="submit" value="{lang}wcf.global.button.submit{/lang}" accesskey="s">
aa94c120 62 {csrfToken}
3d6dd2ed
MS
63 </div>
64 </form>
65 </div>
66 </section>
67
583b412e 68 <section class="box jsOnly">
7cd36813 69 <h2 class="boxTitle">{lang}wcf.conversation.label{/lang}</h2>
331b1cdf 70
7cd36813
MW
71 <div class="boxContent">
72 <div id="conversationLabelFilter" class="dropdown">
73 <div class="dropdownToggle" data-toggle="conversationLabelFilter">
74 {if $labelID}
75 {foreach from=$labelList item=label}
76 {if $label->labelID == $labelID}
77 <span class="badge label{if $label->cssClassName} {@$label->cssClassName}{/if}">{$label->label}</span>
78 {/if}
79 {/foreach}
80 {else}
81 <span class="badge">{lang}wcf.conversation.label.filter{/lang}</span>
82 {/if}
83 </div>
84
85 <div class="dropdownMenu">
86 <ul class="scrollableDropdownMenu">
87 {foreach from=$labelList item=label}
3d6dd2ed 88 <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>
7cd36813
MW
89 {/foreach}
90 </ul>
91 <ul>
92 <li class="dropdownDivider"{if !$labelList|count} style="display: none;"{/if}></li>
3d6dd2ed 93 <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>
7cd36813
MW
94 </ul>
95 </div>
331b1cdf 96 </div>
331b1cdf 97 </div>
7961609e
MW
98
99 <div class="boxContent">
100 <button id="manageLabel">{lang}wcf.conversation.label.management{/lang}</button>
494ac5c2 101 </div>
7cd36813 102 </section>
331b1cdf 103
22f0bc73 104 {event name='beforeQuotaBox'}
3a49e3c9 105
7cd36813
MW
106 <section class="box conversationQuota">
107 <h2 class="boxTitle">{lang}wcf.conversation.quota{/lang}</h2>
331b1cdf 108
7cd36813 109 <div class="boxContent">
331b1cdf
MW
110 {assign var='conversationCount' value=$__wcf->getConversationHandler()->getConversationCount()}
111 {assign var='maxConversationCount' value=$__wcf->session->getPermission('user.conversation.maxConversations')}
c96fc841 112 <p class="conversationUsageBar{if $conversationCount/$maxConversationCount >= 1.0} red{elseif $conversationCount/$maxConversationCount > 0.9} yellow{/if}">
9b8f4622
MW
113 <span style="width: {if $conversationCount/$maxConversationCount < 1.0}{@$conversationCount/$maxConversationCount*100|round:0}{else}100{/if}%">{#$conversationCount/$maxConversationCount*100}%</span>
114 </p>
115 <p><small>{lang}wcf.conversation.quota.description{/lang}</small></p>
331b1cdf 116 </div>
7cd36813 117 </section>
c18fa102
MW
118
119 {event name='boxes'}
9544b6b4
MW
120{/capture}
121
d7649d82 122{capture assign='headerNavigation'}
da70c685 123 <li><a rel="alternate" href="{link controller='ConversationFeed'}at={@$__wcf->getUser()->userID}-{@$__wcf->getUser()->accessToken}{/link}" title="{lang}wcf.global.button.rss{/lang}" class="rssFeed jsTooltip"><span class="icon icon16 fa-rss"></span> <span class="invisible">{lang}wcf.global.button.rss{/lang}</span></a></li>
7cd36813 124 <li class="jsOnly"><a href="#" title="{lang}wcf.conversation.markAllAsRead{/lang}" class="markAllAsReadButton jsTooltip"><span class="icon icon16 fa-check"></span> <span class="invisible">{lang}wcf.conversation.markAllAsRead{/lang}</span></a></li>
d7649d82
AE
125{/capture}
126
7cd36813 127{include file='header'}
9544b6b4 128
583b412e
MW
129{hascontent}
130 <div class="paginationTop">
131 {content}
132 {assign var='participantsParameter' value=''}
133 {if $participants}{capture assign='participantsParameter'}&participants={implode from=$participants item=participant}{$participant|rawurlencode}{/implode}{/capture}{/if}
134 {assign var='labelIDParameter' value=''}
135 {if $labelID}{assign var='labelIDParameter' value="&labelID=$labelID"}{/if}
136 {pages print=true assign=pagesLinks controller='ConversationList' link="filter=$filter$participantsParameter&pageNo=%d&sortField=$sortField&sortOrder=$sortOrder$labelIDParameter"}
137 {/content}
138 </div>
139{/hascontent}
9544b6b4
MW
140
141{if !$items}
4315dc4a 142 <p class="info" role="status">{lang}wcf.conversation.noConversations{/lang}</p>
9544b6b4 143{else}
7cd36813 144 <div class="section tabularBox messageGroupList conversationList jsClipboardContainer" data-type="com.woltlab.wcf.conversation.conversation">
ba4a0151
MW
145 <ol class="tabularList">
146 <li class="tabularListRow tabularListRowHead">
147 <ol class="tabularListColumns">
0b498318 148 <li class="columnMark jsOnly"><label><input type="checkbox" class="jsClipboardMarkAll"></label></li>
c18fa102 149
37f3e150
MW
150 <li class="columnSort">
151 <ul class="inlineList">
152 <li>
153 <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}">
154 <span class="icon icon16 fa-sort-amount-{$sortOrder|strtolower} jsTooltip" title="{lang}wcf.global.sorting{/lang} ({lang}wcf.global.sortOrder.{if $sortOrder === 'ASC'}ascending{else}descending{/if}{/lang})"></span>
155 </a>
156 </li>
157 <li>
158 <div class="dropdown">
159 <span class="dropdownToggle">{if $sortField == 'subject'}{lang}wcf.global.subject{/lang}{else}{lang}wcf.conversation.{$sortField}{/lang}{/if}</span>
160
161 <ul class="dropdownMenu">
162 {foreach from=$validSortFields item=_sortField}
163 <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>
164 {/foreach}
165 </ul>
166 </div>
167 </li>
168 </ul>
169 </li>
ba4a0151
MW
170 </ol>
171 </li>
9544b6b4 172
ba4a0151
MW
173 {foreach from=$objects item=conversation}
174 <li class="tabularListRow">
7dd74a57 175 <ol class="tabularListColumns messageGroup conversation jsClipboardObject{if $conversation->isNew()} new{/if}" data-conversation-id="{@$conversation->conversationID}" data-label-ids="[ {implode from=$conversation->getAssignedLabels() item=label}{@$label->labelID}{/implode} ]" data-is-closed="{@$conversation->isClosed}" data-can-close-conversation="{if $conversation->userID == $__wcf->getUser()->userID}1{else}0{/if}" data-can-add-participants="{if $conversation->canAddParticipants()}1{else}0{/if}">
ba4a0151 176 <li class="columnMark jsOnly">
0b498318 177 <label><input type="checkbox" class="jsClipboardItem" data-object-id="{@$conversation->conversationID}"></label>
ba4a0151
MW
178 </li>
179 <li class="columnIcon columnAvatar">
9544b6b4
MW
180 {if $conversation->getUserProfile()->getAvatar()}
181 <div>
7cd36813 182 <p{if $conversation->isNew()} title="{lang}wcf.conversation.markAsRead.doubleClick{/lang}"{/if}>{@$conversation->getUserProfile()->getAvatar()->getImageTag(48)}</p>
9544b6b4
MW
183
184 {if $conversation->ownPosts && $conversation->userID != $__wcf->user->userID}
185 {if $__wcf->getUserProfileHandler()->getAvatar()}
cf1062c1 186 <small class="myAvatar jsTooltip" title="{lang}wcf.conversation.ownPosts{/lang}">{@$__wcf->getUserProfileHandler()->getAvatar()->getImageTag(24)}</small>
9544b6b4
MW
187 {/if}
188 {/if}
189 </div>
190 {/if}
ba4a0151
MW
191 </li>
192 <li class="columnSubject">
9cd031f5
MW
193 {hascontent}
194 <ul class="labelList">
195 {content}
196 {foreach from=$conversation->getAssignedLabels() item=label}
3d6dd2ed 197 <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>
9cd031f5
MW
198 {/foreach}
199 {/content}
200 </ul>
201 {/hascontent}
9544b6b4 202
f54c0746 203 <h3>
ce8c322f 204 <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>
7dd74a57
MW
205 {if $conversation->replies}
206 <span class="badge messageGroupCounterMobile">{@$conversation->replies|shortUnit}</span>
207 {/if}
f54c0746 208 </h3>
9544b6b4 209
8d6015ca 210 <aside class="statusDisplay" role="presentation">
9544b6b4 211 <ul class="statusIcons">
7cd36813
MW
212 {if $conversation->isClosed}<li><span class="icon icon16 fa-lock jsIconLock jsTooltip" title="{lang}wcf.global.state.closed{/lang}"></span></li>{/if}
213 {if $conversation->attachments}<li><span class="icon icon16 fa-paperclip jsIconAttachment jsTooltip" title="{lang}wcf.conversation.attachments{/lang}"></span></li>{/if}
9544b6b4
MW
214 </ul>
215 </aside>
216
71c837ea 217 <ul class="inlineList dotSeparated small messageGroupInfo">
eb66e389 218 <li class="messageGroupAuthor">{user object=$conversation->getUserProfile()}</li>
6c5730e5 219 <li class="messageGroupTime">{@$conversation->time|time}</li>
e01fb03d 220 <li class="messageGroupEditLink jsOnly"><a href="#" class="jsConversationInlineEditor">{lang}wcf.global.button.edit{/lang}</a></li>
6c5730e5
MW
221 {event name='messageGroupInfo'}
222 </ul>
9544b6b4 223
7dd74a57
MW
224 <ul class="messageGroupInfoMobile">
225 <li class="messageGroupAuthorMobile">{$conversation->username}</li>
226 <li class="messageGroupLastPostTimeMobile">{@$conversation->lastPostTime|time}</li>
227 </ul>
228
f34884b9 229 {if $conversation->getParticipantSummary()|count}
d89a6adf 230 <small class="conversationParticipantSummary">
6a3c256b 231 {assign var='participantSummaryCount' value=$conversation->getParticipantSummary()|count}
02dcae10 232 {lang}wcf.conversation.participants{/lang}: {implode from=$conversation->getParticipantSummary() item=participant}<a href="{$participant->getLink()}" class="userLink{if $participant->hideConversation == 2} conversationLeft{/if}" data-object-id="{@$participant->userID}">{$participant->username}</a>{/implode}
7acdb950 233 {if $participantSummaryCount < $conversation->participants}{lang}wcf.conversation.participants.other{/lang}{/if}
f34884b9
MW
234 </small>
235 {/if}
c18fa102
MW
236
237 {event name='conversationData'}
ba4a0151
MW
238 </li>
239 <li class="columnStats">
240 <dl class="plain statsDataList">
241 <dt>{lang}wcf.conversation.replies{/lang}</dt>
242 <dd>{@$conversation->replies|shortUnit}</dd>
243 </dl>
244 <dl class="plain statsDataList">
245 <dt>{lang}wcf.conversation.participants{/lang}</dt>
246 <dd>{@$conversation->participants|shortUnit}</dd>
247 </dl>
248
48ea79ab 249 <div class="messageGroupListStatsSimple">{if $conversation->replies}<span class="icon icon16 fa-comment-o" aria-label="{lang}wcf.conversation.replies{/lang}"></span> {@$conversation->replies|shortUnit}{/if}</div>
ba4a0151
MW
250 </li>
251 <li class="columnLastPost">
f7ac06dc 252 {if $conversation->replies != 0 && $conversation->lastPostTime}
ba4a0151 253 <div class="box32">
7cd36813 254 <a href="{link controller='Conversation' object=$conversation}action=lastPost{/link}" class="jsTooltip" title="{lang}wcf.conversation.gotoLastPost{/lang}">{@$conversation->getLastPosterProfile()->getAvatar()->getImageTag(32)}</a>
9544b6b4 255
f54c0746
MW
256 <div>
257 <p>
eb66e389 258 {user object=$conversation->getLastPosterProfile()}
f54c0746
MW
259 </p>
260 <small>{@$conversation->lastPostTime|time}</small>
261 </div>
9544b6b4
MW
262 </div>
263 {/if}
ba4a0151 264 </li>
c18fa102
MW
265
266 {event name='columns'}
ba4a0151 267 </ol>
494ac5c2 268 </li>
ba4a0151
MW
269 {/foreach}
270 </ol>
9544b6b4
MW
271 </div>
272{/if}
273
583b412e
MW
274<footer class="contentFooter">
275 {hascontent}
276 <div class="paginationBottom">
277 {content}{@$pagesLinks}{/content}
278 </div>
279 {/hascontent}
9544b6b4 280
0d511ff2
AE
281 {hascontent}
282 <nav class="contentFooterNavigation">
283 <ul>
284 {content}
285 {if $__wcf->session->getPermission('user.conversation.canStartConversation')}<li><a href="{link controller='ConversationAdd'}{/link}" title="{lang}wcf.conversation.add{/lang}" class="button"><span class="icon icon16 fa-plus"></span> <span>{lang}wcf.conversation.button.add{/lang}</span></a></li>{/if}
286 {event name='contentFooterNavigation'}
287 {/content}
288 </ul>
289 </nav>
290 {/hascontent}
583b412e 291</footer>
9544b6b4 292
583b412e
MW
293<script data-relocate="true" src="{@$__wcf->getPath()}js/WCF.Conversation{if !ENABLE_DEBUG_MODE}.min{/if}.js?v={@LAST_UPDATE_TIME}"></script>
294<script data-relocate="true">
ce8c322f 295 require(['Language', 'WoltLabSuite/Core/Controller/Popover', 'WoltLabSuite/Core/Ui/ItemList/User'], function(Language, ControllerPopover, UiItemListUser) {
583b412e 296 Language.addObject({
9361d1b8
MW
297 'wcf.conversation.edit.addParticipants': '{jslang}wcf.conversation.edit.addParticipants{/jslang}',
298 'wcf.conversation.edit.assignLabel': '{jslang}wcf.conversation.edit.assignLabel{/jslang}',
299 'wcf.conversation.edit.close': '{jslang}wcf.conversation.edit.close{/jslang}',
300 'wcf.conversation.edit.leave': '{jslang}wcf.conversation.edit.leave{/jslang}',
301 'wcf.conversation.edit.open': '{jslang}wcf.conversation.edit.open{/jslang}',
302 'wcf.conversation.edit.subject': '{jslang}wcf.conversation.edit.subject{/jslang}',
303 'wcf.conversation.label.management': '{jslang}wcf.conversation.label.management{/jslang}',
304 'wcf.conversation.label.management.addLabel.success': '{jslang}wcf.conversation.label.management.addLabel.success{/jslang}',
305 'wcf.conversation.label.management.deleteLabel.confirmMessage': '{jslang}wcf.conversation.label.management.deleteLabel.confirmMessage{/jslang}',
306 'wcf.conversation.label.management.editLabel': '{jslang}wcf.conversation.label.management.editLabel{/jslang}',
307 'wcf.conversation.label.placeholder': '{jslang}wcf.conversation.label.placeholder{/jslang}',
308 'wcf.conversation.leave.title': '{jslang}wcf.conversation.leave.title{/jslang}',
309 'wcf.global.state.closed': '{jslang}wcf.global.state.closed{/jslang}',
310 'wcf.global.subject': '{jslang}wcf.global.subject{/jslang}',
311 'wcf.conversation.label.assignLabels': '{jslang}wcf.conversation.label.assignLabels{/jslang}'
583b412e
MW
312 });
313
314 WCF.Clipboard.init('wcf\\page\\ConversationListPage', {@$hasMarkedItems}, { });
315
316 var $editorHandler = new WCF.Conversation.EditorHandler();
317 var $inlineEditor = new WCF.Conversation.InlineEditor('.conversation');
318 $inlineEditor.setEditorHandler($editorHandler, 'list');
319
320 new WCF.Conversation.Clipboard($editorHandler);
321 new WCF.Conversation.Label.Manager('{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}');
583b412e
MW
322 new WCF.Conversation.MarkAsRead();
323 new WCF.Conversation.MarkAllAsRead();
324
325 // mobile safari hover workaround
326 if ($(window).width() <= 800) {
327 $('.sidebar').addClass('mobileSidebar').hover(function() { });
328 }
329
330 UiItemListUser.init('participants', {
4d951026
AE
331 excludedSearchValues: ['{$__wcf->user->username|encodeJS}'],
332 maxItems: 20
583b412e 333 });
ce8c322f
MS
334
335 ControllerPopover.init({
336 className: 'conversationLink',
337 dboAction: 'wcf\\data\\conversation\\ConversationAction',
338 identifier: 'com.woltlab.wcf.conversation'
339 });
583b412e
MW
340 });
341</script>
9544b6b4 342
583b412e 343{include file='footer'}