first work version, amen

remotes/origin/PR-71
booblegum 9 years ago
parent 1b1a984e48
commit f576ecceb2
  1. 10
      api/urls.py
  2. 42
      api/views.py
  3. 2
      archilance/urls.py
  4. 34
      assets/css/extra.css
  5. 226
      assets/css/main.css
  6. BIN
      assets/img/icons/icon_arbitration.png
  7. BIN
      assets/img/icons/icon_arrow_gray.png
  8. BIN
      assets/img/icons/icon_books.png
  9. BIN
      assets/img/icons/icon_check.png
  10. BIN
      assets/img/icons/icon_coins_gray.png
  11. BIN
      assets/img/icons/icon_coins_green.png
  12. BIN
      assets/img/icons/icon_coins_red.png
  13. BIN
      assets/img/icons/icon_complete_stage.png
  14. BIN
      assets/img/icons/icon_credit_card.png
  15. BIN
      assets/img/icons/icon_credit_card_gray.png
  16. BIN
      assets/img/icons/icon_hands_gray.png
  17. BIN
      assets/img/icons/icon_pen_black.png
  18. BIN
      assets/img/icons/icon_print.png
  19. BIN
      assets/img/icons/icon_protect.png
  20. 2773
      assets/js/build/chat_contractor_oop.js
  21. 2584
      assets/js/build/chat_customer_oop.js
  22. 28
      assets/js/build/contractor_filter.js
  23. 161
      assets/js/build/create_project.js
  24. 48
      assets/js/build/create_worksell.js
  25. 8
      assets/js/build/custom_components.js
  26. 100
      assets/js/build/customer_profile.js
  27. 79
      assets/js/build/debugUtilsInit.js
  28. 4
      assets/js/build/home_page.js
  29. 68
      assets/js/build/init_contractor_filter.js
  30. 95
      assets/js/build/init_create_worksell.js
  31. 101
      assets/js/build/init_customer_project_create.js
  32. 99
      assets/js/build/init_modal_realty_edit.js
  33. 87
      assets/js/build/init_portfolio_create_edit.js
  34. 68
      assets/js/build/init_worksell_filter.js
  35. 40
      assets/js/build/portfolio_create_edit.js
  36. 23
      assets/js/build/project_filter.js
  37. 4
      assets/js/build/registration.js
  38. 16
      assets/js/build/user_profile_edit.js
  39. 28
      assets/js/build/worksell_filter.js
  40. 445
      assets/js/src/chat/BINDS.js
  41. 1
      assets/js/src/chat/ChatContractorPageController.js
  42. 1
      assets/js/src/chat/ChatCustomerPageController.js
  43. 67
      assets/js/src/chat/DocumentsControllers.js
  44. 61
      assets/js/src/chat/MessagesControllers.js
  45. 340
      assets/js/src/chat/Stages.js
  46. 446
      assets/js/src/chat/StagesContractorController.js
  47. 545
      assets/js/src/chat/StagesCustomerController.js
  48. 84
      assets/js/src/chat/archiveProjects.js
  49. 145
      assets/js/src/chat/chats.js
  50. 157
      assets/js/src/chat/documents.js
  51. 9
      assets/js/src/chat/formats/receive_message_formats.py
  52. 36
      assets/js/src/chat/formats/send_message_formats.js
  53. 28
      assets/js/src/chat/loaders.js
  54. 43
      assets/js/src/chat/messageCounters.js
  55. 77
      assets/js/src/chat/notes.js
  56. 27
      assets/js/src/chat/parts.js
  57. 8
      assets/js/src/chat/templates/buttons/bntCompleteStage_tmpl.html
  58. 6
      assets/js/src/chat/templates/buttons/btnSendReview_tmpl.html
  59. 12
      assets/js/src/chat/templates/links/document_attach_file_tmpl.html
  60. 7
      assets/js/src/chat/templates/links/document_link_tmpl.html
  61. 7
      assets/js/src/chat/templates/message_tmpl.html
  62. 6
      assets/js/src/chat/templates/note_tmpl.html
  63. 5
      assets/js/src/chat/templates/reserved_tmpl.html
  64. 29
      assets/js/src/chat/templates/stage_approved_tmpl.html
  65. 29
      assets/js/src/chat/templates/stage_tmpl.html
  66. 10
      assets/js/src/chat/templates/work_in_process_tmpl.html
  67. 6
      assets/js/src/chat/utils_debug.js
  68. 114
      assets/js/src/chat/wsChatConnect.js
  69. 63
      assets/js/src/chat_contractor_oop.js
  70. 47
      assets/js/src/chat_customer_oop.js
  71. 5
      assets/js/src/debugUtilsInit.js
  72. 6
      assets/js/src/init_customer_project_create.js
  73. 6
      assets/js/src/seeds/read_more.js
  74. 183
      assets/js/trash/chat.js
  75. 132
      assets/js/trash/chat_contractor.js
  76. 7
      assets/js/trash/chat_customer.js
  77. 52
      chat/chat.py
  78. 20
      chat/migrations/0015_message_is_system.py
  79. 3
      chat/models.py
  80. 1
      chat/serializers.py
  81. 325
      chat/static/sass/chat_add.sass
  82. 630
      chat/templates/chat_contractor.html
  83. 510
      chat/templates/chat_customer.html
  84. 5
      chat/templates/inc-contact-card.html
  85. 50
      chat/templates/partials/inc-attach-documents.html
  86. 47
      chat/templates/partials/inc-order-card.html
  87. 61
      chat/templates/partials/inc-team-card.html
  88. 156
      chat/templates/partials/inc-websocket-connect.htm
  89. 86
      chat/templates/reverse_stage_modal.html
  90. 28
      chat/templates/review_add_modal.html
  91. 14
      chat/views.py
  92. 12
      package.json
  93. 2
      projects/apps.py
  94. 20
      projects/migrations/0054_auto_20170131_1609.py
  95. 5
      projects/models.py
  96. 32
      projects/serializers.py
  97. 2
      projects/signals.py
  98. 7
      projects/templates/project_detail.html
  99. 2
      reviews/apps.py
  100. 7
      reviews/signals.py
  101. Some files were not shown because too many files have changed in this diff Show More

@ -23,6 +23,7 @@ from .views import (
SpecializationViewSetFlat, SpecializationViewSetFlat,
ConstructionTypeViewSet, ConstructionTypeViewSet,
StageViewSet, StageViewSet,
StageUpdateViewSet,
TeamViewSet, TeamViewSet,
UserViewSet, UserViewSet,
WorkSellPhotoViewSet, WorkSellPhotoViewSet,
@ -58,8 +59,9 @@ router.register(r'work-sells', WorkSellViewSet)
urlpatterns = router.urls urlpatterns = router.urls
# urlpatterns = [ urlpatterns = [
# url(r'^demo_realties/(?P<pk>\d+)/$', UpdateRealty.as_view()), url(r'^update_stages/$', StageUpdateViewSet.as_view()),
# ] # url(r'^orders/(?P<pk>\d+)/$', OrderViewSet.as_view({'delete'})),
]
# urlpatterns += router.urls urlpatterns += router.urls

@ -1,11 +1,13 @@
from django.conf import settings from django.conf import settings
from django.db.models import Q, F from django.db.models import Q, F
from django.http import Http404
from rest_framework import permissions from rest_framework import permissions
from rest_framework.pagination import PageNumberPagination from rest_framework.pagination import PageNumberPagination
from rest_framework.viewsets import ModelViewSet from rest_framework.viewsets import ModelViewSet
from rest_framework.decorators import detail_route, list_route from rest_framework.decorators import detail_route, list_route
from rest_framework.response import Response from rest_framework.response import Response
from rest_framework import generics from rest_framework import generics
from rest_framework import status
from chat.filters import MessageFilterSet, NoteFilterSet, DocumentFilterSet from chat.filters import MessageFilterSet, NoteFilterSet, DocumentFilterSet
from chat.models import Message, Notes, Documents, NewMessage from chat.models import Message, Notes, Documents, NewMessage
@ -22,7 +24,7 @@ from projects.models import (Project, Realty, Stage, Portfolio, PortfolioPhoto,
from projects.serializers import ( from projects.serializers import (
ProjectSerializer, RealtySerializer, StageSerializer, PortfolioSerializer, ProjectSerializer, RealtySerializer, StageSerializer, PortfolioSerializer,
PortfolioPhotoSerializer, AnswerSerializer, OrderSerializer, BuildingClassificationSerializeFlat, PortfolioPhotoSerializer, AnswerSerializer, OrderSerializer, BuildingClassificationSerializeFlat,
ConstructionTypeSerializer) ConstructionTypeSerializer, StageListSerializer)
from reviews.filters import ReviewFilterSet from reviews.filters import ReviewFilterSet
from reviews.models import Review from reviews.models import Review
from reviews.serializers import ReviewSerializer from reviews.serializers import ReviewSerializer
@ -59,6 +61,31 @@ class StageViewSet(ModelViewSet):
permission_classes = (permissions.IsAuthenticatedOrReadOnly,) permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
class StageUpdateViewSet(generics.UpdateAPIView):
# def __init__(self, *args, **kwargs):
# many = kwargs.pop('many', True)
# super().__init__(many=many, *args, **kwargs)
model = Stage
queryset = model.objects.all()
serializer_class = StageSerializer
def put(self, request, *args, **kwargs):
# print("put request = ", request.data)
print(request.data)
result = request.data
print("result = ", result)
# ids = [obj["id"] for obj in result]
# queryset = self.model.objects.filter(pk__in=ids)
# print("count = ", queryset.count())
serializer = self.serializer_class(data=result, many=True)
serializer.is_valid()
serializer.save()
# print("serializer = ", serializer)
return Response(serializer.data, status=status.HTTP_200_OK)
# print("errors = ", serializer.errors)
# return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
class ReviewViewSet(ModelViewSet): class ReviewViewSet(ModelViewSet):
queryset = Review.objects.all() queryset = Review.objects.all()
serializer_class = ReviewSerializer serializer_class = ReviewSerializer
@ -231,6 +258,19 @@ class OrderViewSet(ModelViewSet):
filter_class = OrderFilterSet filter_class = OrderFilterSet
permission_classes = (permissions.IsAuthenticatedOrReadOnly,) permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
def destroy(self, request, *args, **kwargs):
print("destroy request = ", request, 'args = ', args, 'kwargs = ', kwargs)
try:
instance = self.get_object()
project = instance.project
project.state = 'deleted'
project.save()
# self.perform_destroy(instance)
print('inst = ', instance)
except Http404:
pass
return Response(status=status.HTTP_204_NO_CONTENT)
class SpecializationViewSet(ModelViewSet): class SpecializationViewSet(ModelViewSet):
try: # TODO: dirty try: # TODO: dirty

@ -22,7 +22,7 @@ urlpatterns = [
url(r'^projects/', include('projects.urls')), url(r'^projects/', include('projects.urls')),
url(r'^object/(?P<pk>\d+)/trash/$', CustomerRealtyTrashView.as_view(), name='customer-object-trash'), url(r'^object/(?P<pk>\d+)/trash/$', CustomerRealtyTrashView.as_view(), name='customer-object-trash'),
url(r'^object/(?P<pk>\d+)/delete/$', CustomerRealtyDeleteView.as_view(), name='customer-object-delete'), url(r'^object/(?P<pk>\d+)/delete/$', CustomerRealtyDeleteView.as_view(), name='customer-object-delete'),
url(r'^object/(?P<pk>\d+)/edit/$', RealtyUpdateView.as_view(), name='customer-object-delete'), url(r'^object/(?P<pk>\d+)/edit/$', RealtyUpdateView.as_view(), name='customer-object-edit'),
url(r'^object/(?P<pk>\d+)/restore/$', CustomerRealtyRestoreView.as_view(), name='customer-object-restore'), url(r'^object/(?P<pk>\d+)/restore/$', CustomerRealtyRestoreView.as_view(), name='customer-object-restore'),
url(r'^objects/sort/$', SortRealtyBy.as_view(), name='sort-realty-by'), url(r'^objects/sort/$', SortRealtyBy.as_view(), name='sort-realty-by'),
url(r'^reviews/', include('reviews.urls')), url(r'^reviews/', include('reviews.urls')),

@ -72,18 +72,6 @@
margin: 0; margin: 0;
} }
.stepssBlock ul li.reserved::before {
background: rgba(0, 0, 0, 0) url("../img/reserved2.png") no-repeat scroll center center / cover;
height: 16px;
width: 17px;
}
.stepssBlock ul li.unreserved::before {
background: rgba(0, 0, 0, 0) url("../img/reserved.png") no-repeat scroll center center / cover;
height: 14px;
width: 13px;
}
.chat-textarea { .chat-textarea {
width: 100%; width: 100%;
height: 110px; height: 110px;
@ -135,7 +123,7 @@
} }
.documentsChat > p { .documentsChat > p {
font-size: 20px; font-size: 16px;
} }
#message-chat-order-space, #message-chat-team-space { #message-chat-order-space, #message-chat-team-space {
@ -229,6 +217,26 @@
background-color: #ebebeb; background-color: #ebebeb;
} }
.count-order {
display: inline-block;
margin-left: 5px;
margin-right: 5px;
width: 20px;
height: 20px;
border-radius: 100%;
line-height: 20px;
text-align: center;
font-size: 10px;
font-family: 'Arial-MT-Regular', sans-serif;
/*position: absolute;*/
/*top: 14px;*/
cursor: pointer;
-webkit-transition: all 0.3s ease-out;
-moz-transition: all 0.3s ease-out;
transition: all 0.3s ease-out;
background-color: #ebebeb;
}
li a:active .count-tab, li a:hover .count-tab { li a:active .count-tab, li a:hover .count-tab {
background-color: #FF0027; background-color: #FF0027;
color: white; color: white;

@ -501,15 +501,6 @@ a, a:hover, a:focus, a:active {
float: right !important; float: right !important;
} }
.triangle1 {
position: absolute;
border: 30px solid transparent;
border-top: 17px solid white;
top: 0;
left: 50%;
margin-left: -30px;
}
footer { footer {
width: 100%; width: 100%;
position: relative; position: relative;
@ -1964,8 +1955,8 @@ footer:after {
font-family: 'pfbeausanspro-reg', sans-serif; font-family: 'pfbeausanspro-reg', sans-serif;
position: relative; position: relative;
text-align: left; text-align: left;
padding: 22px 61px 22px 21px; padding: 20px 61px 20px 21px;
height: 94px; /*height: 94px;*/
} }
.profileTabs2 ul .active a:after { .profileTabs2 ul .active a:after {
@ -2423,6 +2414,15 @@ footer:after {
margin: 32px 0 50px 4px; margin: 32px 0 50px 4px;
} }
.triangle1 {
position: absolute;
border: 30px solid transparent;
border-top: 17px solid white;
top: 0;
left: 50%;
margin-left: -30px;
}
.triangle2 { .triangle2 {
position: absolute; position: absolute;
border: 30px solid transparent; border: 30px solid transparent;
@ -3321,12 +3321,12 @@ footer:after {
.textCommChat { .textCommChat {
width: 84%; width: 84%;
float: left; /*float: left;*/
margin: 11px 0 30px 0; margin: 6px 0;
font-size: 14px; font-size: 14px;
font-family: 'Arial-MT-Regular', sans-serif; font-family: 'Arial-MT-Regular', sans-serif;
color: #3c1a06; color: #3c1a06;
line-height: 25px; line-height: 18px;
} }
.greenNCC { .greenNCC {
@ -3384,7 +3384,7 @@ footer:after {
float: right; float: right;
border-radius: 40px; border-radius: 40px;
font-family: 'pfdintextcomppro-regular', sans-serif; font-family: 'pfdintextcomppro-regular', sans-serif;
letter-spacing: 2px; letter-spacing: 1px;
color: #373737; color: #373737;
font-size: 15px; font-size: 15px;
border: 1px solid #BEBEBE; border: 1px solid #BEBEBE;
@ -3429,8 +3429,9 @@ footer:after {
} }
.textAreaBlock2 a, .textAreaBlock2 a:link, .textAreaBlock2 a:visited { .textAreaBlock2 a, .textAreaBlock2 a:link, .textAreaBlock2 a:visited {
border: 1px solid #bebebe; border: 1px solid #f1f1f1;
border-radius: 40px; background-color: #f1f1f1;
/*border-radius: 40px;*/
color: #373737; color: #373737;
display: inline-block; display: inline-block;
font-family: "pfdintextcomppro-regular",sans-serif; font-family: "pfdintextcomppro-regular",sans-serif;
@ -3479,6 +3480,8 @@ footer:after {
.wrMessages { .wrMessages {
padding: 0; padding: 0;
background-color: #F7F7F7; background-color: #F7F7F7;
border-right: 1px solid #DADADA;
/*border-left: 1px solid #DADADA;*/
} }
.messageBlock { .messageBlock {
@ -3738,18 +3741,18 @@ footer:after {
margin: 0 0 0 30px; margin: 0 0 0 30px;
} }
.documentsChat a, .documentsChat a:link, .documentsChat a:visited { /*.documentsChat a, .documentsChat a:link, .documentsChat a:visited {*/
color: #5a5a5a; /*color: #5a5a5a;*/
border-radius: 40px; /*border-radius: 40px;*/
border: 1px solid #BEBEBE; /*border: 1px solid #BEBEBE;*/
font-family: Arial, Verdana, Helvetica, sans-serif; /*font-family: Arial, Verdana, Helvetica, sans-serif;*/
font-size: 12px; /*font-size: 12px;*/
font-style: italic; /*font-style: italic;*/
padding: 10px 21px 10px 32px; /*padding: 10px 21px 10px 32px;*/
background: url('../img/btnDoc.png') no-repeat 10px 6px; /*background: url('../img/btnDoc.png') no-repeat 10px 6px;*/
float: left; /*float: left;*/
margin: 19px 0 -10px 0; /*margin: 19px 0 -10px 0;*/
} /*}*/
.wrChat1 .textAreaBlock2 { .wrChat1 .textAreaBlock2 {
border: none; border: none;
@ -3811,12 +3814,13 @@ footer:after {
.titleOB { .titleOB {
width: 100%; width: 100%;
float: left; /*float: left;*/
font-family: 'Arial-MT-Regular', sans-serif; font-family: 'Arial-MT-Regular', sans-serif;
font-size: 18px; font-size: 18px;
color: #2c2c2c; color: #2c2c2c;
margin: 0 0 0 0; margin: 0;
line-height: 20px; line-height: 20px;
padding-right: 20px;
} }
.pOB { .pOB {
@ -3828,6 +3832,12 @@ footer:after {
margin: 10px 0 10px 0; margin: 10px 0 10px 0;
} }
.pDB {
font-family: 'Arial-MT-Regular', sans-serif;
font-size: 12px;
color: #5d5d5d;
}
.pOB span { .pOB span {
font-family: Arial, Verdana, Helvetica, sans-serif; font-family: Arial, Verdana, Helvetica, sans-serif;
font-weight: bold; font-weight: bold;
@ -3899,11 +3909,11 @@ footer:after {
transition: all 0.3s ease-out; transition: all 0.3s ease-out;
} }
.orderBlock:hover .dimovChat { /*.orderBlock:hover .dimovChat {*/
-webkit-transform: rotate(90deg); /*-webkit-transform: rotate(90deg);*/
-moz-transform: rotate(90deg); /*-moz-transform: rotate(90deg);*/
transform: rotate(90deg); /*transform: rotate(90deg);*/
} /*}*/
.orAct .dimovChat { .orAct .dimovChat {
-webkit-transform: rotate(90deg); -webkit-transform: rotate(90deg);
@ -3911,9 +3921,9 @@ footer:after {
transform: rotate(90deg); transform: rotate(90deg);
} }
.orderBlock:hover .hideOBB { /*.orderBlock:hover .hideOBB {*/
display: block; /*display: block;*/
} /*}*/
.orAct .hideOBB { .orAct .hideOBB {
display: block !important; display: block !important;
@ -3921,6 +3931,8 @@ footer:after {
.wrstepschat { .wrstepschat {
float: left; float: left;
/*border-right: 1px solid #DADADA;*/
border-left: 1px solid #DADADA;
padding: 0; padding: 0;
} }
@ -3932,6 +3944,36 @@ footer:after {
margin: 26px 15px 20px 15px; margin: 26px 15px 20px 15px;
color: black; color: black;
} }
.remove-margin{
margin-right: -15px;
margin-left: -15px;
position: relative;
}
.tab-content .header-wrapper {
/*display: inline-block;*/
font-size: 24px;
font-family: 'pfbeausanspro-reg', sans-serif;
padding: 26px 0px;
width: 100%;
color: black;
background-color: #F3F3F3;
text-align: center;
}
.tab-content .header-wrapper .header{
background-color: white;
display: inline-block;
width: 100%;
}
.triangle-header {
position: absolute;
border: 30px solid transparent;
border-top: 17px solid white;
top: 60px;
left: 50%;
margin-left: -30px;
}
.stepssBlock { .stepssBlock {
width: 100%; width: 100%;
@ -3941,12 +3983,12 @@ footer:after {
border-bottom: 1px solid black; border-bottom: 1px solid black;
z-index: 9; z-index: 9;
position: relative; position: relative;
margin-bottom: -1px; /*margin-bottom: -1px;*/
} }
.titleStepss { .titleStepss {
width: 100%; width: 100%;
float: left; /*float: left;*/
font-size: 18px; font-size: 18px;
font-family: 'Arial-MT-Regular', sans-serif; font-family: 'Arial-MT-Regular', sans-serif;
margin: 0 0 15px 0; margin: 0 0 15px 0;
@ -3955,7 +3997,7 @@ footer:after {
.textStepss { .textStepss {
width: 100%; width: 100%;
float: left; /*float: left;*/
font-size: 14px; font-size: 14px;
line-height: 17px; line-height: 17px;
font-family: 'Arial-MT-Regular', sans-serif; font-family: 'Arial-MT-Regular', sans-serif;
@ -3968,7 +4010,7 @@ footer:after {
border-top: 1px solid transparent; border-top: 1px solid transparent;
border-bottom: 1px solid transparent; border-bottom: 1px solid transparent;
padding: 15px; padding: 15px;
margin-bottom: -15px; /*margin-bottom: -15px;*/
background-color: white; background-color: white;
position: relative; position: relative;
-webkit-transition: all 0.3s ease-out; -webkit-transition: all 0.3s ease-out;
@ -4058,39 +4100,39 @@ footer:after {
margin-top: 15px; margin-top: 15px;
} }
.stepssBlock ul { /*.stepssBlock ul {*/
float: left; /*float: left;*/
margin: 10px 0 0 30px; /*margin: 10px 0 0 30px;*/
} /*}*/
.stepssBlock ul li { /*.stepssBlock ul li {*/
font-size: 12px; /*font-size: 12px;*/
color: #525252; /*color: #525252;*/
font-family: 'Arial-MT-Regular', sans-serif; /*font-family: 'Arial-MT-Regular', sans-serif;*/
margin-bottom: 8px; /*margin-bottom: 8px;*/
position: relative; /*position: relative;*/
} /*}*/
.stepssBlock ul li:before { /*.stepssBlock ul li:before {*/
content: ''; /*content: '';*/
position: absolute; /*position: absolute;*/
left: -30px; /*left: -30px;*/
top: 2px; /*top: 2px;*/
} /*}*/
.stepssBlock ul li:first-child:before { /*.stepssBlock ul li:first-child:before {*/
width: 13px; /*width: 13px;*/
height: 14px; /*height: 14px;*/
background: url('../img/reserved.png') no-repeat center; /*background: url('../img/reserved.png') no-repeat center;*/
background-size: cover; /*background-size: cover;*/
} /*}*/
.stepssBlock ul li:last-child:before { /*.stepssBlock ul li:last-child:before {*/
width: 17px; /*width: 17px;*/
height: 16px; /*height: 16px;*/
background: url('../img/reserved2.png') no-repeat center; /*background: url('../img/reserved2.png') no-repeat center;*/
background-size: cover; /*background-size: cover;*/
} /*}*/
.infoProfile .dropdown-menu { .infoProfile .dropdown-menu {
@ -4477,12 +4519,12 @@ footer:after {
color: #009DD9; color: #009DD9;
} }
label { /*label {*/
width: 23px; /*width: 23px;*/
height: 23px; /*height: 23px;*/
display: block; /*display: block;*/
position: relative; /*position: relative;*/
} /*}*/
/*input[type="checkbox"] + span {*/ /*input[type="checkbox"] + span {*/
/*position: absolute;*/ /*position: absolute;*/
@ -5752,13 +5794,13 @@ input[type="radio"]:checked + span {
#order-stages .checkbox label{ #order-stages .checkbox label{
margin-top: 0; margin-top: 0;
} }
#order-stages > div { /*#order-stages > div {*/
display: table; /*!*display: table;*!*/
width: 100%; /*!*width: 100%;*!*/
padding-bottom: 14px; /*padding-bottom: 14px;*/
border-bottom: 1px solid #2c2c2c; /*border-bottom: 1px solid #2c2c2c;*/
margin-bottom: 14px; /*margin-bottom: 14px;*/
} /*}*/
#order-stages > div:nth-last-child(2), #order-stages > div:last-child{ #order-stages > div:nth-last-child(2), #order-stages > div:last-child{
border: none; border: none;
} }
@ -5975,19 +6017,19 @@ a.linkS2[data-target="#withdraw-money"]{
display: table; display: table;
max-height: 845px; max-height: 845px;
overflow-y: scroll; overflow-y: scroll;
border-right: 1px solid #DADADA; /*border-right: 1px solid #DADADA;*/
border-left: 1px solid #DADADA; /*border-left: 1px solid #DADADA;*/
padding-bottom: 300px; /*padding-bottom: 300px;*/
} }
#message-chat-space { #message-chat-space {
height: 312px; height: 312px;
display: block; display: block;
overflow: auto; overflow: auto;
} }
#contact-chat-form{ /*#contact-chat-form{*/
position: absolute; /*position: absolute;*/
bottom: 0; /*bottom: 0;*/
} /*}*/
.dropdown-menu > li > a{ .dropdown-menu > li > a{
white-space: normal; white-space: normal;
} }

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

@ -40,19 +40,20 @@
/******/ return __webpack_require__(0); /******/ return __webpack_require__(0);
/******/ }) /******/ })
/************************************************************************/ /************************************************************************/
/******/ ([ /******/ ({
/* 0 */
/***/ 0:
/***/ function(module, exports, __webpack_require__) { /***/ function(module, exports, __webpack_require__) {
'use strict'; 'use strict';
var _custom_check = __webpack_require__(1); var _custom_check = __webpack_require__(27);
var _extended_field = __webpack_require__(2); var _extended_field = __webpack_require__(28);
var _ajax_set_filter = __webpack_require__(3); var _ajax_set_filter = __webpack_require__(29);
var _filter_toggle = __webpack_require__(4); var _filter_toggle = __webpack_require__(30);
function paginateTo(pageNum) { function paginateTo(pageNum) {
var $form = $('#filter-form'); var $form = $('#filter-form');
@ -73,7 +74,8 @@
}); });
/***/ }, /***/ },
/* 1 */
/***/ 27:
/***/ function(module, exports) { /***/ function(module, exports) {
"use strict"; "use strict";
@ -102,7 +104,8 @@
exports.customCheckInit = customCheckInit; exports.customCheckInit = customCheckInit;
/***/ }, /***/ },
/* 2 */
/***/ 28:
/***/ function(module, exports) { /***/ function(module, exports) {
'use strict'; 'use strict';
@ -132,7 +135,8 @@
exports.extendedFieldInit = extendedFieldInit; exports.extendedFieldInit = extendedFieldInit;
/***/ }, /***/ },
/* 3 */
/***/ 29:
/***/ function(module, exports) { /***/ function(module, exports) {
'use strict'; 'use strict';
@ -195,7 +199,8 @@
exports.modUrl = modUrl; exports.modUrl = modUrl;
/***/ }, /***/ },
/* 4 */
/***/ 30:
/***/ function(module, exports) { /***/ function(module, exports) {
'use strict'; 'use strict';
@ -225,4 +230,5 @@
exports.filterToggleInit = filterToggleInit; exports.filterToggleInit = filterToggleInit;
/***/ } /***/ }
/******/ ]);
/******/ });

@ -46,23 +46,23 @@
'use strict'; 'use strict';
var _file_upload = __webpack_require__(5); var _file_upload = __webpack_require__(31);
var _extended_field = __webpack_require__(2); var _extended_field = __webpack_require__(28);
var _custom_check = __webpack_require__(1); var _custom_check = __webpack_require__(27);
var _read_more = __webpack_require__(7); var _read_more = __webpack_require__(32);
var _only_one_checkbox = __webpack_require__(8); var _only_one_checkbox = __webpack_require__(33);
var _popups = __webpack_require__(9); var _popups = __webpack_require__(34);
var _scroll_on_required = __webpack_require__(10); var _scroll_on_required = __webpack_require__(35);
var _ajax_registration = __webpack_require__(11); var _ajax_registration = __webpack_require__(36);
var _test_seeds = __webpack_require__(12); var _test_seeds = __webpack_require__(37);
function showHideRealry() { function showHideRealry() {
var check = $('#checkbox-sb-realty'); var check = $('#checkbox-sb-realty');
@ -97,7 +97,76 @@
}); });
/***/ }, /***/ },
/* 1 */ /* 1 */,
/* 2 */,
/* 3 */
/***/ function(module, exports) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
function getCookie(name) {
var cookieValue = null;
if (document.cookie && document.cookie != '') {
var cookies = document.cookie.split(';');
for (var i = 0; i < cookies.length; i++) {
var cookie = jQuery.trim(cookies[i]);
if (cookie.substring(0, name.length + 1) == name + '=') {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
function humanFileSize(bytes, si) {
var thresh = si ? 1000 : 1024;
if (Math.abs(bytes) < thresh) return bytes + ' B';
var units = si ? ['kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'] : ['KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB'];
var u = -1;
do {
bytes /= thresh;
++u;
} while (Math.abs(bytes) >= thresh && u < units.length - 1);
return bytes.toFixed(1) + ' ' + units[u];
}
exports.humanFileSize = humanFileSize;
exports.getCookie = getCookie;
/***/ },
/* 4 */,
/* 5 */,
/* 6 */,
/* 7 */,
/* 8 */,
/* 9 */,
/* 10 */,
/* 11 */,
/* 12 */,
/* 13 */,
/* 14 */,
/* 15 */,
/* 16 */,
/* 17 */,
/* 18 */,
/* 19 */,
/* 20 */,
/* 21 */,
/* 22 */,
/* 23 */,
/* 24 */,
/* 25 */,
/* 26 */,
/* 27 */
/***/ function(module, exports) { /***/ function(module, exports) {
"use strict"; "use strict";
@ -126,7 +195,7 @@
exports.customCheckInit = customCheckInit; exports.customCheckInit = customCheckInit;
/***/ }, /***/ },
/* 2 */ /* 28 */
/***/ function(module, exports) { /***/ function(module, exports) {
'use strict'; 'use strict';
@ -156,9 +225,9 @@
exports.extendedFieldInit = extendedFieldInit; exports.extendedFieldInit = extendedFieldInit;
/***/ }, /***/ },
/* 3 */, /* 29 */,
/* 4 */, /* 30 */,
/* 5 */ /* 31 */
/***/ function(module, exports, __webpack_require__) { /***/ function(module, exports, __webpack_require__) {
'use strict'; 'use strict';
@ -168,7 +237,7 @@
}); });
exports.fileUploadInit = undefined; exports.fileUploadInit = undefined;
var _utils = __webpack_require__(6); var _utils = __webpack_require__(3);
function fileUploadInit() { function fileUploadInit() {
var $fileUploadContainer = $('#fileUploadContainer'); var $fileUploadContainer = $('#fileUploadContainer');
@ -206,51 +275,7 @@
exports.fileUploadInit = fileUploadInit; exports.fileUploadInit = fileUploadInit;
/***/ }, /***/ },
/* 6 */ /* 32 */
/***/ function(module, exports) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
function getCookie(name) {
var cookieValue = null;
if (document.cookie && document.cookie != '') {
var cookies = document.cookie.split(';');
for (var i = 0; i < cookies.length; i++) {
var cookie = jQuery.trim(cookies[i]);
if (cookie.substring(0, name.length + 1) == name + '=') {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
function humanFileSize(bytes, si) {
var thresh = si ? 1000 : 1024;
if (Math.abs(bytes) < thresh) return bytes + ' B';
var units = si ? ['kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'] : ['KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB'];
var u = -1;
do {
bytes /= thresh;
++u;
} while (Math.abs(bytes) >= thresh && u < units.length - 1);
return bytes.toFixed(1) + ' ' + units[u];
}
exports.humanFileSize = humanFileSize;
exports.getCookie = getCookie;
/***/ },
/* 7 */
/***/ function(module, exports) { /***/ function(module, exports) {
"use strict"; "use strict";
@ -265,18 +290,12 @@
$target.siblings(".complete").toggle(); $target.siblings(".complete").toggle();
$target.toggleClass("less"); $target.toggleClass("less");
}); });
// $(".more").toggle(function () {
// $(this).text("less..").siblings(".complete").show();
// }, function () {
// $(this).text("more..").siblings(".complete").hide();
// });
} }
exports.readMoreInit = readMoreInit; exports.readMoreInit = readMoreInit;
/***/ }, /***/ },
/* 8 */ /* 33 */
/***/ function(module, exports) { /***/ function(module, exports) {
"use strict"; "use strict";
@ -307,7 +326,7 @@
exports.onlyOneCheckboxInit = onlyOneCheckboxInit; exports.onlyOneCheckboxInit = onlyOneCheckboxInit;
/***/ }, /***/ },
/* 9 */ /* 34 */
/***/ function(module, exports) { /***/ function(module, exports) {
'use strict'; 'use strict';
@ -362,7 +381,7 @@
exports.addMessage = addMessage; exports.addMessage = addMessage;
/***/ }, /***/ },
/* 10 */ /* 35 */
/***/ function(module, exports) { /***/ function(module, exports) {
'use strict'; 'use strict';
@ -382,7 +401,7 @@
exports.scrollOnRequiredInit = scrollOnRequiredInit; exports.scrollOnRequiredInit = scrollOnRequiredInit;
/***/ }, /***/ },
/* 11 */ /* 36 */
/***/ function(module, exports) { /***/ function(module, exports) {
'use strict'; 'use strict';
@ -480,7 +499,7 @@
exports.ajaxRegistrationInit = ajaxRegistrationInit; exports.ajaxRegistrationInit = ajaxRegistrationInit;
/***/ }, /***/ },
/* 12 */ /* 37 */
/***/ function(module, exports) { /***/ function(module, exports) {
"use strict"; "use strict";

@ -40,21 +40,22 @@
/******/ return __webpack_require__(0); /******/ return __webpack_require__(0);
/******/ }) /******/ })
/************************************************************************/ /************************************************************************/
/******/ ([ /******/ ({
/* 0 */
/***/ 0:
/***/ function(module, exports, __webpack_require__) { /***/ function(module, exports, __webpack_require__) {
'use strict'; 'use strict';
var _image_upload = __webpack_require__(13); var _image_upload = __webpack_require__(38);
var _scroll_on_required = __webpack_require__(10); var _scroll_on_required = __webpack_require__(35);
var _popups = __webpack_require__(9); var _popups = __webpack_require__(34);
var _ajax_registration = __webpack_require__(11); var _ajax_registration = __webpack_require__(36);
var _ajax_send_form_data = __webpack_require__(14); var _ajax_send_form_data = __webpack_require__(39);
$(function () { $(function () {
(0, _image_upload.imageUploadInit)(); (0, _image_upload.imageUploadInit)();
@ -67,12 +68,8 @@
}); });
/***/ }, /***/ },
/* 1 */,
/* 2 */, /***/ 3:
/* 3 */,
/* 4 */,
/* 5 */,
/* 6 */
/***/ function(module, exports) { /***/ function(module, exports) {
'use strict'; 'use strict';
@ -116,9 +113,8 @@
exports.getCookie = getCookie; exports.getCookie = getCookie;
/***/ }, /***/ },
/* 7 */,
/* 8 */, /***/ 34:
/* 9 */
/***/ function(module, exports) { /***/ function(module, exports) {
'use strict'; 'use strict';
@ -173,7 +169,8 @@
exports.addMessage = addMessage; exports.addMessage = addMessage;
/***/ }, /***/ },
/* 10 */
/***/ 35:
/***/ function(module, exports) { /***/ function(module, exports) {
'use strict'; 'use strict';
@ -193,7 +190,8 @@
exports.scrollOnRequiredInit = scrollOnRequiredInit; exports.scrollOnRequiredInit = scrollOnRequiredInit;
/***/ }, /***/ },
/* 11 */
/***/ 36:
/***/ function(module, exports) { /***/ function(module, exports) {
'use strict'; 'use strict';
@ -291,8 +289,8 @@
exports.ajaxRegistrationInit = ajaxRegistrationInit; exports.ajaxRegistrationInit = ajaxRegistrationInit;
/***/ }, /***/ },
/* 12 */,
/* 13 */ /***/ 38:
/***/ function(module, exports, __webpack_require__) { /***/ function(module, exports, __webpack_require__) {
'use strict'; 'use strict';
@ -302,7 +300,7 @@
}); });
exports.imageUploadInit = undefined; exports.imageUploadInit = undefined;
var _utils = __webpack_require__(6); var _utils = __webpack_require__(3);
// function previewImg() { // function previewImg() {
// let $fileUploadWidgets = $('.file-upload-widget'); // let $fileUploadWidgets = $('.file-upload-widget');
@ -371,7 +369,8 @@
// export {imageUploadInit, previewImg} // export {imageUploadInit, previewImg}
/***/ }, /***/ },
/* 14 */
/***/ 39:
/***/ function(module, exports, __webpack_require__) { /***/ function(module, exports, __webpack_require__) {
"use strict"; "use strict";
@ -381,7 +380,7 @@
}); });
exports.sendFormData = undefined; exports.sendFormData = undefined;
var _utils = __webpack_require__(6); var _utils = __webpack_require__(3);
function sendFormData(e) { function sendFormData(e) {
e.preventDefault(); e.preventDefault();
@ -430,4 +429,5 @@
exports.sendFormData = sendFormData; exports.sendFormData = sendFormData;
/***/ } /***/ }
/******/ ]);
/******/ });

@ -47,9 +47,9 @@
'use strict'; 'use strict';
var _custom_select = __webpack_require__(15); var _custom_select = __webpack_require__(40);
var _custom_check = __webpack_require__(1); var _custom_check = __webpack_require__(27);
$(function () { $(function () {
(0, _custom_select.customSelectInit)(); (0, _custom_select.customSelectInit)();
@ -58,7 +58,7 @@
/***/ }, /***/ },
/***/ 1: /***/ 27:
/***/ function(module, exports) { /***/ function(module, exports) {
"use strict"; "use strict";
@ -88,7 +88,7 @@
/***/ }, /***/ },
/***/ 15: /***/ 40:
/***/ function(module, exports) { /***/ function(module, exports) {
'use strict'; 'use strict';

@ -40,19 +40,20 @@
/******/ return __webpack_require__(0); /******/ return __webpack_require__(0);
/******/ }) /******/ })
/************************************************************************/ /************************************************************************/
/******/ ([ /******/ ({
/* 0 */
/***/ 0:
/***/ function(module, exports, __webpack_require__) { /***/ function(module, exports, __webpack_require__) {
'use strict'; 'use strict';
var _show_hide = __webpack_require__(16); var _show_hide = __webpack_require__(41);
var _bootstrap_tabs = __webpack_require__(17); var _bootstrap_tabs = __webpack_require__(42);
var _sort_by = __webpack_require__(18); var _sort_by = __webpack_require__(43);
var _custom_check = __webpack_require__(1); var _custom_check = __webpack_require__(27);
$(function () { $(function () {
(0, _bootstrap_tabs.restoreTab)(); (0, _bootstrap_tabs.restoreTab)();
@ -64,40 +65,8 @@
}); });
/***/ }, /***/ },
/* 1 */
/***/ function(module, exports) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
function customCheckInit() {
function tuneCheckBoxes($boxes) {
var currentState = $boxes.find("input").prop("checked") ? 'checked' : 'not-checked';
$boxes.find("div").hide();
$boxes.find("div." + currentState).show();
}
var $boxes = $('.custom-check'); /***/ 3:
tuneCheckBoxes($boxes);
$boxes.on("click", function (e) {
var inside_checkBox = $(e.target).parent().find("input");
inside_checkBox.prop("checked", !inside_checkBox.prop("checked"));
tuneCheckBoxes($boxes);
e.preventDefault();
return false;
});
}
exports.customCheckInit = customCheckInit;
/***/ },
/* 2 */,
/* 3 */,
/* 4 */,
/* 5 */,
/* 6 */
/***/ function(module, exports) { /***/ function(module, exports) {
'use strict'; 'use strict';
@ -141,16 +110,38 @@
exports.getCookie = getCookie; exports.getCookie = getCookie;
/***/ }, /***/ },
/* 7 */,
/* 8 */, /***/ 27:
/* 9 */, /***/ function(module, exports) {
/* 10 */,
/* 11 */, "use strict";
/* 12 */,
/* 13 */, Object.defineProperty(exports, "__esModule", {
/* 14 */, value: true
/* 15 */, });
/* 16 */ function customCheckInit() {
function tuneCheckBoxes($boxes) {
var currentState = $boxes.find("input").prop("checked") ? 'checked' : 'not-checked';
$boxes.find("div").hide();
$boxes.find("div." + currentState).show();
}
var $boxes = $('.custom-check');
tuneCheckBoxes($boxes);
$boxes.on("click", function (e) {
var inside_checkBox = $(e.target).parent().find("input");
inside_checkBox.prop("checked", !inside_checkBox.prop("checked"));
tuneCheckBoxes($boxes);
e.preventDefault();
return false;
});
}
exports.customCheckInit = customCheckInit;
/***/ },
/***/ 41:
/***/ function(module, exports) { /***/ function(module, exports) {
"use strict"; "use strict";
@ -166,7 +157,8 @@
exports.toggler = toggler; exports.toggler = toggler;
/***/ }, /***/ },
/* 17 */
/***/ 42:
/***/ function(module, exports) { /***/ function(module, exports) {
"use strict"; "use strict";
@ -201,7 +193,8 @@
exports.restoreTab = restoreTab; exports.restoreTab = restoreTab;
/***/ }, /***/ },
/* 18 */
/***/ 43:
/***/ function(module, exports, __webpack_require__) { /***/ function(module, exports, __webpack_require__) {
"use strict"; "use strict";
@ -211,7 +204,7 @@
}); });
exports.sortRealtyBy = undefined; exports.sortRealtyBy = undefined;
var _utils = __webpack_require__(6); var _utils = __webpack_require__(3);
function sortRealtyBy(data, container_id) { function sortRealtyBy(data, container_id) {
console.log("sort_by = ", data); console.log("sort_by = ", data);
@ -234,4 +227,5 @@
exports.sortRealtyBy = sortRealtyBy; exports.sortRealtyBy = sortRealtyBy;
/***/ } /***/ }
/******/ ]);
/******/ });

@ -0,0 +1,79 @@
/******/ (function(modules) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = {};
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId])
/******/ return installedModules[moduleId].exports;
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ exports: {},
/******/ id: moduleId,
/******/ loaded: false
/******/ };
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/ // Flag the module as loaded
/******/ module.loaded = true;
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "";
/******/ // Load entry module and return exports
/******/ return __webpack_require__(0);
/******/ })
/************************************************************************/
/******/ ({
/***/ 0:
/***/ function(module, exports, __webpack_require__) {
'use strict';
var _utils_debug = __webpack_require__(44);
// DEBUG
window.print = {};
window.print.ws_print = _utils_debug.ws_print;
/***/ },
/***/ 44:
/***/ function(module, exports) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
function ws_print() {
for (var _len = arguments.length, messages = Array(_len), _key = 0; _key < _len; _key++) {
messages[_key] = arguments[_key];
}
var message = messages.join(' ');
console.log('%c WS: ' + message, 'background: white; color: blue');
}
exports.ws_print = ws_print;
/***/ }
/******/ });

@ -47,7 +47,7 @@
'use strict'; 'use strict';
var _popupYoutube = __webpack_require__(19); var _popupYoutube = __webpack_require__(45);
$(function () { $(function () {
(0, _popupYoutube.popupYoutubeInit)(); (0, _popupYoutube.popupYoutubeInit)();
@ -55,7 +55,7 @@
/***/ }, /***/ },
/***/ 19: /***/ 45:
/***/ function(module, exports) { /***/ function(module, exports) {
'use strict'; 'use strict';

@ -40,21 +40,22 @@
/******/ return __webpack_require__(0); /******/ return __webpack_require__(0);
/******/ }) /******/ })
/************************************************************************/ /************************************************************************/
/******/ ([ /******/ ({
/* 0 */
/***/ 0:
/***/ function(module, exports, __webpack_require__) { /***/ function(module, exports, __webpack_require__) {
'use strict'; 'use strict';
var _SelectedContainer = __webpack_require__(20); var _SelectedContainer = __webpack_require__(46);
var _SelectedContainer2 = _interopRequireDefault(_SelectedContainer); var _SelectedContainer2 = _interopRequireDefault(_SelectedContainer);
var _NoTreeSelect = __webpack_require__(24); var _NoTreeSelect = __webpack_require__(50);
var _NoTreeSelect2 = _interopRequireDefault(_NoTreeSelect); var _NoTreeSelect2 = _interopRequireDefault(_NoTreeSelect);
var _TreeSelect = __webpack_require__(26); var _TreeSelect = __webpack_require__(52);
var _TreeSelect2 = _interopRequireDefault(_TreeSelect); var _TreeSelect2 = _interopRequireDefault(_TreeSelect);
@ -120,26 +121,8 @@
}); });
/***/ }, /***/ },
/* 1 */,
/* 2 */, /***/ 46:
/* 3 */,
/* 4 */,
/* 5 */,
/* 6 */,
/* 7 */,
/* 8 */,
/* 9 */,
/* 10 */,
/* 11 */,
/* 12 */,
/* 13 */,
/* 14 */,
/* 15 */,
/* 16 */,
/* 17 */,
/* 18 */,
/* 19 */,
/* 20 */
/***/ function(module, exports, __webpack_require__) { /***/ function(module, exports, __webpack_require__) {
'use strict'; 'use strict';
@ -154,15 +137,15 @@
var _desc, _value, _class; // ` var _desc, _value, _class; // `
var _DataTree = __webpack_require__(21); var _DataTree = __webpack_require__(47);
var _DataTree2 = _interopRequireDefault(_DataTree); var _DataTree2 = _interopRequireDefault(_DataTree);
var _NoTreeData = __webpack_require__(22); var _NoTreeData = __webpack_require__(48);
var _NoTreeData2 = _interopRequireDefault(_NoTreeData); var _NoTreeData2 = _interopRequireDefault(_NoTreeData);
var _decorators = __webpack_require__(23); var _decorators = __webpack_require__(49);
var _decorators2 = _interopRequireDefault(_decorators); var _decorators2 = _interopRequireDefault(_decorators);
@ -394,7 +377,8 @@
exports.default = SelectedContainer; exports.default = SelectedContainer;
/***/ }, /***/ },
/* 21 */
/***/ 47:
/***/ function(module, exports) { /***/ function(module, exports) {
"use strict"; "use strict";
@ -549,7 +533,8 @@
exports.default = DataTree; exports.default = DataTree;
/***/ }, /***/ },
/* 22 */
/***/ 48:
/***/ function(module, exports) { /***/ function(module, exports) {
"use strict"; "use strict";
@ -605,7 +590,8 @@
exports.default = NoTreeData; exports.default = NoTreeData;
/***/ }, /***/ },
/* 23 */
/***/ 49:
/***/ function(module, exports) { /***/ function(module, exports) {
"use strict"; "use strict";
@ -689,7 +675,8 @@
// export {onBind}; // export {onBind};
/***/ }, /***/ },
/* 24 */
/***/ 50:
/***/ function(module, exports, __webpack_require__) { /***/ function(module, exports, __webpack_require__) {
'use strict'; 'use strict';
@ -703,9 +690,9 @@
var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
var _AbsBaseSelect2 = __webpack_require__(25); var _AbsBaseSelect2 = __webpack_require__(51);
var _NoTreeData = __webpack_require__(22); var _NoTreeData = __webpack_require__(48);
var _NoTreeData2 = _interopRequireDefault(_NoTreeData); var _NoTreeData2 = _interopRequireDefault(_NoTreeData);
@ -766,7 +753,8 @@
exports.default = NoTreeSelect; exports.default = NoTreeSelect;
/***/ }, /***/ },
/* 25 */
/***/ 51:
/***/ function(module, exports) { /***/ function(module, exports) {
"use strict"; "use strict";
@ -1317,7 +1305,8 @@
exports.AbsBaseSelect = AbsBaseSelect; exports.AbsBaseSelect = AbsBaseSelect;
/***/ }, /***/ },
/* 26 */
/***/ 52:
/***/ function(module, exports, __webpack_require__) { /***/ function(module, exports, __webpack_require__) {
'use strict'; 'use strict';
@ -1331,9 +1320,9 @@
var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
var _AbsBaseSelect2 = __webpack_require__(25); var _AbsBaseSelect2 = __webpack_require__(51);
var _DataTree = __webpack_require__(21); var _DataTree = __webpack_require__(47);
var _DataTree2 = _interopRequireDefault(_DataTree); var _DataTree2 = _interopRequireDefault(_DataTree);
@ -1442,4 +1431,5 @@
exports.default = TreeSelect; exports.default = TreeSelect;
/***/ } /***/ }
/******/ ]);
/******/ });

@ -40,33 +40,34 @@
/******/ return __webpack_require__(0); /******/ return __webpack_require__(0);
/******/ }) /******/ })
/************************************************************************/ /************************************************************************/
/******/ ([ /******/ ({
/* 0 */
/***/ 0:
/***/ function(module, exports, __webpack_require__) { /***/ function(module, exports, __webpack_require__) {
'use strict'; 'use strict';
var _SelectedContainer = __webpack_require__(20); var _SelectedContainer = __webpack_require__(46);
var _SelectedContainer2 = _interopRequireDefault(_SelectedContainer); var _SelectedContainer2 = _interopRequireDefault(_SelectedContainer);
var _SelectedContainerCreate = __webpack_require__(27); var _SelectedContainerCreate = __webpack_require__(53);
var _SelectedContainerCreate2 = _interopRequireDefault(_SelectedContainerCreate); var _SelectedContainerCreate2 = _interopRequireDefault(_SelectedContainerCreate);
var _NoTreeSelect = __webpack_require__(24); var _NoTreeSelect = __webpack_require__(50);
var _NoTreeSelect2 = _interopRequireDefault(_NoTreeSelect); var _NoTreeSelect2 = _interopRequireDefault(_NoTreeSelect);
var _TreeSelect = __webpack_require__(26); var _TreeSelect = __webpack_require__(52);
var _TreeSelect2 = _interopRequireDefault(_TreeSelect); var _TreeSelect2 = _interopRequireDefault(_TreeSelect);
var _SingleTreeSelect = __webpack_require__(28); var _SingleTreeSelect = __webpack_require__(54);
var _SingleTreeSelect2 = _interopRequireDefault(_SingleTreeSelect); var _SingleTreeSelect2 = _interopRequireDefault(_SingleTreeSelect);
var _SelectOrCreate = __webpack_require__(29); var _SelectOrCreate = __webpack_require__(55);
var _SelectOrCreate2 = _interopRequireDefault(_SelectOrCreate); var _SelectOrCreate2 = _interopRequireDefault(_SelectOrCreate);
@ -167,26 +168,8 @@
}); });
/***/ }, /***/ },
/* 1 */,
/* 2 */, /***/ 46:
/* 3 */,
/* 4 */,
/* 5 */,
/* 6 */,
/* 7 */,
/* 8 */,
/* 9 */,
/* 10 */,
/* 11 */,
/* 12 */,
/* 13 */,
/* 14 */,
/* 15 */,
/* 16 */,
/* 17 */,
/* 18 */,
/* 19 */,
/* 20 */
/***/ function(module, exports, __webpack_require__) { /***/ function(module, exports, __webpack_require__) {
'use strict'; 'use strict';
@ -201,15 +184,15 @@
var _desc, _value, _class; // ` var _desc, _value, _class; // `
var _DataTree = __webpack_require__(21); var _DataTree = __webpack_require__(47);
var _DataTree2 = _interopRequireDefault(_DataTree); var _DataTree2 = _interopRequireDefault(_DataTree);
var _NoTreeData = __webpack_require__(22); var _NoTreeData = __webpack_require__(48);
var _NoTreeData2 = _interopRequireDefault(_NoTreeData); var _NoTreeData2 = _interopRequireDefault(_NoTreeData);
var _decorators = __webpack_require__(23); var _decorators = __webpack_require__(49);
var _decorators2 = _interopRequireDefault(_decorators); var _decorators2 = _interopRequireDefault(_decorators);
@ -441,7 +424,8 @@
exports.default = SelectedContainer; exports.default = SelectedContainer;
/***/ }, /***/ },
/* 21 */
/***/ 47:
/***/ function(module, exports) { /***/ function(module, exports) {
"use strict"; "use strict";
@ -596,7 +580,8 @@
exports.default = DataTree; exports.default = DataTree;
/***/ }, /***/ },
/* 22 */
/***/ 48:
/***/ function(module, exports) { /***/ function(module, exports) {
"use strict"; "use strict";
@ -652,7 +637,8 @@
exports.default = NoTreeData; exports.default = NoTreeData;
/***/ }, /***/ },
/* 23 */
/***/ 49:
/***/ function(module, exports) { /***/ function(module, exports) {
"use strict"; "use strict";
@ -736,7 +722,8 @@
// export {onBind}; // export {onBind};
/***/ }, /***/ },
/* 24 */
/***/ 50:
/***/ function(module, exports, __webpack_require__) { /***/ function(module, exports, __webpack_require__) {
'use strict'; 'use strict';
@ -750,9 +737,9 @@
var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
var _AbsBaseSelect2 = __webpack_require__(25); var _AbsBaseSelect2 = __webpack_require__(51);
var _NoTreeData = __webpack_require__(22); var _NoTreeData = __webpack_require__(48);
var _NoTreeData2 = _interopRequireDefault(_NoTreeData); var _NoTreeData2 = _interopRequireDefault(_NoTreeData);
@ -813,7 +800,8 @@
exports.default = NoTreeSelect; exports.default = NoTreeSelect;
/***/ }, /***/ },
/* 25 */
/***/ 51:
/***/ function(module, exports) { /***/ function(module, exports) {
"use strict"; "use strict";
@ -1364,7 +1352,8 @@
exports.AbsBaseSelect = AbsBaseSelect; exports.AbsBaseSelect = AbsBaseSelect;
/***/ }, /***/ },
/* 26 */
/***/ 52:
/***/ function(module, exports, __webpack_require__) { /***/ function(module, exports, __webpack_require__) {
'use strict'; 'use strict';
@ -1378,9 +1367,9 @@
var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
var _AbsBaseSelect2 = __webpack_require__(25); var _AbsBaseSelect2 = __webpack_require__(51);
var _DataTree = __webpack_require__(21); var _DataTree = __webpack_require__(47);
var _DataTree2 = _interopRequireDefault(_DataTree); var _DataTree2 = _interopRequireDefault(_DataTree);
@ -1489,7 +1478,8 @@
exports.default = TreeSelect; exports.default = TreeSelect;
/***/ }, /***/ },
/* 27 */
/***/ 53:
/***/ function(module, exports, __webpack_require__) { /***/ function(module, exports, __webpack_require__) {
'use strict'; 'use strict';
@ -1505,11 +1495,11 @@
var _desc, _value, _class; var _desc, _value, _class;
var _SelectedContainer2 = __webpack_require__(20); var _SelectedContainer2 = __webpack_require__(46);
var _SelectedContainer3 = _interopRequireDefault(_SelectedContainer2); var _SelectedContainer3 = _interopRequireDefault(_SelectedContainer2);
var _decorators = __webpack_require__(23); var _decorators = __webpack_require__(49);
var _decorators2 = _interopRequireDefault(_decorators); var _decorators2 = _interopRequireDefault(_decorators);
@ -1590,7 +1580,8 @@
exports.default = SelectedContainerCreate; exports.default = SelectedContainerCreate;
/***/ }, /***/ },
/* 28 */
/***/ 54:
/***/ function(module, exports, __webpack_require__) { /***/ function(module, exports, __webpack_require__) {
'use strict'; 'use strict';
@ -1602,9 +1593,9 @@
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _AbsBaseSelect = __webpack_require__(25); var _AbsBaseSelect = __webpack_require__(51);
var _TreeSelect2 = __webpack_require__(26); var _TreeSelect2 = __webpack_require__(52);
var _TreeSelect3 = _interopRequireDefault(_TreeSelect2); var _TreeSelect3 = _interopRequireDefault(_TreeSelect2);
@ -1685,7 +1676,8 @@
exports.default = SingleTreeSelect; exports.default = SingleTreeSelect;
/***/ }, /***/ },
/* 29 */
/***/ 55:
/***/ function(module, exports, __webpack_require__) { /***/ function(module, exports, __webpack_require__) {
'use strict'; 'use strict';
@ -1699,9 +1691,9 @@
var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
var _AbsBaseSelect2 = __webpack_require__(25); var _AbsBaseSelect2 = __webpack_require__(51);
var _NoTreeData = __webpack_require__(22); var _NoTreeData = __webpack_require__(48);
var _NoTreeData2 = _interopRequireDefault(_NoTreeData); var _NoTreeData2 = _interopRequireDefault(_NoTreeData);
@ -1923,4 +1915,5 @@
exports.default = SelectOrCreate; exports.default = SelectOrCreate;
/***/ } /***/ }
/******/ ]);
/******/ });

@ -40,33 +40,34 @@
/******/ return __webpack_require__(0); /******/ return __webpack_require__(0);
/******/ }) /******/ })
/************************************************************************/ /************************************************************************/
/******/ ([ /******/ ({
/* 0 */
/***/ 0:
/***/ function(module, exports, __webpack_require__) { /***/ function(module, exports, __webpack_require__) {
'use strict'; 'use strict';
var _SelectedContainer = __webpack_require__(20); var _SelectedContainer = __webpack_require__(46);
var _SelectedContainer2 = _interopRequireDefault(_SelectedContainer); var _SelectedContainer2 = _interopRequireDefault(_SelectedContainer);
var _SelectedContainerCreate = __webpack_require__(27); var _SelectedContainerCreate = __webpack_require__(53);
var _SelectedContainerCreate2 = _interopRequireDefault(_SelectedContainerCreate); var _SelectedContainerCreate2 = _interopRequireDefault(_SelectedContainerCreate);
var _NoTreeSelect = __webpack_require__(24); var _NoTreeSelect = __webpack_require__(50);
var _NoTreeSelect2 = _interopRequireDefault(_NoTreeSelect); var _NoTreeSelect2 = _interopRequireDefault(_NoTreeSelect);
var _TreeSelect = __webpack_require__(26); var _TreeSelect = __webpack_require__(52);
var _TreeSelect2 = _interopRequireDefault(_TreeSelect); var _TreeSelect2 = _interopRequireDefault(_TreeSelect);
var _SingleTreeSelect = __webpack_require__(28); var _SingleTreeSelect = __webpack_require__(54);
var _SingleTreeSelect2 = _interopRequireDefault(_SingleTreeSelect); var _SingleTreeSelect2 = _interopRequireDefault(_SingleTreeSelect);
var _SelectOrCreate = __webpack_require__(29); var _SelectOrCreate = __webpack_require__(55);
var _SelectOrCreate2 = _interopRequireDefault(_SelectOrCreate); var _SelectOrCreate2 = _interopRequireDefault(_SelectOrCreate);
@ -176,8 +177,10 @@
} else { } else {
//Если перешли со страницы профиля по кнопке "Добавить заказ" //Если перешли со страницы профиля по кнопке "Добавить заказ"
var id = window.location.hash.replace("#", ""); var id = window.location.hash.replace("#", "");
if (id) sb_realty_top.setElementById(id); if (id) {
select_realty.add(id); sb_realty_top.setElementById(id);
select_realty.add(id);
}
} }
}); });
select_realty.on("add", function (args) { select_realty.on("add", function (args) {
@ -212,26 +215,8 @@
}); });
/***/ }, /***/ },
/* 1 */,
/* 2 */, /***/ 46:
/* 3 */,
/* 4 */,
/* 5 */,
/* 6 */,
/* 7 */,
/* 8 */,
/* 9 */,
/* 10 */,
/* 11 */,
/* 12 */,
/* 13 */,
/* 14 */,
/* 15 */,
/* 16 */,
/* 17 */,
/* 18 */,
/* 19 */,
/* 20 */
/***/ function(module, exports, __webpack_require__) { /***/ function(module, exports, __webpack_require__) {
'use strict'; 'use strict';
@ -246,15 +231,15 @@
var _desc, _value, _class; // ` var _desc, _value, _class; // `
var _DataTree = __webpack_require__(21); var _DataTree = __webpack_require__(47);
var _DataTree2 = _interopRequireDefault(_DataTree); var _DataTree2 = _interopRequireDefault(_DataTree);
var _NoTreeData = __webpack_require__(22); var _NoTreeData = __webpack_require__(48);
var _NoTreeData2 = _interopRequireDefault(_NoTreeData); var _NoTreeData2 = _interopRequireDefault(_NoTreeData);
var _decorators = __webpack_require__(23); var _decorators = __webpack_require__(49);
var _decorators2 = _interopRequireDefault(_decorators); var _decorators2 = _interopRequireDefault(_decorators);
@ -486,7 +471,8 @@
exports.default = SelectedContainer; exports.default = SelectedContainer;
/***/ }, /***/ },
/* 21 */
/***/ 47:
/***/ function(module, exports) { /***/ function(module, exports) {
"use strict"; "use strict";
@ -641,7 +627,8 @@
exports.default = DataTree; exports.default = DataTree;
/***/ }, /***/ },
/* 22 */
/***/ 48:
/***/ function(module, exports) { /***/ function(module, exports) {
"use strict"; "use strict";
@ -697,7 +684,8 @@
exports.default = NoTreeData; exports.default = NoTreeData;
/***/ }, /***/ },
/* 23 */
/***/ 49:
/***/ function(module, exports) { /***/ function(module, exports) {
"use strict"; "use strict";
@ -781,7 +769,8 @@
// export {onBind}; // export {onBind};
/***/ }, /***/ },
/* 24 */
/***/ 50:
/***/ function(module, exports, __webpack_require__) { /***/ function(module, exports, __webpack_require__) {
'use strict'; 'use strict';
@ -795,9 +784,9 @@
var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
var _AbsBaseSelect2 = __webpack_require__(25); var _AbsBaseSelect2 = __webpack_require__(51);
var _NoTreeData = __webpack_require__(22); var _NoTreeData = __webpack_require__(48);
var _NoTreeData2 = _interopRequireDefault(_NoTreeData); var _NoTreeData2 = _interopRequireDefault(_NoTreeData);
@ -858,7 +847,8 @@
exports.default = NoTreeSelect; exports.default = NoTreeSelect;
/***/ }, /***/ },
/* 25 */
/***/ 51:
/***/ function(module, exports) { /***/ function(module, exports) {
"use strict"; "use strict";
@ -1409,7 +1399,8 @@
exports.AbsBaseSelect = AbsBaseSelect; exports.AbsBaseSelect = AbsBaseSelect;
/***/ }, /***/ },
/* 26 */
/***/ 52:
/***/ function(module, exports, __webpack_require__) { /***/ function(module, exports, __webpack_require__) {
'use strict'; 'use strict';
@ -1423,9 +1414,9 @@
var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
var _AbsBaseSelect2 = __webpack_require__(25); var _AbsBaseSelect2 = __webpack_require__(51);
var _DataTree = __webpack_require__(21); var _DataTree = __webpack_require__(47);
var _DataTree2 = _interopRequireDefault(_DataTree); var _DataTree2 = _interopRequireDefault(_DataTree);
@ -1534,7 +1525,8 @@
exports.default = TreeSelect; exports.default = TreeSelect;
/***/ }, /***/ },
/* 27 */
/***/ 53:
/***/ function(module, exports, __webpack_require__) { /***/ function(module, exports, __webpack_require__) {
'use strict'; 'use strict';
@ -1550,11 +1542,11 @@
var _desc, _value, _class; var _desc, _value, _class;
var _SelectedContainer2 = __webpack_require__(20); var _SelectedContainer2 = __webpack_require__(46);
var _SelectedContainer3 = _interopRequireDefault(_SelectedContainer2); var _SelectedContainer3 = _interopRequireDefault(_SelectedContainer2);
var _decorators = __webpack_require__(23); var _decorators = __webpack_require__(49);
var _decorators2 = _interopRequireDefault(_decorators); var _decorators2 = _interopRequireDefault(_decorators);
@ -1635,7 +1627,8 @@
exports.default = SelectedContainerCreate; exports.default = SelectedContainerCreate;
/***/ }, /***/ },
/* 28 */
/***/ 54:
/***/ function(module, exports, __webpack_require__) { /***/ function(module, exports, __webpack_require__) {
'use strict'; 'use strict';
@ -1647,9 +1640,9 @@
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _AbsBaseSelect = __webpack_require__(25); var _AbsBaseSelect = __webpack_require__(51);
var _TreeSelect2 = __webpack_require__(26); var _TreeSelect2 = __webpack_require__(52);
var _TreeSelect3 = _interopRequireDefault(_TreeSelect2); var _TreeSelect3 = _interopRequireDefault(_TreeSelect2);
@ -1730,7 +1723,8 @@
exports.default = SingleTreeSelect; exports.default = SingleTreeSelect;
/***/ }, /***/ },
/* 29 */
/***/ 55:
/***/ function(module, exports, __webpack_require__) { /***/ function(module, exports, __webpack_require__) {
'use strict'; 'use strict';
@ -1744,9 +1738,9 @@
var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
var _AbsBaseSelect2 = __webpack_require__(25); var _AbsBaseSelect2 = __webpack_require__(51);
var _NoTreeData = __webpack_require__(22); var _NoTreeData = __webpack_require__(48);
var _NoTreeData2 = _interopRequireDefault(_NoTreeData); var _NoTreeData2 = _interopRequireDefault(_NoTreeData);
@ -1968,4 +1962,5 @@
exports.default = SelectOrCreate; exports.default = SelectOrCreate;
/***/ } /***/ }
/******/ ]);
/******/ });

@ -40,37 +40,38 @@
/******/ return __webpack_require__(0); /******/ return __webpack_require__(0);
/******/ }) /******/ })
/************************************************************************/ /************************************************************************/
/******/ ([ /******/ ({
/* 0 */
/***/ 0:
/***/ function(module, exports, __webpack_require__) { /***/ function(module, exports, __webpack_require__) {
'use strict'; 'use strict';
var _SelectedContainer = __webpack_require__(20); var _SelectedContainer = __webpack_require__(46);
var _SelectedContainer2 = _interopRequireDefault(_SelectedContainer); var _SelectedContainer2 = _interopRequireDefault(_SelectedContainer);
var _SelectedContainerCreate = __webpack_require__(27); var _SelectedContainerCreate = __webpack_require__(53);
var _SelectedContainerCreate2 = _interopRequireDefault(_SelectedContainerCreate); var _SelectedContainerCreate2 = _interopRequireDefault(_SelectedContainerCreate);
var _NoTreeSelect = __webpack_require__(24); var _NoTreeSelect = __webpack_require__(50);
var _NoTreeSelect2 = _interopRequireDefault(_NoTreeSelect); var _NoTreeSelect2 = _interopRequireDefault(_NoTreeSelect);
var _TreeSelect = __webpack_require__(26); var _TreeSelect = __webpack_require__(52);
var _TreeSelect2 = _interopRequireDefault(_TreeSelect); var _TreeSelect2 = _interopRequireDefault(_TreeSelect);
var _SingleTreeSelect = __webpack_require__(28); var _SingleTreeSelect = __webpack_require__(54);
var _SingleTreeSelect2 = _interopRequireDefault(_SingleTreeSelect); var _SingleTreeSelect2 = _interopRequireDefault(_SingleTreeSelect);
var _SelectOrCreate = __webpack_require__(29); var _SelectOrCreate = __webpack_require__(55);
var _SelectOrCreate2 = _interopRequireDefault(_SelectOrCreate); var _SelectOrCreate2 = _interopRequireDefault(_SelectOrCreate);
var _utils = __webpack_require__(6); var _utils = __webpack_require__(3);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
@ -229,12 +230,8 @@
}); });
/***/ }, /***/ },
/* 1 */,
/* 2 */, /***/ 3:
/* 3 */,
/* 4 */,
/* 5 */,
/* 6 */
/***/ function(module, exports) { /***/ function(module, exports) {
'use strict'; 'use strict';
@ -278,20 +275,8 @@
exports.getCookie = getCookie; exports.getCookie = getCookie;
/***/ }, /***/ },
/* 7 */,
/* 8 */, /***/ 46:
/* 9 */,
/* 10 */,
/* 11 */,
/* 12 */,
/* 13 */,
/* 14 */,
/* 15 */,
/* 16 */,
/* 17 */,
/* 18 */,
/* 19 */,
/* 20 */
/***/ function(module, exports, __webpack_require__) { /***/ function(module, exports, __webpack_require__) {
'use strict'; 'use strict';
@ -306,15 +291,15 @@
var _desc, _value, _class; // ` var _desc, _value, _class; // `
var _DataTree = __webpack_require__(21); var _DataTree = __webpack_require__(47);
var _DataTree2 = _interopRequireDefault(_DataTree); var _DataTree2 = _interopRequireDefault(_DataTree);
var _NoTreeData = __webpack_require__(22); var _NoTreeData = __webpack_require__(48);
var _NoTreeData2 = _interopRequireDefault(_NoTreeData); var _NoTreeData2 = _interopRequireDefault(_NoTreeData);
var _decorators = __webpack_require__(23); var _decorators = __webpack_require__(49);
var _decorators2 = _interopRequireDefault(_decorators); var _decorators2 = _interopRequireDefault(_decorators);
@ -546,7 +531,8 @@
exports.default = SelectedContainer; exports.default = SelectedContainer;
/***/ }, /***/ },
/* 21 */
/***/ 47:
/***/ function(module, exports) { /***/ function(module, exports) {
"use strict"; "use strict";
@ -701,7 +687,8 @@
exports.default = DataTree; exports.default = DataTree;
/***/ }, /***/ },
/* 22 */
/***/ 48:
/***/ function(module, exports) { /***/ function(module, exports) {
"use strict"; "use strict";
@ -757,7 +744,8 @@
exports.default = NoTreeData; exports.default = NoTreeData;
/***/ }, /***/ },
/* 23 */
/***/ 49:
/***/ function(module, exports) { /***/ function(module, exports) {
"use strict"; "use strict";
@ -841,7 +829,8 @@
// export {onBind}; // export {onBind};
/***/ }, /***/ },
/* 24 */
/***/ 50:
/***/ function(module, exports, __webpack_require__) { /***/ function(module, exports, __webpack_require__) {
'use strict'; 'use strict';
@ -855,9 +844,9 @@
var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
var _AbsBaseSelect2 = __webpack_require__(25); var _AbsBaseSelect2 = __webpack_require__(51);
var _NoTreeData = __webpack_require__(22); var _NoTreeData = __webpack_require__(48);
var _NoTreeData2 = _interopRequireDefault(_NoTreeData); var _NoTreeData2 = _interopRequireDefault(_NoTreeData);
@ -918,7 +907,8 @@
exports.default = NoTreeSelect; exports.default = NoTreeSelect;
/***/ }, /***/ },
/* 25 */
/***/ 51:
/***/ function(module, exports) { /***/ function(module, exports) {
"use strict"; "use strict";
@ -1469,7 +1459,8 @@
exports.AbsBaseSelect = AbsBaseSelect; exports.AbsBaseSelect = AbsBaseSelect;
/***/ }, /***/ },
/* 26 */
/***/ 52:
/***/ function(module, exports, __webpack_require__) { /***/ function(module, exports, __webpack_require__) {
'use strict'; 'use strict';
@ -1483,9 +1474,9 @@
var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
var _AbsBaseSelect2 = __webpack_require__(25); var _AbsBaseSelect2 = __webpack_require__(51);
var _DataTree = __webpack_require__(21); var _DataTree = __webpack_require__(47);
var _DataTree2 = _interopRequireDefault(_DataTree); var _DataTree2 = _interopRequireDefault(_DataTree);
@ -1594,7 +1585,8 @@
exports.default = TreeSelect; exports.default = TreeSelect;
/***/ }, /***/ },
/* 27 */
/***/ 53:
/***/ function(module, exports, __webpack_require__) { /***/ function(module, exports, __webpack_require__) {
'use strict'; 'use strict';
@ -1610,11 +1602,11 @@
var _desc, _value, _class; var _desc, _value, _class;
var _SelectedContainer2 = __webpack_require__(20); var _SelectedContainer2 = __webpack_require__(46);
var _SelectedContainer3 = _interopRequireDefault(_SelectedContainer2); var _SelectedContainer3 = _interopRequireDefault(_SelectedContainer2);
var _decorators = __webpack_require__(23); var _decorators = __webpack_require__(49);
var _decorators2 = _interopRequireDefault(_decorators); var _decorators2 = _interopRequireDefault(_decorators);
@ -1695,7 +1687,8 @@
exports.default = SelectedContainerCreate; exports.default = SelectedContainerCreate;
/***/ }, /***/ },
/* 28 */
/***/ 54:
/***/ function(module, exports, __webpack_require__) { /***/ function(module, exports, __webpack_require__) {
'use strict'; 'use strict';
@ -1707,9 +1700,9 @@
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _AbsBaseSelect = __webpack_require__(25); var _AbsBaseSelect = __webpack_require__(51);
var _TreeSelect2 = __webpack_require__(26); var _TreeSelect2 = __webpack_require__(52);
var _TreeSelect3 = _interopRequireDefault(_TreeSelect2); var _TreeSelect3 = _interopRequireDefault(_TreeSelect2);
@ -1790,7 +1783,8 @@
exports.default = SingleTreeSelect; exports.default = SingleTreeSelect;
/***/ }, /***/ },
/* 29 */
/***/ 55:
/***/ function(module, exports, __webpack_require__) { /***/ function(module, exports, __webpack_require__) {
'use strict'; 'use strict';
@ -1804,9 +1798,9 @@
var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
var _AbsBaseSelect2 = __webpack_require__(25); var _AbsBaseSelect2 = __webpack_require__(51);
var _NoTreeData = __webpack_require__(22); var _NoTreeData = __webpack_require__(48);
var _NoTreeData2 = _interopRequireDefault(_NoTreeData); var _NoTreeData2 = _interopRequireDefault(_NoTreeData);
@ -2028,4 +2022,5 @@
exports.default = SelectOrCreate; exports.default = SelectOrCreate;
/***/ } /***/ }
/******/ ]);
/******/ });

@ -40,29 +40,30 @@
/******/ return __webpack_require__(0); /******/ return __webpack_require__(0);
/******/ }) /******/ })
/************************************************************************/ /************************************************************************/
/******/ ([ /******/ ({
/* 0 */
/***/ 0:
/***/ function(module, exports, __webpack_require__) { /***/ function(module, exports, __webpack_require__) {
'use strict'; 'use strict';
var _SelectedContainer = __webpack_require__(20); var _SelectedContainer = __webpack_require__(46);
var _SelectedContainer2 = _interopRequireDefault(_SelectedContainer); var _SelectedContainer2 = _interopRequireDefault(_SelectedContainer);
var _SelectedContainerCreate = __webpack_require__(27); var _SelectedContainerCreate = __webpack_require__(53);
var _SelectedContainerCreate2 = _interopRequireDefault(_SelectedContainerCreate); var _SelectedContainerCreate2 = _interopRequireDefault(_SelectedContainerCreate);
var _NoTreeSelect = __webpack_require__(24); var _NoTreeSelect = __webpack_require__(50);
var _NoTreeSelect2 = _interopRequireDefault(_NoTreeSelect); var _NoTreeSelect2 = _interopRequireDefault(_NoTreeSelect);
var _TreeSelect = __webpack_require__(26); var _TreeSelect = __webpack_require__(52);
var _TreeSelect2 = _interopRequireDefault(_TreeSelect); var _TreeSelect2 = _interopRequireDefault(_TreeSelect);
var _SelectOrCreate = __webpack_require__(29); var _SelectOrCreate = __webpack_require__(55);
var _SelectOrCreate2 = _interopRequireDefault(_SelectOrCreate); var _SelectOrCreate2 = _interopRequireDefault(_SelectOrCreate);
@ -122,26 +123,8 @@
// import SingleTreeSelect from 'components/SingleTreeSelect' // import SingleTreeSelect from 'components/SingleTreeSelect'
/***/ }, /***/ },
/* 1 */,
/* 2 */, /***/ 46:
/* 3 */,
/* 4 */,
/* 5 */,
/* 6 */,
/* 7 */,
/* 8 */,
/* 9 */,
/* 10 */,
/* 11 */,
/* 12 */,
/* 13 */,
/* 14 */,
/* 15 */,
/* 16 */,
/* 17 */,
/* 18 */,
/* 19 */,
/* 20 */
/***/ function(module, exports, __webpack_require__) { /***/ function(module, exports, __webpack_require__) {
'use strict'; 'use strict';
@ -156,15 +139,15 @@
var _desc, _value, _class; // ` var _desc, _value, _class; // `
var _DataTree = __webpack_require__(21); var _DataTree = __webpack_require__(47);
var _DataTree2 = _interopRequireDefault(_DataTree); var _DataTree2 = _interopRequireDefault(_DataTree);
var _NoTreeData = __webpack_require__(22); var _NoTreeData = __webpack_require__(48);
var _NoTreeData2 = _interopRequireDefault(_NoTreeData); var _NoTreeData2 = _interopRequireDefault(_NoTreeData);
var _decorators = __webpack_require__(23); var _decorators = __webpack_require__(49);
var _decorators2 = _interopRequireDefault(_decorators); var _decorators2 = _interopRequireDefault(_decorators);
@ -396,7 +379,8 @@
exports.default = SelectedContainer; exports.default = SelectedContainer;
/***/ }, /***/ },
/* 21 */
/***/ 47:
/***/ function(module, exports) { /***/ function(module, exports) {
"use strict"; "use strict";
@ -551,7 +535,8 @@
exports.default = DataTree; exports.default = DataTree;
/***/ }, /***/ },
/* 22 */
/***/ 48:
/***/ function(module, exports) { /***/ function(module, exports) {
"use strict"; "use strict";
@ -607,7 +592,8 @@
exports.default = NoTreeData; exports.default = NoTreeData;
/***/ }, /***/ },
/* 23 */
/***/ 49:
/***/ function(module, exports) { /***/ function(module, exports) {
"use strict"; "use strict";
@ -691,7 +677,8 @@
// export {onBind}; // export {onBind};
/***/ }, /***/ },
/* 24 */
/***/ 50:
/***/ function(module, exports, __webpack_require__) { /***/ function(module, exports, __webpack_require__) {
'use strict'; 'use strict';
@ -705,9 +692,9 @@
var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
var _AbsBaseSelect2 = __webpack_require__(25); var _AbsBaseSelect2 = __webpack_require__(51);
var _NoTreeData = __webpack_require__(22); var _NoTreeData = __webpack_require__(48);
var _NoTreeData2 = _interopRequireDefault(_NoTreeData); var _NoTreeData2 = _interopRequireDefault(_NoTreeData);
@ -768,7 +755,8 @@
exports.default = NoTreeSelect; exports.default = NoTreeSelect;
/***/ }, /***/ },
/* 25 */
/***/ 51:
/***/ function(module, exports) { /***/ function(module, exports) {
"use strict"; "use strict";
@ -1319,7 +1307,8 @@
exports.AbsBaseSelect = AbsBaseSelect; exports.AbsBaseSelect = AbsBaseSelect;
/***/ }, /***/ },
/* 26 */
/***/ 52:
/***/ function(module, exports, __webpack_require__) { /***/ function(module, exports, __webpack_require__) {
'use strict'; 'use strict';
@ -1333,9 +1322,9 @@
var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
var _AbsBaseSelect2 = __webpack_require__(25); var _AbsBaseSelect2 = __webpack_require__(51);
var _DataTree = __webpack_require__(21); var _DataTree = __webpack_require__(47);
var _DataTree2 = _interopRequireDefault(_DataTree); var _DataTree2 = _interopRequireDefault(_DataTree);
@ -1444,7 +1433,8 @@
exports.default = TreeSelect; exports.default = TreeSelect;
/***/ }, /***/ },
/* 27 */
/***/ 53:
/***/ function(module, exports, __webpack_require__) { /***/ function(module, exports, __webpack_require__) {
'use strict'; 'use strict';
@ -1460,11 +1450,11 @@
var _desc, _value, _class; var _desc, _value, _class;
var _SelectedContainer2 = __webpack_require__(20); var _SelectedContainer2 = __webpack_require__(46);
var _SelectedContainer3 = _interopRequireDefault(_SelectedContainer2); var _SelectedContainer3 = _interopRequireDefault(_SelectedContainer2);
var _decorators = __webpack_require__(23); var _decorators = __webpack_require__(49);
var _decorators2 = _interopRequireDefault(_decorators); var _decorators2 = _interopRequireDefault(_decorators);
@ -1545,8 +1535,8 @@
exports.default = SelectedContainerCreate; exports.default = SelectedContainerCreate;
/***/ }, /***/ },
/* 28 */,
/* 29 */ /***/ 55:
/***/ function(module, exports, __webpack_require__) { /***/ function(module, exports, __webpack_require__) {
'use strict'; 'use strict';
@ -1560,9 +1550,9 @@
var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
var _AbsBaseSelect2 = __webpack_require__(25); var _AbsBaseSelect2 = __webpack_require__(51);
var _NoTreeData = __webpack_require__(22); var _NoTreeData = __webpack_require__(48);
var _NoTreeData2 = _interopRequireDefault(_NoTreeData); var _NoTreeData2 = _interopRequireDefault(_NoTreeData);
@ -1784,4 +1774,5 @@
exports.default = SelectOrCreate; exports.default = SelectOrCreate;
/***/ } /***/ }
/******/ ]);
/******/ });

@ -40,21 +40,22 @@
/******/ return __webpack_require__(0); /******/ return __webpack_require__(0);
/******/ }) /******/ })
/************************************************************************/ /************************************************************************/
/******/ ([ /******/ ({
/* 0 */
/***/ 0:
/***/ function(module, exports, __webpack_require__) { /***/ function(module, exports, __webpack_require__) {
'use strict'; 'use strict';
var _SelectedContainer = __webpack_require__(20); var _SelectedContainer = __webpack_require__(46);
var _SelectedContainer2 = _interopRequireDefault(_SelectedContainer); var _SelectedContainer2 = _interopRequireDefault(_SelectedContainer);
var _NoTreeSelect = __webpack_require__(24); var _NoTreeSelect = __webpack_require__(50);
var _NoTreeSelect2 = _interopRequireDefault(_NoTreeSelect); var _NoTreeSelect2 = _interopRequireDefault(_NoTreeSelect);
var _TreeSelect = __webpack_require__(26); var _TreeSelect = __webpack_require__(52);
var _TreeSelect2 = _interopRequireDefault(_TreeSelect); var _TreeSelect2 = _interopRequireDefault(_TreeSelect);
@ -120,26 +121,8 @@
}); // ` }); // `
/***/ }, /***/ },
/* 1 */,
/* 2 */, /***/ 46:
/* 3 */,
/* 4 */,
/* 5 */,
/* 6 */,
/* 7 */,
/* 8 */,
/* 9 */,
/* 10 */,
/* 11 */,
/* 12 */,
/* 13 */,
/* 14 */,
/* 15 */,
/* 16 */,
/* 17 */,
/* 18 */,
/* 19 */,
/* 20 */
/***/ function(module, exports, __webpack_require__) { /***/ function(module, exports, __webpack_require__) {
'use strict'; 'use strict';
@ -154,15 +137,15 @@
var _desc, _value, _class; // ` var _desc, _value, _class; // `
var _DataTree = __webpack_require__(21); var _DataTree = __webpack_require__(47);
var _DataTree2 = _interopRequireDefault(_DataTree); var _DataTree2 = _interopRequireDefault(_DataTree);
var _NoTreeData = __webpack_require__(22); var _NoTreeData = __webpack_require__(48);
var _NoTreeData2 = _interopRequireDefault(_NoTreeData); var _NoTreeData2 = _interopRequireDefault(_NoTreeData);
var _decorators = __webpack_require__(23); var _decorators = __webpack_require__(49);
var _decorators2 = _interopRequireDefault(_decorators); var _decorators2 = _interopRequireDefault(_decorators);
@ -394,7 +377,8 @@
exports.default = SelectedContainer; exports.default = SelectedContainer;
/***/ }, /***/ },
/* 21 */
/***/ 47:
/***/ function(module, exports) { /***/ function(module, exports) {
"use strict"; "use strict";
@ -549,7 +533,8 @@
exports.default = DataTree; exports.default = DataTree;
/***/ }, /***/ },
/* 22 */
/***/ 48:
/***/ function(module, exports) { /***/ function(module, exports) {
"use strict"; "use strict";
@ -605,7 +590,8 @@
exports.default = NoTreeData; exports.default = NoTreeData;
/***/ }, /***/ },
/* 23 */
/***/ 49:
/***/ function(module, exports) { /***/ function(module, exports) {
"use strict"; "use strict";
@ -689,7 +675,8 @@
// export {onBind}; // export {onBind};
/***/ }, /***/ },
/* 24 */
/***/ 50:
/***/ function(module, exports, __webpack_require__) { /***/ function(module, exports, __webpack_require__) {
'use strict'; 'use strict';
@ -703,9 +690,9 @@
var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
var _AbsBaseSelect2 = __webpack_require__(25); var _AbsBaseSelect2 = __webpack_require__(51);
var _NoTreeData = __webpack_require__(22); var _NoTreeData = __webpack_require__(48);
var _NoTreeData2 = _interopRequireDefault(_NoTreeData); var _NoTreeData2 = _interopRequireDefault(_NoTreeData);
@ -766,7 +753,8 @@
exports.default = NoTreeSelect; exports.default = NoTreeSelect;
/***/ }, /***/ },
/* 25 */
/***/ 51:
/***/ function(module, exports) { /***/ function(module, exports) {
"use strict"; "use strict";
@ -1317,7 +1305,8 @@
exports.AbsBaseSelect = AbsBaseSelect; exports.AbsBaseSelect = AbsBaseSelect;
/***/ }, /***/ },
/* 26 */
/***/ 52:
/***/ function(module, exports, __webpack_require__) { /***/ function(module, exports, __webpack_require__) {
'use strict'; 'use strict';
@ -1331,9 +1320,9 @@
var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
var _AbsBaseSelect2 = __webpack_require__(25); var _AbsBaseSelect2 = __webpack_require__(51);
var _DataTree = __webpack_require__(21); var _DataTree = __webpack_require__(47);
var _DataTree2 = _interopRequireDefault(_DataTree); var _DataTree2 = _interopRequireDefault(_DataTree);
@ -1442,4 +1431,5 @@
exports.default = TreeSelect; exports.default = TreeSelect;
/***/ } /***/ }
/******/ ]);
/******/ });

@ -40,17 +40,18 @@
/******/ return __webpack_require__(0); /******/ return __webpack_require__(0);
/******/ }) /******/ })
/************************************************************************/ /************************************************************************/
/******/ ([ /******/ ({
/* 0 */
/***/ 0:
/***/ function(module, exports, __webpack_require__) { /***/ function(module, exports, __webpack_require__) {
'use strict'; 'use strict';
var _image_upload = __webpack_require__(13); var _image_upload = __webpack_require__(38);
var _scroll_on_required = __webpack_require__(10); var _scroll_on_required = __webpack_require__(35);
var _ajax_send_form_data = __webpack_require__(14); var _ajax_send_form_data = __webpack_require__(39);
$(function () { $(function () {
(0, _image_upload.imageUploadInit)(); (0, _image_upload.imageUploadInit)();
@ -60,12 +61,8 @@
}); });
/***/ }, /***/ },
/* 1 */,
/* 2 */, /***/ 3:
/* 3 */,
/* 4 */,
/* 5 */,
/* 6 */
/***/ function(module, exports) { /***/ function(module, exports) {
'use strict'; 'use strict';
@ -109,10 +106,8 @@
exports.getCookie = getCookie; exports.getCookie = getCookie;
/***/ }, /***/ },
/* 7 */,
/* 8 */, /***/ 35:
/* 9 */,
/* 10 */
/***/ function(module, exports) { /***/ function(module, exports) {
'use strict'; 'use strict';
@ -132,9 +127,8 @@
exports.scrollOnRequiredInit = scrollOnRequiredInit; exports.scrollOnRequiredInit = scrollOnRequiredInit;
/***/ }, /***/ },
/* 11 */,
/* 12 */, /***/ 38:
/* 13 */
/***/ function(module, exports, __webpack_require__) { /***/ function(module, exports, __webpack_require__) {
'use strict'; 'use strict';
@ -144,7 +138,7 @@
}); });
exports.imageUploadInit = undefined; exports.imageUploadInit = undefined;
var _utils = __webpack_require__(6); var _utils = __webpack_require__(3);
// function previewImg() { // function previewImg() {
// let $fileUploadWidgets = $('.file-upload-widget'); // let $fileUploadWidgets = $('.file-upload-widget');
@ -213,7 +207,8 @@
// export {imageUploadInit, previewImg} // export {imageUploadInit, previewImg}
/***/ }, /***/ },
/* 14 */
/***/ 39:
/***/ function(module, exports, __webpack_require__) { /***/ function(module, exports, __webpack_require__) {
"use strict"; "use strict";
@ -223,7 +218,7 @@
}); });
exports.sendFormData = undefined; exports.sendFormData = undefined;
var _utils = __webpack_require__(6); var _utils = __webpack_require__(3);
function sendFormData(e) { function sendFormData(e) {
e.preventDefault(); e.preventDefault();
@ -272,4 +267,5 @@
exports.sendFormData = sendFormData; exports.sendFormData = sendFormData;
/***/ } /***/ }
/******/ ]);
/******/ });

@ -40,17 +40,18 @@
/******/ return __webpack_require__(0); /******/ return __webpack_require__(0);
/******/ }) /******/ })
/************************************************************************/ /************************************************************************/
/******/ ([ /******/ ({
/* 0 */
/***/ 0:
/***/ function(module, exports, __webpack_require__) { /***/ function(module, exports, __webpack_require__) {
'use strict'; 'use strict';
var _custom_check = __webpack_require__(1); var _custom_check = __webpack_require__(27);
var _extended_field = __webpack_require__(2); var _extended_field = __webpack_require__(28);
var _ajax_set_filter = __webpack_require__(3); var _ajax_set_filter = __webpack_require__(29);
function paginateTo(pageNum) { function paginateTo(pageNum) {
var $form = $('#filter-form'); var $form = $('#filter-form');
@ -70,7 +71,8 @@
}); });
/***/ }, /***/ },
/* 1 */
/***/ 27:
/***/ function(module, exports) { /***/ function(module, exports) {
"use strict"; "use strict";
@ -99,7 +101,8 @@
exports.customCheckInit = customCheckInit; exports.customCheckInit = customCheckInit;
/***/ }, /***/ },
/* 2 */
/***/ 28:
/***/ function(module, exports) { /***/ function(module, exports) {
'use strict'; 'use strict';
@ -129,7 +132,8 @@
exports.extendedFieldInit = extendedFieldInit; exports.extendedFieldInit = extendedFieldInit;
/***/ }, /***/ },
/* 3 */
/***/ 29:
/***/ function(module, exports) { /***/ function(module, exports) {
'use strict'; 'use strict';
@ -192,4 +196,5 @@
exports.modUrl = modUrl; exports.modUrl = modUrl;
/***/ } /***/ }
/******/ ]);
/******/ });

@ -47,7 +47,7 @@
'use strict'; 'use strict';
var _popups = __webpack_require__(9); var _popups = __webpack_require__(34);
function checkHash() { function checkHash() {
// on load of the page: switch to the currently selected tab // on load of the page: switch to the currently selected tab
@ -65,7 +65,7 @@
/***/ }, /***/ },
/***/ 9: /***/ 34:
/***/ function(module, exports) { /***/ function(module, exports) {
'use strict'; 'use strict';

@ -47,13 +47,13 @@
'use strict'; 'use strict';
var _avatar_upload = __webpack_require__(30); var _avatar_upload = __webpack_require__(56);
var _bootstrap_tabs = __webpack_require__(17); var _bootstrap_tabs = __webpack_require__(42);
var _user_check_statuses = __webpack_require__(31); var _user_check_statuses = __webpack_require__(57);
var _custom_select = __webpack_require__(15); var _custom_select = __webpack_require__(40);
$(function () { $(function () {
(0, _avatar_upload.avatarUploadInit)(); (0, _avatar_upload.avatarUploadInit)();
@ -64,7 +64,7 @@
/***/ }, /***/ },
/***/ 15: /***/ 40:
/***/ function(module, exports) { /***/ function(module, exports) {
'use strict'; 'use strict';
@ -108,7 +108,7 @@
/***/ }, /***/ },
/***/ 17: /***/ 42:
/***/ function(module, exports) { /***/ function(module, exports) {
"use strict"; "use strict";
@ -144,7 +144,7 @@
/***/ }, /***/ },
/***/ 30: /***/ 56:
/***/ function(module, exports) { /***/ function(module, exports) {
'use strict'; 'use strict';
@ -197,7 +197,7 @@
/***/ }, /***/ },
/***/ 31: /***/ 57:
/***/ function(module, exports) { /***/ function(module, exports) {
'use strict'; 'use strict';

@ -40,19 +40,20 @@
/******/ return __webpack_require__(0); /******/ return __webpack_require__(0);
/******/ }) /******/ })
/************************************************************************/ /************************************************************************/
/******/ ([ /******/ ({
/* 0 */
/***/ 0:
/***/ function(module, exports, __webpack_require__) { /***/ function(module, exports, __webpack_require__) {
'use strict'; 'use strict';
var _custom_check = __webpack_require__(1); var _custom_check = __webpack_require__(27);
var _extended_field = __webpack_require__(2); var _extended_field = __webpack_require__(28);
var _ajax_set_filter = __webpack_require__(3); var _ajax_set_filter = __webpack_require__(29);
var _filter_toggle = __webpack_require__(4); var _filter_toggle = __webpack_require__(30);
function paginateTo(pageNum) { function paginateTo(pageNum) {
var $form = $('#filter-form'); var $form = $('#filter-form');
@ -73,7 +74,8 @@
}); });
/***/ }, /***/ },
/* 1 */
/***/ 27:
/***/ function(module, exports) { /***/ function(module, exports) {
"use strict"; "use strict";
@ -102,7 +104,8 @@
exports.customCheckInit = customCheckInit; exports.customCheckInit = customCheckInit;
/***/ }, /***/ },
/* 2 */
/***/ 28:
/***/ function(module, exports) { /***/ function(module, exports) {
'use strict'; 'use strict';
@ -132,7 +135,8 @@
exports.extendedFieldInit = extendedFieldInit; exports.extendedFieldInit = extendedFieldInit;
/***/ }, /***/ },
/* 3 */
/***/ 29:
/***/ function(module, exports) { /***/ function(module, exports) {
'use strict'; 'use strict';
@ -195,7 +199,8 @@
exports.modUrl = modUrl; exports.modUrl = modUrl;
/***/ }, /***/ },
/* 4 */
/***/ 30:
/***/ function(module, exports) { /***/ function(module, exports) {
'use strict'; 'use strict';
@ -225,4 +230,5 @@
exports.filterToggleInit = filterToggleInit; exports.filterToggleInit = filterToggleInit;
/***/ } /***/ }
/******/ ]);
/******/ });

@ -0,0 +1,445 @@
import {getCookie} from '../utils'
import {onClickCardWithCount} from './messageCounters'
import {loadTemplate} from './loaders'
function dialog(message, yesCallback, notCallback) {
$("#dialog_delete .modal-title").html(message);
$("#dialog_delete").modal('show');
$("#btnYes").click(function (e) {
e.preventDefault();
yesCallback();
$("#dialog_delete").modal('hide');
});
$("#btnNot").click(function (e) {
e.preventDefault();
notCallback();
$("#dialog_delete").modal('hide');
});
}
function bindOrders() {
$('.order-block').on('click', function (event) {
event.preventDefault();
let $this = $(this);
onClickCardWithCount($this);
$('.order-block').each(function (i, v) {
$(v).removeClass('orAct');
});
$this.addClass('orAct');
let orderId = $this.data('id');
let projectId = $this.data('project-id');
let recipentId = $this.data('recipent-id');
let orderName = $this.data('order-name');
var secureOrder = $(this).data('secure-deal');
secureOrder = Boolean(secureOrder);
window.location.hash = `order${orderId}`;
$("#chat-order-add #orderId").val(orderId);
$("#add-form-order-note #orderNote").val(orderId);
$("#orderArbitrationId").val(orderId);
$("#projectReviewId").val(projectId);
$("#reserve-button").attr('data-order-id', orderId);
$("#chat-order-add #recipentId").val(recipentId);
window.chatController.create(orderId, projectId, recipentId, orderName, secureOrder);
});
$('.order-block .dimovChat').on('click', function (event) {
event.preventDefault();
event.stopPropagation();
// console.log('click on tr');
});
}
function bindTeams() {
$('.team-block').on('click', function () {
onClickCardWithCount($(this));
$('.team-order-block, .team-block').each(function () {
$(this).removeClass('orAct');
});
$(this).addClass('orAct');
var teamIds = '';
$.each($(this).find('.team-chat-user'), function (i, v) {
teamIds += $(this).attr('data-id') + ";";
});
$("#team-chat-form #teamIds").val(teamIds);
var inbox = document.getElementById('message-chat-team-space');
inbox.innerHTML = '';
var docList = document.getElementById('documentTeamSpace');
docList.innerHTML = '';
var teamId = $(this).attr('data-team-id');
location.hash = '#myteam' + teamId;
// var newCount = parseInt($("#count-tab-team").text());
// var currNewCount = parseInt($(".team-count-" + teamId).text());
// var resCount = newCount - currNewCount;
// $("#count-tab-team").text(resCount);
$(".team-count-" + teamId).text(0)
$("#team-chat-form #teamId").val(teamId);
$("#add-form-team-note #teamNote").val(teamId);
$("#team-chat-form #recipentTeamId").val("");
$("#team-chat-form #orderTeamId").val("");
$("#add-form-team-note #orderNote").val("");
$.ajax({
url: '/api/message',
type: 'GET',
beforeSend: function (xhr) {
xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'))
},
data: {'team': teamId, 'order__isnull': 'true'},
dataType: 'json',
success: function (json) {
$.each(json.results, function (i, v) {
var senderName = 'Вы';
var className = 'youChat';
if (v.sender.id !== userId) {
senderName = v.sender.username;
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>';
});
var height = inbox.scrollHeight;
inbox.scrollTop = height;
}
});
$.ajax({
url: '/api/documents',
type: 'GET',
beforeSend: function (xhr) {
xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'))
},
data: {
'team': teamId,
'is_delete': false,
'is_send': true,
},
dataType: 'json',
success: function (json) {
$.each(json.results, function (i, v) {
docList.innerHTML += '<li style="word-break: break-all;"><a class="file-link" href="/chat/download/' + v.file + '">' + v.file + '</a><div class="remove-document" data-id="' + v.id + '" style="right:-10px;"></div></li>';
});
},
error: function (e) {
console.log(e);
}
});
$.ajax({
url: '/api/note/',
type: 'GET',
beforeSend: function (xhr) {
xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'))
},
data: {'team': teamId},
dataType: 'json',
success: function (json) {
// console.log(json.results);
var noteHtmlInbox = '';
var note_tmpl = loadTemplate('note_tmpl');
$.each(json.results, function (i, v) {
noteHtmlInbox += note_tmpl({text: v.text});
});
$(".team-notes-block").html(noteHtmlInbox);
}
});
});
}
function bindArbitrationSend() {
// TODO: Test it
$('#order-arbitration-add').on('click', function (e) {
e.preventDefault();
e.stopPropagation();
var formData = $("#arbitration-add-form").serialize();
$.ajax({
url: '/projects/arbitration/create/',
type: 'POST',
beforeSend: function (xhr) {
xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'))
},
data: formData,
dataType: 'json',
success: function (json) {
// console.log(json);
$("#arbitration-add").modal('hide');
$.jGrowl("Обращение в арбитраж добавлено", {
life: 4000
});
},
error: function (e) {
console.log('error');
console.log(e);
}
});
});
}
function bindOnTabs() {
/**
* Биндит обработчики на Закладки
*/
$('a[data-toggle="tab"]').unbind().on('show.bs.tab', function (e) {
// console.log("TAB!");
var activeTab = $(this).attr('href').substring(1);
var liveHash = URI(location.href).hash();
switch (activeTab) {
case 'tab1':
setTimeout(function () {
if (liveHash.indexOf("#user") != -1) {
var userHashId = liveHash.replace("#user", "");
$("#userBlock" + userHashId).trigger('click');
} else {
$(".user-block").first().trigger('click');
}
}, 100);
break;
case 'tab2':
// console.log("tab2");
setTimeout(function () {
if (liveHash.indexOf("#order") != -1) {
var ordHashId = liveHash.replace("#order", "");
$("#orderBlock" + ordHashId).trigger('click');
} else {
$(".order-block").first().trigger('click');
}
}, 100);
break;
case 'tab3':
setTimeout(function () {
// console.log("on active TAB team");
if (liveHash.indexOf("#teamorder") != -1) {
var teamHashId = liveHash.replace("#teamorder", "");
$("#teamOrderBlock" + teamHashId).trigger('click');
} else if (liveHash.indexOf("#myteam") != -1) {
var teamHashId = liveHash.replace("#myteam", "");
$("#teamMyBlock" + teamHashId).trigger('click');
} else {
var firstTeamBlock = $(".team-block").first();
var firstTeamOrder = $(".team-order-block").first();
if (firstTeamOrder.length == 1) {
firstTeamOrder.trigger('click');
} else if (firstTeamBlock.length == 1) {
firstTeamBlock.trigger('click');
}
}
}, 100);
}
});
}
function bindUserContacts() {
$(".conMess").click('on', function (e) {
e.preventDefault();
e.stopPropagation();
var userId = $(this).attr('data-id');
$.ajax({
url: '/api/users/' + userId + '/',
beforeSend: function (xhr) {
xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'))
},
dataType: 'json',
success: function (data) {
var outTable = '';
if (data.username) {
outTable += '<tr><td>Ник</td><td>' + data.username + '</td>';
}
if (data.fio) {
outTable += '<tr><td>Ф.И.О</td><td>' + data.fio + '</td>';
}
if (data.skype) {
outTable += '<tr><td>Skype</td><td>' + data.skype + '</td>';
}
if (data.website) {
outTable += '<tr><td>Сайт</td><td>' + data.website + '</td>';
}
if (data.phone) {
outTable += '<tr><td>Телефон</td><td>' + data.phone + '</td>';
}
$("#contact-info table").html(outTable);
$("#contact-info").modal('show');
// console.log(data);
},
error: function (e, jqxhr) {
console.log(e);
}
});
});
}
function bindGetUserMessages() {
$('.user-block').on('click', function () {
onClickCardWithCount($(this));
// var newCount = parseInt($("#count-tab-contact").text());
var contactId = $(this).attr('data-id');
location.hash = '#user' + contactId;
$("#contact-chat-form #recipentContactId").val(contactId);
$("#add-form-contractor-note #recipentNoteContractor").val(contactId);
$('.user-block').each(function () {
$(this).removeClass('mesAct');
});
$(this).addClass('mesAct');
var inbox = document.getElementById('message-chat-space');
var sumSenderRecipent = parseInt(userId) + parseInt(contactId);
$("#message-chat-space").removeClass().addClass("contact-space" + sumSenderRecipent);
// var currNewCount = parseInt($(".contact-count-" + sumSenderRecipent).text());
// var resCount = newCount - currNewCount;
// $("#count-tab-contact").text(resCount);
$(".contact-count-" + sumSenderRecipent).text(0);
var docList = document.getElementById('documentSpace');
inbox.innerHTML = '';
docList.innerHTML = '';
$.ajax({
url: '/api/message',
type: 'GET',
beforeSend: function (xhr) {
xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'))
},
data: {
'operand': 'in',
'sender_id': userId,
'recipent_id': contactId
},
dataType: 'json',
success: function (json) {
$.each(json.results, function (i, v) {
var senderName = 'Вы';
var className = 'youChat';
if (v.sender.id == contactId) {
senderName = v.sender.username;
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>';
});
var height = inbox.scrollHeight;
inbox.scrollTop = height;
}
});
$.ajax({
url: '/api/documents',
type: 'GET',
beforeSend: function (xhr) {
xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'))
},
data: {
'operand': 'in',
'sender_id': userId,
'recipent_id': contactId,
'is_delete': false,
'is_send': true,
},
dataType: 'json',
success: function (json) {
// console.log(json);
$.each(json.results, function (i, v) {
docList.innerHTML += '<li style="word-break: break-all;"><a class="file-link" href="/chat/download/' + v.file + '">' + v.file + '</a><div class="remove-document" data-id="' + v.id + '" style="right:-10px;"></div></li>';
});
},
error: function (e) {
console.log(e);
}
});
$.ajax({
url: '/api/note/',
type: 'GET',
beforeSend: function (xhr) {
xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'))
},
data: {
'operand': 'in',
'sender_id': userId,
'recipent_id': contactId
},
dataType: 'json',
success: function (json) {
// console.log(json.results);
var noteHtmlInbox = '';
var note_tmpl = loadTemplate('note_tmpl');
$.each(json.results, function (i, v) {
noteHtmlInbox += note_tmpl({text: v.text});
});
$(".contractor-notes-block").html(noteHtmlInbox);
}
});
});
}
function bindDeleteContact() {
$('.deleteMess').on('click', function (e) {
e.preventDefault();
e.stopPropagation();
var senderId = userId;
var recipentId = $(this).attr('data-recipent-id');
var _this = $(this);
dialog("Вы действительно хотите удалить сообщения этого пользователя?",
function () {
$.ajax({
url: '/chat/messages_delete/',
type: 'POST',
beforeSend: function (xhr) {
xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'))
},
data: {'sender_id': senderId, 'recipent_id': recipentId},
dataType: 'json',
success: function (json) {
if (json.status == 'ok') {
_this.parent().remove();
$("#message-chat-space").html("");
}
},
error: function (e) {
console.log('error');
console.log(e);
}
});
}.bind(null, senderId, recipentId, _this),
function () {
});
});
}
export {
bindOrders,
bindArbitrationSend,
bindOnTabs,
bindUserContacts,
bindGetUserMessages,
bindTeams,
bindDeleteContact,
}

@ -0,0 +1 @@
import {StagesController} from './StagesContractorController' import {MessagesController} from './MessagesControllers' import {DocumentsController} from './DocumentsControllers' class ChatPageController { constructor() { let self = this; console.log("NEW CONTRACTOR ChatPageController"); this.statesController = undefined; this.messagesController = undefined; this.documentsController = undefined; // TODO: не забыть! // $('.order-block').on('click', function (event) { // console.log("CLICK!!!"); // event.preventDefault(); // let $this = $(this); // $('.order-block').each(function (i, v) { // $(v).removeClass('orAct'); // }); // $this.addClass('orAct'); // let orderId = $this.data('id'); // let projectId = $this.data('project-id'); // let recipentId = $this.data('recipent-id'); // let orderName = $this.data('order-name'); // // console.log('orderId = ', orderId); // new StagesController(orderId, projectId, recipentId, orderName); // new MessagesController(orderId); // window.location.hash = `order${orderId}`; // // $("#chat-order-add #orderId").val(orderId); // $("#add-form-order-note #orderNote").val(orderId); // $("#orderArbitrationId").val(orderId); // $("#projectReviewId").val(projectId); // // console.log("recipentId = ", recipentId); // $("#chat-order-add #recipentId").val(recipentId); // $("#targetCustomerId").val(recipentId); // $("#add-form-order-note #recipentNote").val(recipentId); // // }); // $('.order-block .dimovChat').on('click', function (event) { // event.preventDefault(); // event.stopPropagation(); // // TODO: доделать сворачивание/разворачивание блока // // console.log('click on tr'); // }); } create(orderId, projectId, recipentId, orderName, secureOrder) { this.statesController = new StagesController(orderId, projectId, recipentId, orderName, secureOrder); this.messagesController = new MessagesController(orderId); this.documentsController = new DocumentsController(orderId); } // refresh() } export {ChatPageController}

@ -0,0 +1 @@
import {StagesController} from './StagesCustomerController' import {MessagesController} from './MessagesControllers' import {recalculateMessages} from './messageCounters' class ChatPageController { constructor() { let self = this; // console.log("NEW Chat CUSTOMER PageController"); this.statesController = undefined; this.messagesController = undefined; // TODO: не забыть! // recalculateMessages(); } create(orderId, projectId, recipentId, orderName, secureOrder) { this.statesController = new StagesController(orderId, projectId, recipentId, orderName, secureOrder); this.messagesController = new MessagesController(orderId); } } export {ChatPageController}

@ -0,0 +1,67 @@
import {getCookie} from '../utils'
import {loadTemplate} from './loaders'
class DocumentsController {
constructor(orderId) {
console.log('Create MessagesController');
const self = this;
this.orderId = orderId;
this.$container = $('#documentOrderSpace');
this.$container.html("");
this.messageTemplate = loadTemplate('document_attach_file_tmpl');
this.dataPromise = this.getMessagesData();
this.dataPromise.then(
self._onLoadData.bind(self)
)
}
getMessagesData() {
const self = this;
return Promise.resolve(
$.ajax({
url: '/api/documents',
type: 'GET',
beforeSend: function (xhr) {
xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'))
},
data: {
'order': self.orderId,
'is_delete': false,
'is_send': true,
},
dataType: 'json',
// success: function (json) {
//
// },
error: function (e) {
console.log(e);
}
}));
}
addDocument(json) {
}
_onLoadData(json) {
const self = this;
// console.log('mesages json = ', json);
// console.log('$inbox = ', this.$inbox);
// console.log("messages render start");
this.$container.html("");
$.each(json.results, function (i, v) {
let document = $(self.messageTemplate(
{
href: `/chat/download/' + ${v.file}`,
text: v.file,
document_id: v.id
}));
self.$container.append(document);
});
// console.log("messages render complete");
// self.$inbox.scrollTop(self.$inbox.prop("scrollHeight"));
}
}
export {DocumentsController}

@ -0,0 +1,61 @@
import {getCookie} from '../utils'
import {loadTemplate} from './loaders'
class MessagesController {
constructor(orderId) {
console.log('Create MessagesController');
const self = this;
this.orderId = orderId;
this.$inbox = $('#message-chat-order-space');
this.$inbox.html("");
this.messageTemplate = loadTemplate('message_tmpl');
this.dataPromise = this.getMessagesData();
this.dataPromise.then(
self._onLoadData.bind(self)
)
}
getMessagesData() {
const self = this;
return Promise.resolve($.ajax({
url: '/api/message',
type: 'GET',
data: {'order': self.orderId, 'team__isnull': 'true'},
beforeSend: function (xhr) {
xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'))
},
dataType: 'json',
success: function (json) {
console.log('Success Messages')
}
}));
}
_onLoadData(json) {
const self = this;
// console.log('mesages json = ', json);
// console.log('$inbox = ', this.$inbox);
// console.log("messages render start");
self.$inbox.html("");
$.each(json.results, function (i, v) {
var senderName = 'Вы';
var className = 'youChat';
if (v.sender.id !== userId) {
senderName = v.sender.username;
className = '';
}
if (v.is_system) {
senderName = 'Системное';
className = 'systemChat'
}
let message = $(self.messageTemplate({className: className, senderName: senderName, message: v}));
self.$inbox.append(message);
});
// console.log("messages render complete");
self.$inbox.scrollTop(self.$inbox.prop("scrollHeight"));
}
}
export {MessagesController}

@ -0,0 +1,340 @@
import {loadTemplate} from './loaders'
// new-stages-form
// update-stages-form
// remove-stages-form
class StageForm {
constructor($container, {orderId, stage_num, stage_status, type = 'new', formNamePostfix = '-stages-form', template_name, data = {}},
kwargs = {
stage_num: stage_num,
stage_status: stage_status,
form_name: (type + formNamePostfix),
orderId: orderId,
stage: data
},)
// kwargs - auto generate from name_attributes
{
// console.log('Stage form template_name = ', template_name);
this.orderId = orderId;
this._type = type;
this.$container = $container;
this.self_tmpl = loadTemplate(template_name);
this.data = data;
this.$form = undefined;
this.stageId = (type != 'new') ? data.id : undefined;
this.create(kwargs);
}
create(kwargs) {
/**
* Добавление шаблона-формы Этапа на страницу
*/
let el = $(this.self_tmpl(kwargs));
this.$container.append(el);
this.$form = el.find('form');
// console.log("form --> ", this.$form);
if (this.$form.length) this.$form.find('input[name=cost]').mask('000000000');
}
remove() {
/**
* Удаление, при уменьшении кол-ва этапов
* return true - удаляем из [] stages
*/
if (this.type == 'new') {
this.$form.parent().remove();
return true;
}
this.type = 'remove';
// this.$form.removeClass('update-stages-form').addClass('remove-stages-form');
return false
}
restore() {
/**
* Восстановление, при увеличении кол-ва этапов
*/
if (this.type == 'new') throw new Error("Попытка восстановить элемент с type='new'");
this.type = 'update';
// this.$form.removeClass('remove-stages-form').addClass('update-stages-form');
}
set type(newType) {
this.$form.removeClass(`${this._type}-stages-form`).addClass(`${newType}-stages-form`);
if (newType == 'remove') this.hide();
if (newType == 'update') this.show();
this._type = newType
}
get type() {
return this._type
}
disable() {
this.$form.find('input').attr('readonly', true);
}
enable() {
this.$form.find('input').attr('readonly', false);
}
hide() {
this.$form.parent().hide();
}
show() {
this.$form.parent().show()
}
is_valid() {
let self = this;
let mesage = 'Это поле обязательно';
let valid = true;
//Очищаем старые ошибки
this.$form.find('.error').html("");
// Отображаем новые
this.$form.find(":input:not([type=hidden])").each(function (i, v) {
if (!$(v).val()) {
self.$form.find(`.error-${$(v).attr("name")}`).html(mesage).css('color', 'red');
valid = false
}
});
return valid
}
sendAjax_approve() {
/**
* Отправка Этапа "на согласование"
*/
let self = this;
// console.log("Send AJAX Approve");
if (this.type == 'new') {
// console.log('new stages approve');
return Promise.resolve($.ajax({
// async: false,
url: '/api/stages/',
type: 'POST',
beforeSend: function (xhr) {
xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'))
},
data: this.$form.serialize(),
dataType: 'json',
})
.done(function (json) {
self.type = 'update';
self.disable();
self.$form.find('.error').html("");
// console.log("json -->", json);
self.stageId = json.id;
// console.log(json);
})
.fail(function (xhr, errorMsg, error) {
console.log("ERROR, xhr", xhr);
$.each(xhr.responseJSON, function (i, v) {
self.$form.find('.error-' + i).html(v).css('color', 'red');
// console.log(self.$form);
// console.log(v);
// console.log(i);
});
}));
} else if (this.type == 'update') {
this.$form.find('input[name=status]').val('send_approve');
return Promise.resolve($.ajax({
url: `/api/stages/${this.stageId}/`,
type: 'PUT',
beforeSend: function (xhr) {
xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'))
},
data: this.$form.serialize(),
dataType: 'json',
})
.done(function (json) {
self.$form.find('.error').html("");
self.disable();
})
.fail(function (xhr, errorMsg, error) {
$.each(xhr.responseJSON, function (i, v) {
self.$form.find('.error-' + i).html(v).css('color', 'red');
console.log(v);
console.log(i);
});
}));
} else if (this.type == 'remove') {
return Promise.resolve($.ajax({
url: `/api/stages/${this.stageId}/`,
type: 'DELETE',
beforeSend: function (xhr) {
xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'))
},
dataType: 'json',
})
.done(function (json) {
})
.fail(function (xhr, errorMsg, error) {
console.log("delete fail, json -->", xhr);
}));
}
}
sendAjax_accept(secureOrder) {
/**
* "Согласовать" Этапы (Исполнителем)
*/
// console.log("secureOrder = ", secureOrder);
// console.log("set new status =", secureOrder ? 'agreed': 'in_process');
return Promise.resolve($.ajax({
url: '/api/stages/' + this.stageId + '/',
type: 'PATCH',
beforeSend: function (xhr) {
xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'))
},
//TODO: слать только изменения
data: {
status: secureOrder ? 'agreed': 'in_process',
},
dataType: 'json',
}))
}
sendAjax_change() {
/**
* Отправка Этапа "Внести изменения"
*/
let self = this;
// this.$form.find('input[name=status]').val('not_agreed');
// console.log("ajax Change form -->", this.$form);
return Promise.resolve($.ajax({
url: '/api/stages/' + this.stageId + '/',
type: 'PATCH',
beforeSend: function (xhr) {
xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'))
},
//TODO: слать только изменения
data: {status: 'not_agreed'},
dataType: 'json',
})
.done(function (json) {
// enableStageFields(json.id);
// $form.find('.error').html("");
self.enable();
})
.fail(function (xhr) {
console.log("Ошибка, которой не должно быть json -->", xhr.responseJSON);
}));
}
}
class StageReserved {
constructor($container, {template_name = 'reserved_tmpl', data},
kwargs = {
reserved_cls: '',
reserved_name: '',
stage: data
},) {
// Вывод текста резервирования в зависимости от статуса этапа
let reserved_names = {
agreed: 'Не зарезервирована',
in_process: 'Зарезервирована',
completed: 'Зарезервирована',
closed: 'Переведена исполнителю',
};
// Вывод текста резервирования в зависимости от статуса этапа
let reserved_classes = {
agreed: 'unreserved',
in_process: 'reserved',
completed: 'reserved',
closed: 'closed',
};
kwargs.reserved_cls = reserved_classes[data.status];
kwargs.reserved_name = reserved_names[data.status];
this.data = data;
this.self_tmpl = loadTemplate(template_name);
this.$container = $container;
this.create(kwargs);
}
create(kwargs) {
/**
* Добавление шаблона "Резервирование" Этапа на страницу
*/
this.$self = $(this.self_tmpl(kwargs));
this.$container.append(this.$self);
// console.log("form --> ", this.$form);
// this.$form.find('input[name=cost]').mask('000000000');
}
}
class StageInWork {
constructor($container, {template_name = 'work_in_process_tmpl', note_text = '', data},
kwargs = {stage: data, note_text: note_text}) {
this.stageId = data.id;
this.data = data;
this.self_tmpl = loadTemplate(template_name);
this.$container = $container;
this.create(kwargs);
}
create(kwargs) {
/**
* Добавление шаблона "Выполнение работы" Этапа на страницу
*/
this.$self = $(this.self_tmpl(kwargs));
this.$container.append(this.$self);
}
hide() {
this.$self.hide();
}
sendAjax_complete() {
/**
* Отправка Этапа "Закрыть этап"
*/
let self = this;
return Promise.resolve($.ajax({
url: `/api/stages/${this.stageId}/`,
type: 'PATCH',
beforeSend: function (xhr) {
xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'))
},
data: {status: 'completed'},
dataType: 'json',
})
.done(function (json) {
// enableStageFields(json.id);
// $form.find('.error').html("");
// self.enable();
})
.fail(function (xhr) {
console.log("Ошибка, которой не должно быть json -->", xhr.responseJSON);
}));
}
sendAjax_close() {
/**
* Отправка Этапа "Закрыть этап"
*/
let self = this;
return Promise.resolve($.ajax({
url: `/api/stages/${this.stageId}/`,
type: 'PATCH',
beforeSend: function (xhr) {
xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'))
},
//TODO: слать только изменения
data: {status: 'closed'},
dataType: 'json',
})
.done(function (json) {
// enableStageFields(json.id);
// $form.find('.error').html("");
// self.enable();
})
.fail(function (xhr) {
console.log("Ошибка, которой не должно быть json -->", xhr.responseJSON);
}));
}
}
export {StageForm, StageReserved, StageInWork}

@ -0,0 +1,446 @@
import {getCookie} from '../utils'
import {loadTemplate} from './loaders'
import {StageForm, StageReserved, StageInWork} from './Stages'
let message_format = {
"format_type": "approve_stages",
"data": {
"sender_id": "",
"recipent_id": "",
"order_id": "",
"msg": "",
"is_system": true
}
};
const STATUSES = {
'not_agreed': 'не согласован',
'send_approve': 'на согласовании',
'agreed': 'согласовано',
'cancel_approve': 'исполнитель отказался',
'in_process': 'в процессе',
'completed': 'завершен',
'closed': 'закрыт',
};
//Contractor
class StagesController {
constructor(orderId, projectId, recipentId, orderName, secureOrder) {
const self = this;
this.orderId = orderId;
this.projectId = projectId;
this.recipentId = recipentId;
this.orderName = orderName;
this.secureOrder = secureOrder;
// console.log("ids -->", orderId, projectId, recipentId);
this.data = {}; //JSON
this.stages = [];
this.stages_reserved = [];
this.stages_work = [];
this.STAGE_STATUSES = {
'not_agreed': this.buildStartStage.bind(self),
'send_approve': this.buildSendApproveStage.bind(self),
'agreed': this.buildAgreedStage.bind(self),
'in_process': this.buildProcessStage.bind(self),
'completed': this.buildProcessStage.bind(self),
'closed': this.buildProcessStage.bind(self),
};
this.btnCompleteTmpl = loadTemplate('bntCompleteStage_tmpl');
this.btnSendReviewTmpl = loadTemplate('btnSendReview_tmpl');
this.$orderStagesContainer = $('#order-stages');
this.$orderStagesContainer.html('');
this.buttons = {
btnApprove: $('#btnApprove'), // "Согласовать"
btnChange: $('#btnChange'), // "Отправить на внесение изменений"
btnsToArchive: $('.js-btnToArchive'), // "Отказаться от заказа"
btnsArbitration: $('.js-btnArbitration'),// "Обратиться в арбитраж"
btnSendReview: $('#order-review-add') // "Оставить отзыв"
};
this.stages_elements = {
$approve: $('#conditions-approve'), //1. Согласование условия
$reserve: $('#reserveSpace'), //2. Резервирование (Отобразить)
$works: $('#completeWork') //3. Выполненная работа
};
this.init();
}
init() {
const self = this;
this.dataPromise = this.getOrderData({orderId: this.orderId});
this.dataPromise
.then(
self._onLoadData.bind(self)
)
.catch(
self._onLoadDataError.bind(self)
);
}
getOrderData({orderId}) {
const self = this;
return Promise.resolve($.ajax({
url: `/api/orders/${orderId}/`,
dataType: 'json',
beforeSend: function (xhr) {
xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'))
},
}))
}
redraw() {
/**
* Полностью перерисовываем страницу Заказа
*/
console.log("Redraw contractor stages");
// $("#orderBlock" + this.orderId).trigger('click');
this.init();
}
buildStartStage() {
/**
* Стадия: "Проект Предложен"(нет этапов)
*/
// Выделить цифру 1. красным
// $('#conditions-approve').find('.select')
this.stages_elements.$approve.show();
this.stages_elements.$reserve.show();
this.stages_elements.$works.show();
this.$orderStagesContainer.parent().hide();
this.buttons.btnsToArchive.first().hide();
this.$orderStagesContainer.show();
this.buttons.btnApprove.hide();
this.buttons.btnChange.hide();
this.buttons.btnsArbitration.hide();
this.stages_elements.$approve.find('.js-help-text').show();
this.stages_elements.$reserve.find('.stages-paid').html("");
this.stages_elements.$works.find('.js-help-text').show();
this.stages_elements.$works.find('#stagesWork').html("");
if (this.secureOrder){
this.stages_elements.$reserve.find('.js-help-text').show();
} else {
this.stages_elements.$reserve.find('.js-help-text').hide();
// this.stages_elements.$reserve.find('.js-help-text').html('Резервирование не предусмотрено, безопасная сделака не активна');
}
} // Нет Этапов / "Не согласован"
// buildNotAgreedStage() {
// console.log("Stage: not_agreed");
// // this._renderStage('stage_tmpl');
// this.buttons.btnApprove.hide();
// this.buttons.btnChange.hide();
// this.buttons.btnToArchive.hide();
// this.buttons.btnArbitration.hide();
// } // Статус "Не согласован"
buildSendApproveStage() {
console.log("Stage: send_approve");
this._renderStage('stage_approved_tmpl', true);
this.$orderStagesContainer.parent().show();
this.buttons.btnApprove.show();
this.buttons.btnChange.show();
this.buttons.btnsToArchive.first().show();
this.stages_elements.$reserve.hide();
this.stages_elements.$works.hide();
} // Статус "На согласовании"
buildAgreedStage() {
console.log('Stage: agreed');
this.$orderStagesContainer.parent().show();
this.buttons.btnApprove.hide();
this.buttons.btnChange.hide();
this.buttons.btnsToArchive.hide();
this.buttons.btnsArbitration.first().hide();
this.buttons.btnsArbitration.last().show();
this._renderStage('stage_approved_tmpl', true);
this.stages_elements.$approve.find('.js-help-text').hide();
this.stages_elements.$reserve.show();
if (this.secureOrder){
this._renderStageReserved('reserved_tmpl');
this.stages_elements.$reserve.find('.js-help-text').show();
}else{
this.stages_elements.$reserve.find('.stages-paid').html("");
this.stages_elements.$reserve.find('.js-help-text').hide();
}
} // Статус "Согласован"
buildProcessStage() {
console.log('Stage: in_process');
this.buildAgreedStage();
this.stages_elements.$reserve.find('.js-help-text').hide();
this.stages_elements.$works.show();
if (this.secureOrder) {
this._renderStageInWork('work_in_process_tmpl');
} else {
this.stages_elements.$reserve.find('.stages-paid').html("");
}
} // Статус "В процессе"/"Завершен"/"Закрыт"
_buildPage() {
// console.log("Build PAge");
this.stages_elements.$reserve.hide();
this.stages_elements.$works.hide();
if (this.data.stages.length == 0) {
this.buildStartStage()
} else {
let stageStatus = this.data.stages[0].status;
// console.log('stageStatus = ', stageStatus);
this.STAGE_STATUSES[stageStatus]();
}
this._bindEvents();
}
_renderStage(template_name, disable = false) {
let i = 0;
// console.log("this.data.stages = ", this.data.stages);
this.$orderStagesContainer.html("");
for (let stage_data of this.data.stages) {
i++;
// console.log('stage_data = ', stage_data);
let stage = new StageForm(this.$orderStagesContainer,
{
orderId: this.orderId, stage_num: i, stage_status: STATUSES[stage_data.status],
type: 'update', template_name: template_name, data: stage_data
});
if (disable) stage.disable();
this.stages.push(stage);
}
}
_renderStageReserved(template_name) {
/**
* Отрисовываем блок "Резервирование"
*/
// console.log("_renderStageReserved");
let $container = this.stages_elements.$reserve.find('.stages-paid');
$container.html("");
this.stages_reserved = [];
// console.log("this.data.stages = ", this.data.stages);
// Нет незарезервированных Этапов
// let has_not_reserved_stages = false;
for (let stage_data of this.data.stages) {
// if (stage_data.status == 'agreed') has_not_reserved_stages = true;
let stage = new StageReserved($container,
{
template_name, data: stage_data
});
this.stages_reserved.push(stage);
}
// if (!has_not_reserved_stages) {
// this.buttons.btnReserve.hide();
// this.stages_elements.$reserve.find('.js-help-text').hide();
// }
}
_renderStageInWork(template_name) {
/**
* Отрисовываем блок "Выволнение работы", включая "Выполненныа работа" и "Оставить отзыв"
*/
let $container = this.stages_elements.$works.find('#stagesWork');
$container.html("");
let all_closed = this.data.stages.every((el)=>el.status == 'closed');
if (all_closed) {
this.stages_elements.$works.find('.titleStepss').html('3. Выполненная работа');
this.stages_elements.$works.find('.js-btnArbitration').hide();
this.stages_elements.$works.find('.js-help-text').hide();
for (let stage_data of this.data.stages) {
let stage = new StageInWork($container,
{
template_name, data: stage_data
});
this.stages_work.push(stage);
}
// console.log("has_user_review = ", this.data.has_user_review);
if (!this.data.has_user_review) {
let btnReviewOpenModel = $(this.btnSendReviewTmpl());
btnReviewOpenModel.unbind().on('click', this._onBtnReviewOpenModal.bind(this));
// Если кнопка "Оставить отзыв" еще не добавлена - добавляем
if (!this.stages_elements.$works.find('#send-review').length) this.stages_elements.$works.append(btnReviewOpenModel);
} else {
if (this.stages_elements.$works.find('#send-review').length) this.stages_elements.$works.find('#send-review').remove()
}
} else {
for (let stage_data of this.data.stages) {
if (stage_data.status == 'closed' || stage_data.status == 'agreed') continue;
let note_text = (stage_data.status == 'completed') ? '...НА УТВЕРЖДЕНИИ У ЗАКАЗЧИКА' : '';
let stage = new StageInWork($container,
{
template_name, data: stage_data, note_text: note_text
});
if (stage_data.status == 'in_process') {
let $btn = $(this.btnCompleteTmpl({stage: stage_data, text: 'Завершить этап'}));
$container.html();
$container.append($btn);
$btn.on('click', this._onBtnComplete.bind(this, stage))
}
this.stages_work.push(stage);
}
}
}
_onLoadData(json) {
this.data = json;
this._buildPage();
}
_bindEvents() {
const self = this;
this.buttons.btnApprove.unbind().on("click", this._onBtnAccept.bind(self));
this.buttons.btnChange.unbind().on("click", this._onBtnChange.bind(self));
this.buttons.btnsToArchive.unbind().on("click", this._onBtnAToArchive.bind(self));
this.buttons.btnsArbitration.unbind().on("click", this._onBtnArbitration.bind(self));
this.buttons.btnSendReview.unbind().on("click", this._onBtnSendReview.bind(self));
$("#reserve-stage-modal").find('#stage-num').unbind().on('change', function (event) {
// console.log("select stage cost = ", self.stages[this.value - 1].data.cost);
$("#reserve-stage-modal").find('#stage-cost').html(self.stages[this.value - 1].data.cost);
});
}
// BINDS
_onBtnAccept(event) {
event.preventDefault();
const self = this;
Promise.all(this.stages.map((el)=>el.sendAjax_accept(self.secureOrder))).then(()=> {
console.log('Этапы согласованы');
self.redraw();
let message = message_format;
message.data.sender_id = userId;
message.data.recipent_id = self.recipentId;
message.data.order_id = self.orderId;
message.data.msg = `Условия заказа ${self.orderName} приняты`;
console.log("Send-WS Условия приняты");
socket.send_stages_approve(message);
//TODO: раскомментировать дурацкое окно
// $('#popupOk').modal('show');
// })
});
} // "Согласовать"
_onBtnChange(event) {
event.preventDefault();
const self = this;
Promise.all(this.stages.map((el)=>el.sendAjax_change())).then(()=> {
self.redraw();
let message = message_format;
message.data.sender_id = userId;
message.data.recipent_id = self.recipentId;
message.data.order_id = self.orderId;
message.data.msg = `Заказ ${self.orderName} отправлен для внесения изменений`;
console.log("Send-WS Внести изменения");
socket.send_stages_approve(message);
});
} // "Отправить на внесение изменений"
// TODO: test it
_onBtnAToArchive(event) {
event.preventDefault();
console.error("Отказаться от заказа. Не протестировано!!");
// TODO: Не только удалять заказ, но и делать его копию со статусом "Открыто"
$.ajax({
// async: false,
url: `/api/orders/${this.orderId}/`,
type: 'DELETE',
beforeSend: function (xhr) {
xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'))
},
dataType: 'json',
})
.done(function (json) {
console.log('delete complete');
window.location.href = window.location.href.replace(getHash(), "");
})
.fail(function (xhr, errorMsg, error) {
console.log("delete fail, json -->", xhr);
});
} // "Отказаться от заказа"
_onBtnComplete(stage, event) {
event.preventDefault();
const self = this;
// let stageId = $(event.target).data('stage-id');
// console.log('Complete stage id = ', stage.data.id);
stage.sendAjax_complete()
.then(function (json) {
self.redraw();
let message = message_format;
message.data.sender_id = userId;
message.data.recipent_id = self.recipentId;
message.data.order_id = self.orderId;
message.data.msg = `Этап ${json.name} закрыт`;
console.log("Send-WS Закрытие этапа");
socket.send_stages_approve(message);
})
.catch(function (xhr) {
console.log("При закрытии этапа произошла ошибка -->", xhr);
})
} // "Закрыть этап"
_onBtnReviewOpenModal(event) {
event.preventDefault();
$('#review-add').modal('show');
} // Открыть модальное окно "Оставить отзыв"
_onBtnSendReview(event) {
event.preventDefault();
const self = this;
$('#projectReviewId').val(this.projectId);
$('#targetCustomerId').val(this.recipentId);
// $('#fromContractorId').val('....current user');
var formData = $("#review-adds-form").serialize();
// console.log('Оставить отзыв formdata -->', formData);
$.ajax({
url: '/api/reviews/',
type: 'POST',
beforeSend: function (xhr) {
xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'))
},
data: formData,
dataType: 'json',
success: function (json) {
// console.log('Отзыв успешно отправлен, json -->', json);
// $('#review-add').modal('hide');
// self.stages_elements.$works.find('.js-btnSendReview').hide();
$('#review-add').modal('hide');
self.redraw();
let message = message_format;
message.data.sender_id = userId;
message.data.recipent_id = self.recipentId;
message.data.order_id = self.orderId;
message.data.msg = `Отзыв на заказ ${self.orderName} оставлен`;
console.log("Send-WS Оставить отзыв");
socket.send_stages_approve(message);
// $("a[href='#tab2']").trigger('click');
window.location = '/chat/#order';
location.reload();
},
error: function (e) {
console.log('error');
console.log(e);
}
});
} // "Оставить отзыв"
_onBtnArbitration(event) {
event.preventDefault();
$("#arbitration-add").modal('show');
} // "Обратиться в арбитраж"
_onLoadDataError(error) {
console.log("Error loading data -->", error);
}
}
export {StagesController}

@ -0,0 +1,545 @@
import {getCookie} from '../utils'
import {loadTemplate} from './loaders'
import {StageForm, StageReserved, StageInWork} from './Stages'
let message_format = {
"format_type": "approve_stages",
"data": {
"sender_id": "",
"recipent_id": "",
"order_id": "",
"msg": "",
"is_system": true
}
};
const STATUSES = {
'not_agreed': 'не согласован',
'send_approve': 'на согласовании',
'agreed': 'согласовано',
'cancel_approve': 'исполнитель отказался',
'in_process': 'в процессе',
'completed': 'завершен',
'closed': 'закрыт',
};
class StagesController {
constructor(orderId, projectId, recipentId, orderName, secureOrder) {
const self = this;
this.orderId = orderId;
this.orderName = orderName;
this.projectId = projectId;
this.recipentId = recipentId;
this.secureOrder = secureOrder;
this.data = {}; //JSON
this.stages = [];
this.stages_reserved = [];
this.stages_work = [];
this.STAGE_STATUSES = {
'not_agreed': this.buildNotAgreedStage.bind(self),
'send_approve': this.buildSendApproveStage.bind(self),
'agreed': this.buildAgreedStage.bind(self),
'in_process': this.buildProcessStage.bind(self),
'completed': this.buildProcessStage.bind(self),
'closed': this.buildProcessStage.bind(self),
};
this.btnCompleteTmpl = loadTemplate('bntCompleteStage_tmpl');
this.btnSendReviewTmpl = loadTemplate('btnSendReview_tmpl');
this.$orderStagesContainer = $('#order-stages');
this.$orderStagesContainer.html('');
this.$stagesCount = $('#countStage');
this.$stagesCount.unbind().on("change", this._changeNumStages.bind(self));
this.$stagesCount.parent().show();
this.buttons = {
btnApprove: $('#btnApprove'),
btnChange: $('#btnChange'),
btnToArchive: $('#btnToArchive'),
btnReserve: $('#btnReserve'),
btnsArbitration: $('.js-btnArbitration'),
btnSendReview: $('#order-review-add')
};
this.stages_elements = {
$approve: $('#conditions-approve'), //1. Согласование условия
$reserve: $('#reserveSpace'), //2. Резервирование
$works: $('#completeWork') //3. Выполненная работа
};
this.init();
}
init() {
const self = this;
this.dataPromise = this.getOrderData({orderId: this.orderId});
this.dataPromise
.then(
self._onLoadData.bind(self)
)
.catch(
self._onLoadDataError.bind(self)
);
}
getOrderData({orderId}) {
const self = this;
return Promise.resolve($.ajax({
url: `/api/orders/${orderId}/`,
dataType: 'json',
beforeSend: function (xhr) {
xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'))
},
}))
}
redraw() {
/**
* Полностью перерисовываем страницу Заказа
*/
console.log("Redraw customer stages");
// $("#orderBlock" + this.orderId).trigger('click');
this.init();
}
buildStartStage() {
/**
* Стадия: "Проект Предложен"(нет этапов)
*/
// Выделить цифру 1. красным
// $('#conditions-approve').find('.select')
this.$orderStagesContainer.show();
this.buttons.btnApprove.show();
this.buttons.btnChange.hide();
this.buttons.btnToArchive.hide();
this.$stagesCount.removeAttr('disabled');
this.$stagesCount.val(1);
this.$stagesCount.trigger('change');
// this.stages_elements.$approve.find('.js-help-text').show();
// this.stages_elements.$reserve.find('.js-help-text').show();
// this.stages_elements.$reserve.find('.stages-paid').hide();
// this.stages_elements.$works.find('.js-help-text').show();
// this.stages_elements.$works.find('#stagesWork').show();
} // Нет Этапов
buildNotAgreedStage() {
console.log("Stage: not_agreed");
this._renderStage('stage_tmpl');
this.buttons.btnApprove.show();
this.buttons.btnChange.hide();
this.buttons.btnToArchive.hide();
} // Статус "Не согласован"
buildSendApproveStage() {
console.log("Stage: send_approve");
this._renderStage('stage_tmpl', true);
this.$stagesCount.attr('disabled', true);
this.stages_elements.$reserve.hide();
this.stages_elements.$works.hide();
this.buttons.btnApprove.hide();
this.buttons.btnChange.show();
this.buttons.btnToArchive.show();
} // Статус "На согласовании"
buildAgreedStage() {
console.log('Stage: agreed');
this.buttons.btnApprove.hide();
this.buttons.btnChange.hide();
this.buttons.btnToArchive.hide();
this.$stagesCount.parent().hide();
this._renderStage('stage_approved_tmpl', true);
this.stages_elements.$approve.find('.js-help-text').hide();
this.stages_elements.$reserve.find('.js-help-text').show();
this.stages_elements.$reserve.show();
this.buttons.btnReserve.show();
this.buttons.btnsArbitration.show();
this._renderStageReserved('reserved_tmpl')
} // Статус "Согласован"
buildProcessStage() {
console.log('Stage: in_process');
this.buildAgreedStage();
this.stages_elements.$reserve.find('.js-btnArbitration').hide();
this.stages_elements.$works.show();
this._renderStageInWork('work_in_process_tmpl');
} // Статус "В процессе"/"Завершен"/"Закрыт"
_buildPage() {
// console.log("Build PAge");
this.stages_elements.$reserve.hide();
this.stages_elements.$works.hide();
if (this.data.stages.length == 0) {
this.buildStartStage()
} else {
let stageStatus = this.data.stages[0].status;
// console.log('stageStatus = ', stageStatus);
this.STAGE_STATUSES[stageStatus]();
}
this._bindEvents();
}
_renderStage(template_name, disable = false) {
let i = 0;
this.$orderStagesContainer.html("");
for (let stage_data of this.data.stages) {
i++;
let stage = new StageForm(this.$orderStagesContainer,
{
orderId: this.orderId, stage_num: i, stage_status: STATUSES[stage_data.status],
type: 'update', template_name: template_name, data: stage_data
});
if (disable) stage.disable();
this.stages.push(stage);
}
this.$stagesCount.val(i);
}
_renderStageReserved(template_name) {
let $container = this.stages_elements.$reserve.find('.stages-paid');
$container.html("");
this.stages_reserved = [];
// Нет незарезервированных Этапов
let has_not_reserved_stages = false;
for (let stage_data of this.data.stages) {
if (stage_data.status == 'agreed') has_not_reserved_stages = true;
let stage = new StageReserved($container,
{
template_name, data: stage_data
});
this.stages_reserved.push(stage);
}
if (!has_not_reserved_stages) {
this.buttons.btnReserve.hide();
this.stages_elements.$reserve.find('.js-help-text').hide();
}
}
_renderStageInWork(template_name) {
/**
* Отрисовываем блок "Выволнение работы", включая "Выполненныа работа" и "Оставить отзыв"
*/
let $container = this.stages_elements.$works.find('#stagesWork');
$container.html("");
let all_closed = this.data.stages.every((el)=>el.status == 'closed');
if (all_closed) {
this.stages_elements.$works.find('.titleStepss').html('3. Выполненная работа');
this.stages_elements.$works.find('.js-btnArbitration').hide();
this.stages_elements.$works.find('.js-help-text').hide();
for (let stage_data of this.data.stages) {
let stage = new StageInWork($container,
{
template_name,
data: stage_data,
note_text: 'Закройте этап или подробно опишите замечания в чате'
});
this.stages_work.push(stage);
}
if (!this.data.has_user_review) {
let btnReviewOpenModel = $(this.btnSendReviewTmpl());
btnReviewOpenModel.unbind().on('click', this._onBtnReviewOpenModal.bind(this));
// Если кнопка "Оставить отзыв" еще не добавлена - добавляем
if (!this.stages_elements.$works.find('#send-review').length) this.stages_elements.$works.append(btnReviewOpenModel);
} else {
if (this.stages_elements.$works.find('#send-review').length) this.stages_elements.$works.find('#send-review').remove()
}
} else {
for (let stage_data of this.data.stages) {
if (stage_data.status == 'closed') continue;
let stage = new StageInWork($container,
{
template_name, data: stage_data
});
if (stage_data.status == 'completed') {
let $btn = $(this.btnCompleteTmpl({stage: stage_data, text: 'Закрыть этап'}));
$container.html();
$container.append($btn);
$btn.on('click', this._onBtnClose.bind(this, stage))
}
this.stages_work.push(stage);
}
}
}
_onLoadData(json) {
this.data = json;
this._buildPage();
}
_changeNumStages(event) {
/**
* Изменяет кол-во этапов(stages)
*/
let newNumStages = parseInt($(event.target).val());
if (newNumStages < 1 || isNaN(newNumStages)) {
newNumStages = 1;
this.$stagesCount.val(newNumStages)
}
let currentNumStages = $('.js-stage-form:not(.remove-stages-form)').length;
if (currentNumStages == newNumStages) return;
if (currentNumStages > newNumStages) {
for (let stage of this.stages.slice().reverse()) {
if (stage.remove()) {
let index = this.stages.indexOf(stage);
if (index >= 0) {
this.stages.splice(index, 1);
}
}
currentNumStages--;
if (currentNumStages == newNumStages) break;
}
} else {
for (let stage of this.stages.slice()) {
if (stage.type == 'remove') {
stage.restore();
} else continue;
currentNumStages++;
if (currentNumStages == newNumStages) break;
}
while (currentNumStages < newNumStages) {
currentNumStages++;
let stage = new StageForm(this.$orderStagesContainer,
{orderId: this.orderId, stage_num: currentNumStages, type: 'new', template_name: 'stage_tmpl'});
this.stages.push(stage);
}
}
} //При изменении кол-ва этапов
_bindEvents() {
const self = this;
this.buttons.btnApprove.unbind().on("click", this._onBtnApprove.bind(self));
this.buttons.btnChange.unbind().on("click", this._onBtnChange.bind(self));
this.buttons.btnToArchive.unbind().on("click", this._onBtnAToArchive.bind(self));
this.buttons.btnReserve.unbind().on("click", this._onBtnReserve.bind(self));
this.buttons.btnsArbitration.unbind().on("click", this._onBtnArbitration.bind(self));
this.buttons.btnSendReview.unbind().on("click", this._onBtnSendReview.bind(self));
$('#paymentfromSite').unbind().on('click', this._onBtnPaymentFromSite.bind(self));
$("#reserve-stage-modal").find('#stage-num').unbind().on('change', function (event) {
// console.log("select stage cost = ", self.stages[this.value - 1].data.cost);
$("#reserve-stage-modal").find('#stage-cost').html(self.stages[this.value - 1].data.cost);
});
}
// BINDS
_onBtnApprove(event) {
event.preventDefault();
const self = this;
if (!this.stages.every((el)=>el.is_valid())) {
console.error('Не все поля форм валидны');
return
}
// При выполнении всех ajax запросов
Promise.all(this.stages.map((el)=>el.sendAjax_approve())).then(()=> {
this.buttons.btnApprove.hide();
this.buttons.btnChange.show();
this.buttons.btnToArchive.show();
this.$stagesCount.attr('disabled', true);
// var currentRecipentId = $(self).data('id');
// var secureOrder = true;
//
let message = message_format;
message.data.sender_id = userId;
message.data.recipent_id = self.recipentId;
message.data.order_id = self.orderId;
message.data.msg = `Условия заказа ${self.orderName} отправлены на согласование`;
console.log("Send-WS Отправить на согласование");
socket.send_stages_approve(message);
//TODO: раскомментировать дурацкое окно
// $('#popupOk').modal('show');
// })
});
} // "Отправить на согласование"
_onBtnChange(event) {
event.preventDefault();
const self = this;
Promise.all(this.stages.map((el)=>el.sendAjax_change())).then(()=> {
this.buttons.btnApprove.show();
this.buttons.btnChange.hide();
this.buttons.btnToArchive.hide();
this.$stagesCount.attr('disabled', false);
let message = message_format;
message.data.sender_id = userId;
message.data.recipent_id = self.recipentId;
message.data.order_id = self.orderId;
message.data.msg = `Заказ ${self.orderName} отозван для внесения изменений`;
console.log("Send-WS Внести изменения");
socket.send_stages_approve(message);
});
} // "Внести изменения"
// TODO: test it
_onBtnAToArchive(event) {
event.preventDefault();
const self = this;
$.ajax({
// async: false,
url: `/api/orders/${this.orderId}/`,
type: 'DELETE',
beforeSend: function (xhr) {
xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'))
},
dataType: 'json',
})
.done(function (json) {
console.log('delete complete');
window.location.href = window.location.href.replace(getHash(), "");
let message = message_format;
message.data.sender_id = userId;
message.data.recipent_id = self.recipentId;
message.data.order_id = self.orderId;
message.data.msg = `Заказа ${self.orderName} отправлен в архив`;
console.log("Send-WS Отправить в архив");
socket.send_stages_approve(message);
})
.fail(function (xhr, errorMsg, error) {
console.log("delete fail, json -->", xhr);
});
} // "Отказаться и отправить в архив"
_onBtnReserve(event) {
const self = this;
event.preventDefault();
// Set modal-window params
let $modal = $("#reserve-stage-modal");
let total_cost = this.stages.map((el)=>parseInt(el.data.cost)).reduce((a, b) => a + b, 0);
// console.log('total cost = ', total_cost);
$modal.find('#total-cost').html(total_cost);
let $select_stageNum = $modal.find('#stage-num');
$select_stageNum
.find('option')
.remove()
.end();
for (let stage of this.stages) {
if (stage.data.is_paid) continue;
$select_stageNum.append(`<option>${stage.data.pos}</option>`);
}
// let $stage_cost = $modal.find('#stage-cost');
// $stage_cost.html(self.stages[this.value - 1].data.cost);
$modal.find('#stage-num').trigger('change');
$modal.modal('show');
} // "Зарезервировать" --> Открывает модальное окно для резервирования
_onBtnPaymentFromSite(event) {
const self = this;
event.preventDefault();
let $modal = $("#reserve-stage-modal");
let sum, stages_id;
if ($modal.find('input[name=choice_way]:checked').val() == 'all_stages') {
sum = $modal.find('#total-cost').html();
stages_id = this.stages.map((el)=>el.data.id);
} else {
sum = $modal.find('#stage-cost').html();
let num_stage = $modal.find('#stage-num').val() - 1;
stages_id = [this.stages[num_stage].data.id];
}
$.ajax({
url: '/wallets/payfromscore/',
type: 'POST',
beforeSend: function (xhr) {
xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'))
},
data: {
sum: sum,
stages_id: stages_id.join(';'),
},
dataType: 'json',
success: function (json) {
// console.log('success pay stage, json ', json);
$("#reserve-stage-modal").modal('toggle');
let message = message_format;
message.data.sender_id = userId;
message.data.recipent_id = self.recipentId;
message.data.order_id = self.orderId;
message.data.msg = `Заказчик зарезервировал сумму для этапов`;
console.log("Send-WS Оплата Этапа/Этапов");
socket.send_stages_approve(message);
self.redraw();
},
error: function (xhr) {
console.log('error pay stage, json', xhr.responseJSON);
$.jGrowl(xhr.responseJSON.message_error);
}
});
} // Оплата с сайта(Счет на Proekton)
_onBtnClose(stage, event) {
event.preventDefault();
const self = this;
stage.sendAjax_close()
.then(function (json) {
console.log("Этап закрыт успешно");
let message = message_format;
message.data.sender_id = userId;
message.data.recipent_id = self.recipentId;
message.data.order_id = self.orderId;
message.data.msg = `Заказчик закрыл этап ${json.name}`;
console.log("Send-WS Оплата Этапа/Этапов");
socket.send_stages_approve(message);
self.redraw();
})
.catch(function (xhr) {
console.log("При закрытии этапа произошла ошибка -->", xhr);
})
} // "Закрыть этап"
_onBtnReviewOpenModal(event) {
event.preventDefault();
$('#review-add').modal('show');
} // Открыть модальное окно "Оставить отзыв"
_onBtnSendReview(event) {
event.preventDefault();
const self = this;
$('#projectReviewId').val(this.projectId);
$('#targetContractorId').val(this.recipentId);
var formData = $("#review-adds-form").serialize();
$.ajax({
url: '/api/reviews/',
type: 'POST',
beforeSend: function (xhr) {
xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'))
},
data: formData,
dataType: 'json',
success: function (json) {
$('#review-add').modal('hide');
let message = message_format;
message.data.sender_id = userId;
message.data.recipent_id = self.recipentId;
message.data.order_id = self.orderId;
message.data.msg = `Отзыв на заказ ${self.orderName} оставлен`;
console.log("Send-WS Оставить отзыв");
socket.send_stages_approve(message);
window.location = '/chat/#order';
location.reload();
// $("a[href='#tab2']").trigger('click');
},
error: function (e) {
console.log('error');
console.log(e);
}
});
} // "Оставить отзыв"
_onBtnArbitration(event) {
event.preventDefault();
$("#arbitration-add").modal('show');
} // "Обратиться в арбитраж"
_onLoadDataError(error) {
console.log("Error loading data -->", error);
}
}
export {StagesController}

@ -0,0 +1,84 @@
import {getCookie} from '../utils'
function bindArchiveProjects() {
// Нажимаем на кнопку архивные сообщения
$("#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("Скрыть архивные заказы");
$("#archive-space").show();
$("#show-archive-label").show();
} else {
$(this).attr('data-show', 'true');
$(this).text("Показать архивные заказы");
$("#archive-space").hide();
$("#show-archive-label").hide();
}
});
// Нажимаем на заказ в архмвных заказах
$(".messageBlock").on('click', '.trashedOrderBlock', function () {
let $this = $(this);
$("#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 = '';
let orderId = $this.data('id');
// let projectId = $this.data('project-id');
// let recipentId = $this.data('recipent-id');
// let orderName = $this.data('order-name');
location.hash = '#order' + orderId;
// console.log(orderId);
window.chatController.create(orderId);
// $.ajax({
// url: '/api/message',
// type: 'GET',
// beforeSend: function (xhr) {
// xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'))
// },
// data: {'order': orderId, 'team__isnull': 'true'},
// dataType: 'json',
// success: function (json) {
// $.each(json.results, function (i, v) {
// var senderName = 'Вы';
// var className = 'youChat';
//
// if (v.sender.id !== userId) {
// senderName = v.sender.username;
// 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>';
//
// });
// var height = inbox.scrollHeight;
// inbox.scrollTop = height;
// }
// });
// $("#order-stages").html("");
// $("#completeWork").hide();
// $("#add-form-order-note").hide();
// $("#reserveSpace").hide();
});
}
export {bindArchiveProjects}

@ -0,0 +1,145 @@
function chatContactsInit() {
/**
* Bind на кнопку "Отправить" в Закладке "Личные контакты"
*/
$('#contact-chat-add-message').on('click', function (e) {
e.preventDefault();
var chatMessage = $("#chat").val();
var recipentId = $("#recipentContactId").val();
var senderId = $("#senderContactId").val();
var sendLinks = $("#document-send-contact a");
if (chatMessage || sendLinks.length > 0) {
$("#contact-chat-form .errorEmptyMessage").hide();
var sendLinkIds = "";
var documentLinks = "";
var documentAttachFiles = "";
$.each(sendLinks, function (i, v) {
sendLinkIds += $(this).attr('data-id') + ';';
documentLinks += 'Приложенный файл. скачать: <br> <a href="' + $(this).attr('href') + '">' + $(this).text() + '</a><br>';
documentAttachFiles += '<li style="word-break: break-all;">' +
'<a class="file-link" href="' + $(this).attr('href') + '">' + $(this).text() + '</a>' +
'<div class="remove-document" data-id="' + $(this).attr('data-id') + '" style="right:-10px;"></div></li>';
});
// console.log("sendLinkIds = ", sendLinkIds);
socket.send_message({
"format_type": "add_message_contact",
"data": {
"sender_id": senderId,
"recipent_id": recipentId,
"chat_message": chatMessage,
"document_send_links": sendLinkIds,
"document_data": {
"document_links": documentLinks,
"document_attach_files": documentAttachFiles,
}
}
});
$("#chat").val("");
$("#document-send-contact").html("");
} else {
$("#contact-chat-form .errorEmptyMessage").show();
}
});
}
function chatOrdersInit() {
/**
* Bind на кнопку "Отправить" в Закладке "Исполнители/Заказчики"
*/
$('#order-chat-add-message').on('click', function (e) {
e.preventDefault();
var chatMessage = $("#chat-order-add #chat").val();
var recipentId = $("#chat-order-add #recipentId").val();
var senderId = $("#chat-order-add #senderId").val();
var orderId = $("#chat-order-add #orderId").val();
var sendLinks = $("#document-send-order a");
if (chatMessage || sendLinks.length > 0) {
var sendLinkIds = "";
var documentLinks = "";
var documentAttachFiles = "";
$.each(sendLinks, function (i, v) {
sendLinkIds += $(this).attr('data-id') + ';';
documentLinks += 'Приложенный файл. скачать: <br> <a href="' + $(this).attr('href') + '">' + $(this).text() + '</a><br>';
documentAttachFiles += '<li style="word-break: break-all;">' +
'<a class="file-link" href="' + $(this).attr('href') + '">' + $(this).text() + '</a>' +
'<div class="remove-document" data-id="' + $(this).attr('data-id') + '" style="right:-10px;"></div></li>';
});
socket.send_message({
"format_type": "add_message_order",
"data": {
"sender_id": senderId,
"recipent_id": recipentId,
"chat_message": chatMessage,
"order_id": orderId,
"document_send_links": sendLinkIds,
"document_data": {
"document_links": documentLinks,
"document_attach_files": documentAttachFiles,
}
}
});
$("#chat-order-add #chat").val("");
$("#document-send-order").html("");
} else {
$("#chat-order-add .errorEmptyMessage").show();
}
});
}
function chatTeamsInit() {
$("#add-team-chat-message").on('click', function (e) {
e.preventDefault();
var chatMessage = $("#team-chat-form #chatText").val();
// var recipentId = $("#team-chat-form #recipentTeamId").val();
var senderId = $("#team-chat-form #senderTeamId").val();
var teamId = $("#team-chat-form #teamId").val();
// var orderId = $("#team-chat-form #orderTeamId").val();
var documentSendIds = $("#documentSendIds").val();
var teamIds = $("#team-chat-form #teamIds").val();
var sendLinks = $("#document-send a");
if (chatMessage || sendLinks.length > 0) {
var sendLinkIds = "";
var documentLinks = "";
var documentAttachFiles = "";
$.each(sendLinks, function (i, v) {
sendLinkIds += $(this).attr('data-id') + ';';
documentLinks += 'Приложенный файл. скачать: <br> <a href="' + $(this).attr('href') + '">' + $(this).text() + '</a><br>';
documentAttachFiles += '<li style="word-break: break-all;">' +
'<a class="file-link" href="' + $(this).attr('href') + '">' + $(this).text() + '</a>' +
'<div class="remove-document" data-id="' + $(this).attr('data-id') + '" style="right:-10px;"></div></li>';
});
socket.send_message({
"format_type": "add_message_team",
"data": {
"sender_id": senderId,
// "recipent_id": recipentId,
"chat_message": chatMessage,
"team_id": teamId,
"team_ids": teamIds,
// "order_id": orderId,
"document_send_links": sendLinkIds,
"document_data": {
"document_links": documentLinks,
"document_attach_files": documentAttachFiles,
}
}
});
$("#team-chat-form #chatText").val("");
$("#document-send").html("");
$("#documentSendIds").val("");
} else {
$("#team-chat-form .errorEmptyMessage").show();
}
});
}
export {chatContactsInit, chatOrdersInit, chatTeamsInit}

@ -0,0 +1,157 @@
import {getCookie} from '../utils'
function uploadDocumentsContactInit() {
$("#upload-document-contact").bind('fileuploadsubmit', function (e, data) {
data.formData = {
sender: $("#contact-chat-form #senderContactId").val(),
recipent: $("#contact-chat-form #recipentContactId").val(),
}
});
$('#upload-document-contact').fileupload({
url: '/chat/create/',
crossDomain: false,
beforeSend: function (xhr, settings) {
// console.log("Upload form data -->", this.formData);
$('#progress .progress-bar').css(
'width',
'0%'
);
xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'))
},
dataType: 'json',
done: function (e, data) {
$.each(data.result.files, function (index, file) {
var htmlImg = '<div style="float: left"><a href="/chat/download/' + file.name + '" class="send-doc" data-id="' + file.id + '">' + file.name + '</a>' +
'<div class="remove-document" data-id="' + file.id + '" style="right:-10px;float:left;position: static;"></div></div>';
var document_send = $(htmlImg).appendTo("#document-send-contact");
});
},
fail: function (e) {
console.log(e);
},
progressall: function (e, data) {
var progress = parseInt(data.loaded / data.total * 100, 10);
$('#progress .progress-bar').css(
'width',
progress + '%'
);
}
}).prop('disabled', !$.support.fileInput)
.parent().addClass($.support.fileInput ? undefined : 'disabled');
}
function uploadDocumentsOrderInit() {
$("#upload-document-order").bind('fileuploadsubmit', function (e, data) {
data.formData = {
sender: $("#chat-order-add #senderId").val(),
recipent: $("#chat-order-add #recipentId").val(),
order: $("#chat-order-add #orderId").val(),
}
// console.log(data.formData);
});
$('#upload-document-order').fileupload({
url: '/chat/create/',
crossDomain: false,
beforeSend: function (xhr, settings) {
$('#progress .progress-bar').css(
'width',
'0%'
);
xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'))
},
dataType: 'json',
done: function (e, data) {
$.each(data.result.files, function (index, file) {
var htmlImg = '<div style="float: left"><a href="/chat/download/' + file.name + '" class="send-doc" data-id="' + file.id + '">' + file.name + '</a>' +
'<div class="remove-document" data-id="'+ file.id+'" style="right:-10px;float:left;position: static;"></div></div>';
var document_send = $(htmlImg).appendTo("#document-send-order");
});
},
fail: function (e) {
console.log(e);
},
progressall: function (e, data) {
var progress = parseInt(data.loaded / data.total * 100, 10);
$('#progress .progress-bar').css(
'width',
progress + '%'
);
}
}).prop('disabled', !$.support.fileInput)
.parent().addClass($.support.fileInput ? undefined : 'disabled');
}
function uploadDocumentsTeamInit() {
$("#upload-document-team").bind('fileuploadsubmit', function (e, data) {
data.formData = {
sender: $("#team-chat-form #senderTeamId").val(),
recipent: $("#team-chat-form #recipentTeamId").val(),
order: $("#team-chat-form #orderTeamId").val(),
team: $("#team-chat-form #teamId").val(),
};
// console.log(data.formData);
});
$('#upload-document-team').fileupload({
url: '/chat/create/',
crossDomain: false,
beforeSend: function (xhr, settings) {
$('#progress .progress-bar').css(
'width',
'0%'
);
xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));
},
dataType: 'json',
done: function (e, data) {
$.each(data.result.files, function (index, file) {
var currentValue = $("#documentSendIds").val();
currentValue += file.id + ';';
$("#documentSendIds").val(currentValue);
var htmlImg = '<div style="float: left"><a href="/chat/download/' + file.name + '" class="send-doc" data-id="' + file.id + '">' + file.name + '</a>' +
'<div class="remove-document" data-id="' + file.id + '" style="right:-10px;float:left;position: static;"></div></div>';
var document_send = $(htmlImg).appendTo("#document-send");
});
},
fail: function (e) {
console.log(e);
},
progressall: function (e, data) {
var progress = parseInt(data.loaded / data.total * 100, 10);
$('#progress .progress-bar').css(
'width',
progress + '%'
);
}
}).prop('disabled', !$.support.fileInput)
.parent().addClass($.support.fileInput ? undefined : 'disabled');
}
function bindRemoveDocuments() {
$('.tab-content').on('click', '.remove-document', function (e) {
e.preventDefault();
var dataId = $(this).attr('data-id');
var _this = $(this);
$.ajax({
url: '/api/documents/' + dataId + '/',
type: 'PATCH',
beforeSend: function (xhr) {
xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'))
},
data: {is_delete: true},
dataType: 'json',
success: function (json) {
_this.parent().remove();
// console.log(json);
},
error: function (e, jqxhr) {
console.log(jqxhr);
}
});
});
}
export {uploadDocumentsContactInit, uploadDocumentsOrderInit, uploadDocumentsTeamInit, bindRemoveDocuments}

@ -0,0 +1,9 @@
write_message = {'msg': "",
'msg_time': ".strftime('%Y-%m-%d %H:%M:%S')",
'order_id': "",
'recipent_id': "",
'sender_id': "",
'sender_name': "",
'answer_type': "",
'docs_attach': "",
}

@ -0,0 +1,36 @@
//1-approve_stages
var approve_stages = {
"format_type": "approve_stages",
"data": {
"sender_id": "",
"recipent_id": "",
"order_id": "",
"msg": "Заказчик зарезервировал сумму для этапов " + json.stages,
}
};
//2-add_message_order
var add_message_order = {
"format_type": "add_message_order",
"data": {
"sender_id": "",
"recipent_id": "",
"chat_message": "",
"order_id": "",
"document_send_links": "id;id;id",
"document_data": {
"document_links": 'links/document_link_tmpl.html(...copy)',
"document_attach_files": 'links/document_attach_file_tmpl.html(...copy)',
}
}
};
//3-add_message_contact
var add_message_contact = add_message_order;
//4-add_message_team
var add_message_team = add_message_order;
add_message_team["team_id"] = "";
add_message_team["team_ids"] = "id;id;id";

@ -0,0 +1,28 @@
import stage_tmpl from './templates/stage_tmpl.html'
import stage_approved_tmpl from './templates/stage_approved_tmpl.html'
import reserved_tmpl from './templates/reserved_tmpl.html'
import message_tmpl from './templates/message_tmpl.html'
import work_in_process_tmpl from './templates/work_in_process_tmpl.html'
import bntCompleteStage_tmpl from './templates/buttons/bntCompleteStage_tmpl.html'
import btnSendReview_tmpl from './templates/buttons/btnSendReview_tmpl.html'
import document_attach_file_tmpl from './templates/links/document_attach_file_tmpl.html'
import note_tmpl from './templates/note_tmpl.html'
function loadTemplate(template_name) {
let templates = {
stage_tmpl: stage_tmpl,
stage_approved_tmpl: stage_approved_tmpl,
reserved_tmpl: reserved_tmpl,
message_tmpl: message_tmpl,
work_in_process_tmpl: work_in_process_tmpl,
bntCompleteStage_tmpl: bntCompleteStage_tmpl,
btnSendReview_tmpl: btnSendReview_tmpl,
document_attach_file_tmpl: document_attach_file_tmpl,
note_tmpl: note_tmpl,
};
if (!templates[template_name]) throw new Error(`Template ${template_name} does not exist`);
return templates[template_name]
}
export {loadTemplate}

@ -0,0 +1,43 @@
function recalculateTabsCounter() {
// let tabs = [$('#count-tab-contact'), $('#count-tab-order'), $('#count-tab-team')]
let tabs = [$('#tab1'), $('#tab2'), $('#tab3')];
let total_messages_count = 0;
for (let tab of tabs){
let count_sum = Array.from((tab.find('.js-count').map((i, el)=>parseInt($(el).html())))).reduce((a, b) => a + b, 0);
let $tab_counter = $(`a[href="#${tab.attr('id')}"]`).find('.count-tab');
$tab_counter.html(count_sum);
total_messages_count += count_sum;
// console.log($tab_counter, 'new value -->', count_sum);
}
let $header_counter = $('.js-all-messages');
$header_counter.html(total_messages_count);
}
function countPlus(message, place) {
/**
* Увеличиваем счетчик соответствующий сообщению(message)
*/
// console.log("MESSAGE = ", message);
let $container;
if (message.answer_type == "add_message_contact"){
$container = $(`.contact-count-${message.sender_id}`);
} else if (message.answer_type == "add_message_order"){
$container = $(`#count-order-${message.order_id}`);
} else if (message.answer_type == "add_message_team") {
$container = $(`#count-team-${message.team_id}`);
}
// console.log("container = ", $container);
$container.html(parseInt($container.html()) + 1);
recalculateTabsCounter();
}
function onClickCardWithCount($card){
/**
* При нажатии на карточку со счетчиком новых сообщений
*/
// console.log('Обнулем счетчик ', $card);
$card.find('.js-count').html(0);
recalculateTabsCounter();
}
export {countPlus, onClickCardWithCount}

@ -0,0 +1,77 @@
import {loadTemplate} from './loaders'
var note_tmpl = loadTemplate('note_tmpl');
function bindContractorNotes() {
$('#add-note-contractor').on('click', function (e) {
e.preventDefault();
$.ajax({
url: '/api/note/',
type: 'POST',
beforeSend: function (xhr) {
xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'))
},
data: $("#add-form-contractor-note").serialize(),
dataType: 'json',
success: function (json) {
// console.log(json);
$("#add-form-contractor-note #chat2").val("");
let li = note_tmpl({text: json.text});
$(li).appendTo(".contractor-notes-block");
},
error: function (e) {
console.log('error');
console.log(e);
}
});
});
}
function bindOrderNotes() {
$('#add-note-button').on('click', function (e) {
e.preventDefault();
$.ajax({
url: '/api/note/',
type: 'POST',
beforeSend: function (xhr) {
xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'))
},
data: $("#add-form-order-note").serialize(),
dataType: 'json',
success: function (json) {
// $("<li>" + json.text + "</li>").appendTo(".order-notes-block");
let li = note_tmpl({text: json.text});
$(li).appendTo(".order-notes-block");
$("#add-form-order-note #chat2").val("");
},
error: function (e) {
console.log('error');
console.log(e);
}
});
});
}
function bindTeamNotes() {
$('#add-team-note-button').on('click', function (e) {
e.preventDefault();
$.ajax({
url: '/api/note/',
type: 'POST',
beforeSend: function (xhr) {
xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'))
},
data: $("#add-form-team-note").serialize(),
dataType: 'json',
success: function (json) {
$("<li>" + json.text + "</li>").appendTo(".team-notes-block");
$("#add-form-team-note #chat2").val("");
},
error: function (e) {
console.log('error');
console.log(e);
}
});
});
}
export {bindContractorNotes, bindOrderNotes, bindTeamNotes}

@ -0,0 +1,27 @@
import {getCookie} from '../utils'
function restoreTabFromHash() {
var currentHash = URI(location.href).hash();
if (currentHash.indexOf("#order") == 0) {
$("a[href='#tab2']").trigger('click');
// console.log("click on ", "#orderBlock" + currentHash.replace("#order", ""));
let obj_id = currentHash.replace("#order", "");
// console.log("obj_id = ", obj_id);
if (obj_id) {
$("#orderBlock" + currentHash.replace("#order", "")).trigger('click');
} else {
$('.order-block').first().trigger('click');
}
} else if (currentHash.indexOf("#user") == 0) {
$("a[href='#tab1']").trigger('click');
} else if (currentHash.indexOf("#teamorder") == 0 || currentHash.indexOf("#myteam") == 0) {
$("a[href='#tab3']").trigger('click');
} else {
$("a[href='#tab1']").trigger('click');
}
}
export {restoreTabFromHash}

@ -0,0 +1,8 @@
<!-- stage={} , text-->
<div style="margin-left: -27px; margin-right: -27px; text-align: center">
<a href="#"
class="chat-button icon-complete_stage js-btnComplete"
style="padding-left: 60px;"
data-stage-id="${this.stage.id}"> ${this.text} ${this.stage.pos}
</a>
</div>

@ -0,0 +1,6 @@
<div style="margin-left: -27px; margin-right: -27px; text-align: center" id="send-review">
<a href="#"
class="chat-button icon-check js-btnSendReview"
style="padding-left: 10px; padding-right: 10px">ЗАКРЫТЬ ПРОЕКТ И ОСТАВИТЬ ОТЗЫВ
</a>
</div>

@ -0,0 +1,12 @@
<!--href, text, document_id, -->
<li style="word-break: break-all;">
<a class="file-link" href="${this.href} ">${this.text}</a>
<div class="remove-document" data-id="${this.document_id}" style="right:-10px;"></div>
</li>
<!--
<li style="word-break: break-all;">
<a class="file-link" href="/chat/download/ v.file "> v.file </a>
<div class="remove-document" data-id=" v.id " style="right:-10px;"></div>
</li>
-->

@ -0,0 +1,7 @@
<!-- href, text -->
<div>
Приложенный файл. скачать: <br>
<a href="$(this.href)">
$(this.text)
</a>
</div>

@ -0,0 +1,7 @@
<!--className senderName message={...}-->
<div class="col-lg-12 insetCommChat ${this.className}">
<div class="topCommChat">
<p class="nameCommChat">${this.senderName}</p><span>${this.message.created}</span>
</div>
<p class="textCommChat">${this.message.text}</p>
</div>

@ -0,0 +1,6 @@
<div class="note-wrapper">
<li>
${this.text}
</li>
<div class="remove-note" data-id="${this.note_id}" style="right:-10px;"></div>
</div>

@ -0,0 +1,5 @@
<!--<li class="reserved"><span class="text">Сумма за этап 1.<br/> Зарезервирована</span></li> -->
<!--<li class="unreserved"><span class="text">Сумма за этап 2.<br/> Не зарезервирована</span></li> -->
<li class="${this.reserved_cls}"><span class="text">Сумма за этап ${this.stage.pos}
<br/>${this.reserved_name}</span>
</li>

@ -0,0 +1,29 @@
<!-- this {stage_num: '...', stage_status: '...', stage: {...} -->
<div class="numberStepp box-sizing">
<div class="review-type" style="width: 100%">
<div class="alignleft">
<span>ЭТАП ${this.stage_num}</span>
</div>
<div class="alignright">
<span class="stage-status"> ${this.stage_status}</span>
</div>
<div style="clear: both;"></div>
</div>
<div class="stage-data">
${this.stage.name}
</div>
Результат этапа
<div class="stage-data">
${this.stage.result}
</div>
Цена
<div class="stage-data">
${this.stage.cost} ₽
</div>
Срок
<div class="stage-data">
до ${this.stage.term}
</div>
</div>

@ -0,0 +1,29 @@
<!-- this {stage_num: '...', form_name: '...', orderId: '...', stage: {...} -->
<div class="numberStepp box-sizing">
<p>ЭТАП ${this.stage_num} </p>
<form class="${this.form_name} js-stage-form" data-stage-id="${(this.stage && this.stage.id) ? this.stage.id : ''}"
id="stage-form-${(this.stage && this.stage.id) ? this.stage.id : ''}">
<label>Название</label>
<input class="form-control" type="text" name="name"
value="${(this.stage && this.stage.name) ? this.stage.name : ''}">
<p class="error error-name"></p>
<label>Цена</label>
<input class="form-control" type="text" name="cost"
value="${(this.stage && this.stage.cost) ? this.stage.cost : ''}">
<p class="error error-cost"></p>
<input class="form-control" name="pos" type="hidden"
value="${(this.stage && this.stage.pos) ? this.stage.pos : this.stage_num}">
<p class="error error-pos"></p>
<input class="form-control orderStagesInput" type="hidden" name="order"
value="${this.orderId}">
<input class="form-control" type="hidden" name="status" value="send_approve">
<label>Срок</label>
<input class="term-picker form-control datepicker" type="text" name="term"
value="${(this.stage && this.stage.term) ? this.stage.term : ''}">
<p class="error error-term"></p>
<label>Результат</label>
<input class="form-control" type="text" name="result"
value="${(this.stage && this.stage.result) ? this.stage.result : ''}">
<p class="error error-result"></p>
</form>
</div>

@ -0,0 +1,10 @@
<!-- this {stage: {...}, note_text-->
<div style="margin: 10px 0">
В работе: ${this.stage.name} <br>
Результат этапа: ${this.stage.result} <br>
Срок сдачи: ${this.stage.term}<br>
<span class="select">${this.stage.cost}</span> р
<div class="note">
${this.note_text}
</div>
</div>

@ -0,0 +1,6 @@
function ws_print(...messages) {
let message = messages.join(' ');
console.log(`%c WS: ${message}`, 'background: white; color: blue');
}
export {ws_print}

@ -0,0 +1,114 @@
import {loadTemplate} from './loaders'
import {countPlus} from './messageCounters'
function getUserPlace() {
/**
* Определяем в какой закладке Чата пользователь
*/
let hash = location.hash;
let tab, id;
for (let str of ["user", "order", "myteam"]) {
if (hash.indexOf(`#${str}`) != -1) {
tab = str;
id = hash.replace(`#${str}`, '');
}
}
return {tab, id}
}
function checkMessageInPlace(message, place) {
/**
* Проверяем, направлено ли входящее сообщение на текущую вкладку пользователя
*/
// message.answer_type=place.tab
let eq = ['add_message_contact=user', 'add_message_order=order', 'add_message_team=myteam', 'approve_stages=order'];
// console.log([message.answer_type, place.tab].join('='));
// console.log(message.order_id, '==', place.id, message.order_id == place.id);
if ((eq.indexOf([message.answer_type, place.tab].join('=')) != -1) &&
((message.order_id == place.id) || (message.recipent_id == place.id) || (message.sender_id == place.id) || (message.team_id == place.id))) {
return true
}
return false
}
function connect() {
wsConnect.then(function (_socket) {
socket = _socket;
// Onmessage in Chat page
socket.addEventListener("message", function (event) {
var data = JSON.parse(event.data);
print.ws_print("new message on Chat page");
console.log(", message =", data);
let user_place = getUserPlace();
// console.log("User place ", place.tab, place.id);
if (checkMessageInPlace(data, user_place)) {
console.log("Сообщение принято открытым чатом");
let chat_container_selectors = {
"user": "#message-chat-space",
"order": "#message-chat-order-space",
"myteam": "#message-chat-team-space",
};
let documents_container_seletors = {
"user": "#documentSpace",
"order": "#documentOrderSpace",
"myteam": "#documentTeamSpace",
};
let $chat_container = $(chat_container_selectors[user_place.tab]);
let $documents_container = $(documents_container_seletors[user_place.tab]);
var classMessage = 'youChat';
var senderName = 'Вы';
if (data.sender_id != userId) {
senderName = data.sender_name;
classMessage = '';
}
if (data.is_system){
senderName = 'Системное';
classMessage = 'systemChat'
}
let chat_message = loadTemplate('message_tmpl')({
className: classMessage,
senderName: senderName,
message: {created: data.msg_time, text: data.msg}
});
$chat_container.append(chat_message);
$chat_container.scrollTop($chat_container.prop("scrollHeight"));
$documents_container.append(data.docs_attach);
if (data.answer_type == 'approve_stages') {
window.chatController.statesController.redraw();
}
} else {
console.log("Сообщение учтено счетчиком");
countPlus(data, user_place)
}
});
socket.addEventListener("close", function () {
console.error("Connection Lost");
connect();
});
socket.send_message = function (messageData) {
console.log('send message -->', messageData);
socket.send(JSON.stringify(messageData));
};
socket.send_stages_approve = function (messageData) {
// TODO: Пометить сообщения как "системные"
socket.send(JSON.stringify(messageData));
};
});
wsConnect.catch(function (reason) {
console.error("Server is not available", reason)
})
}
export {connect}

@ -0,0 +1,63 @@
import {ChatPageController} from './chat/ChatContractorPageController'
import {
bindOrders,
bindArbitrationSend,
bindOnTabs,
bindUserContacts,
bindGetUserMessages,
bindTeams,
bindDeleteContact
} from './chat/BINDS'
import {
uploadDocumentsContactInit,
uploadDocumentsOrderInit,
uploadDocumentsTeamInit,
bindRemoveDocuments
} from './chat/documents'
import {bindContractorNotes, bindOrderNotes, bindTeamNotes} from './chat/notes'
import {restoreTabFromHash} from './chat/parts'
import {bindArchiveProjects} from './chat/archiveProjects'
import {chatContactsInit, chatOrdersInit, chatTeamsInit} from './chat/chats'
import {connect} from './chat/wsChatConnect'
window.connect = connect;
window.socket = undefined;
$(function () {
bindArbitrationSend();
window.onhashchange = function (e) {
$('a[data-toggle="tab"][href="#' + location.hash.slice(1) + '"]').trigger("click");
};
window.chatController = new ChatPageController();
bindOrders();
bindTeams();
bindOnTabs();
bindUserContacts();
bindGetUserMessages();
bindArchiveProjects();
bindDeleteContact();
// Chats
chatContactsInit();
chatOrdersInit();
chatTeamsInit();
//Documents
uploadDocumentsContactInit();
uploadDocumentsOrderInit();
uploadDocumentsTeamInit();
bindRemoveDocuments();
//Notes
bindContractorNotes();
bindOrderNotes();
bindTeamNotes();
//restore
restoreTabFromHash();
});

@ -0,0 +1,47 @@
import {ChatPageController} from './chat/ChatCustomerPageController'
import {
bindOrders,
bindArbitrationSend,
bindOnTabs,
bindUserContacts,
bindGetUserMessages,
bindDeleteContact
} from './chat/BINDS'
import {restoreTabFromHash} from './chat/parts'
import {chatContactsInit, chatOrdersInit} from './chat/chats'
import {connect} from './chat/wsChatConnect'
import {bindArchiveProjects} from './chat/archiveProjects'
window.connect = connect;
window.socket = undefined;
$(function () {
$('body').on('focus', ".term-picker", function () {
$(this).datepicker({
minDate: 0,
});
});
bindArbitrationSend();
window.onhashchange = function (e) {
// console.log("Change Hash!!! ", 'a[data-toggle="tab"][href="#' + location.hash.slice(1) + '"]');
$('a[data-toggle="tab"][href="#' + location.hash.slice(1) + '"]').trigger("click");
};
window.chatController = new ChatPageController();
bindOrders();
bindOnTabs();
restoreTabFromHash();
bindUserContacts();
bindGetUserMessages();
bindArchiveProjects();
bindDeleteContact();
//Chats
chatContactsInit();
chatOrdersInit();
});

@ -0,0 +1,5 @@
import {ws_print} from './chat/utils_debug'
// DEBUG
window.print = {};
window.print.ws_print = ws_print;

@ -115,8 +115,10 @@ $(function () {
}else{ }else{
//Если перешли со страницы профиля по кнопке "Добавить заказ" //Если перешли со страницы профиля по кнопке "Добавить заказ"
let id = window.location.hash.replace("#", ""); let id = window.location.hash.replace("#", "");
if (id) sb_realty_top.setElementById(id); if (id) {
select_realty.add(id); sb_realty_top.setElementById(id);
select_realty.add(id);
}
} }
}); });
select_realty.on("add", (args)=> { select_realty.on("add", (args)=> {

@ -5,12 +5,6 @@ function readMoreInit() {
$target.siblings(".complete").toggle(); $target.siblings(".complete").toggle();
$target.toggleClass("less"); $target.toggleClass("less");
}); });
// $(".more").toggle(function () {
// $(this).text("less..").siblings(".complete").show();
// }, function () {
// $(this).text("more..").siblings(".complete").hide();
// });
} }
export {readMoreInit} export {readMoreInit}

@ -40,9 +40,9 @@ var SocketHandler = function () {
var intervalId; var intervalId;
sock.onopen = function () { sock.onopen = function () {
console.log("Start connect"); console.log("Start connect");
intervalId = setInterval(function () { // intervalId = setInterval(function () {
sock.send('{"dummy": 1}'); // sock.send('{"dummy": 1}');
}, 15000); // }, 15000);
}; };
sock.onmessage = function (event) { sock.onmessage = function (event) {
@ -140,68 +140,68 @@ $(function () {
} }
var currentHash = URI(location.href).hash(); var currentHash = URI(location.href).hash();
$('a[data-toggle="tab"]').on('show.bs.tab', function (e) { // $('a[data-toggle="tab"]').on('show.bs.tab', function (e) {
console.log("TAB!"); // console.log("TAB!");
var activeTab = $(this).attr('href').substring(1); // var activeTab = $(this).attr('href').substring(1);
var liveHash = URI(location.href).hash(); // var liveHash = URI(location.href).hash();
//
switch (activeTab) { // switch (activeTab) {
case 'tab1': // case 'tab1':
setTimeout(function () { // setTimeout(function () {
if (liveHash.indexOf("#user") == 0) { // if (liveHash.indexOf("#user") == 0) {
var userHashId = liveHash.replace("#user", ""); // var userHashId = liveHash.replace("#user", "");
$("#userBlock" + userHashId).trigger('click'); // $("#userBlock" + userHashId).trigger('click');
} else { // } else {
$(".user-block").first().trigger('click'); // $(".user-block").first().trigger('click');
} // }
}, 100); // }, 100);
break; // break;
//
case 'tab2': // case 'tab2':
console.log("tab2"); // console.log("tab2");
updateCounts(); // updateCounts();
setTimeout(function () { // setTimeout(function () {
if (liveHash.indexOf("#order") == 0) { // if (liveHash.indexOf("#order") == 0) {
var ordHashId = liveHash.replace("#order", ""); // var ordHashId = liveHash.replace("#order", "");
$("#orderBlock" + ordHashId).trigger('click'); // $("#orderBlock" + ordHashId).trigger('click');
} else { // } else {
$(".order-block").first().trigger('click'); // $(".order-block").first().trigger('click');
} // }
}, 100); // }, 100);
break; // break;
//
case 'tab3': // case 'tab3':
setTimeout(function () { // setTimeout(function () {
if (liveHash.indexOf("#teamorder") == 0) { // if (liveHash.indexOf("#teamorder") == 0) {
var teamHashId = liveHash.replace("#teamorder", ""); // var teamHashId = liveHash.replace("#teamorder", "");
$("#teamOrderBlock" + teamHashId).trigger('click'); // $("#teamOrderBlock" + teamHashId).trigger('click');
} else if (liveHash.indexOf("#myteam") == 0) { // } else if (liveHash.indexOf("#myteam") == 0) {
var teamHashId = liveHash.replace("#myteam", ""); // var teamHashId = liveHash.replace("#myteam", "");
$("#teamMyBlock" + teamHashId).trigger('click'); // $("#teamMyBlock" + teamHashId).trigger('click');
} else { // } else {
var firstTeamBlock = $(".team-block").first(); // var firstTeamBlock = $(".team-block").first();
var firstTeamOrder = $(".team-order-block").first(); // var firstTeamOrder = $(".team-order-block").first();
if (firstTeamOrder.length == 1) { // if (firstTeamOrder.length == 1) {
firstTeamOrder.trigger('click'); // firstTeamOrder.trigger('click');
} else if (firstTeamBlock.length == 1) { // } else if (firstTeamBlock.length == 1) {
firstTeamBlock.trigger('click'); // firstTeamBlock.trigger('click');
} // }
} // }
}, 100); // }, 100);
//
} // }
//
}); // });
if (currentHash.indexOf("#order") == 0) { // if (currentHash.indexOf("#order") == 0) {
$("a[href='#tab2']").trigger('click'); // $("a[href='#tab2']").trigger('click');
} else if (currentHash.indexOf("#user") == 0) { // } else if (currentHash.indexOf("#user") == 0) {
$("a[href='#tab1']").trigger('click'); // $("a[href='#tab1']").trigger('click');
} else if (currentHash.indexOf("#teamorder") == 0 || currentHash.indexOf("#myteam") == 0) { // } else if (currentHash.indexOf("#teamorder") == 0 || currentHash.indexOf("#myteam") == 0) {
$("a[href='#tab3']").trigger('click'); // $("a[href='#tab3']").trigger('click');
} else { // } else {
$("a[href='#tab1']").trigger('click'); // $("a[href='#tab1']").trigger('click');
} // }
// Информация о заказе // Информация о заказе
$(".messageBlock").on('click','.full-order-info', function (e) { $(".messageBlock").on('click','.full-order-info', function (e) {
@ -276,6 +276,7 @@ $(function () {
}); });
}); });
// "Оплата с сайта" (copy)
$("#paymentfromSite").on('click', function () { $("#paymentfromSite").on('click', function () {
var sum = $("#stageSumPay").val(); var sum = $("#stageSumPay").val();
var stages = $("#stagesIds").val(); var stages = $("#stagesIds").val();
@ -315,7 +316,7 @@ $(function () {
}) })
}); });
//Удаление документа //Удаление документа(copy)
$('.tab-content').on('click', '.remove-document', function (e) { $('.tab-content').on('click', '.remove-document', function (e) {
e.preventDefault(); e.preventDefault();
var dataId = $(this).attr('data-id'); var dataId = $(this).attr('data-id');
@ -338,7 +339,7 @@ $(function () {
}); });
}); });
// Вытащить сообщения для конактов // Вытащить сообщения для конактов(copy)
$('.user-block').on('click', function () { $('.user-block').on('click', function () {
var newCount = parseInt($("#count-tab-contact").text()); var newCount = parseInt($("#count-tab-contact").text());
var contactId = $(this).attr('data-id'); var contactId = $(this).attr('data-id');
@ -437,6 +438,7 @@ $(function () {
}); });
// Удалить контакт из "Личные" (copy)
$('.deleteMess').on('click', function (e) { $('.deleteMess').on('click', function (e) {
e.preventDefault(); e.preventDefault();
e.stopPropagation(); e.stopPropagation();
@ -512,6 +514,7 @@ $(function () {
}); });
// Добавление заметок Исполнителем (copy)
$('#add-note-contractor').on('click', function (e) { $('#add-note-contractor').on('click', function (e) {
e.preventDefault(); e.preventDefault();
$.ajax({ $.ajax({
@ -534,7 +537,7 @@ $(function () {
}); });
}); });
//Добавить заметку. //Добавить заметку Заказ (copy)
$('#add-note-button').on('click', function (e) { $('#add-note-button').on('click', function (e) {
e.preventDefault(); e.preventDefault();
$.ajax({ $.ajax({
@ -556,7 +559,7 @@ $(function () {
}); });
}); });
//Добавить заметку. //Добавить заметку Группа (copy)
$('#add-team-note-button').on('click', function (e) { $('#add-team-note-button').on('click', function (e) {
e.preventDefault(); e.preventDefault();
$.ajax({ $.ajax({
@ -578,7 +581,7 @@ $(function () {
}); });
}); });
// Добавление сообщения для заказа. // Добавление сообщения для заказа(copy)
$('#order-chat-add-message').on('click', function (e) { $('#order-chat-add-message').on('click', function (e) {
e.preventDefault(); e.preventDefault();
var chatMessage = $("#chat-order-add #chat").val(); var chatMessage = $("#chat-order-add #chat").val();
@ -620,7 +623,7 @@ $(function () {
}); });
// Добавление сообщения для контакта // Добавление сообщения для контакта(copy)
$('#contact-chat-add-message').on('click', function (e) { $('#contact-chat-add-message').on('click', function (e) {
e.preventDefault(); e.preventDefault();
var chatMessage = $("#chat").val(); var chatMessage = $("#chat").val();
@ -664,7 +667,7 @@ $(function () {
}); });
// Добавление сообщения в арбитраж // Добавление сообщения в арбитраж (copy)
$('#order-arbitration-add').on('click', function (e) { $('#order-arbitration-add').on('click', function (e) {
e.preventDefault(); e.preventDefault();
e.stopPropagation(); e.stopPropagation();
@ -691,6 +694,7 @@ $(function () {
}); });
}); });
//Загрузка документов Order(copy)
$("#upload-document-order").bind('fileuploadsubmit', function (e, data) { $("#upload-document-order").bind('fileuploadsubmit', function (e, data) {
data.formData = { data.formData = {
sender: $("#chat-order-add #senderId").val(), sender: $("#chat-order-add #senderId").val(),
@ -700,7 +704,7 @@ $(function () {
console.log(data.formData); console.log(data.formData);
}); });
//Загрузка документов // + Загрузка документов Order(copy)
$('#upload-document-order').fileupload({ $('#upload-document-order').fileupload({
url: '/chat/create/', url: '/chat/create/',
crossDomain: false, crossDomain: false,
@ -734,6 +738,7 @@ $(function () {
}).prop('disabled', !$.support.fileInput) }).prop('disabled', !$.support.fileInput)
.parent().addClass($.support.fileInput ? undefined : 'disabled'); //Загрузка документов .parent().addClass($.support.fileInput ? undefined : 'disabled'); //Загрузка документов
// + Загрузка документов Contact(copy)
$("#upload-document-contact").bind('fileuploadsubmit', function (e, data) { $("#upload-document-contact").bind('fileuploadsubmit', function (e, data) {
data.formData = { data.formData = {
sender: $("#contact-chat-form #senderContactId").val(), sender: $("#contact-chat-form #senderContactId").val(),
@ -742,6 +747,7 @@ $(function () {
}); });
//Загрузка документов Contact(copy!)
$('#upload-document-contact').fileupload({ $('#upload-document-contact').fileupload({
url: '/chat/create/', url: '/chat/create/',
crossDomain: false, crossDomain: false,
@ -783,7 +789,7 @@ $(function () {
$("#text-new").val(""); $("#text-new").val("");
}); });
// Добавление отзыва // Добавление отзыва(complete)
$('#order-review-add').on('click', function (e) { $('#order-review-add').on('click', function (e) {
e.preventDefault(); e.preventDefault();
e.stopPropagation(); e.stopPropagation();
@ -820,7 +826,7 @@ $(function () {
}); });
}); });
// Нажимаем на кнопку архивные сообщения // Нажимаем на кнопку архивные сообщения(complete)
$("#trashed-button").on('click',function(e){ $("#trashed-button").on('click',function(e){
e.preventDefault(); e.preventDefault();
var state = $(this).attr('data-show'); var state = $(this).attr('data-show');
@ -833,31 +839,6 @@ $(function () {
$("#archive-space").show(); $("#archive-space").show();
$("#show-archive-label").show(); $("#show-archive-label").show();
//$.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 { }else {
$(this).attr('data-show','true'); $(this).attr('data-show','true');
$(this).text("Показать архивные заказы"); $(this).text("Показать архивные заказы");
@ -868,7 +849,7 @@ $(function () {
}); });
// Нажимаем на заказ в архмвных заказах // Нажимаем на заказ в архмвных заказах(complete)
$(".messageBlock").on('click','.trashedOrderBlock',function(){ $(".messageBlock").on('click','.trashedOrderBlock',function(){
$("#chat-order-add").css("display", "none"); $("#chat-order-add").css("display", "none");
$('.order-block, .trashedOrderBlock').each(function () { $('.order-block, .trashedOrderBlock').each(function () {

@ -1,3 +1,51 @@
/***TEMPLATES***/
var wrapper_btn_tmpl = (btn_tmpl) =>
`
<div id='btn_wrapper'>${btn_tmpl}</div>
`;
var btn_tmpl_approve = (args = {}) =>
`
<div style="margin-left: -13px; margin-right: -13px; text-align: center">
<a href="#" data-sender-id="${args.senderId}"
class="chat-button icon-hand"
style="padding-left: 70px"
data-recipent-id="${args.recipentId}" data-order-id="${args.orderId}"
id="approve-stages">Согласовать</a>
</div>
`;
var btn_tmpl_change = (args = {}) =>
`
<div style="margin-left: -13px; margin-right: -13px; text-align: center">
<a href="#" data-sender-id="${args.senderId}"
class="chat-button icon-change"
style="padding: 25px 5px"
data-recipent-id="${args.recipentId}" data-order-id="${args.orderId}"
id="cancel-stages">Отправить на внесение изменений</a>
</div>
`;
var btn_tmpl_refuse = (args = {}) =>
`
<div style="margin-left: -13px; margin-right: -13px; text-align: center">
<a href="#" data-sender-id="${args.senderId}"
style="padding-left: 40px"
class="chat-button icon-books"
data-recipent-id="${args.recipentId}" data-order-id="${args.orderId}"
id="refuse-stages">Отказаться от заказа</a>
</div>
`;
function replaceButtons($container, buttons_html = []) {
console.log("replace Buttons");
$container.html("");
for (var button_html of buttons_html) {
$container.append(button_html);
}
}
$(function () { $(function () {
function dialog(message, yesCallback, notCallback) { function dialog(message, yesCallback, notCallback) {
@ -19,6 +67,7 @@ $(function () {
var url = '/chat/create/'; var url = '/chat/create/';
// + Загрузка документов Team (complete)
$("#upload-document-team").bind('fileuploadsubmit', function (e, data) { $("#upload-document-team").bind('fileuploadsubmit', function (e, data) {
data.formData = { data.formData = {
sender: $("#team-chat-form #senderTeamId").val(), sender: $("#team-chat-form #senderTeamId").val(),
@ -29,7 +78,7 @@ $(function () {
console.log(data.formData); console.log(data.formData);
}); });
//Загрузка документов //Загрузка документов Team (complete)
$('#upload-document-team').fileupload({ $('#upload-document-team').fileupload({
url: url, url: url,
crossDomain: false, crossDomain: false,
@ -49,7 +98,7 @@ $(function () {
currentValue += file.id + ';'; currentValue += file.id + ';';
$("#documentSendIds").val(currentValue); $("#documentSendIds").val(currentValue);
var htmlImg = '<div style="float: left"><a href="/chat/download/' + file.name + '" class="send-doc" data-id="' + file.id + '">' + file.name + '</a>' + var htmlImg = '<div style="float: left"><a href="/chat/download/' + file.name + '" class="send-doc" data-id="' + file.id + '">' + file.name + '</a>' +
'<div class="remove-document" data-id="'+ file.id+'" style="right:-10px;float:left;position: static;"></div></div>'; '<div class="remove-document" data-id="' + file.id + '" style="right:-10px;float:left;position: static;"></div></div>';
var document_send = $(htmlImg).appendTo("#document-send"); var document_send = $(htmlImg).appendTo("#document-send");
}); });
}, },
@ -66,17 +115,17 @@ $(function () {
}).prop('disabled', !$.support.fileInput) }).prop('disabled', !$.support.fileInput)
.parent().addClass($.support.fileInput ? undefined : 'disabled'); .parent().addClass($.support.fileInput ? undefined : 'disabled');
// Согласование этапов // "Согласовать" (complete)
$("#order-stages").on('click', "#approve-stages", function (e) { $("#order-stages").on('click', "#approve-stages", function (e) {
e.preventDefault(); e.preventDefault();
var orderId = $(this).attr('data-order-id'); var orderId = $(this).data('order-id');
var senderId = $(this).attr('data-sender-id'); var senderId = $(this).data('sender-id');
var recipentId = $(this).attr('data-recipent-id'); var recipentId = $(this).data('recipent-id');
var caption = "Вы действительно хотите согласовать этапы?"; var caption = "Вы действительно хотите согласовать этапы?";
confirm(caption, function () { confirm(caption, function () {
$(".stage-block-approve").each(function () { $(".stage-block-approve").each(function () {
var stageId = $(this).attr('data-id'); var stageId = $(this).data('id');
$.ajax({ $.ajax({
//async: false, //async: false,
url: '/api/stages/' + stageId + '/', url: '/api/stages/' + stageId + '/',
@ -124,16 +173,17 @@ $(function () {
}); });
// Отказаться от этапов // "Отправить на внесение изменений" (complete)
$("#order-stages").on('click', "#cancel-stages", function (e) { $("#order-stages").on('click', "#cancel-stages", function (e) {
console.log("Отправить на внесение изменений");
e.preventDefault(); e.preventDefault();
var senderId = $(this).attr('data-sender-id'); var senderId = $(this).attr('data-sender-id');
var recipentId = $(this).attr('data-recipent-id'); var recipentId = $(this).attr('data-recipent-id');
var orderId = $(this).attr('data-order-id'); var orderId = $(this).attr('data-order-id');
var caption = "Вы действительно хотите отказаться от этапов?"; var caption = "Вы действительно хотите отказаться от этапов?";
confirm(caption,function() { confirm(caption, function () {
$(".stage-block-approve").each(function () { $(".stage-block-approve").each(function () {
var stageId = $(this).attr('data-id'); var stageId = $(this).data('id');
$.ajax({ $.ajax({
url: '/api/stages/' + stageId + '/', url: '/api/stages/' + stageId + '/',
type: 'PATCH', type: 'PATCH',
@ -165,7 +215,7 @@ $(function () {
"msg": "Исполнитель отказался от текущих этапов " + orderId, "msg": "Исполнитель отказался от текущих этапов " + orderId,
} }
}); });
}.bind(),caption); }.bind(), caption);
}); });
@ -271,6 +321,7 @@ $(function () {
}); });
// Отображаем сообщения "Группы"(copy)
$('.team-block').on('click', function () { $('.team-block').on('click', function () {
$('.team-order-block, .team-block').each(function () { $('.team-order-block, .team-block').each(function () {
@ -365,17 +416,19 @@ $(function () {
}); });
// Вытащить сообщения для чата заказа // Заполняем страницу Заказа(complete)
$('.order-block').on('click', function () { $('.order-block').on('click', function () {
console.log("Заполняем страницу Заказа");
$('.order-block').each(function () { $('.order-block').each(function () {
$(this).removeClass('orAct'); $(this).removeClass('orAct');
}); });
$(this).addClass('orAct'); $(this).addClass('orAct');
var orderId = $(this).attr('data-id'); var orderId = $(this).data('id');
location.hash = '#order' + orderId; location.hash = '#order' + orderId;
var recipentId = $(this).attr('data-recipent-id'); var senderId = '';
var projectId = $(this).attr('data-project-id'); var recipentId = $(this).data('recipent-id');
var teamCurrentId = parseInt($(this).attr('data-team-id')); var projectId = $(this).data('project-id');
var teamCurrentId = parseInt($(this).data('team-id'));
var newCount = parseInt($("#count-tab-order").text()); var newCount = parseInt($("#count-tab-order").text());
var currNewCount = parseInt($(".order-count-" + orderId).text()); var currNewCount = parseInt($(".order-count-" + orderId).text());
@ -383,11 +436,11 @@ $(function () {
$("#count-tab-order").text(resCount); $("#count-tab-order").text(resCount);
$(".order-count-" + orderId).text(0); $(".order-count-" + orderId).text(0);
if (teamCurrentId>0){ if (teamCurrentId > 0) {
$("#fromTeamId").val(teamCurrentId); $("#fromTeamId").val(teamCurrentId);
$("#fromContractorId").val(""); $("#fromContractorId").val("");
}else { } else {
$("#fromTeamId").val("") $("#fromTeamId").val("");
$("#fromContractorId").val(userId); $("#fromContractorId").val(userId);
} }
@ -537,12 +590,36 @@ $(function () {
if (statusNotAgreed) { if (statusNotAgreed) {
htmlInbox += '<div class="textAreaBlock2 FFD box-sizing disTab btns-approve-stages">' + // htmlInbox += wrapper_btn_tmpl(
'<a id="approve-stages" data-sender-id="' + userId + '" data-recipent-id="' + recipentId + '"' + // btn_tmpl_approve() + btn_tmpl_change() + btn_tmpl_refuse()
' data-order-id="' + orderId + '" href="#">согласовать</a>' + // );
'<a id="cancel-stages" data-sender-id="' + userId + '" data-recipent-id="' + recipentId + '"' + if (stagesResults[0] && stagesResults[0].status == 'send_approve') {
' data-order-id="' + orderId + '" href="#">отказаться</a>' + htmlInbox +=
'</div>'; wrapper_btn_tmpl(btn_tmpl_approve({
senderId: senderId,
recipentId: recipentId,
orderId: orderId
})
+ btn_tmpl_change({
senderId: senderId,
recipentId: recipentId,
orderId: orderId
})
+ btn_tmpl_refuse({
senderId: senderId,
recipentId: recipentId,
orderId: orderId
})
);
} else {
htmlInbox += wrapper_btn_tmpl(btn_tmpl_refuse({
senderId: senderId,
recipentId: recipentId,
orderId: orderId
})
);
}
} }
} }
@ -582,7 +659,7 @@ $(function () {
} else { } else {
$("#leaveReview").hide(); $("#leaveReview").hide();
} }
}else{ } else {
$("#leaveReview").hide(); $("#leaveReview").hide();
} }
}); });
@ -590,6 +667,7 @@ $(function () {
}); });
// Закрыть этап (complete)
$('#tab2').on('click', '.closeStage', function (e) { $('#tab2').on('click', '.closeStage', function (e) {
e.preventDefault(); e.preventDefault();
var stageId = $(this).attr('data-stage-id'); var stageId = $(this).attr('data-stage-id');
@ -623,7 +701,7 @@ $(function () {
}); });
}); });
//Добавить сообщение для исполнителей в группе //Добавить сообщение для исполнителей в группе(copy)
$("#add-team-chat-message").on('click', function (e) { $("#add-team-chat-message").on('click', function (e) {
e.preventDefault(); e.preventDefault();
var chatMessage = $("#team-chat-form #chatText").val(); var chatMessage = $("#team-chat-form #chatText").val();

@ -209,6 +209,7 @@ $(function () {
htmlInbox = htmlInboxStage + htmlInbox; htmlInbox = htmlInboxStage + htmlInbox;
$("#order-stages").html(htmlInbox); $("#order-stages").html(htmlInbox);
$("#completeWork").hide(); $("#completeWork").hide();
$("#completeWork").hide();
if (stagesInWork.length > 0) { if (stagesInWork.length > 0) {
$("#completeWork").show(); $("#completeWork").show();
@ -280,7 +281,7 @@ $(function () {
}); });
}); });
// Добавление этапов // Добавление этапов(complete)
$("#order-stages").on('click', "#addStagesForm", function (e) { $("#order-stages").on('click', "#addStagesForm", function (e) {
e.preventDefault(); e.preventDefault();
var currentOrderId = $(this).attr('data-order-id'); var currentOrderId = $(this).attr('data-order-id');
@ -391,7 +392,7 @@ $(function () {
}); });
//Изменение счетчика //Изменение счетчика(complete)
$('#order-stages-tab').on('change', '#countStage', function () { $('#order-stages-tab').on('change', '#countStage', function () {
var countStage = parseInt($(this).val()); var countStage = parseInt($(this).val());
var currentCountStage = $("#order-stages .numberStepp").length; var currentCountStage = $("#order-stages .numberStepp").length;
@ -431,7 +432,7 @@ $(function () {
}); });
// Для заказов все вытащить // Для заказов все вытащить(complete)
$('.order-block').on('click', function () { $('.order-block').on('click', function () {
var newCount = parseInt($("#count-tab-order").text()); var newCount = parseInt($("#count-tab-order").text());
$("#chat-order-add").css("display", "block"); $("#chat-order-add").css("display", "block");

@ -22,8 +22,10 @@ class ChatHandler(websocket.WebSocketHandler):
waiters = set() waiters = set()
def open(self, *args, **kwargs): def open(self, *args, **kwargs):
print("open")
self.user_id = kwargs.get('user_id', 1) self.user_id = kwargs.get('user_id', 1)
self.waiters.add((self.user_id, self)) self.waiters.add((self.user_id, self))
print("num connection = ", len(self.waiters))
# @gen.coroutine # @gen.coroutine
def on_message(self, message): def on_message(self, message):
@ -63,6 +65,7 @@ class ChatHandler(websocket.WebSocketHandler):
team_ids_raw = message_data['data'].get('team_ids', None) team_ids_raw = message_data['data'].get('team_ids', None)
message = message_data['data'].get('chat_message', None) message = message_data['data'].get('chat_message', None)
docs_send_links = message_data['data'].get('document_send_links', None) docs_send_links = message_data['data'].get('document_send_links', None)
is_system = message_data['data'].get('is_system', False)
if 'document_data' in message_data['data']: if 'document_data' in message_data['data']:
docs_links = message_data['data']['document_data'].get('document_links', ""); docs_links = message_data['data']['document_data'].get('document_links', "");
docs_attach = message_data['data']['document_data'].get('document_attach_files', "") docs_attach = message_data['data']['document_data'].get('document_attach_files', "")
@ -88,16 +91,17 @@ class ChatHandler(websocket.WebSocketHandler):
order_value = "NULL" if order_id is None or not order_id else order_id order_value = "NULL" if order_id is None or not order_id else order_id
insert_sql = "INSERT INTO chat_message (id,text,created, sender_id,recipent_id," \ insert_sql = "INSERT INTO chat_message (id,text,created, sender_id,recipent_id," \
" private_type,team_id, order_id,is_delete,is_new) " \ " private_type,team_id, order_id,is_delete,is_new,is_system) " \
"VALUES (DEFAULT,'{0}',NOW(),{1},{2},{3},{4},{5},{6},{7}) RETURNING id". \ "VALUES (DEFAULT,'{0}',NOW(),{1},{2},{3},{4},{5},{6},{7},{8}) RETURNING id". \
format(message, sender_id, recipent_id, private_type, team_value, order_value, is_delete, is_new) format(message, sender_id, recipent_id, private_type, team_value, order_value, is_delete, is_new, is_system)
cursor_list = yield dict(cursor=self.db.execute(insert_sql)) cursor_list = yield dict(cursor=self.db.execute(insert_sql))
cursor = cursor_list.get('cursor') cursor = cursor_list.get('cursor')
result = cursor.fetchone() result = cursor.fetchone()
message_id = result[0] message_id = result[0]
team_ids = []
if team_ids_raw: if team_ids_raw:
team_ids = [t for t in team_ids_raw.rstrip(';').split(';')] team_ids = [int(t) for t in team_ids_raw.rstrip(';').split(';')]
values_str = ''; values_str = '';
for t in team_ids: for t in team_ids:
values_str += '(DEFAULT,{0},{1}),'.format(message_id, t) values_str += '(DEFAULT,{0},{1}),'.format(message_id, t)
@ -128,21 +132,31 @@ class ChatHandler(websocket.WebSocketHandler):
if docs_links: if docs_links:
message += '<br><br>' + docs_links message += '<br><br>' + docs_links
if message_type: # if message_type:
waiters = tuple(w for c, w in self.waiters if c == recipent_id) # waiters = tuple(w for c, w in self.waiters if c == recipent_id)
else: # else:
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: # if answer_type == 'add_message_contact': order_id = recipent_id
waiter.write_message({'msg': message, # if answer_type == 'add_message_team': order_id = team_id
'msg_time': msg_time,
'order_id': order_id, for user_id, waiter in self.waiters:
'recipent_id': recipent_id, # print(recipent_id, '==', waiter.user_id)
'sender_id': sender_id, # print(sender_id, '==', waiter.user_id)
'sender_name': sender_name, # print('types -->', type(recipent_id), type(sender_id), type(user_id))
'answer_type': answer_type, if int(recipent_id) == int(user_id) or int(sender_id) == int(user_id) or int(user_id) in team_ids:
'docs_attach': docs_attach, # print("waiter.user_id = ", waiter.user_id)
}) waiter.write_message({'msg': message,
'msg_time': msg_time,
'order_id': order_id,
'team_id': team_id,
'recipent_id': recipent_id,
'sender_id': sender_id,
'sender_name': sender_name,
'answer_type': answer_type,
'is_system': is_system,
'docs_attach': docs_attach,
})
def check_origin(self, origin): def check_origin(self, origin):
return True return True

@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.7 on 2017-01-31 13:09
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('chat', '0014_newmessage'),
]
operations = [
migrations.AddField(
model_name='message',
name='is_system',
field=models.BooleanField(default=False),
),
]

@ -10,11 +10,14 @@ class Message(models.Model):
created = models.DateTimeField(default=timezone.now) created = models.DateTimeField(default=timezone.now)
order = models.ForeignKey(Order, related_name='messages', null=True, blank=True) order = models.ForeignKey(Order, related_name='messages', null=True, blank=True)
sender = models.ForeignKey(User, related_name='sender_messages') sender = models.ForeignKey(User, related_name='sender_messages')
# TODO: recipent --> recipient
recipent = models.ForeignKey(User, related_name='recipent_messages') recipent = models.ForeignKey(User, related_name='recipent_messages')
private_type = models.BooleanField(default=False) private_type = models.BooleanField(default=False)
team = models.ForeignKey(Team, related_name='messages', null=True, blank=True) team = models.ForeignKey(Team, related_name='messages', null=True, blank=True)
is_delete = models.BooleanField(default=False) is_delete = models.BooleanField(default=False)
is_new = models.BooleanField(default=True) is_new = models.BooleanField(default=True)
# Системное
is_system = models.BooleanField(default=False)
def __str__(self): def __str__(self):
return self.text return self.text

@ -56,6 +56,7 @@ class MessageSerializer(ModelSerializer):
'private_type', 'private_type',
'team', 'team',
'documents', 'documents',
'is_system'
) )
def get_text(self, obj): def get_text(self, obj):

@ -0,0 +1,325 @@
@import "base/variavles"
@import "modules/mods"
@import "base/colors"
%icons
margin-left: 0px
display: inline-flex
align-items: center
&:before
content: ''
display: inline-block
width: 20px
height: 20px
background-size: cover
position: relative
left: -5px
.contractor-notes-block, .team-notes-block, .order-notes-block
text-align: left
padding-left: 45px
font-family: Arial, Verdana, Helvetica, sans-serif
ol
li
display: list-item
list-style: decimal inside
white-space: nowrap
overflow: hidden
text-overflow: ellipsis
max-width: 180px
.note-wrapper
position: relative
.modal-header
text-align: center
// Системное сообщение
.systemChat
background-color: #ffe9ed
.review-type
.alignleft
float: left
//width: 33%
text-align: left
.aligncenter
float: left
//width: 33%
text-align: center
.alignright
float: right
//width: 33%
text-align: right
.chat-button
transition: all 0.3s
width: 100%
background-color: #f1f1f1
text-transform: uppercase
color: #373737
//display: inline-block
font-family: "pfdintextcomppro-regular", sans-serif
font-size: 18px
letter-spacing: 1px
margin-bottom: 5px
&:visited, &:link
color: #373737
&:hover
box-shadow: 0 0 15px rgba(0, 0, 0, 0.8)
transform: scale(1.04)
//color: #7e7e7e
padding: 25px 30px
&.icon-hand
@extend %icons
&:before
width: 25px
height: 25px
background:
image: url("#{$static}/img/icons/icon_hands_gray.png")
size: 24px 24px
repeat: no-repeat
&.icon-books
@extend %icons
&:before
width: 30px
height: 25px
background:
image: url("#{$static}/img/icons/icon_books.png")
size: 30px 25px
repeat: no-repeat
&.icon-print
@extend %icons
&:before
width: 30px
height: 25px
background:
image: url("#{$static}/img/icons/icon_print.png")
size: 30px 25px
repeat: no-repeat
&.icon-change
@extend %icons
&:before
width: 20px
height: 24px
background:
image: url("#{$static}/img/icons/icon_edit.png")
size: 20px 24px
repeat: no-repeat
&.icon-credit_card
@extend %icons
&:before
width: 25px
height: 28px
background:
image: url("#{$static}/img/icons/icon_credit_card_gray.png")
size: 25px 28px
repeat: no-repeat
&.icon-arbitration
@extend %icons
&:before
width: 25px
height: 28px
background:
image: url("#{$static}/img/icons/icon_arbitration.png")
size: 25px 28px
repeat: no-repeat
&.icon-complete_stage
@extend %icons
&:before
width: 25px
height: 28px
background:
image: url("#{$static}/img/icons/icon_complete_stage.png")
size: 25px 28px
repeat: no-repeat
&.icon-check
@extend %icons
&:before
width: 25px
height: 25px
background:
image: url("#{$static}/img/icons/icon_check.png")
size: 25px 25px
repeat: no-repeat
a.btn.btn-send
transition: all 0.3s
padding: 5px 25px !important
background-color: white
border: 1px solid #BEBEBE
border-radius: 40px
&:hover
transform: scale(1.04)
box-shadow: 0 0 15px rgba(0, 0, 0, 0.2)
&.icon-send
@extend %icons
&:before
width: 25px
height: 25px
background:
image: url("#{$static}/img/icons/icon_arrow_gray.png")
size: 24px 24px
repeat: no-repeat
.icon-protect
display: inline-block
@extend %icons
&:before
width: 18px
height: 20px
left: 0
background:
image: url("#{$static}/img/icons/icon_protect.png")
size: 18px 20px
repeat: no-repeat
.icon-note
display: inline-block
@extend %icons
&:before
width: 30px
height: 20px
left: 0
background:
image: url("#{$static}/img/icons/icon_pen_black.png")
size: 20px 20px
repeat: no-repeat
.stage-data
padding-left: 3px
background-color: #f1f1f1
color: #8c8c8c
font-size: 12px
.stage-status
font-style: italic
color: #5e5e5e
.stages-paid
li
padding-left: 25px
margin-top: 15px
.text
padding-left: 10px
.reserved
//display: inline-block
@extend %icons
&:before
width: 25px
height: 25px
background:
image: url("#{$static}/img/icons/icon_coins_green.png")
size: 25px 25px
repeat: no-repeat
.unreserved
//display: inline-block
color: #FD010E
@extend %icons
&:before
width: 25px
height: 25px
background:
image: url("#{$static}/img/icons/icon_coins_red.png")
size: 25px 25px
repeat: no-repeat
.closed
//display: inline-block
@extend %icons
&:before
width: 25px
height: 25px
background:
image: url("#{$static}/img/icons/icon_coins_gray.png")
size: 25px 25px
repeat: no-repeat
.border
border-top: 1px solid #CFCFCF
position: relative
height: 20px
margin-top: 10px
.bird
position: absolute
border: 30px solid transparent
border-top: 12px solid #CFCFCF
top: 0
left: 50%
margin-left: -30px
&:before
content: ''
display: block
position: absolute
border: 30px solid transparent
border-top: 12px solid white
top: -13px
left: 50%
margin-left: -30px
.select
color: #FD010E
.note
color: #FD010E
padding-top: 10px
font-size: 12px
//Team
.team-block
.team-user-list
overflow-y: auto
display: -webkit-box
line-height: 16px
max-height: 64px
hyphens: none
.max-rows
overflow-y: hidden
display: -webkit-box
line-height: 16px
max-height: 32px
.icon-hand
@extend %icons
&:before
width: 25px
height: 25px
background:
image: url("#{$static}/img/icons/icon_hands_gray.png")
size: 24px 24px
repeat: no-repeat
a
cursor: crosshair
&:visited
color: #333333
&:hover
color: black
a.docs
&-more, &-less
color: #{map_get($component_colors, select)}
cursor: pointer
&:hover
color: darken(#FD010E, 25%)
box-shadow: none
&-more:before
content: '...Развернуть'
&-less:before
content: '...Cвернуть'
.remove-note
position: absolute
width: 11px
height: 11px
background: url('../img/delDoc.png') no-repeat center
background-size: cover
right: -20px !important
top: 2px
cursor: pointer

@ -2,6 +2,11 @@
{% load staticfiles %} {% load staticfiles %}
{% load thumbnail %} {% load thumbnail %}
{% load user_tags %} {% load user_tags %}
{% load sass_tags %}
{% block head_css %}
<link rel='stylesheet' href='{% sass_src "sass/chat_add.sass" %}' xmlns="http://www.w3.org/1999/html">
<link rel='stylesheet' href='{% sass_src "sass/components/custom-components.sass" %}'>
{% endblock %}
{% block content %} {% block content %}
{% include 'partials/header.html' %} {% include 'partials/header.html' %}
<div class="container mainScore"> <div class="container mainScore">
@ -27,8 +32,8 @@
</li> </li>
<li role="presentation"> <li role="presentation">
<a href="#tab3" data-toggle="tab">Исполнители,Группы<span class="count-tab" <a href="#tab3" data-toggle="tab">Группы<span class="count-tab"
id="count-tab-team">{{ teams_ms_count }}</span></a> id="count-tab-team">{{ teams_ms_count }}</span></a>
</li> </li>
</ul> </ul>
@ -39,107 +44,116 @@
<div class="tab-content"> <div class="tab-content">
<!-- Tab1 contacts block --> <!-- Tab1 contacts block -->
<div class="chatBlock disTab tab-pane fade in" id="tab1"> <div class="chatBlock disTab tab-pane fade in" id="tab1">
<div class="col-lg-3 wrMessages"> <div class="row mod-row-eq-height" style="margin-left: 0; margin-right: 0">
<div class="messageBlock box-sizing disTab"> <div class="col-lg-3 wrMessages">
<p>Контакты</p> <div class="messageBlock box-sizing disTab">
{% for contact in contacts_users %} <div class="remove-margin">
{% include 'inc-contact-card.html' %} <div class="header-wrapper">
{% endfor %} <span class="header">
Контакты
</div> </span>
</div> <div class="triangle-header"></div>
</div>
<div class="col-lg-6 commChat" id="contact-chat">
<div id="message-chat-space"></div>
<form id="contact-chat-form">
<input type="hidden" value="{{ request.user.pk }}" name="senderId" id="senderContactId"/>
<input type="hidden" value="" name="recipentId" id="recipentContactId"/>
<textarea id="chat" name="chat_message" class="box-sizing"></textarea>
<p class="errorEmptyMessage" style="color: red;display:none;">Пустое сообщение нельзя
отправить</p>
<div class="bunChat">
<div class="setChat box-sizing upload">
<input type="file" name="file" id="upload-document-contact">
<p>Прикрепить файл</p>
</div> </div>
<div id="document-send-contact"></div> {% for contact in contacts_users %}
<a id="contact-chat-add-message" href="#">отправить</a> {% include 'inc-contact-card.html' %}
</div> {% endfor %}
</form>
</div>
<div class="col-lg-3 wrChat1"> </div>
<div class="col-lg-12 documentsChat">
<p>Прикрепленные документы</p>
<ul id="documentSpace">
</ul>
<a href="{% url 'common:create' %}">
Распечатать с помощью ресурса
</a>
</div> </div>
<div class="textAreaBlock2 box-sizing disTab"> <div class="col-lg-6 commChat" id="contact-chat">
<ul class="contractor-notes-block"> <div id="message-chat-space"></div>
</ul> <form id="contact-chat-form">
<form id="add-form-contractor-note"> <input type="hidden" value="{{ request.user.pk }}" name="senderId"
<p>Для заметок</p> id="senderContactId"/>
<input type="hidden" name="sender" id="senderNoteContractor" <input type="hidden" value="" name="recipentId" id="recipentContactId"/>
value="{{ request.user.pk }}"/> <textarea id="chat" name="chat_message" class="box-sizing"></textarea>
<input type="hidden" name="recipent" id="recipentNoteContractor" value=""/> <p class="errorEmptyMessage" style="color: red;display:none;">Пустое сообщение нельзя
отправить</p>
<textarea id="chat2" name="text"></textarea>
<a href="#" id="add-note-contractor">сохранить</a> <div class="bunChat">
<input style="display: none" type="file" name="file" id="upload-document-contact">
<div onclick="$('#upload-document-contact').trigger('click')"
style="display: inline-block;vertical-align: inherit; float: left"
class="upload-new paper-clip">
<p id="fileUploadAddBtn" style="margin: 0">прикрепить файл</p>
</div>
<a style="float: right" class="btn btn-send icon-send" href="#"
id="contact-chat-add-message">отправить</a>
<div style="clear: both"></div>
<div style="padding-top: 10px;" id="document-send-contact"></div>
</div>
</form> </form>
</div> </div>
<div class="col-lg-3 wrstepschat">
<div class="col-lg-12 documentsChat">
{% include 'partials/inc-attach-documents.html' with class='documentSpace' %}
{# <p>Прикрепленные документы</p>#}
{# <ul id="documentSpace">#}
{# </ul>#}
{# <div style="margin-left: -27px; margin-right: -27px;">#}
{# <a href="{% url 'common:create' %}"#}
{# class="chat-button icon-print"#}
{# style="padding: 25px 10px"#}
{# >Распечатать с помощью ресурса</a>#}
{# </div>#}
</div>
<div class="textAreaBlock2 box-sizing disTab">
<ol class="contractor-notes-block"></ol>
<form id="add-form-contractor-note">
<div class="icon-note mod-align-center">Для заметок</div>
<input type="hidden" name="sender" id="senderNoteContractor"
value="{{ request.user.pk }}"/>
<input type="hidden" name="recipent" id="recipentNoteContractor" value=""/>
<textarea id="chat2" name="text"></textarea>
{# <a href="#" id="add-note-contractor">сохранить</a>#}
<a style="float: right" class="btn btn-send icon-send" href="#"
id="add-note-contractor">сохранить</a>
</form>
</div>
<!-- order-info --> <!-- order-info -->
{% include 'contact-info.html' %} {% include 'contact-info.html' %}
<!-- --> <!-- -->
</div>
</div> </div>
</div> </div>
<!-- End block Tab1 --> <!-- End block Tab1 -->
<!-- Tab2 chat order block --> <!-- Tab2 chat order block -->
<div class="chatBlock disTab tab-pane fade" id="tab2"> <div class="chatBlock disTab tab-pane fade" id="tab2">
<div class="col-lg-3 wrMessages"> <div class="row mod-row-eq-height" style="margin-left: 0; margin-right: 0">
<div class="messageBlock box-sizing disTab"> <div class="col-lg-3 wrMessages">
<p>Заказы</p> <div class="messageBlock box-sizing disTab">
{% for order in orders %} <div class="remove-margin">
<div class="orderBlock box-sizing order-block" data-project-id="{{ order.project.id }}" <div class="header-wrapper">
id="orderBlock{{ order.id }}" <span class="header">
data-team-id="{% if order.team %}{{ order.team.pk }}{% else %}0{% endif %}" Заказы
data-recipent-id="{{ order.project.customer.pk }}" data-id="{{ order.id }}"> </span>
<span class="dimovChat"></span> <div class="triangle-header"></div>
<p class="titleOB">{{ order }}</p>
<div class="hideOBB">
<p class="pOB">
<span style="display: none;"
class="order-count-{{ order.id }}">{% get_new_count_for_order request.user order.id %}</span>
<span>Исполнитель:</span> {{ request.user.get_full_name }}</p>
<a href="#" class="linkChat11 full-order-info">
<span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span>
Полное описание заказа
</a>
</div> </div>
</div> </div>
{% endfor %} {% for order in orders %}
{% include 'partials/inc-order-card.html' %}
{% endfor %}
{% if archive_orders %} {% if archive_orders %}
<div class="textAreaBlock2 FFD box-sizing disTab"> <div style="margin-left: -13px; margin-right: -13px; text-align: center">
<a href="#" data-show="true" id="trashed-button">Показать архивные заказы</a> <a href="#" data-show="true" id="trashed-button" class="chat-button icon-books">
</div> Показать архивные заказы
<p id="show-archive-label" style="display: none;">Архивные заказы</p> </a>
<div id="archive-space" style="display:none;"> </div>
<p id="show-archive-label" style="display: none;">Архивные заказы</p>
<div id="trashed-orders"> <div id="archive-space" style="display:none;">
{% for order in archive_orders %}
<div data-id="{{ order.id }}" class="trashedOrderBlock box-sizing"> <div id="trashed-orders">
<span class="dimovChat"></span> {% for order in archive_orders %}
<p class="titleOB"> {{ order.project.name }}</p> <div data-id="{{ order.id }}" class="trashedOrderBlock box-sizing">
<div class="hideOBB"><p class="pOB"> <span class="dimovChat"></span>
<p class="titleOB"> {{ order.project.name }}</p>
<div class="hideOBB"><p class="pOB">
<span>Исполнитель: <span>Исполнитель:
{% if order.contractor %} {% if order.contractor %}
{{ order.contractor.get_full_name }} {{ order.contractor.get_full_name }}
@ -147,115 +161,177 @@
{{ order.team.name }} {{ order.team.name }}
{% endif %} {% endif %}
</span> </span>
</p> </p>
<a href="#" class="linkChat11 full-order-info"> <a href="#" class="linkChat11 full-order-info">
<span class="glyphicon glyphicon-info-sign" <span class="glyphicon glyphicon-info-sign"
aria-hidden="true"></span> aria-hidden="true"></span>
Полное описание заказа Полное описание заказа
</a> </a>
</div>
</div> </div>
</div> {% endfor %}
{% endfor %} </div>
</div> </div>
</div> {% endif %}
{% endif %} </div>
</div> </div>
<div class="col-lg-6 commChat">
<div id="message-chat-order-space"></div>
<form id="chat-order-add">
<input type="hidden" id="orderId" name="orderId">
<input type="hidden" id="senderId" name="senderId" value="{{ request.user.pk }}">
<input type="hidden" id="recipentId" name="recipentId" value="">
<textarea id="chat" class="box-sizing"></textarea>
<p class="errorEmptyMessage" style="color: red;display:none;">Пустое сообщение нельзя
отправить</p>
<div class="bunChat">
<input style="display: none" type="file" name="file" id="upload-document-order">
<div onclick="$('#upload-document-order').trigger('click')"
style="display: inline-block;vertical-align: inherit; float: left"
class="upload-new paper-clip">
<p id="fileUploadAddBtn" style="margin: 0">прикрепить файл</p>
</div>
<a style="float: right" class="btn btn-send icon-send" href="#"
id="order-chat-add-message">отправить</a>
<div style="clear: both"></div>
<div style="padding-top: 10px;" id="document-send-order"></div>
</div>
</form>
</div> </div>
<div class="col-lg-6 commChat"> <div class="col-lg-3 wrstepschat" id="order-stages-tab" data-score="">
<div id="message-chat-order-space"></div> <div class="remove-margin">
<div class="header-wrapper">
<form id="chat-order-add"> <span class="header">
<input type="hidden" id="orderId" name="orderId"> Порядок работы
<input type="hidden" id="senderId" name="senderId" value="{{ request.user.pk }}"> </span>
<input type="hidden" id="recipentId" name="recipentId" value=""> <div class="triangle-header"></div>
<textarea id="chat" class="box-sizing"></textarea> </div>
<p class="errorEmptyMessage" style="color: red;display:none;">Пустое сообщение нельзя </div>
отправить</p> {# 1.Согласование условий #}
<div class="bunChat"> <div class="stepssBlock box-sizing disTab" id="conditions-approve">
<div class="setChat box-sizing upload"> <p class="titleStepss">
<input type="file" name="file" id="upload-document-order"> <span class="select"> 1.</span> Согласование условий</p>
<p>Прикрепить файл</p> <p class="textStepss js-help-text">
Обсуджение задания и условий выполнения работы. Подтверждение заказа исполнителем.
</p>
<div class="border">
<div class="bird"></div>
</div> </div>
<div id="document-send-order"></div> </div>
<div class="stepssBlock">
<div id="order-stages">
<a href="#" id="order-chat-add-message">отправить</a> </div>
<div class='btn_wrapper'>
<div style="margin-left: -27px; margin-right: -27px; text-align: center">
<a href="#"
class="chat-button icon-hand"
style="padding-left: 80px" ;
id="btnApprove">Согласовать
</a>
<a href="#"
class="chat-button icon-change"
style="padding: 25px 5px; padding-left: 15px;"
id="btnChange">Отправить на внесение изменений
</a>
<a href="#"
class="chat-button icon-books js-btnToArchive"
style="padding-left: 60px">Отказаться от заказа
</a>
</div>
</div>
</div> </div>
</form>
</div>
<div class="col-lg-3 wrstepschat">
<p>Этапы работы</p>
<div class="stepssBlock box-sizing disTab">
<p class="titleStepss">1 / Согласование условий</p>
<p class="textStepss">
Обсуждение задания и условий выполнения работы.
Подтверждение заказа исполнителем.
</p>
</div>
<div id="order-stages"></div>
<div class="stepssBlock box-sizing disTab" id="reserveSpace" style="display:none;">
<p class="titleStepss">2 / Резервирование</p>
<p class="textStepss">
Резервирование заказчиком суммы оплаты по заказ.
Деньги перечисляются и хранятся на сайте.
</p>
<ul class="stages-paid"></ul>
</div>
<div class="stepssBlock box-sizing disTab" id="reserveSpace" style="display:none;">
<div class="titleStepss"><span class="select">2.</span> Резервирование</div>
<div class="textStepss js-help-text">
Заказчик резервирует сумму на оплату работы.
Деньги перечисляются и хранятся на сайте. <br>
<span class="note">Заказ проходит по безопасной сделке</span>
</div>
<div class="border">
<div class="bird"></div>
</div>
<ul class="stages-paid">
{# <li class="reserved"><span class="text">Сумма за этап 1.<br/> Зарезервирована</span></li>#}
{# <li class="unreserved"><span class="text">Сумма за этап 2.<br/> Не зарезервирована</span></li>#}
</ul>
</div>
<div class="stepssBlock box-sizing disTab" id="completeWork"> <div class="stepssBlock box-sizing disTab" id="completeWork" style="display: none">
<p class="titleStepss">3 / Выполнение работы</p> <p class="titleStepss"><span class="select">3.</span> Выполнение работы</p>
<p class="textStepss"> <p class="textStepss js-help-text">
Процесс выполнения задания в заказе до получения Процесс выполнения задания в заказе до получения
заказчиком итогового результата работы. заказчиком итогового результата работы.
</p> </p>
<div id="stagesWork" class="stages-work textAreaBlock2"> <div class="border">
<div class="bird"></div>
</div>
<div id="stagesWork" class="stages-work"></div>
<div class='btn_wrapper'>
<div style="margin-left: -27px; margin-right: -27px; text-align: center">
<a href="#"
class="chat-button icon-books js-btnToArchive"
style="padding-left: 60px;">Отказаться от заказа
</a>
<a href="#"
class="chat-button icon-arbitration js-btnArbitration"
style="padding-left: 40px;">Обратиться в арбитраж
</a>
</div>
</div>
</div>
<div id="leaveReview" style="display: none;">
<div class="closeChat closeChat1">
<a href="#" data-toggle="modal" data-target="#review-add"
data-review-type="positive">
Закрыть проект<br>и оставить отзыв
</a>
</div>
<div class="closeChat closeChat2">
<a href="#" data-toggle="modal" data-target="#review-add"
data-review-type="negative">
Закрыть проект<br>и оставить отзыв
</a>
</div>
</div> </div>
</div>
<div id="leaveReview" style="display: none;"> <div class="col-lg-12 documentsChat">
<div class="closeChat closeChat1"> {% include 'partials/inc-attach-documents.html' with class='documentOrderSpace' %}
<a href="#" data-toggle="modal" data-target="#review-add" data-review-type="positive">
Закрыть проект<br>и оставить отзыв
</a>
</div> </div>
<div class="closeChat closeChat2"> <div class="textAreaBlock2 box-sizing disTab">
<a href="#" data-toggle="modal" data-target="#review-add" data-review-type="negative"> <ol class="order-notes-block"></ol>
Закрыть проект<br>и оставить отзыв <div class="icon-note mod-align-center">Для заметок</div>
</a> <form id="add-form-order-note">
<textarea id="chat2" name="text"></textarea>
<input type="hidden" name="order" id="orderNote" value=""/>
<input type="hidden" name="sender" id="senderNote" value="{{ request.user.pk }}"/>
<input type="hidden" name="recipent" id="recipentNote" value=""/>
{# <a href="#" id="add-note-button">сохранить</a>#}
<a style="float: right" class="btn btn-send icon-send" href="#"
id="add-note-button">сохранить</a>
</form>
</div> </div>
</div>
<!-- Review add --> <!-- Review add -->
{% include 'review_add_modal.html' %} {% include 'review_add_modal.html' %}
<!-- --> <!-- -->
<!-- Arbitration add -->
{% include 'arbitration_modal.html' %}
<!-- -->
<div class="col-lg-12 documentsChat">
<p>Прикрепленные документы</p>
<ul id="documentOrderSpace"></ul>
<a href="{% url 'common:create' %}">
Распечатать с помощью ресурса
</a>
</div>
<div class="textAreaBlock2 box-sizing disTab"> <!-- Arbitration add -->
<ul class="order-notes-block"> {% include 'arbitration_modal.html' %}
</ul> <!-- -->
<p>Для заметок</p>
<form id="add-form-order-note"> <!-- order-info -->
<textarea id="chat2" name="text"></textarea> {% include 'order_info.html' %}
<input type="hidden" name="order" id="orderNote" value=""> <!-- -->
<input type="hidden" name="sender" id="senderNote" value="{{ request.user.pk }}">
<input type="hidden" name="recipent" id="recipentNote" value="">
<a href="#" id="add-note-button">сохранить</a>
</form>
</div> </div>
</div> </div>
</div> </div>
@ -263,137 +339,86 @@
<!-- Tab3 groups block --> <!-- Tab3 groups block -->
<div class="chatBlock disTab tab-pane fade" id="tab3"> <div class="chatBlock disTab tab-pane fade" id="tab3">
<div class="col-lg-3 wrMessages"> <div class="row mod-row-eq-height" style="margin-left: 0; margin-right: 0">
<div class="messageBlock box-sizing disTab"> <div class="col-lg-3 wrMessages">
<p>Заказы</p> <div class="messageBlock box-sizing disTab">
{% for torder in team_orders %} <div class="remove-margin">
<div class="team-order-block orderBlock box-sizing" id="teamOrderBlock{{ torder.pk }}" <div class="header-wrapper">
data-team-id="{{ torder.team.pk }}" data-order-id="{{ torder.pk }}" <span class="header">
data-id="{{ torder.pk }}"> Группы
<span class="dimovChat"></span> </span>
<p class="titleOB"> <div class="triangle-header"></div>
{{ torder }}
</p>
<div class="hideOBB disTab">
<p class="pOB">
<span style="display: none;"
class="teamorder-count-{{ torder.team.id }}">{% get_new_count_for_team request.user torder.team.id torder.pk %}</span>
<span>Исполнитель:</span> {{ torder.team.name }}
</p>
<ul class="listChat1">
{% for tuser in torder.team.users.all %}
<li>{{ tuser }}</li>
{% endfor %}
</ul>
<p class="pOB">
<span>Чаты:</span>
{% if request.user.pk != torder.team.owner.pk %}
<span class="team-chat-user"
data-id="{{ torder.team.owner.pk }}">{{ torder.team.owner.username }}</span>
{% endif %}
{% for tuser in torder.team.contractors.all %}
{% if request.user.pk != tuser.pk %}
<span class="team-chat-user"
data-id="{{ tuser.pk }}">{{ tuser.username }}</span>
{% endif %}
{% endfor %}
</p>
<a href="#" class="linkChat11 full-order-info">
<span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span>
Полное описание заказа
</a>
</div> </div>
</div> </div>
{% endfor %} {# {% for torder in team_orders %}#}
{# {% include 'partials/inc-order-card.html' with order=torder %}#}
{% for yteam in your_teams %} {# {% endfor %}#}
<div class="team-block orderBlock box-sizing" id="teamMyBlock{{ yteam.pk }}"
data-team-id="{{ yteam.pk }}">
<span class="dimovChat"></span>
<p class="titleOB">
{{ yteam }}
</p>
<div class="hideOBB disTab">
<p class="pOB">
<span style="display: none;"
class="team-count-{{ yteam.id }}">{% get_new_count_for_team request.user yteam.id %}</span>
<span>Владелец группы:</span> {{ yteam.owner }}
</p>
<ul class="listChat1">
{% for tuser in yteam.contractors.all %}
<li>{{ tuser }}</li>
{% endfor %}
</ul>
<p class="pOB">
<span>Чаты:</span>
{% if request.user.pk != torder.team.owner.pk %}
<span class="team-chat-user"
data-id="{{ yteam.owner.pk }}">{{ yteam.owner.username }}</span>
{% endif %}
{% for tuser in yteam.contractors.all %}
{% if request.user.pk != tuser.pk %}
<span class="team-chat-user"
data-id="{{ tuser.pk }}">{{ tuser.username }} </span>
{% endif %}
{% endfor %}
</p>
</div> {% for yteam in your_teams %}
</div> {% include 'partials/inc-team-card.html' %}
{% endfor %} {% endfor %}
</div>
</div> </div>
</div> <div class="col-lg-6 commChat">
<div class="col-lg-6 commChat"> <div id="message-chat-team-space"></div>
<div id="message-chat-team-space"></div> <form id="team-chat-form">
<form id="team-chat-form"> <input type="hidden" name="sender" id="senderTeamId" value="{{ request.user.pk }}">
<input type="hidden" name="sender" id="senderTeamId" value="{{ request.user.pk }}"> <input type="hidden" name="recipent" id="recipentTeamId">
<input type="hidden" name="recipent" id="recipentTeamId"> <input type="hidden" name="order" id="orderTeamId">
<input type="hidden" name="order" id="orderTeamId"> <input type="hidden" name="team" id="teamId">
<input type="hidden" name="team" id="teamId"> <input type="hidden" name="team_ids" id="teamIds">
<input type="hidden" name="team_ids" id="teamIds"> <input type="hidden" name="document-send" id="documentSendIds">
<input type="hidden" name="document-send" id="documentSendIds"> <textarea id="chatText" class="chat-textarea box-sizing"></textarea>
<textarea id="chatText" class="chat-textarea box-sizing"></textarea> <p class="errorEmptyMessage" style="color: red;display:none;">Пустое сообщение нельзя
<p class="errorEmptyMessage" style="color: red;display:none;">Пустое сообщение нельзя отправить</p>
отправить</p> <div class="bunChat">
<div class="bunChat"> <input style="display: none" type="file" name="file" id="upload-document-team">
<div class="setChat box-sizing upload"> <div onclick="$('#upload-document-team').trigger('click')"
<input type="file" name="file" id="upload-document-team"> style="display: inline-block;vertical-align: inherit; float: left"
<p>Прикрепить файл</p> class="upload-new paper-clip">
</div> <p id="fileUploadAddBtn" style="margin: 0">прикрепить файл</p>
<div id="progress" class="progress"> </div>
<div class="progress-bar progress-bar-success"></div> <div id="progress" class="progress" hidden>
<div class="progress-bar progress-bar-success"></div>
</div>
<a style="float: right" class="btn btn-send icon-send" href="#"
id="add-team-chat-message">отправить</a>
<div style="clear: both"></div>
<div style="padding-top: 10px;" id="document-send"></div>
</div> </div>
</form>
<div id="document-send"></div>
<a href="#" id="add-team-chat-message">отправить</a>
</div>
</form>
</div>
<div class="col-lg-3 wrstepschat">
<div class="col-lg-12 documentsChat">
<p>Прикрепленные документы</p>
<ul id="documentTeamSpace"></ul>
<a href="{% url 'common:create' %}">
Распечатать с помощью ресурса
</a>
</div> </div>
<div class="col-lg-3 wrstepschat">
<div class="col-lg-12 documentsChat">
{% include 'partials/inc-attach-documents.html' with class='documentTeamSpace' %}
{# <p>Прикрепленные документы</p>#}
{# <ul id="documentTeamSpace"></ul>#}
{# <div style="margin-left: -27px; margin-right: -27px;">#}
{# <a href="{% url 'common:create' %}"#}
{# class="chat-button icon-print"#}
{# style="padding: 25px 10px"#}
{# >Распечатать с помощью ресурса</a>#}
{# </div>#}
</div>
<div class="textAreaBlock2 box-sizing disTab"> <div class="textAreaBlock2 box-sizing disTab">
<ul class="team-notes-block"> <ol class="team-notes-block"></ol>
</ul>
<p>Для заметок</p> <form id="add-form-team-note">
<form id="add-form-team-note"> <div class="icon-note mod-align-center">Для заметок</div>
<textarea id="chat2" name="text"></textarea> <textarea id="chat2" name="text"></textarea>
<input type="hidden" name="order" id="orderNote"> <input type="hidden" name="order" id="orderNote">
<input type="hidden" name="sender" id="senderNote" value="{{ request.user.pk }}"> <input type="hidden" name="sender" id="senderNote" value="{{ request.user.pk }}">
<input type="hidden" name="recipent" id="recipentNote"> <input type="hidden" name="recipent" id="recipentNote">
<input type="hidden" name="team" id="teamNote"> <input type="hidden" name="team" id="teamNote">
<a href="#" id="add-team-note-button">сохранить</a> {# <a href="#" id="add-team-note-button">сохранить</a>#}
</form> <a style="float: right" class="btn btn-send icon-send" href="#"
id="add-team-note-button">сохранить</a>
</form>
</div>
</div> </div>
</div> </div>
</div> </div>
@ -402,7 +427,9 @@
{% include 'order_info.html' %} {% include 'order_info.html' %}
<!-- --> <!-- -->
</div> </div>
{% include 'partials/footer.html' %} <div class="fix-footer">
{% include 'partials/footer.html' %}
</div>
</div> </div>
</div> </div>
@ -415,6 +442,7 @@
var port = '{{ request.META.SERVER_PORT }}'; var port = '{{ request.META.SERVER_PORT }}';
</script> </script>
<script type="text/javascript" src='{% static "js/chat.js" %}'></script> {# <script type="text/javascript" src='{% static "js/chat.js" %}'></script>#}
<script type="text/javascript" src='{% static "js/chat_contractor.js" %}'></script> {# <script type="text/javascript" src='{% static "js/chat_contractor.js" %}'></script>#}
<script src='{% static "js/build/chat_contractor_oop.js" %}'></script>
{% endblock %} {% endblock %}

@ -1,13 +1,32 @@
{% extends 'partials/base.html' %} {% extends 'partials/base.html' %}
{% load staticfiles %} {% load static %}
{% load thumbnail %} {% load thumbnail %}
{% load user_tags %} {% load sass_tags %}
{% block head_css %}
<link rel='stylesheet' href='{% sass_src "sass/chat_add.sass" %}' xmlns="http://www.w3.org/1999/html">
<link rel='stylesheet' href='{% sass_src "sass/components/custom-components.sass" %}'>
{% endblock %}
{% block content %} {% block content %}
{% include 'partials/header.html' %} {% include 'partials/header.html' %}
<div class="modal" id="popupOk" role="dialog" aria-labelledby="myModalLabel">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span></button>
<h4 class="modal-title" id="myModalLabel">Уведомление</h4>
</div>
<div class="modal-body">Этапы отправлены исполнителю для согласования</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">ОК</button>
</div>
</div>
</div>
</div>
<div class="container mainScore"> <div class="container mainScore">
<div class="row"> <div class="row">
<div class="col-lg-12 allProjects"> <div class="col-lg-12 allProjects">
<h1>Чат</h1> <h1>Переговорная</h1>
</div> </div>
<div class="btnReadyBlock disTab"> <div class="btnReadyBlock disTab">
<div class="triangle1"></div> <div class="triangle1"></div>
@ -31,61 +50,88 @@
<div class="tab-content"> <div class="tab-content">
<!-- Tab1 (contacts block)--> <!-- Tab1 (contacts block)-->
<div class="chatBlock disTab tab-pane fade in" id="tab1"> <div class="chatBlock disTab tab-pane fade in" id="tab1">
<div class="col-lg-3 wrMessages"> <div class="row mod-row-eq-height" style="margin-left: 0; margin-right: 0">
<div class="messageBlock box-sizing disTab"> <!-- Первый столбик "Контакты" -->
<p>Контакты</p> <div class="col-lg-3 wrMessages">
{% for contact in contacts_users %} <div class="messageBlock box-sizing disTab">
{% include 'inc-contact-card.html' %} <div class="remove-margin">
{% endfor %} <div class="header-wrapper">
<span class="header">
Контакты
</span>
<div class="triangle-header"></div>
</div>
</div>
</div>
<div class="col-lg-6 commChat" id="contact-chat">
<div id="message-chat-space"></div>
<form id="contact-chat-form">
<input type="hidden" value="{{ request.user.pk }}" name="senderId" id="senderContactId"/>
<input type="hidden" name="recipentId" id="recipentContactId">
<textarea id="chat" name="chat_message" class="box-sizing"></textarea>
<p class="errorEmptyMessage" style="color: red;display:none;">Пустое сообщение нельзя
отправить</p>
<div class="bunChat">
<div class="setChat box-sizing upload">
<input type="file" name="file" id="upload-document-contact">
<p>Прикрепить файл</p>
</div> </div>
<div id="document-send-contact"></div> {% for contact in contacts_users %}
<a id="contact-chat-add-message" href="#">отправить</a> {% include 'inc-contact-card.html' %}
{% endfor %}
</div> </div>
</div>
<!-- Второй столбик "Чат" -->
<div class="col-lg-6 commChat" id="contact-chat">
<div id="message-chat-space"></div>
<form id="contact-chat-form">
<input type="hidden" value="{{ request.user.pk }}" name="senderId"
id="senderContactId"/>
<input type="hidden" name="recipentId" id="recipentContactId">
<textarea id="chat" name="chat_message" class="box-sizing"></textarea>
<p class="errorEmptyMessage" style="color: red;display:none;">Пустое сообщение нельзя
отправить</p>
</form> {# <div class="bunChat">#}
{# <div class="setChat box-sizing upload">#}
{# <input type="file" name="file" id="upload-document-contact">#}
{# <p>Прикрепить файл</p>#}
{# </div>#}
{# <div id="document-send-contact"></div>#}
{# <a id="contact-chat-add-message" href="#">отправить</a>#}
{# </div>#}
{# EDIT#}
<div class="bunChat">
<input style="display: none" type="file" name="file" id="upload-document-contact">
<div onclick="$('#upload-document-contact').trigger('click')"
style="display: inline-block;vertical-align: inherit; float: left"
class="upload-new paper-clip">
<p id="fileUploadAddBtn" style="margin: 0">прикрепить файл</p>
</div>
<div id="document-send-contact"></div>
<a style="float: right" class="btn btn-send icon-send" href="#"
id="contact-chat-add-message">отправить</a>
</div>
</form>
</div>
<div class="col-lg-3 wrChat1">
<div class="col-lg-12 documentsChat">
<p>Прикрепленные документы</p>
<ul id="documentSpace">
</ul>
<a href="{% url 'common:create' %}">
Распечатать с помощью ресурса
</a>
</div> </div>
<!-- Второй столбик "Прикрепленные документы" -->
<div class="col-lg-3 wrstepschat">
<div class="col-lg-12 documentsChat">
{% include 'partials/inc-attach-documents.html' with class='documentSpace' %}
{# <p>Прикрепленные документы</p>#}
{# <ul id="documentSpace">#}
{# </ul>#}
{# <a href="{% url 'common:create' %}">#}
{# Распечатать с помощью ресурса#}
{# </a>#}
</div>
<div class="textAreaBlock2 box-sizing disTab"> <div class="textAreaBlock2 box-sizing disTab">
<p>Заметки</p> <ol class="contractor-notes-block"></ol>
<ul class="contractor-notes-block"> <form id="add-form-contractor-note">
</ul> <div class="icon-note mod-align-center">Для заметок</div>
<form id="add-form-contractor-note"> <input type="hidden" name="sender" id="senderNoteContractor"
<p>Для заметок</p> value="{{ request.user.pk }}"/>
<input type="hidden" name="sender" id="senderNoteContractor" <input type="hidden" name="recipent" id="recipentNoteContractor" value=""/>
value="{{ request.user.pk }}"/>
<input type="hidden" name="recipent" id="recipentNoteContractor" value=""/> <textarea id="chat2" name="text"></textarea>
<textarea id="chat2" name="text"></textarea> {# <a href="#" id="add-note-contractor">сохранить</a>#}
<a href="#" id="add-note-contractor">сохранить</a> <a style="float: right" class="btn btn-send icon-send" href="#"
</form> id="add-note-contractor">сохранить</a>
</form>
</div>
</div> </div>
</div> </div>
<!-- order-info --> <!-- order-info -->
{% include 'contact-info.html' %} {% include 'contact-info.html' %}
<!-- --> <!-- -->
@ -94,61 +140,43 @@
<!-- Tab2 (chat order block)--> <!-- Tab2 (chat order block)-->
<div class="chatBlock disTab tab-pane fade" id="tab2"> <div class="chatBlock disTab tab-pane fade" id="tab2">
<div class="col-lg-3 wrMessages"> <div class="row mod-row-eq-height" style="margin-left: 0; margin-right: 0">
<div class="messageBlock box-sizing disTab"> <!-- Первый столбик "Заказы" -->
<p>Заказы</p> <div class="col-lg-3 wrMessages">
{% for order in orders %} <div class="messageBlock box-sizing disTab">
<div class="orderBlock box-sizing order-block" <div class="remove-margin">
data-team-id=" <div class="header-wrapper">
{% if order.order.team %}{{ order.order.team.pk }}{% else %}0{% endif %}" <span class="header">
data-project-id="{{ order.id }}" Заказы
id="orderBlock{{ order.order.id }}" </span>
data-secure-deal="{% if order.order.secure %}true{% else %}false{% endif %}" <div class="triangle-header"></div>
{% if order.order.contractor %}
data-recipent-id="{{ order.order.contractor.pk }}"
{% else %}
data-recipent-id="{{ order.order.team.owner.pk }}"
{% endif %} data-id="{{ order.order.id }}">
<span class="dimovChat"></span>
<p class="titleOB">{{ order }}</p>
<div class="hideOBB">
<p class="pOB">
<span style="display: none;"
class="order-count-{{ order.order.id }}">{% get_new_count_for_order request.user order.order.id %}</span>
<span>Исполнитель:</span>
{% if order.order.contractor %}
{{ order.order.contractor.get_full_name }}
{% else %}
{{ order.order.team.name }}
{% endif %}
</p>
<a href="#" class="linkChat11 full-order-info">
<span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span>
Полное описание заказа
</a>
{# <a href="#" class="deleteOrder" data-project-id="{{ order.pk }}">#}
{# Удалить заказ#}
{# </a>#}
</div> </div>
</div> </div>
{% endfor %} {% for order in orders %}
{% include 'partials/inc-order-card.html' %}
{% endfor %}
{% if archive_projects %} {% if archive_projects %}
<div class="textAreaBlock2 FFD box-sizing disTab"> {# <div class="textAreaBlock2 FFD box-sizing disTab">#}
<a href="#" data-show="true" id="trashed-button">Показать архивные заказы</a> {# <a href="#" data-show="true" id="trashed-button">Показать архивные заказы</a>#}
</div> {# </div>#}
<p id="show-archive-label" style="display: none;">Архивные заказы</p> <div style="margin-left: -13px; margin-right: -13px; text-align: center">
<div id="archive-space" style="display:none;"> <a href="#" data-show="true" id="trashed-button" class="chat-button icon-books">
Показать архивные заказы
<div id="trashed-orders"> </a>
{% for proj in archive_projects %} </div>
<div data-id="{{ proj.order.id }}" class="trashedOrderBlock box-sizing"> <p id="show-archive-label" style="display: none;">Архивные заказы</p>
<span class="dimovChat"></span> <div id="archive-space" style="display:none;">
<p class="titleOB"> {{ proj.name }}</p>
<div class="hideOBB"><p class="pOB"> <div id="trashed-orders">
{% for proj in archive_projects %}
<div data-id="{{ proj.order.id }}" class="trashedOrderBlock box-sizing">
<span class="dimovChat"></span>
<p class="titleOB"> {{ proj.name }}</p>
<div class="hideOBB"><p class="pOB">
<span>Исполнитель: <span>Исполнитель:
{% if proj.order.contractor %} {% if proj.order.contractor %}
{{ proj.order.contractor.get_full_name }} {{ proj.order.contractor.get_full_name }}
@ -156,124 +184,216 @@
{{ proj.order.team.name }} {{ proj.order.team.name }}
{% endif %} {% endif %}
</span> </span>
</p> </p>
<a href="#" class="linkChat11 full-order-info"> <a href="#" class="linkChat11 full-order-info">
<span class="glyphicon glyphicon-info-sign" <span class="glyphicon glyphicon-info-sign"
aria-hidden="true"></span> aria-hidden="true"></span>
Полное описание заказа Полное описание заказа
</a> </a>
</div>
</div> </div>
</div> {% endfor %}
{% endfor %} </div>
</div>
{% endif %}
</div>
</div>
<!-- Второй столбик "Чат" -->
<div class="col-lg-6 commChat">
<div id="message-chat-order-space"></div>
<form id="chat-order-add">
<input type="hidden" name="senderId" id="senderId" value="{{ request.user.pk }}"/>
<input type="hidden" name="recipentId" id="recipentId">
<input type="hidden" name="orderId" id="orderId">
<textarea id="chat" class="box-sizing"></textarea>
<p class="errorEmptyMessage" style="color: red;display:none;">Пустое сообщение нельзя
отправить</p>
<div class="bunChat">
<input style="display: none" type="file" name="file" id="upload-document-order">
<div onclick="$('#upload-document-order').trigger('click')"
style="display: inline-block;vertical-align: inherit; float: left"
class="upload-new paper-clip">
<p id="fileUploadAddBtn" style="margin: 0">прикрепить файл</p>
</div> </div>
<div id="document-send-order"></div>
<a style="float: right" class="btn btn-send icon-send" href="#"
id="order-chat-add-message">отправить</a>
</div> </div>
{% endif %} </form>
</div> </div>
</div> <!-- Третий столбик "Стадии Заказа" -->
<div class="col-lg-6 commChat"> <div class="col-lg-3 wrstepschat" id="order-stages-tab" data-score="">
<div id="message-chat-order-space"></div> <div class="remove-margin">
<form id="chat-order-add" style="display:none;"> <div class="header-wrapper">
<input type="hidden" name="senderId" id="senderId" value="{{ request.user.pk }}"/> <span class="header">
<input type="hidden" name="recipentId" id="recipentId"> Порядок работы
<input type="hidden" name="orderId" id="orderId"> </span>
<textarea id="chat" class="box-sizing"></textarea> <div class="triangle-header"></div>
<p class="errorEmptyMessage" style="color: red;display:none;">Пустое сообщение нельзя </div>
отправить</p> </div>
<div class="bunChat"> {# 1.Согласование условий #}
<div class="setChat box-sizing upload"> <div class="stepssBlock box-sizing disTab" id="conditions-approve">
<input type="file" name="file" id="upload-document-order"> <p class="titleStepss">
<p>Прикрепить файл</p> <span class="select>"> 1.</span> Согласование условий</p>
<p class="textStepss js-help-text">
Обсуджение задания и условий выполнения работы. Подтверждение заказа исполнителем.
</p>
<div class="border">
<div class="bird"></div>
</div> </div>
<div id="document-send-order"></div>
<a href="#" id="order-chat-add-message">отправить</a>
</div> </div>
</form>
</div>
<div class="col-lg-3 wrstepschat" id="order-stages-tab" data-score="">
<p>Этапы работы</p>
<div class="stepssBlock box-sizing disTab">
<p class="titleStepss">1 / Согласование условий</p>
<p class="textStepss">
Обсуджение задания и условий выполнения работы. Подтверждение заказа исполнителем.
</p>
</div>
<div id="order-stages" class="stepssBlock"></div> <div class="stepssBlock" style="">
<p class="textStepss">Количество этапов в данном проекте
<input type="text" id="countStage" value="" size="3"/>
</p>
<div id="order-stages">
</div>
<div class='btn_wrapper'>
<div style="margin-left: -27px; margin-right: -27px; text-align: center">
<a href="#"
class="chat-button icon-hand"
{# style="padding-left: 60px;"#}
id="btnApprove">отправить на согласование
</a>
<a href="#"
class="chat-button icon-change"
style="padding-left: 60px;"
id="btnChange">Внести изменения
</a>
<a href="#"
class="chat-button icon-books"
style="padding: 25px 10px;"
id="btnToArchive">Отказаться и отправить в архив
</a>
</div>
</div>
</div>
<div class="stepssBlock box-sizing disTab" id="reserveSpace" style="display:none;">
<div class="titleStepss">2. Резервирование</div>
<div class="textStepss js-help-text">
Заказчик резервирует сумму на оплату работы.
Деньги перечисляются и хранятся на сайте.
</div>
<div class="border">
<div class="bird"></div>
</div>
<ul class="stages-paid">
{# <li class="reserved"><span class="text">Сумма за этап 1.<br/> Зарезервирована</span></li>#}
{# <li class="unreserved"><span class="text">Сумма за этап 2.<br/> Не зарезервирована</span></li>#}
</ul>
<div class="stepssBlock box-sizing disTab" id="reserveSpace" style="display:none;">
<p class="titleStepss">2 / Резервирование</p>
<p class="textStepss">
Резервирование заказчиком суммы оплаты по заказ.
Деньги перечисляются и хранятся насайте.
</p>
<ul class="stages-paid"></ul>
<div class="textAreaBlock2 FFD box-sizing disTab"> <div class='btn_wrapper'>
<a href="#" id="reserve-button" data-order-id="">Зарезервировать</a> <div style="margin-left: -27px; margin-right: -27px; text-align: center">
<a href="#"
class="chat-button icon-credit_card"
style="padding-left: 60px;"
id="btnReserve">Зарезервировать
</a>
<a href="#"
class="chat-button icon-arbitration js-btnArbitration"
style="padding-left: 40px;">Обратиться в арбитраж
</a>
</div>
</div>
</div> </div>
</div> <!-- Зарезервировать средства (модальное окно)-->
{% include 'reverse_stage_modal.html' %}
<!-- Конец блока -->
<!-- Зарезервировать средства (модальное окно)--> <div class="stepssBlock box-sizing disTab" id="completeWork" style="display: none">
{% include 'reverse_stage_modal.html' %} <p class="titleStepss"><span class="select">3.</span> Выполнение работы</p>
<!-- Конец блока --> <p class="textStepss js-help-text">
Процесс выполнения задания в заказе до получения
<div class="stepssBlock box-sizing disTab" id="completeWork"> заказчиком итогового результата работы.
<p class="titleStepss">3 / Выполнение работы</p> </p>
<p class="textStepss"> <div class="border">
Процесс выполнения задания в заказе до получения <div class="bird"></div>
заказчиком итогового результата работы. </div>
</p> <div id="stagesWork" class="stages-work"></div>
<div id="stagesWork" class="stages-work"></div> <div class='btn_wrapper'>
</div> <div style="margin-left: -27px; margin-right: -27px; text-align: center">
<a href="#"
class="chat-button icon-arbitration js-btnArbitration"
style="padding-left: 40px;">Обратиться в арбитраж
</a>
</div>
</div>
</div>
<div id="leaveReview" style="display: none;"> <div id="leaveReview" style="display: none;">
<div class="closeChat closeChat1"> <div class="closeChat closeChat1">
<a href="#" data-toggle="modal" data-target="#review-add" data-review-type="positive"> <a href="#" data-toggle="modal" data-target="#review-add"
Закрыть проект<br>и оставить отзыв data-review-type="positive">
</a> Закрыть проект<br>и оставить отзыв
</a>
</div>
<div class="closeChat closeChat2">
<a href="#" data-toggle="modal" data-target="#review-add"
data-review-type="negative">
Закрыть проект<br>и оставить отзыв
</a>
</div>
</div> </div>
<div class="closeChat closeChat2">
<a href="#" data-toggle="modal" data-target="#review-add" data-review-type="negative"> <div class="col-lg-12 documentsChat">
Закрыть проект<br>и оставить отзыв {% include 'partials/inc-attach-documents.html' with class='documentOrderSpace' %}
</a> {# <p>Прикрепленные документы</p>#}
{# <ul id="documentOrderSpace"></ul>#}
{# <div style="margin-left: -27px; margin-right: -27px;">#}
{# <a href="{% url 'common:create' %}"#}
{# class="chat-button icon-print"#}
{# style="padding: 25px 10px"#}
{# >Распечатать с помощью ресурса</a>#}
{# </div>#}
</div> </div>
</div>
<div class="col-lg-12 documentsChat"> <div class="textAreaBlock2 box-sizing disTab">
<p>Прикрепленные документы</p> {# <ul class="order-notes-block">#}
<ul id="documentOrderSpace"></ul> {# </ul>#}
<a href="{% url 'common:create' %}"> {# <p>Для заметок</p>#}
Распечатать с помощью ресурса {# <form id="add-form-order-note">#}
</a> {# <textarea id="chat2" name="text"></textarea>#}
</div> {# <input type="hidden" name="order" id="orderNote" value=""/>#}
{# <input type="hidden" name="sender" id="senderNote" value="{{ request.user.pk }}"/>#}
{# <input type="hidden" name="recipent" id="recipentNote" value=""/>#}
{# <a href="#" id="add-note-button">сохранить</a>#}
{# </form>#}
<div class="textAreaBlock2 box-sizing disTab"> <ol class="contractor-notes-block"></ol>
<ul class="order-notes-block"> <form id="add-form-order-note">
</ul> <div class="icon-note mod-align-center">Для заметок</div>
<p>Для заметок</p> <textarea id="chat2" name="text"></textarea>
<form id="add-form-order-note"> <input type="hidden" name="order" id="orderNote" value=""/>
<textarea id="chat2" name="text"></textarea> <input type="hidden" name="sender" id="senderNote" value="{{ request.user.pk }}"/>
<input type="hidden" name="order" id="orderNote" value=""/> <input type="hidden" name="recipent" id="recipentNote" value=""/>
<input type="hidden" name="sender" id="senderNote" value="{{ request.user.pk }}"/> <a style="float: right" class="btn btn-send icon-send" href="#" id="add-note-button">
<input type="hidden" name="recipent" id="recipentNote" value=""/> сохранить
<a href="#" id="add-note-button">сохранить</a> </a>
</form> </form>
</div>
</div>
<!-- Review add --> <!-- Review add -->
{% include 'review_add_modal.html' %} {% include 'review_add_modal.html' %}
<!-- --> <!-- -->
<!-- Arbitration add --> <!-- Arbitration add -->
{% include 'arbitration_modal.html' %} {% include 'arbitration_modal.html' %}
<!-- --> <!-- -->
<!-- order-info --> <!-- order-info -->
{% include 'order_info.html' %} {% include 'order_info.html' %}
<!-- --> <!-- -->
</div>
</div> </div>
</div> </div>
<!-- End block (chat order block) --> <!-- End block (chat order block) -->
@ -291,6 +411,8 @@
var port = '{{ request.META.SERVER_PORT }}'; var port = '{{ request.META.SERVER_PORT }}';
</script> </script>
<script type="text/javascript" src='{% static "js/chat.js" %}'></script> <script src='{% static "js/build/chat_customer_oop.js" %}'></script>
<script type="text/javascript" src='{% static "js/chat_customer.js" %}'></script> {# <script type="text/javascript" src='{% static "js/chat.js" %}'></script>#}
<script src='{% static "js/jquery.mask.min.js" %}'></script>
{# <script type="text/javascript" src='{% static "js/chat_customer.js" %}'></script>#}
{% endblock %} {% endblock %}

@ -52,8 +52,9 @@
</p> </p>
<a href="#" data-id="{{ contact.id }}" class="conMess">Контакты</a> <a href="#" data-id="{{ contact.id }}" class="conMess">Контакты</a>
<span class="contact-count-{{ contact.pk|add:request.user.pk }}"> <span class="js-count contact-count-{{ contact.id }}">
{% get_new_count_for_contact contact request.user %}</span> {% get_new_count_for_contact contact request.user %}
</span>
<a href="#" class="deleteMess" data-recipent-id="{{ contact.pk }}"> <a href="#" class="deleteMess" data-recipent-id="{{ contact.pk }}">
Удалить контакт Удалить контакт
</a> </a>

@ -0,0 +1,50 @@
<p>Прикрепленные документы</p>
<ul id="{{ class }}"></ul>
<div style="text-align: center">
<a class="docs-more js-more" style="display: none"></a>
</div>
<div style="margin-left: -27px; margin-right: -27px;">
<a href="{% url 'common:create' %}"
class="chat-button icon-print"
style="padding: 25px 10px"
>Распечатать с помощью ресурса</a>
</div>
<script>
document.addEventListener('DOMContentLoaded', function () {
var $documents_container = $('#' + '{{ class }}');
var $more = $documents_container.parent().find('.js-more');
{# console.log("more -->", $more);#}
$documents_container.bind('DOMSubtreeModified', function (e) {
{# console.log('Documents container change!!!');#}
var $elements = $documents_container.children('li');
var num_elements = $elements.length;
if (num_elements > 2) {
$more.show();
console.log("more class = ", $more.attr('class'));
if ($more.hasClass('docs-more')) {
$elements.slice(0, 2).show();
$elements.slice(2).hide();
}
} else {
$elements.show();
$more.hide();
}
});
$more.on('click', function (e) {
e.preventDefault();
var $elements = $documents_container.children('li');
if ($more.hasClass('docs-more')) {
$elements.show();
$more.removeClass('docs-more');
$more.addClass('docs-less');
} else {
$elements.slice(0, 2).show();
$elements.slice(2).hide();
$more.removeClass('docs-less');
$more.addClass('docs-more');
}
{# $more.toggleClass('docs-more', 'docs-less')#}
})
})
</script>

@ -0,0 +1,47 @@
{% load user_tags %}
<div class="orderBlock box-sizing order-block" data-team-id="
{% if order.team %}{{ order.team.pk }}{% else %}0{% endif %}"
data-project-id="{{ order.project.id }}"
id="orderBlock{{ order.id }}"
{% if request.user.is_contractor %}
data-recipent-id="{{ order.project.customer.pk }}"
{% else %}
{% if order.contractor %}
data-recipent-id="{{ order.contractor.pk }}"
{% else %}
data-recipent-id="{{ order.team.owner.pk }}"
{% endif %}
{% endif %}
data-id="{{ order.id }}"
data-secure-deal="{% if order.secure %}true{% else %}false{% endif %}"
data-order-name="{{ order.project.name }}">
<span class="dimovChat"></span>
<div class="titleOB mod-align-center">
{{ order }}
<span class="js-count count-order" id="count-order-{{ order.id }}">
{% get_new_count_for_order request.user order.id %}
</span>
{% if order.secure %}
<span class="icon-protect"></span>
{% endif %}
</div>
<div class="hideOBB">
<p class="pOB">
{# <span style="display: none;"#}
{# class="order-count-{{ order.id }}">{% get_new_count_for_order request.user order.id %}#}
{# </span>#}
<span>Исполнитель:</span>
{% if order.contractor %}
{{ order.contractor.get_full_name }}
{% else %}
{{ order.team.name }}
{% endif %}
</p>
<a href="#" class="linkChat11 full-order-info">
<span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span>
Полное описание заказа
</a>
</div>
</div>

@ -0,0 +1,61 @@
{% load user_tags %}
<div class="team-block orderBlock box-sizing" id="teamMyBlock{{ yteam.pk }}"
data-team-id="{{ yteam.pk }}">
<span class="dimovChat"></span>
<div class="titleOB mod-align-center">
<div class="max-rows" style="display: inline-block">
{{ yteam }} {% if yteam.owner.pk == request.user.pk %}
[<a href="{% url 'users:team-profile' pk=yteam.pk %}">Моя группа</a>] {% endif %}
</div>
<div class="mod-align-center-inline">
<span class="js-count count-order" id="count-team-{{ yteam.pk }}">{% get_new_count_for_team request.user yteam.id %}</span>
{% if yteam.orders.count > 0 %}<span class="icon-hand"></span> {% endif %}
</div>
</div>
<div class="hideOBB disTab">
<div class="pOB">
{# <span style="display: none;"#}
{# class="team-count-{{ yteam.id }}">#}
{# {% get_new_count_for_team request.user yteam.id %}#}
{# </span>#}
<span>Владелец группы:</span> [{{ yteam.owner.username }}]
</div>
<div class="pDB">
<div>
<strong>Всего участников в группе</strong> <span class="select">{{ yteam.contractors.count }}</span>
</div>
<div>
{# //FIXME: Изменить Участники группы --> Сейчас на сайте#}
{# <strong>Сейчас на сайте:</strong>#}
<strong>Участники группы:</strong>
<div class="team-user-list" id="team-users-online">
{# user-1, user-2, user-3, user-4, user-5, user-6, user-7, user-8, user-9,#}
{# user-1, user-2, user-3, user-4, user-5, user-6, user-7, user-8, user-9,#}
{# user-1, user-2, user-3, user-4, user-5, user-6, user-7, user-8, user-9,#}
{# user-1, user-2, user-3, user-4, user-5, user-6, user-7, user-8, user-9,#}
{% for tuser in yteam.contractors.all %}
<a href="{% url 'users:contractor-profile' pk=tuser.pk %}">{{ tuser.username }}</a>
{% endfor %}
</div>
</div>
<div>
<strong>Заказов от имени группы</strong> <span class="select">{{ yteam.orders.count }}</span>
</div>
</div>
<p style="display: none;">
{% if request.user.pk != torder.team.owner.pk %}
<span class="team-chat-user"
data-id="{{ yteam.owner.pk }}">{{ yteam.owner.username }}</span>
{% endif %}
{% for tuser in yteam.contractors.all %}
{% if request.user.pk != tuser.pk %}
<span class="team-chat-user"
data-id="{{ tuser.pk }}">{{ tuser.username }} </span>
{% endif %}
{% endfor %}
</p>
</div>
</div>

@ -0,0 +1,156 @@
<script>
var socket;
function getOpenOrdersList() {
$.ajax({
url: '/api/orders?status=created',
type: 'get',
success: function (data) {
$.each(data.results, function (key, value) {
open_order_list.push(parseInt(value.id))
})
}
})
}
function message_count_plus() {
console.log('Message +1');
var all_messages = $('.js-all-messages');
var count = parseInt(all_messages.html()) + 1;
if (count > 99) count = '99+';
all_messages.html(count);
}
var wsConnect;
function WSConnection() {
'use strict';
this.socket = {};
}
WSConnection.prototype.connect = function (url) {
'use strict';
return new Promise((resolve, reject) => {
var self = this;
this.socket = new WebSocket(url);
// Пользователь на странице Чата(Переговорная)
var inChatPage = true;
this.socket.onopen = function () {
print.ws_print('Socket open');
resolve(this);
try {
connect();
} catch (ReferenceError) {
print.ws_print('No additional WS connect');
inChatPage = false;
}
};
this.socket.onmessage = function (event) {
print.ws_print("New message: " + JSON.parse(event.data));
var notificationData = JSON.parse(event.data);
{# if (open_order_list.indexOf(parseInt(notificationData.order_id)) != -1) {#}
{# message_count_plus('#my_office');#}
{# }#}
{# message_count_plus('.js-all-messages');#}
var outMessage = "";
if (notificationData.answer_type == 'add_message_contact') {
outMessage += "<a href='/chat/?user_id=" + notificationData.sender_id + "'>" + notificationData.msg + "<a>";
} else if ((notificationData.answer_type == 'approve_stages') || (notificationData.answer_type == 'add_message_order')) {
outMessage += "<a href='/chat/#order" + notificationData.order_id + "'>" + notificationData.msg + "<a>";
}
if (!inChatPage) message_count_plus();
print.ws_print("Вам пришло новое сообщение!", outMessage);
if (userId != notificationData.sender_id) {
$.jGrowl("Вам пришло новое сообщение!<br />" + outMessage, {life: 15000});
}
};
this.socket.add_message = function (messageData) {
print.ws_print("add Message");
self.socket.send(JSON.stringify(messageData))
};
this.socket.onerror = function (error) {
print.ws_print('Error: ' + error);
reject(error);
};
this.socket.onclose = function (event) {
print.ws_print("Websocket closed: " + JSON.stringify(event));
// TODO: Сдеалть реконнект#}
setTimeout(function () {
console.log("reconnect to WS");
wsConnect = new WSConnection().connect(url);
}, 2000);
};
});
};
{# var SocketHandlerMain = function (userId) {#}
{# var domain = '{{ request.META.HTTP_HOST }}';#}
{# var port = '{{ request.META.SERVER_PORT }}';#}
{# var queryString = '{{ request.get_full_path }}';#}
{##}
{# if ((queryString.indexOf('/chat') != 0) && (queryString.indexOf('/users/contractor-office/work-projects') != 0)) {#}
{# domain = domain.replace(':' + port, ':8888');#}
{# if (window.location.protocol == 'https:') {#}
{# var ws = "wss://";#}
{# } else {#}
{# var ws = "ws://";#}
{# }#}
{##}
{# var url = ws + domain + '/chat/' + userId + '/';#}
{# var sock = new WebSocket(url);#}
{# sock.onopen = function () {#}
{# print.ws_print('Socket open');#}
{# };#}
{##}
{# sock.onmessage = function (event) {#}
{# var notificationData = JSON.parse(event.data);#}
{# if (open_order_list.indexOf(parseInt(notificationData.order_id)) != -1) {#}
{# message_count_plus('#my_office');#}
{# }#}
{# message_count_plus('.js-all-messages');#}
{# var outMessage = "";#}
{# if (notificationData.answer_type == 'add_message_contact') {#}
{# outMessage += "<a href='/chat/?user_id=" + notificationData.sender_id + "'>" + notificationData.msg + "<a>";#}
{# } else if ((notificationData.answer_type == 'approve_stages') || (notificationData.answer_type == 'add_message_order')) {#}
{# outMessage += "<a href='/chat/#order" + notificationData.order_id + "'>" + notificationData.msg + "<a>";#}
{# }#}
{# print.ws_print("Вам пришло новое сообщение!", outMessage);#}
{# $.jGrowl("Вам пришло новое сообщение!<br />" + outMessage, {life: 15000});#}
{# };#}
{##}
{# this.send_message = function (messageData) {#}
{# print.ws_print("send message", messageData);#}
{# sock.send(JSON.stringify(messageData));#}
{# };#}
{# }#}
{# };#}
var userId = '{{ request.user.pk }}';
if (userId) {
var domain = '{{ request.META.HTTP_HOST }}';
var port = '{{ request.META.SERVER_PORT }}';
domain = domain.replace(':' + port, ':8888');
if (window.location.protocol == 'https:') {
var ws = "wss://";
} else {
var ws = "ws://";
}
var url = ws + domain + '/chat/' + userId + '/';
$(function () {
console.log('Create WS connection');
wsConnect = new WSConnection().connect(url);
wsConnect.then(function (_socket) {
socket = _socket;
})
});
{# var open_order_list = [];#}
{# getOpenOrdersList();#}
}
</script>

@ -6,64 +6,56 @@
<h4 class="modal-title">Зарезервировать средства</h4> <h4 class="modal-title">Зарезервировать средства</h4>
</div> </div>
<div class="modal-body" style="height: 300px;"> <div class="modal-body" style="min-height: 200px; margin-bottom: 30px">
<div class="row">
<div class="searchF1 polsF1 polsFF radio-afer" id="allOrderchoice">
<div class="col-lg-6"> <div class="col-lg-6">
<label> <label class="mod-align-center header">
<input data-stages-ids="" type="radio" checked="checked" id="choiceWayOrder"name="choice_way" value=""> <input name="choice_way" class="custom-radio" type="radio" checked="checked"
<span></span> value="all_stages">&nbsp;&nbsp;&nbsp;
<strong>Зарезервировать средства за все этапы</strong>
</label> </label>
<p class="text-afer">Сумма оплаты всего заказа</p>
<p class="des-afer">
Общий бюджет заказа: <span class="totalSum" id="totalSum"></span>р. <br />
Итого к оплате: <span class="totalSum"></span> р.
</p>
</div>
</div>
<div class="searchF1 polsF1 polsFF radio-afer"> <div class="description" style="padding-left: 30px">
<div class="col-lg-6"> Общий бюджет за все этапы <span id="total-cost">0</span>р.
<label> </div>
<input type="radio" name="choice_way" id="choiceWayStage" value="">
<span></span>
</label>
<p class="text-afer" style="width: 250px;">Оплатить этап</p><br />
<p class="des-afer">
Бюджет Этапа: <span class="stageSum"></span>р.<br />
Итого к оплате: <span class="stageSum"></span> р.
</p>
</div> </div>
<div class="col-lg-6"> <div class="col-lg-6">
<select id="stagesSelect"> <label class="mod-align-center header">
</select> <input name="choice_way" class="custom-radio" type="radio" value="stage-">
&nbsp;&nbsp;&nbsp;
<strong>Зарезервировать средства за этап</strong> &nbsp;&nbsp;
<select id="stage-num">
</select>
</label>
<div class="description" style="padding-left: 30px">
Бюджет этапа <span id="stage-cost">0</span>р.
</div>
</div> </div>
</div> </div>
<div class="searchF1 polsF1 polsFF radio-afe" style="padding-top: 20px;padding-left: 50px;">
<p class="titleStepss">Резервирование средств</p>
<form id="stages-pay-form" action="{{ YANDEX_MONEY.url }}" method="POST">{% csrf_token %}
<div> <div class="searchF1 polsF1 polsFF radio-afe" style="text-align: center;">
<div class="textAreaBlock2 text-nn box-sizing disTab"> <form id="stages-pay-form" action="{{ YANDEX_MONEY.url }}" method="POST">{% csrf_token %}
<input type="hidden" name="sum" id="stageSumPay"> <div class="textAreaBlock2 text-nn box-sizing disTab">
<input type='hidden' name='shopId' value='{{ YANDEX_MONEY.shop_id }}'> <input type="hidden" name="sum" id="stageSumPay">
<input type='hidden' name='scid' value='{{ YANDEX_MONEY.scid }}'> <input type='hidden' name='shopId' value='{{ YANDEX_MONEY.shop_id }}'>
<input type='hidden' name='customerNumber' value='{{ user_score.pk }}'> <input type='hidden' name='scid' value='{{ YANDEX_MONEY.scid }}'>
<input type='hidden' name='paymentType' value='AC'> <input type='hidden' name='customerNumber' value='{{ user_score.pk }}'>
<input type='hidden' name='transactionId' value='{{ transaction.pk }}'> <input type='hidden' name='paymentType' value='AC'>
<input type='hidden' name='stagesId' id='stagesIds' value=''> <input type='hidden' name='transactionId' value='{{ transaction.pk }}'>
<input type='hidden' name='ordermodalId' id='ordermodalId'> <input type='hidden' name='stagesId' id='stagesIds' value=''>
</div> <input type='hidden' name='ordermodalId' id='ordermodalId'>
<button type="submit" class="btn btn-primary btn-lg btn-block linkS122">Пополнить</button> </div>
</div> <button type="submit" class="btn btn-primary btn-lg btn-block linkS122"
style="display: inline-block">
БАНКОВСКАЯ КАРТА
</button>
</form> </form>
<button id="paymentfromSite" class="btn btn-primary"
style="display: inline-block; margin-bottom: 40px">
<button id="paymentfromSite" class="btn btn-primary" >Пополнить с сайта</button> СЧЕТ на "PROEKTON"
</button>
</div> </div>

@ -11,20 +11,26 @@
<form id="review-adds-form" method="POST"> <form id="review-adds-form" method="POST">
<div class="modal-body"> <div class="modal-body">
<div style="height: 250px;"> <div style="height: 250px;">
{# <div class="searchF1 polsF1 polsFF radio-afer">#} {# <div class="searchF1 polsF1 polsFF radio-afer">#}
<div> <div class="review-type">
<input style="opacity: 1;" type="radio" value="positive" <label class="alignleft mod-align-center">
name="type">Положительный <input style="margin: 0 5px" type="radio" value="positive" name="type" checked>
Положительный
</label>
<input style="opacity: 1;" type="radio" value="negative" <label class="aligncenter mod-align-center">
name="type">Отрицательный <input style="margin: 0 5px" type="radio" value="neutral" name="type">
Нейтральный
</label>
<input style="opacity: 1;" type="radio" value="neutral" <label class="alignright mod-align-center-inline">
name="type">Нейтральный <input style="margin: 0 5px" type="radio" value="negative" name="type">
Отрицательный
</label>
</div> </div>
<div class="textAreaBlock2 text-nn box-sizing disTab"> <div class="textAreaBlock2 text-nn box-sizing disTab">
<p>Ваш отзыв</p> <p>Ваш отзыв</p>
<textarea id="text-new" name="text"></textarea> <textarea id="text-new" name="text"></textarea>
{% if request.user.is_customer %} {% if request.user.is_customer %}
<input type="hidden" name="from_customer" value="{{ request.user.pk }}"> <input type="hidden" name="from_customer" value="{{ request.user.pk }}">
@ -35,7 +41,7 @@
<input type="hidden" name="target_team" id="targetTeamId"> <input type="hidden" name="target_team" id="targetTeamId">
{% else %} {% else %}
<input type="hidden" name="from_customer"> <input type="hidden" name="from_customer">
<input type="hidden" name="from_contractor" id="fromContractorId"> <input type="hidden" name="from_contractor" value="{{ request.user.pk }}">
<input type="hidden" name="target_customer" id="targetCustomerId"> <input type="hidden" name="target_customer" id="targetCustomerId">
<input type="hidden" name="target_contractor"> <input type="hidden" name="target_contractor">
<input type="hidden" name="target_team"> <input type="hidden" name="target_team">

@ -57,10 +57,15 @@ class ChatUserView(LoginRequiredMixin, View):
contacts_users = User.objects.filter(pk__in=users_ids) contacts_users = User.objects.filter(pk__in=users_ids)
archive_projects = request.user.customer_projects.select_related('order').exclude(state='active') archive_projects = request.user.customer_projects.select_related('order').exclude(state='active')
chat_messages = Message.objects.filter(Q(sender=request.user.pk) | Q(recipent=request.user.pk)) print("archive_projects = ", archive_projects)
orders = request.user.customer_projects.select_related('order').filter(state='active').exclude( # chat_messages = Message.objects.filter(Q(sender=request.user.pk) | Q(recipent=request.user.pk))
# projects
projects = request.user.customer_projects.select_related('order').filter(state='active').exclude(
order__contractor__isnull=True, order__team__isnull=True) order__contractor__isnull=True, order__team__isnull=True)
order_ids = [order.order.pk for order in orders] print("projects = ", projects)
orders = [project.order for project in projects]
print("orders = ", orders)
order_ids = [order.pk for order in orders]
transaction = Transaction.objects.get_or_create(customer=request.user, type='reservation', complete=False) transaction = Transaction.objects.get_or_create(customer=request.user, type='reservation', complete=False)
contacts_users_count = request.user.new_messages.filter(message__sender__in=users_ids, contacts_users_count = request.user.new_messages.filter(message__sender__in=users_ids,
@ -72,7 +77,7 @@ class ChatUserView(LoginRequiredMixin, View):
message__team__isnull=True).count() message__team__isnull=True).count()
self.template_name = 'chat_customer.html' self.template_name = 'chat_customer.html'
return render(request, self.template_name, {'contacts_users': contacts_users, return render(request, self.template_name, {'contacts_users': contacts_users,
'chat_messages': chat_messages, # 'chat_messages': chat_messages,
'contacts_users_count': contacts_users_count, 'contacts_users_count': contacts_users_count,
'orders_ms_count': orders_ms_count, 'orders_ms_count': orders_ms_count,
'archive_projects': archive_projects, 'archive_projects': archive_projects,
@ -81,6 +86,7 @@ class ChatUserView(LoginRequiredMixin, View):
'YANDEX_MONEY': settings.YANDEX_MONEY, 'YANDEX_MONEY': settings.YANDEX_MONEY,
}) })
else: else:
# contractor
team_ids = [] team_ids = []
if request.user.is_owner_team(): if request.user.is_owner_team():
team_ids.append(request.user.team.pk) team_ids.append(request.user.team.pk)

@ -1,6 +1,6 @@
{ {
"name": "components", "name": "proekton",
"version": "0.0.3", "version": "0.0.4",
"description": "curl http://nodejs.org/dist/node-latest.tar.gz | tar xvz cd node-v* python2 ./configure --prefix=~/venv/proekton/(or $VIRTUAL_ENV) make install", "description": "curl http://nodejs.org/dist/node-latest.tar.gz | tar xvz cd node-v* python2 ./configure --prefix=~/venv/proekton/(or $VIRTUAL_ENV) make install",
"main": "init.js", "main": "init.js",
"author": "Booblegum", "author": "Booblegum",
@ -10,6 +10,14 @@
"babel-loader": "^6.2.8", "babel-loader": "^6.2.8",
"babel-plugin-transform-decorators-legacy": "^1.3.4", "babel-plugin-transform-decorators-legacy": "^1.3.4",
"babel-preset-es2015": "^6.18.0", "babel-preset-es2015": "^6.18.0",
"css-loader": "^0.26.0",
"es6-template-string-loader": "^1.0.0",
"extract-text-webpack-plugin": "^1.0.1",
"file-loader": "^0.9.0",
"node-sass": "^3.13.0",
"resolve-url-loader": "^1.6.0",
"sass-loader": "^4.0.2",
"style-loader": "^0.13.1",
"webpack": "^1.13.3" "webpack": "^1.13.3"
} }
} }

@ -6,4 +6,4 @@ class ProjectsConfig(AppConfig):
name = 'projects' name = 'projects'
def ready(self): def ready(self):
pass import projects.signals

@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.7 on 2017-01-31 13:09
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('projects', '0053_portfolio_specializations'),
]
operations = [
migrations.AlterField(
model_name='stage',
name='status',
field=models.CharField(choices=[('not_agreed', 'Не согласован'), ('send_approve', 'На согласовании'), ('agreed', 'Согласовано'), ('cancel_approve', 'Исполнитель отказался'), ('in_process', 'В процессе'), ('completed', 'Завершен'), ('closed', 'Закрыт')], default='not_agreed', max_length=30),
),
]

@ -296,9 +296,11 @@ class Arbitration(models.Model):
STATUSES = ( STATUSES = (
('not_agreed', 'Не согласован'), ('not_agreed', 'Не согласован'),
('send_approve', 'На согласовании'), ('send_approve', 'На согласовании'),
('agreed', 'Согласовано'),
('cancel_approve', 'Исполнитель отказался'), ('cancel_approve', 'Исполнитель отказался'),
('in_process', 'В процессе'), ('in_process', 'В процессе'),
('completed', 'Завершен'), ('completed', 'Завершен'), # Завершен исполнителем
('closed', 'Закрыт'), # Закрыт(Подтвержден) заказчиком
) )
@ -315,6 +317,7 @@ class Stage(models.Model):
approve_time = models.DateTimeField(null=True, blank=True) approve_time = models.DateTimeField(null=True, blank=True)
pos = models.IntegerField(default=0, null=True, blank=True) pos = models.IntegerField(default=0, null=True, blank=True)
is_paid = models.BooleanField(default=False) is_paid = models.BooleanField(default=False)
# @deprecated
close_contractor = models.BooleanField(default=False) close_contractor = models.BooleanField(default=False)
close_customer = models.BooleanField(default=False) close_customer = models.BooleanField(default=False)

@ -1,6 +1,6 @@
from generic_relations.relations import GenericRelatedField from generic_relations.relations import GenericRelatedField
from rest_framework import serializers from rest_framework import serializers
from rest_framework.serializers import ModelSerializer, ImageField, FileField, PrimaryKeyRelatedField from rest_framework.serializers import ModelSerializer, ImageField, FileField, PrimaryKeyRelatedField, ListSerializer
from common.serializers import LocationSerializer, ContentTypeSerializer from common.serializers import LocationSerializer, ContentTypeSerializer
from specializations.serializers import SpecializationSerializer from specializations.serializers import SpecializationSerializer
@ -101,6 +101,33 @@ class RealtySerializer(ModelSerializer):
) )
class StageListSerializer(ListSerializer):
def update(self, instance, validated_data):
# Maps for id->instance and id->data item.
# print("instance = ", instance)
# print("validated_data = ", validated_data)
obj_mapping = {obj.id: obj for obj in instance}
data_mapping = {item['id']: item for item in validated_data}
# Perform creations and updates.
# print("obj_mapping = ", obj_mapping)
# print("data_mapping = ", data_mapping)
ret = []
for obj_id, data in data_mapping.items():
obj = obj_mapping.get(obj_id, None)
if obj is None:
ret.append(self.child.create(data))
else:
ret.append(self.child.update(obj, data))
# Perform deletions.
for obj_id, obj in obj_mapping.items():
if obj_id not in data_mapping:
obj.delete()
return ret
class StageSerializer(ModelSerializer): class StageSerializer(ModelSerializer):
term = serializers.DateField(format="%d.%m.%Y", input_formats=['%d.%m.%Y', ]) term = serializers.DateField(format="%d.%m.%Y", input_formats=['%d.%m.%Y', ])
@ -134,6 +161,8 @@ class StageSerializer(ModelSerializer):
) )
list_serializer_class = StageListSerializer
class OrderSerializer_(ModelSerializer): class OrderSerializer_(ModelSerializer):
contractor = UserSerializer() contractor = UserSerializer()
@ -257,6 +286,7 @@ class OrderSerializer(ModelSerializer):
return 'Исполнитель не определен' 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():
return curr_user.customer_reviews.filter(project=obj.project).exists() return curr_user.customer_reviews.filter(project=obj.project).exists()

@ -7,6 +7,6 @@ from .models import Stage, Order
@receiver(post_save, sender=Stage) @receiver(post_save, sender=Stage)
def set_approve_time(sender, instance, created, **kwargs): def set_approve_time(sender, instance, created, **kwargs):
if instance.status == 'in_process' and not instance.approve_time: if instance.status == 'agreed' and not instance.approve_time:
instance.approve_time = timezone.now() instance.approve_time = timezone.now()
instance.save() instance.save()

@ -1292,14 +1292,15 @@
var msg = 'Вас выбрали исполнителем для заказа '; var msg = 'Вас выбрали исполнителем для заказа ';
socketMain.add_message({ socket.add_message({
format_type: 'add_message_contact', format_type: 'add_message_contact',
message_type: 'offer_order', message_type: 'offer_order',
data: { data: {
sender_id: String(senderId), sender_id: String(senderId),
recipent_id: String(recipentId), recipent_id: String(recipentId),
order_id: String(orderId), order_id: String(orderId),
chat_message: msg chat_message: msg,
is_system: true
} }
}); });
@ -1314,7 +1315,7 @@
var msg = 'Вам отказано по проекту " ' + $(this).attr("data-order-name") + '" <a class="message_connect" href="http://{{ request.get_host }}/projects/' + projectId + '/" >Перейти</a>'; var msg = 'Вам отказано по проекту " ' + $(this).attr("data-order-name") + '" <a class="message_connect" href="http://{{ request.get_host }}/projects/' + projectId + '/" >Перейти</a>';
var customerId = $(this).attr('data-sender-id'); var customerId = $(this).attr('data-sender-id');
var contractorId = $(this).attr('data-recipent-id'); var contractorId = $(this).attr('data-recipent-id');
socketMain.add_message({ socket.add_message({
format_type: 'add_message_contact', format_type: 'add_message_contact',
message_type: 'reject_order', message_type: 'reject_order',
data: { data: {

@ -5,4 +5,4 @@ class ReviewConfig(AppConfig):
name = 'reviews' name = 'reviews'
def ready(self): def ready(self):
pass import reviews.signals

@ -8,6 +8,7 @@ from .models import Review
@receiver(post_save, sender=Review) @receiver(post_save, sender=Review)
def add_rating_review(sender, instance, created, **kwargs): def add_rating_review(sender, instance, created, **kwargs):
hs_rating = HistoryRating() hs_rating = HistoryRating()
print("hs_rating = ", hs_rating)
if instance.target_team: if instance.target_team:
hs_rating.team = instance.target_team hs_rating.team = instance.target_team
elif instance.target_contractor or instance.target_customer: elif instance.target_contractor or instance.target_customer:
@ -23,8 +24,12 @@ def add_rating_review(sender, instance, created, **kwargs):
hs_rating.save() hs_rating.save()
count_reviews = Review.objects.filter(project=instance.project).count() count_reviews = Review.objects.filter(project=instance.project).count()
print("count_reviews = ", count_reviews) print("!!!count_reviews = ", count_reviews)
if count_reviews == 2: if count_reviews == 2:
order = instance.project.order order = instance.project.order
order.status = 'completed' order.status = 'completed'
# order.project.state = 'deleted'
project = order.project
project.state = 'deleted'
project.save()
order.save() order.save()

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save