#ARC-18 chat.js add archive

remotes/origin/PR-39
Mukhtar 9 years ago
parent c8b8e665f4
commit 229588d23d
  1. 8
      assets/css/main.css
  2. 58
      assets/js/chat.js
  3. 46
      assets/js/chat_customer.js
  4. 19
      chat/chat.py
  5. 6
      chat/templates/chat_customer.html
  6. 10
      projects/serializers.py
  7. 2
      templates/partials/base.html
  8. 4
      users/templates/contractor_filter.html
  9. 10
      users/templates/contractor_office.html
  10. 2
      users/templates/contractor_profile.html
  11. 2
      users/templates/partials/customer_profile_info_block.html
  12. 2
      users/templates/team_profile.html

@ -3770,7 +3770,7 @@ input[type="checkbox"]:checked + span {
padding: 30px 0 0 0; padding: 30px 0 0 0;
} }
.orderBlock { .orderBlock, .trashedOrderBlock {
width: 100%; width: 100%;
float: left; float: left;
margin-bottom: -1px; margin-bottom: -1px;
@ -3785,7 +3785,7 @@ input[type="checkbox"]:checked + span {
transition: all 0.3s ease-out; transition: all 0.3s ease-out;
} }
.orderBlock:hover { .orderBlock:hover, .trashedOrderBlock:hover {
background-color: white; background-color: white;
border-top: 1px solid black; border-top: 1px solid black;
border-bottom: 1px solid black; border-bottom: 1px solid black;
@ -3886,7 +3886,7 @@ input[type="checkbox"]:checked + span {
transition: all 0.3s ease-out; transition: all 0.3s ease-out;
} }
.orderBlock:hover .dimovChat { .orderBlock:hover .dimovChat,.trashedOrderBlock:hover .dimovChat {
-webkit-transform: rotate(90deg); -webkit-transform: rotate(90deg);
-moz-transform: rotate(90deg); -moz-transform: rotate(90deg);
transform: rotate(90deg); transform: rotate(90deg);
@ -3898,7 +3898,7 @@ input[type="checkbox"]:checked + span {
transform: rotate(90deg); transform: rotate(90deg);
} }
.orderBlock:hover .hideOBB { .orderBlock:hover .hideOBB,.trashedOrderBlock:hover .hideOBB {
display: block; display: block;
} }

@ -184,38 +184,60 @@ function dialog (message, yesCallback, notCallback) {
$("a[href='#tab1']").trigger('click'); $("a[href='#tab1']").trigger('click');
} }
$("#trashed-button").on('click',function(e){
e.preventDefault();
var trashedOrderHtml = ""; $(".messageBlock").on('click','.trashedOrderBlock',function(){
$("#chat-order-add").css("display", "none");
$('.order-block, .trashedOrderBlock').each(function () {
$(this).removeClass('orAct');
});
$(this).addClass('orAct');
var inbox = document.getElementById('message-chat-order-space');
var docList = document.getElementById('documentOrderSpace');
inbox.innerHTML = '';
docList.innerHTML = '';
var orderId = $(this).attr('data-id');
location.hash = '#order' + orderId;
$.ajax({ $.ajax({
url: '/api/orders/', url: '/api/message',
type: 'GET', type: 'GET',
data: {csrfmiddlewaretoken: csrftoken, 'order': orderId, 'team__isnull': 'true'},
dataType: 'json', dataType: 'json',
success: function (json) { success: function (json) {
console.log(json.results);
$.each(json.results, function (i, v) { $.each(json.results, function (i, v) {
var temp = '<div class="orderBlock box-sizing"><span class="dimovChat"></span>' + var senderName = 'Вы';
'<p class="titleOB">'+ v.project.name +'</p><div class="hideOBB"><p class="pOB">' + var className = 'youChat';
'<span>Исполнитель:</span> </p>' +
'<a href="#" class="linkChat11 full-order-info">' + if (v.sender.id !== userId) {
'<span class="glyphicon glyphicon-info-sign" aria-hidden="true">' + senderName = v.sender.username;
'</span>Полное описание заказа </a></div></div>'; className = '';
}
inbox.innerHTML += '<div class="col-lg-12 insetCommChat ' + className + '"><div class="topCommChat">' +
'<p class="nameCommChat">' + senderName + '</p><span>' + v.created + '</span></div>' +
'<p class="textCommChat">' + v.text + '</p></div>';
trashedOrderHtml += temp;
}); });
$("#trashed-orders").html(trashedOrderHtml); var height = inbox.scrollHeight;
}, inbox.scrollTop = height;
error: function(e, jqxhr){
console.log(e);
} }
}) });
$("#order-stages").html("");
$("#completeWork").hide();
$("#add-form-order-note").hide();
}); });
// Информация о заказе // Информация о заказе
$(".full-order-info").click('on', function (e) { $(".messageBlock").on('click','.full-order-info', function (e) {
e.preventDefault(); e.preventDefault();
e.stopPropagation(); e.stopPropagation();
var orderId = $(this).closest('.orderBlock').attr('data-id'); var orderId = $(this).closest('.orderBlock').attr('data-id');
if (!orderId){
orderId = $(this).closest('.trashedOrderBlock').attr('data-id');
}
$.ajax({ $.ajax({
url: '/api/orders/' + orderId + '/', url: '/api/orders/' + orderId + '/',
data: { data: {

@ -408,9 +408,55 @@ $(function () {
} }
}); });
$("#trashed-button").on('click',function(e){
e.preventDefault();
var state = $(this).attr('data-show');
var trashedOrderHtml = "";
if (state == 'true') {
$(this).attr('data-show','false');
$(this).text("Скрыть архивные заказы");
$.ajax({
url: '/api/orders/',
type: 'GET',
dataType: 'json',
success: function (json) {
console.log(json.results);
$.each(json.results, function (i, v) {
var temp = '<div data-id="'+ v.id +'" class="trashedOrderBlock box-sizing"><span class="dimovChat"></span>' +
'<p class="titleOB">' + v.project.name + '</p><div class="hideOBB"><p class="pOB">' +
'<span>Исполнитель:</span>'+ v.contractor_name +' </p>' +
'<a href="#" class="linkChat11 full-order-info">' +
'<span class="glyphicon glyphicon-info-sign" aria-hidden="true">' +
'</span>Полное описание заказа </a></div></div>';
trashedOrderHtml += temp;
});
$("#trashed-orders").html(trashedOrderHtml);
},
error: function (e, jqxhr) {
console.log(e);
}
});
}else {
$(this).attr('data-show','true');
$(this).text("Показать архивные заказы");
$("#trashed-orders").html("");
}
});
// Для заказов все вытащить // Для заказов все вытащить
$('.order-block').on('click', function () { $('.order-block').on('click', function () {
$("#chat-order-add").css("display", "block"); $("#chat-order-add").css("display", "block");
$("#add-form-order-note").css("display", "block");
$("#formsetStage").css("display", "block"); $("#formsetStage").css("display", "block");
$('.order-block').each(function () { $('.order-block').each(function () {

@ -43,17 +43,16 @@ class ChatHandler(websocket.WebSocketHandler):
@gen.coroutine @gen.coroutine
def approve_stages(self, data): def approve_stages(self, data):
print(data)
data['data']['chat_message'] = data['data']['msg'] data['data']['chat_message'] = data['data']['msg']
self.add_message(data) self.add_message(data)
sender_id = data['data']['sender_id'] # sender_id = data['data']['sender_id']
recipent_id = data['data']['recipent_id'] # recipent_id = data['data']['recipent_id']
order_id = data['data'].get('order_id') # order_id = data['data'].get('order_id')
message = data['data'].get('msg', 'Этапы обновлены') # message = data['data'].get('msg', 'Этапы обновлены')
answer_type = data['format_type'] # answer_type = data['format_type']
waiters = tuple(w for c, w in self.waiters if c == recipent_id or c == sender_id) # waiters = tuple(w for c, w in self.waiters if c == recipent_id or c == sender_id)
for waiter in waiters: # for waiter in waiters:
waiter.write_message({'msg': message, 'order_id': order_id, 'answer_type': answer_type}) # waiter.write_message({'msg': message, 'order_id': order_id, 'answer_type': answer_type})
@gen.coroutine @gen.coroutine
def add_message(self, message_data): def add_message(self, message_data):
@ -71,6 +70,8 @@ class ChatHandler(websocket.WebSocketHandler):
docs_links = '' docs_links = ''
docs_attach = '' docs_attach = ''
message_type = message_data.get('message_type', None)
if not message_type:
message = html.escape(message) message = html.escape(message)
message = message.replace('\n', '<br />') message = message.replace('\n', '<br />')

@ -148,17 +148,17 @@
{% endfor %} {% endfor %}
<div class="textAreaBlock2 FFD box-sizing disTab"> <div class="textAreaBlock2 FFD box-sizing disTab">
<a href="#" id="trashed-button">Показать архивные заказы</a> <a href="#" data-show="true" id="trashed-button">Показать архивные заказы</a>
</div> </div>
<p>Архивные заказы</p> <p id="show-archive-label">Архивные заказы</p>
<div id="trashed-orders"></div> <div id="trashed-orders"></div>
</div> </div>
</div> </div>
<div class="col-lg-6 commChat"> <div class="col-lg-6 commChat">
<div id="message-chat-order-space"></div> <div id="message-chat-order-space"></div>
<form id="chat-order-add"> <form id="chat-order-add" style="display:none;">
<input type="hidden" name="senderId" id="senderId" value="{{ request.user.pk }}"/> <input type="hidden" name="senderId" id="senderId" value="{{ request.user.pk }}"/>
<input type="hidden" name="recipentId" id="recipentId"> <input type="hidden" name="recipentId" id="recipentId">
<input type="hidden" name="orderId" id="orderId"> <input type="hidden" name="orderId" id="orderId">

@ -204,6 +204,7 @@ class OrderSerializer(ModelSerializer):
stages = StageSerializer(many=True, read_only=True) stages = StageSerializer(many=True, read_only=True)
project = ProjectSerializer(read_only=True) project = ProjectSerializer(read_only=True)
has_user_review = serializers.SerializerMethodField(read_only=True) has_user_review = serializers.SerializerMethodField(read_only=True)
contractor_name = serializers.SerializerMethodField(read_only=True)
class Meta: class Meta:
model = Order model = Order
@ -219,8 +220,17 @@ class OrderSerializer(ModelSerializer):
'has_user_review', 'has_user_review',
'stages', 'stages',
'project', 'project',
'contractor_name',
) )
def get_contractor_name(self, obj):
if obj.contractor:
return obj.contractor.get_full_name() or obj.contractor.username
elif obj.team:
return obj.team.owner.get_full_name() or obj.team.owner.username
else:
return 'Исполнитель не определен'
def get_has_user_review(self, obj): def get_has_user_review(self, obj):
curr_user = self.context['request'].user curr_user = self.context['request'].user
if curr_user.is_customer(): if curr_user.is_customer():

@ -90,7 +90,6 @@
var sock = new WebSocket(url); var sock = new WebSocket(url);
var intervalId; var intervalId;
sock.onopen = function () { sock.onopen = function () {
//console.log("Start connect");
intervalId = setInterval(function () { intervalId = setInterval(function () {
sock.send('{"dummy": 1}'); sock.send('{"dummy": 1}');
}, 15000); }, 15000);
@ -104,7 +103,6 @@
}else if((notificationData.answer_type == 'approve_stages') || (notificationData.answer_type == 'add_message_order')){ }else if((notificationData.answer_type == 'approve_stages') || (notificationData.answer_type == 'add_message_order')){
outMessage += "<a href='/chat/#order" + notificationData.order_id + "'>"+ notificationData.msg +"<a>"; outMessage += "<a href='/chat/#order" + notificationData.order_id + "'>"+ notificationData.msg +"<a>";
} }
$.jGrowl("Вам пришло новое сообщение!<br />" + outMessage, { life: 15000}); $.jGrowl("Вам пришло новое сообщение!<br />" + outMessage, { life: 15000});
}; };
this.add_message = function (messageData) { this.add_message = function (messageData) {

@ -214,7 +214,7 @@
{% endif %} {% endif %}
</li> </li>
<li> <li>
<a href="{% url 'chat:chat-user' %}?user_id={{ team.owner.pk }}"> <a href="{% url 'chat:chat-user' %}?user_id={{ team.owner.pk }}#user{{ team.owner.pk }}">
написать сообщение написать сообщение
</a> </a>
</li> </li>
@ -335,7 +335,7 @@
{% endif %} {% endif %}
<li> <li>
<a href="{% url 'chat:chat-user' %}?user_id={{ contractor.pk }}"> <a href="{% url 'chat:chat-user' %}?user_id={{ contractor.pk }}#user{{ contractor.pk }}">
написать сообщение написать сообщение
</a> </a>
</li> </li>

@ -298,10 +298,8 @@
var $moreWorkSellsfBtn = $('.-more-work-sells-btn').first() var $moreWorkSellsfBtn = $('.-more-work-sells-btn').first()
var workSellAbsUrl = '/work_sell/' var workSellAbsUrl = '/work_sell/'
var contractorId = var contractorId ={{ contractor.pk }}
{{ contractor.pk }} var teamId ={{ contractor.team.pk }}
var teamId =
{{ contractor.team.pk }}
var contractorIds = [contractorId] var contractorIds = [contractorId]
var portfUrl = new URI('/api/portfolios/') var portfUrl = new URI('/api/portfolios/')
@ -387,11 +385,11 @@
if (res.status === 'success') { if (res.status === 'success') {
socketMain.add_message({ socketMain.add_message({
format_type: 'add_message_contact', format_type: 'add_message_contact',
message_type: 'invite_team',
data: { data: {
sender_id: '{{ contractor.pk }}', sender_id: '{{ contractor.pk }}',
recipent_id: String(contractor2Id), recipent_id: String(contractor2Id),
chat_message: 'Приглашаю в группу http://{{ request.get_host }}{% url 'users:accept-team-invitation' owner_id=contractor.pk %}', chat_message: 'Приглашаю в группу <a href="http://{{ request.get_host }}{% url 'users:accept-team-invitation' owner_id=contractor.pk %}">http://{{ request.get_host }}{% url 'users:accept-team-invitation' owner_id=contractor.pk %}</a>',
}, },
}) })

@ -44,7 +44,7 @@
{% if contractor.pk != request.user.pk %} {% if contractor.pk != request.user.pk %}
<li class="icon_um3"> <li class="icon_um3">
<a href="{% url 'chat:chat-user' %}?user_id={{ contractor.pk }}"> <a href="{% url 'chat:chat-user' %}?user_id={{ contractor.pk }}#user{{ contractor.pk }}">
написать сообщение написать сообщение
</a> </a>
<span></span> <span></span>

@ -34,7 +34,7 @@
<div class="col-lg-4"> <div class="col-lg-4">
{% if request.user.pk != customer.pk %} {% if request.user.pk != customer.pk %}
<a href="javascript:void(0)" class="new-prop new-prop1">показать контакты</a> <a href="javascript:void(0)" class="new-prop new-prop1">показать контакты</a>
<a href="{% url 'chat:chat-user' %}?user_id={{ pk }}" class="new-prop new-prop2">написать сообщение</a> <a href="{% url 'chat:chat-user' %}?user_id={{ pk }}#user{{ pk }}" class="new-prop new-prop2">написать сообщение</a>
{% else %} {% else %}
<a href="{% url 'users:user-profile-edit' pk=pk %}" class="new-red">редактировать профиль</a> <a href="{% url 'users:user-profile-edit' pk=pk %}" class="new-red">редактировать профиль</a>
{% endif %} {% endif %}

@ -77,7 +77,7 @@
<div class="statusUser busy">Занят</div> <div class="statusUser busy">Занят</div>
{% endif %} {% endif %}
<a href="{% url 'chat:chat-user' %}?user_id={{ team.owner.pk }}" class="new-prop new-prop2 new-prop3">написать сообщение</a> <a href="{% url 'chat:chat-user' %}?user_id={{ team.owner.pk }}#user{{ team.owner.pk }}" class="new-prop new-prop2 new-prop3">написать сообщение</a>
</div> </div>
<div class="col-lg-4"> <div class="col-lg-4">

Loading…
Cancel
Save