google.charts.load('current', { packages: ['corechart', 'bar'] })
google.charts.setOnLoadCallback(GenerateComplexBarChartReports)
// Helper function to find the minimum value for hAxis, if needed.
// This is a placeholder; you'll need to implement your actual logic here.
function FindMinValue(data) {
let minValue = 0 // Default to 0, or calculate based on your data
// Example: iterate through data to find min value if needed
// for (let i = 0; i < data.getNumberOfRows(); i++) {
// for (let j = 1; j < data.getNumberOfColumns(); j += 8) { // Adjusted to jump by 8 for each department
// let actualHours = data.getValue(i, j);
// let budgetHours = data.getValue(i, j + 4); // Budget hours are 4 columns after actual
// if (typeof actualHours === "number" && actualHours < minValue) {
// minValue = actualHours;
// }
// if (typeof budgetHours === "number" && budgetHours < minValue) {
// minValue = budgetHours;
// }
// }
// }
return minValue
}
/**
* Calculates the appropriate chart height based on the number of bars
* per y-axis item to prevent overlap and ensure proper spacing.
* @param {google.visualization.DataTable} data The DataTable object for the chart.
* @returns {number} The calculated height for the chartArea.
*/
function CalculateChartHeightBasedOnDataItems(data) {
// Height needed for a single bar including its annotation.
// This is the fundamental unit of vertical space.
const heightOfOneBarAndAnnotation = 30 // Further reduced for tighter packing
// Minimal vertical space for the category label itself, if no bars are present,
// or as a base for very sparse categories.
const minHeightForCategoryLabel = 15 // Further reduced for tighter packing
// Small, consistent padding *between* different y-axis categories.
const interCategorySpacing = 5 // Further reduced for tighter packing
let totalChartAreaHeight = 0
for (let i = 0; i < data.getNumberOfRows(); i++) {
let numberOfActiveSeriesInThisCategory = 0
// Iterate through columns to count actual data series (bars) present for this row.
// Your data structure is: PrimaryKey, SoftwareHours, SoftwareAnnotation, SoftwareToolTip, SoftwareColor,
// SoftwareBudgetHours, SoftwareBudgetAnnotation, SoftwareBudgetToolTip, SoftwareBudgetColor,
// ManufacturingHours, ... etc.
// Each department block is 8 columns wide (value, annotation, tooltip, style, budget_value, budget_annotation, budget_tooltip, budget_style)
// The first data column is at index 1 (SoftwareHours).
for (let j = 1; j < data.getNumberOfColumns(); j += 8) {
// Check for Actual Hours (column 'j')
let actualHours = data.getValue(i, j)
if (typeof actualHours === 'number' && actualHours > 0) {
numberOfActiveSeriesInThisCategory++
}
// Check for Budget Hours (column 'j + 4' relative to the start of the department's block)
let budgetHoursColIndex = j + 4
// Ensure the budgetHoursColIndex is within the bounds of the data table's columns
if (budgetHoursColIndex < data.getNumberOfColumns()) {
let budgetHours = data.getValue(i, budgetHoursColIndex)
if (typeof budgetHours === 'number' && budgetHours > 0) {
numberOfActiveSeriesInThisCategory++
}
}
}
// Calculate height for the current y-axis category (row)
if (numberOfActiveSeriesInThisCategory === 0) {
// For categories with no bars, allocate minimal space for the label
totalChartAreaHeight += minHeightForCategoryLabel + interCategorySpacing
} else {
// For categories with bars, calculate space based on active bars + inter-category spacing
totalChartAreaHeight +=
numberOfActiveSeriesInThisCategory * heightOfOneBarAndAnnotation +
interCategorySpacing
}
}
// Add some additional padding for the overall chart area,
// useful for top/bottom margins within the plotting region.
totalChartAreaHeight += 50 // General padding for the chart area itself
return totalChartAreaHeight
}
/**
* Generates the complex bar chart reports by iterating through elements
* with the 'complex-barchart' class.
*/
function GenerateComplexBarChartReports() {
let $jsonValueContainers = $('.complex-barchart')
if ($jsonValueContainers.length <= 0) {
console.log("No elements with class 'complex-barchart' found.")
return
}
for (var i = 0; i < $jsonValueContainers.length; i++) {
let $element = $($jsonValueContainers[i])
let data = new google.visualization.DataTable($element.data('json'))
let chartType = $element.data('chart-type')
if (typeof chartType === 'undefined') {
chartType = 'bar'
}
let hAxisMinValue = $element.data('h-axis-min-value')
if (typeof hAxisMinValue === 'undefined') {
// Call your FindMinValue function, or set a default
hAxisMinValue = FindMinValue(data)
$element.data('h-axis-min-value', hAxisMinValue)
}
let id = $element.attr('id')
let chart = new google.visualization.BarChart(document.getElementById(id))
// Calculate the height specifically for the chartArea
let chartAreaCalculatedHeight = CalculateChartHeightBasedOnDataItems(data)
// The overall chart height needs to be chartArea height PLUS space for hAxis, title, etc.
// Adjust this buffer (e.g., 180) based on your chart's title, hAxis labels, and general padding needs.
let overallChartHeight = chartAreaCalculatedHeight + 180 // Buffer for hAxis, title, etc.
console.log(
'Calculated Chart Area Height: ' + chartAreaCalculatedHeight + 'px',
)
console.log('Overall Chart Height: ' + overallChartHeight + 'px')
let options = {
annotations: {
textStyle: {
fontSize: 14
},
// For bar charts, 'alwaysOutside: true' might not always place annotations outside the bar
// if space is constrained. Google Charts tries its best.
alwaysOutside: true,
},
vAxis: {
textStyle: {
fontSize: 14, // Font size for y-axis labels
},
// You can add more vAxis options here for label positioning if needed
// textPosition: 'out' // Example: position labels outside the chart area
},
tooltip: {
isHtml: true,
textStyle: {
fontSize: 14,
},
},
bar: { groupWidth: '75%' }, // Controls the thickness of the bars
height: overallChartHeight, // Total height of the chart container
chartArea: {
height: chartAreaCalculatedHeight, // Height of the actual plotting area for bars
left: 180, // Increased to give more room for long y-axis labels
width: '65%', // Adjusted width of the chart area as a percentage
},
legend: { position: 'none' }, // No legend displayed
bars: 'horizontal', // Required for Material Bar Charts to be horizontal
// For Material charts, the hAxis is actually the x-axis for horizontal bars
hAxis: {
minValue: hAxisMinValue,
textStyle: {
fontSize: 12
},
},
}
// Conditionally add minValue to hAxis if hAxisMinValue is not 0
if (hAxisMinValue !== 0) {
options.hAxis.minValue = hAxisMinValue
}
chart.draw(data, options)
}
}
body {
font-family: 'Inter', sans-serif;
display: flex;
justify-content: center;
align-items: flex-start;
min-height: 100vh;
background-color: #f0f2f5;
padding: 20px;
box-sizing: border-box;
}
.chart-container {
width: 90%; /* Responsive width */
max-width: 1200px; /* Max width for larger screens */
background-color: #ffffff;
border-radius: 12px;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
padding: 20px;
box-sizing: border-box;
}
h1 {
text-align: center;
color: #333;
margin-bottom: 20px;
}
/* Ensure the chart div itself can grow */
#chart_div {
width: 100%;
/* Height will be set dynamically by Google Charts */
}
<script src="https://www.gstatic.com/charts/loader.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<div class="chart-container">
<h1>Dynamic Bar Chart Report</h1>
<!-- The data-json attribute holds your chart data.
It's structured as [label, value1, tooltip1, color1, value2, tooltip2, color2, ...]
This mock data simulates the structure from your original image. -->
<div id="chart_div" class="complex-barchart"
data-chart-type="bar"
data-json='{"cols": [{"type": "string" ,"id": "PrimaryKey" ,"label": "PrimaryKey" }, {"type": "number" ,"id": "SoftwareHours" ,"label": "Software" }, {"type": "string" ,"id": "SoftwareAnnotation" ,"label": "SoftwareAnnotation" , "p": {"role" : "annotation"}}, {"type": "string" ,"id": "SoftwareToolTip" ,"label": "SoftwareToolTip" , "p": {"role" : "tooltip"}}, {"type": "string" ,"id": "SoftwareColor" ,"label": "SoftwareColor" , "p": {"role" : "style"}}, {"type": "number" ,"id": "SoftwareBudgetHours" ,"label": "SoftwareBudgetHours" }, {"type": "string" ,"id": "SoftwareBudgetAnnotation" ,"label": "SoftwareBudgetAnnotation" , "p": {"role" : "annotation"}}, {"type": "string" ,"id": "SoftwareBudgetToolTip" ,"label": "SoftwareBudgetToolTip" , "p": {"role" : "tooltip"}}, {"type": "string" ,"id": "SoftwareBudgetColor" ,"label": "SoftwareBudgetColor" , "p": {"role" : "style"}}, {"type": "number" ,"id": "ManufacturingHours" ,"label": "Manufacturing" }, {"type": "string" ,"id": "ManufacturingAnnotation" ,"label": "ManufacturingAnnotation" , "p": {"role" : "annotation"}}, {"type": "string" ,"id": "ManufacturingToolTip" ,"label": "ManufacturingToolTip" , "p": {"role" : "tooltip"}}, {"type": "string" ,"id": "ManufacturingColor" ,"label": "ManufacturingColor" , "p": {"role" : "style"}}, {"type": "number" ,"id": "ManufacturingBudgetHours" ,"label": "ManufacturingBudgetHours" }, {"type": "string" ,"id": "ManufacturingBudgetAnnotation" ,"label": "ManufacturingBudgetAnnotation" , "p": {"role" : "annotation"}}, {"type": "string" ,"id": "ManufacturingBudgetToolTip" ,"label": "ManufacturingBudgetToolTip" , "p": {"role" : "tooltip"}}, {"type": "string" ,"id": "ManufacturingBudgetColor" ,"label": "ManufacturingBudgetColor" , "p": {"role" : "style"}}, {"type": "number" ,"id": "Electrical_ENGHours" ,"label": "Electrical_ENG" }, {"type": "string" ,"id": "Electrical_ENGAnnotation" ,"label": "Electrical_ENGAnnotation" , "p": {"role" : "annotation"}}, {"type": "string" ,"id": "Electrical_ENGToolTip" ,"label": "Electrical_ENGToolTip" , "p": {"role" : "tooltip"}}, {"type": "string" ,"id": "Electrical_ENGColor" ,"label": "Electrical_ENGColor" , "p": {"role" : "style"}}, {"type": "number" ,"id": "Electrical_ENGBudgetHours" ,"label": "Electrical_ENGBudgetHours" }, {"type": "string" ,"id": "Electrical_ENGBudgetAnnotation" ,"label": "Electrical_ENGBudgetAnnotation" , "p": {"role" : "annotation"}}, {"type": "string" ,"id": "Electrical_ENGBudgetToolTip" ,"label": "Electrical_ENGBudgetToolTip" , "p": {"role" : "tooltip"}}, {"type": "string" ,"id": "Electrical_ENGBudgetColor" ,"label": "Electrical_ENGBudgetColor" , "p": {"role" : "style"}}, {"type": "number" ,"id": "Mechanical_ENGHours" ,"label": "Mechanical_ENG" }, {"type": "string" ,"id": "Mechanical_ENGAnnotation" ,"label": "Mechanical_ENGAnnotation" , "p": {"role" : "annotation"}}, {"type": "string" ,"id": "Mechanical_ENGToolTip" ,"label": "Mechanical_ENGToolTip" , "p": {"role" : "tooltip"}}, {"type": "string" ,"id": "Mechanical_ENGColor" ,"label": "Mechanical_ENGColor" , "p": {"role" : "style"}}, {"type": "number" ,"id": "Mechanical_ENGBudgetHours" ,"label": "Mechanical_ENGBudgetHours" }, {"type": "string" ,"id": "Mechanical_ENGBudgetAnnotation" ,"label": "Mechanical_ENGBudgetAnnotation" , "p": {"role" : "annotation"}}, {"type": "string" ,"id": "Mechanical_ENGBudgetToolTip" ,"label": "Mechanical_ENGBudgetToolTip" , "p": {"role" : "tooltip"}}, {"type": "string" ,"id": "Mechanical_ENGBudgetColor" ,"label": "Mechanical_ENGBudgetColor" , "p": {"role" : "style"}}, {"type": "number" ,"id": "ProjectManagementHours" ,"label": "ProjectManagement" }, {"type": "string" ,"id": "ProjectManagementAnnotation" ,"label": "ProjectManagementAnnotation" , "p": {"role" : "annotation"}}, {"type": "string" ,"id": "ProjectManagementToolTip" ,"label": "ProjectManagementToolTip" , "p": {"role" : "tooltip"}}, {"type": "string" ,"id": "ProjectManagementColor" ,"label": "ProjectManagementColor" , "p": {"role" : "style"}}, {"type": "number" ,"id": "ProjectManagementBudgetHours" ,"label": "ProjectManagementBudgetHours" }, {"type": "string" ,"id": "ProjectManagementBudgetAnnotation" ,"label": "ProjectManagementBudgetAnnotation" , "p": {"role" : "annotation"}}, {"type": "string" ,"id": "ProjectManagementBudgetToolTip" ,"label": "ProjectManagementBudgetToolTip" , "p": {"role" : "tooltip"}}, {"type": "string" ,"id": "ProjectManagementBudgetColor" ,"label": "ProjectManagementBudgetColor" , "p": {"role" : "style"}}, {"type": "number" ,"id": "AdminHours" ,"label": "Admin" }, {"type": "string" ,"id": "AdminAnnotation" ,"label": "AdminAnnotation" , "p": {"role" : "annotation"}}, {"type": "string" ,"id": "AdminToolTip" ,"label": "AdminToolTip" , "p": {"role" : "tooltip"}}, {"type": "string" ,"id": "AdminColor" ,"label": "AdminColor" , "p": {"role" : "style"}}, {"type": "number" ,"id": "AdminBudgetHours" ,"label": "AdminBudgetHours" }, {"type": "string" ,"id": "AdminBudgetAnnotation" ,"label": "AdminBudgetAnnotation" , "p": {"role" : "annotation"}}, {"type": "string" ,"id": "AdminBudgetToolTip" ,"label": "AdminBudgetToolTip" , "p": {"role" : "tooltip"}}, {"type": "string" ,"id": "AdminBudgetColor" ,"label": "AdminBudgetColor" , "p": {"role" : "style"}}], "rows" : [{"c" : [{"v": "DR (OCS) & PASS (ODS)"}, {"v": 660.00}, {"v": "Manufacturing Actual: 660.00hrs (85.3%); Left: 98.00hrs"}, {"v": "DR (OCS) & PASS (ODS) Manufacturing Actual: 660.00hrs (85.3%); Left: 98.00hrs"}, {"v": "#A9D08E"}, {"v": 758.00}, {"v": "Manufacturing Budget: 758.00hrs"}, {"v": "DR (OCS) & PASS (ODS) Manufacturing Actual: 660.00hrs (85.3%); Left: 98.00hrs"}, {"v": "{fill-color:#A9D08E;fill-opacity: 0.5;}"}, {"v": 35.25}, {"v": "Software Actual: 35.25hrs (4.6%); Left: 144.75hrs"}, {"v": "DR (OCS) & PASS (ODS) Software Actual: 35.25hrs (4.6%); Left: 144.75hrs"}, {"v": "#7030A0"}, {"v": 180.00}, {"v": "Software Budget: 180.00hrs"}, {"v": "DR (OCS) & PASS (ODS) Software Actual: 35.25hrs (4.6%); Left: 144.75hrs"}, {"v": "{fill-color:#7030A0;fill-opacity: 0.5;}"}, {"v": 73.75}, {"v": "Electrical_ENG Actual: 73.75hrs (9.5%); Left: 14.25hrs"}, {"v": "DR (OCS) & PASS (ODS) Electrical_ENG Actual: 73.75hrs (9.5%); Left: 14.25hrs"}, {"v": "#FFFF00"}, {"v": 88.00}, {"v": "Electrical_ENG Budget: 88.00hrs"}, {"v": "DR (OCS) & PASS (ODS) Electrical_ENG Actual: 73.75hrs (9.5%); Left: 14.25hrs"}, {"v": "{fill-color:#FFFF00;fill-opacity: 0.5;}"}, {"v": 5.00}, {"v": "Mechanical_ENG Actual: 5.00hrs (0.6%); Left: 103.00hrs"}, {"v": "DR (OCS) & PASS (ODS) Mechanical_ENG Actual: 5.00hrs (0.6%); Left: 103.00hrs"}, {"v": "#305496"}, {"v": 108.00}, {"v": "Mechanical_ENG Budget: 108.00hrs"}, {"v": "DR (OCS) & PASS (ODS) Mechanical_ENG Actual: 5.00hrs (0.6%); Left: 103.00hrs"}, {"v": "{fill-color:#305496;fill-opacity: 0.5;}"}]}, {"c" : [{"v": "EOL"}, {"v": 181.50}, {"v": "Manufacturing Actual: 181.50hrs (31.9%); Left: 326.50hrs"}, {"v": "EOL Manufacturing Actual: 181.50hrs (31.9%); Left: 326.50hrs"}, {"v": "#A9D08E"}, {"v": 508.00}, {"v": "Manufacturing Budget: 508.00hrs"}, {"v": "EOL Manufacturing Actual: 181.50hrs (31.9%); Left: 326.50hrs"}, {"v": "{fill-color:#A9D08E;fill-opacity: 0.5;}"}, {"v": 220.00}, {"v": "Electrical_ENG Actual: 220.00hrs (38.7%); OverBudget: 82.00hrs (By: 59.42%)"}, {"v": "EOL Electrical_ENG Actual: 220.00hrs (38.7%); OverBudget: 82.00hrs (By: 59.42%)"}, {"v": "#FFFF00"}, {"v": 138.00}, {"v": "Electrical_ENG Budget: 138.00hrs"}, {"v": "EOL Electrical_ENG Actual: 220.00hrs (38.7%); OverBudget: 82.00hrs (By: 59.42%)"}, {"v": "{fill-color:#FFFF00;fill-opacity: 0.5;}"}, {"v": 142.00}, {"v": "Software Actual: 142.00hrs (25.0%); Left: 37.25hrs"}, {"v": "EOL Software Actual: 142.00hrs (25.0%); Left: 37.25hrs"}, {"v": "#7030A0"}, {"v": 179.25}, {"v": "Software Budget: 179.25hrs"}, {"v": "EOL Software Actual: 142.00hrs (25.0%); Left: 37.25hrs"}, {"v": "{fill-color:#7030A0;fill-opacity: 0.5;}"}, {"v": 24.75}, {"v": "Mechanical_ENG Actual: 24.75hrs (4.4%); Left: 5.25hrs"}, {"v": "EOL Mechanical_ENG Actual: 24.75hrs (4.4%); Left: 5.25hrs"}, {"v": "#305496"}, {"v": 30.00}, {"v": "Mechanical_ENG Budget: 30.00hrs"}, {"v": "EOL Mechanical_ENG Actual: 24.75hrs (4.4%); Left: 5.25hrs"}, {"v": "{fill-color:#305496;fill-opacity: 0.5;}"}]}, {"c" : [{"v": "Roll cart and Lift & Locate"}, {"v": 83.75}, {"v": "Mechanical_ENG Actual: 83.75hrs (85.9%); OverBudget: 45.75hrs (By: 120.39%)"}, {"v": "Roll cart and Lift & Locate Mechanical_ENG Actual: 83.75hrs (85.9%); OverBudget: 45.75hrs (By: 120.39%)"}, {"v": "#305496"}, {"v": 38.00}, {"v": "Mechanical_ENG Budget: 38.00hrs"}, {"v": "Roll cart and Lift & Locate Mechanical_ENG Actual: 83.75hrs (85.9%); OverBudget: 45.75hrs (By: 120.39%)"}, {"v": "{fill-color:#305496;fill-opacity: 0.5;}"}, {"v": 13.75}, {"v": "Manufacturing Actual: 13.75hrs (14.1%); Left: 3.25hrs"}, {"v": "Roll cart and Lift & Locate Manufacturing Actual: 13.75hrs (14.1%); Left: 3.25hrs"}, {"v": "#A9D08E"}, {"v": 17.00}, {"v": "Manufacturing Budget: 17.00hrs"}, {"v": "Roll cart and Lift & Locate Manufacturing Actual: 13.75hrs (14.1%); Left: 3.25hrs"}, {"v": "{fill-color:#A9D08E;fill-opacity: 0.5;}"}]}, {"c" : [{"v": "AC and PB"}, {"v": 24.50}, {"v": "Mechanical_ENG Actual: 24.50hrs (88.3%); Left: 30.00hrs"}, {"v": "AC and PB Mechanical_ENG Actual: 24.50hrs (88.3%); Left: 30.00hrs"}, {"v": "#305496"}, {"v": 54.50}, {"v": "Mechanical_ENG Budget: 54.50hrs"}, {"v": "AC and PB Mechanical_ENG Actual: 24.50hrs (88.3%); Left: 30.00hrs"}, {"v": "{fill-color:#305496;fill-opacity: 0.5;}"}, {"v": 3.25}, {"v": "Electrical_ENG Actual: 3.25hrs (11.7%); Left: 14.00hrs"}, {"v": "AC and PB Electrical_ENG Actual: 3.25hrs (11.7%); Left: 14.00hrs"}, {"v": "#FFFF00"}, {"v": 17.25}, {"v": "Electrical_ENG Budget: 17.25hrs"}, {"v": "AC and PB Electrical_ENG Actual: 3.25hrs (11.7%); Left: 14.00hrs"}, {"v": "{fill-color:#FFFF00;fill-opacity: 0.5;}"}]}, {"c" : [{"v": "Cal Verify & Cert Plate"}, {"v": 16.00}, {"v": "Mechanical_ENG Actual: 16.00hrs (94.1%); Left: 11.00hrs"}, {"v": "Cal Verify & Cert Plate Mechanical_ENG Actual: 16.00hrs (94.1%); Left: 11.00hrs"}, {"v": "#305496"}, {"v": 27.00}, {"v": "Mechanical_ENG Budget: 27.00hrs"}, {"v": "Cal Verify & Cert Plate Mechanical_ENG Actual: 16.00hrs (94.1%); Left: 11.00hrs"}, {"v": "{fill-color:#305496;fill-opacity: 0.5;}"}, {"v": 1.00}, {"v": "Electrical_ENG Actual: 1.00hrs (5.9%); Left: 4.00hrs"}, {"v": "Cal Verify & Cert Plate Electrical_ENG Actual: 1.00hrs (5.9%); Left: 4.00hrs"}, {"v": "#FFFF00"}, {"v": 5.00}, {"v": "Electrical_ENG Budget: 5.00hrs"}, {"v": "Cal Verify & Cert Plate Electrical_ENG Actual: 1.00hrs (5.9%); Left: 4.00hrs"}, {"v": "{fill-color:#FFFF00;fill-opacity: 0.5;}"}]}, {"c" : [{"v": "63-Way Cables"}, {"v": 28.25}, {"v": "Manufacturing Actual: 28.25hrs (60.4%); Left: 16.25hrs"}, {"v": "63-Way Cables Manufacturing Actual: 28.25hrs (60.4%); Left: 16.25hrs"}, {"v": "#A9D08E"}, {"v": 44.50}, {"v": "Manufacturing Budget: 44.50hrs"}, {"v": "63-Way Cables Manufacturing Actual: 28.25hrs (60.4%); Left: 16.25hrs"}, {"v": "{fill-color:#A9D08E;fill-opacity: 0.5;}"}, {"v": 15.00}, {"v": "Mechanical_ENG Actual: 15.00hrs (32.1%); Left: 13.00hrs"}, {"v": "63-Way Cables Mechanical_ENG Actual: 15.00hrs (32.1%); Left: 13.00hrs"}, {"v": "#305496"}, {"v": 28.00}, {"v": "Mechanical_ENG Budget: 28.00hrs"}, {"v": "63-Way Cables Mechanical_ENG Actual: 15.00hrs (32.1%); Left: 13.00hrs"}, {"v": "{fill-color:#305496;fill-opacity: 0.5;}"}, {"v": 3.50}, {"v": "Electrical_ENG Actual: 3.50hrs (7.5%); Left: 12.50hrs"}, {"v": "63-Way Cables Electrical_ENG Actual: 3.50hrs (7.5%); Left: 12.50hrs"}, {"v": "#FFFF00"}, {"v": 16.00}, {"v": "Electrical_ENG Budget: 16.00hrs"}, {"v": "63-Way Cables Electrical_ENG Actual: 3.50hrs (7.5%); Left: 12.50hrs"}, {"v": "{fill-color:#FFFF00;fill-opacity: 0.5;}"}]}, {"c" : [{"v": "ProjectManagement"}, {"v": 24.25}, {"v": "ProjectManagement Actual: 24.25hrs (100.0%); Left: 65.75hrs"}, {"v": "ProjectManagement ProjectManagement Actual: 24.25hrs (100.0%); Left: 65.75hrs"}, {"v": "#ED7D31"}, {"v": 90.00}, {"v": "ProjectManagement Budget: 90.00hrs"}, {"v": "ProjectManagement ProjectManagement Actual: 24.25hrs (100.0%); Left: 65.75hrs"}, {"v": "{fill-color:#ED7D31;fill-opacity: 0.5;}"}]}, {"c" : [{"v": "Red Rabbit Box"}, {"v": 1.00}, {"v": "Electrical_ENG Actual: 1.00hrs (100.0%); Left: 5.00hrs"}, {"v": "Red Rabbit Box Electrical_ENG Actual: 1.00hrs (100.0%); Left: 5.00hrs"}, {"v": "#FFFF00"}, {"v": 6.00}, {"v": "Electrical_ENG Budget: 6.00hrs"}, {"v": "Red Rabbit Box Electrical_ENG Actual: 1.00hrs (100.0%); Left: 5.00hrs"}, {"v": "{fill-color:#FFFF00;fill-opacity: 0.5;}"}]}, {"c" : [{"v": "Admin"}, {"v": 0.50}, {"v": "Admin Actual: 0.50hrs (100.0%); Left: 56.00hrs"}, {"v": "Admin Admin Actual: 0.50hrs (100.0%); Left: 56.00hrs"}, {"v": "#ED7D31"}, {"v": 56.50}, {"v": "Admin Budget: 56.50hrs"}, {"v": "Admin Admin Actual: 0.50hrs (100.0%); Left: 56.00hrs"}, {"v": "{fill-color:#ED7D31;fill-opacity: 0.5;}"}]}]}'
data-h-axis-min-value="0">
</div>
</div>