mirror of
				https://github.com/inventree/InvenTree.git
				synced 2025-10-30 20:55:42 +00:00 
			
		
		
		
	Merge pull request #2901 from SchrodingersGat/multi-bom-fix
Refactor BOM table to not load multi level BOMs by default
This commit is contained in:
		| @@ -743,12 +743,30 @@ function loadBomTable(table, options={}) { | |||||||
|             field: 'sub_part', |             field: 'sub_part', | ||||||
|             title: '{% trans "Part" %}', |             title: '{% trans "Part" %}', | ||||||
|             sortable: true, |             sortable: true, | ||||||
|  |             switchable: false, | ||||||
|             formatter: function(value, row) { |             formatter: function(value, row) { | ||||||
|                 var url = `/part/${row.sub_part}/`; |                 var url = `/part/${row.sub_part}/`; | ||||||
|                 var html = imageHoverIcon(row.sub_part_detail.thumbnail) + renderLink(row.sub_part_detail.full_name, url); |                 var html = ''; | ||||||
|  |  | ||||||
|                 var sub_part = row.sub_part_detail; |                 var sub_part = row.sub_part_detail; | ||||||
|                  |                  | ||||||
|  |                 // Display an extra icon if this part is an assembly | ||||||
|  |                 if (sub_part.assembly) { | ||||||
|  |                      | ||||||
|  |                     if (row.sub_assembly_received) { | ||||||
|  |                         // Data received, ignore | ||||||
|  |                     } else if (row.sub_assembly_requested) { | ||||||
|  |                         html += `<a href='#'><span class='fas fa-sync fa-spin'></span></a>`; | ||||||
|  |                     } else { | ||||||
|  |                         html += ` | ||||||
|  |                             <a href='#' pk='${row.pk}' class='load-sub-assembly' id='load-sub-assembly-${row.pk}'> | ||||||
|  |                                 <span class='fas fa-sync-alt' title='{% trans "Load BOM for subassembly" %}'></span> | ||||||
|  |                             </a> `; | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 html += imageHoverIcon(sub_part.thumbnail) + renderLink(row.sub_part_detail.full_name, url); | ||||||
|  |  | ||||||
|                 html += makePartIcons(sub_part); |                 html += makePartIcons(sub_part); | ||||||
|  |  | ||||||
|                 if (row.substitutes && row.substitutes.length > 0) { |                 if (row.substitutes && row.substitutes.length > 0) { | ||||||
| @@ -759,13 +777,6 @@ function loadBomTable(table, options={}) { | |||||||
|                     html += makeIconBadge('fa-sitemap', '{% trans "Variant stock allowed" %}'); |                     html += makeIconBadge('fa-sitemap', '{% trans "Variant stock allowed" %}'); | ||||||
|                 } |                 } | ||||||
|  |  | ||||||
|                 // Display an extra icon if this part is an assembly |  | ||||||
|                 if (sub_part.assembly) { |  | ||||||
|                     var text = `<span title='{% trans "Open subassembly" %}' class='fas fa-stream float-right'></span>`; |  | ||||||
|  |  | ||||||
|                     html += renderLink(text, `/part/${row.sub_part}/bom/`); |  | ||||||
|                 } |  | ||||||
|  |  | ||||||
|                 return html; |                 return html; | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| @@ -1027,14 +1038,6 @@ function loadBomTable(table, options={}) { | |||||||
|     // This function may be called recursively for multi-level BOMs |     // This function may be called recursively for multi-level BOMs | ||||||
|     function requestSubItems(bom_pk, part_pk, depth=0) { |     function requestSubItems(bom_pk, part_pk, depth=0) { | ||||||
|  |  | ||||||
|         // Prevent multi-level recursion |  | ||||||
|         const MAX_BOM_DEPTH = 25; |  | ||||||
|  |  | ||||||
|         if (depth >= MAX_BOM_DEPTH) { |  | ||||||
|             console.log(`Maximum BOM depth (${MAX_BOM_DEPTH}) reached!`); |  | ||||||
|             return; |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         inventreeGet( |         inventreeGet( | ||||||
|             options.bom_url, |             options.bom_url, | ||||||
|             { |             { | ||||||
| @@ -1050,16 +1053,12 @@ function loadBomTable(table, options={}) { | |||||||
|                         response[idx].parentId = bom_pk; |                         response[idx].parentId = bom_pk; | ||||||
|                     } |                     } | ||||||
|  |  | ||||||
|  |                     var row = $(table).bootstrapTable('getRowByUniqueId', bom_pk); | ||||||
|  |                     row.sub_assembly_received = true; | ||||||
|  |  | ||||||
|  |                     $(table).bootstrapTable('updateByUniqueId', bom_pk, row, true); | ||||||
|  |                      | ||||||
|                     table.bootstrapTable('append', response); |                     table.bootstrapTable('append', response); | ||||||
|  |  | ||||||
|                     // Next, re-iterate and check if the new items also have sub items |  | ||||||
|                     response.forEach(function(bom_item) { |  | ||||||
|                         if (bom_item.sub_part_detail.assembly) { |  | ||||||
|                             requestSubItems(bom_item.pk, bom_item.sub_part, depth + 1); |  | ||||||
|                         } |  | ||||||
|                     }); |  | ||||||
|  |  | ||||||
|                     table.treegrid('collapseAll'); |  | ||||||
|                 }, |                 }, | ||||||
|                 error: function(xhr) { |                 error: function(xhr) { | ||||||
|                     console.log('Error requesting BOM for part=' + part_pk); |                     console.log('Error requesting BOM for part=' + part_pk); | ||||||
| @@ -1103,7 +1102,6 @@ function loadBomTable(table, options={}) { | |||||||
|         formatNoMatches: function() { |         formatNoMatches: function() { | ||||||
|             return '{% trans "No BOM items found" %}'; |             return '{% trans "No BOM items found" %}'; | ||||||
|         }, |         }, | ||||||
|         clickToSelect: true, |  | ||||||
|         queryParams: filters, |         queryParams: filters, | ||||||
|         original: params, |         original: params, | ||||||
|         columns: cols, |         columns: cols, | ||||||
| @@ -1117,32 +1115,26 @@ function loadBomTable(table, options={}) { | |||||||
|             }); |             }); | ||||||
|  |  | ||||||
|             table.treegrid('collapseAll'); |             table.treegrid('collapseAll'); | ||||||
|  |  | ||||||
|  |             // Callback for 'load sub assembly' button | ||||||
|  |             $(table).find('.load-sub-assembly').click(function(event) { | ||||||
|  |  | ||||||
|  |                 event.preventDefault(); | ||||||
|  |  | ||||||
|  |                 var pk = $(this).attr('pk'); | ||||||
|  |                 var row = $(table).bootstrapTable('getRowByUniqueId', pk); | ||||||
|  |  | ||||||
|  |                 // Request BOM data for this subassembly | ||||||
|  |                 requestSubItems(row.pk, row.sub_part); | ||||||
|  |  | ||||||
|  |                 row.sub_assembly_requested = true; | ||||||
|  |                 $(table).bootstrapTable('updateByUniqueId', pk, row, true); | ||||||
|  |             }); | ||||||
|         }, |         }, | ||||||
|         onLoadSuccess: function() { |         onLoadSuccess: function() { | ||||||
|  |  | ||||||
|             if (options.editable) { |             if (options.editable) { | ||||||
|                 table.bootstrapTable('uncheckAll'); |                 table.bootstrapTable('uncheckAll'); | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             var data = table.bootstrapTable('getData'); |  | ||||||
|  |  | ||||||
|             for (var idx = 0; idx < data.length; idx++) { |  | ||||||
|                 var row = data[idx]; |  | ||||||
|  |  | ||||||
|                 // If a row already has a parent ID set, it's already been updated! |  | ||||||
|                 if (row.parentId) { |  | ||||||
|                     continue; |  | ||||||
|                 } |  | ||||||
|  |  | ||||||
|                 // Set the parent ID of the top-level rows |  | ||||||
|                 row.parentId = parent_id; |  | ||||||
|  |  | ||||||
|                 table.bootstrapTable('updateRow', idx, row, true); |  | ||||||
|  |  | ||||||
|                 if (row.sub_part_detail.assembly) { |  | ||||||
|                     requestSubItems(row.pk, row.sub_part); |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|         }, |         }, | ||||||
|     }); |     }); | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user