Skip to content

Commit 69c2755

Browse files
authored
Enhance Dropdown components to support localization (#27)
* Enhance Dropdown components to support localization with new ILocalizedItemMember interface. * Added null check for container items in FormattingSettingsService to prevent errors when items are undefined or null. * Fixed type and added export of interfaces * Typo * Removed redundant type assertations and updated changelog
1 parent ff8843c commit 69c2755

7 files changed

Lines changed: 233 additions & 229 deletions

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
2+
## 6.1.0
3+
* `ItemDropdown` now supports new interface `ILocalizedItemMember` for localization of dropdown items.
4+
* `ItemDropdown` got new method `setValue(value: powerbi.EnumMemberValue, localizationManager?: powerbi.extensibility.ILocalizationManager)` to set value by unique enum member value.
5+
* Fixed empty groups exception
6+
17
## 6.0.4
28
* Fix AutoDropDown issue
39

package-lock.json

Lines changed: 181 additions & 212 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "powerbi-visuals-utils-formattingmodel",
3-
"version": "6.0.4",
3+
"version": "6.1.0",
44
"description": "",
55
"main": "lib/index.js",
66
"module": "lib/index.js",
@@ -14,12 +14,12 @@
1414
"author": "",
1515
"license": "MIT",
1616
"dependencies": {
17-
"powerbi-visuals-api": "^5.9.0"
17+
"powerbi-visuals-api": "^5.11.0"
1818
},
1919
"devDependencies": {
20-
"@typescript-eslint/eslint-plugin": "^7.5.0",
21-
"@typescript-eslint/parser": "^7.5.0",
22-
"eslint": "^8.57.0",
20+
"@typescript-eslint/eslint-plugin": "^7.18.0",
21+
"@typescript-eslint/parser": "^7.18.0",
22+
"eslint": "^8.57.1",
2323
"eslint-plugin-powerbi-visuals": "^0.8.1"
2424
}
2525
}

src/FormattingSettingsComponents.ts

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
import powerbi from "powerbi-visuals-api";
77

8-
import { IFormattingSettingsSlice } from "./FormattingSettingsInterfaces";
8+
import { IFormattingSettingsSlice, ILocalizedItemMember } from "./FormattingSettingsInterfaces";
99
import * as FormattingSettingsParser from "./utils/FormattingSettingsUtils";
1010

1111
import data = powerbi.data;
@@ -126,9 +126,16 @@ export abstract class SimpleSlice<T = any> extends NamedEntity implements IForma
126126
}
127127
// eslint-disable-next-line
128128
getFormattingComponent?(objectName: string, localizationManager?: powerbi.extensibility.ILocalizationManager): visuals.SimpleComponentBase<any> {
129+
let value: T | ILocalizedItemMember = this.value as ILocalizedItemMember;
130+
if (value.displayNameKey) {
131+
value = {
132+
displayName: localizationManager?.getDisplayName(value.displayNameKey),
133+
value: value.value
134+
} as T;
135+
}
129136
return {
130137
descriptor: FormattingSettingsParser.getDescriptor(objectName, this),
131-
value: this.value,
138+
value: value,
132139
}
133140
}
134141

@@ -235,21 +242,35 @@ export class DatePicker extends SimpleSlice<Date> {
235242
}
236243
}
237244

238-
export class ItemDropdown extends SimpleSlice<powerbi.IEnumMember> {
239-
items: powerbi.IEnumMember[];
245+
export class ItemDropdown extends SimpleSlice<powerbi.IEnumMember | ILocalizedItemMember> {
246+
items: powerbi.IEnumMember[] | ILocalizedItemMember[];
240247

241248
type?= visuals.FormattingComponent.Dropdown;
242249

243250
constructor(object: ItemDropdown) {
244251
super(object);
245252
}
246253

247-
getFormattingComponent?(objectName: string): visuals.ItemDropdown {
254+
getFormattingComponent?(objectName: string, localizationManager?: powerbi.extensibility.ILocalizationManager): visuals.ItemDropdown {
248255
return {
249-
... super.getFormattingComponent(objectName),
250-
items: this.items
256+
... super.getFormattingComponent(objectName, localizationManager),
257+
items: this.getFormattingItems(localizationManager, this.items)
251258
}
252259
}
260+
261+
getFormattingItems?(localizationManager?: powerbi.extensibility.ILocalizationManager, items?: powerbi.IEnumMember[] | ILocalizedItemMember[]): powerbi.IEnumMember[] {
262+
return items.map((item) => {
263+
return {
264+
...item,
265+
displayName: (localizationManager && item.displayNameKey) ? localizationManager.getDisplayName(item.displayNameKey) : item.displayName
266+
}
267+
})
268+
}
269+
270+
setValue?(value: powerbi.EnumMemberValue, localizationManager?: powerbi.extensibility.ILocalizationManager) {
271+
const newValue = this.getFormattingItems(localizationManager, this.items).find((item) => item.value === value);
272+
this.value = newValue ? newValue : this.items[0];
273+
}
253274
}
254275

255276
export class AutoDropdown extends SimpleSlice<powerbi.EnumMemberValue> {

src/FormattingSettingsInterfaces.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,3 +65,8 @@ export interface IBuildFormattingSlicesParams {
6565
sliceNames: { [name: string]: number; },
6666
formattingSlices: visuals.FormattingSlice[]
6767
}
68+
69+
export interface ILocalizedItemMember{
70+
displayNameKey: string;
71+
value: powerbi.EnumMemberValue;
72+
}

src/FormattingSettingsService.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ export class FormattingSettingsService implements IFormattingSettingsService {
2929
if (card instanceof CompositeCard) card.topLevelSlice?.setPropertiesValues(dataViewObjects, card.name);
3030

3131
const cardGroupInstances = <CardGroupEntity[]>(card instanceof SimpleCard ? [ card ] : card.groups);
32-
cardGroupInstances.forEach((cardGroupInstance: CardGroupEntity) => {
32+
cardGroupInstances?.forEach((cardGroupInstance: CardGroupEntity) => {
3333
// Set current top level toggle value
3434
cardGroupInstance.topLevelSlice?.setPropertiesValues(dataViewObjects, card.name);
3535
cardGroupInstance?.slices?.forEach((slice: Slice) => {
@@ -83,8 +83,7 @@ export class FormattingSettingsService implements IFormattingSettingsService {
8383
const cardGroupInstances = <CardGroupEntity[]>(isSimpleCard ?
8484
[ card ].filter(({visible = true}) => visible) :
8585
card.groups.filter(({visible = true}) => visible));
86-
cardGroupInstances
87-
.forEach((cardGroupInstance: CardGroupEntity) => {
86+
cardGroupInstances?.forEach((cardGroupInstance: CardGroupEntity) => {
8887
const groupUid = cardGroupInstance.name + "-group";
8988

9089
// Build formatting group for each group
@@ -121,6 +120,9 @@ export class FormattingSettingsService implements IFormattingSettingsService {
121120
}
122121

123122
container.containerItems.forEach((containerItem: formattingSettings.ContainerItem) => {
123+
if(!containerItem) { // This is to prevent error when container item is null or undefined
124+
return;
125+
}
124126
// Build formatting container item object
125127
const containerIemName = containerItem.displayNameKey ? containerItem.displayNameKey : containerItem.displayName;
126128
const containerItemUid: string = containerUid + containerIemName;
@@ -193,7 +195,7 @@ export class FormattingSettingsService implements IFormattingSettingsService {
193195
const cardGroupInstances = <CardGroupEntity[]>(card instanceof SimpleCard ?
194196
[ card ].filter(({visible = true}) => visible) :
195197
card.groups.filter(({visible = true}) => visible));
196-
cardGroupInstances.forEach((cardGroupInstance: CardGroupEntity) => {
198+
cardGroupInstances?.forEach((cardGroupInstance: CardGroupEntity) => {
197199
cardSlicesDefaultDescriptors = this.getSlicesRevertToDefaultDescriptor(card.name, cardGroupInstance.slices, sliceNames, cardGroupInstance.topLevelSlice);
198200

199201
cardGroupInstance.container?.containerItems?.forEach((containerItem: formattingSettings.ContainerItem) => {

src/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
import * as formattingSettings from "./FormattingSettingsComponents"
22
import FormattingSettingsService from "./FormattingSettingsService"
3-
export { formattingSettings, FormattingSettingsService }
3+
import * as formattingSettingsInterfaces from "./FormattingSettingsInterfaces"
4+
export { formattingSettings, FormattingSettingsService, formattingSettingsInterfaces }

0 commit comments

Comments
 (0)