diff --git a/InvenTree/InvenTree/static/script/inventree/tables.js b/InvenTree/InvenTree/static/script/inventree/tables.js index e319aa8440..be0e1e6325 100644 --- a/InvenTree/InvenTree/static/script/inventree/tables.js +++ b/InvenTree/InvenTree/static/script/inventree/tables.js @@ -80,11 +80,28 @@ function reloadTable(table, filters) { } +function visibleColumnString(columns) { + /* Generate a list of "visible" columns to save to file. */ + + var fields = []; + + columns.forEach(function(column) { + if (column.switchable && column.visible) { + fields.push(column.field); + } + }); + + return fields.join(','); +} + + /* Wrapper function for bootstrapTable. * Sets some useful defaults, and manage persistent settings. */ $.fn.inventreeTable = function(options) { + var table = this; + var tableName = options.name || 'table'; var varName = tableName + '-pagesize'; @@ -95,14 +112,51 @@ $.fn.inventreeTable = function(options) { options.rememberOrder = true; options.sortable = true; options.search = true; + options.showColumns = true; // Callback to save pagination data options.onPageChange = function(number, size) { inventreeSave(varName, size); }; + // Callback when a column is changed + options.onColumnSwitch = function(field, checked) { + console.log(`${field} -> ${checked}`); + + var columns = table.bootstrapTable('getVisibleColumns'); + + var text = visibleColumnString(columns); + + // Save visible columns + inventreeSave(`table_columns_${tableName}`, text); + }; + // Standard options for all tables - this.bootstrapTable(options); + table.bootstrapTable(options); + + // Load visible column list from memory + // Load visible column list + var visibleColumns = inventreeLoad(`table_columns_${tableName}`, null); + + // If a set of visible columns has been saved, load! + if (visibleColumns) { + var columns = visibleColumns.split(","); + + // Which columns are currently visible? + var visible = table.bootstrapTable('getVisibleColumns'); + + if (visible) { + visible.forEach(function(column) { + + // Visible field should *not* be visible! (hide it!) + if (column.switchable && !columns.includes(column.field)) { + table.bootstrapTable('hideColumn', column.field); + } + }); + } else { + console.log('Could not get list of visible columns!'); + } + } } function customGroupSorter(sortName, sortOrder, sortData) { diff --git a/InvenTree/order/templates/order/purchase_order_detail.html b/InvenTree/order/templates/order/purchase_order_detail.html index de066500b2..9b9eddb887 100644 --- a/InvenTree/order/templates/order/purchase_order_detail.html +++ b/InvenTree/order/templates/order/purchase_order_detail.html @@ -127,6 +127,7 @@ function setupCallbacks() { $("#po-table").inventreeTable({ onPostBody: setupCallbacks, + name: 'purchaseorder', formatNoMatches: function() { return "{% trans 'No line items found' %}"; }, queryParams: { order: {{ order.id }}, @@ -138,6 +139,7 @@ $("#po-table").inventreeTable({ field: 'pk', title: 'ID', visible: false, + switchable: false, }, { field: 'part', diff --git a/InvenTree/order/templates/order/sales_order_detail.html b/InvenTree/order/templates/order/sales_order_detail.html index 75c5fc3d7b..b6cc761cc7 100644 --- a/InvenTree/order/templates/order/sales_order_detail.html +++ b/InvenTree/order/templates/order/sales_order_detail.html @@ -190,6 +190,7 @@ $("#so-lines-table").inventreeTable({ field: 'pk', title: 'ID', visible: false, + switchable: false, }, { sortable: true, diff --git a/InvenTree/part/templates/part/used_in.html b/InvenTree/part/templates/part/used_in.html index ce0491a165..3a6605847e 100644 --- a/InvenTree/part/templates/part/used_in.html +++ b/InvenTree/part/templates/part/used_in.html @@ -29,6 +29,7 @@ field: 'pk', title: 'ID', visible: false, + switchable: false, }, { field: 'part_detail', diff --git a/InvenTree/templates/InvenTree/settings/currency.html b/InvenTree/templates/InvenTree/settings/currency.html index 9c602a67fc..c585011ecd 100644 --- a/InvenTree/templates/InvenTree/settings/currency.html +++ b/InvenTree/templates/InvenTree/settings/currency.html @@ -37,6 +37,7 @@ field: 'pk', title: 'ID', visible: false, + switchable: false, }, { field: 'symbol', diff --git a/InvenTree/templates/InvenTree/settings/part.html b/InvenTree/templates/InvenTree/settings/part.html index 49631cd67d..5eba81a72a 100644 --- a/InvenTree/templates/InvenTree/settings/part.html +++ b/InvenTree/templates/InvenTree/settings/part.html @@ -31,6 +31,7 @@ field: 'pk', title: 'ID', visible: false, + switchable: false, }, { field: 'name', diff --git a/InvenTree/templates/js/bom.html b/InvenTree/templates/js/bom.html index 122b1b7ba8..cab2a08b13 100644 --- a/InvenTree/templates/js/bom.html +++ b/InvenTree/templates/js/bom.html @@ -111,6 +111,7 @@ function loadBomTable(table, options) { field: 'pk', title: 'ID', visible: false, + switchable: false, }, ]; @@ -320,6 +321,7 @@ function loadBomTable(table, options) { parentIdField: 'parentId', treeShowField: 'sub_part', showColumns: true, + name: 'bom', sortable: true, search: true, rowStyle: function(row, index) { diff --git a/InvenTree/templates/js/build.html b/InvenTree/templates/js/build.html index b48e6a2a09..8682e9bd81 100644 --- a/InvenTree/templates/js/build.html +++ b/InvenTree/templates/js/build.html @@ -21,12 +21,14 @@ function loadBuildTable(table, options) { url: options.url, queryParams: filters, groupBy: false, + name: 'builds', original: params, columns: [ { field: 'pk', title: 'ID', visible: false, + switchable: false, }, { field: 'title', diff --git a/InvenTree/templates/js/company.html b/InvenTree/templates/js/company.html index 8b278e2a21..ef80070d99 100644 --- a/InvenTree/templates/js/company.html +++ b/InvenTree/templates/js/company.html @@ -27,16 +27,20 @@ function loadCompanyTable(table, url, options={}) { queryParams: filters, groupBy: false, formatNoMatches: function() { return "{% trans "No company information found" %}"; }, + showColumns: true, + name: 'company', columns: [ { field: 'pk', title: 'ID', visible: false, + switchable: false, }, { field: 'name', title: '{% trans "Company" %}', sortable: true, + switchable: false, formatter: function(value, row, index, field) { var html = imageHoverIcon(row.image) + renderLink(value, row.url); @@ -97,11 +101,13 @@ function loadSupplierPartTable(table, url, options) { url: url, method: 'get', queryParams: filters, + name: 'supplierparts', groupBy: false, formatNoMatches: function() { return "{% trans "No supplier parts found" %}"; }, columns: [ { checkbox: true, + switchable: false, }, { sortable: true, diff --git a/InvenTree/templates/js/order.html b/InvenTree/templates/js/order.html index 17bd67cabb..c16b40583c 100644 --- a/InvenTree/templates/js/order.html +++ b/InvenTree/templates/js/order.html @@ -121,6 +121,7 @@ function loadPurchaseOrderTable(table, options) { $(table).inventreeTable({ url: options.url, queryParams: filters, + name: 'purchaseorder', groupBy: false, original: options.params, formatNoMatches: function() { return "{% trans "No purchase orders found" %}"; }, @@ -129,6 +130,7 @@ function loadPurchaseOrderTable(table, options) { field: 'pk', title: 'ID', visible: false, + switchable: false, }, { sortable: true, @@ -194,6 +196,7 @@ function loadSalesOrderTable(table, options) { $(table).inventreeTable({ url: options.url, queryParams: filters, + name: 'salesorder', groupBy: false, original: options.params, formatNoMatches: function() { return "{% trans "No sales orders found" %}"; }, @@ -202,6 +205,7 @@ function loadSalesOrderTable(table, options) { field: 'pk', title: 'ID', visible: false, + switchable: false, }, { sortable: true, diff --git a/InvenTree/templates/js/part.html b/InvenTree/templates/js/part.html index c9901cdb68..a1c3283c1c 100644 --- a/InvenTree/templates/js/part.html +++ b/InvenTree/templates/js/part.html @@ -237,6 +237,7 @@ function loadPartTable(table, url, options={}) { method: 'get', queryParams: filters, groupBy: false, + name: 'part', original: params, formatNoMatches: function() { return "{% trans "No parts found" %}"; }, columns: columns, @@ -338,6 +339,7 @@ function loadPartTestTemplateTable(table, options) { }, url: "{% url 'api-part-test-template-list' %}", queryParams: filters, + name: 'testtemplate', original: original, columns: [ { diff --git a/InvenTree/templates/js/stock.html b/InvenTree/templates/js/stock.html index 9393b29739..bb0673c16d 100644 --- a/InvenTree/templates/js/stock.html +++ b/InvenTree/templates/js/stock.html @@ -73,6 +73,7 @@ function loadStockTestResultsTable(table, options) { table.inventreeTable({ url: "{% url 'api-part-test-template-list' %}", method: 'get', + name: 'testresult', formatNoMatches: function() { return "{% trans 'No test results found' %}"; }, @@ -84,6 +85,7 @@ function loadStockTestResultsTable(table, options) { field: 'pk', title: 'ID', visible: false, + switchable: false, }, { field: 'test_name', @@ -264,6 +266,7 @@ function loadStockTable(table, options) { queryParams: filters, customSort: customGroupSorter, groupBy: true, + name: 'stock', original: original, showColumns: true, groupByField: options.groupByField || 'part', @@ -405,6 +408,7 @@ function loadStockTable(table, options) { checkbox: true, title: '{% trans "Select" %}', searchable: false, + switchable: false, }, { field: 'pk',