Skip to content

Instantly share code, notes, and snippets.

@Giammaria
Last active January 16, 2025 18:08
Show Gist options
  • Save Giammaria/992a5ef30cfe186896b6d69db36df36b to your computer and use it in GitHub Desktop.
Save Giammaria/992a5ef30cfe186896b6d69db36df36b to your computer and use it in GitHub Desktop.
20241220_sf_readiness_gateway_right_viz_v2_v
{
"$schema": "https://vega.github.io/schema/vega/v5.json",
"autosize": {
"resize": false,
"type": "pad"
},
"width": 633,
"height": 687,
"background": "transparent",
"signals": [
{
"name": "initialHeight",
"init": "inCognos ? containerSize()[1] : height",
"on": [
{
"events": "container:resize",
"update": "inCognos ? containerSize()[1] : height"
}
]
},
{
"name": "inCognos",
"value": false
},
{
"name": "windowLocationOrigin",
"value": ""
},
{
"name": "initialTimestamp",
"init": "now()"
},
{
"name": "startRendering",
"value": false,
"on": [
{
"events": {
"signal": "counter",
"throttle": 25
},
"update": "(initialTimestamp + 100) < counter ? true : false"
}
]
},
{
"name": "padding",
"update": "0"
},
{
"name": "starCount",
"value": 33
},
{
"name": "connectionDistance",
"update": "0.16*min(containerSize()[0], containerSize()[1])"
},
{
"name": "counter",
"init": "now()",
"on": [
{
"events": {
"type": "timer",
"throttle": 50
},
"update": "now()"
}
]
},
{
"name": "lightColor",
"description": "light color for theme as hex value",
"value": "#EEE"
},
{
"name": "semiLightColor",
"description": "semi-light color for theme as hex value",
"value": "#DEDEDE"
},
{
"name": "mediumColor",
"description": "medium color for theme as hex value",
"value": "#AAA"
},
{
"name": "darkColor",
"description": "dark color for theme as hex value",
"value": "#999"
},
{
"name": "backgroundRGB",
"description": "rgb value of the canvas background",
"value": "#000"
},
{
"name": "measureDrawerState",
"value": "closed",
"on": [
{
"events": "@measures_drawer_open_clickable_rect:click",
"update": "measureDrawerState === 'closed' ? 'open' : 'closed'"
},
{
"events": "@measures_drawer_closed_clickable_rect:click",
"update": "measureDrawerState === 'closed' ? 'open' : 'closed'"
}
]
},
{
"name": "drawerHover",
"value": false,
"on": [
{
"events": "@measures_drawer_open_clickable_rect:mouseover, @measures_drawer_closed_clickable_rect:mouseover",
"update": "true"
},
{
"events": "@measures_drawer_open_clickable_rect:mouseout, @measures_drawer_closed_clickable_rect:mouseout",
"update": "false"
}
]
},
{
"name": "selectedMeasureArr",
"value": [],
"on": [
{
"events": "@measure_background_rect:click",
"update": "isValid(datum) ? event.ctrlKey && length(selectedMeasureArr) > 0 ? indexof(selectedMeasureArr, datum['MET Measure Short Name']) < 0 ? split((join(selectedMeasureArr, ',')+','+datum['MET Measure Short Name']), ',') : (split(replace(join(selectedMeasureArr), datum['MET Measure Short Name'], ''),',')) : selectedMeasureArr[0] === datum['MET Measure Short Name'] ? [] : [datum['MET Measure Short Name']] : []"
}
]
},
{
"name": "measureSort",
"init": "[{type: 'measure', active: true, orderAsc: true}, {type: 'not achieved', active: false, orderAsc: false}]",
"on": [
{
"events": "@measure_sort_background_rect:click",
"update": "[{type: 'measure', active: true, orderAsc: measureSort[0].active ? !measureSort[0].orderAsc : measureSort[0].orderAsc }, {type: 'not achieved', active: false, orderAsc: measureSort[1].orderAsc}]"
},
{
"events": "@measure_not_achieved_sort_background_rect:click",
"update": "[{type: 'measure', active: false, orderAsc: measureSort[0].orderAsc}, {type: 'not achieved', active: true, orderAsc: measureSort[1].active ? !measureSort[1].orderAsc : measureSort[1].orderAsc}]"
}
]
},
{
"name": "transitionDuration",
"value": 500
},
{
"name": "measureDrawerTransitionBounds",
"value": null,
"on": [
{
"events": [
{
"signal": "measureDrawerState"
}
],
"update": "[{start: now(), end:now()+transitionDuration*0.75},{start: now()+transitionDuration*0.25, end:(now()+transitionDuration)}]"
}
]
},
{
"name": "measureDrawerT",
"value": 0,
"update": "isValid(measureDrawerTransitionBounds) ? [clamp((counter < measureDrawerTransitionBounds[0].start ? 0 : counter-measureDrawerTransitionBounds[0].start)/(measureDrawerTransitionBounds[0].end-measureDrawerTransitionBounds[0].start),0,1),clamp(( counter-measureDrawerTransitionBounds[1].start)/(measureDrawerTransitionBounds[1].end-measureDrawerTransitionBounds[1].start),0,1)] : measureDrawerT"
},
{
"name": "measureDrawerTEased",
"init": "[{'type': 'large', t: measureDrawerState === 'open' ? 1 : 0}, {'type': 'small', t: measureDrawerState === 'open' ? 0 : 1}]",
"on": [
{
"events": {
"signal": "measureDrawerT"
},
"update": "measureDrawerState === 'open' ? [{type: 'large', t: measureDrawerT[1] < 0.5 ? 2 * measureDrawerT[1] * measureDrawerT[1] : - 1 + (4 - 2 * measureDrawerT[1] ) * measureDrawerT[1]}, {type: 'small', t: 1-( measureDrawerT[0] < 0.5 ? 2 * measureDrawerT[0] * measureDrawerT[0] : - 1 + (4 - 2 * measureDrawerT[0] ) * measureDrawerT[0])}] : [{type: 'large', t: 1-( measureDrawerT[0] < 0.5 ? 2 * measureDrawerT[0] * measureDrawerT[0] : - 1 + (4 - 2 * measureDrawerT[0] ) * measureDrawerT[0])}, {type: 'small', t: measureDrawerT[1] < 0.5 ? 2 * measureDrawerT[1] * measureDrawerT[1] : - 1 + (4 - 2 * measureDrawerT[1] ) * measureDrawerT[1]}]"
}
]
},
{
"name": "garrisonYStep",
"init": "0.049*initialHeight"
},
{
"name": "unitYStep",
"init": "garrisonYStep/2"
},
{
"name": "requiredGarrisonAndUnitHeight",
"update": "data('garrison_domain')[0]['requiredGarrisonAndUnitHeight']"
},
{
"name": "initialGarrisonAndUnitHeight",
"update": "data('garrison_domain')[0]['initialGarrisonAndUnitHeight']"
},
{
"name": "configVerticalScrollbar",
"description": "configurations for the vertical scroll bar",
"update": "{enabled: requiredGarrisonAndUnitHeight>initialGarrisonAndUnitHeight,innerPadding: 10, track: {width: 10, height: extent([requiredGarrisonAndUnitHeight, initialGarrisonAndUnitHeight])[0], fill: '#444'}, handle: {height: max((initialGarrisonAndUnitHeight/requiredGarrisonAndUnitHeight)*extent([initialGarrisonAndUnitHeight, requiredGarrisonAndUnitHeight])[0], 30), fill: '#666', hover: {fill: '#888'}}}"
},
{
"name": "verticalScrollbarMouseDown",
"description": "boolean indicating whether the vertical scrollbar is currently being clicked",
"value": false,
"on": [
{
"events": "@group_verticalScrollbar:pointerdown",
"update": "configVerticalScrollbar.enabled"
},
{
"events": {
"type": "mouseout",
"scope": "view",
"markname": "group_verticalScrollbar",
"filter": [
"!event.pointerdown"
]
},
"update": "false"
},
{
"events": {
"type": "mouseover",
"scope": "scope",
"markname": "group_verticalScrollbar",
"filter": [
"event.pointerdown"
]
},
"update": "true"
},
{
"events": {
"type": "pointerup"
},
"update": "false"
}
]
},
{
"name": "verticalScrollbarMouseOver",
"description": "boolean indicating whether the vertical scrollbar is currently being moused over",
"value": false,
"on": [
{
"events": "@group_verticalScrollbar:mouseover",
"update": "configVerticalScrollbar.enabled"
},
{
"events": "@group_verticalScrollbar:mouseout",
"update": "false"
}
]
},
{
"name": "verticalScrollPercent",
"description": "the percentage of the current vertical scroll",
"init": "0",
"on": [
{
"events": {
"type": "wheel",
"consume": true,
"filter": [
"!event.ctrlKey",
"!event.shiftKey"
]
},
"update": "!configVerticalScrollbar.enabled ? 0 : garrisonDrawerTEased !== 1 ? verticalScrollPercent : clamp(verticalScrollPercent - (-event.deltaY * pow(4, event.deltaMode) * 0.0005), 0,(requiredGarrisonAndUnitHeight-initialGarrisonAndUnitHeight)/requiredGarrisonAndUnitHeight)"
},
{
"events": "@group_verticalScrollbar:pointerdown",
"update": "!configVerticalScrollbar.enabled ? 0 : invert('scaleScrollHandleY', y(group()))"
},
{
"events": {
"type": "pointermove",
"source": "scope",
"markname": "group_verticalScrollbar",
"between": [
{
"type": "pointerdown"
},
{
"type": "pointerup"
}
]
},
"update": "!configVerticalScrollbar.enabled ? 0 : (invert('scaleScrollHandleY', y(group())) > invert('scaleScrollTrackY', y(group()))-verticalScrollPercentInitialClick) ? invert('scaleScrollHandleY', y(group())) : invert('scaleScrollTrackY', y(group()))-verticalScrollPercentInitialClick"
},
{
"events": {
"signal": "!configVerticalScrollbar.enabled"
},
"update": "0"
}
]
},
{
"name": "verticalScrollPercentInitialClick",
"description": "the percentage of the current vertical scroll",
"init": "0",
"on": [
{
"events": {
"type": "pointerdown",
"source": "scope",
"markname": "group_verticalScrollbar"
},
"update": "!configVerticalScrollbar.enabled ? 0 : invert('scaleScrollTrackY', y(group()))"
},
{
"events": {
"type": "pointerup",
"source": "scope",
"markname": "group_verticalScrollbar"
},
"update": "0"
}
]
},
{
"name": "isInitialLoad",
"value": true,
"on": [
{
"events": "click",
"update": "false"
}
]
},
{
"name": "garrisonSortIsExpandedArr",
"value": [
"1"
],
"on": [
{
"events": "@garrison_background_rect:click",
"update": "garrisonDrawerT !== 1 ? garrisonSortIsExpandedArr : indexof(garrisonSortIsExpandedArr, toString(datum['Garrison Sort'])) >= 0 ? split(trim(replace(replace(join(garrisonSortIsExpandedArr, ','), datum['Garrison Sort'], '‎'),'‎,', '')), ',') : split(join(garrisonSortIsExpandedArr, ',') + ',' + datum['Garrison Sort'], ',')"
},
{
"events": "@garrison_measure_ticks_hover_rects:click",
"update": "garrisonDrawerT !== 1 ? garrisonSortIsExpandedArr : indexof(garrisonSortIsExpandedArr, toString(datum.datum['Garrison Sort'])) >= 0 ? split(trim(replace(replace(join(garrisonSortIsExpandedArr, ','), datum.datum['Garrison Sort'], '‎'),'‎,', '')), ',') : split(join(garrisonSortIsExpandedArr, ',') + ',' + datum.datum['Garrison Sort'], ',')"
}
]
},
{
"name": "garrisonSortOrderJustClicked",
"value": 1,
"on": [
{
"events": "@garrison_background_rect:click",
"update": "garrisonDrawerT === 1 ? +datum['Garrison Sort'] : garrisonSortOrderJustClicked"
},
{
"events": "@garrison_measure_ticks_hover_rects:click",
"update": "garrisonDrawerT === 1 ? +datum.datum['Garrison Sort'] : garrisonSortOrderJustClicked"
}
]
},
{
"name": "garrisonDrawerTransitionBounds",
"value": null,
"on": [
{
"events": [
{
"signal": "garrisonSortIsExpandedArr"
}
],
"update": "{start: now(), end:now()+transitionDuration}"
}
]
},
{
"name": "garrisonDrawerT",
"value": 1,
"update": "isValid(garrisonDrawerTransitionBounds) ? clamp(((counter-garrisonDrawerTransitionBounds.start)/transitionDuration),0,1) : garrisonDrawerT"
},
{
"name": "garrisonDrawerTEased",
"value": "1",
"update": "garrisonDrawerT<.5 ? 4*garrisonDrawerT*garrisonDrawerT*garrisonDrawerT : (garrisonDrawerT-1)*(2*garrisonDrawerT-2)*(2*garrisonDrawerT-2)+1"
},
{
"name": "garrisonMeasureHoverDatum",
"value": null,
"on": [
{
"events": "@garrison_measure_ticks_hover_rects:mouseover",
"update": "isValid(datum) && isValid(datum.datum) ? datum.datum : null"
},
{
"events": "@garrison_measure_ticks_hover_rects:mouseout",
"update": "null"
}
]
},
{
"name": "unitMeasureHoverDatum",
"value": null,
"on": [
{
"events": "@unit_measure_ticks_hover_rects:mouseover",
"update": "isValid(datum) && isValid(datum.datum) ? datum.datum : null"
},
{
"events": "@unit_measure_ticks_hover_rects:mouseout",
"update": "null"
}
]
}
],
"marks": [
{
"name": "group_installation_visual",
"type": "group",
"signals": [
{
"name": "pad",
"value": 2.5
}
],
"marks": [
{
"name": "legend",
"type": "group",
"scales": [
{
"name": "xLegendScale",
"type": "band",
"domain": {
"data": "criteria_met_comparison_domain",
"field": "Criteria Met Comparison",
"sort": {
"field": "Criteria Met Comparison Sort"
}
},
"range": {
"signal": "[width*0.55, width-1-pad]"
}
}
],
"marks": [
{
"name": "title",
"type": "text",
"encode": {
"update": {
"x": {
"signal": "range('xLegendScale')[0]"
},
"y": {
"signal": "pad"
},
"text": {
"value": "Achieved:"
},
"align": {
"value": "center"
},
"fill": {
"value": "#fff"
},
"fontWeight": {
"value": 600
},
"baseline": {
"value": "top"
}
}
}
},
{
"name": "labels",
"type": "text",
"from": {
"data": "criteria_met_comparison_domain"
},
"encode": {
"update": {
"x": {
"scale": "xLegendScale",
"field": "Criteria Met Comparison",
"offset": {
"signal": "bandwidth('xLegendScale')*(datum['Criteria Met Comparison']==='N' ? 0.75 : datum['Criteria Met Comparison']==='Discrepancy' ? 1.2 : datum['Criteria Met Comparison']==='N/A' ? 0.95 : 1)"
}
},
"y": {
"signal": "pad"
},
"text": {
"field": "Criteria Met Comparison"
},
"align": {
"value": "right"
},
"fill": {
"value": "#fff"
},
"baseline": {
"value": "top"
}
}
}
},
{
"name": "symbol",
"type": "symbol",
"from": {
"data": "labels"
},
"encode": {
"update": {
"x": {
"signal": "datum.bounds.x1-2*pad"
},
"y": {
"signal": "datum.bounds.y1+2*pad"
},
"size": {
"value": 100
},
"shape": {
"value": "stroke"
},
"angle": {
"value": 90
},
"stroke": {
"signal": "scale('criteriaMetScale', datum.datum['Criteria Met Comparison'] || 'N/A')"
},
"strokeWidth": {
"value": 3
}
}
}
},
{
"name": "background",
"type": "rect",
"from": {
"data": "title"
},
"encode": {
"update": {
"x": {
"signal": "datum.bounds.x1-pad"
},
"y": {
"value": 0
},
"x2": {
"signal": "width-1"
},
"y2": {
"signal": "datum.bounds.y2+pad"
},
"stroke": {
"value": "#fff"
},
"fill": {
"value": "transparent"
}
}
}
},
{
"name": "legend_info_icon",
"type": "symbol",
"from": {
"data": "background"
},
"interactive": false,
"encode": {
"update": {
"shape": {
"signal": "'M256 512A256 256 0 1 0 256 0a256 256 0 1 0 0 512zM216 336h24V272H216c-13.3 0-24-10.7-24-24s10.7-24 24-24h48c13.3 0 24 10.7 24 24v88h8c13.3 0 24 10.7 24 24s-10.7 24-24 24H216c-13.3 0-24-10.7-24-24s10.7-24 24-24zm40-208a32 32 0 1 1 0 64 32 32 0 1 1 0-64z'"
},
"x": {
"signal": "datum.bounds.x1 - 20"
},
"y": {
"signal": "pad/2"
},
"size": {
"signal": "0.00000384193*height"
},
"fill": {
"value": "#b5cae1"
}
}
}
},
{
"name": "legend_info_icon_hover_rect",
"type": "rect",
"from": {
"data": "legend_info_icon"
},
"interactive": true,
"encode": {
"update": {
"tooltip": {
"signal": "{'title': 'Ruleset', 'Y:': 'The measure criteria has been met', 'N:': 'The measure criteria has NOT been met', 'Discrepancy:': 'The Garrison reports \"Y\" for a measure, but one or more of its subordinate units report \"N\"', 'N/A (Garrison)': 'The Garrison is not responsible for providing a measure to its subordinate units', 'N/A (subordinate unit)': 'The unit is not responsible for reporting on a measure'}"
},
"x": {
"signal": "datum.bounds.x1"
},
"x2": {
"signal": "datum.bounds.x2"
},
"y": {
"signal": "datum.bounds.y1"
},
"y2": {
"signal": "datum.bounds.y2"
},
"fill": {
"value": "transparent"
},
"cursor": {
"value": "pointer"
}
}
}
}
]
},
{
"name": "dummy_container",
"type": "group",
"interactive": false,
"encode": {
"update": {
"x": {
"signal": "width/3.25"
},
"x2": {
"signal": "width-1"
},
"y": {
"signal": "pluck(data('legend'), 'bounds')[0].y2+2.5"
},
"height": {
"signal": "initialHeight-pluck(data('legend'), 'bounds')[0].y2-7.5-1"
},
"fill": {
"value": "#000"
},
"stroke": {
"value": "#fff"
},
"opacity": {
"value": 0
}
}
}
},
{
"name": "measure_drawer_open",
"type": "group",
"from": {
"data": "dummy_container"
},
"interactive": false,
"encode": {
"update": {
"x": {
"signal": "datum.bounds.x1",
"offset": {
"signal": "measureDrawerTEased[0].t*-datum.bounds.x1+pad*2"
}
},
"width": {
"signal": "datum.bounds.x1-pad*2"
},
"y": {
"signal": "0.05*(datum.bounds.y2-datum.bounds.y1)"
},
"height": {
"signal": "0.95*(datum.bounds.y2-datum.bounds.y1)"
},
"fill": {
"signal": "drawerHover ? '#212121' : '#000'"
},
"stroke": {
"signal": "'#fff'"
}
}
},
"marks": [
{
"name": "measures_title",
"type": "text",
"interactive": false,
"encode": {
"update": {
"x": {
"signal": "parent.bounds.x1/2"
},
"y": {
"signal": "4*pad"
},
"align": {
"value": "center"
},
"baseline": {
"value": "top"
},
"fontSize": {
"value": 14
},
"fontWeight": {
"value": 600
},
"text": {
"signal": "'MEASURES'"
},
"fill": {
"value": "#fff"
}
}
}
},
{
"name": "measures_close_indicator",
"type": "text",
"from": {
"data": "measures_title"
},
"interactive": false,
"encode": {
"update": {
"x": {
"signal": "parent.bounds.x1",
"offset": {
"signal": "-pad*6"
}
},
"y": {
"signal": "datum.bounds.y1+(datum.bounds.y2-datum.bounds.y1)/2"
},
"align": {
"value": "right"
},
"baseline": {
"value": "middle"
},
"fontSize": {
"value": 14
},
"fontWeight": {
"value": 600
},
"text": {
"signal": "'⮞'"
},
"fill": {
"value": "#fff"
}
}
}
},
{
"name": "measures_drawer_open_clickable_rect",
"type": "rect",
"from": {
"data": "measures_title"
},
"interactive": true,
"encode": {
"update": {
"x": {
"value": 0
},
"y": {
"value": 0
},
"x2": {
"signal": "parent.bounds.x1"
},
"y2": {
"signal": "datum.bounds.y2+(pad*4)"
},
"fill": {
"value": "transparent"
},
"cursor": {
"value": "pointer"
}
}
}
},
{
"name": "measures_info_icon",
"type": "symbol",
"from": {
"data": "measures_title"
},
"interactive": false,
"encode": {
"update": {
"shape": {
"signal": "'M256 512A256 256 0 1 0 256 0a256 256 0 1 0 0 512zM216 336h24V272H216c-13.3 0-24-10.7-24-24s10.7-24 24-24h48c13.3 0 24 10.7 24 24v88h8c13.3 0 24 10.7 24 24s-10.7 24-24 24H216c-13.3 0-24-10.7-24-24s10.7-24 24-24zm40-208a32 32 0 1 1 0 64 32 32 0 1 1 0-64z'"
},
"x": {
"signal": "pad*4"
},
"y": {
"signal": "pad*4"
},
"size": {
"signal": "0.00000384193*height"
},
"fill": {
"value": "#b5cae1"
},
"opacity": {
"signal": "measureDrawerTEased[0].t"
}
}
}
},
{
"name": "info_icon_interactive_rect",
"type": "rect",
"from": {
"data": "measures_info_icon"
},
"interactive": true,
"encode": {
"update": {
"x": {
"signal": "datum.bounds.x1"
},
"x2": {
"signal": "datum.bounds.x2"
},
"y": {
"signal": "datum.bounds.y1"
},
"y2": {
"signal": "datum.bounds.y2"
},
"tooltip": {
"signal": "{'Select': 'click on a measure to filter', 'Multi-Select': 'choose multiple measures by holding CTRL while clicking', 'Clear Selections': 'click on a selected measure to clear selections', 'Sort By': 'click the △▽ icon to sort by that column', 'Sort Order': 'click the ▲ or ▼ icon to toggle the sort order for that column'}"
},
"fill": {
"value": "transparent"
},
"cursor": {
"value": "pointer"
}
}
}
},
{
"name": "measure_group",
"type": "group",
"from": {
"data": "measures_drawer_open_clickable_rect"
},
"encode": {
"update": {
"y": {
"signal": "datum.bounds.y2"
},
"width": {
"signal": "datum.bounds.x2-datum.bounds.x1"
}
}
},
"scales": [
{
"name": "xMeasureScale",
"type": "linear",
"domain": [
0,
1
],
"range": {
"signal": "[pad*3+((parent.bounds.x2-parent.bounds.x1) - (pad*11)), pad*3+(((data('measure_drawer_open')[0].bounds.x2-data('measure_drawer_open')[0].bounds.x1) - (pad*11))*0.65)]"
}
},
{
"name": "yMeasuresScale",
"type": "band",
"domain": {
"data": "measure_domain",
"field": "sort",
"sort": true
},
"range": {
"signal": "[22.5,data('measure_drawer_open')[0].height-data('measures_drawer_open_clickable_rect')[0].height-pad*4]"
},
"padding": 0
}
],
"marks": [
{
"name": "measure_sort_background_rect",
"type": "rect",
"encode": {
"update": {
"tooltip": {
"value": "Sort by measure name"
},
"x": {
"signal": "pad*8"
},
"y": {
"signal": "0"
},
"width": {
"signal": "range('xMeasureScale')[1]-pad*6"
},
"height": {
"signal": "bandwidth('yMeasuresScale')"
},
"cursor": {
"value": "pointer"
},
"fill": {
"value": "transparent"
},
"strokeWidth": {
"value": 1
}
},
"hover": {
"strokeWidth": {
"value": 2
}
}
}
},
{
"name": "measure_sort_text",
"type": "text",
"from": {
"data": "measure_sort_background_rect"
},
"interactive": false,
"encode": {
"update": {
"x": {
"field": "x"
},
"y": {
"signal": "(datum.bounds.y2-datum.bounds.y1)/1.25"
},
"text": {
"signal": "measureSort[0].active ? measureSort[0].orderAsc ? '▲' : '▼' : '△▽' "
},
"fontSize": {
"value": 10
},
"fill": {
"signal": "measureSort[0].active ? '#aaa' : '#555'"
},
"stroke": {
"signal": "measureSort[0].active ? '#aaa' : '#555'"
},
"strokeWidth": {
"field": "strokeWidth"
}
}
}
},
{
"name": "measure_not_achieved_sort_background_rect",
"type": "rect",
"encode": {
"update": {
"tooltip": {
"value": "Sort by measure not achieved percentage"
},
"x": {
"signal": "range('xMeasureScale')[1]+pad*2"
},
"y": {
"signal": "0"
},
"width": {
"signal": "range('xMeasureScale')[0]-range('xMeasureScale')[1]-pad*2"
},
"height": {
"signal": "bandwidth('yMeasuresScale')"
},
"cursor": {
"value": "pointer"
},
"fill": {
"value": "transparent"
},
"strokeWidth": {
"value": 1
}
},
"hover": {
"strokeWidth": {
"value": 2
}
}
}
},
{
"name": "measure_not_achieved_sort_text",
"type": "text",
"from": {
"data": "measure_not_achieved_sort_background_rect"
},
"interactive": false,
"encode": {
"update": {
"x": {
"signal": "datum.bounds.x2"
},
"y": {
"signal": "(datum.bounds.y2-datum.bounds.y1)/1.25"
},
"text": {
"signal": "measureSort[1].active ? measureSort[1].orderAsc ? '▲' : '▼' : '△▽'"
},
"fontSize": {
"value": 10
},
"align": {
"value": "right"
},
"fill": {
"signal": "measureSort[1].active ? '#aaa' : '#555'"
},
"stroke": {
"signal": "measureSort[1].active ? '#aaa' : '#555'"
},
"strokeWidth": {
"field": "strokeWidth"
}
}
}
},
{
"name": "measure_background_rect",
"type": "rect",
"from": {
"data": "measure_domain"
},
"encode": {
"update": {
"tooltip": {
"field": "tooltip"
},
"x": {
"signal": "pad*3"
},
"y": {
"signal": "scale('yMeasuresScale', datum['sort'])"
},
"width": {
"signal": "(parent.bounds.x2-parent.bounds.x1) - (pad*8)"
},
"height": {
"signal": "bandwidth('yMeasuresScale')"
},
"fill": {
"signal": "length(data('selectedMeasures')) > 0 ? indexof(pluck(data('selectedMeasures'), 'data'), datum['MET Measure Short Name'])>=0 ? '#555' : 'transparent' : 'transparent'"
},
"strokeWidth": {
"signal": "length(data('selectedMeasures')) > 0 ? indexof(pluck(data('selectedMeasures'), 'data'), datum['MET Measure Short Name'])>=0 ? 1 : 0 : 0"
},
"stroke": {
"value": "#fff"
},
"cursor": {
"value": "pointer"
},
"opacity": {
"signal": "length(data('selectedMeasures')) > 0 ? indexof(pluck(data('selectedMeasures'), 'data'), datum['MET Measure Short Name'])>=0 ? 1 : 0.35 : 1"
}
},
"hover": {
"fill": {
"value": "#555"
}
}
}
},
{
"name": "measure_not_achieved_bar",
"type": "rect",
"from": {
"data": "measure_domain"
},
"interactive": false,
"encode": {
"update": {
"x": {
"signal": "range('xMeasureScale')[0]"
},
"y": {
"signal": "scale('yMeasuresScale', datum['sort'])+2*pad"
},
"x2": {
"signal": "scale('xMeasureScale', (datum['Measure Count']-datum['Achieved'])/datum['Measure Count'])"
},
"height": {
"signal": "bandwidth('yMeasuresScale')-4*pad"
},
"fill": {
"signal": "scale('criteriaMetScale', 'N')"
}
}
}
},
{
"name": "measure_text",
"type": "text",
"from": {
"data": "measure_domain"
},
"interactive": false,
"encode": {
"update": {
"x": {
"signal": "pad*8"
},
"y": {
"signal": "scale('yMeasuresScale', datum['sort'])",
"offset": {
"signal": "bandwidth('yMeasuresScale')/2"
}
},
"dy": {
"value": 0.5
},
"text": {
"signal": "datum['MET Measure Short Name']"
},
"baseline": {
"value": "middle"
},
"align": {
"value": "left"
},
"fill": {
"signal": "'#fff'"
},
"fontWeight": {
"signal": "length(data('selectedMeasures')) > 0 ? indexof(pluck(data('selectedMeasures'), 'data'), datum['MET Measure Short Name'])>=0 ? 600 : 400 : 400"
},
"opacity": {
"signal": "length(data('selectedMeasures')) > 0 ? indexof(pluck(data('selectedMeasures'), 'data'), datum['MET Measure Short Name'])>=0 ? 1 : 0.35 : 1"
}
}
}
}
]
}
]
},
{
"name": "measure_drawer_closed_dummy_Label",
"type": "text",
"from": {
"data": "dummy_container"
},
"interactive": false,
"encode": {
"update": {
"x": {
"signal": "datum.bounds.x1",
"offset": {
"signal": "-pad*4"
}
},
"y": {
"signal": "0.05*(datum.bounds.y2-datum.bounds.y1)+(0.95*(datum.bounds.y2-datum.bounds.y1)/2)"
},
"text": {
"signal": "'MEASURES'"
},
"align": {
"value": "center"
},
"fill": {
"value": "transparent"
},
"baseline": {
"value": "top"
},
"fontSize": {
"value": 18
},
"fontWeight": {
"value": 600
},
"angle": {
"value": 90
}
}
}
},
{
"name": "measures_drawer_closed",
"type": "group",
"from": {
"data": "dummy_container"
},
"interactive": false,
"encode": {
"update": {
"x": {
"signal": "data('measure_drawer_closed_dummy_Label')[0].bounds.x2+(pad*4) + 1-((data('measure_drawer_closed_dummy_Label')[0].bounds.x1-(pad*4)-datum.bounds.x1) + 1)",
"offset": {
"signal": "measureDrawerTEased[1].t*((data('measure_drawer_closed_dummy_Label')[0].bounds.x1-(pad*4)-datum.bounds.x1) + 1)"
}
},
"width": {
"signal": "(data('measure_drawer_closed_dummy_Label')[0].bounds.x1-(pad*4)-datum.bounds.x1) + 1"
},
"y": {
"signal": "0.05*(datum.bounds.y2-datum.bounds.y1)"
},
"height": {
"signal": "0.95*(datum.bounds.y2-datum.bounds.y1)"
},
"fill": {
"signal": "drawerHover ? '#212121' : '#000'"
},
"stroke": {
"value": "#fff"
}
}
},
"marks": [
{
"name": "measures_title",
"type": "text",
"interactive": false,
"from": {
"data": "measure_drawer_closed_dummy_Label"
},
"encode": {
"update": {
"x": {
"signal": "-pad*4"
},
"y": {
"signal": "(0.95*(parent.bounds.y2-parent.bounds.y1)/2)"
},
"align": {
"field": "align"
},
"baseline": {
"value": "top"
},
"fontSize": {
"field": "fontSize"
},
"fontWeight": {
"field": "fontWeight"
},
"angle": {
"field": "angle"
},
"text": {
"field": "text"
},
"fill": {
"value": "#fff"
}
}
}
},
{
"name": "measures_open_indicator",
"type": "text",
"interactive": false,
"from": {
"data": "measures_title"
},
"encode": {
"update": {
"x": {
"signal": "datum.bounds.x1+(datum.bounds.x2-datum.bounds.x1)/2"
},
"y": {
"signal": "pad*4"
},
"align": {
"value": "center"
},
"baseline": {
"value": "top"
},
"fontSize": {
"value": 14
},
"fontWeight": {
"value": 600
},
"text": {
"signal": "'⮜'"
},
"fill": {
"value": "#fff"
}
}
}
},
{
"name": "measures_drawer_closed_clickable_rect",
"type": "rect",
"from": {
"data": "measures_title"
},
"interactive": true,
"encode": {
"update": {
"x": {
"signal": "datum.bounds.x1+1-(pad*4)"
},
"y": {
"value": 1
},
"width": {
"signal": "(datum.bounds.x2+1+(pad*4) - datum.bounds.x1+1-(pad*4))*2"
},
"height": {
"signal": "measureDrawerState === 'closed' ? (datum.bounds.y2-(datum.bounds.y2-datum.bounds.y1)/2)*2-1.5 : 0"
},
"fill": {
"value": "transparent"
},
"fillOpacity": {
"value": 0.25
},
"cursor": {
"value": "pointer"
}
}
}
}
]
},
{
"name": "dummy_container_title",
"type": "text",
"encode": {
"update": {
"y": {
"signal": "pad*4 + data('dummy_container')[0].bounds.y1"
},
"x": {
"signal": "data('dummy_container')[0].bounds.x1 + (data('dummy_container')[0].bounds.x2-data('dummy_container')[0].bounds.x1)/2"
},
"baseline": {
"value": "top"
},
"align": {
"value": "center"
},
"text": {
"value": "G ‎ ‎ A ‎ ‎ R ‎ ‎ R ‎ ‎ I ‎ ‎ S ‎ ‎ O ‎ ‎ N"
},
"fontWeight": {
"value": "600"
},
"fontSize": {
"value": 22
},
"fill": {
"value": "transparent"
}
}
}
},
{
"name": "container",
"type": "group",
"interactive": true,
"from": {
"data": "dummy_container"
},
"encode": {
"update": {
"x": {
"field": "x"
},
"x2": {
"signal": "datum.bounds.x2-1"
},
"y": {
"field": "y"
},
"height": {
"signal": "datum.height"
},
"fill": {
"field": "fill"
},
"stroke": {
"field": "stroke"
},
"opacity": {
"value": 1
}
}
},
"marks": [
{
"name": "title",
"type": "text",
"from": {
"data": "dummy_container_title"
},
"encode": {
"update": {
"y": {
"signal": "pad*4"
},
"x": {
"signal": "(parent.bounds.x2-parent.bounds.x1)/2"
},
"baseline": {
"value": "top"
},
"align": {
"value": "center"
},
"text": {
"value": "G ‎ ‎ A ‎ ‎ R ‎ ‎ R ‎ ‎ I ‎ ‎ S ‎ ‎ O ‎ ‎ N"
},
"fontWeight": {
"value": "600"
},
"fontSize": {
"value": 22
},
"fill": {
"value": "#fff"
}
}
}
},
{
"name": "title_divider_rect",
"type": "rect",
"from": {
"data": "title"
},
"encode": {
"update": {
"y": {
"signal": "datum.bounds.y2-0.25+pad*2"
},
"height": {
"value": 0.5
},
"x": {
"signal": "pad*3+30"
},
"x2": {
"signal": "data('dummy_container')[0].bounds.x2-data('dummy_container')[0].bounds.x1-pad*2-30"
},
"fill": {
"value": "#aaa"
}
}
}
},
{
"name": "group_garrison_and_unit_outer_container",
"type": "group",
"from": {
"data": "title_divider_rect"
},
"clip": true,
"encode": {
"update": {
"x": {
"signal": "datum.x"
},
"y": {
"signal": "datum.bounds.y2+pad*4"
},
"width": {
"signal": "datum.bounds.x2-datum.bounds.x1+2*configVerticalScrollbar.track.width"
},
"height": {
"signal": "initialGarrisonAndUnitHeight+2"
}
}
},
"marks": [
{
"name": "group_garrison_and_unit_container",
"type": "group",
"from": {
"data": "title_divider_rect"
},
"clip": true,
"encode": {
"update": {
"x": {
"signal": "0"
},
"y": {
"signal": "(configVerticalScrollbar.enabled ? clamp(-verticalScrollPercent*requiredGarrisonAndUnitHeight,-(requiredGarrisonAndUnitHeight-initialGarrisonAndUnitHeight), 0) : 0)"
},
"width": {
"signal": "datum.bounds.x2-datum.bounds.x1"
},
"height": {
"signal": "100000000"
}
}
},
"marks": [
{
"name": "group_unit_marks",
"type": "group",
"clip": true,
"from": {
"facet": {
"name": "unit_facet",
"data": "dataset_formatted",
"aggregate": {
"ops": [
"distinct"
],
"fields": [
"MET Measure Short Name"
],
"as": [
"Measure Count"
]
},
"groupby": [
"Reporting Unit",
"Reporting Unit Sort",
"Garrison Unit",
"Garrison Sort",
"isGarrison",
"Total Criteria Met Per Unit",
"Total Criteria Met Per Unit Label",
"Total Criteria Met Per Unit Percentage"
]
}
},
"transform": [
{
"type": "formula",
"expr": "isInitialLoad ? (datum.datum['Garrison Sort'] === 1 ? true : false) : indexof(garrisonSortIsExpandedArr, toString(datum.datum['Garrison Sort']))>=0",
"as": "isExpanded"
},
{
"type": "formula",
"expr": "(datum.datum['Garrison Sort'] === garrisonSortOrderJustClicked ? (datum.isExpanded ? ((garrisonDrawerTEased)*unitYStep) : ((1-garrisonDrawerTEased)*unitYStep)) : (datum.isExpanded ? unitYStep : 0))",
"as": "height"
},
{
"type": "window",
"ops": [
"lag"
],
"fields": [
"height"
],
"sort": {
"field": "Reporting Unit Sort",
"order": "ascending"
},
"as": [
"y"
]
},
{
"type": "formula",
"expr": "datum.y || 0",
"as": "y"
},
{
"type": "window",
"ops": [
"sum"
],
"frame": [
null,
0
],
"fields": [
"y"
],
"as": [
"y"
]
},
{
"type": "formula",
"expr": "garrisonYStep*datum.datum['Garrison Sort']+datum.y - unitYStep/2",
"as": "y"
}
],
"marks": [
{
"name": "unit_background_rect",
"type": "rect",
"interactive": true,
"transform": [
{
"type": "formula",
"expr": "parent",
"as": "datum"
}
],
"encode": {
"update": {
"tooltip": {
"signal": "{title: parent['Reporting Unit'], 'Achieved': parent['Total Criteria Met Per Unit Label'] + ' (' + parent['Total Criteria Met Per Unit Percentage'] + ')'}"
},
"width": {
"signal": "!isValid(parent['Reporting Unit']) ? null : parent['Garrison Unit'] !== parent['Reporting Unit'] && indexof(garrisonSortIsExpandedArr, toString(parent['Garrison Sort']))>=0 ? data('dummy_container')[0].bounds.x2-data('dummy_container')[0].bounds.x1-1-pad*4 -15 : null"
},
"height": {
"signal": "!isValid(parent['Reporting Unit']) ? null : parent['Garrison Unit'] !== parent['Reporting Unit'] && indexof(garrisonSortIsExpandedArr, toString(parent['Garrison Sort']))>=0 ? unitYStep : null"
},
"fill": {
"signal": "isValid(unitMeasureHoverDatum) && unitMeasureHoverDatum['Reporting Unit'] === parent['Reporting Unit'] ? '#555' : 'transparent'"
},
"cursor": {
"value": "pointer"
}
},
"hover": {
"fill": {
"value": "#555"
}
}
}
},
{
"name": "unit_label",
"type": "text",
"from": {
"data": "unit_background_rect"
},
"interactive": false,
"encode": {
"update": {
"x": {
"signal": "pad*5"
},
"y": {
"signal": "datum.bounds.y2-pad"
},
"baseline": {
"value": "bottom"
},
"align": {
"value": "left"
},
"text": {
"signal": "parent.isGarrison || !isValid(parent['Reporting Unit']) ? null : parent['Reporting Unit']"
},
"fontWeight": {
"value": "400"
},
"fill": {
"value": "gainsboro"
},
"opacity": {
"signal": "garrisonSortOrderJustClicked === parent['Garrison Sort'] ? indexof(garrisonSortIsExpandedArr, toString(datum.datum['Garrison Sort']))>=0 ? garrisonDrawerTEased : (1-garrisonDrawerTEased) : indexof(garrisonSortIsExpandedArr, toString(datum.datum['Garrison Sort']))>=0 ? 1 : 0"
}
}
}
},
{
"name": "unit_count_label",
"type": "text",
"from": {
"data": "unit_background_rect"
},
"interactive": false,
"encode": {
"update": {
"x": {
"signal": "data('dummy_container')[0].bounds.x2-data('dummy_container')[0].bounds.x1-1-pad*4-60"
},
"dx": {
"signal": "-pad*3"
},
"y": {
"signal": "(datum.bounds.y2-datum.bounds.y1)/2"
},
"baseline": {
"value": "middle"
},
"align": {
"value": "right"
},
"text": {
"signal": "parent.isGarrison ? null : parent['Total Criteria Met Per Unit Label']"
},
"fontWeight": {
"value": "600"
},
"fill": {
"value": "gainsboro"
},
"opacity": {
"signal": "garrisonSortOrderJustClicked === parent['Garrison Sort'] ? indexof(garrisonSortIsExpandedArr, toString(datum.datum['Garrison Sort']))>=0 ? garrisonDrawerTEased : (1-garrisonDrawerTEased) : indexof(garrisonSortIsExpandedArr, toString(datum.datum['Garrison Sort']))>=0 ? 1 : 0"
}
}
}
},
{
"name": "unit_provide_measures_group",
"type": "group",
"from": {
"facet": {
"data": "unit_facet",
"name": "measure_facet",
"groupby": [
"Garrison Unit",
"Garrison Sort",
"Reporting Unit",
"Reporting Unit Sort",
"isGarrison",
"MET Measure Short Name",
"Criteria Met",
"Criteria Met Sort",
"Garrison Criteria Met",
"MET Measure Sort",
"Measure Count Per Garrison Unit",
"Criteria Met Comparison",
"Criteria Met Comparison Sort",
"Total Criteria Met Per Unit Label",
"Total Criteria Met Per Unit Percentage",
"Achieved Per Garrison Subordinate Per Measure Tooltip"
]
}
},
"encode": {
"update": {}
},
"marks": [
{
"name": "measure_ticks",
"type": "text",
"from": {
"data": "measure_facet"
},
"encode": {
"update": {
"text": {
"signal": "indexof(garrisonSortIsExpandedArr, toString(datum['Garrison Sort']))>=0 && !datum.isGarrison ? '❚' : null"
},
"fill": {
"signal": "scale('criteriaMetScale', datum['Criteria Met'] || 'N/A')"
},
"x": {
"signal": "data('unit_count_label')[0].bounds.x1 - pad*2"
},
"dx": {
"signal": "!parent.isGarrison ? - (length(data('measure_domain')) - datum['Criteria Met Sort'])*(3*pad) : 0"
},
"y": {
"signal": "data('unit_count_label')[0].bounds.y1 + (data('unit_count_label')[0].bounds.y2-data('unit_count_label')[0].bounds.y1)/2"
},
"fillOpacity": {
"signal": "length(data('selectedMeasures')) > 0 ? indexof(pluck(data('selectedMeasures'), 'data'), datum['MET Measure Short Name']) >= 0 ? 1 :0.35 : 1"
},
"fontSize": {
"signal": "isValid(unitMeasureHoverDatum) && unitMeasureHoverDatum['Reporting Unit'] === datum['Reporting Unit'] && unitMeasureHoverDatum['MET Measure Short Name'] === datum['MET Measure Short Name'] ? 18 : length(data('selectedMeasures')) > 0 ? indexof(pluck(data('selectedMeasures'), 'data'), datum['MET Measure Short Name']) >= 0 ? 18 : 12 : 12"
},
"fontWeight": {
"value": "400"
},
"align": {
"value": "right"
},
"baseline": {
"value": "middle"
},
"opacity": {
"signal": "length(selectedMeasureArr) === 0 && isValid(unitMeasureHoverDatum) ? unitMeasureHoverDatum['Reporting Unit'] === datum['Reporting Unit'] && unitMeasureHoverDatum['MET Measure Short Name'] === datum['MET Measure Short Name'] ? 1 : 0.35 : length(selectedMeasureArr) === 0 && isValid(garrisonMeasureHoverDatum) ? garrisonMeasureHoverDatum['Garrison'] === datum['Garrison'] && garrisonMeasureHoverDatum['MET Measure Short Name'] === datum['MET Measure Short Name'] ? 1 : 0.35 : 1"
}
}
}
},
{
"name": "unit_measure_ticks_hover_rects",
"type": "rect",
"from": {
"data": "measure_ticks"
},
"encode": {
"update": {
"tooltip": {
"signal": "{title: datum.datum['MET Measure Short Name'], Description: datum.datum['Measure'], 'Reporting Unit': datum.datum['Reporting Unit'], Achieved: (parent['Criteria Met'] || 'N/A') + (isValid(parent['Garrison Criteria Met']) && parent['Criteria Met'] !== parent['Garrison Criteria Met'] ? ' (' + parent['Garrison Unit'] + ' reporting ' + parent['Garrison Criteria Met'] + ')' : '')}"
},
"x": {
"signal": "isValid(datum.text) ? datum.bounds.x1-pad/2 : null"
},
"x2": {
"signal": "isValid(datum.text) ? datum.bounds.x2+pad/2 : null"
},
"y": {
"signal": "isValid(datum.text) ? datum.bounds.y1 - pad-1 : null"
},
"y2": {
"signal": "isValid(datum.text) ? datum.bounds.y2 + pad*2+2 : null"
},
"fill": {
"value": "transparent"
},
"cursor": {
"value": "pointer"
}
}
}
}
]
}
]
},
{
"name": "group_garrison_marks",
"type": "group",
"clip": true,
"from": {
"facet": {
"name": "unit_facet",
"data": "dataset_formatted",
"aggregate": {
"ops": [
"distinct"
],
"fields": [
"Reporting Unit"
],
"as": [
"Unit Count"
]
},
"groupby": [
"Garrison",
"Garrison Sort",
"Garrison Unit",
"Total Criteria Met Per Garrison Unit",
"Total Criteria Met Per Garrison Unit Label",
"Total Criteria Met Per Garrison Unit Percentage"
]
}
},
"transform": [
{
"type": "formula",
"expr": "data('dummy_container')[0].bounds.x2-data('dummy_container')[0].bounds.x1-1-pad*4",
"as": "width"
},
{
"type": "formula",
"expr": "isInitialLoad ? datum.datum['Garrison Sort'] === 1 ? true : false : indexof(garrisonSortIsExpandedArr, toString(datum.datum['Garrison Sort']))>=0",
"as": "isExpanded"
},
{
"type": "formula",
"expr": "0",
"as": "y"
},
{
"type": "formula",
"expr": "0",
"as": "height"
},
{
"type": "formula",
"expr": "(datum.datum['Garrison Sort'] === garrisonSortOrderJustClicked ? (datum.isExpanded ? ((garrisonDrawerTEased)*datum.datum['Unit Count']*unitYStep) : (1-garrisonDrawerTEased)*datum.datum['Unit Count']*unitYStep) : (datum.isExpanded ? datum.datum['Unit Count']*unitYStep : 0))",
"as": "height"
},
{
"type": "formula",
"expr": "datum.height+garrisonYStep",
"as": "height"
},
{
"type": "window",
"ops": [
"lag"
],
"fields": [
"height"
],
"as": [
"y"
]
},
{
"type": "formula",
"expr": "(datum.y || 0)",
"as": "y"
},
{
"type": "formula",
"expr": "datum.y+(datum.datum['Garrison Sort'] === 1 ? 1 : 0)",
"as": "y"
},
{
"type": "window",
"ops": [
"sum"
],
"frame": [
null,
0
],
"fields": [
"y"
],
"as": [
"y"
]
}
],
"marks": [
{
"name": "garrison_background_rect",
"type": "rect",
"interactive": true,
"transform": [
{
"type": "formula",
"expr": "parent",
"as": "datum"
}
],
"encode": {
"update": {
"width": {
"signal": "data('dummy_container')[0].bounds.x2-data('dummy_container')[0].bounds.x1-1-pad*5-60"
},
"height": {
"signal": "garrisonYStep"
},
"fill": {
"signal": "(isInitialLoad ? datum['Garrison Sort'] === 1 ? true : false : indexof(garrisonSortIsExpandedArr, toString(parent['Garrison Sort']))>=0) ? '#555' : isValid(garrisonMeasureHoverDatum) && garrisonMeasureHoverDatum['Reporting Unit'] === parent['Garrison Unit'] ? '#555' : '#000'"
},
"stroke": {
"signal": "isValid(garrisonMeasureHoverDatum) && garrisonMeasureHoverDatum['Reporting Unit'] === parent['Garrison Unit'] ? '#fff' : '#aaa'"
},
"strokeWidth": {
"signal": "(isInitialLoad ? parent['Garrison Sort'] === 1 ? true : false : indexof(garrisonSortIsExpandedArr, toString(parent['Garrison Sort']))>=0) ? 2 : 1"
},
"cursor": {
"value": "pointer"
}
},
"hover": {
"stroke": {
"value": "#fff"
},
"fill": {
"value": "#555"
}
}
}
},
{
"name": "garrison_label",
"type": "text",
"from": {
"data": "garrison_background_rect"
},
"interactive": false,
"encode": {
"update": {
"x": {
"signal": "datum.bounds.x1+pad*3"
},
"y": {
"signal": "isValid(parent['Garrison Unit']) ? pad*2 : datum.bounds.y1 + (datum.bounds.y2-datum.bounds.y1)/2"
},
"baseline": {
"signal": "isValid(parent['Garrison Unit']) ? 'top' : 'middle'"
},
"align": {
"value": "left"
},
"text": {
"signal": "parent['Garrison']"
},
"fontWeight": {
"value": "600"
},
"fontSize": {
"value": 13
},
"fill": {
"value": "#fff"
}
}
}
},
{
"name": "garrison_expanded_icon",
"type": "text",
"from": {
"data": "garrison_background_rect"
},
"interactive": false,
"encode": {
"update": {
"x": {
"signal": "datum.bounds.x1+(datum.bounds.x2-datum.bounds.x1)"
},
"dx": {
"signal": "-pad*3"
},
"y": {
"signal": "pad*2"
},
"baseline": {
"value": "top"
},
"align": {
"value": "right"
},
"text": {
"signal": "isInitialLoad ? parent['Garrison Sort'] === 1 ? '⮝' : ' ⮟' : indexof(garrisonSortIsExpandedArr, toString(parent['Garrison Sort']))>=0 ? '⮝' : ' ⮟'"
},
"fontWeight": {
"value": "600"
},
"fill": {
"value": "#fff"
},
"opacity": {
"signal": "parent['Garrison Sort'] === garrisonSortOrderJustClicked ? garrisonDrawerTEased : 1"
}
}
}
},
{
"name": "garrison_unit_label",
"type": "text",
"from": {
"data": "garrison_background_rect"
},
"interactive": false,
"encode": {
"update": {
"x": {
"signal": "pad*5"
},
"y": {
"signal": "datum.bounds.y2-pad*2"
},
"baseline": {
"value": "bottom"
},
"align": {
"value": "left"
},
"text": {
"signal": "parent['Garrison Unit']"
},
"fontWeight": {
"value": "400"
},
"fill": {
"value": "gainsboro"
}
}
}
},
{
"name": "garrison_unit_count_label",
"type": "text",
"from": {
"data": "garrison_background_rect"
},
"interactive": false,
"encode": {
"update": {
"x": {
"signal": "datum.bounds.x1+(datum.bounds.x2-datum.bounds.x1)"
},
"dx": {
"signal": "-pad*3"
},
"y": {
"signal": "datum.bounds.y2-pad*2"
},
"baseline": {
"value": "bottom"
},
"align": {
"value": "right"
},
"text": {
"signal": "!isValid(parent['Garrison Unit']) ? null : parent['Total Criteria Met Per Garrison Unit Label']"
},
"fontWeight": {
"value": "600"
},
"fill": {
"value": "#fff"
}
}
}
},
{
"name": "garrison_unit_provide_measures_group",
"type": "group",
"from": {
"facet": {
"data": "unit_facet",
"name": "measure_facet",
"groupby": [
"Garrison Sort",
"Reporting Unit",
"isGarrison",
"MET Measure Short Name",
"MET Measure",
"Criteria Met",
"MET Measure Sort",
"Garrison Criteria Met",
"Measure Count Per Garrison Unit",
"Measure Count Per Unit Including N/A",
"Garrison Criteria Met Comparison",
"Garrison Criteria Met Comparison Sort",
"Criteria Met Comparison",
"Criteria Met Comparison Sort",
"Total Criteria Met Per Unit Label",
"Total Criteria Met Per Unit Percentage"
]
}
},
"encode": {
"update": {}
},
"marks": [
{
"name": "measure_ticks",
"type": "text",
"from": {
"data": "measure_facet"
},
"encode": {
"update": {
"text": {
"signal": "parent.isGarrison && isValid(datum['Garrison Unit']) ? '❚' : null"
},
"fill": {
"signal": "scale('criteriaMetScale', datum['Garrison Criteria Met Comparison'] || 'N/A')"
},
"x": {
"signal": "data('garrison_unit_count_label')[0].bounds.x1 - pad*2"
},
"dx": {
"signal": "parent.isGarrison && isValid(datum['Garrison Unit']) ? -(datum['Measure Count Per Unit Including N/A'] - datum['Garrison Criteria Met Comparison Sort'])*(3*pad) : 0"
},
"y": {
"signal": "data('garrison_unit_count_label')[0].bounds.y1 + (data('garrison_unit_count_label')[0].bounds.y2-data('garrison_unit_count_label')[0].bounds.y1)/2"
},
"fillOpacity": {
"signal": "length(data('selectedMeasures')) > 0 ? indexof(pluck(data('selectedMeasures'), 'data'), datum['MET Measure Short Name']) >= 0 ? 1 :0.35 : 1"
},
"opacity": {
"signal": "length(selectedMeasureArr) === 0 && isValid(unitMeasureHoverDatum) ? unitMeasureHoverDatum['Garrison'] === datum['Garrison'] && unitMeasureHoverDatum['MET Measure Short Name'] === datum['MET Measure Short Name'] ? 1 : 0.35 : length(selectedMeasureArr) === 0 &&isValid(garrisonMeasureHoverDatum) ? garrisonMeasureHoverDatum['Reporting Unit'] === datum['Reporting Unit'] && garrisonMeasureHoverDatum['MET Measure Short Name'] === datum['MET Measure Short Name'] ? 1 : 0.35 : 1"
},
"fontSize": {
"signal": "isValid(garrisonMeasureHoverDatum) && garrisonMeasureHoverDatum['Reporting Unit'] === datum['Reporting Unit'] && garrisonMeasureHoverDatum['MET Measure Short Name'] === datum['MET Measure Short Name'] ? 18 : length(data('selectedMeasures')) > 0 ? indexof(pluck(data('selectedMeasures'), 'data'), datum['MET Measure Short Name']) >= 0 ? 18 : 12 : 12"
},
"fontWeight": {
"value": "800"
},
"align": {
"value": "right"
},
"baseline": {
"value": "middle"
}
}
}
},
{
"name": "garrison_measure_ticks_hover_rects",
"type": "rect",
"from": {
"data": "measure_ticks"
},
"interactive": true,
"encode": {
"update": {
"tooltip": {
"signal": "{title: datum.datum['MET Measure Short Name'], Description: datum.datum['Measure'], 'Reporting Unit': datum.datum['Reporting Unit'], 'Garrison Achieved': datum.datum['Garrison Criteria Met'] || 'N/A', 'Subordinate Achieved': datum.datum['Achieved Per Garrison Subordinate Per Measure Tooltip']}"
},
"x": {
"signal": "isValid(datum.text) && isValid(datum.datum['Garrison Unit']) ? datum.bounds.x1-pad/2 : null"
},
"x2": {
"signal": "isValid(datum.text) && isValid(datum.datum['Garrison Unit']) ? datum.bounds.x2+pad/2 : null"
},
"y": {
"signal": "isValid(datum.text) && isValid(datum.datum['Garrison Unit']) ? datum.bounds.y1 : null"
},
"y2": {
"signal": "isValid(datum.text) && isValid(datum.datum['Garrison Unit']) ? datum.bounds.y2 : null"
},
"fill": {
"value": "transparent"
},
"cursor": {
"value": "pointer"
}
}
}
}
]
}
]
}
]
}
]
},
{
"name": "group_verticalScrollbar",
"description": "the group of marks that make up the vertical scrollbar",
"type": "group",
"from": {
"data": "title_divider_rect"
},
"clip": true,
"encode": {
"update": {
"x": {
"signal": "verticalScrollbarMouseDown ? -configVerticalScrollbar.track.width : (datum.bounds.x2)+configVerticalScrollbar.track.width"
},
"width": {
"signal": "configVerticalScrollbar.enabled ? verticalScrollbarMouseDown ? width+configVerticalScrollbar.track.width : configVerticalScrollbar.track.width : 0"
},
"y": {
"signal": "datum.bounds.y1+pad*4+(verticalScrollbarMouseDown ? -20 : 0)"
},
"height": {
"signal": "configVerticalScrollbar.enabled ? configVerticalScrollbar.track.height + (verticalScrollbarMouseDown ? +40 : 0) : 0"
},
"fill": {
"value": "transparent"
},
"cursor": {
"value": "pointer"
}
}
},
"marks": [
{
"name": "rect_verticalScrollbar_track",
"description": "the track for the scrollbar",
"from": {
"data": "title_divider_rect"
},
"type": "rect",
"interactive": false,
"encode": {
"update": {
"x": {
"signal": "verticalScrollbarMouseDown ? (datum.bounds.x2)+2*configVerticalScrollbar.track.width : 0"
},
"width": {
"signal": "configVerticalScrollbar.enabled ? configVerticalScrollbar.track.width : 0"
},
"y": {
"signal": "(verticalScrollbarMouseDown ? 20 : 0)"
},
"height": {
"signal": "configVerticalScrollbar.enabled ? configVerticalScrollbar.track.height : 0"
},
"fill": {
"signal": "configVerticalScrollbar.track.fill"
},
"cursor": {
"value": "pointer"
}
}
}
},
{
"name": "rect_verticalScrollbar_handle",
"description": "the handle for the scrollbar",
"from": {
"data": "rect_verticalScrollbar_track"
},
"type": "rect",
"interactive": false,
"encode": {
"update": {
"x": {
"signal": "verticalScrollbarMouseDown ? datum.bounds.x2 - configVerticalScrollbar.track.width : 0"
},
"width": {
"signal": "configVerticalScrollbar.enabled ? configVerticalScrollbar.track.width : 0"
},
"y": {
"signal": "datum.bounds.y1+scale('scaleScrollHandleY', verticalScrollPercent)-configVerticalScrollbar.handle.height"
},
"height": {
"signal": "configVerticalScrollbar.handle.height"
},
"fill": {
"signal": "verticalScrollbarMouseOver ? configVerticalScrollbar.handle.hover.fill : configVerticalScrollbar.handle.fill"
},
"cursor": {
"value": "pointer"
}
}
}
}
]
}
]
}
]
}
],
"scales": [
{
"name": "criteriaMetScale",
"type": "ordinal",
"domain": {
"data": "criteria_met_comparison_domain",
"field": "Criteria Met Comparison",
"sort": {
"field": "Criteria Met Comparison Sort"
}
},
"range": [
"#66a467",
"#cc5c53",
"#f9e97d",
"#CCC"
]
},
{
"name": "scaleScrollHandleY",
"type": "linear",
"domain": [
0,
{
"signal": "(requiredGarrisonAndUnitHeight- initialGarrisonAndUnitHeight)/requiredGarrisonAndUnitHeight"
}
],
"range": {
"signal": "[configVerticalScrollbar.handle.height, configVerticalScrollbar.track.height]"
},
"clamp": true
},
{
"name": "scaleScrollTrackY",
"type": "linear",
"domain": [
0,
{
"signal": "1"
}
],
"range": {
"signal": "[0, configVerticalScrollbar.track.height]"
},
"clamp": true
}
],
"data": [
{
"name": "unit_measure",
"url": "https://raw.githubusercontent.com/Giammaria/PublicFiles/refs/heads/master/data/sf-notional-MET-standards-installations-only-20250102.json",
"format": {
"type": "json",
"parse": "auto"
}
},
{
"name": "unit",
"url": "https://raw.githubusercontent.com/Giammaria/PublicFiles/refs/heads/master/data/Installation%20MET(Unit%20Sorting).csv",
"format": {
"type": "csv",
"parse": "auto"
}
},
{
"name": "measures",
"url": "https://raw.githubusercontent.com/Giammaria/PublicFiles/refs/heads/master/data/Installation%20MET(Measure%20List).csv",
"format": {
"type": "csv",
"parse": "auto"
}
},
{
"name": "dataset",
"source": "unit_measure",
"transform": [
{
"type": "filter",
"expr": "datum['MET Analytics Name'] === 'Installation'"
},
{
"type": "lookup",
"from": "unit",
"key": "DRRS Reporting Unit",
"fields": [
"Reporting Unit"
],
"values": [
"Garrison",
"Garrison Sort",
"Reporting Unit",
"Reporting Unit Sort",
"Installation MET Type"
]
},
{
"type": "lookup",
"from": "measures",
"key": "Measure Number",
"fields": [
"MET Analytics Code"
],
"values": [
"Measure Short Name",
"Measure Long Name",
"Measure Sort"
],
"as": [
"MET Measure Short Name",
"Measure",
"MET Measure Sort"
]
},
{
"type": "formula",
"expr": "split(datum.Measure, ' - ')[1]",
"as": "Measure"
},
{
"type": "project",
"fields": [
"Garrison",
"Reporting Unit",
"Installation MET Type",
"MET Measure Short Name",
"Measure",
"Criteria Met",
"Garrison Sort",
"Reporting Unit Sort",
"MET Measure Sort"
]
},
{
"type": "filter",
"expr": "isValid(datum['MET Measure Short Name'])"
}
]
},
{
"name": "dataset_conus_oconus",
"values": [
{
"Garrison": "Other - OCONUS",
"Reporting Unit Sort": 0
},
{
"Garrison": "Other - CONUS",
"Reporting Unit Sort": 0
}
],
"transform": [
{
"type": "lookup",
"from": "dataset",
"key": "Garrison",
"fields": [
"Garrison"
],
"values": [
"Garrison Sort"
]
}
]
},
{
"name": "dataset_receive",
"source": "dataset",
"transform": [
{
"type": "filter",
"expr": "datum['Installation MET Type'] === 'Receive'"
},
{
"type": "formula",
"expr": "datum.Garrison+'-'+datum['MET Measure Short Name']",
"as": "compKey"
},
{
"type": "formula",
"expr": "isValid(datum['Criteria Met']) ? 1 : 0",
"as": "Count Per Garrison Subordinate Per Measure"
},
{
"type": "formula",
"expr": "datum['Criteria Met'] === 'Y' ? 1 : 0",
"as": "Achieved Per Garrison Subordinate Per Measure"
},
{
"type": "joinaggregate",
"ops": [
"sum",
"sum"
],
"fields": [
"Count Per Garrison Subordinate Per Measure",
"Achieved Per Garrison Subordinate Per Measure"
],
"groupby": [
"Garrison",
"MET Measure Short Name"
],
"as": [
"Count Per Garrison Subordinate Per Measure",
"Achieved Per Garrison Subordinate Per Measure"
]
},
{
"type": "formula",
"expr": "datum['Achieved Per Garrison Subordinate Per Measure'] + ' / ' + datum['Count Per Garrison Subordinate Per Measure'] + ' ‎ ‎('+(datum['Count Per Garrison Subordinate Per Measure']<1 ? 'N/A' : format(datum['Achieved Per Garrison Subordinate Per Measure']/datum['Count Per Garrison Subordinate Per Measure'], '.0%'))+')'",
"as": "Achieved Per Garrison Subordinate Per Measure Tooltip"
}
]
},
{
"name": "dataset_provide",
"source": "dataset",
"transform": [
{
"type": "filter",
"expr": "datum['Installation MET Type'] === 'Provide'"
},
{
"type": "formula",
"expr": "datum.Garrison+'-'+datum['MET Measure Short Name']",
"as": "compKey"
},
{
"type": "formula",
"expr": "datum['Reporting Unit']",
"as": "Garrison Unit"
}
]
},
{
"name": "dataset_provide_formatted",
"source": "dataset_receive",
"transform": [
{
"type": "formula",
"expr": "datum.Garrison+'-'+datum['MET Measure Short Name']",
"as": "compKey"
},
{
"type": "filter",
"expr": "indexof(datum['Garrison'], 'Other') < 0"
},
{
"type": "lookup",
"from": "dataset_provide",
"key": "compKey",
"fields": [
"compKey"
],
"values": [
"Criteria Met",
"Garrison Unit"
],
"as": [
"Garrison Criteria Met",
"Garrison Unit"
]
},
{
"type": "aggregate",
"ops": [
"values"
],
"fields": [
"Criteria MET"
],
"groupby": [
"compKey",
"Garrison",
"MET Measure Short Name",
"Garrison Criteria Met",
"Garrison Sort",
"MET Measure Sort",
"Garrison Unit",
"Achieved Per Garrison Subordinate Per Measure Tooltip"
],
"as": [
"Receive Values"
]
},
{
"type": "formula",
"expr": "(pluck(datum['Receive Values'], 'Criteria Met'))",
"as": "Receive Values"
},
{
"type": "formula",
"expr": "(datum['Garrison Criteria Met'] === 'Y' && (indexof(datum['Receive Values'], 'N')>=0)) ? 'Discrepancy' : datum['Garrison Criteria Met']",
"as": "Garrison Criteria Met Comparison"
},
{
"type": "flatten",
"fields": [
"Receive Values"
]
},
{
"type": "formula",
"expr": "datum['Receive Values'] === 'Y' ? 1 : 0",
"as": "Subordinate Achieved Count"
},
{
"type": "formula",
"expr": "isValid(datum['Receive Values']) ? 1 : 0",
"as": "Subordinate Measure Count"
},
{
"type": "joinaggregate",
"ops": [
"sum",
"sum"
],
"fields": [
"Subordinate Achieved Count",
"Subordinate Measure Count"
],
"groupby": [
"Garrison"
],
"as": [
"Subordinate Achieved Count",
"Subordinate Measure Count"
]
},
{
"type": "aggregate",
"ops": [
"values"
],
"fields": [
"Receive Values"
],
"groupby": [
"compKey",
"Garrison",
"MET Measure Short Name",
"Garrison Criteria Met",
"Garrison Sort",
"MET Measure Sort",
"Garrison Unit",
"Garrison Criteria Met Comparison",
"Subordinate Achieved Count",
"Subordinate Measure Count",
"Achieved Per Garrison Subordinate Per Measure Tooltip"
],
"as": [
"Receive Values"
]
},
{
"type": "formula",
"expr": "(pluck(datum['Receive Values'], 'Receive Values'))",
"as": "Receive Values"
}
]
},
{
"name": "dataset_formatted",
"source": [
"dataset",
"dataset_conus_oconus"
],
"transform": [
{
"type": "filter",
"expr": "isValid(datum['Garrison'])"
},
{
"type": "formula",
"expr": "datum.Garrison+'-'+datum['MET Measure Short Name']",
"as": "compKey"
},
{
"type": "lookup",
"from": "dataset_provide_formatted",
"key": "compKey",
"fields": [
"compKey"
],
"values": [
"Garrison Criteria Met",
"Garrison Unit",
"Garrison Criteria Met Comparison",
"Subordinate Achieved Count",
"Subordinate Measure Count",
"Achieved Per Garrison Subordinate Per Measure Tooltip"
],
"as": [
"Garrison Criteria Met",
"Garrison Unit",
"Garrison Criteria Met Comparison",
"Subordinate Achieved Count",
"Subordinate Measure Count",
"Achieved Per Garrison Subordinate Per Measure Tooltip"
]
},
{
"type": "formula",
"expr": "split(datum.Garrison, ' - ')[1]",
"as": "Garrison"
},
{
"type": "formula",
"expr": "datum['Reporting Unit'] === datum['Garrison Unit'] || !isValid(datum['Reporting Unit'])",
"as": "isGarrison"
},
{
"type": "aggregate",
"groupby": [
"Garrison",
"Reporting Unit",
"Installation MET Type",
"MET Measure Short Name",
"Measure",
"Criteria Met",
"Garrison Criteria Met Comparison",
"Garrison Sort",
"Reporting Unit Sort",
"MET Measure Sort",
"compKey",
"Garrison Criteria Met",
"Garrison Unit",
"isGarrison",
"Subordinate Achieved Count",
"Subordinate Measure Count",
"Achieved Per Garrison Subordinate Per Measure Tooltip"
]
},
{
"type": "formula",
"expr": "isValid(datum['Garrison Unit']) ? datum['Criteria Met'] === datum['Garrison Criteria Met'] ? datum['Criteria Met'] : 'Discrepancy' : datum['Criteria Met']",
"as": "Criteria Met Comparison"
},
{
"type": "formula",
"expr": "indexof(['Y', 'N', 'N/A'], datum['Criteria Met'] || 'N/A') + '-' + datum['MET Measure Short Name']",
"as": "Criteria Met Sort"
},
{
"type": "window",
"ops": [
"row_number"
],
"groupby": [
"Reporting Unit"
],
"sort": {
"field": "Criteria Met Sort"
},
"as": [
"Criteria Met Sort"
]
},
{
"type": "formula",
"expr": "indexof(['Y', 'Discrepancy', 'N', 'N/A'], datum['Criteria Met Comparison'] || 'N/A') + '-' + datum['MET Measure Short Name']",
"as": "Criteria Met Comparison Sort"
},
{
"type": "formula",
"expr": "indexof(['Y', 'Discrepancy', 'N', 'N/A'], datum['Garrison Criteria Met Comparison'] || 'N/A') + '-' + datum['MET Measure Short Name']",
"as": "Garrison Criteria Met Comparison Sort"
},
{
"type": "window",
"ops": [
"row_number"
],
"groupby": [
"Reporting Unit"
],
"sort": {
"field": "Criteria Met Comparison Sort"
},
"as": [
"Criteria Met Comparison Sort"
]
},
{
"type": "window",
"ops": [
"row_number"
],
"groupby": [
"Reporting Unit"
],
"sort": {
"field": "Garrison Criteria Met Comparison Sort"
},
"as": [
"Garrison Criteria Met Comparison Sort"
]
},
{
"type": "collect",
"sort": {
"field": "MET Measure Sort"
}
},
{
"type": "collect",
"sort": {
"field": "Reporting Unit Sort"
}
},
{
"type": "collect",
"sort": {
"field": "Garrison Sort"
}
},
{
"type": "formula",
"expr": "datum['Garrison Sort']*10000+datum['Reporting Unit Sort']",
"as": "Reporting Unit Concat Sort"
},
{
"type": "window",
"ops": [
"dense_rank"
],
"sort": {
"field": "Reporting Unit Concat Sort"
},
"as": [
"Facet Unit Index"
]
},
{
"type": "formula",
"expr": "datum['Criteria Met'] === 'Y' ? 1 : 0",
"as": "Total Criteria Met Per Unit"
},
{
"type": "formula",
"expr": "isValid(datum['Criteria Met']) ? 1 : 0",
"as": "Measure Count Per Unit"
},
{
"type": "joinaggregate",
"ops": [
"sum",
"sum"
],
"fields": [
"Measure Count Per Unit",
"Total Criteria Met Per Unit"
],
"groupby": [
"Reporting Unit"
],
"as": [
"Measure Count Per Unit",
"Total Criteria Met Per Unit"
]
},
{
"type": "joinaggregate",
"ops": [
"distinct"
],
"fields": [
"MET Measure Short Name"
],
"groupby": [
"Reporting Unit"
],
"as": [
"Measure Count Per Unit Including N/A"
]
},
{
"type": "formula",
"expr": "datum['Total Criteria Met Per Unit'] + '/' + datum['Measure Count Per Unit']",
"as": "Total Criteria Met Per Unit Label"
},
{
"type": "formula",
"expr": "!isValid(datum['Measure Count Per Unit']) ? 'N/A' : format(datum['Total Criteria Met Per Unit']/datum['Measure Count Per Unit'], '.0%')",
"as": "Total Criteria Met Per Unit Percentage"
},
{
"type": "formula",
"expr": "datum.isGarrison ? datum['Total Criteria Met Per Unit'] : 0",
"as": "Total Criteria Met Per Garrison Unit"
},
{
"type": "formula",
"expr": "datum.isGarrison ? datum['Measure Count Per Unit'] : 0",
"as": "Measure Count Per Garrison Unit"
},
{
"type": "joinaggregate",
"ops": [
"max",
"max"
],
"fields": [
"Total Criteria Met Per Garrison Unit",
"Measure Count Per Garrison Unit"
],
"groupby": [
"Garrison"
],
"as": [
"Total Criteria Met Per Garrison Unit",
"Measure Count Per Garrison Unit"
]
},
{
"type": "formula",
"expr": "datum['Total Criteria Met Per Garrison Unit'] + '/' + datum['Measure Count Per Garrison Unit']",
"as": "Total Criteria Met Per Garrison Unit Label"
},
{
"type": "formula",
"expr": "!isValid(datum['Measure Count Per Garrison Unit']) ? 'N/A' : format(datum['Total Criteria Met Per Garrison Unit']/datum['Measure Count Per Garrison Unit'], '.0%')",
"as": "Total Criteria Met Per Garrison Unit Percentage"
},
{
"type": "collect",
"sort": {
"field": "Facet Unit Index"
}
}
]
},
{
"name": "measure_domain",
"source": "dataset_receive",
"transform": [
{
"type": "formula",
"expr": "datum.Garrison+'-'+datum['MET Measure Short Name']",
"as": "compKey"
},
{
"type": "lookup",
"from": "dataset_provide",
"key": "compKey",
"fields": [
"compKey"
],
"values": [
"Criteria Met",
"Garrison Unit"
],
"as": [
"Garrison Criteria Met",
"Garrison Unit"
]
},
{
"type": "aggregate",
"ops": [
"values"
],
"fields": [
"Criteria MET"
],
"groupby": [
"compKey",
"Garrison",
"MET Measure Short Name",
"Garrison Criteria Met",
"Garrison Sort",
"MET Measure Sort",
"Garrison Unit"
],
"as": [
"Receive Values"
]
},
{
"type": "formula",
"expr": "(pluck(datum['Receive Values'], 'Criteria Met'))",
"as": "Receive Values"
},
{
"type": "formula",
"expr": "(datum['Garrison Criteria Met'] === 'Y' && (indexof(datum['Receive Values'], 'N')>=0)) ? 'Discrepancy' : datum['Garrison Criteria Met']",
"as": "Garrison Criteria Met Comparison"
},
{
"type": "flatten",
"fields": [
"Receive Values"
]
},
{
"type": "formula",
"expr": "datum['Receive Values'] === 'Y' ? 1 : 0",
"as": "Subordinate Achieved Per Garrison"
},
{
"type": "formula",
"expr": "isValid(datum['Receive Values']) ? 1 : 0",
"as": "Measure Count Per Garrison"
},
{
"type": "joinaggregate",
"ops": [
"sum",
"sum"
],
"fields": [
"Subordinate Achieved Per Garrison",
"Measure Count Per Garrison"
],
"groupby": [
"Garrison",
"MET Measure Short Name"
],
"as": [
"Subordinate Achieved Per Garrison",
"Measure Count Per Garrison"
]
},
{
"type": "collect",
"sort": {
"field": "Garrison Sort",
"order": "ascending"
}
},
{
"type": "formula",
"expr": "datum['Garrison'] +',' + datum['Subordinate Achieved Per Garrison'] + ' / ' +datum['Measure Count Per Garrison'] + ' ‎ ‎(' + (!isValid(datum['Measure Count Per Garrison']) || datum['Measure Count Per Garrison'] < 1 ? 'N/A' : format(datum['Subordinate Achieved Per Garrison']/datum['Measure Count Per Garrison'], '.0%'))+')'",
"as": "Garrison Stats"
},
{
"type": "pivot",
"field": "Garrison",
"value": "Garrison Stats",
"op": "values",
"groupby": [
"MET Measure Short Name",
"MET Measure Sort",
"Subordinate Achieved Per Garrison",
"Measure Count Per Garrison"
]
},
{
"type": "formula",
"expr": "[pluck(datum['SBD 1 - Peterson/Schriever'], 'Garrison Stats')[0], pluck(datum['SBD 2 - Buckley'], 'Garrison Stats')[0], pluck(datum['SBD 3 - Los Angeles'], 'Garrison Stats')[0], pluck(datum['SLD 30 - Vandenberg'], 'Garrison Stats')[0], pluck(datum['SLD 45 - Patrick'], 'Garrison Stats')[0], pluck(datum['Other - CONUS'], 'Garrison Stats')[0], pluck(datum['Other - OCONUS'], 'Garrison Stats')[0]]",
"as": "Garrison Stats"
},
{
"type": "project",
"fields": [
"MET Measure Short Name",
"MET Measure Sort",
"Subordinate Achieved Per Garrison",
"Measure Count Per Garrison",
"Garrison Stats"
]
},
{
"type": "aggregate",
"ops": [
"sum",
"sum",
"values"
],
"fields": [
"Subordinate Achieved Per Garrison",
"Measure Count Per Garrison",
"Garrison Stats"
],
"groupby": [
"MET Measure Short Name",
"MET Measure Sort"
],
"as": [
"Achieved",
"Measure Count",
"Garrison Stats"
]
},
{
"type": "formula",
"expr": "[pluck(datum['Garrison Stats'], 'Garrison Stats')[0],pluck(datum['Garrison Stats'], 'Garrison Stats')[1],pluck(datum['Garrison Stats'], 'Garrison Stats')[2],pluck(datum['Garrison Stats'], 'Garrison Stats')[3],pluck(datum['Garrison Stats'], 'Garrison Stats')[4],pluck(datum['Garrison Stats'], 'Garrison Stats')[5],pluck(datum['Garrison Stats'], 'Garrison Stats')[6]]",
"as": "Garrison Stats"
},
{
"type": "flatten",
"fields": [
"Garrison Stats"
]
},
{
"type": "formula",
"expr": "split(datum['Garrison Stats'], ',')",
"as": "Garrison Stats"
},
{
"type": "formula",
"expr": "datum['Garrison Stats'][0]",
"as": "Garrison"
},
{
"type": "formula",
"expr": "datum['Garrison Stats'][1]",
"as": "Garrison Stats"
},
{
"type": "pivot",
"field": "Garrison",
"value": "Garrison Stats",
"op": "min",
"groupby": [
"MET Measure Short Name",
"MET Measure Sort",
"Achieved",
"Measure Count"
]
},
{
"type": "formula",
"expr": "format(datum['Achieved']/datum['Measure Count'], '.0%')",
"as": "Percent Achieved"
},
{
"type": "formula",
"expr": "(datum['Measure Count']-datum['Achieved'])/datum['Measure Count']",
"as": "Percent Not Achieved Unformatted"
},
{
"type": "formula",
"expr": "{title: datum['MET Measure Short Name'], 'USSF Achieved': datum['Achieved'] + ' / ' +datum['Measure Count'] + ' ‎ ‎('+datum['Percent Achieved']+')', '‎' : '‎', 'Peterson/Schriever': datum['SBD 1 - Peterson/Schriever'], 'Buckley': datum['SBD 2 - Buckley'], 'Los Angeles': datum['SBD 3 - Los Angeles'], 'Vandenberg': datum['SLD 30 - Vandenberg'], 'Patrick': datum['SLD 45 - Patrick'], 'CONUS': datum['Other - CONUS'], 'OCONUS': datum['Other - OCONUS']}",
"as": "tooltip"
},
{
"type": "formula",
"expr": "measureSort",
"as": "measureSort"
},
{
"type": "formula",
"expr": "datum.measureSort[0].active ? (datum.measureSort[0].orderAsc ? 'ascending' : 'descending') : (datum.measureSort[1].orderAsc ? 'ascending' : 'descending')",
"as": "sortBy"
},
{
"type": "formula",
"expr": "datum.measureSort[0].active ? datum['MET Measure Short Name'] : datum['Percent Not Achieved Unformatted']",
"as": "sort"
},
{
"type": "joinaggregate",
"fields": [
"MET Measure Sort"
],
"as": [
"Total Measure Count"
]
},
{
"type": "window",
"ops": [
"row_number"
],
"sort": {
"field": "sort",
"order": "ascending"
},
"as": [
"sort"
]
},
{
"type": "formula",
"expr": "datum['sortBy'] === 'ascending' ? datum.sort : (datum['Total Measure Count']+1)-datum.sort",
"as": "sort"
},
{
"type": "project",
"fields": [
"MET Measure Short Name",
"MET Measure Sort",
"Achieved",
"Measure Count",
"Percent Not Achieved Unformatted",
"tooltip",
"sort",
"measureSort",
"sortBy",
"Total Measure Count"
]
}
]
},
{
"name": "garrison_domain",
"source": "dataset_formatted",
"transform": [
{
"type": "aggregate",
"ops": [
"distinct"
],
"fields": [
"Reporting Unit"
],
"groupby": [
"Garrison",
"Garrison Unit",
"Garrison Sort"
],
"as": [
"Unit Count"
]
},
{
"type": "formula",
"expr": "indexof(garrisonSortIsExpandedArr, toString(datum['Garrison Sort'])) >= 0",
"as": "isExpanded"
},
{
"type": "formula",
"expr": "(datum['Garrison Sort'] === garrisonSortOrderJustClicked ? (datum.isExpanded ? ((garrisonDrawerTEased)*datum['Unit Count']*unitYStep) : (1-garrisonDrawerTEased)*datum['Unit Count']*unitYStep) : (datum.isExpanded ? datum['Unit Count']*unitYStep : 0))",
"as": "height"
},
{
"type": "formula",
"expr": "datum.height+garrisonYStep",
"as": "height"
},
{
"type": "formula",
"expr": "0",
"as": "initialGarrisonAndUnitHeight"
},
{
"type": "formula",
"expr": "datum['Garrison Sort'] === 1 ? unitYStep*datum['Unit Count'] + garrisonYStep*7 : 0",
"as": "initialGarrisonAndUnitHeight"
},
{
"type": "joinaggregate",
"ops": [
"sum",
"sum"
],
"fields": [
"height",
"initialGarrisonAndUnitHeight"
],
"as": [
"requiredGarrisonAndUnitHeight",
"initialGarrisonAndUnitHeight"
]
},
{
"type": "collect",
"sort": {
"field": "Garrison Sort",
"order": "ascending"
}
}
]
},
{
"name": "criteria_met_comparison_domain",
"values": [
{
"Criteria Met Comparison": "Y",
"Criteria Met Comparison Sort": 1
},
{
"Criteria Met Comparison": "N",
"Criteria Met Comparison Sort": 2
},
{
"Criteria Met Comparison": "Discrepancy",
"Criteria Met Comparison Sort": 3
},
{
"Criteria Met Comparison": "N/A",
"Criteria Met Comparison Sort": 4
}
]
},
{
"name": "selectedMeasures",
"on": [
{
"trigger": "selectedMeasureArr",
"remove": true,
"insert": "selectedMeasureArr"
}
],
"transform": [
{
"type": "filter",
"expr": "datum.data !== ''"
}
]
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment