Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Remove unnecessary settings pane toggles, update types #326

Merged
merged 1 commit into from
Aug 23, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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);
}
}