v1.0.0 RC 1

This commit is contained in:
2014-06-14 18:04:27 +02:00
parent 16387ca7d1
commit 8da730253d
109 changed files with 10834 additions and 8132 deletions

View File

@@ -1,44 +1,45 @@
<div id="chat">
<div class="h1_wrap" id="chat_title">
<h1 class="round"><span>Chat</span></h1>
</div>
<div id="chat_chan">
<p class="tab_bar"><span id="join_chan" class="round_top clickable"></span></p>
<p class="tab_bar"><span id="join_chan" class="chan round_top clickable"></span></p>
</div>
<div id="sidebar">
<div class="sidebar_box round">
<div id="connected_users_title" class="sidebar_box_title round_top clickable">Connect&eacute;s</div>
<div id="connected_users" class="sidebar_box_content"></div>
<div class="sidebar_box_title round_top round clickable">Connect&eacute;s</div>
<div id="connected_users" class="sidebar_box_content hide"></div>
</div>
<div class="sidebar_box round">
<div class="sidebar_box_title round_top clickable round">Aide</div>
<div class="sidebar_box_title round_top round clickable">News</div>
<div id="news" class="sidebar_box_content hide"><p class="loading"><i class="fa fa-spin fa-inline fa-c-loading"></i></p></div>
</div>
<div class="sidebar_box round">
<div class="sidebar_box_title round_top round clickable">Aide</div>
<div id="help_open" class="sidebar_box_content help_paperclip clickable hide"></div>
</div>
</div>
<div id="chat_room" class="round">
<div id="chat_container">
<div class="scrollbar"><div class="track round"><div class="thumb round clickable"><div class="end round clickable"></div></div></div></div>
<div id="chat_messages_box">
<div id="chat_messages"></div>
</div>
</div>
<div id="chat_input" class="tiny_round">
<form id="chat_form" name="chat_form">
<input type="text" id="message" name="message" value="" maxlength="500" />
<i id="message_img" class="fa fa-fw fa-20 fa-c-comment"></i><input type="text" id="message" name="message" value="" maxlength="500" />
<input type="hidden" id="chan" name="chan" value="" maxlength="50" />
</form>
</div>
</div>
<div id="template" class="hide">
<div id="help" class="help tiny_round">
<p class="title">Manuel d'utilisation<span id="close_help" class="clickable">x</span></p>
<p class="title">Manuel d'utilisation</p>
<p class="title righty">&nbsp;<span id="close_help" class="clickable"><i class="fa fa-30 fa-c-close"></i></span></p>
<p class="subtitle"><span>Message</span></p>
<p class="item"><span class="key">Echap</span>Supprime le texte en cours de r&eacute;daction</p>
<p class="item"><span class="key">Fl&egrave;che haut</span>R&eacute;p&egrave;te dernier message envoy&eacute;</p>
<p class="item"><span class="key">@X Y</span>Vous dites Y &agrave; X (pseudo de Y en rouge)</p>
<p class="item"><span class="key">/me X</span>Votre_pseudo X. Utile lorsque vous voulez parler de vous &agrave; la 3&egrave;me personne. Par exemple : /me se touche la nouille au taff</p>
<p class="item"><span class="key">/mail X Y</span>Vous envoyez &agrave; X un email contenant Y (adresse professionel)</p>
<p class="item"><span class="key">/mail X Y</span>Vous envoyez &agrave; X un email contenant Y (adresse professionnelle)</p>
<p class="item"><span class="key">/news X</span>Vous annoncez le message X (votre message est ajouté à la liste des news automatiquement)</p>
<p class="item">
<span class="key">Tab</span>
Chaque hit pr&eacute;-remplie le message en faisant d&eacute;filer la liste des connect&eacute;s.
@@ -48,6 +49,7 @@
<p class="subtitle"><span>Chans</span></p>
<p class="item">Les chans sont divis&eacute;s en trois cat&eacute;gories : les chans priv&eacute;s (PM, pour deux personnes seulement), les chans entreprise (pour toutes les personnes d'une m&ecirc;me entreprise) et les autres (chans publiques)</p>
<p class="item"><span class="key">/join #X</span>Vous rejoignez le chan X (si autoris&eacute;)</p>
<p class="item"><span class="key">/invite X</span>Vous invitez X à rejoindre le chan (si autoris&eacute;)</p>
<p class="item"><span class="key">/pm #X</span>Vous rejoignez le chan priv&eacute; (vous et X)</p>
<p class="item"><span class="key">/quit #X</span>Vous quittez le chan X</p>
<p class="item"><span class="key">/chans</span>Liste des chans publiques disponibles (aussi accessible via /channels et /list)</p>
@@ -77,7 +79,8 @@ databap.pageInit = function()
//Page variables
databap.tmp('sending_msg', 'boolean');
databap.tmp('refresh', 'boolean');
databap.initVar('unread_msg', 'object');
self.vars2('unread_msg', 'object');
databap.tmp('news_period', 10*60*1000);
//Main elements
$MsgInput = databap.getMainElem('#message');
@@ -90,7 +93,7 @@ databap.pageInit = function()
//Loading the chat
databap.vars.last_message_id = '0';
oScrollbar = $('#chat_container').tinyscrollbar({viewport:'#chat_messages_box', overview:'#chat_messages'});
self.initScrollBar('#chat_container', '#chat_messages_box', '#chat_messages');
//Loading Chans
setChanButton();
@@ -99,67 +102,117 @@ databap.pageInit = function()
joinChan(databap.consts.default_chan, true);
//window focus
//databap.onMouveEnter = function(){if(databap.vars.inputFocus){onPageFocus();}else{$MsgInput.focus();}};
//databap.onMouveLeave = function(){$MsgInput.focus();onPageBlur();};
$(window).focus(onPageFocus);
$(window).blur(onPageBlur);
//$(window).focus(function(){debug('focus');}).blur(function(){debug('blur');});
//Message Input Focus
//$MsgInput.focus(function(){onPageFocus();databap.vars.inputFocus=true;});
//$MsgInput.blur(function(){onPageBlur();databap.vars.inputFocus=false;});
$MsgInput.focus();
//databap.onKeyDown = function(e){if(!databap.vars.inputFocus)$MsgInput.focus();};
//On resize
//databap.resetSize = function(){databap.getMainElem('#chat_messages_box').height(databap.getMainElem('#sidebar').outerHeight());};
databap.onResize = function()
{
databap.$main.css('overflow', 'hidden');
//debug('chat page resize triggered');
var $cb = databap.getMainElem('#chat_messages_box');
var iMaxHeight = databap.consts.pageMaxHeight - 15 - ($('#chat_title').outerHeight(true) + $('#chat_chan').outerHeight(true) + $('#chat_room').outerHeight(true) - $('#chat_messages_box').outerHeight(true));
if($cb.height() != iMaxHeight)
{
//$cb.animate({height: maxHeight}, 400, function(){oScrollbar.tinyscrollbar_update('bottom');resizing=false;});
$cb.height(iMaxHeight);
oScrollbar.tinyscrollbar_update('bottom');
}
};
//Disconnect from the chat
databap.onQuit = function()
{
if(databap.tmp('refresh') == false) databap.getSyncInfo('disconnect_chat');
databap.vars.chans_list = {};
if(typeof oChatTimer != "undefined") clearTimeout(oChatTimer);
if(typeof oUserTimer != "undefined") clearTimeout(oUserTimer);
};
databap.onKeyDown = function(e)
{
if(e.keyCode == 116) databap.tmp('refresh', true);
else databap.tmp('refresh', false);
};
//Sidebar
databap.getMainElem('.sidebar_box_title').click
(
function()
{
$(this).toggleClass('round')
.closest('.sidebar_box').find('.sidebar_box_content').toggle('fast', function(){databap.resizeMain('true');});
}
);
//Help
databap.getMainElem('#help_open').click(displayHelp);
//Init sidebar events
initSideBar();
//Init's end
databap.setInitEnd(true);
};
//On resize
databap.onResize = function()
{
self.setScrollBarSize('maximize');
//Message Input
$('#message').width($('#chat_input').width() - $('#message_img').outerWidth(true)- 1);
};
//Disconnect from the chat
databap.onQuit = function()
{
if(databap.tmp('refresh') == false) databap.getSyncInfo('disconnect_chat');
databap.vars.chans_list = {};
if(typeof oChatTimer != "undefined") clearTimeout(oChatTimer);
if(typeof oUserTimer != "undefined") clearTimeout(oUserTimer);
return true;
};
databap.onKeyDown = function(e)
{
if(e.keyCode == 116) databap.tmp('refresh', true);
else databap.tmp('refresh', false);
};
function initSideBar()
{
//Sidebar Events
$('#sidebar').find('.sidebar_box_title').click
(
function()
{
$This = $(this);
if(!$This.closest('.sidebar_box').find('.sidebar_box_content').is(":visible"))
{
$('#sidebar').find('.sidebar_box_title').not($This)
.addClass('round')
.closest('.sidebar_box').find('.sidebar_box_content')
.hide('fast');
$This
.toggleClass('round')
.closest('.sidebar_box').find('.sidebar_box_content')
.toggle('fast', function()
{
databap.resizeMain('true');
switch($(this).attr('id'))
{
case 'help_open': $('#help_open').click(); break;
case 'news': getNews(); break;
}
});
}
}
);
$('#sidebar').find('.sidebar_box_title').eq(0).click();
//Help
databap.getMainElem('#help_open').click(displayHelp);
}
function getNews()
{
if(typeof databap.tmp('news_timer') != "undefined") clearTimeout(databap.tmp('news_timer'));
var $NewsBox = $('#news');
if($NewsBox.is(':visible'))
{
databap.getInfo
(
'news',
function(asNews)
{
$.each(asNews.news, function(ikey, asNew)
{
$('<div>', {'class':'new'}).hide()
.append($('<p>')
.append($('<i>', {'class':'fa fa-inline fa-30 fa-c-news'}))
.append($('<span>').text(asNew.message)))
.append($('<p>', {'class':'signature'})
.text('—'+asNew.nickname)
.append('<br />')
.append($('<span>', {'class':'news_time'}).text(asNew.time_desc)))
.appendTo($NewsBox);
});
$NewsBox.find('.loading').hide();
$NewsBox.find('.new').toggle();
$NewsBox.find('.new:hidden').remove();
//Request in 10mins
databap.tmp('news_timer', setTimeout(getNews, databap.tmp('news_period')));
},
{},
'json'
);
}
}
function onPageFocus()
{
databap.vars.focus=true;
@@ -176,31 +229,47 @@ function onPageBlur()
function setChanButton()
{
var sAddChanText = '+';
$JoinButton = $('#join_chan');
if($JoinButton.text() == sAddChanText)
{
$JoinButton
.addClass('active')
.empty()
.append($('<span>#<input type="text" id="input_chan" class="round" /></span>'))
.find('#input_chan').focus().keyup
(
function(e)
$('#join_chan')
//.click(function(){$('#join_chan_button').click();})
.append
(
$('<span>', {id:'join_chan_button'})
.click(function()
{
if(e.keyCode == 13)
{
setChanButton();
joinChan($(this).val());
}
}
);
}
else $JoinButton
.empty()
.text(sAddChanText)
.removeClass('active')
.click(function(){setChanButton();});
$(this).hide();
$('#join_chan_input').css('display', '');
$('#join_chan').addClass('active').find('#input_chan').focus();
})
.append('&nbsp;')
.append($('<i>', {'class':'fa fa-c-plus'}))
.append('&nbsp;')
)
.append
(
$('<span>', {id:'join_chan_input'})
.text('#')
.append
(
$('<input>', {type:'text', id:'input_chan', 'class':'round'})
.keyup(function(e)
{
if(e.keyCode == 13)
{
var $This = $(this);
joinChan($This.val());
$This.val('');
}
if(typeof e.keyCode == 'undefined' || e.keyCode == 13)
{
$('#join_chan_input').css('display', 'none');
$('#join_chan_button').show();
$('#join_chan').removeClass('active');
}
})
.blur(function(){$(this).keyup();})
).hide()
);
}
function getChanKeyName(sChanName)
@@ -306,7 +375,7 @@ function switchChan(sChanKeyName)
//Show current channel messages
databap.getMainElem('#chat_messages').find('p').hide();
databap.getMainElem('#chat_messages').find('p.class_'+sChanKeyName+', p.class_'+databap.consts.all_chan_id).show();
oScrollbar.tinyscrollbar_update('bottom');
databap.updateScrollBar('bottom');
//Show Current channel members
databap.getMainElem('#connected_users').find('p').hide();
@@ -358,11 +427,11 @@ function addChanTab(sChanKeyName, sChanName, sChanTabName, bLightUp)
//Prepare clickable chan button
var sChanQuitId = databap.consts.chanQuitPrefix+sChanKeyName;
var sChanUnreadId = databap.consts.chanUnreadPrefix+sChanKeyName;
var $ChanButton = $('<span id="'+sChanId+'" class="chan clickable round_top'+(bLightUp?' light_up':'')+'">#</span>')
var $ChanButton = $('<span id="'+sChanId+'" class="chan clickable inc_border round_top'+(bLightUp?' light_up':'')+'">#</span>')
.click(function(){$(this).removeClass('light_up');joinChan(databap.vars.chans_list[$(this).attr('id').substr(databap.consts.chanPrefix.length)]);})
.append('<span class="chan_title">'+sChanTabName+'</span>')
.append('<span class="chan_unread" id="'+sChanUnreadId+'"></span>')
.append($('<a id="'+sChanQuitId+'" class="quit_chan clickable">x</a>').click(function(e){e.stopPropagation();quitChan($(this).attr('id').substr(databap.consts.chanQuitPrefix.length));}));
.append($('<a id="'+sChanQuitId+'" class="quit_chan clickable"><i class="fa fa-c-close"></i></a>').click(function(e){e.stopPropagation();quitChan($(this).attr('id').substr(databap.consts.chanQuitPrefix.length));}));
//Add channel tab name and bind delete button
@@ -418,7 +487,6 @@ function add_message(e)
else if(chat_message != '' && databap.tmp('sending_msg') == false) //send
{
databap.tmp('sending_msg', true);
//debug(databap.tmp('sending_msg'));
databap.saveForm
(
'add_message',
@@ -426,7 +494,6 @@ function add_message(e)
function(id)
{
databap.tmp('sending_msg', false);
//debug(databap.tmp('sending_msg'));
refresh_chat();
},
true
@@ -455,6 +522,11 @@ function add_message(e)
}
break;
case 9 : //tab
/* Action Plan
- Detect current caret position : $this.getCursorPosition()
- Find word wrapped around cursor : while loop until non alphanum char before and after caret position
-
*/
//Init
$this = databap.getMainElem('#message');
var chat_message = $.trim($this.val());
@@ -465,6 +537,7 @@ function add_message(e)
//Finding last word
var last_word = (chat_message.lastIndexOf(" ")==-1)?chat_message:chat_message.substr(chat_message.lastIndexOf(" ") + 1);
debug(last_word);
if(last_word.substr(0, 1)=='@') last_word = last_word.substr(1);
var last_word_len = last_word.length;
@@ -540,7 +613,7 @@ function refresh_chat(bReset)
{
var bReset = (typeof bReset != 'undefined' && bReset == true);
if(typeof oChatTimer != "undefined") clearTimeout(oChatTimer);
if(databap.vars.current_page == databap.pages.chat)
if(databap.vars.current_page == 'chat')
{
if(!databap.vars.loading)
{
@@ -579,7 +652,7 @@ function refresh_chat(bReset)
//Nicknames changes
if(updateUsersList === true || prevLastMsgId == 0)
{
oScrollbar.tinyscrollbar_update('bottom');
databap.updateScrollBar('bottom');
refresh_users();
updateUsersList = false;
}
@@ -605,27 +678,35 @@ function refresh_chat(bReset)
function addMessage(message_info, bReset)
{
message_info.nickname = message_info.nickname || '';
var sChanKeyName = message_info.id_chan;
var sMsgPrefix = '<a class="user clickable" title="Ecrire un PM &agrave; '+message_info.nickname+'">'+message_info.nickname+'</a><span class="console">&gt;</span>';
var msg_body = '';
switch(message_info.msg_class)
{
case 'U':
msg_body = '<a class="user clickable" title="Ecrire un PM &agrave; '+message_info.nickname+'">'+message_info.nickname+'</a><span class="console">&gt;</span><span class="text">'+message_info.message+'</span>';
msg_body = sMsgPrefix+'<span class="text">'+message_info.message+'</span>';
break;
case 'NW':
if(!bReset) getNews();
msg_body = '<span class="text action">'+message_info.nickname+' a une news : <span class="news"><i class="fa fa-30 fa-c-news"></i> '+message_info.message+' <i class="fa fa-30 fa-c-news"></i></span></span>';
break;
case 'A':
var url = databap.getCodeLink(message_info.message);
var url = databap.getInternalLink('code', message_info.message);
msg_body = '<span class="text">'+message_info.nickname+' a ajout&eacute; un nouveau code : <a href="'+url+'" target="_blank">'+message_info.description+'</a></span>';
break;
case 'E':
var url = databap.getCodeLink(message_info.message);
var url = databap.getInternalLink('code', message_info.message);
msg_body = '<span class="text">'+message_info.nickname+' a modifi&eacute; le code <a href="'+url+'" target="_blank">'+message_info.description+'</a></span>';
break;
case 'PA':
var url = databap.getProcLink(message_info.message);
var url = databap.getInternalLink('proc', message_info.message);
msg_body = '<span class="text">'+message_info.nickname+' a ajout&eacute; une nouvelle proc&eacute;dure : <a href="'+url+'" target="_blank">'+message_info.description+'</a></span>';
break;
case 'PE':
var url = databap.getProcLink(message_info.message);
var url = databap.getInternalLink('proc', message_info.message);
msg_body = '<span class="text">'+message_info.nickname+' a modifi&eacute; la proc&eacute;dure <a href="'+url+'" target="_blank">'+message_info.description+'</a></span>';
break;
case 'M':
@@ -647,24 +728,25 @@ function addMessage(message_info, bReset)
break;
case 'I':
var msg = '<a href="'+message_info.message[3]+'" target="_blank"><img src="'+message_info.message[0]+'" width="'+message_info.message[1]+'" height="'+message_info.message[2]+'" class="proxy"></a>';
msg_body = '<a class="user clickable" title="Ecrire un PM &agrave; '+message_info.nickname+'">'+message_info.nickname+'</a><span class="console">&gt;</span><span class="text">'+msg+'</span>';
msg_body = sMsgPrefix+'<span class="text">'+msg+'</span>';
break;
case '9':
var msg = '<a href="'+message_info.message.url+'" target="_blank" title="'+message_info.message.title+'"><img src="'+message_info.message.url_img+'" width="'+message_info.message.width+'" height="'+message_info.message.height+'" class="proxy" /></a>';
msg_body = '<a class="user clickable" title="Ecrire un PM &agrave; '+message_info.nickname+'">'+message_info.nickname+'</a><span class="console">&gt;</span><span class="text">'+msg+'</span>';
msg_body = sMsgPrefix+'<span class="text">'+msg+'</span>';
break;
case 'R':
if(!bReset)
{
msg_body = '<span class="text action">'+message_info.message+'</span>';
setTimeout('databap.tmp(\'refresh\', true);databap.goTo(databap.vars.current_page);', databap.consts.reboot_delay*1000);
setTimeout(databap.refresh, databap.consts.reboot_delay*1000);
}
break;
case 'V':
if(!bReset) joinChan(sChanKeyName, false, [], false);
break;
case 'B':
msg_body = '<span class="text action">Nouvel article sur le blog BI de SAP : <a href="'+databap.getExternalLink('a', message_info.message)+'" target="_blank">'+message_info.art_title+'</a> ';
var url = databap.getInternalLink('a', message_info.message);
msg_body = '<span class="text action">Nouvel article sur le blog BI de SAP : <a href="'+url+'" target="_blank">'+message_info.art_title+'</a> ';
msg_body+= 'par <a title="Lien vers la page de l\'auteur" href="'+message_info.link_auth+'" target="_blank">'+message_info.name+'</a> ('+message_info.art_date+')'+'</span>';
break;
case 'S':
@@ -672,13 +754,21 @@ function addMessage(message_info, bReset)
msg_body = '<span class="text action">'+message_info.nickname+' '+message_info.message+'</span>';
break;
case 'DA':
var url = databap.getExternalLink('doc', message_info.message);
var url = databap.getInternalLink('doc', message_info.message);
msg_body = '<span class="text">'+message_info.nickname+' a ajout&eacute; une nouvelle documentation : <a href="'+url+'" target="_blank">'+message_info.description+'</a></span>';
break;
case 'DE':
var url = databap.getExternalLink('doc', message_info.message);
var url = databap.getInternalLink('doc', message_info.message);
msg_body = '<span class="text">'+message_info.nickname+' a modifi&eacute; la documentation <a href="'+url+'" target="_blank">'+message_info.description+'</a></span>';
break;
case 'TA':
var url = databap.getInternalLink('table', message_info.message);
msg_body = '<span class="text">'+message_info.nickname+' a ajout&eacute; une nouvelle table : <a href="'+url+'" target="_blank">'+message_info.description+'</a></span>';
break;
case 'TE':
var url = databap.getInternalLink('table', message_info.message);
msg_body = '<span class="text">'+message_info.nickname+' a modifi&eacute; la table <a href="'+url+'" target="_blank">'+message_info.description+'</a></span>';
break;
}
if(msg_body != '')
@@ -693,7 +783,7 @@ function addMessage(message_info, bReset)
function refresh_users()
{
if(typeof oUserTimer != "undefined") clearTimeout(oUserTimer);
if(databap.vars.current_page == databap.pages.chat)
if(databap.vars.current_page == 'chat')
{
var delay = databap.consts.keep_alive / 10; //seconds
databap.getInfo
@@ -713,19 +803,20 @@ function refresh_users()
$.each
(
chan_info,
function(id_user, user_info)
function(key, user_info)
{
var sNickName = user_info.nickname.replace('"', '\'');
users_list.push(sNickName);
var afk = (user_info.afk=='1')?'<img src="'+databap.consts.app_image_folder+'afk.png" class="afk" />':'';
var profileLink = databap.getExternalLink('profil', user_info.id_user);
var mission = 'Mission actuelle : '+user_info.status;
var profileLink = databap.getInternalLink('profil', user_info.id_user);
var mission = 'Mission actuelle : '+(user_info.status || 'Aucune');
var pm = 'Cliquez pour lancer un channel privé avec '+user_info.name+' ('+user_info.company+')';
var user = '<p class="class_'+sChankeyName+'">'
+'<a href="'+profileLink+'" title="'+mission+'" target="_blank"><img src="'+databap.consts.app_image_folder+user_info.logo+'" style="vertical-align:middle" />'+afk+'</a>'
+'<a class="connectedUser clickable '+sNickName+'" id="'+user_info.id_user+'" title="'+pm+'">'+sNickName+'</a>'
+'</p>';
$user = $(user).css("visibility", "hidden");
var user = $('<p>', {'class':'connected_user class_'+sChankeyName})
.append($('<a>', {'class':'connected_user_logo', href:profileLink, title:mission, target:'_blank'})
.append($('<img>', {src:databap.consts.app_image_folder+user_info.logo}))
.append((user_info.afk=='1')?$('<i>', {class:'fa fa-c-afk afk'}):''))
.append($('<a>', {'class':'connected_user_name clickable '+sNickName, id:user_info.id_user, title:pm}).text(sNickName));
$user = $(user)/*.css("visibility", "hidden")*/;
$user.find('.connectedUser').click(joinPmChan);
databap.getMainElem('#connected_users').append($user);
}
@@ -734,7 +825,7 @@ function refresh_users()
);
//Resize Nickname
var iMaxSize = 126 - 24 - 5; //boxSize - imageSize - marginLeftSize
/*var iMaxSize = 126 - 24 - 5; //boxSize - imageSize - marginLeftSize
$.each
(
users_list,
@@ -751,7 +842,7 @@ function refresh_users()
$nick.parent().css("visibility", "visible");
});
}
);
);*/
switchChan();
},
@@ -793,9 +884,15 @@ function displayHelp()
//Visible on all channels
$Help.find('p').addClass('class_'+databap.consts.all_chan_id);
$Help.appendTo('#chat_messages').slideDown('fast', function(){oScrollbar.tinyscrollbar_update('bottom');});
$Help.appendTo('#chat_messages').slideDown('fast', function()
{
databap.updateScrollBar('bottom');
});
//Close button activation
$Help.find('#close_help').click(function(){$(this).closest('.help').slideUp('fast', function(){oScrollbar.tinyscrollbar_update('bottom');});});
$Help.find('#close_help').click(function(){$(this).closest('.help').slideUp('fast', function()
{
databap.updateScrollBar('bottom');
});});
}
</script>