From f578f680017467f88699f7733d1ede145d26f70d Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Tue, 20 Apr 2021 19:30:43 +1000 Subject: [PATCH] Split "part category" view into separate pages --- InvenTree/part/templates/part/category.html | 28 +++----- .../part/templates/part/category_navbar.html | 17 +++++ .../templates/part/category_subcategory.html | 42 +++++++++++ .../part/templates/part/subcategories.html | 22 ------ InvenTree/part/urls.py | 29 +++++--- InvenTree/templates/js/part.js | 70 +++++++++++++++++++ 6 files changed, 156 insertions(+), 52 deletions(-) create mode 100644 InvenTree/part/templates/part/category_subcategory.html delete mode 100644 InvenTree/part/templates/part/subcategories.html diff --git a/InvenTree/part/templates/part/category.html b/InvenTree/part/templates/part/category.html index 0d1d11e7fd..04594afb3b 100644 --- a/InvenTree/part/templates/part/category.html +++ b/InvenTree/part/templates/part/category.html @@ -2,6 +2,10 @@ {% load static %} {% load i18n %} +{% block menubar %} +{% include 'part/category_navbar.html' with tab='parts' %} +{% endblock %} + {% block content %}
@@ -100,14 +104,10 @@
- {% if category and category.children.all|length > 0 %} - {% include "part/subcategories.html" with children=category.children.all collapse_id="categories" %} - {% elif children|length > 0 %} - {% include "part/subcategories.html" with children=children collapse_id="categories" %} - {% endif %} - +{% block category_content %} +
+{% endblock %} + {% block category_tables %} {% endblock category_tables %} @@ -162,24 +164,10 @@ {% block js_ready %} {{ block.super }} - {% if category %} enableNavbar({ label: 'category', toggleId: '#category-menu-toggle', }); - {% endif %} - - if (inventreeLoadInt("show-part-cats") == 1) { - $("#collapse-item-categories").collapse('show'); - } - - $("#collapse-item-categories").on('shown.bs.collapse', function() { - inventreeSave('show-part-cats', 1); - }); - - $("#collapse-item-categories").on('hidden.bs.collapse', function() { - inventreeDel('show-part-cats'); - }); $("#cat-create").click(function() { launchModalForm( diff --git a/InvenTree/part/templates/part/category_navbar.html b/InvenTree/part/templates/part/category_navbar.html index 9374ecaaf1..e723db358d 100644 --- a/InvenTree/part/templates/part/category_navbar.html +++ b/InvenTree/part/templates/part/category_navbar.html @@ -8,17 +8,34 @@ +
  • + {% if category %} + + {% else %} + + {% endif %} + + {% trans "Subcategories" %} + +
  • +
  • + {% if category %} + {% else %} + + {% endif %} {% trans "Parts" %}
  • + {% if category %}
  • {% trans "Parameters" %}
  • + {% endif %} \ No newline at end of file diff --git a/InvenTree/part/templates/part/category_subcategory.html b/InvenTree/part/templates/part/category_subcategory.html new file mode 100644 index 0000000000..e45e01499a --- /dev/null +++ b/InvenTree/part/templates/part/category_subcategory.html @@ -0,0 +1,42 @@ +{% extends "part/category.html" %} + +{% load i18n %} +{% load inventree_extras %} +{% load static %} + +{% block menubar %} +{% include 'part/category_navbar.html' with tab='subcategories' %} +{% endblock %} + +{% block category_content %} + +
    + +
    +

    {% trans "Subcategories" %}

    +
    + +
    + +
    +{% endblock %} + +{% block js_ready %} +{{ block.super }} + + enableNavbar({ + label: 'category', + toggleId: '#category-menu-toggle', + }); + + loadPartCategoryTable($('#subcategory-table'), { + params: { + {% if category %} + parent: {{ category.pk }} + {% else %} + parent: 'null' + {% endif %} + } + }); + +{% endblock %} diff --git a/InvenTree/part/templates/part/subcategories.html b/InvenTree/part/templates/part/subcategories.html deleted file mode 100644 index 5e6b570217..0000000000 --- a/InvenTree/part/templates/part/subcategories.html +++ /dev/null @@ -1,22 +0,0 @@ -{% extends "collapse.html" %} -{% load i18n %} - -{% block collapse_title %} -{{ children | length }} {% trans 'Child Categories' %} -{% endblock %} - -{% block collapse_content %} - -{% endblock %} \ No newline at end of file diff --git a/InvenTree/part/urls.py b/InvenTree/part/urls.py index f1185fbe8c..b8f80d4845 100644 --- a/InvenTree/part/urls.py +++ b/InvenTree/part/urls.py @@ -88,14 +88,26 @@ category_parameter_urls = [ url(r'^(?P\d+)/delete/', views.CategoryParameterTemplateDelete.as_view(), name='category-param-template-delete'), ] -part_category_urls = [ - url(r'^edit/?', views.CategoryEdit.as_view(), name='category-edit'), - url(r'^delete/?', views.CategoryDelete.as_view(), name='category-delete'), +category_urls = [ - url(r'^parameters/', include(category_parameter_urls)), + # Create a new category + url(r'^new/', views.CategoryCreate.as_view(), name='category-create'), - url(r'^parametric/?', views.CategoryParametric.as_view(), name='category-parametric'), - url(r'^.*$', views.CategoryDetail.as_view(), name='category-detail'), + # Top level subcategory display + url(r'^subcategory/', views.PartIndex.as_view(template_name='part/category_subcategory.html'), name='category-index-subcategory'), + + # Category detail views + url(r'(?P\d+)/', include([ + url(r'^edit/', views.CategoryEdit.as_view(), name='category-edit'), + url(r'^delete/', views.CategoryDelete.as_view(), name='category-delete'), + url(r'^parameters/', include(category_parameter_urls)), + + url(r'^subcategory/', views.CategoryDetail.as_view(template_name='part/category_subcategory.html'), name='category-subcategory'), + url(r'^parametric/', views.CategoryParametric.as_view(), name='category-parametric'), + + # Anything else + url(r'^.*$', views.CategoryDetail.as_view(), name='category-detail'), + ])) ] part_bom_urls = [ @@ -106,9 +118,6 @@ part_bom_urls = [ # URL list for part web interface part_urls = [ - # Create a new category - url(r'^category/new/?', views.CategoryCreate.as_view(), name='category-create'), - # Create a new part url(r'^new/?', views.PartCreate.as_view(), name='part-create'), @@ -125,7 +134,7 @@ part_urls = [ url(r'^(?P\d+)/', include(part_detail_urls)), # Part category - url(r'^category/(?P\d+)/', include(part_category_urls)), + url(r'^category/', include(category_urls)), # Part related url(r'^related-parts/', include(part_related_urls)), diff --git a/InvenTree/templates/js/part.js b/InvenTree/templates/js/part.js index cefc2af8a7..b7e052ce72 100644 --- a/InvenTree/templates/js/part.js +++ b/InvenTree/templates/js/part.js @@ -1,4 +1,5 @@ {% load i18n %} +{% load inventree_extras %} /* Part API functions * Requires api.js to be loaded first @@ -506,6 +507,75 @@ function loadPartTable(table, url, options={}) { }); } + +function loadPartCategoryTable(table, options) { + /* Display a table of part categories */ + + var params = options.params || {}; + + var filterListElement = options.filterList || '#filter-list-category'; + + var filters = {}; + + var filterKey = options.filterKey || options.name || 'category'; + + if (!options.disableFilters) { + filters = loadTableFilters(filterKey); + } + + var original = {}; + + for (var key in params) { + original[key] = params[key]; + filters[key] = params[key]; + } + + setupFilterList(filterKey, table, filterListElement); + + table.inventreeTable({ + method: 'get', + url: options.url || '{% url "api-part-category-list" %}', + queryParams: filters, + sidePagination: 'server', + name: 'category', + original: original, + showColumns: true, + columns: [ + { + checkbox: true, + title: '{% trans "Select" %}', + searchable: false, + switchable: false, + }, + { + field: 'name', + title: '{% trans "Name" %}', + switchable: true, + sortable: true, + formatter: function(value, row) { + return renderLink( + value, + `/part/category/${row.pk}/` + ); + } + }, + { + field: 'description', + title: '{% trans "Description" %}', + switchable: true, + sortable: false, + }, + { + field: 'parts', + title: '{% trans "Parts" %}', + switchable: true, + sortable: false, + } + ] + }); +} + + function yesNoLabel(value) { if (value) { return `{% trans "YES" %}`;