some task, add js logic on show/hide basis

feature/docker
Dmitriy Shesterkin 9 years ago
parent 08a70243c6
commit 9639465a1b
  1. 32
      src/customer/views/clients_ajax.py
  2. 4
      src/docs/urls.py
  3. 7
      src/dokumentor/static/css/style.css
  4. 34
      src/dokumentor/static/js/dialogs.js
  5. 2
      src/dokumentor/templates/base.html
  6. 4
      src/dokumentor/templates/customer/clients/list_item.html
  7. 26
      src/dokumentor/templates/docs/aktrabot/form.html
  8. 224
      src/dokumentor/templates/docs/stub_js.html

@ -30,7 +30,8 @@ def clients_get_ajax(request, id):
except AttributeError:
fields_list = []
client = get_object_or_404(models.Client.objects.values(*fields_list), pk=id, company=request.user.profile)
client = get_object_or_404(models.Client.objects.values(*fields_list), pk=id,
company=request.user.profile)
return HttpResponse(json.dumps(client), content_type='application/json')
@ -52,11 +53,18 @@ def clients_add_ajax(request):
if form.is_valid():
new_client = form.save(commit=False)
new_client.company = request.user.profile
new_client_str = new_client.name
# TODO : to common function with __str__
if new_client.name_short_dadata:
new_client_str = '{}, {}'.format(new_client.name_short_dadata,
new_client.name_short_self)
else:
new_client_str = '{}, ИНН {}'.format(new_client.name, new_client.inn or 'не указан')
new_client.save()
new_client_id = new_client.id
# import ipdb;ipdb.set_trace()
html = render_to_string('customer/clients/list_item.html',
{'obj': new_client}, RequestContext(request))
{'obj': new_client}, RequestContext(request))
non_field_errors = form.non_field_errors()
if not form.is_valid():
@ -65,7 +73,7 @@ def clients_add_ajax(request):
data = {
'success': form.is_valid(),
'field_errors': form.errors,
'form_errors': non_field_errors,
'form_errors': non_field_errors, # ошибки формы
'reload': False,
'id': new_client_id,
'name': new_client_str,
@ -95,14 +103,14 @@ def clients_edit_ajax(request, id):
non_field_errors = form.non_field_errors()
html = render_to_string('customer/clients/list_item.html',
{'obj': client}, RequestContext(request))
{'obj': client}, RequestContext(request))
if not form.is_valid():
non_field_errors.append(u'Заполните/исправьте выделенные поля.')
data = {
'success': form.is_valid(),
'field_errors': form.errors, # ошибки полей
'form_errors': non_field_errors, # ошибки формы
'field_errors': form.errors, # ошибки полей
'form_errors': non_field_errors, # ошибки формы
'reload': False,
'id': client.id,
'name': client.name,
@ -127,12 +135,12 @@ def clients_delete_ajax(request, id):
client = get_object_or_404(models.Client, pk=id, company=request.user.profile)
client_docs = []
doc_list = [(Invoice, u'счета'), (Faktura, u'счета-фактуры'), (Nakladn, u'накладные'),
(AktRabot, u'акты выполненных работ'), (Platejka, u'платёжные поручения'),
(Dover, u'доверенности'), (AktSverki, u'акты сверки')]
(AktRabot, u'акты выполненных работ'), (Platejka, u'платёжные поручения'),
(Dover, u'доверенности'), (AktSverki, u'акты сверки')]
for doc in doc_list:
docs = doc[0].objects.filter(client=client)
if docs:
client_docs.append(doc[1])
client_docs.append(doc[1])
if not client_docs:
client.delete()
@ -141,7 +149,9 @@ def clients_delete_ajax(request, id):
del_id = id
else:
success = True
message = {'title': u'Инфо', 'msg': u'Контрагент не удалён. Есть выписанные документы: %s.' % ','.join(client_docs)}
message = {'title': u'Инфо',
'msg': u'Контрагент не удалён. Есть выписанные документы: %s.' % ','.join(
client_docs)}
del_id = None
data = {

@ -71,10 +71,10 @@ for name, klass in klasses:
urlpatterns += patterns('docs.views',
# создать по Счету -> Акт вып. работ
url(r'^%s/add/by/invoice/(?P<invoice_id>\d+)/$' % 'aktrabot', getview,
{'klass': AktRabotViews, 'oper': 'add_by_invoice',}, name='docs_%s_add_by_invoice' % 'aktrabot'),
{'klass': AktRabotViews, 'oper': 'add_by_invoice'}, name='docs_%s_add_by_invoice' % 'aktrabot'),
# создать по Счету -> Накладную
url(r'^%s/add/by/invoice/(?P<invoice_id>\d+)/$' % 'nakladn', getview,
{'klass': NakladnViews, 'oper': 'add_by_invoice',}, name='docs_%s_add_by_invoice' % 'nakladn'),
{'klass': NakladnViews, 'oper': 'add_by_invoice'}, name='docs_%s_add_by_invoice' % 'nakladn'),
# создать по Счету -> Счёт-фактуру
url(r'^%s/add/by/invoice/(?P<invoice_id>\d+)/$' % 'faktura', getview, {'klass': FakturaViews, 'oper': 'add_by_invoice',},
name='docs_%s_add_by_invoice' % 'faktura'),

@ -787,3 +787,10 @@ P.help-block {
color: gray;
font-size: 11px;
}
/* Turn Off Number Input Spinners */
input[type=number]::-webkit-inner-spin-button,
input[type=number]::-webkit-outer-spin-button {
-webkit-appearance: none;
margin: 0;
}

@ -2,6 +2,21 @@ $(document).ready(function() {
var dlg_msg = $('#dialog-message');
var dlg_django_msg = $('#django-message');
function clients_edit_del_update() {
var edit_form = $('#client-edit-form');
if (edit_form) {
setup_client_edit_form(edit_form);
setup_client_edit_links(edit_form, true);
setup_client_add_link(edit_form, true);
}
var delete_form = $('#client-delete-form');
if (delete_form) {
setup_client_edit_form(delete_form);
setup_client_delete_links(delete_form, true);
}
}
$('form', '#dialogs').each(function() {
var form = $(this);
@ -21,18 +36,23 @@ $(document).ready(function() {
/*beforeSend: function() {
$('.errors-layout', form).html('').hide();
},*/
// add client
success: function(data) {
clear_form_errors(form);
if (data.success) {
// console.log('!!!!!!!!!!!!!!!!!!!');
// console.log(data);
if (form[0].id == 'client-edit-form') {
$('#id_client_text').hide();
$('#id_client-deck').html(
'<span class="div hilight" data-value='+ data.id +
'><span class="remove div" style="display: inline;">X</span>' + data.name + '</span>');
'<span class="hilight" data-value='+ data.id + '>' +
'<span style="display:inline" class="remove">'+
' ' +
' ˣ' +
' </span>' + data.name + '</span>');
$('#id_client').html('<option selected="selected" value="'+ data.id +'"></option>');
$('#id_client').trigger('change');
}
@ -50,14 +70,18 @@ $(document).ready(function() {
}
}
if (data.action){
// console.log(data.action);
if (data.action == 'client-add'){
$(data.row_html).insertAfter('#clients_header_row');
window.clients_edit_del_update();
clients_edit_del_update();
$('table#clients').show();
var autocomplete = $('#id_client-autocomplete');
if (autocomplete.is(":visible")){autocomplete.hide()}
}
if (data.action == 'client-edit'){
$("tr#client_" + data.id).replaceWith(data.row_html);
window.clients_edit_del_update();
clients_edit_del_update();
}
if (data.action == 'client-delete'){
$("tr#client_" + data.id).remove();

@ -130,9 +130,7 @@
<script src="{% static 'js/lib/entertotab.js' %}"></script>
<script src="{% static 'js/lib/jquery.cookie.js' %}"></script>
<script src="{% static 'js/lib/handlebars-v4.0.5.js' %}"></script>
<script src="{% static 'js/csrf.js' %}?ver={% file_version 'js/csrf.js' %}"></script>
<script src="{% static 'js/commons.js' %}?ver={% file_version 'js/commons.js' %}"></script>
<script src="{% static 'js/dialogs.js' %}?ver={% file_version 'js/dialogs.js' %}"></script>
<script src="{% static 'js/callback.js' %}?ver={% file_version 'js/callback.js' %}"></script>

@ -1,3 +1,5 @@
{% load static %}
<tr id='client_{{ obj.id }}'>
<td>
<a class="client edit-link" href="{% url 'customer_clients_edit' obj.pk %}" title="Редактировать контрагента">
@ -15,7 +17,7 @@
<td>{{ obj.contact_phone }}</td>
<td class="center">
<a class="client edit-link" href="{% url 'customer_clients_edit' obj.pk %}" title="Редактировать контрагента">
<img src="{{ STATIC_URL }}img/sign-edit.png" alt="Редактировать" title="Редактировать контрагента" />
<img src="{% static 'img/sign-edit.png' %}" alt="Редактировать" title="Редактировать контрагента" />
</a>
</td>
<td class="center">

@ -13,7 +13,7 @@
<div class="block" style="border-bottom: 1px solid #777; padding: 0 20px 5px 0;">
{% include 'docs/parts/form_field_client.html' with field=form.client required="True" is_ajax="True" %}
{% include 'docs/parts/form_field.html' with field=form.invoice id="invoice" classes="field" label="Создать акт по счёту" %}
{% include 'docs/parts/form_field.html' with field=form.invoice id="invoice" classes="field hidden" label="Создать акт по счёту" %}
</div>
<div class="block" style="border-bottom: 1px solid #777; padding: 0 20px 15px 0;">
@ -27,27 +27,3 @@
{% endblock %}
{% block js %}
{% comment %}<script type="text/javascript">
{% include 'docs/_common_js/add_line_handler.js' %}
{% include 'docs/_common_js/calc_summa.js' %}
{% include 'docs/_common_js/calc_itogo.js' %}
function set_events() {
$("#tbl_items tr.row td.qty input").blur(calc_summa);
$("#tbl_items tr.row td.price input").blur(calc_summa);
$("#tbl_items tr.row td.qty input").blur(calc_itogo);
$("#tbl_items tr.row td.price input").blur(calc_itogo);
$("#tbl_items tr.row td.total_price input").blur(calc_itogo);
}
$(document).ready(function() {
EnterToTab.init(document.getElementById('aktrabot'), true);
$("#id_doc_date").datepicker({dateFormat:'dd.mm.yy'});
set_events();
calc_itogo();
add_line_handler();
});
</script>{% endcomment %}
{% endblock %}

@ -1,13 +1,14 @@
{# заглушка js #}
<script type="text/javascript">
$(document).ready(function() {
$('tr.plat_form').formset({
prefix: '{{ pformset.prefix }}',
formCssClass: 'plat_dynamic-form',
formCssClass: 'plat_dynamic-form'
});
$('tr.row_tbl_items').formset({
prefix: '{{ formset.prefix }}',
formCssClass: 'dynamic-form',
formCssClass: 'dynamic-form'
});
// units
@ -27,7 +28,6 @@
name_input.css('color', 'red')
}
});
// country
$('body').on('selectChoice change', '.country_name input', function(e, choice, autocomplete) {
var name_input = $(this);
@ -61,66 +61,93 @@
// отрабатываем изменение в блоке добавления контрагента
// как я понимаю основной блок на поиск и вывод "инвойсов" для автодобавления контрагента
client_block.on('change', function() {
{# console.log('change');#}
check_vis(add_block);
var client_id = $(this).val();
$.get('/my/docs/ajax_get_invoices/' + client_id, function(data) {
var select = $('#id_invoice');
if(select.prop) {
var options = select.prop('options');
}
else {
var options = select.attr('options');
}
$('option', select).remove();
options[options.length] = new Option('-------', '');
$.each(data, function(val, text) {
options[options.length] = new Option(text, val);
});
select.prop('selectedIndex', 0);
})
if (client_id) {
$.get('/my/docs/ajax_get_invoices/' + client_id, function(data) {
if($('*').is('#id_invoice')) {
$.isEmptyObject(data) ? displayInvoiceBlock(false): displayInvoiceBlock(true);
var select = $('#id_invoice');
if(select.prop) {
var options = select.prop('options');
}
else {
var options = select.attr('options');
}
$('option', select).remove();
options[options.length] = new Option('-------', '');
$.each(data, function(val, text) {
options[options.length] = new Option(text, val);
});
select.prop('selectedIndex', 0);
}
})
} else {
displayInvoiceBlock(false);
// TODO: need confirm delete records
confirmChangeDataPromise(getTableInputs()).then(function (answer) {
if (answer) {
updateTable();
}
}) ;
}
});
$('#id_invoice').on('change', function() {
var invoice_id = $(this).val();
$.each($('.row_tbl_items'), function(index, item){
$(item).find('a.delete-row').trigger('click');
});
$.get('/my/docs/ajax_get_client_by_invoice/' + invoice_id, function(data) {
add_block.hide(); // прячем кнопку добавить
var client = data[0];
$('#id_client_text').hide();
$('#id_client-deck').html(
'<span class="div hilight" data-value='+ data[0] +
'><span class="remove div" style="display: inline;">X</span>' + data[1] + '</span>');
$('#id_client').html('<option selected="selected" value="'+ data[0] +'"></option>');
{# console.log(invoice_id);#}
});
if (invoice_id) {
// TODO: needed preloader or remade function
$.get('/my/docs/ajax_get_tbl_items/' + invoice_id, function(data) {
//console.log('===================');
var items = JSON.parse(data);
$.each(items, function(index, item){
var name = item['fields']['name'];
var units = item['fields']['units'];
var qty = item['fields']['qty'];
var price = item['fields']['price'];
var total_price = item['fields']['total_price'];
$('#tbl_items a.add-row').trigger('click');
var $last_row = $('.row_tbl_items:visible').last();
$last_row.find('.name input').val(name);
$last_row.find('.units input').val(units);
$last_row.find('.qty input').val(qty);
$last_row.find('.price input').val(price);
$last_row.find('.total_price input').val(total_price);
$.get('/my/docs/ajax_get_pair/Measure/name/code/' + units + '/', function(data){
if (data['val']) {
$last_row.find('.units_kod input').val(data['val']);
}
});
})
})
$.each($('.row_tbl_items'), function(index, item){
$(item).find('a.delete-row').trigger('click');
});
$.get('/my/docs/ajax_get_tbl_items/' + invoice_id, function(data) {
{# console.log('===================');#}
var items = JSON.parse(data);
{# console.log(items);#}
$.each(items, function(index, item){
var name = item['fields']['name'];
var units = item['fields']['units'];
var qty = item['fields']['qty'];
var price = item['fields']['price'];
var total_price = item['fields']['total_price'];
$('#tbl_items a.add-row').trigger('click');
var $last_row = $('.row_tbl_items:visible').last();
$last_row.find('.name input').val(name);
$last_row.find('.units input').val(units);
$last_row.find('.qty input').val(qty);
$last_row.find('.price input').val(price);
$last_row.find('.total_price input').val(total_price);
// TODO: need ajax function on backend
$.get('/my/docs/ajax_get_pair/Measure/name/code/' + units + '/', function(data){
if (data['val']) {
$last_row.find('.units_kod input').val(data['val']);
}
});
})
})
} else {
updateTable();
}
});
var toggle_sender = function(client_type) {
@ -144,10 +171,99 @@
} else {
$('#fix_block').hide();
}
$('#id_fixes').change(function(){
$('#fix_block').toggle();
$('#id_fix_doc_num').val('11');
$('#id_fix_doc_date').val('');
})
});
function displayInvoiceBlock(visibly) {
var invoiceBlock = $('#invoice');
if ($('*').has(invoiceBlock)) {
(visibly) ? invoiceBlock.removeClass('hidden'): invoiceBlock.addClass('hidden');
}
}
function clearTableRow(tblItems) {
$.each(tblItems, function(index, item){
$(item).find('.name input').val('');
$(item).find('.units input').val('');
$(item).find('.qty input').val('');
$(item).find('.price input').val('');
$(item).find('.total_price input').val('');
});
}
function getTableInputs() {
return $('#tbl_items input:not(:hidden)').toArray();
}
function deleteTableRow(tblItems) {
$.each (tblItems, function(index, item){
$(item).find('a.delete-row').trigger('click');
});
}
function updateTable() {
var tblItems = $('.row_tbl_items');
if (tblItems.length < 2) {
clearTableRow(tblItems);
$('#tbl_items a.add-row').trigger('click');
}
if (tblItems.length === 2) {
clearTableRow(tblItems);
}
if (tblItems.length > 2) {
var firstAndSecondTblItems = tblItems.splice(0, 2);
clearTableRow(firstAndSecondTblItems);
deleteTableRow(tblItems);
}
}
// TODO: to common function
function confirmChangeDataPromise(inputArray) {
var dlg_msg = $('#dialog-message');
var emptyInput = true;
var defer = $.Deferred();
for (var i = inputArray.length - 1; i >= 0; --i) {
if (inputArray[i].value) {
emptyInput = false;
break;
}
}
if (!emptyInput) {
dlg_msg.dialog({
title: 'Удалить данные',
buttons:
{'Да':
function(){
defer.resolve(true);
$(this).dialog('close');
}, 'Нет':
function(){
defer.resolve(false);
$(this).dialog('close');
}
}
}).html('Имеются уже заполненные данные, удалить их?');
dlg_msg.dialog('open');
} else {
defer.resolve(true);
}
return defer.promise();
}
});
</script>

Loading…
Cancel
Save