edited chat_customer

remotes/origin/PR-39
shishman 10 years ago
parent af63f9022b
commit ec96fb1894
  1. 4
      assets/css/bootstrap.css
  2. 39
      assets/css/main.css
  3. 408
      chat/templates/chat_customer.html

@ -3610,13 +3610,13 @@ tbody.collapse.in {
right: 0; right: 0;
left: auto; left: auto;
} }
.dropup .caret, /*.dropup .caret,
.navbar-fixed-bottom .dropdown .caret { .navbar-fixed-bottom .dropdown .caret {
border-top: 0; border-top: 0;
border-bottom: 4px dashed; border-bottom: 4px dashed;
border-bottom: 4px solid \9; border-bottom: 4px solid \9;
content: ""; content: "";
} }*/
.dropup .dropdown-menu, .dropup .dropdown-menu,
.navbar-fixed-bottom .dropdown .dropdown-menu { .navbar-fixed-bottom .dropdown .dropdown-menu {
top: auto; top: auto;

@ -1115,7 +1115,7 @@ footer:after {
} }
.titleF1 { .titleF1 {
margin: 0 0 23px 0; margin: 23px 0 0 0;
} }
.titleF1, .polsF1, .searchF1, .resSearchF1, .sro { .titleF1, .polsF1, .searchF1, .resSearchF1, .sro {
@ -1133,7 +1133,7 @@ footer:after {
.polsF1 .btn-group .btn { .polsF1 .btn-group .btn {
width: 100% !important; width: 100% !important;
padding: 15px 105px 15px 18px; padding: 15px 30px 15px 18px;
border-radius: 0 !important; border-radius: 0 !important;
border: none; border: none;
font-size: 15px; font-size: 15px;
@ -1220,9 +1220,9 @@ footer:after {
margin-bottom: 0; margin-bottom: 0;
} }
.polsF1 .dropdown-menu li:first-child { /*.polsF1 .dropdown-menu li:first-child {
margin-top: -6px; margin-top: -6px;
} }*/
.polsF1 .dropdown-menu li:last-child { .polsF1 .dropdown-menu li:last-child {
margin-bottom: 2px; margin-bottom: 2px;
@ -5441,7 +5441,7 @@ input[type="radio"]:checked + span {
position: absolute; position: absolute;
font-family: 'Glyphicons Halflings'; font-family: 'Glyphicons Halflings';
right: -6.5px; right: -6.5px;
top: -21px; top: -19px;
font-size: 12px; font-size: 12px;
} }
@ -5600,7 +5600,12 @@ input[type="radio"]:checked + span {
background-color: white; background-color: white;
} }
.select2-container .select2-choice .select2-arrow{ .select2-container .select2-choice .select2-arrow{
display: none; background: #fff;
border: none;
}
.select2-container .select2-choice .select2-arrow b{
position: relative;
top: 9px;
} }
.select2-container .select2-choice > .select2-chosen { .select2-container .select2-choice > .select2-chosen {
margin-right: 6px; margin-right: 6px;
@ -5676,4 +5681,26 @@ input[type="radio"]:checked + span {
.progress-bar-success { .progress-bar-success {
background-color: #c2c2c2; background-color: #c2c2c2;
} }
.bootstrap-select.btn-group .dropdown-menu li {
position: relative;
float: left;
width: 100%;
}
#order-stages label{
margin-bottom: 0;
margin-top: 8px;
}
#order-stages .checkbox label{
margin-top: 0;
}
#order-stages > div {
display: table;
width: 100%;
padding-bottom: 14px;
border-bottom: 1px solid #2c2c2c;
margin-bottom: 14px;
}
#order-stages > div:nth-last-child(2), #order-stages > div:last-child{
border: none;
}
/*end_new*/ /*end_new*/

@ -24,7 +24,7 @@
</div> </div>
</div> </div>
<div class="tab-content"> <div class="tab-content">
<!-- Tab1 (contacts block)--> <!-- Tab1 (contacts block)-->
<div class="chatBlock disTab tab-pane fade in active" id="tab1"> <div class="chatBlock disTab tab-pane fade in active" id="tab1">
<div class="col-lg-3 wrMessages"> <div class="col-lg-3 wrMessages">
<div class="messageBlock box-sizing disTab"> <div class="messageBlock box-sizing disTab">
@ -32,14 +32,21 @@
{% for contact in contacts_users %} {% for contact in contacts_users %}
<div class="message messd user-block" data-id="{{ contact.pk }}"> <div class="message messd user-block" data-id="{{ contact.pk }}">
<div class="imgMess"> <div class="imgMess">
{% thumbnail contact.avatar "60x60" crop="center" as im %} {% if contact.avatar %}
<img src="{{ im.url }}" alt="mess-image"> {% thumbnail contact.avatar "60x60" crop="center" as im %}
{% endthumbnail %} <img src="{{ im.url }}" alt="mess-image">
{% endthumbnail %}
{% else %}
<img src="{% static 'img/profile.jpg' %}" alt="mess-image">
{% endif %}
</div> </div>
<p class="nameMess"> <p class="nameMess">
<a href="#">{{ contact.username }} {{ contact.username }}</a> <div><a href="#">{{ contact.username }}</a></div>
</p> </p>
<a href="javascript:void(0)" class="conMess">Контакты</a>
<a href="#" data-target="#userModal" data-toggle="modal"
class="conMess">Контакты</a>
<span>0</span> <span>0</span>
<a href="javascript:void(0)" class="deleteMess"> <a href="javascript:void(0)" class="deleteMess">
Удалить контакт Удалить контакт
@ -49,6 +56,20 @@
</div> </div>
</div> </div>
<div class="modal fade" id="userModal" tabindex="-1" role="dialog">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button class="close" type="button" data-dismiss="modal">x</button>
<h4 class="modal-title" id="myModalLabel">Название модального
окна</h4>
</div>
<div class="modal-body">
<h3>Содержимое модального окна</h3>
</div>
</div>
</div>
</div>
<div class="col-lg-6 commChat" id="contact-chat"> <div class="col-lg-6 commChat" id="contact-chat">
<div id="message-chat-space"> <div id="message-chat-space">
</div> </div>
@ -60,9 +81,9 @@
<div class="bunChat"> <div class="bunChat">
<div class="setChat box-sizing"> <div class="setChat box-sizing">
<p>Прикрепить файл</p> <p>Прикрепить файл</p>
<span> <span>
Не более 10 файлов с общим объемом 500мб Не более 10 файлов с общим объемом 500мб
</span> </span>
</div> </div>
<a id="contact-chat-add-message" href="javascript:void(0)">отправить</a> <a id="contact-chat-add-message" href="javascript:void(0)">отправить</a>
@ -79,9 +100,9 @@
</div> </div>
</div> </div>
</div> </div>
<!-- End block Tab1(contacts block)--> <!-- End block Tab1(contacts block)-->
<!-- 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="col-lg-3 wrMessages">
<div class="messageBlock box-sizing disTab"> <div class="messageBlock box-sizing disTab">
@ -117,9 +138,9 @@
<div class="bunChat"> <div class="bunChat">
<div class="setChat box-sizing"> <div class="setChat box-sizing">
<p>Прикрепить файл</p> <p>Прикрепить файл</p>
<span> <span>
Не более 10 файлов с общим объемом 500мб Не более 10 файлов с общим объемом 500мб
</span> </span>
</div> </div>
<a href="javascript:void(0)" id="order-chat-add-message">отправить</a> <a href="javascript:void(0)" id="order-chat-add-message">отправить</a>
</div> </div>
@ -136,79 +157,51 @@
</p> </p>
</div> </div>
{# <div class="stepssBlock box-sizing disTab">#} <div id="order-stages" class="stepssBlock"></div>
{# <p class="textStepss">#}
{# Какое кол-во этапов подразумевает работа? <input type="text" id="countStage" size="3"/>#}
{# </p>#}
{# <div id="formsetStage" class="numberStepp box-sizing" style="display: none;">#}
{# <div class="insetNumStepp" id="stage1">#}
{# <p class="titleNumStepp">#}
{# <span>Этап </span>#}
{# </p>#}
{# <div class="textAreaBlock2 box-sizing disTab">#}
{# <form class="new-stages-form">#}
{# <label>Название</label>#}
{# <input type="text" name="name" />#}
{# <label>Результат</label>#}
{# <input type="text" name="result" />#}
{# <label>Стоимость</label>#}
{# <input type="text" name="cost" />#}
{# <input type="hidden" name="order" class="orderStagesInput"/>#}
{# </form>#}
{# </div>#}
{# </div>#}
{##}
{# </div>#}
{##}
{# </div>#}
{# <div class="textAreaBlock2 FFD box-sizing disTab">#}
{# <a href="javascript:void()">согласовать</a>#}
{# </div>#}
<div id="order-stages"></div>
<div class="stepssBlock box-sizing disTab"> <div class="stepssBlock box-sizing disTab">
<p class="titleStepss">2 / Резервирование</p> <p class="titleStepss">2 / Резервирование</p>
<p class="textStepss"> <p class="textStepss">
Резервирование заказчиком суммы оплаты по заказ. Деньги перечисляются и хранятся на сайте. Резервирование заказчиком суммы оплаты по заказ. Деньги перечисляются и хранятся на
</p> сайте.
</p>
<div class="textAreaBlock2 FFD box-sizing disTab"> <div class="textAreaBlock2 FFD box-sizing disTab">
<a href="#" data-toggle="modal" data-target="#reserve-stage-modal">Зарезирвировать</a> <a href="#" data-toggle="modal" data-target="#reserve-stage-modal">Зарезирвировать</a>
</div> </div>
</div> </div>
<!-- Зарезервировать средства (модальное окно)--> <!-- Зарезервировать средства (модальное окно)-->
<div id="reserve-stage-modal" class="modal fade"> <div id="reserve-stage-modal" class="modal fade">
<div class="modal-dialog" style="width:900px;"> <div class="modal-dialog" style="width:900px;">
<div class="modal-content"> <div class="modal-content">
<div class="modal-header"> <div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×
<h4 class="modal-title">Зарезервировать средства</h4> </button>
</div> <h4 class="modal-title">Зарезервировать средства</h4>
</div>
<div class="modal-body"> <div class="modal-body">
<div class="textAreaBlock2 text-nn box-sizing disTab"> <div class="textAreaBlock2 text-nn box-sizing disTab">
</div> </div>
<div class="searchF1 polsF1 polsFF links-filter"> <div class="searchF1 polsF1 polsFF links-filter">
<input class="btn-submit-link" type="submit" value="Сохранить"> <input class="btn-submit-link" type="submit" value="Сохранить">
</div>
</div>
<div class="modal-footer"></div>
</div> </div>
</div> </div>
<div class="modal-footer"></div>
</div> </div>
<!-- Конец блока --> </div>
</div>
<!-- Конец блока -->
<div class="stepssBlock box-sizing disTab"> <div class="stepssBlock box-sizing disTab">
<p class="titleStepss">3 / Выполнение работы</p> <p class="titleStepss">3 / Выполнение работы</p>
<p class="textStepss"> <p class="textStepss">
Процесс выполнения задания в заказе до получения заказчиком итогового результата работы. Процесс выполнения задания в заказе до получения заказчиком итогового результата работы.
</p> </p>
</div> </div>
<div class="textAreaBlock2 box-sizing disTab"> <div class="textAreaBlock2 box-sizing disTab">
@ -216,13 +209,75 @@
<textarea id="chat2"></textarea> <textarea id="chat2"></textarea>
<a href="javascript:void()">сохранить</a> <a href="javascript:void()">сохранить</a>
</div> </div>
<div class="linkChatB box-sizing disTab">
<a href="javascript:void(0)">предложить проект</a>
<div class="closeChat closeChat1">
<a href="#" data-toggle="modal" data-target="#review-add">
Закрыть проект<br>и оставить отзыв
</a>
</div> </div>
<!-- Review add -->
<div id="review-add" class="modal fade" role="dialog">
<div class="modal-dialog" role="document" style="width:900px;">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×
</button>
<h4 class="modal-title">Оставить отзыв</h4>
</div>
<form id="review-adds-form" method="POST">{% csrf_token %}
<div class="modal-body">
<div style="height: 250px;">
<div class="text-nn box-sizing disTab">
<input type="radio" value="positive"
name="type">Положительный
<input type="radio" value="negative"
name="type">Отрицательный
<input type="radio" value="neutral"
name="type">Нейтральный
</div>
<div class="textAreaBlock2 text-nn box-sizing disTab">
<textarea cols="40" name="text" rows="10"></textarea>
<input type="hidden" name="from_customer"
value="{{ request.user.pk }}"/>
<input type="hidden" name="target_contractor"
id="targetContractorId"/>
<input type="hidden" name="project" id="projectReviewId"/>
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Закрыть
</button>
<button type="submit" id="order-review-add" class="btn btn-primary">Оставить
отзыв
</button>
</div>
</form>
</div>
</div>
</div>
<!-- -->
</div> </div>
</div> </div>
<!-- End block (chat order block) --> <!-- End block (chat order block) -->
</div> </div>
{% include 'partials/footer.html' %} {% include 'partials/footer.html' %}
</div> </div>
</div> </div>
@ -238,38 +293,133 @@
var form = document.getElementById('message_form'); var form = document.getElementById('message_form');
var csrftoken = getCookie('csrftoken'); var csrftoken = getCookie('csrftoken');
function getStages(orderId) {
$.ajax({
url: '/api/stages/',
type: 'GET',
data: {csrfmiddlewaretoken: csrftoken, 'order': orderId},
dataType: 'json',
success: function (json) {
var stageCount = json.results.length;
if (stageCount == 0) {
stageCountVal = 1;
} else {
stageCountVal = stageCount;
}
var htmlInbox = "";
var htmlInboxStage = '<p class="textStepss">Какое кол-во этапов подразумевает работа? ' +
'<input type="text" id="countStage" value="' + stageCountVal + '"size="3"/></p>';
if (stageCount == 0) {
htmlInboxStage += '<div class="box-sizing" id="stage1">' +
'<p>Этап <span class="stage-span-id">1</span></p><form class="new-stages-form" id="stage-form">' +
'<label for="">Название</label><input class="form-control" name="name" type="text" />' +
'<label for="">Цена</label><input class="form-control" name="cost" type="text" />' +
// '<input class="form-control" name="order" type="text" value="' + orderId + '" class="orderStagesInput"/> />' +
'<label for="">Срок</label><input class="form-control" name="term" type="text" />' +
'<label for="">Результат</label><input class="form-control" name="result" type="text" />' +
'</form></div>';
}
var statusNotAgreed = true;
$.each(json.results, function (i, v) {
if (v.status == "not_agreed") {
htmlInbox += '<div class="box-sizing">' +
'<p>Этап</p><form class="update-stages-form" data-stage-id="' + v.id + '" id="stage-form-' + v.pos + '">' +
'<label for="">Название</label><input class="form-control" type="text" name="name" value="' + v.name + '" />' +
'<label for="">Цена</label><input class="form-control" type="text" name="cost" value="' + v.cost + '" />' +
'<input class="form-control" type="hidden" name="order" value="' + v.order + '" />' +
'<label for="">Срок</label><input class="form-control" type="text" name="term" value="' + v.term + '" />' +
'<label for="">Результат</label><input class="form-control" type="text" name="result" value="' + v.result + '" />' +
'</form></div>';
} else {
statusNotAgreed = false;
htmlInboxStage = "";
htmlInbox += '<div class="box-sizing"><div class="insetNumStepp">' +
'<p class="titleNumStepp"><span>Этап ' + v.pos + '</span>' + v.name + '</p>' +
'<p class="textNumStepp">Результаты этапа:' + v.result + '</p><div>' +
'<p>до 16.03.2015</p><span>' + v.cost + '<i class="fa fa-rub"></i></span></div></div></div>';
}
});
if (statusNotAgreed) {
htmlInbox += '<div class="box-sizing disTab" style="text-align:center;"><div class="checkbox"><label><input type="checkbox" style="opacity:1"><span></span></label>Перейти в режим безопасной сделки' +
'</div></div><div class="textAreaBlock2 box-sizing disTab">' +
'<a href="#" data-order-id="' + orderId + '" id="addStagesForm">отправить на согласование</a> </div>';
}
htmlInbox = htmlInboxStage + htmlInbox;
$("#order-stages").html(htmlInbox);
}
});
}
setTimeout(function () {
$(".user-block").first().trigger('click');
}, 10);
setTimeout(function () {
$(".order-block").first().trigger('click');
}, 100);
$("#order-stages").on('click', "#addStagesForm", function(){ $("#order-stages").on('click', "#addStagesForm", function (e) {
$(".new-stages-form").each(function(i,v){ e.preventDefault();
console.log($(this).serialize()); $(".new-stages-form").each(function (i, v) {
alert($(this).serialize()); console.log($(this).serialize());
$.ajax({ $.ajax({
url: '/api/stages/', url: '/api/stages/',
type: 'POST', type: 'POST',
beforeSend: function (xhr) { beforeSend: function (xhr) {
xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken')) xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'))
}, },
data:$(this).serialize(), data: $(this).serialize(),
dataType: 'json',
success: function (json) {
console.log(json);
},
error: function (e) {
console.log('error');
console.log(e);
}
});
});
$(".update-stages-form").each(function (i, v) {
var currentStageId = parseInt($(this).attr('data-stage-id'));
$.ajax({
url: '/api/stages/' + currentStageId + '/',
type: 'PUT',
beforeSend: function (xhr) {
xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'))
},
data: $(this).serialize(),
dataType: 'json', dataType: 'json',
success: function (json) { success: function (json) {
console.log(json); console.log(json);
}, },
error: function(e){ error: function (e) {
console.log('error'); console.log('error');
console.log(e); console.log(e);
} }
}); });
});
var currentOrderId = $(this).attr('data-order-id');
currentOrderId = parseInt(currentOrderId);
getStages(currentOrderId);
});
}); });
$('#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 updateFormStages = $(".update-stages-form"); var updateFormStages = $(".update-stages-form");
alert(updateFormStages.length);
alert(typeof updateFormStages.length);
var limitCount = countStage + 1; var limitCount = countStage + 1;
for (var i = 2; i < limitCount; i++) { for (var i = 2; i < limitCount; i++) {
var stageCopy = $("#stage1").clone().attr("id", "stage" + i).addClass("stages_form"); var stageCopy = $("#stage1").clone().attr("id", "stage" + i).addClass("stages_form");
@ -277,10 +427,9 @@
} }
}); });
$('.order-block').on('click', function () { $('.order-block').on('click', function () {
$("#chat-order-add").css("display", "block"); $("#chat-order-add").css("display", "block");
$("#formsetStage").css("display","block"); $("#formsetStage").css("display", "block");
$('.order-block').each(function () { $('.order-block').each(function () {
$(this).removeClass('orAct'); $(this).removeClass('orAct');
@ -290,6 +439,8 @@
var orderId = $(this).attr('data-id'); var orderId = $(this).attr('data-id');
var recipentId = $(this).attr('data-recipent-id'); var recipentId = $(this).attr('data-recipent-id');
$("#chat-order-add #orderId").val(orderId); $("#chat-order-add #orderId").val(orderId);
$("#projectReviewId").val(orderId);
$("#targetContractorId").val(recipentId);
$("#chat-order-add #recipentId").val(recipentId); $("#chat-order-add #recipentId").val(recipentId);
$(".orderStagesInput").val(orderId); $(".orderStagesInput").val(orderId);
var inbox = document.getElementById('message-chat-order-space'); var inbox = document.getElementById('message-chat-order-space');
@ -315,71 +466,9 @@
}); });
} }
}); });
getStages(orderId);
$.ajax({
url: '/api/stages/',
type: 'GET',
data: {csrfmiddlewaretoken: csrftoken, 'order': orderId},
dataType: 'json',
success: function (json) {
var stageCount = json.results.length;
if (stageCount == 0){
stageCountVal = 1;
}else{
stageCountVal = stageCount;
}
var htmlInbox = "";
var htmlInboxStage = '<p class="textStepss">Какое кол-во этапов подразумевает работа? ' +
'<input type="text" id="countStage" value="'+ stageCountVal +'"size="3"/></p>';
if (stageCount == 0){
htmlInboxStage += '<div class="numberStepp box-sizing" id="stage1">' +
'<p>Этап <span class="stage-span-id">1</span></p><form class="new-stages-form" id="stage-form">' +
'<label for="">Название</label><input class="form-control" name="name" type="text" />' +
'<label for="">Цена</label><input class="form-control" name="cost" type="text" />' +
'<input class="form-control" name="order" type="text" value="'+ orderId +'" class="orderStagesInput"/> />' +
'<label for="">Срок</label><input class="form-control" name="term" type="text" />' +
'<label for="">Результат</label><input class="form-control" name="result" type="text" />' +
'</form></div>';
}
var statusNotAgreed = true;
$.each(json.results, function (i, v) {
if (v.status == "not_agreed") {
htmlInbox += '<div class="numberStepp box-sizing">' +
'<p>Этап</p><form class="update-stages-form" id="stage-form-'+ v.pos +'">' +
'<label for="">Название</label><input class="form-control" type="text" value="'+ v.name +'" />' +
'<label for="">Цена</label><input class="form-control" type="text" value="'+ v.cost +'" />' +
'<input class="form-control" type="hidden" value="'+ v.order +'" />' +
'<label for="">Срок</label><input class="form-control" type="text" value="'+ v.term +'" />' +
'<label for="">Результат</label><input class="form-control" type="text" value="'+ v.result +'" />' +
'</form></div>';
} else {
statusNotAgreed = false;
htmlInboxStage = "";
htmlInbox += '<div class="numberStepp box-sizing"><div class="insetNumStepp">' +
'<p class="titleNumStepp"><span>Этап ' + v.pos + '</span>' + v.name + '</p>' +
'<p class="textNumStepp">Результаты этапа:' + v.result + '</p><div>' +
'<p>до 16.03.2015</p><span>' + v.cost + '<i class="fa fa-rub"></i></span></div></div></div>';
}
});
if (statusNotAgreed) {
htmlInbox += '<div class="box-sizing disTab" style="text-align:center;"><div class="checkbox"><input type="checkbox" style="opacity:1">Перейти в режим безопасной сделки' +
'</div></div><div class="textAreaBlock2 box-sizing disTab">' +
'<a href="javascript:void()" id="addStagesForm">отправить на согласование</a> </div>';
}
htmlInbox = htmlInboxStage + htmlInbox;
$("#order-stages").html(htmlInbox);
}
});
}); });
// Вытащить сообщения для конактов // Вытащить сообщения для конактов
$('.user-block').on('click', function () { $('.user-block').on('click', function () {
var userId = $(this).attr('data-id'); var userId = $(this).attr('data-id');
@ -430,6 +519,10 @@
$("#chat").val(""); $("#chat").val("");
}); });
$('#order-review-add').on('click', function () {
alert('add review');
});
$('#order-chat-add-message').on('click', function () { $('#order-chat-add-message').on('click', function () {
var chatMessage = $("#chat-order-add #chat").val(); var chatMessage = $("#chat-order-add #chat").val();
var recipentId = $("#chat-order-add #recipentId").val(); var recipentId = $("#chat-order-add #recipentId").val();
@ -452,10 +545,13 @@
}); });
var userId = '{{ request.user.pk }}';
var userId = '{{ request.user.pk }}';
var SocketHandler = function () { var SocketHandler = function () {
var url = 'ws://127.0.0.1:8888/chat/' + userId + '/'; var domain = '{{ request.META.HTTP_HOST }}';
var port = '{{ request.META.SERVER_PORT }}';
domain = domain.replace(':' + port, '');
var url = 'ws://' + domain + ':8888/chat/' + userId + '/';
var sock = new WebSocket(url); var sock = new WebSocket(url);
var intervalId; var intervalId;
sock.onopen = function () { sock.onopen = function () {

Loading…
Cancel
Save