diff options
-rw-r--r-- | ishtar_common/templates/ishtar/import_step_by_step.html | 46 | ||||
-rw-r--r-- | ishtar_common/views.py | 48 | ||||
-rw-r--r-- | scss/custom.scss | 17 |
3 files changed, 91 insertions, 20 deletions
diff --git a/ishtar_common/templates/ishtar/import_step_by_step.html b/ishtar_common/templates/ishtar/import_step_by_step.html index 2d80f2386..44c5389d3 100644 --- a/ishtar_common/templates/ishtar/import_step_by_step.html +++ b/ishtar_common/templates/ishtar/import_step_by_step.html @@ -3,21 +3,39 @@ {% block content %} -{% comment %} -<nav aria-label="Page navigation example"> - <ul class="pagination justify-content-center"> - <li class="page-item disabled"> - <a class="page-link" href="#" tabindex="-1">Previous</a> - </li> - <li class="page-item"><a class="page-link" href="#">1</a></li> - <li class="page-item"><a class="page-link" href="#">2</a></li> - <li class="page-item"><a class="page-link" href="#">3</a></li> - <li class="page-item"> - <a class="page-link" href="#">Next</a> - </li> - </ul> +<nav class="row"> + <ul class="pagination col-md-6 justify-content-center"> + {% for label, page_number, enabled, imported in page_numbers %} + <li class="page-item{% if not enabled %} disabled{% endif %}" + {% if not enabled %} tabindex="-1"{% endif %}> + <a class="page-link{% if imported %} imported-page{% endif %}{% if page_number == line_number_displayed %} current-page{% endif %}" + {% if imported %}title="{% trans 'Already imported' %}"{% endif %} + href="{% url 'import_step_by_step' import.pk page_number %}"> + {{label}} + </a> + </li> + {% endfor %} + </ul> + <div class="col-md-6 justify-content-center"> + <form action="." method="post" name='step-by-step-page'> + {% csrf_token %} + <div class="input-group"> + <div class="input-group-prepend"> + <span class="input-group-text">{% trans "Line" %}</span> + </div> + <input type="number" class="form-control small-input" + name="line-to-go" + required="required"/> + <div class="input-group-append"> + <button type="submit" name="valid" + value="change-page" class="btn btn-secondary"> + {% trans "Go" %} + </button> + </div> + </div> + </form> + </div> </nav> -{% endcomment %} <h2>{% trans "Import step by step" %} – {{import.name}} – {% trans "line " %} {{line_number_displayed}}</h2> diff --git a/ishtar_common/views.py b/ishtar_common/views.py index 9ff53e89a..1536868d4 100644 --- a/ishtar_common/views.py +++ b/ishtar_common/views.py @@ -1890,25 +1890,30 @@ class ImportStepByStepView(IshtarMixin, LoginRequiredMixin, TemplateView): self.errors = [e.message] return super(ImportStepByStepView, self).get(request, *args, **kwargs) - is_current = self.current_line_number == self.imprt_obj.current_line if self.imprt_obj.get_number_of_lines() >= self.current_line_number: self.current_line_number += 1 else: self.current_line_number = None - if is_current: - self.imprt_obj.current_line = self.current_line_number - self.imprt_obj.save() + self.imprt_obj.current_line = self.current_line_number + self.imprt_obj.save() return self.current_line_number def post(self, request, *args, **kwargs): if not request.POST or request.POST.get('valid', None) not in ( - 'change-csv', 'import'): + 'change-csv', 'import', 'change-page'): return self.get(request, *args, **kwargs) - self.get_import() + + if request.POST.get('valid') == 'change-page': + return HttpResponseRedirect( + reverse('import_step_by_step', + args=[self.imprt_obj.pk, + request.POST.get('line-to-go', None)])) + if request.POST.get('valid') == 'change-csv': self.update_csv(request) return self.get(request, *args, **kwargs) + if not self.import_line(request, *args, **kwargs): return HttpResponseRedirect(reverse('current_imports')) else: @@ -1932,16 +1937,47 @@ class ImportStepByStepView(IshtarMixin, LoginRequiredMixin, TemplateView): **kwargs) if not data or not data[0]: self.errors = self.imprt.errors + if not self.errors: + self.errors = [("", "", _(u"No data provided"))] else: self.new_data = data[:] return super(ImportStepByStepView, self).get(request, *args, **kwargs) + def get_pagination(self, dct): + pagination_step = 10 + line_nb = self.imprt_obj.get_number_of_lines() + total_line_nb = self.imprt_obj.skip_lines + line_nb + delta = int((self.current_line_number + 1) / pagination_step) + already_imported = self.imprt_obj.imported_line_numbers.split(',') + + dct['page_is_last'] = self.current_line_number == line_nb + dct['page_numbers'] = [] # label, number, enabled, is_imported + if delta > 0: + dct['page_numbers'].append( + (_(u"Previous"), delta * pagination_step - 1, True, False) + ) + else: + dct['page_numbers'].append( + (_(u"Previous"), self.imprt_obj.skip_lines, False, False) + ) + for idx in range(0, 10): + nb = idx + delta * pagination_step + if nb > self.imprt_obj.skip_lines and nb <= total_line_nb: + imported = str(nb) in already_imported + dct['page_numbers'].append((nb, nb, True, imported)) + if nb + 1 <= total_line_nb: + dct['page_numbers'].append((_(u"Next"), nb + 1, True, False)) + else: + dct['page_numbers'].append((_(u"Next"), total_line_nb, False, + False)) + def get_context_data(self, **kwargs): dct = super(ImportStepByStepView, self).get_context_data(**kwargs) dct['import'] = self.imprt_obj dct['line_number_displayed'] = self.current_line_number + 1 dct['line_is_imported'] = self.imprt_obj.line_is_imported( self.current_line_number) + self.get_pagination(dct) dct['errors'] = self.errors if self.errors: if self.imprt.current_csv_line: diff --git a/scss/custom.scss b/scss/custom.scss index bcc808637..5aadfee48 100644 --- a/scss/custom.scss +++ b/scss/custom.scss @@ -10,6 +10,7 @@ $action-color: #ffe484; $action-button-color: darken($action-color, 20%); $ishtar-color: darken($purple, 20%); $ishtar-secondary-color: $purple; +$ishtar-light-color: lighten($purple, 20%); $dark-secondary-color: rgba(255,255,255,0.8); html{ @@ -27,10 +28,26 @@ label { min-height: 1.5rem; } +.form-control.small-input, +.input-group > .form-control.small-input{ + width: 110px; + flex: none; +} + .input-group > input[type=checkbox]{ margin: 0.5em 1em; } +.page-link.imported-page { + color: $ishtar-light-color; +} + +.page-link.imported-page.current-page, +.page-link.current-page { + color: black; + font-weight: bold; +} + .modal-dialog.full { width: 98%; height: 98%; |