Skip to content

Commit 55aaa9e

Browse files
savvinsergeyignatvilesov
authored andcommitted
Added cultureSelector to dates formatting (#13)
* 15383:Fixed wrong param type for startDateFormatter.format * Added cultureSelector to dates formattings.Update API to v1.5.Solve problem with with dates values in unit tests * Upgdate version of formattingutils package to 2.1.0
1 parent f47a531 commit 55aaa9e

File tree

5 files changed

+70
-19
lines changed

5 files changed

+70
-19
lines changed

package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "powerbi-visuals-gantt",
3-
"version": "1.0.1",
3+
"version": "1.0.2",
44
"description": "A Gantt chart is a type of bar chart which illustrates a project timeline or schedule. The Gantt Chart visual shows the Tasks, Start Dates, Durations, % Complete, and Resources for a project. The Gantt Chart visual can be used to show current schedule status using percent-complete shadings and a vertical \"TODAY\" line. The Legend may be used to group or filter tasks based upon data values.",
55
"repository": {
66
"type": "git",
@@ -35,7 +35,7 @@
3535
"powerbi-visuals-utils-chartutils": "0.2.1",
3636
"powerbi-visuals-utils-colorutils": "0.2.2",
3737
"powerbi-visuals-utils-dataviewutils": "1.1.1",
38-
"powerbi-visuals-utils-formattingutils": "1.0.0",
38+
"powerbi-visuals-utils-formattingutils": "2.1.0",
3939
"powerbi-visuals-utils-interactivityutils": "0.3.1",
4040
"powerbi-visuals-utils-svgutils": "0.2.1",
4141
"powerbi-visuals-utils-tooltiputils": "0.3.2",

pbiviz.json

+4-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
"displayName": "Gantt",
55
"guid": "Gantt1448688115699",
66
"visualClassName": "Gantt",
7-
"version": "1.0.1",
7+
"version": "1.0.2",
88
"description": "A Gantt chart is a type of bar chart which illustrates a project timeline or schedule. The Gantt Chart visual shows the Tasks, Start Dates, Durations, % Complete, and Resources for a project. The Gantt Chart visual can be used to show current schedule status using percent-complete shadings and a vertical \"TODAY\" line. The Legend may be used to group or filter tasks based upon data values.",
99
"supportUrl": "http://community.powerbi.com",
1010
"gitHubUrl": "https://github.com/Microsoft/powerbi-visuals-gantt"
@@ -23,6 +23,9 @@
2323
"node_modules/lodash/lodash.min.js",
2424
"node_modules/globalize/lib/globalize.js",
2525
"node_modules/globalize/lib/cultures/globalize.culture.en-US.js",
26+
"node_modules/globalize/lib/cultures/globalize.culture.en-GB.js",
27+
"node_modules/globalize/lib/cultures/globalize.culture.ru-RU.js",
28+
"node_modules/globalize/lib/cultures/globalize.culture.ru.js",
2629
"node_modules/powerbi-visuals-utils-dataviewutils/lib/index.js",
2730
"node_modules/powerbi-visuals-utils-typeutils/lib/index.js",
2831
"node_modules/powerbi-visuals-utils-svgutils/lib/index.js",

src/gantt.ts

+9-6
Original file line numberDiff line numberDiff line change
@@ -428,7 +428,7 @@ module powerbi.extensibility.visual {
428428
* @param task All task attributes.
429429
* @param formatters Formatting options for gantt attributes.
430430
*/
431-
private static getTooltipInfo(task: Task, formatters: GanttChartFormatters, timeInterval: string = "Days"): VisualTooltipDataItem[] {
431+
private static getTooltipInfo(task: Task, locale: string, formatters: GanttChartFormatters, timeInterval: string = "Days"): VisualTooltipDataItem[] {
432432
let tooltipDataArray: VisualTooltipDataItem[] = [];
433433

434434
if (task.taskType) {
@@ -437,7 +437,7 @@ module powerbi.extensibility.visual {
437437

438438
tooltipDataArray.push({ displayName: "Task", value: task.name });
439439
if (!isNaN(task.start.getDate())) {
440-
tooltipDataArray.push({ displayName: "Start Date", value: formatters.startDateFormatter.format(task.start.toLocaleDateString()) });
440+
tooltipDataArray.push({ displayName: "Start Date", value: formatters.startDateFormatter.format(task.start) });
441441
}
442442

443443
tooltipDataArray.push({ displayName: "Duration", value: `${formatters.durationFormatter.format(task.duration)} ${timeInterval}` });
@@ -469,8 +469,9 @@ module powerbi.extensibility.visual {
469469
/**
470470
* Returns the chart formatters
471471
* @param dataView The data Model
472+
* @param cultureSelector The current user culture
472473
*/
473-
private static getFormatters(dataView: DataView): GanttChartFormatters {
474+
private static getFormatters(dataView: DataView, cultureSelector: string): GanttChartFormatters {
474475
if (!dataView ||
475476
!dataView.metadata ||
476477
!dataView.metadata.columns) {
@@ -489,7 +490,7 @@ module powerbi.extensibility.visual {
489490
}
490491

491492
return <GanttChartFormatters>{
492-
startDateFormatter: ValueFormatter.create({ format: dateFormat }),
493+
startDateFormatter: ValueFormatter.create({ format: dateFormat, cultureSelector }),
493494
durationFormatter: ValueFormatter.create({ format: numberFormat }),
494495
completionFormatter: ValueFormatter.create({ format: PercentFormat, value: 1, allowFormatBeautification: true })
495496
};
@@ -523,6 +524,7 @@ module powerbi.extensibility.visual {
523524
* @param dataView The data Model.
524525
* @param formatters task attributes represented format.
525526
*/
527+
526528
private static createTasks(
527529
dataView: DataView,
528530
taskTypes: TaskTypes,
@@ -588,11 +590,12 @@ module powerbi.extensibility.visual {
588590
};
589591

590592
task.end = d3.time.day.offset(task.start, task.duration);
591-
task.tooltipInfo = Gantt.getTooltipInfo(task, formatters);
593+
task.tooltipInfo = Gantt.getTooltipInfo(task, host.locale, formatters);
592594

593595
tasks.push(task);
594596
}
595597
});
598+
596599
});
597600

598601
return tasks;
@@ -613,7 +616,7 @@ module powerbi.extensibility.visual {
613616
const settings: GanttSettings = GanttSettings.parse<GanttSettings>(dataView);
614617

615618
const taskTypes: TaskTypes = Gantt.getAllTasksTypes(dataView)
616-
, formatters: GanttChartFormatters = this.getFormatters(dataView)
619+
, formatters: GanttChartFormatters = this.getFormatters(dataView, host.locale || null)
617620
, tasks: Task[] = Gantt.createTasks(dataView, taskTypes, host, formatters, colors);
618621

619622
return {

test/visualData.ts

+9-9
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ module powerbi.extensibility.visual.test {
7373
["Dev", "Development", "Shay"],
7474
["Dev", "Desktop", "Ehren"],
7575
["Dev", "Service Fixup", "James"],
76-
["Dev", "BugFixing", "Last Name"],
76+
["Dev", "BugFixing", "Last Name"]
7777
];
7878
public valuesStartDate = GanttData.getRandomUniqueDates(this.valuesTaskTypeResource.length, new Date(2015, 7, 0), new Date(2017, 7, 0));
7979
public valuesDuration = GanttData.getRandomUniqueNumbers(this.valuesTaskTypeResource.length, 3, 40);
@@ -117,16 +117,16 @@ module powerbi.extensibility.visual.test {
117117
roles: { "Resource": true }
118118
},
119119
values: this.valuesTaskTypeResource.map(x => x[2])
120+
},
121+
{
122+
source: {
123+
displayName: GanttData.ColumnStartDate,
124+
type: ValueType.fromDescriptor({ dateTime: true }),
125+
roles: { "StartDate": true }
126+
},
127+
values: this.valuesStartDate
120128
}
121129
], [
122-
{
123-
source: {
124-
displayName: GanttData.ColumnStartDate,
125-
type: ValueType.fromDescriptor({ dateTime: true }),
126-
roles: { "StartDate": true }
127-
},
128-
values: this.valuesStartDate
129-
},
130130
{
131131
source: {
132132
displayName: GanttData.ColumnDuration,

test/visualTest.ts

+46-1
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,11 @@ module powerbi.extensibility.visual.test {
4040
// powerbi.extensibility.utils.test
4141
import clickElement = powerbi.extensibility.utils.test.helpers.clickElement;
4242
import assertColorsMatch = powerbi.extensibility.utils.test.helpers.color.assertColorsMatch;
43+
import mocks = powerbi.extensibility.utils.test.mocks;
4344

4445
// powerbi.extensibility.utils.formatting
4546
import valueFormatter = powerbi.extensibility.utils.formatting.valueFormatter;
47+
import IValueFormatter = powerbi.extensibility.utils.formatting.IValueFormatter;
4648

4749
import LegendPosition = powerbi.extensibility.utils.chart.legend.LegendPosition;
4850

@@ -126,7 +128,7 @@ module powerbi.extensibility.visual.test {
126128
GanttData.ColumnCompletePrecntege]);
127129

128130
visualBuilder.updateRenderTimeout(dataView, () => {
129-
let tasks = d3.select(visualBuilder.element.get(0)).selectAll(".task").data();
131+
let tasks: Task[] = d3.select(visualBuilder.element.get(0)).selectAll(".task").data();
130132

131133
for (let task of tasks) {
132134
expect(task.duration).toEqual(defaultTaskDuration);
@@ -233,6 +235,49 @@ module powerbi.extensibility.visual.test {
233235
})(dateType));
234236
}
235237

238+
it("Verify date format for culture which user have chosen", (done) => {
239+
let host: IVisualHost = mocks.createVisualHost();
240+
host.locale = host.locale || (<any>window.navigator).userLanguage || window.navigator["language"];
241+
let dateFormatter: IValueFormatter = valueFormatter.create({format: "d", cultureSelector: host.locale});
242+
243+
let formattedDates: Date[] = [];
244+
for (let date of defaultDataViewBuilder.valuesStartDate) {
245+
formattedDates.push(dateFormatter.format(date));
246+
}
247+
248+
dataView = defaultDataViewBuilder.getDataView([
249+
GanttData.ColumnTask,
250+
GanttData.ColumnStartDate,
251+
GanttData.ColumnDuration]);
252+
253+
for (let dvColumn of dataView.metadata.columns) {
254+
if (dataView.categorical.categories) {
255+
for (let dvCategory of dataView.categorical.categories) {
256+
if (dvCategory.source.roles && dvCategory.source.roles[GanttData.ColumnStartDate]) {
257+
dvColumn.format = "d";
258+
}
259+
}
260+
}
261+
}
262+
263+
visualBuilder.updateRenderTimeout(dataView, () => {
264+
let tasks = d3.select(visualBuilder.element.get(0)).selectAll(".task").data();
265+
for (let task of tasks) {
266+
for (let tooltipInfo of task.tooltipInfo) {
267+
if (tooltipInfo.displayName === "Start Date") {
268+
let value: VisualTooltipDataItem = tooltipInfo.value;
269+
let idx: number = formattedDates.indexOf(value);
270+
271+
expect(value).toEqual(formattedDates[idx]);
272+
formattedDates.splice(idx, 1);
273+
}
274+
}
275+
}
276+
277+
done();
278+
});
279+
});
280+
236281
it("Verify group tasks enabled", (done) => {
237282
dataView.metadata.objects = { general: { groupTasks: true } };
238283

0 commit comments

Comments
 (0)