mirror of
				https://github.com/inventree/InvenTree.git
				synced 2025-10-30 20:55:42 +00:00 
			
		
		
		
	Fix bug in recent part scheduling table (#3566)
* Gotta make a variable to reference a variable * Fix scaling issues * Hey, it's only a suggestion * Fix quantity display in build order table * Logic fix for destroying / refreshing chart * Better handling of edge cases * Fix issue with "undefined" labels * Speculative should be a question mark
This commit is contained in:
		| @@ -435,8 +435,12 @@ | ||||
|         var chart = loadPartSchedulingChart('part-schedule-chart', {{ part.pk }}); | ||||
|  | ||||
|         $('#btn-schedule-reload').click(function() { | ||||
|  | ||||
|             if (chart != null) { | ||||
|                 chart.destroy(); | ||||
|             loadPartSchedulingChart('part-schedule-chart', {{ part.pk }}); | ||||
|             } | ||||
|  | ||||
|             chart = loadPartSchedulingChart('part-schedule-chart', {{ part.pk }}); | ||||
|         }); | ||||
|     }); | ||||
|  | ||||
|   | ||||
| @@ -1831,6 +1831,7 @@ function loadBuildOutputAllocationTable(buildInfo, output, options={}) { | ||||
|                     var available_stock = availableQuantity(row); | ||||
|  | ||||
|                     var required = requiredQuantity(row); | ||||
|                     var allocated = allocatedQuantity(row); | ||||
|  | ||||
|                     var text = ''; | ||||
|  | ||||
| @@ -1838,7 +1839,7 @@ function loadBuildOutputAllocationTable(buildInfo, output, options={}) { | ||||
|                         text += `${available_stock}`; | ||||
|                     } | ||||
|  | ||||
|                     if (available_stock < required) { | ||||
|                     if (available_stock < (required - allocated)) { | ||||
|                         text += `<span class='fas fa-times-circle icon-red float-right' title='{% trans "Insufficient stock available" %}'></span>`; | ||||
|                     } else { | ||||
|                         text += `<span class='fas fa-check-circle icon-green float-right' title='{% trans "Sufficient stock available" %}'></span>`; | ||||
|   | ||||
| @@ -2269,6 +2269,8 @@ function loadPartSchedulingChart(canvas_id, part_id) { | ||||
|  | ||||
|     var part_info = null; | ||||
|  | ||||
|     var was_error = false; | ||||
|  | ||||
|     // First, grab updated data for the particular part | ||||
|     inventreeGet(`/api/part/${part_id}/`, {}, { | ||||
|         async: false, | ||||
| @@ -2302,6 +2304,8 @@ function loadPartSchedulingChart(canvas_id, part_id) { | ||||
|     var initial_stock_min = part_info.in_stock; | ||||
|     var initial_stock_max = part_info.in_stock; | ||||
|  | ||||
|     var n_entries = 0; | ||||
|  | ||||
|     /* Request scheduling information for the part. | ||||
|      * Note that this information has already been 'curated' by the server, | ||||
|      * and arranged in increasing chronological order | ||||
| @@ -2313,6 +2317,8 @@ function loadPartSchedulingChart(canvas_id, part_id) { | ||||
|             async: false, | ||||
|             success: function(response) { | ||||
|  | ||||
|                 n_entries = response.length; | ||||
|  | ||||
|                 for (var idx = 0; idx < response.length; idx++) { | ||||
|  | ||||
|                     var entry = response[idx]; | ||||
| @@ -2330,7 +2336,7 @@ function loadPartSchedulingChart(canvas_id, part_id) { | ||||
|                     var quantity_string = entry.quantity + entry.speculative_quantity; | ||||
|  | ||||
|                     if (entry.speculative_quantity != 0) { | ||||
|                         quantity_string += `<span class='fas fa-info-circle icon-blue float-right' title='{% trans "Speculative" %}'></span>`; | ||||
|                         quantity_string += `<span class='fas fa-question-circle icon-blue float-right' title='{% trans "Speculative" %}'></span>`; | ||||
|                     } | ||||
|  | ||||
|                     // Add an entry to the scheduling table | ||||
| @@ -2376,7 +2382,7 @@ function loadPartSchedulingChart(canvas_id, part_id) { | ||||
|  | ||||
|     // If no scheduling information is available for the part, | ||||
|     // remove the chart and display a message instead | ||||
|     if (quantity_scheduled.length <= 1) { | ||||
|     if (n_entries < 1) { | ||||
|  | ||||
|         var message = ` | ||||
|         <div class='alert alert-block alert-info'> | ||||
| @@ -2395,9 +2401,13 @@ function loadPartSchedulingChart(canvas_id, part_id) { | ||||
|  | ||||
|         canvas_element.closest('div').html(message); | ||||
|  | ||||
|         $('#part-schedule-table').hide(); | ||||
|  | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     $('#part-schedule-table').show(); | ||||
|  | ||||
|     var y_min = 0; | ||||
|     var y_max = 0; | ||||
|  | ||||
| @@ -2435,22 +2445,44 @@ function loadPartSchedulingChart(canvas_id, part_id) { | ||||
|         q_spec_min.push({ | ||||
|             x: date, | ||||
|             y: speculative_min, | ||||
|             label: 'label', | ||||
|             label: '', | ||||
|             title: '', | ||||
|         }); | ||||
|  | ||||
|         q_spec_max.push({ | ||||
|             x: date, | ||||
|             y: speculative_max, | ||||
|             label: 'label', | ||||
|             label: '', | ||||
|             title: '', | ||||
|         }); | ||||
|  | ||||
|         // Update min / max values | ||||
|         if (quantity < y_min) y_min = quantity; | ||||
|         if (quantity > y_max) y_max = quantity; | ||||
|  | ||||
|         if (speculative_min < y_min) y_min = speculative_min; | ||||
|         if (speculative_max > y_max) y_max = speculative_max; | ||||
|     } | ||||
|  | ||||
|     // Add one extra data point at the end | ||||
|     var n = quantity_scheduled.length; | ||||
|     var final_date = quantity_scheduled[n - 1].date.add(1, 'd').format('YYYY-MM-DD'); | ||||
|  | ||||
|     quantity_scheduled.push({ | ||||
|         x: final_date, | ||||
|         y: quantity_scheduled[n - 1].y, | ||||
|     }); | ||||
|  | ||||
|     q_spec_min.push({ | ||||
|         x: final_date, | ||||
|         y: q_spec_min[n - 1].y, | ||||
|     }); | ||||
|  | ||||
|     q_spec_max.push({ | ||||
|         x: final_date, | ||||
|         y: q_spec_max[n - 1].y, | ||||
|     }); | ||||
|  | ||||
|     var context = document.getElementById(canvas_id); | ||||
|  | ||||
|     var data = { | ||||
| @@ -2487,7 +2519,7 @@ function loadPartSchedulingChart(canvas_id, part_id) { | ||||
|         // Construct a 'minimum stock' threshold line | ||||
|         var minimum_stock_curve = [ | ||||
|             { | ||||
|                 x: today.format(), | ||||
|                 x: quantity_scheduled[0].x, | ||||
|                 y: part_info.minimum_stock, | ||||
|             }, | ||||
|             { | ||||
| @@ -2513,11 +2545,21 @@ function loadPartSchedulingChart(canvas_id, part_id) { | ||||
|     // Update the table | ||||
|     $('#part-schedule-table').find('tbody').html(table_html); | ||||
|  | ||||
|     if (y_max < part_info.minimum_stock) { | ||||
|         y_max = part_info.minimum_stock; | ||||
|     } | ||||
|  | ||||
|     var y_range = y_max - y_min; | ||||
|  | ||||
|     y_max += 0.1 * y_range; | ||||
|     y_min -= 0.1 * y_range; | ||||
|  | ||||
|     // Prevent errors if y-scale is weird | ||||
|     if (y_max == y_min) { | ||||
|         y_min -= 1; | ||||
|         y_max += 1; | ||||
|     } | ||||
|  | ||||
|     return new Chart(context, { | ||||
|         type: 'scatter', | ||||
|         data: data, | ||||
| @@ -2527,30 +2569,31 @@ function loadPartSchedulingChart(canvas_id, part_id) { | ||||
|             scales: { | ||||
|                 x: { | ||||
|                     type: 'time', | ||||
|                     min: today.format(), | ||||
|                     suggestedMin: today.format(), | ||||
|                     suggestedMax: quantity_scheduled[quantity_scheduled.length - 1].x, | ||||
|                     position: 'bottom', | ||||
|                     time: { | ||||
|                         unit: 'day', | ||||
|                         minUnit: 'day', | ||||
|                     }, | ||||
|                 }, | ||||
|                 y: { | ||||
|                     min: y_min, | ||||
|                     max: y_max, | ||||
|                     suggestedMin: y_min, | ||||
|                     suggestedMax: y_max, | ||||
|                 } | ||||
|             }, | ||||
|             plugins: { | ||||
|                 tooltip: { | ||||
|                     callbacks: { | ||||
|                         label: function(item) { | ||||
|                             return item.raw.label; | ||||
|                             return item.raw.label || ''; | ||||
|                         }, | ||||
|                         beforeLabel: function(item) { | ||||
|                             return item.raw.title; | ||||
|                             return item.raw.title || ''; | ||||
|                         }, | ||||
|                         afterLabel: function(item) { | ||||
|                             var delta = item.raw.delta; | ||||
|  | ||||
|                             if (delta == 0) { | ||||
|                             if (delta == null || delta == 0) { | ||||
|                                 delta = ''; | ||||
|                             } else { | ||||
|                                 delta = ` (${item.raw.delta > 0 ? '+' : ''}${item.raw.delta})`; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user