1
0
Fork 0
mirror of https://github.com/Oreolek/ifhub.club.git synced 2024-05-19 09:18:18 +03:00

Доработка компонента talk

This commit is contained in:
Denis Shakhov 2015-10-16 22:09:29 +07:00
parent aff748533d
commit 40b9de64c1
11 changed files with 300 additions and 236 deletions

View file

@ -475,26 +475,23 @@ class ActionTalk extends Action
$this->Viewer_Assign('talk', $oTalk);
$this->Viewer_Assign('comments', $aComments);
$this->Viewer_Assign('lastCommentId', $iMaxIdComment);
/**
* Подсчитываем нужно ли отображать комментарии.
* Комментарии не отображаются, если у вестки только один читатель
* и ранее созданных комментариев нет.
* Кол-во активных участников диалога без учета текущего пользователя
*/
if (count($aComments) == 0) {
$iActiveSpeakers = 0;
foreach ((array)$oTalk->getTalkUsers() as $oTalkUser) {
if (($oTalkUser->getUserId() != $this->oUserCurrent->getId())
&& $oTalkUser->getUserActive() == ModuleTalk::TALK_USER_ACTIVE
) {
$iActiveSpeakers++;
break;
}
}
if ($iActiveSpeakers == 0) {
$this->Viewer_Assign('bNoComments', true);
$iActiveSpeakers = 0;
foreach ((array)$oTalk->getTalkUsers() as $oTalkUser) {
if (($oTalkUser->getUserId() != $this->oUserCurrent->getId())
&& $oTalkUser->getUserActive() == ModuleTalk::TALK_USER_ACTIVE
) {
$iActiveSpeakers++;
break;
}
}
$this->Viewer_Assign('activeParticipantsCount', $iActiveSpeakers);
$this->SetTemplateAction('talk');
}

View file

@ -27,10 +27,11 @@
},
"scripts": {
"users": "js/talk-users.js",
"talk": "js/talk.js"
"talk-list": "js/talk-list.js"
},
"styles": {
"talk": "css/talk.css",
"talk-list": "css/talk-list.css",
"message-root": "css/message-root.css"
}
}

View file

@ -0,0 +1,86 @@
/**
* Список личных сообщений
*
* @license GNU General Public License, version 2
* @copyright 2013 OOO "ЛС-СОФТ" {@link http://livestreetcms.com}
* @author Denis Shakhov <denis.shakhov@gmail.com>
*/
/* Экшнбар */
.ls-actionbar.talk-list-actionbar {
margin-bottom: 0;
}
/* Список */
.talk-list.table td {
vertical-align: top;
}
.talk-list.table .cell-checkbox,
.talk-list.table .cell-favourite {
width: 14px;
}
.talk-list.table .cell-info {
width: 150px;
}
/* Сообщение */
.talk-list-item:first-child td {
border-top: 1px solid #f1f1f1;
}
.talk-list-item {
background: #fff;
}
.talk-list-item.talk-unread {
background: #f7f7f7;
}
.talk-list-item.selected {
background: #FFC;
}
/* Информация об отправителе */
.talk-list-item-info {
width: 150px;
position: relative;
padding-left: 75px;
min-height: 64px;
}
.talk-list-item-info-avatar {
position: absolute;
top: 0;
left: 0;
}
.talk-list-item-info-date {
display: block;
font-size: 11px;
color: #aaa;
}
.talk-list-item-extra {
position: relative;
padding-right: 50px;
}
.talk-list-item-title {
font-size: 15px;
margin-bottom: 5px;
}
.talk-list-item-text {
color: #999;
}
.talk-list-item-count {
position: absolute;
top: 0;
right: 0;
background: #f0f0f0;
color: #aaa;
padding: 3px 7px;
border-radius: 3px;
font-size: 11px;
}
.talk-list-item.talk-unread .talk-list-item-count {
background: #2891D3;
color: #ADDBF8;
}
.talk-list-item.talk-unread .talk-list-item-count strong {
color: #fff;
}

View file

@ -1,18 +1,15 @@
/**
* Личные сообщения
*
* @template actions/ActionTalk/message.tpl
* @scripts <frontend>/common/js/talk.js
*
* @license GNU General Public License, version 2
* @copyright 2013 OOO "ЛС-СОФТ" {@link http://livestreetcms.com}
* @author Denis Shakhov <denis.shakhov@gmail.com>
*/
.talk { background: #fafafa; padding: 20px; margin-bottom: 0; }
.ls-actionbar.talk-list-actionbar {
margin-bottom: 0;
.talk {
background: #fafafa;
padding: 20px;
margin-bottom: 0;
}
.ls-talk-participants-details {
@ -20,7 +17,7 @@
}
/**
* Message user list
* Список участников диалога
*/
.message-users .user-list-small-item.inactive {
opacity: .5;
@ -32,38 +29,4 @@
}
.message-users .user-list-small-item.inactive .ls-talk-participants-item-activate {
display: inline-block;
}
/**
* Message list
*/
.table.message-list td { vertical-align: top; }
.table.message-list .cell-checkbox,
.table.message-list .cell-favourite { width: 14px; }
.table.message-list .cell-info { width: 150px; }
.table .message-list-item:first-child td { border-top: 1px solid #f1f1f1; }
.message-list-item { background: #fff; }
.message-list-item.message-unread { background: #f7f7f7; }
.message-list-item.selected { background: #FFC; }
.message-list-info { width: 150px; position: relative; padding-left: 75px; min-height: 64px; }
.message-list-info-avatar { position: absolute; top: 0; left: 0; }
.message-list-info-date { display: block; font-size: 11px; color: #aaa; }
.message-list-item-extra { position: relative; padding-right: 50px; }
.message-list-item-title { font-size: 15px; margin-bottom: 5px; }
.message-list-item-text { color: #999; }
.message-list-item-count {
position: absolute;
top: 0;
right: 0;
background: #f0f0f0;
color: #aaa;
padding: 3px 7px;
border-radius: 3px;
font-size: 11px;
}
.message-list-item.message-unread .message-list-item-count { background: #2891D3; color: #ADDBF8; }
.message-list-item.message-unread .message-list-item-count strong { color: #fff; }
}

View file

@ -0,0 +1,69 @@
/**
* Управление списком личных сообщений
*
* @module ls/talk-list
*
* @license GNU General Public License, version 2
* @copyright 2013 OOO "ЛС-СОФТ" {@link http://livestreetcms.com}
* @author Denis Shakhov <denis.shakhov@gmail.com>
*/
(function($) {
"use strict";
$.widget( "livestreet.lsTalkList", $.livestreet.lsComponent, {
/**
* Дефолтные опции
*/
options: {
// Селекторы
selectors: {
form: '#talk-form',
formAction: '#talk-form-action',
button: '.js-talk-form-button',
buttonMarkAsRead: '.js-talk-form-button[data-action=mark_as_read]',
buttonRemove: '.js-talk-form-button[data-action=remove]'
}
},
/**
* Конструктор
*
* @constructor
* @private
*/
_create: function () {
this._super();
// Экшнбар
$('.js-talk-actionbar-select').lsActionbarItemSelect({
selectors: {
target_item: '.js-talk-list-item'
}
});
this.elements.buttonMarkAsRead.on('click', function (e) {
this.setAction( $(this).data('action') );
}.bind(this));
this.elements.buttonRemove.lsConfirm({
message: ls.lang.get('common.remove_confirm'),
onconfirm: function () {
this.setAction( 'remove' );
}.bind(this)
})
},
/**
* Устанавливает текущее действие
*
* @param {String} action Действие
*/
setAction: function( action ) {
if ( ! this.elements.form.find('input[type=checkbox]:checked').length ) return;
this.elements.formAction.val( action );
this.elements.form.submit();
}
});
})(jQuery);

View file

@ -1,59 +0,0 @@
/**
* Личные сообщения
*
* @module ls/talk
*
* @license GNU General Public License, version 2
* @copyright 2013 OOO "ЛС-СОФТ" {@link http://livestreetcms.com}
* @author Denis Shakhov <denis.shakhov@gmail.com>
*/
var ls = ls || {};
ls.talk = (function ($) {
"use strict";
/**
* Инициализация
*
* @param {Object} options Опции
*/
this.init = function(options) {
var _this = this;
this.elements = {
form: $('#talk-form'),
form_action: $('#talk-form-action')
}
$('.js-talk-form-action:not([data-action=remove])').on('click', function (e) {
_this.formAction( $(this).data('action') );
});
$('.js-talk-form-action[data-action=remove]').lsConfirm({
message: ls.lang.get('common.remove_confirm'),
onconfirm: function () {
_this.formAction( 'remove' );
}
})
// Выбор получателей в форме добавления
$('.js-talk-add-user-choose').lsUserFieldChoose({
urls: {
modal: aRouter.ajax + 'modal-friend-list'
}
});
};
/**
* Установка экшена формы
*/
this.formSetAction = function(action) {
if ( ! this.elements.form.find('input[type=checkbox]:checked').length ) return;
this.elements.form_action.val(action);
this.elements.form.submit();
};
return this;
}).call(ls.talk || {},jQuery);

View file

@ -6,128 +6,130 @@
* @param boolean $paging
*}
{if $smarty.local.talks}
<form action="{router page='talk'}" method="post" id="talk-form">
{* Скрытые поля *}
{component 'field' template='hidden.security-key'}
{component 'field' template='hidden' name='form_action' id='talk-form-action'}
<div class="js-talk-list">
{if $smarty.local.talks}
<form action="{router page='talk'}" method="post" id="talk-form">
{* Скрытые поля *}
{component 'field' template='hidden.security-key'}
{component 'field' template='hidden' name='form_action' id='talk-form-action'}
{* Экшнбар *}
{if $smarty.local.selectable}
{component 'actionbar' template='item.select'
classes = 'js-talk-actionbar-select'
target = '.js-message-list-item'
assign = select
items = [
[ 'text' => $aLang.talk.actionbar.read, 'filter' => ":not('.message-unread')" ],
[ 'text' => $aLang.talk.actionbar.unread, 'filter' => ".message-unread" ]
]}
{* Экшнбар *}
{if $smarty.local.selectable}
{component 'actionbar' template='item.select'
classes = 'js-talk-actionbar-select'
target = '.js-talk-list-item'
assign = select
items = [
[ 'text' => $aLang.talk.actionbar.read, 'filter' => ":not('.talk-unread')" ],
[ 'text' => $aLang.talk.actionbar.unread, 'filter' => ".talk-unread" ]
]}
{component 'actionbar'
classes='talk-list-actionbar'
items=[
[ 'buttons' => [ 'html' => $select ] ],
[
'buttons' => [
[ 'icon' => 'check', 'classes' => 'js-talk-form-action', 'attributes' => [ 'data-action' => 'mark_as_read', 'title' => $aLang.talk.actionbar.mark_as_read ], 'mods' => 'icon' ],
[ 'icon' => 'trash', 'classes' => 'js-talk-form-action', 'attributes' => [ 'data-action' => 'remove' , 'title' => $aLang.common.remove ], 'mods' => 'icon' ]
{component 'actionbar'
classes='talk-list-actionbar'
items=[
[ 'buttons' => [ 'html' => $select ] ],
[
'buttons' => [
[ 'icon' => 'check', 'classes' => 'js-talk-form-button', 'attributes' => [ 'data-action' => 'mark_as_read', 'title' => $aLang.talk.actionbar.mark_as_read ], 'mods' => 'icon' ],
[ 'icon' => 'trash', 'classes' => 'js-talk-form-button', 'attributes' => [ 'data-action' => 'remove' , 'title' => $aLang.common.remove ], 'mods' => 'icon' ]
]
]
]
]}
{/if}
]}
{/if}
{* Список сообщений *}
<table class="ls-table table-talk message-list">
<tbody>
{foreach $smarty.local.talks as $talk}
{* Создатель диалога *}
{$author = $talk->getTalkUser()}
{* Список сообщений *}
<table class="ls-table talk-list">
<tbody>
{foreach $smarty.local.talks as $talk}
{* Создатель диалога *}
{$author = $talk->getTalkUser()}
{* Все участники диалога *}
{$users = $talk->getTalkUsers()}
{* Все участники диалога *}
{$users = $talk->getTalkUsers()}
{* Кол-во участников диалога *}
{$usersCount = count($users)}
{* Кол-во участников диалога *}
{$usersCount = count($users)}
<tr class="message-list-item {if $author->getCommentCountNew() or ! $author->getDateLast()}message-unread{/if} js-message-list-item" data-id="{$talk->getId()}">
{* Выделение *}
{if $smarty.local.selectable}
<td class="cell-checkbox">
<input type="checkbox" name="talk_select[{$talk->getId()}]" data-id="{$talk->getId()}" />
</td>
{/if}
<tr class="talk-list-item {if $author->getCommentCountNew() or ! $author->getDateLast()}talk-unread{/if} js-talk-list-item" data-id="{$talk->getId()}">
{* Выделение *}
{if $smarty.local.selectable}
<td class="cell-checkbox">
<input type="checkbox" name="talk_select[{$talk->getId()}]" data-id="{$talk->getId()}" />
</td>
{/if}
{* Избранное *}
<td class="cell-favourite">
{component 'favourite' classes='js-favourite-talk' target=$talk}
</td>
{* Избранное *}
<td class="cell-favourite">
{component 'favourite' classes='js-favourite-talk' target=$talk}
</td>
{* Основная информация о диалоге *}
<td class="cell-info">
<div class="message-list-info">
{* Участники диалога *}
{if $usersCount > 2}
<a href="{router page='talk'}read/{$talk->getId()}/" class="message-list-info-avatar">
<img src="{Config::Get('path.skin.web')}/assets/images/avatars/avatar_male_64x64crop.png" />
</a>
{* Основная информация о диалоге *}
<td class="cell-info">
<div class="talk-list-item-info">
{* Участники диалога *}
{if $usersCount > 2}
<a href="{router page='talk'}read/{$talk->getId()}/" class="talk-list-item-info-avatar">
<img src="{Config::Get('path.skin.web')}/assets/images/avatars/avatar_male_64x64crop.png" />
</a>
{lang name='talk.participants' count=$usersCount plural=true}
{else}
{* Если участников двое, то отображаем только собеседника *}
{foreach $users as $user}
{$user = $user->getUser()}
{lang name='talk.participants' count=$usersCount plural=true}
{else}
{* Если участников двое, то отображаем только собеседника *}
{foreach $users as $user}
{$user = $user->getUser()}
{if $user->getUserId() != $oUserCurrent->getId()}
<a href="{$user->getUserWebPath()}" class="message-list-info-avatar">
<img src="{$user->getProfileAvatarPath(64)}" alt="{$user->getLogin()}" />
</a>
{if $user->getUserId() != $oUserCurrent->getId()}
<a href="{$user->getUserWebPath()}" class="talk-list-item-info-avatar">
<img src="{$user->getProfileAvatarPath(64)}" alt="{$user->getLogin()}" />
</a>
<a href="{$user->getUserWebPath()}" class="word-wrap">{$user->getDisplayName()}</a>
{/if}
{/foreach}
{/if}
<a href="{$user->getUserWebPath()}" class="word-wrap">{$user->getDisplayName()}</a>
{/if}
{/foreach}
{/if}
{* Дата *}
<time class="message-list-info-date" datetime="{date_format date=$talk->getDate() format='c'}" title="{date_format date=$talk->getDate() format='j F Y, H:i'}">
{date_format date=$talk->getDate() hours_back="12" minutes_back="60" now="60" day="day H:i" format="j F Y, H:i"}
</time>
</div>
</td>
{* Заголовок и текст последнего сообщения *}
<td>
<div class="message-list-item-extra">
{* Заголовок *}
<h2 class="message-list-item-title">
<a href="{router page='talk'}read/{$talk->getId()}/">
{$talk->getTitle()|escape}
</a>
</h2>
{* Текст последнего сообщения *}
<div class="message-list-item-text">
{(($talk->getCommentLast()) ? $talk->getCommentLast()->getText() : $talk->getText())|strip_tags|truncate:120:"..."|escape}
{* Дата *}
<time class="talk-list-item-info-date" datetime="{date_format date=$talk->getDate() format='c'}" title="{date_format date=$talk->getDate() format='j F Y, H:i'}">
{date_format date=$talk->getDate() hours_back="12" minutes_back="60" now="60" day="day H:i" format="j F Y, H:i"}
</time>
</div>
</td>
{* Кол-во сообщений *}
{if $talk->getCountComment()}
<div class="message-list-item-count">
{$talk->getCountComment()}
{* Заголовок и текст последнего сообщения *}
<td>
<div class="talk-list-item-extra">
{* Заголовок *}
<h2 class="talk-list-item-title">
<a href="{router page='talk'}read/{$talk->getId()}/">
{$talk->getTitle()|escape}
</a>
</h2>
{if $author->getCommentCountNew()}
<strong>+{$author->getCommentCountNew()}</strong>
{/if}
{* Текст последнего сообщения *}
<div class="talk-list-item-text">
{(($talk->getCommentLast()) ? $talk->getCommentLast()->getText() : $talk->getText())|strip_tags|truncate:120:"..."|escape}
</div>
{/if}
</div>
</td>
</tr>
{/foreach}
</tbody>
</table>
</form>
{else}
{component 'blankslate' text=$aLang.talk.notices.empty}
{/if}
{component 'pagination' total=+$paging.iCountPage current=+$paging.iCurrentPage url="{$paging.sBaseUrl}/page__page__/{$paging.sGetParams}"}
{* Кол-во сообщений *}
{if $talk->getCountComment()}
<div class="talk-list-item-count">
{$talk->getCountComment()}
{if $author->getCommentCountNew()}
<strong>+{$author->getCommentCountNew()}</strong>
{/if}
</div>
{/if}
</div>
</td>
</tr>
{/foreach}
</tbody>
</table>
</form>
{else}
{component 'blankslate' text=$aLang.talk.notices.empty}
{/if}
{component 'pagination' total=+$paging.iCountPage current=+$paging.iCurrentPage url="{$paging.sBaseUrl}/page__page__/{$paging.sGetParams}"}
</div>

View file

@ -11,7 +11,7 @@
{* Первое сообщение *}
{component 'talk' template='message-root' talk=$talk}
{if ! $bNoComments}
{if $activeParticipantsCount && $comments}
{* Участники личного сообщения *}
{capture 'talk_message_root_participants'}
{component 'talk' template='participants'

View file

@ -82,7 +82,7 @@
var currentUsers = this.elements.users.val();
$.each(users, function (index, user) {
if ($.inArray(user.id, currentUsers) != -1) return;
if ($.inArray(user.id + "", currentUsers) !== -1) return;
$('<option />')
.attr('value', user.id)

View file

@ -9,5 +9,9 @@
{extends 'layouts/layout.user.messages.tpl'}
{block 'layout_content'}
{component 'talk' talk=$talk comments=$comments lastCommentId=$lastCommentId}
{component 'talk'
talk = $talk
comments = $comments
lastCommentId = $lastCommentId
activeParticipantsCount = $activeParticipantsCount}
{/block}

View file

@ -369,7 +369,15 @@ jQuery(document).ready(function($){
/**
* Talk
*/
ls.talk.init();
$('.js-talk-list').lsTalkList();
// Выбор получателей в форме добавления
$('.js-talk-add-user-choose').lsUserFieldChoose({
urls: {
modal: aRouter.ajax + 'modal-friend-list'
}
});
// Форма поиска
$('.js-talk-search-form').lsDetails();
@ -389,13 +397,6 @@ jQuery(document).ready(function($){
}
});
// Экшнбар
$('.js-talk-actionbar-select').lsActionbarItemSelect({
selectors: {
target_item: '.js-message-list-item'
}
});
// Управление участниками личного сообщения
$('.js-message-users').lsTalkUsers();