{% extends "base.html" %} {% block title_row %}{% endblock %} {% block title_ruler %}{% endblock %} {% block title %} {{_('Chat Box')}} {% endblock %} {% block js_media %} <script type="text/javascript" src="{{ static('mathjax_config.js') }}"></script> <script type="text/javascript" src="{{ static('event.js') }}"></script> <script type="text/javascript"> window.currentPage = 1; function load_page(page) { $.get('?page=' + page) .fail(function() { console.log("Fail to load page " + page); }) .done(function(data) { setTimeout(function() { let container = $('#chat-box'); let lastMsgPos = scrollTopOfBottom(container) $('#loader').hide(); $('#chat-log').prepend(data); remove_day_if_today(); container.scrollTop(scrollTopOfBottom(container) - lastMsgPos); }, 500); }) } function scrollTopOfBottom(container) { return container[0].scrollHeight - container.innerHeight() } function scrollContainer(container, loader) { container.scroll(function() { if (container.scrollTop() == 0) { if (currentPage < {{paginator.num_pages}}) { currentPage++; loader.show(); load_page(currentPage); } } })} function remove_day_if_today() { $('.message_date').each(function() { sent_date = $(this).html() if (sent_date === "{{today}}") { $(this).hide(); } }) } window.load_dynamic_update = function (last_msg) { return new EventReceiver( "{{ EVENT_DAEMON_LOCATION }}", "{{ EVENT_DAEMON_POLL_LOCATION }}", ['chat'], last_msg, function (message) { switch (message.type) { case 'new_message': add_new_message(message.message); break; } } ); } function add_new_message(message) { // console.log(message); $.get({ url: "{{ url('chat_message_ajax') }}", data: { message: message, }, success: function (data) { $('#chat-log').append($(data)); $('#chat-box').scrollTop($('#chat-box')[0].scrollHeight) MathJax.Hub.Queue(["Typeset",MathJax.Hub]); }, error: function (data) { if (data.status === 403) console.log('No right to see: ' + message); else { console.log('Could not load chat message:'); console.log(data.responseText); } } }); } $(function() { $('#loader').hide(); scrollContainer($('#chat-box'), $('#loader')) {% if request.user.is_staff %} $(document).on("click", ".chatbtn_remove_mess", function() { var elt = $(this); $.ajax({ url: "{{ url('delete_chat_message') }}", type: 'post', data: { message: elt.attr('value'), }, dataType: 'json', success: function(data){ elt.closest('li').hide(); }, fail: function(data) { alert('Fail to delete'); }, }); }); {% endif %} $("#chat-submit").click(function() { if ($("#chat-input").val().trim()) { let body = $('#chat-input').val().trim(); let img = '{{ gravatar(request.user, 32) }}'; message = { body: body, }; $('#chat-input').val(''); $.post("{{ url('post_chat_message') }}", message) .fail(function(res) { console.log('Fail to send message'); }) .done(function(res, status) { $('#chat-input').focus(); }) } }); $("#chat-log").change(function() { $('#chat-log').scrollTop($('#chat-log')[0].scrollHeight); }); $('#chat-input').focus(); $('#chat-input').keydown(function(e) { if (e.keyCode === 13) { if (e.ctrlKey || e.shiftKey) { var val = this.value; if (typeof this.selectionStart == "number" && typeof this.selectionEnd == "number") { var start = this.selectionStart; this.value = val.slice(0, start) + "\n" + val.slice(this.selectionEnd); this.selectionStart = this.selectionEnd = start + 1; } else if (document.selection && document.selection.createRange) { this.focus(); var range = document.selection.createRange(); range.text = "\r\n"; range.collapse(false); range.select(); } } else { e.preventDefault(); $('#chat-submit').click(); } return false } return true }); $('.chat-right-panel').hide(); $('#chat-tab').find('a').click(function (e) { e.preventDefault(); $('#chat-tab').addClass('active'); $('#online-tab').removeClass('active'); $('.chat-left-panel').show(); $('.chat-right-panel').hide(); }); $('#online-tab').find('a').click(function (e) { e.preventDefault(); $('#online-tab').addClass('active'); $('#chat-tab').removeClass('active'); $('.chat-left-panel').hide(); $('.chat-right-panel').show(); }); $('#refresh-button').on('click', function() { $.get("{{url('online_status_ajax')}}") .fail(function() { console.log("Fail to get online status"); }) .done(function(data) { if (data.status == 403) { console.log("Fail to retrieve data"); } else { $('#chat-online-content').html(data).find('.toggle').each(function () { register_toggle($(this)); });; } }) }) setInterval(function() { $('#refresh-button').click(); }, 5 * 60 * 1000); $('#chat-box').scrollTop($('#chat-box')[0].scrollHeight); remove_day_if_today(); load_dynamic_update({{last_msg}}); }); </script> {% endblock js_media %} {% block media %} <style> #content { margin-top: -0.5em; } #refresh-button { padding: 0; margin-left: auto; margin-right: 0.3em; background: transparent; border: none; height: 1.5em; width: 1.5em; } #refresh-button:hover { background: lightgreen; -webkit-transform: rotate(360deg); transform: rotate(360deg); transition: 1.5s ease-in-out; } .status-pic { height: 1.3em; width: 1.3em; border-radius: 0.3em; } .status-container { position: relative; display: inline-flex; } .status-circle { position: absolute; bottom: 0; right: 0; cx: 18px; cy: 18px; r: 4.5px; stroke: white; stroke-width: 1; } .status-row { display: flex; margin-bottom: 0.5em; font-size: 15px; } .status-list { padding: 0; } .status-section-title { cursor: pointer; margin-top: 0.5em; } ::-webkit-scrollbar { width: 20px; } ::-webkit-scrollbar-track { background-color: transparent; } ::-webkit-scrollbar-thumb { background-color: #d6dee1; border-radius: 20px; border: 6px solid transparent; background-clip: content-box; } ::-webkit-scrollbar-thumb:hover { background-color: #a8bbbf; } @media (min-width: 800px) { #page-container { position:fixed; overflow:hidden; } } #page-container { width: 100%; } </style> {% endblock media %} {% block body %} {% csrf_token %} {% block before_posts %}{% endblock %} <div id="mobile" class="tabs"> <ul> <li id="chat-tab" class="tab active"><a href="#"> <i class="tab-icon fa fa-comments"></i> {{ _('Chat') }} </a></li> <li id="online-tab" class="tab"><a href="#"><i class="tab-icon fa fa-wifi"></i> {{ _('Online Users') }}</a></li> </ul> </div> <div id="chat-container"> <div id="chat-area" class="chat-left-panel"> <div id="chat-box"> <img src="http://opengraphicdesign.com/wp-content/uploads/2009/01/loader64.gif" id="loader"> <ul id="chat-log"> {% include 'chat/message_list.html' %} </ul> </div> <textarea id="chat-input" placeholder="{{_('Enter your message')}}"></textarea> </div> <button id="chat-submit" style="display:none;"> Send </button> <div id="chat-online" class="chat-right-panel sidebox"> <h3 style="display:flex"> {{_('Online Users')}} <button id="refresh-button" title="{{_('Refresh')}}"> <img src="/reload.png" width="100%" > </button> </h3> <div id="chat-online-content"> {% include "chat/online_status.html" %} </div> </div> </div> {% endblock body %}