PR-20 Доработка

Переработана логика работы фильтра проектов. Доработан дизайн фильтра.
remotes/origin/PR-39
booblegum 9 years ago
parent 7639bf1490
commit 08e108152c
  1. 6
      assets/css/main.css
  2. 59
      assets/lib/proekton-components/css/other.css
  3. 57
      assets/lib/proekton-components/css/select-box.css
  4. BIN
      assets/lib/proekton-components/img/rect01.png
  5. BIN
      assets/lib/proekton-components/img/rect02.png
  6. 3
      assets/lib/proekton-components/js/SelectBox.js
  7. 4
      assets/lib/proekton-components/js/SelectedContainer.js
  8. 3
      assets/lib/proekton-components/js/SimpleSelect.js
  9. 45
      assets/projects-filter.js
  10. 119
      projects/templates/partials/inc-projects-filter.html
  11. 72
      projects/templates/partials/inc-projects-results.html
  12. 13
      projects/templates/partials/inc-projects-sort_by.html
  13. 213
      projects/templates/project_filter.html
  14. 109
      projects/views.py
  15. 65
      templates/partials/ajax_pagination.html

@ -1329,10 +1329,10 @@ footer:after {
}
.titleResF1, div p.titleResF1 {
font-size: 15px;
font-size: 14pt;
font-family: 'Arial-MT-Regular', sans-serif;
font-weight: bold;
color: #2c2c2c;
/*font-weight: bold;*/
color: #000000;
float: left;
}

@ -10,8 +10,8 @@ label {
}
.selected-container .selected-element {
display: inline-block;
padding: 5px 25px 5px 10px;
/*display: inline-block;*/
padding: 5px 35px 5px 10px;
margin-top: 8px;
min-height: 45px;
background-color: #e3e3e3;
@ -21,35 +21,45 @@ label {
-webkit-border-radius: 10px; /* Safari 4 */
border-radius: 10px; /* IE 9, Safari 5, Chrome */
}
.horizontal .selected-element{
display: inline-block;
}
.selected-element .header{
font-size: 9pt;
color: #979494;
.selected-element .header,.name{
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
word-wrap: break-word;
width: 100%;
}
.selected-element .header{
font-size: 7pt;
color: #676363;
/*white-space: nowrap;*/
/*text-overflow: ellipsis;*/
/*overflow: hidden;*/
/*word-wrap: break-word;*/
/*width: 100%;*/
}
.selected-element .name {
font-size: 14pt;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
vertical-align: middle;
width: 100%;
font-size: 11pt;
/*white-space: nowrap;*/
/*text-overflow: ellipsis;*/
/*overflow: hidden;*/
/*width: 100%;*/
}
.selected-element .icon-remove{
background-image: url('../img/cross01.png');
background-size: 24px 24px;
background-size: 20px 20px;
/*display: inline-block;*/
position: absolute;
right: 5px;
top: 15px;
width: 16px;
height: 16px;
width: 20px;
height: 20px;
cursor: pointer;
margin-left: -20px;
}
@ -66,7 +76,8 @@ label {
}
.separator {
margin: 20px 0;
margin-top: 35px;
margin-bottom: 5px;
}
.max-width {
@ -83,26 +94,26 @@ label {
}
.custom-check {
background: url("../img/rect01.png") no-repeat center;
background-size: 200px 40px;
width: 200px;
height: 40px;
background-size: 210px 51px;
width: 210px;
height: 51px;
cursor: pointer;
}
.custom-check.checked {
background: url("../img/rect02.png") no-repeat center;
background-size: 200px 40px;
width: 200px;
height: 40px;
background-size: 210px 51px;
width: 210px;
height: 51px;
}
#page-preloader {
position: fixed;
position: absolute;
left: 0;
top: 0;
right: 0;
bottom: 0;
background: #000;
background: #090909;
z-index: 100500;
}

@ -1,10 +1,38 @@
body {
font-size: 11pt;
font-family: Arial-MT-Regular, Arial, Sans-Serif;
}
input[type="checkbox"] + span, input[type="checkbox"]:checked + span {
all: initial;
font-size: 9pt;
color: #494546;
cursor: pointer;
}
.noselect {
-webkit-touch-callout: none; /* iOS Safari */
-webkit-user-select: none; /* Chrome/Safari/Opera */
-moz-user-select: none; /* Firefox */
-ms-user-select: none; /* Internet Explorer/Edge */
user-select: none;
/* Non-prefixed version, currently
not supported by any browser */
}
/*input[type="checkbox"]:checked + span {*/
/*all: initial;*/
/*font-size: 9pt;*/
/*color: #494546;*/
/*}*/
.select-box-container {
display: block;
/*margin-top: 40px;*/
/*min-width: 200px;*/
}
.select-box-header{
.select-box-header {
font-size: 14pt;
white-space: nowrap;
word-wrap: break-word;
@ -12,7 +40,7 @@
/*top:10px;*/
}
.select-box-header .header{
.select-box-header .header {
display: inline-block;
color: black;
text-overflow: ellipsis;
@ -23,11 +51,15 @@
}
/*.select-box-header i {*/
/*position: relative;*/
/*top: -5px;*/
/*position: relative;*/
/*top: -5px;*/
/*}*/
.select-box-header .fa:hover{
.select-box-header .fa {
color: #565656;
}
.select-box-header .fa:hover {
cursor: pointer;
}
@ -70,17 +102,21 @@
padding: 2px 10px;
border-bottom: 1px solid #afb2b6;
list-style: none;
font-size: 9pt;
color: #494546;
}
.select-box-results label, .select-box-options label,
.select-box-results li, .select-box-options li {
cursor: pointer;
display: inline-block;
width: 100%;
}
.select-box-results li:hover, .select-box-options li:hover {
background-color: #dcdcdc;
border-left: 2px solid red;
color: #0b0b0b;
}
.select-box-search {
@ -88,7 +124,7 @@
}
input.select-box-search {
height: 40px;
height: 51px;
width: 100%;
border: 1px solid #cccccc;
outline: none;
@ -157,15 +193,16 @@ input.select-box-search {
.editable-container {
display: block;
float: left;
/*max-width: 400px;*/
background-color: #e5e5e5;
min-height: 40px;
color: #585858;
font-size: 9pt;
padding: 5px 10px;
/*min-width: 40px;*/
height: 51px;
margin-left: 8px;
position: relative;
left: -30px;
}
.vertical-child{
.vertical-child {
margin-top: 30px;
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

@ -245,7 +245,8 @@ class SelectBox {
}
// FILL RESULTS
let result_template = (el, id) => `<li><label><input type="checkbox" data-id="${id}"><i>${el}</i></label></li>`;
let result_template = (el, id) =>
`<li><label><input type="checkbox" data-id="${id}"><span class="noselect">${el}</span></label></li>`;
// MAIN PART
let $container = this.$results_box.find('.main-part ul');
fillContainer($container, result_template, search_text, self.parent_id);

@ -22,9 +22,9 @@ class SelectedContainer {
let htmlTemplate =
`
<div class="selected-element">
<span class="header">
<div class="header">
${header}
</span>
</div>
<div class="name">
${name}
</div>

@ -108,7 +108,8 @@ class SimpleSelect {
}
// FILL RESULTS
let result_template = (el, id) => `<li><label><input type="checkbox" data-id="${id}"><i>${el}</i></label></li>`;
let result_template = (el, id) =>
`<li><label><input type="checkbox" data-id="${id}"><span class="noselect">${el}</span></label></li>`;
// MAIN PART
let $container = this.$results_box.find('.main-part ul');
fillContainer($container, result_template, search_text, self.parent_id);

@ -0,0 +1,45 @@
function getFormData($form, pageNum) {
var unindexed_array = $form.serializeArray();
var indexed_array = {};
$.map(unindexed_array, function (n, i) {
indexed_array[n['name']] = n['value'];
});
indexed_array["page"] = pageNum || "";
return indexed_array;
}
function modUrl($form, postfix) {
let curLoc = '?' + $form.serialize() + (postfix || "");
try {
history.replaceState($form.serialize(), null, curLoc);
} catch (e) {
console.log("Error!");
}
}
function sendData(url, $form, pageNum) {
function updateResults(html) {
$container.html(html);
}
const $container = $('#projectsBlock');
$.ajax({
url: url,
type: "POST",
dataType: 'html',
data: getFormData($form, pageNum),
beforeSend: function (xhr) {
xhr.setRequestHeader("X-CSRFToken", $.cookie('csrftoken'));
},
success: updateResults,
error: (data) => console.log("Error", data)
});
}
function sendFilterData(url) {
const $form = $('#filter-form');
sendData('/projects/', $form);
modUrl($form);
return false;
}

@ -0,0 +1,119 @@
<form id="filter-form" action="/projects" method="GET" novalidate>
<div class="filter form-container">
<div id="page-preloader"><span class="spinner"></span></div>
<div class="triangle1"></div>
<div class="row">
<div class="col-lg-12">
<div id="select-box-1"></div>
</div>
</div>
<div class="row">
<div class="col-lg-3">
<div id="select-box-2"></div>
</div>
<div class="col-lg-3">
<div id="select-box-3"></div>
</div>
<div class="col-lg-3">
<div id="select-box-4"></div>
</div>
<div class="col-lg-3">
<div id="select-box-5"></div>
</div>
</div>
<div class="row">
<div class="col-lg-12">
<div class="selected-container horizontal" id="selected-spec">
<input type="hidden" name="specialization"
value="{{ specialization }}">
</div>
</div>
</div>
<div class="row separator">
<div class="col-lg-5">
<p class="titleResF1">Поиск по ключевым словам и фразам</p>
</div>
<div class="col-lg-7">
<div class="borderS1"></div>
</div>
</div>
<div class="row">
<div class="col-lg-6">
<input
type="text"
name="keywords"
onkeydown="event.keyCode === 13 && $(this).closest('form').submit()"
value="{{ form.keywords.value }}"
class="searchInp box-sizing"
placeholder="Ключевые слова, фразы">
</div>
<div class="col-lg-3">
{# $(this).closest('form').submit(); return false#}
<a href="" class="findReal" onclick="sendFilterData('/projects/'); return false">
найти проект
</a>
</div>
<div class="col-lg-3">
<a href="{% url 'projects:project-filter' %}" class="clearSearch">
{# TODO: Сделать очистку, без перезагрузки#}
Очистить фильтр
</a>
</div>
</div>
<div class="row separator">
<div class="col-lg-4">
<p class="titleResF1">Расширенные поля</p>
<button class="resButtonF1">
<span class="glyphicon glyphicon-arrow-up" aria-hidden="true"></span>
</button>
</div>
<div class="col-lg-8">
<div class="borderS1"></div>
</div>
</div>
<div class="slideRes disTab activeSlide">
<div class="row">
<div class="col-lg-3">
<div id="sb-building-classification"></div>
<div id="sb-building-sub-classification"></div>
<div class="selected-container" id="selected-building-classification">
<input type="hidden" name="building_classification"
value="{{ building_classification }}">
</div>
</div>
<div class="col-lg-3">
<div id="sb-construction-type"></div>
<div class="selected-container" id="selected-construction-type">
<input type="hidden" name="construction_type"
value="{{ construction_type }}">
</div>
</div>
<div class="col-lg-3">
<div id="sb-location-1"></div>
<div id="sb-location-2"></div>
<div id="sb-location-3"></div>
<div class="selected-container" id="selected-location">
<input type="hidden" name="location"
value="{{ location }}">
</div>
</div>
<div class="col-lg-3">
<div class="select-box-header">
<span style="width: 230px" class="header">Требуется допуск (СРО)</span>
<i class="fa fa-question-circle-o" aria-hidden="true"
title="bla-bla-bla..."></i>
</div>
<div class="custom-check" data-state="disabled">
<input name="cro" type="checkbox" hidden {% if cro %} checked{% endif %}>
</div>
</div>
</div>
</div>
</div>
</form>

@ -0,0 +1,72 @@
<p class="titleScore">
{% if num_results > 0 %}
Найдено {{ num_results }} проектов
{% else %}
Ничего не найдено
{% endif %}
</p>
{# SORT_BY #}
{% include 'partials/inc-projects-sort_by.html' %}
<div class="projectsBlock disTab">
{% for project in projects %}
<div class="projectPro clearfix">
<div class="col-lg-9 leftPro">
<p class="titlePro">
<a href="{% url 'projects:detail' pk=project.pk %}">{{ project.name }}</a>
</p>
{% if project.realty and project.realty.name %}
<ul class="desPro">
<ul class="desPro">
<li>
<a href="?realty={{ project.realty.pk }}">Объект
"{{ project.realty.name }}"</a>
</li>
</ul>
{% endif %}
<p class="textPro">{{ project.text|linebreaksbr|truncatechars:300 }}</p>
{% if TEMPLATE_DEBUG %}
<pre><!--
--><b>Specialization:</b> {{ project.specialization }}<br><!--
--><br><!--
--><b>Realty location:</b> {{ project.realty.location }}<br><!--
--><br><!--
--><b>Constr. type:</b> {{ project.realty.construction_type }}<br><!--
--><br><!--
--><b>Build. classif.:</b> {{ project.realty.building_classification }}<br><!--
--></pre>
{% endif %}
<ul class="listPro">
<li>{{ project.created }}</li>
<li>{{ project.hit_count.hits }}</li>
<li>{{ project.answers.count }}</li>
{% if request.user.is_authenticated %}
<li>{{ project.customer.username }}</li>
{% endif %}
</ul>
</div>
<div class="col-lg-3 rightPro">
<p class="cenaPro">
{{ project.budget }} <i class="{% fa_currency_classes project.currency %}"></i>
</p>
<ul>
{% if project.secure_deal %}
<li>Безопасная сделка</li>
{% endif %}
<li>
{{ project.specialization.name }}
</li>
</ul>
</div>
</div>
{% endfor %}
</div>
<div class="col-lg-12 pagin">
{% include 'partials/ajax_pagination.html' %}
</div>

@ -0,0 +1,13 @@
<div class="linkSort">
<p>Сортировать по:</p>
{% for val, text in choices %}
<button type="submit" name="{{ text }}"
value="{{ val }}">{{ text }}</button>
{% endfor %}
{# <input type="hidden" name="{{ form.last_order_by.html_name }}" value="{{ last_order_by }}">#}
{# <input type="checkbox" name="{{ form.reverse_order.html_name }}"#}
{# {% if reverse_order %}checked{% endif %}#}
{# style="display: none">#}
</div>

@ -7,216 +7,22 @@
{% endblock %}
{% block content %}
{% include 'partials/header.html' %}
<div id="page-preloader"><span class="spinner"></span></div>
<div class="container mainScore">
<div class="row">
<div class="col-lg-12">
<p class="titleScore">Поиск заказов</p>
</div>
<form id="filter-form" action="/projects" method="GET" novalidate>
<div class="col-lg-12">
<div class="filter form-container">
<div class="triangle1"></div>
<div class="row">
<div class="col-lg-12">
<div id="select-box-1"></div>
</div>
</div>
<div class="row">
<div class="col-lg-3">
<div id="select-box-2"></div>
</div>
<div class="col-lg-3">
<div id="select-box-3"></div>
</div>
<div class="col-lg-3">
<div id="select-box-4"></div>
</div>
<div class="col-lg-3">
<div id="select-box-5"></div>
</div>
</div>
<div class="row">
<div class="selected-container" id="selected-spec">
<input type="hidden" name="specialization"
value="{{ specialization }}">
</div>
</div>
<div class="row separator">
<div class="col-lg-4">
<p class="titleResF1">Поиск по ключевым словам и фразам</p>
</div>
<div class="col-lg-8">
<div class="borderS1"></div>
</div>
</div>
<div class="row">
<div class="col-lg-6">
<input
type="text"
name="keywords"
onkeydown="event.keyCode === 13 && $(this).closest('form').submit()"
value="{{ form.keywords.value }}"
class="searchInp box-sizing"
placeholder="Ключевые слова, фразы">
</div>
<div class="col-lg-3">
<a href="#" class="findReal" onclick="$(this).closest('form').submit(); return false">
найти проект
</a>
</div>
<div class="col-lg-3">
<a href="{% url 'projects:project-filter' %}" class="clearSearch">
{# TODO: Сделать очистку, без перезагрузки#}
Очистить фильтр
</a>
</div>
</div>
<div class="row separator">
<div class="col-lg-3">
<p class="titleResF1">Расширенные поля</p>
<button class="resButtonF1">
<span class="glyphicon glyphicon-arrow-up" aria-hidden="true"></span>
</button>
</div>
<div class="col-lg-9">
<div class="borderS1"></div>
</div>
</div>
<div class="slideRes disTab activeSlide">
<div class="row">
<div class="col-lg-3">
<div id="sb-building-classification"></div>
<div id="sb-building-sub-classification"></div>
<div class="selected-container" id="selected-building-classification">
<input type="hidden" name="building_classification"
value="{{ building_classification }}">
</div>
</div>
<div class="col-lg-3">
<div id="sb-construction-type"></div>
<div class="selected-container" id="selected-construction-type">
<input type="hidden" name="construction_type"
value="{{ construction_type }}">
</div>
</div>
<div class="col-lg-3">
<div id="sb-location-1"></div>
<div id="sb-location-2"></div>
<div id="sb-location-3"></div>
<div class="selected-container" id="selected-location">
<input type="hidden" name="location"
value="{{ location }}">
</div>
</div>
<div class="col-lg-3">
<div class="select-box-header">
<span style="width: 230px" class="header">Требуется допуск (СРО)</span>
<i class="fa fa-question-circle-o" aria-hidden="true"
title="bla-bla-bla..."></i>
</div>
<div class="custom-check" data-state="disabled">
<input name="cro" type="checkbox" hidden {% if cro %} checked{% endif %}>
</div>
</div>
</div>
</div>
</div>
{# FILTERS #}
<div class="col-lg-12">
<p class="titleScore">{{ display_msg }}</p>
<div class="linkSort">
<p>Сортировать по:</p>
{% for val, text in form.order_by.field.choices %}
<button type="submit" name="{{ form.order_by.html_name }}"
value="{{ val }}">{{ text }}</button>
{% endfor %}
<input type="hidden" name="{{ form.last_order_by.html_name }}" value="{{ last_order_by }}">
<input type="checkbox" name="{{ form.reverse_order.html_name }}"
{% if reverse_order %}checked{% endif %}
style="display: none">
</div>
</div>
{# PROJECTS LIST #}
<div class="projectsBlock disTab">
{% for project in projects %}
<div class="projectPro clearfix">
<div class="col-lg-9 leftPro">
<p class="titlePro">
<a href="{% url 'projects:detail' pk=project.pk %}">{{ project.name }}</a>
</p>
{% if project.realty and project.realty.name %}
<ul class="desPro">
<li>
<a href="?realty={{ project.realty.pk }}">Объект
"{{ project.realty.name }}"</a>
</li>
</ul>
{% endif %}
<p class="textPro">{{ project.text|linebreaksbr|truncatechars:300 }}</p>
{% if TEMPLATE_DEBUG %}
<pre><!--
--><b>Specialization:</b> {{ project.specialization }}<br><!--
--><br><!--
--><b>Realty location:</b> {{ project.realty.location }}<br><!--
--><br><!--
--><b>Constr. type:</b> {{ project.realty.construction_type }}<br><!--
--><br><!--
--><b>Build. classif.:</b> {{ project.realty.building_classification }}<br><!--
--></pre>
{% endif %}
<ul class="listPro">
<li>{{ project.created }}</li>
<li>{{ project.hit_count.hits }}</li>
<li>{{ project.answers.count }}</li>
{% if request.user.is_authenticated %}
<li>{{ project.customer.username }}</li>
{% endif %}
</ul>
</div>
<div class="col-lg-3 rightPro">
<p class="cenaPro">
{{ project.budget }} <i class="{% fa_currency_classes project.currency %}"></i>
</p>
<ul>
{% if project.secure_deal %}
<li>Безопасная сделка</li>
{% endif %}
<li>
{{ project.specialization.name }}
</li>
</ul>
</div>
</div>
{% endfor %}
<div class="container mainScore ">
<div class=" ">
<div class="col-lg-12 ">
<p class="titleScore">Поиск заказов</p>
</div>
{# FILTER#}
{% include 'partials/inc-projects-filter.html' %}
<div class="col-lg-12 pagin">
{% include 'partials/pagination.html' %}
<div class="col-lg-12 ">
<div id="projectsBlock">
{% include 'partials/inc-projects-results.html' %}
</div>
{% include 'partials/footer.html' %}
</div>
</form>
</div>
</div>
{% endblock %}
@ -229,6 +35,7 @@
<script src='{% static "lib/proekton-components/js/SimpleSelect.js" %}'></script>
<script src='{% static "lib/proekton-components/js/SpecTree.js" %}'></script>
<script src='{% static "lib/proekton-components/js/init.js" %}'></script>
<script src='{% static "projects-filter.js" %}'></script>
<script>
</script>

@ -286,26 +286,26 @@ def build_query(id_str, _class, *args):
class ProjectFilterView(BaseMixin, View):
template_name = 'project_filter.html'
form_class = ProjectFilterForm
def get(self, request, *args, **kwargs):
context = self.get_context_data(**_.merge({}, request.GET, kwargs))
form = self.form_class(request.GET, request=request)
# form_class = ProjectFilterForm
# renderer_classes = (TemplateHTMLRenderer,)
PROJECT_ORDER_CHOICES = ( # "Упорядочить по"...
('name', 'названию'),
('budget', 'цене'),
('created', 'дате размещения'),
('views', 'просмотрам'),
)
projects = Project.objects.filter(state='active')
specialization = request.GET.get('specialization')
keywords = request.GET.get('keywords')
building_classification = request.GET.get('building_classification')
construction_type = request.GET.get('construction_type')
location = request.GET.get('location')
cro = request.GET.get('cro')
order_by = request.GET.get('order_by')
last_order_by = request.GET.get('last_order_by')
reverse_order = request.GET.get('reverse_order')
ord = None
manual_sort = None
def filter(self, projects, data):
# print("filter data = ", data)
specialization = data.get('specialization')
keywords = data.get('keywords')
building_classification = data.get('building_classification')
construction_type = data.get('construction_type')
location = data.get('location')
cro = data.get('cro')
if keywords:
# print("keywords = ", keywords)
keywords = tuple(filter(None, re.split(r'\s|,|;', keywords)))
for k in keywords:
@ -334,31 +334,33 @@ class ProjectFilterView(BaseMixin, View):
if cro:
projects = projects.filter(cro=True)
# ORDERS
if order_by:
reverse_order = not reverse_order if order_by == last_order_by else False
ord = order_by
last_order_by = ord
elif last_order_by:
ord = last_order_by
if ord and ord == 'views':
projects = natsort.natsorted(projects.all(), key=lambda p: p.hit_count.hits, reverse=reverse_order)
manual_sort = True
elif ord:
projects = projects.order_by('-%s' % ord if reverse_order else ord)
context.update({
'last_order_by': last_order_by,
'reverse_order': reverse_order,
})
project_count = len(projects)
display_msg = 'Найдено %s проектов' % project_count if project_count > 0 else 'Ничего не найдено'
paginator = Paginator(projects if manual_sort else projects.all(), settings.PAGE_SIZE)
page = request.GET.get('page')
return projects
def sort_by(self, projects):
# order_by = request.GET.get('order_by')
# last_order_by = request.GET.get('last_order_by')
# reverse_order = request.GET.get('reverse_order')
# ord = None
# manual_sort = None
#
# # ORDERS
# if order_by:
# reverse_order = not reverse_order if order_by == last_order_by else False
# ord = order_by
# last_order_by = ord
# elif last_order_by:
# ord = last_order_by
#
# if ord and ord == 'views':
# projects = natsort.natsorted(projects.all(), key=lambda p: p.hit_count.hits, reverse=reverse_order)
# manual_sort = True
# elif ord:
# projects = projects.order_by('-%s' % ord if reverse_order else ord)
return projects
def pagination(self, projects, page):
paginator = Paginator(projects, settings.PAGE_SIZE)
# print("pag page = ", page)
try:
projects = paginator.page(page)
except PageNotAnInteger:
@ -366,16 +368,31 @@ class ProjectFilterView(BaseMixin, View):
except EmptyPage:
projects = paginator.page(paginator.num_pages)
return projects
def get_context(self, request):
context = request.dict()
projects = Project.objects.filter(state='active')
projects = self.filter(projects, request)
num_results = projects.count()
projects = self.sort_by(projects)
projects = self.pagination(projects, request.get("page"))
context.update({
'form': form,
# 'realty_form': realty_form,
'choices': self.PROJECT_ORDER_CHOICES,
'projects': projects,
'is_paginated': True,
# 'page_obj': projects,
'display_msg': display_msg,
'page_obj': projects,
'num_results': num_results,
})
return context
return render(request, self.template_name, context)
def get(self, request):
return render(request, self.template_name, self.get_context(request.GET))
def post(self, request):
return render(request, 'partials/inc-projects-results.html', self.get_context(request.POST))
class CustomerProjectCreateView(BaseMixin, View):

@ -0,0 +1,65 @@
{% if is_paginated %}
<nav>
<ul class="pagination">
<li>
<a
href="#"
aria-label="Previous"
{% if page_obj.has_previous %}
onclick="paginateTo({{ page_obj.previous_page_number }}); return false"
{% else %}
onclick="return false"
style="cursor: not-allowed"
{% endif %}>
<span class="glyphicon glyphicon-chevron-left" aria-hidden="true"></span>
</a>
</li>
{% if page_obj.number|sub:4 > 1 %}
<li><a href="#" onclick="paginateTo(1); return false">1</a></li>
<li>...</li>
{% endif %}
{% for n in page_obj.paginator.page_range %}
{% if n == page_obj.number %}
<li class="active"><a href="#" onclick="return false">{{ n }}</a></li>
{% elif n > page_obj.number|sub:4 and n < page_obj.number or n < page_obj.number|add:4 and n > page_obj.number %}
<li><a href="#" onclick="paginateTo({{ n }}); return false">{{ n }}</a></li>
{% endif %}
{% endfor %}
{% if page_obj.number|add:4 < page_obj.paginator.num_pages %}
<li>...</li>
<li><a href="#"
onclick="paginateTo({{ page_obj.paginator.num_pages }}); return false">{{ page_obj.paginator.num_pages }}</a>
</li>
{% endif %}
<li>
<a
href="#"
aria-label="Next"
{% if page_obj.has_next %}
onclick="paginateTo({{ page_obj.next_page_number }}); return false"
{% else %}
onclick="return false"
style="cursor: not-allowed"
{% endif %}>
<span class="glyphicon glyphicon-chevron-right" aria-hidden="true"></span>
</a>
</li>
</ul>
</nav>
<script>
function paginateTo(pageNum) {
const $form = $('#filter-form');
const postfix = "&page=" + pageNum;
sendData('/projects/', $form, pageNum);
modUrl($form, postfix);
return false;
}
</script>
{% endif %}
Loading…
Cancel
Save