Merge remote-tracking branch 'origin/main'
This commit is contained in:
@@ -15,7 +15,7 @@ urlpatterns = [
|
||||
|
||||
path('my_routes/', my_routes_ajax, name='my_routes_ajax'),
|
||||
path('subscribe/', subscribe_ajax, name='subscribe_ajax'),
|
||||
path('new_msg_to_user/', new_msg_to_user_ajax, name='new_msg_to_user' ),
|
||||
path('chats/', chats_ajax, name='chats_ajax'),
|
||||
|
||||
path('support_tickets/', support_tickets_ajax, name='support_tickets_ajax'),
|
||||
|
||||
|
||||
@@ -25,14 +25,14 @@ def subscribe_ajax(request):
|
||||
return JsonResponse({'html': html}, status=200)
|
||||
|
||||
@login_required(login_url='/profile/login/')
|
||||
def new_msg_to_user_ajax(request):
|
||||
def chats_ajax(request):
|
||||
if request.method != 'POST':
|
||||
raise Http404
|
||||
|
||||
Dict = {
|
||||
}
|
||||
|
||||
html = render_to_string('blocks/profile/b_new_msg_to_user.html', Dict, request=request)
|
||||
html = render_to_string('blocks/profile/b_chats.html', Dict, request=request)
|
||||
return JsonResponse({'html': html}, status=200)
|
||||
|
||||
@login_required(login_url='/profile/login/')
|
||||
|
||||
@@ -9,6 +9,8 @@ urlpatterns = [
|
||||
|
||||
path('registration/', registration_View, name='registration_page'),
|
||||
path('', user_profile_View, name='user_profile'),
|
||||
path('chat/<int:user_id>/', chat_w_user_View, name='chat_w_user'),
|
||||
path('chat/', chat_w_user_View, name='chat_w_user_wo_user_id'),
|
||||
path('login/', login_View, name='login_profile'),
|
||||
|
||||
|
||||
|
||||
@@ -22,6 +22,34 @@ def registration_View(request):
|
||||
return HttpResponse(t.render(Dict, request))
|
||||
|
||||
|
||||
|
||||
@login_required(login_url='/profile/login/')
|
||||
def chat_w_user_View(request, user_id=None):
|
||||
from ChatServiceApp.funcs import get_chat_receivers_for_user, get_msgs_for_chat_w_users
|
||||
|
||||
receivers = get_chat_receivers_for_user(request.user)
|
||||
|
||||
cur_chat_msgs = None
|
||||
|
||||
try:
|
||||
cur_receiver = User.objects.get(id=user_id)
|
||||
if not cur_receiver in receivers:
|
||||
receivers.insert(0, cur_receiver)
|
||||
cur_chat_msgs = get_msgs_for_chat_w_users(request.user, cur_receiver)
|
||||
except User.DoesNotExist:
|
||||
cur_receiver = None
|
||||
|
||||
|
||||
Dict = {
|
||||
'page': 'chat',
|
||||
'cur_receiver': cur_receiver,
|
||||
'receivers': receivers,
|
||||
'messages':cur_chat_msgs
|
||||
}
|
||||
|
||||
t = loader.get_template('pages/profile/p_user_profile.html')
|
||||
return HttpResponse(t.render(Dict, request))
|
||||
|
||||
@login_required(login_url='/profile/login/')
|
||||
def user_profile_View(request):
|
||||
|
||||
|
||||
@@ -1,4 +1,27 @@
|
||||
from .models import *
|
||||
from django.db.models import Q
|
||||
|
||||
|
||||
def get_msgs_for_chat_w_users(user1, user2):
|
||||
|
||||
msgs = Message.objects.filter(
|
||||
Q(sender=user1) | Q(receiver=user1),
|
||||
Q(sender=user2) | Q(receiver=user2),
|
||||
group=None
|
||||
)
|
||||
return msgs
|
||||
|
||||
def get_chat_receivers_for_user(user):
|
||||
receivers = Message.objects.filter(
|
||||
Q(sender=user) | Q(receiver=user),
|
||||
group=None
|
||||
).order_by('-modifiedDT').values('sender', 'receiver')
|
||||
|
||||
receivers_list = []
|
||||
receivers_list.extend([item['sender'] for item in receivers if item['sender'] != user])
|
||||
receivers_list.extend([item['receiver'] for item in receivers if item['receiver'] != user])
|
||||
|
||||
return receivers_list
|
||||
|
||||
def get_messages_for_ticket(ticket):
|
||||
return ticket.rel_messages_for_group.filter(enable=True).order_by('-modifiedDT')
|
||||
|
||||
@@ -11,4 +11,5 @@ urlpatterns = [
|
||||
path('create_ticket/', create_ticket_ajax, name='create_ticket_ajax'),
|
||||
path('support_show_chat_by_ticket/', support_show_chat_by_ticket_ajax, name='support_show_chat_by_ticket_ajax'),
|
||||
path('send_msg/', send_msg_ajax, name='send_msg_ajax'),
|
||||
path('show_chat_w_user/', show_chat_w_user_ajax, name='show_chat_w_user_ajax'),
|
||||
]
|
||||
@@ -15,6 +15,34 @@ from .funcs import *
|
||||
import json
|
||||
|
||||
|
||||
@login_required(login_url='/profile/login/')
|
||||
def show_chat_w_user_ajax(request):
|
||||
|
||||
if request.method != 'POST':
|
||||
raise Http404
|
||||
|
||||
try:
|
||||
|
||||
data = json.loads(request.body)
|
||||
|
||||
from AuthApp.models import User
|
||||
cur_receiver = User.objects.get(id=data['user_id'])
|
||||
|
||||
Dict = {
|
||||
'cur_receiver': cur_receiver,
|
||||
'messages': get_msgs_for_chat_w_users(request.user, cur_receiver),
|
||||
}
|
||||
|
||||
tpl_name = 'blocks/profile/b_chats.html'
|
||||
|
||||
html = render_to_string(tpl_name, Dict, request=request)
|
||||
return JsonResponse({'html': html}, status=200)
|
||||
|
||||
except Exception as e:
|
||||
msg = f'show_chat_w_user_ajax Error = {str(e)}'
|
||||
return JsonResponse({'error': msg}, status=400)
|
||||
|
||||
|
||||
@login_required(login_url='/profile/login/')
|
||||
def send_msg_ajax(request):
|
||||
from AuthApp.models import User
|
||||
|
||||
@@ -17,10 +17,12 @@ def get_msg_side(cur_user, ticket, msg):
|
||||
return 'right'
|
||||
else:
|
||||
return 'left'
|
||||
else:
|
||||
elif ticket:
|
||||
if ticket.owner == cur_user:
|
||||
return 'right'
|
||||
else:
|
||||
return 'left'
|
||||
else:
|
||||
return 'right'
|
||||
|
||||
# return 'left'
|
||||
@@ -2,7 +2,7 @@ from sets.admin import *
|
||||
from .models import *
|
||||
from django.contrib import admin
|
||||
|
||||
class Admin_Route(Admin_Trans_BaseModelViewPage):
|
||||
class Admin_Route(Admin_Trans_BaseModel):
|
||||
list_display = [
|
||||
'id', 'type_transport', 'cargo_type',
|
||||
'departure_DT', 'from_address_point', 'from_place',
|
||||
@@ -10,4 +10,6 @@ class Admin_Route(Admin_Trans_BaseModelViewPage):
|
||||
'order', 'modifiedDT', 'createDT'
|
||||
]
|
||||
|
||||
list_display_links = ['id']
|
||||
|
||||
admin.site.register(Route,Admin_Route)
|
||||
|
||||
@@ -1,16 +1,21 @@
|
||||
from .models import *
|
||||
def get_routes_for_user(user):
|
||||
def get_routes_Dict(user=None):
|
||||
from ReferenceDataApp.models import Airport, Country, City
|
||||
|
||||
if not user and user.is_authenticated:
|
||||
errors_Dict = {
|
||||
'errors': {
|
||||
'all__': f'ошибка идентификации пользователя'
|
||||
}
|
||||
}
|
||||
return errors_Dict
|
||||
# if not user and user.is_authenticated:
|
||||
# errors_Dict = {
|
||||
# 'errors': {
|
||||
# 'all__': f'ошибка идентификации пользователя'
|
||||
# }
|
||||
# }
|
||||
# return errors_Dict
|
||||
kwargs = {}
|
||||
if user:
|
||||
kwargs.update({
|
||||
'owner': user
|
||||
})
|
||||
|
||||
routes = Route.objects.filter(owner=user)
|
||||
routes = Route.objects.filter(**kwargs).order_by('-modifiedDT')
|
||||
|
||||
res_Dict = {}
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@ from datetime import datetime
|
||||
from django.template.loader import render_to_string
|
||||
from django.urls import reverse
|
||||
from .forms import *
|
||||
from .funcs import get_routes_for_user
|
||||
from .funcs import get_routes_Dict
|
||||
|
||||
|
||||
def edit_route_ajax(request):
|
||||
@@ -153,7 +153,7 @@ def get_routes_ajax(request):
|
||||
raise Http404
|
||||
|
||||
try:
|
||||
routes_Dict = get_routes_for_user(request.user)
|
||||
routes_Dict = get_routes_Dict(request.user)
|
||||
if 'errors' in routes_Dict:
|
||||
return JsonResponse(routes_Dict, status=400)
|
||||
|
||||
@@ -209,7 +209,7 @@ def create_or_change_route_ajax(request, route_id=None):
|
||||
obj.owner = request.user
|
||||
obj.save()
|
||||
|
||||
routes_Dict = get_routes_for_user(request.user)
|
||||
routes_Dict = get_routes_Dict(request.user)
|
||||
|
||||
if 'errors' in routes_Dict:
|
||||
form.errors.update(routes_Dict['errors'])
|
||||
|
||||
10
RoutesApp/urls.py
Normal file
10
RoutesApp/urls.py
Normal file
@@ -0,0 +1,10 @@
|
||||
# coding=utf-8
|
||||
from django.urls import path
|
||||
from .views import *
|
||||
from django.contrib.auth import views
|
||||
|
||||
urlpatterns = [
|
||||
|
||||
path('route_search_results/', route_search_results_View, name='route_search_results_View'),
|
||||
|
||||
]
|
||||
@@ -1,3 +1,25 @@
|
||||
from django.shortcuts import render
|
||||
|
||||
# Create your views here.
|
||||
from uuid import uuid1
|
||||
from .models import *
|
||||
from django.contrib import auth
|
||||
from django.http import HttpResponse, Http404
|
||||
from django.template import loader, RequestContext
|
||||
from django.contrib.auth.decorators import login_required
|
||||
from BaseModels.mailSender import techSendMail
|
||||
from django.utils.translation import gettext as _
|
||||
from datetime import datetime
|
||||
from .funcs import *
|
||||
|
||||
def route_search_results_View(request):
|
||||
|
||||
Dict = {}
|
||||
|
||||
routes = get_routes_Dict()
|
||||
if routes:
|
||||
Dict = {
|
||||
'routes': routes['routes']
|
||||
}
|
||||
|
||||
t = loader.get_template('pages/p_results_find_route.html')
|
||||
return HttpResponse(t.render(Dict, request))
|
||||
|
||||
@@ -20,7 +20,10 @@ urlpatterns += i18n_patterns(
|
||||
path('profile/', include('AuthApp.urls')),
|
||||
|
||||
path('user_account/', include('AuthApp.js_urls')),
|
||||
|
||||
path('routes/', include('RoutesApp.js_urls')),
|
||||
path('routes/', include('RoutesApp.urls')),
|
||||
|
||||
path('messages/', include('ChatServiceApp.js_urls')),
|
||||
|
||||
path('reference_data/', include('ReferenceDataApp.js_urls')),
|
||||
|
||||
@@ -6,6 +6,31 @@
|
||||
width: 100% !important;
|
||||
}
|
||||
|
||||
|
||||
|
||||
.text-align-center{
|
||||
text-align: center;
|
||||
width: 100%;
|
||||
|
||||
}
|
||||
|
||||
|
||||
.title_page{
|
||||
font-size: 44px;
|
||||
color: #272424;
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
.cut-width{
|
||||
max-width: 1280px;
|
||||
margin: auto;
|
||||
}
|
||||
|
||||
.clear_both{
|
||||
clear: both;
|
||||
}
|
||||
|
||||
|
||||
/**/
|
||||
|
||||
.title-profile-cont{
|
||||
@@ -329,13 +354,14 @@
|
||||
}
|
||||
|
||||
.container-messages{
|
||||
height: 74%;
|
||||
height: calc(74% - 70px);
|
||||
width: 100%;
|
||||
/*transform: rotate(180deg);*/
|
||||
/* transform: rotate(180deg); */
|
||||
overflow-y: auto;
|
||||
/*transform: scaleY(-1);*/
|
||||
/* transform: scaleY(-1); */
|
||||
display: flex;
|
||||
flex-direction: column-reverse;
|
||||
padding-top: 70px;
|
||||
}
|
||||
|
||||
|
||||
@@ -512,6 +538,7 @@
|
||||
|
||||
.insert_users{
|
||||
/*min-height: 440px;*/
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
/*messgae*/
|
||||
@@ -581,7 +608,7 @@
|
||||
|
||||
.container_text_message{
|
||||
width: 100%;
|
||||
min-height: 60px;
|
||||
/*min-height: 60px;*/
|
||||
border-radius: 10px;
|
||||
}
|
||||
|
||||
@@ -634,4 +661,298 @@
|
||||
padding-top: 10px;
|
||||
border-top: 1px solid #E6E6E6;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
/*p_results_find_route*/
|
||||
|
||||
.container_form_search_carrier{
|
||||
height: 120px;
|
||||
width: 100%;
|
||||
background: #FFF;
|
||||
box-shadow: -1px 4px 10px 0 rgba(198, 199, 203, 0.20), 0 -1px 10px 0 rgba(198, 199, 203, 0.20);
|
||||
margin-top: 60px;
|
||||
margin-bottom: 40px;
|
||||
border-radius: 10px;
|
||||
}
|
||||
|
||||
.block-filters-find-route{
|
||||
min-height: 660px;
|
||||
background: #FFFFFF;
|
||||
box-shadow: -1px 4px 10px 0 rgba(198, 199, 203, 0.20), 0 -1px 10px 0 rgba(198, 199, 203, 0.20);
|
||||
width: 30%;
|
||||
float: left;
|
||||
}
|
||||
|
||||
.block-finded-routes{
|
||||
width: 68%;
|
||||
float: right;
|
||||
/*display: inline-block;*/
|
||||
}
|
||||
|
||||
.carrier-card{
|
||||
width: 100%;
|
||||
/*height: 830px;*/
|
||||
background: #FFFFFF;
|
||||
box-shadow: -1px 4px 10px 0 rgba(198, 199, 203, 0.20), 0 -1px 10px 0 rgba(198, 199, 203, 0.20);
|
||||
margin-bottom: 20px;
|
||||
border-radius: 10px;
|
||||
/*padding: 20px;*/
|
||||
}
|
||||
|
||||
.left-part-carrier-card{
|
||||
width: 58%;
|
||||
float: left;
|
||||
padding: 2%;
|
||||
border-right: 1px solid #E6E6E6;
|
||||
}
|
||||
|
||||
.first-line-card-carrier{
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.carrier-title{
|
||||
font-size: 20px;
|
||||
font-weight: 500;
|
||||
color: #272424;
|
||||
width: 50%;
|
||||
float: left;
|
||||
text-align: left;
|
||||
display: block;
|
||||
}
|
||||
|
||||
.type_transportation_carrier{
|
||||
width: 50%;
|
||||
float: right;
|
||||
text-align: -webkit-right;
|
||||
display: block;
|
||||
}
|
||||
|
||||
.from-to-country-container-carrier{
|
||||
width: calc(100% - 70px);
|
||||
margin: auto;
|
||||
background: #F8F8F8;
|
||||
box-shadow: -1px 4px 10px 0 rgba(198, 199, 203, 0.20), 0 -1px 10px 0 rgba(198, 199, 203, 0.20);
|
||||
padding-top: 20px;
|
||||
padding-bottom: 20px;
|
||||
padding-left: 35px;
|
||||
padding-right: 35px;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.from-to-country-text.left{
|
||||
color: #272424;
|
||||
font-size: 16px;
|
||||
font-weight: 500;
|
||||
width: 46%;
|
||||
/*padding-top: 20px;*/
|
||||
/*padding-bottom: 20px;*/
|
||||
/*padding-left: 80px;*/
|
||||
float: left;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
.from-to-country-text.right{
|
||||
color: #272424;
|
||||
font-size: 16px;
|
||||
font-weight: 500;
|
||||
width: 46%;
|
||||
/*padding-top: 20px;*/
|
||||
/*padding-bottom: 20px;*/
|
||||
/*padding-right: 80px;*/
|
||||
float: right;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
|
||||
.line_inf_about_moving{
|
||||
width: 100%;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.container_inf_about_moving.second{
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
.splitter-from-to-country{
|
||||
border: 1px solid #FF613A;
|
||||
width: 20px;
|
||||
display: inline-block;
|
||||
/*width: 5%;*/
|
||||
margin-bottom: 4px;
|
||||
margin-left: 9px;
|
||||
}
|
||||
|
||||
.container_inf_about_moving{
|
||||
display: block;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
|
||||
.carrier_inf_moving.left{
|
||||
width: 41%;
|
||||
float: left;
|
||||
text-align: left;
|
||||
}
|
||||
.carrier_inf_moving.right{
|
||||
width: 41%;
|
||||
float: right;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
.splliter-left-right-part-carrier-card{
|
||||
border: 1px solid #E6E6E6;
|
||||
height: 100%;
|
||||
display: inline-block;
|
||||
transform: rotate(180deg) ;
|
||||
position: relative;
|
||||
left: 70%;
|
||||
}
|
||||
|
||||
.inf_carrier{
|
||||
padding-top: 15px;
|
||||
display: block;
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
|
||||
.phones_carrier{
|
||||
text-decoration: none;
|
||||
color: #000000;
|
||||
font-size: 16px;
|
||||
padding-bottom: 10px;
|
||||
display: block;
|
||||
}
|
||||
|
||||
.phones_carrier_span{
|
||||
position: relative;
|
||||
top: 6px;
|
||||
background: linear-gradient(99deg, #040404 56%, #9f9f9f 25%, #ffffff);
|
||||
-webkit-background-clip: text;
|
||||
-webkit-text-fill-color: transparent;
|
||||
transition: 200ms;
|
||||
width: calc(90% - 10px);
|
||||
overflow: hidden;
|
||||
float: right;
|
||||
padding-right: 10px;
|
||||
}
|
||||
|
||||
.inf_carrier_icon{
|
||||
width: 10%;
|
||||
}
|
||||
|
||||
.phones_carrier_span.active{
|
||||
background: unset;
|
||||
-webkit-background-clip: unset;
|
||||
-webkit-text-fill-color: unset;
|
||||
overflow: unset;
|
||||
overflow-wrap: break-word;
|
||||
}
|
||||
|
||||
.phones_carrier input{
|
||||
display: none;
|
||||
}
|
||||
.email_carrier{
|
||||
text-decoration: none;
|
||||
color: #000000;
|
||||
font-size: 16px;
|
||||
padding-bottom: 10px;
|
||||
display: block;
|
||||
}
|
||||
|
||||
.email_carrier_span{
|
||||
position: relative;
|
||||
top: 5px;
|
||||
background: linear-gradient(99deg, #040404 2%, #f5f5f5 16%, #ffffff);
|
||||
-webkit-background-clip: text;
|
||||
-webkit-text-fill-color: transparent;
|
||||
transition: 200ms;
|
||||
width: calc(90% - 10px);
|
||||
float: right;
|
||||
overflow: hidden;
|
||||
padding-right: 10px;
|
||||
}
|
||||
|
||||
.email_carrier_span.active{
|
||||
background: unset;
|
||||
-webkit-background-clip: unset;
|
||||
-webkit-text-fill-color: unset;
|
||||
overflow: unset;
|
||||
overflow-wrap: break-word;
|
||||
}
|
||||
|
||||
.email_carrier input{
|
||||
display: none;
|
||||
}
|
||||
|
||||
.open_inf_carrier{
|
||||
font-size: 16px;
|
||||
font-weight: 500;
|
||||
color: #272424;
|
||||
border: 2px solid #FF613A;
|
||||
padding: 8px 16px;
|
||||
background: #FFFFFF;
|
||||
transition: 200ms;
|
||||
border-radius: 10px;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.open_inf_carrier:hover{
|
||||
background: #FF613A;
|
||||
color: #FFFFFF;
|
||||
}
|
||||
|
||||
|
||||
.open_chat_carrier{
|
||||
display: none;
|
||||
}
|
||||
|
||||
.open_chat_carrier.active{
|
||||
display: block;
|
||||
font-size: 16px;
|
||||
font-weight: 500;
|
||||
color: #272424;
|
||||
border: 2px solid #00a420;
|
||||
padding: 8px 16px;
|
||||
background: #FFFFFF;
|
||||
border-radius: 10px;
|
||||
width: 100%;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
/*.open_chat_carrier:hover{*/
|
||||
/* color: #FFFFFF;*/
|
||||
/* background: #00A420;*/
|
||||
/*}*/
|
||||
|
||||
.inf_carrier_container{
|
||||
width: 33%;
|
||||
float: right;
|
||||
padding: 2%;
|
||||
}
|
||||
|
||||
.title_container_inf_carrier{
|
||||
font-weight: 500;
|
||||
font-size: 20px;
|
||||
color: #272424;
|
||||
padding-bottom: 10px;
|
||||
}
|
||||
|
||||
.name_carrier{
|
||||
font-size: 16px;
|
||||
color: #272424;
|
||||
font-weight: 400;
|
||||
position: relative;
|
||||
top: 11px;
|
||||
left: 4px;
|
||||
}
|
||||
|
||||
.from-to-city-text{
|
||||
font-size: 14px;
|
||||
color: #27242499;
|
||||
padding-top: 10px;
|
||||
}
|
||||
|
||||
.arrow_inf_about_moving{
|
||||
position: relative;
|
||||
top: 19px;
|
||||
left: 18px;
|
||||
}
|
||||
@@ -106,15 +106,8 @@ html, body{
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
/*uni-classes (boris)*/
|
||||
|
||||
|
||||
.text-align-center{
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
/*uno classes end (boris)*/
|
||||
|
||||
|
||||
|
||||
/*Стилизация radio button */
|
||||
|
||||
3
static/img/svg/arrow.svg
Normal file
3
static/img/svg/arrow.svg
Normal file
@@ -0,0 +1,3 @@
|
||||
<svg width="96" height="10" viewBox="0 0 96 10" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path id="arrow" fill-rule="evenodd" clip-rule="evenodd" d="M96 5C96 5.21733 95.7803 5.35456 95.3409 5.62903L88.6981 9.77837C88.4399 9.93965 88.3108 10.0203 88.2152 9.99563C88.1345 9.97479 88.0652 9.9108 88.0255 9.82055C87.9785 9.7137 88.0023 9.53583 88.0497 9.1801L88.0498 9.17981C88.2598 7.60568 88.3648 6.81856 88.406 6.02668C88.4064 6.01778 88.4069 6.00889 88.4073 6H1.21333C0.543227 6 0 5.55717 0 5.0109C0 4.46464 0.543228 4.02181 1.21333 4.02181H1.24893C1.28678 3.99273 1.34312 3.99273 1.38096 4.02181H3.06945C3.10731 3.99273 3.16364 3.99273 3.20149 4.02181H4.88998C4.92783 3.99273 4.98416 3.99273 5.02201 4.02181H6.7105C6.74835 3.99273 6.80469 3.99273 6.84254 4.02181H8.53102C8.56888 3.99273 8.62521 3.99273 8.66306 4.02181H10.3515C10.3894 3.99273 10.4457 3.99273 10.4836 4.02181H12.1721C12.2099 3.99273 12.2663 3.99273 12.3041 4.02181H13.9926C14.0304 3.99273 14.0868 3.99273 14.1246 4.02181H15.8131C15.851 3.99273 15.9073 3.99273 15.9452 4.02181H17.6336C17.6715 3.99273 17.7278 3.99273 17.7657 4.02181H19.4542C19.492 3.99273 19.5484 3.99273 19.5862 4.02181H21.2747C21.3125 3.99273 21.3689 3.99273 21.4067 4.02181H23.0952C23.1331 3.99273 23.1894 3.99273 23.2272 4.02181H24.9157C24.9536 3.99273 25.0099 3.99273 25.0478 4.02181H26.7363C26.7741 3.99273 26.8304 3.99273 26.8683 4.02181H28.5568C28.5946 3.99273 28.651 3.99273 28.6888 4.02181H30.3773C30.4152 3.99273 30.4715 3.99273 30.5093 4.02181H32.1978C32.2357 3.99273 32.292 3.99273 32.3299 4.02181H34.0184C34.0562 3.99273 34.1125 3.99273 34.1504 4.02181H35.8389C35.8767 3.99273 35.9331 3.99273 35.9709 4.02181H37.6594C37.6973 3.99273 37.7536 3.99273 37.7914 4.02181H39.4799C39.5178 3.99273 39.5741 3.99273 39.612 4.02181H41.3004C41.3383 3.99273 41.3946 3.99273 41.4325 4.02181H43.121C43.1588 3.99273 43.2152 3.99273 43.253 4.02181H44.9415C44.9793 3.99273 45.0357 3.99273 45.0735 4.02181H46.762C46.7999 3.99273 46.8562 3.99273 46.894 4.02181H48.5825C48.6204 3.99273 48.6767 3.99273 48.7146 4.02181H50.4031C50.4409 3.99273 50.4972 3.99273 50.5351 4.02181H52.2236C52.2614 3.99273 52.3178 3.99273 52.3556 4.02181H54.0441C54.082 3.99273 54.1383 3.99273 54.1761 4.02181H55.8646C55.9025 3.99273 55.9588 3.99273 55.9967 4.02181H57.6852C57.723 3.99273 57.7793 3.99273 57.8172 4.02181H59.5057C59.5435 3.99273 59.5999 3.99273 59.6377 4.02181H61.3262C61.364 3.99273 61.4204 3.99273 61.4582 4.02181H63.1467C63.1846 3.99273 63.2409 3.99273 63.2788 4.02181H64.9672C65.0051 3.99273 65.0614 3.99273 65.0993 4.02181H66.7878C66.8256 3.99273 66.882 3.99273 66.9198 4.02181H68.6083C68.6461 3.99273 68.7025 3.99273 68.7403 4.02181H70.4288C70.4667 3.99273 70.523 3.99273 70.5608 4.02181H72.2493C72.2872 3.99273 72.3435 3.99273 72.3814 4.02181H74.0699C74.1077 3.99273 74.164 3.99273 74.2019 4.02181H75.8904C75.9282 3.99273 75.9846 3.99273 76.0224 4.02181H77.7109C77.7487 3.99273 77.8051 3.99273 77.8429 4.02181H79.5314C79.5693 3.99273 79.6256 3.99273 79.6635 4.02181H81.352C81.3898 3.99273 81.4461 3.99273 81.484 4.02181H83.1725C83.2103 3.99273 83.2667 3.99273 83.3045 4.02181H84.993C85.0309 3.99273 85.0872 3.99273 85.125 4.02181H86.8135C86.8514 3.99273 86.9077 3.99273 86.9456 4.02181H88.4084C88.4076 4.00564 88.4068 3.98948 88.406 3.97333C88.3648 3.18144 88.2598 2.39432 88.0498 0.820179L88.0497 0.819904C88.0023 0.464169 87.9785 0.286303 88.0255 0.179455C88.0652 0.089202 88.1345 0.0252118 88.2152 0.00437444C88.3108 -0.0202936 88.4399 0.0603426 88.6981 0.221616L88.6981 0.221631L95.3409 4.37097C95.7803 4.64544 96 4.78267 96 5Z" fill="#FF613A"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.5 KiB |
5
static/img/svg/email.svg
Normal file
5
static/img/svg/email.svg
Normal file
@@ -0,0 +1,5 @@
|
||||
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g id="Icon "Calendar"">
|
||||
<path id="Vector" d="M4 7H27M4 7V24C4 24.2652 4.10097 24.5196 4.28069 24.7071C4.46041 24.8946 4.70417 25 4.95833 25H26.0417C26.2958 25 26.5396 24.8946 26.7193 24.7071C26.899 24.5196 27 24.2652 27 24V7M4 7L15.5 18L27 7" stroke="#FF613A" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 445 B |
33
static/js/find_route.js
Normal file
33
static/js/find_route.js
Normal file
@@ -0,0 +1,33 @@
|
||||
function show_inf_carrier (el) {
|
||||
event.preventDefault()
|
||||
let form = el.form
|
||||
let ph_1 = form[0]
|
||||
let ph_2 = form[1]
|
||||
let em_2 = form[2]
|
||||
let btn_open_chat = form[3]
|
||||
|
||||
ph_1.parentElement.children[1].classList.toggle("active");
|
||||
try {
|
||||
ph_2.parentElement.children[1].classList.toggle("active");
|
||||
} catch {
|
||||
// p
|
||||
}
|
||||
|
||||
em_2.parentElement.children[1].classList.toggle("active");
|
||||
btn_open_chat.classList.toggle("active")
|
||||
if (el.style.display === "none"){
|
||||
el.style.display = ""
|
||||
} else {
|
||||
el.style.display = "none"
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function open_chat (user_id){
|
||||
event.preventDefault()
|
||||
let host = window.location.origin
|
||||
let user_id_ = user_id.toString()
|
||||
let href = host + '/ru/profile/chat/' + user_id_
|
||||
// window.location.href = host + '/profile/chat/' + user_id
|
||||
window.location.replace(href)
|
||||
}
|
||||
@@ -170,7 +170,7 @@ function selectedUserMessenger (el,ticket_id){
|
||||
});
|
||||
}
|
||||
|
||||
function sendMessage(id_ticket,sender,receiver){
|
||||
function sendMessage(id_ticket=null,sender,receiver){
|
||||
event.preventDefault()
|
||||
|
||||
let text = document.querySelector(".enter-message-inp").value
|
||||
@@ -179,14 +179,24 @@ function sendMessage(id_ticket,sender,receiver){
|
||||
//
|
||||
}
|
||||
else {
|
||||
let data = {
|
||||
'ticket_id': id_ticket,
|
||||
'sender': sender,
|
||||
'receiver': receiver,
|
||||
'text': text
|
||||
let data = {}
|
||||
if (id_ticket === null){
|
||||
data = {
|
||||
'sender': sender,
|
||||
'receiver': receiver,
|
||||
'text': text
|
||||
}
|
||||
} else {
|
||||
data = {
|
||||
'ticket_id': id_ticket,
|
||||
'sender': sender,
|
||||
'receiver': receiver,
|
||||
'text': text
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
$.ajax({
|
||||
headers: { "X-CSRFToken": $('input[name=csrfmiddlewaretoken]').val() },
|
||||
url: '/ru/messages/send_msg/',
|
||||
@@ -247,3 +257,5 @@ function sendMessageEnter (e,id_ticket,sender,receiver){
|
||||
//
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
function writeMessage(){
|
||||
$.ajax({
|
||||
headers: { "X-CSRFToken": $('input[name=csrfmiddlewaretoken]').val() },
|
||||
url: '/ru/user_account/new_msg_to_user/',
|
||||
url: '/ru/user_account/chats/',
|
||||
type: "POST",
|
||||
// async: true,
|
||||
cache: false,
|
||||
@@ -254,7 +254,7 @@ function sendRoute(el, routeID = null){
|
||||
|
||||
},
|
||||
error: function (data, exception){
|
||||
document.querySelector(".info_profile").innerHTML = data.responseText;
|
||||
document.querySelector(".info_profile").innerHTML = data.responseJSON.html;
|
||||
|
||||
|
||||
|
||||
@@ -396,8 +396,8 @@ function getRoute(){
|
||||
'route_id': id
|
||||
}
|
||||
|
||||
$.ajax({
|
||||
headers: { "X-CSRFToken": $('input[name=csrfmiddlewaretoken]').val() },
|
||||
$.ajax({
|
||||
headers: {"X-CSRFToken": $('input[name=csrfmiddlewaretoken]').val()},
|
||||
url: '/ru/routes/edit_route/',
|
||||
type: "POST",
|
||||
// async: true,
|
||||
@@ -406,14 +406,14 @@ function getRoute(){
|
||||
contentType: false,
|
||||
// enctype: 'json',
|
||||
data: JSON.stringify(route_obj),
|
||||
success: function(data){
|
||||
success: function (data) {
|
||||
console.log('data received')
|
||||
// location.href = '/profile'
|
||||
document.querySelector(".info_profile").innerHTML = data.html;
|
||||
|
||||
|
||||
},
|
||||
error: function (data, exception){
|
||||
error: function (data, exception) {
|
||||
console.log(101)
|
||||
|
||||
}
|
||||
|
||||
@@ -31,20 +31,10 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="info_profile">
|
||||
<h1>Добро пожаловать: <span>{{ user.first_name }} {{ user.last_name }}</span> <span>({{ user.username }})</span></h1>
|
||||
<div class="profile_prof"><img class="avatar_profile" src="{{ user.user_profile.avatar }}" alt="">
|
||||
<div>
|
||||
<div>Статус: {{ user.user_profile.get_account_type_display }}</div>
|
||||
{# <div>#}
|
||||
{# <select name="" id="">#}
|
||||
{# <option>Перевозчик</option>#}
|
||||
{# <option>Отправитель</option>#}
|
||||
{# </select></div>#}
|
||||
</div>
|
||||
</div>
|
||||
<div>Если хотите отправить посылку - зарегистрируйтесь, как отправитель</div>
|
||||
<div>Если у Вас возникнут вопросы Вы можете связаться с нами: <a href="mailto:support@twb.com">support@twb.com</a></div>
|
||||
<div>У Вас <a href="#">три</a> новых сообщения. <a href="#">Посмотреть</a></div>
|
||||
<div>Хотите получать уведомление о появлении посылок? <a href="#">Заполните форму</a></div>
|
||||
{% if not page %}
|
||||
{% include "blocks/profile/b_profile_first_page.html" %}
|
||||
{% elif page == 'chat' %}
|
||||
{% include "blocks/profile/b_chats.html" %}
|
||||
{% endif %}
|
||||
</div>
|
||||
</section>
|
||||
87
templates/blocks/profile/b_chats.html
Normal file
87
templates/blocks/profile/b_chats.html
Normal file
@@ -0,0 +1,87 @@
|
||||
{% load static %}
|
||||
|
||||
<div class="title-profile-cont">
|
||||
<h1>Написать сообщение</h1>
|
||||
</div>
|
||||
|
||||
{#<div class="container-messenger">#}
|
||||
{# <div class="block-chat">#}
|
||||
{# <div class="container-header-chat">#}
|
||||
{# <div class="header-chat-left-part">#}
|
||||
{# <img class="chat-avatar" src="{% static "delete_later/Avatar.png" %}">#}
|
||||
{# <span class="chat-username">Сергейко Сергей</span>#}
|
||||
{# </div>#}
|
||||
{# <div class="header-chat-right-part">#}
|
||||
{# <img class="header-icons-right-part-padding" src="{% static "img/svg/phone.svg" %}">#}
|
||||
{# <img class="header-icons-right-part-padding" src="{% static "img/svg/info.svg" %}">#}
|
||||
{# </div>#}
|
||||
{# </div>#}
|
||||
{# <div class="container-messages">#}
|
||||
{# {% include "widgets/w_message.html" %}#}
|
||||
{# </div>#}
|
||||
{# <div class="footer-chat">#}
|
||||
{# <div class="left-part-block-enter-message">#}
|
||||
{# <input class="enter-message-inp" placeholder="Отправить сообщение">#}
|
||||
{# </div>#}
|
||||
{# <div class="right-part-block-enter-message">#}
|
||||
{# <button class="attach-file-btn-message" onclick="attachFilemeassge()"></button>#}
|
||||
{# <button class="send-message"></button>#}
|
||||
{# </div>#}
|
||||
{# </div>#}
|
||||
{# </div>#}
|
||||
{# <div class="block-list-of-users">#}
|
||||
{# <span class="title-list-of-users">Пользователи</span>#}
|
||||
{# <div class="insert_users">#}
|
||||
{# {% include "widgets/w_tab_user.html" %}#}
|
||||
{# </div>#}
|
||||
{# </div>#}
|
||||
{#</div>#}
|
||||
|
||||
|
||||
<div class="block-chat">
|
||||
<div class="container-header-chat">
|
||||
<div class="header-chat-left-part">
|
||||
<img class="chat-avatar" src="{% static "delete_later/Avatar.png" %}">
|
||||
<span class="chat-username">{{ ticket.manager.last_name }} {{ ticket.manager.first_name }}</span>
|
||||
</div>
|
||||
<div class="header-chat-right-part">
|
||||
<img class="header-icons-right-part-padding" src="{% static "img/svg/phone.svg" %}">
|
||||
<img class="header-icons-right-part-padding" src="{% static "img/svg/info.svg" %}">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="container-messages">
|
||||
{% if not messages %}
|
||||
{% with text=ticket.text modifiedDT=ticket.modifiedDT %}
|
||||
{% include "widgets/w_message.html" %}
|
||||
{% endwith %}
|
||||
{% else %}
|
||||
{% for msg in messages %}
|
||||
{% with text=msg.text modifiedDT=msg.modifiedDT %}
|
||||
{% include "widgets/w_message.html" %}
|
||||
{% endwith %}
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<div class="footer-chat">
|
||||
<div class="left-part-block-enter-message">
|
||||
<input class="enter-message-inp" onkeypress="sendMessageEnter(event,{{ ticket.id }},{{ user.id }},{{ ticket.owner.id }})" placeholder="Отправить сообщение">
|
||||
</div>
|
||||
<div class="right-part-block-enter-message">
|
||||
<button class="attach-file-btn-message" onclick="attachFilemeassge()"></button>
|
||||
<button class="send-message" onclick="sendMessage({{ ticket.id }},{{ user.id }},{{ ticket.owner.id }})"></button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="block-list-of-users">
|
||||
<span class="title-list-of-users">Неразобранные тикеты</span>
|
||||
<div class="insert_users">
|
||||
{% if tickets_wo_manager %}
|
||||
{% for item in tickets_wo_manager %}
|
||||
{% include "widgets/w_tab_user.html" %}
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
|
||||
</div>
|
||||
</div>
|
||||
@@ -46,4 +46,6 @@
|
||||
{# <input class="create-ticket-file" type="file" value="">#}
|
||||
|
||||
</div>
|
||||
</form>
|
||||
</form>
|
||||
|
||||
<div></div>
|
||||
@@ -1,38 +0,0 @@
|
||||
{% load static %}
|
||||
|
||||
<div class="title-profile-cont">
|
||||
<h1>Написать сообщение</h1>
|
||||
</div>
|
||||
|
||||
<div class="container-messenger">
|
||||
<div class="block-chat">
|
||||
<div class="container-header-chat">
|
||||
<div class="header-chat-left-part">
|
||||
<img class="chat-avatar" src="{% static "delete_later/Avatar.png" %}">
|
||||
<span class="chat-username">Сергейко Сергей</span>
|
||||
</div>
|
||||
<div class="header-chat-right-part">
|
||||
<img class="header-icons-right-part-padding" src="{% static "img/svg/phone.svg" %}">
|
||||
<img class="header-icons-right-part-padding" src="{% static "img/svg/info.svg" %}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="container-messages">
|
||||
{% include "widgets/w_message.html" %}
|
||||
</div>
|
||||
<div class="footer-chat">
|
||||
<div class="left-part-block-enter-message">
|
||||
<input class="enter-message-inp" placeholder="Отправить сообщение">
|
||||
</div>
|
||||
<div class="right-part-block-enter-message">
|
||||
<button class="attach-file-btn-message" onclick="attachFilemeassge()"></button>
|
||||
<button class="send-message"></button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="block-list-of-users">
|
||||
<span class="title-list-of-users">Пользователи</span>
|
||||
<div class="insert_users">
|
||||
{% include "widgets/w_tab_user.html" %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
15
templates/blocks/profile/b_profile_first_page.html
Normal file
15
templates/blocks/profile/b_profile_first_page.html
Normal file
@@ -0,0 +1,15 @@
|
||||
<h1>Добро пожаловать: <span>{{ user.first_name }} {{ user.last_name }}</span> <span>({{ user.username }})</span></h1>
|
||||
<div class="profile_prof"><img class="avatar_profile" src="{{ user.user_profile.avatar }}" alt="">
|
||||
<div>
|
||||
<div>Статус: {{ user.user_profile.get_account_type_display }}</div>
|
||||
{# <div>#}
|
||||
{# <select name="" id="">#}
|
||||
{# <option>Перевозчик</option>#}
|
||||
{# <option>Отправитель</option>#}
|
||||
{# </select></div>#}
|
||||
</div>
|
||||
</div>
|
||||
<div>Если хотите отправить посылку - зарегистрируйтесь, как отправитель</div>
|
||||
<div>Если у Вас возникнут вопросы Вы можете связаться с нами: <a href="mailto:support@twb.com">support@twb.com</a></div>
|
||||
<div>У Вас <a href="#">три</a> новых сообщения. <a href="#">Посмотреть</a></div>
|
||||
<div>Хотите получать уведомление о появлении посылок? <a href="#">Заполните форму</a></div>
|
||||
30
templates/pages/p_results_find_route.html
Normal file
30
templates/pages/p_results_find_route.html
Normal file
@@ -0,0 +1,30 @@
|
||||
{% extends "tb_base.html" %}
|
||||
{% load static %}
|
||||
|
||||
{% block meta %}
|
||||
<script src='{% static "js/find_route.js" %}'> </script>
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="cut-width">
|
||||
<div class="text-align-center">
|
||||
<h1 class="title_page">Поиск перевозчика</h1>
|
||||
</div>
|
||||
<div class="container_form_search_carrier">
|
||||
</div>
|
||||
<div class="block-find-route">
|
||||
<div class="block-filters-find-route">
|
||||
|
||||
</div>
|
||||
<div class="block-finded-routes">
|
||||
{% for route in routes %}
|
||||
{% include "widgets/w_carrier_card.html" %}
|
||||
{% endfor %}
|
||||
|
||||
|
||||
</div>
|
||||
<div class="clear_both"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
||||
31
templates/small_INCLUDES/carrier_card/inf_about_moving.html
Normal file
31
templates/small_INCLUDES/carrier_card/inf_about_moving.html
Normal file
@@ -0,0 +1,31 @@
|
||||
{% load static %}
|
||||
<div class="container_inf_about_moving">
|
||||
<div class="line_inf_about_moving">
|
||||
<div class="carrier_inf_moving left">
|
||||
<div>Отправка:</div>
|
||||
<div class="from-to-city-text">{% if route.arrival_DT %}{{ route.arrival_DT }}{% else %}Неизвестно{% endif %}</div>
|
||||
|
||||
</div>
|
||||
<img class="arrow_inf_about_moving" src="{% static "/img/svg/arrow.svg" %}">
|
||||
<div class="carrier_inf_moving right">
|
||||
<div>Прибытие:</div>
|
||||
<div class="from-to-city-text">{% if route.departure_DT %}{{ route.departure_DT }}{% else %}Неизвестно{% endif %}</div>
|
||||
|
||||
</div>
|
||||
<div class="clear_both"></div>
|
||||
</div>
|
||||
<div class="line_inf_about_moving second">
|
||||
<div class="carrier_inf_moving left">
|
||||
<div>Откуда заберёт:</div>
|
||||
<div class="from-to-city-text">{% if route.from_place == 'airport' %}{{ route.from_airport }}{% else %}{{ route.get_from_place_display }}{% endif %}</div>
|
||||
|
||||
</div>
|
||||
<img class="arrow_inf_about_moving" src="{% static "/img/svg/arrow.svg" %}">
|
||||
<div class="carrier_inf_moving right">
|
||||
<div>Куда доставит:</div>
|
||||
<div class="from-to-city-text">{% if route.to_place == 'airport' %}{{ route.to_airport }}{% else %}{{ route.get_to_place_display }}{% endif %}</div>
|
||||
|
||||
</div>
|
||||
<div class="clear_both"></div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -8,17 +8,19 @@
|
||||
|
||||
<script src='{% static "js/jquery_v3_6_4.js" %}'> </script>
|
||||
|
||||
|
||||
<link rel="stylesheet" href="{% static 'css/styles.css' %}">
|
||||
|
||||
<link rel="stylesheet" href="{% static 'css/styles(boris).css' %}">
|
||||
<link rel="stylesheet" href="{% static 'css/styles(boris).css' %}" >
|
||||
|
||||
|
||||
|
||||
{% block meta %}
|
||||
|
||||
{% endblock %}
|
||||
</head>
|
||||
<body>
|
||||
<div class="wrapper">
|
||||
|
||||
{% include 'blocks/b_header.html' %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
56
templates/widgets/w_carrier_card.html
Normal file
56
templates/widgets/w_carrier_card.html
Normal file
@@ -0,0 +1,56 @@
|
||||
{% load static %}
|
||||
<div class="carrier-card">
|
||||
<div class="left-part-carrier-card">
|
||||
<div class="first-line-card-carrier">
|
||||
<div class="carrier-title">
|
||||
Перевозчик:
|
||||
</div>
|
||||
<div class="type_transportation_carrier">
|
||||
{{ route.get_type_transport_display }}
|
||||
</div>
|
||||
<div class="clear_both"></div>
|
||||
</div>
|
||||
<div class="from-to-country-container-carrier">
|
||||
<div class="from-to-country-text left fl-left txt-al-right">
|
||||
{% if route.from_country %}{{ route.from_country }}{% else %}Неизвестно{% endif %} / {% if route.from_city %}{{ route.from_city }}{% else %}Неизвестно{% endif %}
|
||||
</div>
|
||||
<div class="splitter-from-to-country"></div>
|
||||
<div class="from-to-country-text right fl-right txt-al-left">
|
||||
{% if route.to_country %}{{ route.to_country }}{% else %}Неизвестно{% endif %} / {% if route.to_city %}{{ route.to_city }}{% else %}Неизвестно{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
{% include "small_INCLUDES/carrier_card/inf_about_moving.html" %}
|
||||
|
||||
</div>
|
||||
{# <div class="splliter-left-right-part-carrier-card"></div>#}
|
||||
<div class="inf_carrier_container">
|
||||
<div class="title_container_inf_carrier">Контакты отправителия:</div>
|
||||
<div>
|
||||
<img src="{% static "/delete_later/Avatar.png" %}">
|
||||
<span class="name_carrier">{{ route.owner.last_name }} {{ route.owner.first_name }}</span>
|
||||
</div>
|
||||
<form>
|
||||
<div class="inf_carrier">
|
||||
<a class="phones_carrier" href="tel:{{ route.phone }}">
|
||||
<img class="inf_carrier_icon" src="{% static "/img/svg/phone.svg" %}"/>
|
||||
<span class="phones_carrier_span">{{ route.phone }}</span>
|
||||
<input name="phone_1" value="{{ route.phone }}">
|
||||
</a>
|
||||
<a class="email_carrier" href="mailto:{{ route.owner.email }}">
|
||||
<img class="inf_carrier_icon" src="{% static "/img/svg/email.svg" %}">
|
||||
<span class="email_carrier_span">{{ route.owner.email }}</span>
|
||||
<input name="email_1" value="{{ route.owner.email }}">
|
||||
</a>
|
||||
</div>
|
||||
<button class="open_chat_carrier" onclick="open_chat({{ route.owner_id }})">
|
||||
<img src="{% static "img/svg/Logo.svg" %}" width="30px" style="position:relative;top: 6px;">
|
||||
<span style="position: relative;top: 2px;">Написать</span>
|
||||
{# <img src="{% static "/img/svg/email.svg" %}" width="25px" style="position:relative;left: 3px;">#}
|
||||
</button>
|
||||
<button class="open_inf_carrier" onclick="show_inf_carrier(this)">Открыть контакт</button>
|
||||
</form>
|
||||
|
||||
</div>
|
||||
<div class="clear_both"></div>
|
||||
|
||||
</div>
|
||||
Reference in New Issue
Block a user