v1.18.x
Axel 10 years ago
commit fc0871a79d

@ -2,7 +2,7 @@
"name": "nodebb",
"license": "GPL-3.0",
"description": "NodeBB Forum",
"version": "0.7.2-dev",
"version": "0.7.3-dev",
"homepage": "http://www.nodebb.org",
"repository": {
"type": "git",
@ -49,8 +49,8 @@
"nodebb-plugin-spam-be-gone": "^0.4.0",
"nodebb-rewards-essentials": "^0.0.1",
"nodebb-theme-lavender": "^1.0.48",
"nodebb-theme-persona": "^1.0.16",
"nodebb-theme-vanilla": "^2.0.14",
"nodebb-theme-persona": "^1.0.24",
"nodebb-theme-vanilla": "^2.0.19",
"nodebb-widget-essentials": "^1.0.2",
"npm": "^2.1.4",
"passport": "^0.2.1",

@ -38,6 +38,7 @@
"details.private_help": "في حالة تفعيل الخيار، الانضمام إلى المجموعة يستلزم قبول مالكها",
"details.hidden": "مخفي",
"details.hidden_help": "في حالة تفعيل الخيار، لن تظهر المجموعة للعموم والإنضمام إليها سيتلزم دعوة يدوية.",
"details.delete_group": "Delete Group",
"event.updated": "تم تحديث بيانات المجموعة",
"event.deleted": "تم حذف المجموعة %1",
"membership.accept-invitation": "Accept Invitation",

@ -38,11 +38,12 @@
"details.private_help": "Ако е включено, присъединяването към група изисква одобрението на собственика ѝ",
"details.hidden": "Скрита",
"details.hidden_help": "Ако е включено, тази група няма да бъде извеждана в списъка от групи и потребителите ще трябва да бъдат поканени лично",
"details.delete_group": "Delete Group",
"event.updated": "Подробностите за групата бяха обновени",
"event.deleted": "Групата „%1“ беше изтрита",
"membership.accept-invitation": "Accept Invitation",
"membership.invitation-pending": "Invitation Pending",
"membership.join-group": "Join Group",
"membership.leave-group": "Leave Group",
"membership.reject": "Reject"
"membership.accept-invitation": "Приемане на поканата",
"membership.invitation-pending": "Чакаща покана",
"membership.join-group": "Присъединяване към групата",
"membership.leave-group": "Напускане на групата",
"membership.reject": "Отхвърляне"
}

@ -38,6 +38,7 @@
"details.private_help": "If enabled, joining of groups requires approval from a group owner",
"details.hidden": "Hidden",
"details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually",
"details.delete_group": "Delete Group",
"event.updated": "Group details have been updated",
"event.deleted": "The group \"%1\" has been deleted",
"membership.accept-invitation": "Accept Invitation",

@ -38,6 +38,7 @@
"details.private_help": "If enabled, joining of groups requires approval from a group owner",
"details.hidden": "Hidden",
"details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually",
"details.delete_group": "Delete Group",
"event.updated": "Group details have been updated",
"event.deleted": "The group \"%1\" has been deleted",
"membership.accept-invitation": "Accept Invitation",

@ -38,11 +38,12 @@
"details.private_help": "Hvis aktiveret, så vil det kræve godkendelse af gruppe ejeren for at tilslutte sig en gruppe",
"details.hidden": "Skjult",
"details.hidden_help": "Hvis aktiveret, så vil denne gruppe ikke kunne ses i gruppelisten og bruhere skal inviteres manuelt",
"details.delete_group": "Delete Group",
"event.updated": "Gruppe detaljer er blevet opdateret",
"event.deleted": "Gruppen \"%1\" er blevet slettet",
"membership.accept-invitation": "Accept Invitation",
"membership.invitation-pending": "Invitation Pending",
"membership.join-group": "Join Group",
"membership.leave-group": "Leave Group",
"membership.reject": "Reject"
"membership.accept-invitation": "Acceptér Invitation",
"membership.invitation-pending": "Afventende Invitationer",
"membership.join-group": "Bliv medlem af gruppe",
"membership.leave-group": "Forlad Gruppe",
"membership.reject": "Afvis"
}

@ -38,6 +38,7 @@
"details.private_help": "Wenn aktiviert, setzt ein Gruppenbeitritt die Zustimmung eines Gruppenbesitzers voraus",
"details.hidden": "Versteckt",
"details.hidden_help": "Wenn aktiviert, wird diese Gruppe in der Gruppenliste nicht zu finden sein, und Benutzer werden manuell eingeladen werden müssen.",
"details.delete_group": "Delete Group",
"event.updated": "Gruppendetails wurden aktualisiert",
"event.deleted": "Die Gruppe \"%1\" wurde gelöscht.",
"membership.accept-invitation": "Accept Invitation",

@ -38,6 +38,7 @@
"details.private_help": "If enabled, joining of groups requires approval from a group owner",
"details.hidden": "Hidden",
"details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually",
"details.delete_group": "Delete Group",
"event.updated": "Group details have been updated",
"event.deleted": "The group \"%1\" has been deleted",
"membership.accept-invitation": "Accept Invitation",

@ -38,6 +38,7 @@
"details.private_help": "If enabled, joining of groups requires approval from a group owner",
"details.hidden": "Hidden",
"details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually",
"details.delete_group": "Delete Group",
"event.updated": "Group details have been updated",
"event.deleted": "The group \"%1\" has been deleted",
"membership.accept-invitation": "Accept Invitation",

@ -38,6 +38,7 @@
"details.private_help": "If enabled, joining of groups requires approval from a group owner",
"details.hidden": "Hidden",
"details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually",
"details.delete_group": "Delete Group",
"event.updated": "Group details have been updated",
"event.deleted": "The group \"%1\" has been deleted",
"membership.accept-invitation": "Accept Invitation",

@ -38,11 +38,12 @@
"details.private_help": "Si está habilitado, entrar en los grupos requiere aprobación de sus propietarios",
"details.hidden": "Oculto",
"details.hidden_help": "Si está habilitado, este grupo no aparecerá en los listados de grupos, y los usuarios tendrán que ser invitados manualmente",
"details.delete_group": "Delete Group",
"event.updated": "Los detalles del grupo han sido actualizados",
"event.deleted": "El grupo \"%1\" ha sido eliminado",
"membership.accept-invitation": "Accept Invitation",
"membership.invitation-pending": "Invitation Pending",
"membership.join-group": "Join Group",
"membership.leave-group": "Leave Group",
"membership.reject": "Reject"
"membership.accept-invitation": "Aceptar Invitación",
"membership.invitation-pending": "Invitación Pendiente",
"membership.join-group": "Unirse al grupo",
"membership.leave-group": "Dejar el grupo",
"membership.reject": "Rechazar"
}

@ -38,6 +38,7 @@
"details.private_help": "Kui sisse lülitatud, siis grupiga liitumine nõuab grupi omaniku nõusolekut",
"details.hidden": "Peidetud",
"details.hidden_help": "Kui sisse lülitatud, siis seda gruppi ei kuvata gruppide nimekirjas ning liikmed tuleb lisada manuaalselt",
"details.delete_group": "Delete Group",
"event.updated": "Grupi lisainformatsiooni on uuendatud",
"event.deleted": "Grupp \"%1\" on kustutatud",
"membership.accept-invitation": "Accept Invitation",

@ -38,6 +38,7 @@
"details.private_help": "اگر فعال باشد، پیوستن به گروه مستلزم موافقت صاحب گروه است",
"details.hidden": "پنهان",
"details.hidden_help": "اگر فعال باشد، این گروه در فهرست گروه‌ها پیدا نمی‌شود و کاربران باید دستی فراخوانده شوند",
"details.delete_group": "Delete Group",
"event.updated": "جزییات گروه با موفقیت به روز گردید",
"event.deleted": "گروه \"%1\" حدف شد",
"membership.accept-invitation": "Accept Invitation",

@ -38,6 +38,7 @@
"details.private_help": "If enabled, joining of groups requires approval from a group owner",
"details.hidden": "Hidden",
"details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually",
"details.delete_group": "Delete Group",
"event.updated": "Group details have been updated",
"event.deleted": "The group \"%1\" has been deleted",
"membership.accept-invitation": "Accept Invitation",

@ -38,11 +38,12 @@
"details.private_help": "Si cette case est cochée, rejoindre un groupe nécessite l'accord d'un propriétaire du groupe.",
"details.hidden": "Masqué",
"details.hidden_help": "Si cette case est cochée, ce groupe n'est pas affiché dans la liste des groupes, et les utilisateurs devront être invités manuellement.",
"details.delete_group": "Delete Group",
"event.updated": "Les détails du groupe ont été mis à jour",
"event.deleted": "Le groupe \"%1\" a été supprimé",
"membership.accept-invitation": "Accept Invitation",
"membership.invitation-pending": "Invitation Pending",
"membership.join-group": "Join Group",
"membership.leave-group": "Leave Group",
"membership.reject": "Reject"
"membership.accept-invitation": "Accepter l'invitation",
"membership.invitation-pending": "Invitation en attente",
"membership.join-group": "Rejoindre le groupe",
"membership.leave-group": "Quitter le groupe",
"membership.reject": "Refuser"
}

@ -38,6 +38,7 @@
"details.private_help": "If enabled, joining of groups requires approval from a group owner",
"details.hidden": "Hidden",
"details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually",
"details.delete_group": "Delete Group",
"event.updated": "פרטי הקבוצה עודכנו",
"event.deleted": "קבוצת \"%1\" נמחקה",
"membership.accept-invitation": "Accept Invitation",

@ -38,6 +38,7 @@
"details.private_help": "If enabled, joining of groups requires approval from a group owner",
"details.hidden": "Hidden",
"details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually",
"details.delete_group": "Delete Group",
"event.updated": "Group details have been updated",
"event.deleted": "The group \"%1\" has been deleted",
"membership.accept-invitation": "Accept Invitation",

@ -38,6 +38,7 @@
"details.private_help": "If enabled, joining of groups requires approval from a group owner",
"details.hidden": "Hidden",
"details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually",
"details.delete_group": "Delete Group",
"event.updated": "Group details have been updated",
"event.deleted": "The group \"%1\" has been deleted",
"membership.accept-invitation": "Accept Invitation",

@ -38,6 +38,7 @@
"details.private_help": "Se abilitato, l'ingresso ai gruppi richiede l'approvazione di uno dei proprietari",
"details.hidden": "Nascosto",
"details.hidden_help": "Se abilitato, questo gruppo non sarà visibile nella lista dei gruppi e gli utenti dovranno essere invitati manualmente",
"details.delete_group": "Delete Group",
"event.updated": "I dettagli del Gruppo sono stati aggiornati",
"event.deleted": "Il gruppo \"%1\" è stato eliminato",
"membership.accept-invitation": "Accept Invitation",

@ -38,6 +38,7 @@
"details.private_help": "If enabled, joining of groups requires approval from a group owner",
"details.hidden": "Hidden",
"details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually",
"details.delete_group": "Delete Group",
"event.updated": "Group details have been updated",
"event.deleted": "The group \"%1\" has been deleted",
"membership.accept-invitation": "Accept Invitation",

@ -38,6 +38,7 @@
"details.private_help": "If enabled, joining of groups requires approval from a group owner",
"details.hidden": "Hidden",
"details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually",
"details.delete_group": "Delete Group",
"event.updated": "Group details have been updated",
"event.deleted": "The group \"%1\" has been deleted",
"membership.accept-invitation": "Accept Invitation",

@ -38,6 +38,7 @@
"details.private_help": "If enabled, joining of groups requires approval from a group owner",
"details.hidden": "Paslėptas",
"details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually",
"details.delete_group": "Delete Group",
"event.updated": "Grupės informacija atnaujinta",
"event.deleted": "Grupė \"%1\" pašalinta",
"membership.accept-invitation": "Accept Invitation",

@ -38,6 +38,7 @@
"details.private_help": "Jika dibolehkan, menyertai kumpulan memerlukan kelulusan pemilik kumpulan",
"details.hidden": "Sembunyi",
"details.hidden_help": "Jika dibolehkan, kumpulan ini tidak akan dijumpai di senarai kumpulan, dan pengguna hendaklah di jemput secara manual",
"details.delete_group": "Delete Group",
"event.updated": "Perincian kumpulan telah dikemaskini",
"event.deleted": "Kumpulan \"%1\" telah dipadam",
"membership.accept-invitation": "Accept Invitation",

@ -38,6 +38,7 @@
"details.private_help": "Hvis aktivert, vil medlemskap i grupper kreve godkjennelse fra en gruppe-eier",
"details.hidden": "Skjult",
"details.hidden_help": "vis aktivert, vil denne gruppen ikke bli funnet i gruppelista, og brukere må inviteres manuellt",
"details.delete_group": "Delete Group",
"event.updated": "Gruppedetaljer har blitt oppgradert",
"event.deleted": "Gruppen \"%1\" har blitt slettet",
"membership.accept-invitation": "Accept Invitation",

@ -38,6 +38,7 @@
"details.private_help": "Wanneer ingeschakeld, zal eerst een groepseigenaar goedkeuring moeten verlenen voordat nieuwe leden kunnen toetreden",
"details.hidden": "Niet getoond",
"details.hidden_help": "Indien geactiveerd zal deze groep niet getoond worden in de groepslijst en zullen gebruikers handmatig uitgenodigd moeten worden.",
"details.delete_group": "Delete Group",
"event.updated": "Groepsdetails zijn bijgewerkt",
"event.deleted": "De groep \"%1\" is verwijderd",
"membership.accept-invitation": "Accept Invitation",

@ -38,6 +38,7 @@
"details.private_help": "Jeśli aktywowane, przystępowanie do grup wymaga zatwierdzenia przez właściciela grupy",
"details.hidden": "Ukryty",
"details.hidden_help": "Jeśli aktywowane, ta grupa nie będzie widoczna w wykazie grup, a użytkownicy będą musieli być zapraszani manualnie.",
"details.delete_group": "Delete Group",
"event.updated": "Dane grupy zostały zaktualizowane",
"event.deleted": "Grupa \"%1\" została skasowana",
"membership.accept-invitation": "Accept Invitation",

@ -38,6 +38,7 @@
"details.private_help": "Se habilitado, a entrada nos grupos requer aprovação de um dos donos do grupo",
"details.hidden": "Oculto",
"details.hidden_help": "Se habilitado, este grupo não se encontrará na listagem de grupos e os usuários terão de ser convivados manualmente",
"details.delete_group": "Delete Group",
"event.updated": "Os detalhes do grupo foram atualizados",
"event.deleted": "O grupo \"%1\" foi deletado",
"membership.accept-invitation": "Accept Invitation",

@ -38,6 +38,7 @@
"details.private_help": "If enabled, joining of groups requires approval from a group owner",
"details.hidden": "Hidden",
"details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually",
"details.delete_group": "Delete Group",
"event.updated": "Group details have been updated",
"event.deleted": "The group \"%1\" has been deleted",
"membership.accept-invitation": "Accept Invitation",

@ -38,6 +38,7 @@
"details.private_help": "Если включено, вступление в группы будет подтверждаться владельцем группы",
"details.hidden": "Скрыто",
"details.hidden_help": "Если включено, группа не будет показываться в списках, а пользователи должны приглашаться вручную",
"details.delete_group": "Delete Group",
"event.updated": "Настройки группы обновлены",
"event.deleted": "Группа \"%1\" удалена",
"membership.accept-invitation": "Accept Invitation",

@ -38,6 +38,7 @@
"details.private_help": "If enabled, joining of groups requires approval from a group owner",
"details.hidden": "Hidden",
"details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually",
"details.delete_group": "Delete Group",
"event.updated": "Group details have been updated",
"event.deleted": "The group \"%1\" has been deleted",
"membership.accept-invitation": "Accept Invitation",

@ -38,6 +38,7 @@
"details.private_help": "If enabled, joining of groups requires approval from a group owner",
"details.hidden": "Hidden",
"details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually",
"details.delete_group": "Delete Group",
"event.updated": "Group details have been updated",
"event.deleted": "The group \"%1\" has been deleted",
"membership.accept-invitation": "Accept Invitation",

@ -38,6 +38,7 @@
"details.private_help": "Уколико је укључено, приступање групи захтева одобрење власника групе.",
"details.hidden": "Скривена",
"details.hidden_help": "Уколико је укључено, група неће бити видљива на списку група, и корисницима се позивнице морају слати ручно.",
"details.delete_group": "Delete Group",
"event.updated": "Детаљи групе су ажурирани",
"event.deleted": "Група „%1“ је обрисана",
"membership.accept-invitation": "Accept Invitation",

@ -38,6 +38,7 @@
"details.private_help": "If enabled, joining of groups requires approval from a group owner",
"details.hidden": "Hidden",
"details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually",
"details.delete_group": "Delete Group",
"event.updated": "Group details have been updated",
"event.deleted": "The group \"%1\" has been deleted",
"membership.accept-invitation": "Accept Invitation",

@ -38,6 +38,7 @@
"details.private_help": "If enabled, joining of groups requires approval from a group owner",
"details.hidden": "ซ่อน",
"details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually",
"details.delete_group": "Delete Group",
"event.updated": "ข้อมูล Group ได้รับการบันทึกแล้ว",
"event.deleted": "The group \"%1\" has been deleted",
"membership.accept-invitation": "Accept Invitation",

@ -38,6 +38,7 @@
"details.private_help": "Gruba katılmak için eğer etkinse grup sahibini onayı gerekir, ",
"details.hidden": "Gizli",
"details.hidden_help": "Bu grup eğer etkinse grup listelerinde bulunmaz, ve kullanıcılar bizzat davet eder",
"details.delete_group": "Delete Group",
"event.updated": "Grup detayları güncellenmiştir",
"event.deleted": "\"%1\" grubu silinmiş",
"membership.accept-invitation": "Accept Invitation",

@ -38,6 +38,7 @@
"details.private_help": "If enabled, joining of groups requires approval from a group owner",
"details.hidden": "Hidden",
"details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually",
"details.delete_group": "Delete Group",
"event.updated": "Thông tin nhóm đã được cập nhật",
"event.deleted": "The group \"%1\" has been deleted",
"membership.accept-invitation": "Accept Invitation",

@ -38,6 +38,7 @@
"details.private_help": "启用此选项后,加入小组需要组长审批。",
"details.hidden": "隐藏",
"details.hidden_help": "启用此选项后,小组将不在小组列表中展现,成员只能通过邀请加入。",
"details.delete_group": "Delete Group",
"event.updated": "小组信息已更新",
"event.deleted": "小组 \"%1\" 已被删除",
"membership.accept-invitation": "Accept Invitation",

@ -38,6 +38,7 @@
"details.private_help": "If enabled, joining of groups requires approval from a group owner",
"details.hidden": "隱藏",
"details.hidden_help": "If enabled, this group will not be found in the groups listing, and users will have to be invited manually",
"details.delete_group": "Delete Group",
"event.updated": "群組詳細訊息已被更新",
"event.deleted": "此 \"%1\" 群組已被刪除了",
"membership.accept-invitation": "Accept Invitation",

@ -125,8 +125,9 @@ define('forum/chats', ['components', 'string', 'sounds', 'forum/infinitescroll',
};
function onMessagesParsed(html) {
var newMessage = $(html);
newMessage.insertBefore($('.user-typing'));
var newMessage = $(html),
chatContainer = $('.chat-content');
newMessage.appendTo(chatContainer);
newMessage.find('.timeago').timeago();
newMessage.find('img:not(".chat-user-image")').addClass('img-responsive');
Chats.scrollToBottom($('.expanded-chat .chat-content'));
@ -135,11 +136,13 @@ define('forum/chats', ['components', 'string', 'sounds', 'forum/infinitescroll',
Chats.addSocketListeners = function() {
socket.on('event:chats.receive', function(data) {
var typingNotifEl = $('.user-typing'),
containerEl = $('.expanded-chat ul');
containerEl = $('.expanded-chat ul'),
lastSpeaker = parseInt(containerEl.find('.chat-message').last().attr('data-uid'), 10);
if (Chats.isCurrentChat(data.withUid)) {
newMessage = data.self === 0;
data.message.self = data.self;
data.message.newSet = lastSpeaker !== data.message.fromuid;
Chats.parseMessage(data.message, onMessagesParsed);
} else {
$('.chats-list li[data-uid="' + data.withUid + '"]').addClass('unread');
@ -148,22 +151,10 @@ define('forum/chats', ['components', 'string', 'sounds', 'forum/infinitescroll',
});
socket.on('event:chats.userStartTyping', function(withUid) {
var typingNotifEl = $('.user-typing');
if (Chats.isCurrentChat(withUid)) {
typingNotifEl.removeClass('hide');
}
$('.chats-list li[data-uid="' + withUid + '"]').addClass('typing');
});
socket.on('event:chats.userStopTyping', function(withUid) {
var typingNotifEl = $('.user-typing');
if (Chats.isCurrentChat(withUid)) {
typingNotifEl.addClass('hide');
}
$('.chats-list li[data-uid="' + withUid + '"]').removeClass('typing');
});
@ -173,7 +164,7 @@ define('forum/chats', ['components', 'string', 'sounds', 'forum/infinitescroll',
};
Chats.resizeMainWindow = function() {
var messagesList = $('.expanded-chat ul');
var messagesList = $('.expanded-chat .chat-content');
if (messagesList.length) {
var margin = $('.expanded-chat ul').outerHeight(true) - $('.expanded-chat ul').height(),

@ -80,9 +80,9 @@ define('chat', ['components', 'taskbar', 'string', 'sounds', 'forum/chats', 'tra
if (modal.is(":visible")) {
taskbar.updateActive(modal.attr('UUID'));
Chats.scrollToBottom(modal.find('#chat-content'));
Chats.scrollToBottom(modal.find('.chat-content'));
} else {
module.toggleNew(modal.attr('UUID'), true);
module.toggleNew(modal.attr('UUID'), true, true);
}
if (!isSelf && (!modal.is(":visible") || !app.isFocused)) {
@ -97,9 +97,10 @@ define('chat', ['components', 'taskbar', 'string', 'sounds', 'forum/chats', 'tra
} else {
module.createModal({
username: username,
touid: data.withUid
touid: data.withUid,
silent: true
}, function(modal) {
module.toggleNew(modal.attr('UUID'), true);
module.toggleNew(modal.attr('UUID'), true, true);
if (!isSelf) {
app.alternatingTitle('[[modules:chat.user_has_messaged_you, ' + username + ']]');
sounds.play('chat-incoming');
@ -110,7 +111,7 @@ define('chat', ['components', 'taskbar', 'string', 'sounds', 'forum/chats', 'tra
socket.on('event:chats.userStartTyping', function(withUid) {
var modal = module.getModal(withUid);
var chatContent = modal.find('#chat-content');
var chatContent = modal.find('.chat-content');
if (!chatContent.length) {
return;
}
@ -141,7 +142,7 @@ define('chat', ['components', 'taskbar', 'string', 'sounds', 'forum/chats', 'tra
}
});
callback(chats);
callback(null, chats);
});
socket.on('event:chats.open', function(data) {
@ -233,7 +234,7 @@ define('chat', ['components', 'taskbar', 'string', 'sounds', 'forum/chats', 'tra
return;
}
chatModal.find('#chat-content').css('height', module.calculateChatListHeight(chatModal));
chatModal.find('.chat-content').css('height', module.calculateChatListHeight(chatModal));
});
chatModal.draggable({
@ -311,8 +312,6 @@ define('chat', ['components', 'taskbar', 'string', 'sounds', 'forum/chats', 'tra
}
});
chatModal.find('.user-typing .text').translateText('[[modules:chat.user_typing, ' + data.username + ']]');
taskbar.push('chat', chatModal.attr('UUID'), {
title: data.username,
touid: data.touid,
@ -374,7 +373,7 @@ define('chat', ['components', 'taskbar', 'string', 'sounds', 'forum/chats', 'tra
chatModal.removeClass('hide');
checkStatus(chatModal);
taskbar.updateActive(uuid);
Chats.scrollToBottom(chatModal.find('#chat-content'));
Chats.scrollToBottom(chatModal.find('.chat-content'));
module.bringModalToTop(chatModal);
module.focusInput(chatModal);
socket.emit('modules.chats.markRead', chatModal.attr('touid'));
@ -388,7 +387,7 @@ define('chat', ['components', 'taskbar', 'string', 'sounds', 'forum/chats', 'tra
module.enableMobileBehaviour = function(modalEl) {
app.toggleNavbar(false);
modalEl.attr('data-mobile', '1');
var messagesEl = modalEl.find('#chat-content');
var messagesEl = modalEl.find('.chat-content');
messagesEl.css('height', module.calculateChatListHeight(modalEl));
$(window).on('resize', function() {
@ -403,7 +402,7 @@ define('chat', ['components', 'taskbar', 'string', 'sounds', 'forum/chats', 'tra
module.calculateChatListHeight = function(modalEl) {
var totalHeight = modalEl.find('.modal-content').outerHeight() - modalEl.find('.modal-header').outerHeight(),
padding = parseInt(modalEl.find('.modal-body').css('padding-top'), 10) + parseInt(modalEl.find('.modal-body').css('padding-bottom'), 10),
contentMargin = parseInt(modalEl.find('#chat-content').css('margin-top'), 10) + parseInt(modalEl.find('#chat-content').css('margin-bottom'), 10),
contentMargin = parseInt(modalEl.find('.chat-content').css('margin-top'), 10) + parseInt(modalEl.find('.chat-content').css('margin-bottom'), 10),
sinceHeight = modalEl.find('.since-bar').outerHeight(true),
inputGroupHeight = modalEl.find('.input-group').outerHeight();
@ -427,7 +426,7 @@ define('chat', ['components', 'taskbar', 'string', 'sounds', 'forum/chats', 'tra
function loadChatSince(chatModal, since, callback) {
socket.emit('modules.chats.get', {touid: chatModal.attr('touid'), since: since}, function(err, messages) {
var chatContent = chatModal.find('#chat-content');
var chatContent = chatModal.find('.chat-content');
chatContent.find('.chat-message').remove();
module.appendChatMessage(chatModal, messages, callback);
});
@ -458,14 +457,18 @@ define('chat', ['components', 'taskbar', 'string', 'sounds', 'forum/chats', 'tra
}
module.appendChatMessage = function(chatModal, data, done) {
var chatContent = chatModal.find('#chat-content'),
typingNotif = chatModal.find('.user-typing');
var chatContent = chatModal.find('.chat-content'),
lastSpeaker = parseInt(chatContent.find('.chat-message').last().attr('data-uid'), 10);
if (!Array.isArray(data)) {
data.newSet = lastSpeaker !== data.fromuid;
}
Chats.parseMessage(data, function(html) {
var message = $(html);
message.find('img:not(".chat-user-image")').addClass('img-responsive');
message.find('.timeago').timeago();
message.insertBefore(typingNotif);
message.appendTo(chatContent);
Chats.scrollToBottom(chatContent);
if (typeof done === 'function') {

@ -74,7 +74,6 @@ define('taskbar', function() {
};
taskbar.toggleNew = function(uuid, state, silent) {
console.log('TOGGLING');
var btnEl = taskbar.tasklist.find('[data-uuid="' + uuid + '"]');
btnEl.toggleClass('new', state);

@ -164,6 +164,9 @@ var db = require('./database'),
if (index > 0 && parseInt(message.timestamp, 10) > parseInt(messages[index-1].timestamp, 10) + (1000*60*5)) {
// If it's been 5 minutes, this is a new set of messages
message.newSet = true;
} else if (index > 0 && message.fromuid !== messages[index-1].fromuid) {
// If the previous message was from the other person, this is also a new set
message.newSet = true
}
return message;

@ -67,7 +67,7 @@ middleware.pageView = function(req, res, next) {
};
middleware.pluginHooks = function(req, res, next) {
async.each(plugins.loadedHooks['filter:router.page'], function(hookObj, next) {
async.each(plugins.loadedHooks['filter:router.page'] || [], function(hookObj, next) {
hookObj.method(req, res, next)
}, function(req, res) {
// If it got here, then none of the subscribed hooks did anything, or there were no hooks

@ -43,6 +43,10 @@ SocketGroups.leave = function(socket, data, callback) {
return callback(new Error('[[error:invalid-uid]]'));
}
if (data.groupName === 'administrators') {
return callback(new Error('[[error:cant-remove-self-as-admin]]'));
}
groups.leave(data.groupName, socket.uid, callback);
};
@ -131,7 +135,7 @@ function acceptRejectAll(type, socket, data, callback) {
}
], callback);
});
};
}
SocketGroups.issueInvite = function(socket, data, callback) {
if (!data) {

@ -39,19 +39,29 @@ rooms.broadcast = function(socket, room, msg, data, callback) {
callback = callback || function() {};
// Filter out socketIds that aren't actually connected
socketIds = socketIds.filter(function(id) {
return io.server.sockets.connected.hasOwnProperty(id);
});
async.map(socketIds, function(id, next) {
var timeout;
var timeout,
timeoutPassed = false;
if (socket.id === id) {
return setImmediate(next, null, []);
}
timeout = setTimeout(function() {
timeoutPassed = true;
next(null, []);
}, 500);
io.server.sockets.connected[id].emit(msg, data || {}, function(chats) {
io.server.sockets.connected[id].emit(msg, data || {}, function(err, returnData) {
clearTimeout(timeout);
next(null, chats);
if (!timeoutPassed) {
next(null, returnData);
}
});
}, callback);
};

@ -97,7 +97,7 @@ SocketTopics.postcount = function(socket, tid, callback) {
};
SocketTopics.markAsRead = function(socket, tids, callback) {
if(!Array.isArray(tids) || !socket.uid) {
if (!Array.isArray(tids) || !socket.uid) {
return callback(new Error('[[error:invalid-data]]'));
}
@ -123,14 +123,14 @@ SocketTopics.markAsRead = function(socket, tids, callback) {
};
SocketTopics.markTopicNotificationsRead = function(socket, tid, callback) {
if(!tid || !socket.uid) {
if (!tid || !socket.uid) {
return callback(new Error('[[error:invalid-data]]'));
}
topics.markTopicNotificationsRead(tid, socket.uid);
};
SocketTopics.markAllRead = function(socket, data, callback) {
topics.getLatestTidsFromSet('topics:recent', 0, -1, 'day', function(err, tids) {
db.getSortedSetRevRangeByScore('topics:recent', 0, -1, '+inf', Date.now() - topics.unreadCutoff, function(err, tids) {
if (err) {
return callback(err);
}

@ -14,6 +14,8 @@ module.exports = function(Topics) {
var unreadCutoff = 86400000 * 2;
Topics.unreadCutoff = unreadCutoff;
Topics.getTotalUnread = function(uid, callback) {
Topics.getUnreadTids(0, uid, 0, 20, function(err, tids) {
callback(err, tids ? tids.length : 0);

Loading…
Cancel
Save