Skip to content

Commit

Permalink
Remove unnecessary settings pane toggles, update types
Browse files Browse the repository at this point in the history
  • Loading branch information
andrjohns committed Aug 23, 2024
1 parent 0a33e83 commit 6e95084
Show file tree
Hide file tree
Showing 6 changed files with 29 additions and 104 deletions.
2 changes: 1 addition & 1 deletion pbiviz.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
"displayName":"SPC Charts",
"guid":"PBISPC",
"visualClassName":"Visual",
"version":"1.4.4.6",
"version":"1.4.4.7",
"description":"A PowerBI custom visual for SPC charts",
"supportUrl":"https://github.com/AUS-DOH-Safety-and-Quality/PowerBI-SPC",
"gitHubUrl":"https://github.com/AUS-DOH-Safety-and-Quality/PowerBI-SPC"
Expand Down
2 changes: 1 addition & 1 deletion src/Classes/index.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
export { default as plotPropertiesClass, type axisProperties } from "./plotPropertiesClass"
export { default as settingsClass, type defaultSettingsType, type defaultSettingsKey, type settingsScalarTypes } from "./settingsClass"
export { default as settingsClass, type defaultSettingsType, type defaultSettingsKeys, type settingsScalarTypes } from "./settingsClass"
export { default as viewModelClass, type plotData, type lineData, type controlLimitsObject, type controlLimitsArgs, type outliersObject, type viewModelValidationT } from "./viewModelClass"
export { default as derivedSettingsClass } from "./derivedSettingsClass"
54 changes: 15 additions & 39 deletions src/Classes/settingsClass.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,26 +5,20 @@ type VisualObjectInstanceEnumerationObject = powerbi.default.VisualObjectInstanc
type VisualObjectInstance = powerbi.default.VisualObjectInstance;
type VisualObjectInstanceContainer = powerbi.default.VisualObjectInstanceContainer;
import { extractConditionalFormatting, isNullOrUndefined } from "../Functions";
import { default as defaultSettings, type settingsValueTypes, settingsPaneGroupings, settingsPaneToggles } from "../defaultSettings";
import { default as defaultSettings, type defaultSettingsType, settingsPaneGroupings,
type defaultSettingsKeys, type defaultSettingsNestedKeys, type NestedKeysOf
} from "../defaultSettings";
import derivedSettingsClass from "./derivedSettingsClass";
import { type ConditionalReturnT, type SettingsValidationT } from "../Functions/extractConditionalFormatting";

type NestedKeysOf<T>
= T extends object
? { [K in keyof T]: K extends string ? K : never; }[keyof T]
: never;

export type defaultSettingsType = settingsValueTypes;
export type defaultSettingsKey = keyof defaultSettingsType;
export type defaultSettingsNestedKey = NestedKeysOf<defaultSettingsType[defaultSettingsKey]>;
export { type defaultSettingsType, type defaultSettingsKeys };
export type settingsScalarTypes = number | string | boolean;

export type optionalSettingsTypes = Partial<{
[K in keyof typeof defaultSettings]: Partial<defaultSettingsType[K]>;
}>;

export type paneGroupingsNestedKey = "all" | NestedKeysOf<typeof settingsPaneGroupings[keyof typeof settingsPaneGroupings]>;
export type paneTogglesNestedKey = "all" | NestedKeysOf<typeof settingsPaneToggles[keyof typeof settingsPaneToggles]>;

/**
* This is the core class which controls the initialisation and
Expand Down Expand Up @@ -60,12 +54,12 @@ export default class settingsClass {
return [settingGroupName, Object.fromEntries(Object.keys(defaultSettings[settingGroupName]).map((settingName) => {
return [settingName, defaultSettings[settingGroupName][settingName]];
}))];
})) as settingsValueTypes);
})) as defaultSettingsType);
})
}

allSettingGroups.forEach((settingGroup: defaultSettingsKey) => {
const condFormatting: ConditionalReturnT<defaultSettingsType[defaultSettingsKey]>
allSettingGroups.forEach((settingGroup: defaultSettingsKeys) => {
const condFormatting: ConditionalReturnT<defaultSettingsType[defaultSettingsKeys]>
= extractConditionalFormatting(inputView?.categorical, settingGroup, this.settings);

if (condFormatting.validation.status !== 0) {
Expand All @@ -86,7 +80,7 @@ export default class settingsClass {
// Get the names of all settings in a given class and
// use those to extract and update the relevant values
const settingNames: string[] = Object.keys(this.settings[settingGroup]);
settingNames.forEach((settingName: defaultSettingsNestedKey) => {
settingNames.forEach((settingName: defaultSettingsNestedKeys) => {
this.settings[settingGroup][settingName]
= condFormatting?.values
? condFormatting?.values[0][settingName]
Expand Down Expand Up @@ -138,31 +132,13 @@ export default class settingsClass {
* @param settingGroupName
* @returns
*/
getSettingNames(settingGroupName: defaultSettingsKey): Record<paneGroupingsNestedKey, defaultSettingsNestedKey[]> {
getSettingNames(settingGroupName: defaultSettingsKeys): Record<paneGroupingsNestedKey, defaultSettingsNestedKeys[]> {
const settingsGrouped: boolean = Object.keys(settingsPaneGroupings)
.includes(settingGroupName);
const paneGroupings: Record<paneGroupingsNestedKey, defaultSettingsNestedKey[]>
= settingsGrouped

return settingsGrouped
? JSON.parse(JSON.stringify(settingsPaneGroupings[settingGroupName]))
: { "all": Object.keys(this.settings[settingGroupName]) };

if (Object.keys(settingsPaneToggles).includes(settingGroupName)) {
const toggledSettings: Record<paneGroupingsNestedKey, typeof settingsPaneToggles[keyof typeof settingsPaneToggles]>
= settingsGrouped
? settingsPaneToggles[settingGroupName]
: { "all": settingsPaneToggles[settingGroupName]};

Object.keys(toggledSettings).forEach((toggleGroup: paneGroupingsNestedKey) => {
let settingsToRemove: string[] = new Array<string>();
Object.keys(toggledSettings[toggleGroup]).forEach((settingToggle: paneTogglesNestedKey) => {
if (this.settings[settingGroupName][settingToggle] !== true) {
settingsToRemove = settingsToRemove.concat(toggledSettings[toggleGroup][settingToggle])
}
})
paneGroupings[toggleGroup] = paneGroupings[toggleGroup].filter(setting => !settingsToRemove.includes(setting))
})
}
return paneGroupings;
}

/**
Expand All @@ -173,8 +149,8 @@ export default class settingsClass {
* @param inputData
* @returns An object where each element is the value for a given setting in the named group
*/
createSettingsEntry(settingGroupName: defaultSettingsKey): VisualObjectInstanceEnumerationObject {
const paneGroupings: Record<paneGroupingsNestedKey, defaultSettingsNestedKey[]>
createSettingsEntry(settingGroupName: defaultSettingsKeys): VisualObjectInstanceEnumerationObject {
const paneGroupings: Record<paneGroupingsNestedKey, defaultSettingsNestedKeys[]>
= this.getSettingNames(settingGroupName);

const rtnInstances = new Array<VisualObjectInstance>();
Expand Down Expand Up @@ -202,7 +178,7 @@ export default class settingsClass {
properties: props,
propertyInstanceKind: Object.fromEntries(propertyKinds),
selector: { data: [{ dataViewWildcard: { matchingOption: 0 } }] },
validValues: Object.fromEntries(Object.keys(defaultSettings[settingGroupName]).map((settingName: defaultSettingsNestedKey) => {
validValues: Object.fromEntries(Object.keys(defaultSettings[settingGroupName]).map((settingName: defaultSettingsNestedKeys) => {
return [settingName, defaultSettings[settingGroupName][settingName]?.["valid"]]
}))
})
Expand All @@ -221,7 +197,7 @@ export default class settingsClass {
return [settingGroupName, Object.fromEntries(Object.keys(defaultSettings[settingGroupName]).map((settingName) => {
return [settingName, defaultSettings[settingGroupName][settingName]];
}))];
})) as settingsValueTypes;
})) as defaultSettingsType;
this.derivedSettings = new derivedSettingsClass();
}
}
4 changes: 2 additions & 2 deletions src/Functions/extractConditionalFormatting.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,13 @@ type DataViewCategoryColumn = powerbi.DataViewCategoryColumn;
type DataViewCategorical = powerbi.DataViewCategorical;
type DataViewObjects = powerbi.DataViewObjects;
type Fill = powerbi.Fill;
import type { defaultSettingsType, defaultSettingsKey } from "../Classes";
import type { defaultSettingsType, defaultSettingsKeys } from "../Classes";
import defaultSettings from "../defaultSettings";
import rep from "./rep";
import between from "./between";
import isNullOrUndefined from "./isNullOrUndefined";

type SettingsTypes = defaultSettingsType[defaultSettingsKey];
type SettingsTypes = defaultSettingsType[defaultSettingsKeys];
export type SettingsValidationT = { status: number, messages: string[][], error?: string };
export type ConditionalReturnT<T extends SettingsTypes> = { values: T[], validation: SettingsValidationT }

Expand Down
67 changes: 8 additions & 59 deletions src/defaultSettings.ts
Original file line number Diff line number Diff line change
Expand Up @@ -200,14 +200,20 @@ const defaultSettings = {


type DefaultTypes<T> = T[Extract<keyof T, "default">];
export type NestedKeysOf<T>
= T extends object
? { [K in keyof T]: K extends string ? K : never; }[keyof T]
: never;

export type settingsValueTypes = {
export type defaultSettingsType = {
[K in keyof typeof defaultSettings]: {
[L in keyof typeof defaultSettings[K]]: DefaultTypes<typeof defaultSettings[K][L]>
}
}
export type defaultSettingsKeys = keyof defaultSettingsType;
export type defaultSettingsNestedKeys = NestedKeysOf<defaultSettingsType[defaultSettingsKeys]>;

export const settingsPaneGroupings = {
export const settingsPaneGroupings: Partial<Record<defaultSettingsKeys, Record<string, defaultSettingsNestedKeys[]>>> = {
outliers: {
"General": ["process_flag_type", "improvement_direction"],
"Astronomical Points": ["astronomical", "astronomical_limit", "ast_colour_improvement", "ast_colour_deterioration", "ast_colour_neutral_low", "ast_colour_neutral_high"],
Expand Down Expand Up @@ -236,66 +242,9 @@ export const settingsPaneGroupings = {
},
summary_table: {
"General": ["show_table", "table_text_overflow", "table_opacity", "table_opacity_unselected", "table_outer_border_style", "table_outer_border_width", "table_outer_border_colour", "table_outer_border_top", "table_outer_border_bottom", "table_outer_border_left", "table_outer_border_right"],

"Header": ["table_header_font", "table_header_size", "table_header_text_align", "table_header_font_weight", "table_header_text_transform", "table_header_text_padding", "table_header_colour", "table_header_bg_colour", "table_header_border_style", "table_header_border_width", "table_header_border_colour", "table_header_border_bottom", "table_header_border_inner"],

"Body": ["table_body_font", "table_body_size", "table_body_text_align", "table_body_font_weight", "table_body_text_transform", "table_body_text_padding", "table_body_colour", "table_body_bg_colour", "table_body_border_style", "table_body_border_width", "table_body_border_colour", "table_body_border_top_bottom", "table_body_border_left_right"]
}
}

export const settingsPaneToggles = {
spc: {
"ttip_show_numerator": ["ttip_label_numerator"],
"ttip_show_denominator": ["ttip_label_denominator"],
"ttip_show_value": ["ttip_label_value"]
},
outliers: {
"Astronomical Points": {
"astronomical": ["astronomical_limit", "ast_colour_improvement", "ast_colour_deterioration", "ast_colour_neutral_low", "ast_colour_neutral_high"]
},
"Shifts": {
"shift": ["shift_n", "shift_colour_improvement", "shift_colour_deterioration", "shift_colour_neutral_low", "shift_colour_neutral_high"]
},
"Trends": {
"trend": ["trend_n", "trend_colour_improvement", "trend_colour_deterioration", "trend_colour_neutral_low", "trend_colour_neutral_high"]
},
"Two-In-Three": {
"two_in_three": ["two_in_three_limit", "two_in_three_highlight_series", "twointhree_colour_improvement", "twointhree_colour_deterioration", "twointhree_colour_neutral_low", "twointhree_colour_neutral_high"]
}
},
nhs_icons: {
"show_variation_icons": ["variation_icons_locations", "variation_icons_scaling"],
"show_assurance_icons": ["assurance_icons_locations", "assurance_icons_scaling"]
},
lines: {
"Main": {
"show_main": ["width_main", "type_main", "colour_main"]
},
"Target": {
"show_target": ["width_target", "type_target", "colour_target", "ttip_show_target", "ttip_label_target"],
"ttip_show_target": ["ttip_label_target"]
},
"Alt. Target": {
"show_alt_target": ["alt_target", "multiplier_alt_target", "width_alt_target", "type_alt_target", "colour_alt_target", "ttip_show_alt_target", "ttip_label_alt_target"],
"ttip_show_alt_target": ["ttip_label_alt_target"]
},
"68% Limits": {
"show_68": ["width_68", "type_68", "colour_68", "ttip_show_68", "ttip_label_68"],
"ttip_show_68": ["ttip_label_68"]
},
"95% Limits": {
"show_95": ["width_95", "type_95", "colour_95", "ttip_show_95", "ttip_label_95"],
"ttip_show_95": ["ttip_label_95"]
},
"99% Limits": {
"show_99": ["width_99", "type_99", "colour_99", "ttip_show_99", "ttip_label_99"],
"ttip_show_99": ["ttip_label_99"]
},
"Specification Limits": {
"show_specification": ["specification_upper", "specification_lower", "multiplier_specification", "width_specification", "type_specification", "colour_specification", "ttip_show_specification", "ttip_label_specification"],
"ttip_show_specification": ["ttip_label_specification"]
}
}
}

export default defaultSettings;
4 changes: 2 additions & 2 deletions src/visual.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import * as d3 from "./D3 Plotting Functions/D3 Modules";
import { drawXAxis, drawYAxis, drawTooltipLine, drawLines,
drawDots, drawIcons, addContextMenu,
drawErrors, initialiseSVG, drawSummaryTable, drawDownloadButton } from "./D3 Plotting Functions"
import { defaultSettingsKey, viewModelClass, type plotData, type viewModelValidationT } from "./Classes"
import { defaultSettingsKeys, viewModelClass, type plotData, type viewModelValidationT } from "./Classes"
import type { plotDataGrouped } from "./Classes/viewModelClass";
import { identitySelected } from "./Functions";

Expand Down Expand Up @@ -145,6 +145,6 @@ export class Visual implements powerbi.extensibility.IVisual {

// Function to render the properties specified in capabilities.json to the properties pane
public enumerateObjectInstances(options: EnumerateVisualObjectInstancesOptions): VisualObjectInstanceEnumerationObject {
return this.viewModel.inputSettings.createSettingsEntry(options.objectName as defaultSettingsKey);
return this.viewModel.inputSettings.createSettingsEntry(options.objectName as defaultSettingsKeys);
}
}

0 comments on commit 6e95084

Please sign in to comment.