Skip to content

Commit 402c7ab

Browse files
mvgalievignatvilesov
authored andcommitted
fixed bug when in some cases value is not shown (#109)
1 parent 0713cd3 commit 402c7ab

File tree

6 files changed

+137
-32
lines changed

6 files changed

+137
-32
lines changed

CHANGELOG.md

+3
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
## 1.11.1
2+
* Fixed issue with not showing values in some cases for day duration unit
3+
* Fixed issue with task name left alignment
14
## 1.11.0
25
* Fixed issue with wrong tooltips
36
* Fixed issue with strange category labels

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "powerbi-visuals-gantt",
3-
"version": "1.11.0",
3+
"version": "1.11.1",
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",

pbiviz.json

+1-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.11.0",
7+
"version": "1.11.1",
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"

src/gantt.ts

+30-16
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,6 @@ module powerbi.extensibility.visual {
120120
const SecondsInADay: number = 60 * MinutesInADay;
121121
const SecondsInAHour: number = MinutesInAHour * SecondsInAMinute;
122122
const DefaultChartLineHeight = 40;
123-
const stepDurationTransformationDefault = 2;
124123
const GanttDurationUnitType = [
125124
"second",
126125
"minute",
@@ -781,7 +780,7 @@ module powerbi.extensibility.visual {
781780
duration = group.Duration.values[index] > settings.general.durationMin ? group.Duration.values[index] as number : settings.general.durationMin;
782781

783782
if (duration && duration % 1 !== 0) {
784-
durationUnit = Gantt.downgradeDurationUnit(durationUnit);
783+
durationUnit = Gantt.downgradeDurationUnit(durationUnit, duration);
785784
stepDurationTransformation =
786785
GanttDurationUnitType.indexOf(settings.general.durationUnit) - GanttDurationUnitType.indexOf(durationUnit);
787786

@@ -997,17 +996,33 @@ module powerbi.extensibility.visual {
997996
return children;
998997
}
999998

1000-
private static downgradeDurationUnit(durationUnit: string): string {
1001-
let durationUnitTypeIndex = GanttDurationUnitType.indexOf(durationUnit);
1002-
durationUnit = (durationUnitTypeIndex !== -1 && durationUnit) || "day";
1003-
// stepDurationTransformationDefault - variable for accuracy calculation of duration transformation
1004-
// if duration == 0.84 day, we need transform duration to minutes in order to get duration without extra loss
1005-
for (let i = stepDurationTransformationDefault; i > 0; i--) {
1006-
if (durationUnitTypeIndex - i > -1) {
1007-
durationUnit = GanttDurationUnitType[durationUnitTypeIndex - i];
999+
public static getNewUnitByFloorDurationFloor(durationUnitTypeIndex: number, duration: number): string {
1000+
if (!durationUnitTypeIndex)
1001+
return GanttDurationUnitType[0];
1002+
1003+
switch (durationUnitTypeIndex) {
1004+
case GanttDurationUnitType.indexOf("day"):
1005+
duration = duration * HoursInADay;
10081006
break;
1009-
}
1007+
case GanttDurationUnitType.indexOf("hour"):
1008+
duration = duration * MinutesInAHour;
1009+
break;
1010+
case GanttDurationUnitType.indexOf("minute"):
1011+
duration = duration * SecondsInAMinute;
1012+
break;
1013+
}
1014+
1015+
if ((duration - Math.floor(duration) !== 0) && durationUnitTypeIndex > 1 ) {
1016+
return Gantt.getNewUnitByFloorDurationFloor(durationUnitTypeIndex - 1, duration);
1017+
} else {
1018+
return GanttDurationUnitType[durationUnitTypeIndex - 1];
10101019
}
1020+
}
1021+
1022+
private static downgradeDurationUnit(durationUnit: string, duration: number): string {
1023+
let durationUnitTypeIndex = GanttDurationUnitType.indexOf(durationUnit);
1024+
// if duration == 0.84 day, we need transform duration to minutes in order to get duration without extra loss
1025+
durationUnit = Gantt.getNewUnitByFloorDurationFloor(durationUnitTypeIndex, duration);
10111026

10121027
return durationUnit;
10131028
}
@@ -1051,8 +1066,8 @@ module powerbi.extensibility.visual {
10511066
: MinutesInAHour);
10521067
break;
10531068
case DurationUnits.Second:
1054-
transformedDuration = duration * (stepDurationTransformation === 2
1055-
? SecondsInAHour
1069+
transformedDuration = duration * (stepDurationTransformation === 3 ? SecondsInADay
1070+
: stepDurationTransformation === 2 ? SecondsInAHour
10561071
: SecondsInAMinute);
10571072
break;
10581073
}
@@ -1319,8 +1334,7 @@ module powerbi.extensibility.visual {
13191334
newTaskParent += parentName + ".";
13201335
}
13211336
});
1322-
newTaskParent += task.name;
1323-
task.parent = newTaskParent;
1337+
task.parent = newTaskParent.slice(0, -1);
13241338

13251339
return task;
13261340
}
@@ -2087,7 +2101,7 @@ module powerbi.extensibility.visual {
20872101
if (this.viewModel.settings.daysOff.show) {
20882102
let durationUnit: string = this.viewModel.settings.general.durationUnit;
20892103
if (task.wasDowngradeDurationUnit) {
2090-
durationUnit = Gantt.downgradeDurationUnit(durationUnit);
2104+
durationUnit = Gantt.downgradeDurationUnit(durationUnit, task.duration);
20912105
}
20922106

20932107
daysOffWidth = this.getDaysOffWidthForProgress(task, durationUnit);

test/visualBuilder.ts

+61-11
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ module powerbi.extensibility.visual.test {
157157
return { solid: { color: color } };
158158
}
159159

160-
public static getTasksMockData(mockArray: object, mockCaseName: string): Task[] {
160+
public static getTaskMockData(mockArray: object, mockCaseName: string): Task[] {
161161
return mockArray[mockCaseName]["data"];
162162
}
163163

@@ -196,6 +196,56 @@ module powerbi.extensibility.visual.test {
196196
return result;
197197
}
198198

199+
public static getDowngradeDurationUnitMocks() {
200+
const GanttDurationUnitType = [
201+
"second",
202+
"minute",
203+
"hour",
204+
"day",
205+
];
206+
207+
let downgradeDurationUnitMock = {
208+
days: {
209+
"data": [
210+
{"unit": GanttDurationUnitType.indexOf("day"), "duration": 1.5},
211+
{"unit": GanttDurationUnitType.indexOf("day"), "duration": 0.84}
212+
],
213+
"expected": [
214+
"hour",
215+
"second"
216+
]
217+
},
218+
hours: {
219+
"data": [
220+
{"unit": GanttDurationUnitType.indexOf("hour"), "duration": 0.05},
221+
{"unit": GanttDurationUnitType.indexOf("hour"), "duration": 0.005}
222+
],
223+
"expected": [
224+
"minute",
225+
"second"
226+
]
227+
},
228+
minutes: {
229+
"data": [
230+
{"unit": GanttDurationUnitType.indexOf("minute"), "duration": 0.01}
231+
],
232+
"expected": [
233+
"second"
234+
]
235+
},
236+
seconds: {
237+
"data": [
238+
{"unit": GanttDurationUnitType.indexOf("second"), "duration": 0.5}
239+
],
240+
"expected": [
241+
"second"
242+
]
243+
}
244+
};
245+
246+
return downgradeDurationUnitMock;
247+
}
248+
199249
public static getTaskMockCommon() {
200250
let taskMock = {
201251
taskWithCorrectParentsMock: {
@@ -205,9 +255,9 @@ module powerbi.extensibility.visual.test {
205255
{id: 3, name: "T2", parent: "Group C.T2", children: []}
206256
]),
207257
"expected" : GanttBuilder.generateMocksCase([
208-
{id: 1, name: "T1", parent: "T1", children: []},
209-
{id: 2, name: "Group C", parent: "Group C", children: ["T2"]},
210-
{id: 3, name: "T2", parent: "Group C.T2", children: []}
258+
{id: 1, name: "T1", parent: "", children: []},
259+
{id: 2, name: "Group C", parent: "", children: ["T2"]},
260+
{id: 3, name: "T2", parent: "Group C", children: []}
211261
])
212262
},
213263
taskWithNotExistentParentsMock: {
@@ -218,10 +268,10 @@ module powerbi.extensibility.visual.test {
218268
{id: 4, name: "T3", parent: "Group B.T3", children: []}
219269
]),
220270
"expected" : GanttBuilder.generateMocksCase([
221-
{id: 1, name: "T1", parent: "T1", children: []},
222-
{id: 2, name: "Group C", parent: "Group C", children: []},
223-
{id: 3, name: "T2", parent: "T2", children: []},
224-
{id: 4, name: "T3", parent: "T3", children: []}
271+
{id: 1, name: "T1", parent: "", children: []},
272+
{id: 2, name: "Group C", parent: "", children: []},
273+
{id: 3, name: "T2", parent: "", children: []},
274+
{id: 4, name: "T3", parent: "", children: []}
225275
])
226276
},
227277
taskWithNotExistentMiddleParentsMock: {
@@ -231,9 +281,9 @@ module powerbi.extensibility.visual.test {
231281
{id: 3, name: "T2", parent: "Group C.Group M.T2", children: []}
232282
]),
233283
"expected" : GanttBuilder.generateMocksCase([
234-
{id: 1, name: "T1", parent: "T1", children: []},
235-
{id: 2, name: "Group C", parent: "Group C", children: ["T2"]},
236-
{id: 3, name: "T2", parent: "Group C.T2", children: []}
284+
{id: 1, name: "T1", parent: "", children: []},
285+
{id: 2, name: "Group C", parent: "", children: ["T2"]},
286+
{id: 3, name: "T2", parent: "Group C", children: []}
237287
])
238288
}
239289
};

test/visualTest.ts

+41-3
Original file line numberDiff line numberDiff line change
@@ -1196,10 +1196,48 @@ module powerbi.extensibility.visual.test {
11961196
});
11971197
});
11981198

1199+
describe("check duration unit downgrade", () => {
1200+
it("check for days downgrading", () => {
1201+
let unitMocks = GanttBuilder.getDowngradeDurationUnitMocks(),
1202+
data = unitMocks.days.data,
1203+
expected = unitMocks.days.expected,
1204+
realResult = data.map((dataItem) => VisualClass.getNewUnitByFloorDurationFloor(dataItem.unit, dataItem.duration));
1205+
1206+
expect(realResult).toEqual(expected);
1207+
});
1208+
1209+
it("check for hours downgrading", () => {
1210+
let unitMocks = GanttBuilder.getDowngradeDurationUnitMocks(),
1211+
data = unitMocks.hours.data,
1212+
expected = unitMocks.hours.expected,
1213+
realResult = data.map((dataItem) => VisualClass.getNewUnitByFloorDurationFloor(dataItem.unit, dataItem.duration));
1214+
1215+
expect(realResult).toEqual(expected);
1216+
});
1217+
1218+
it("check for minutes downgrading", () => {
1219+
let unitMocks = GanttBuilder.getDowngradeDurationUnitMocks(),
1220+
data = unitMocks.minutes.data,
1221+
expected = unitMocks.minutes.expected,
1222+
realResult = data.map((dataItem) => VisualClass.getNewUnitByFloorDurationFloor(dataItem.unit, dataItem.duration));
1223+
1224+
expect(realResult).toEqual(expected);
1225+
});
1226+
1227+
it("check for hours downgrading", () => {
1228+
let unitMocks = GanttBuilder.getDowngradeDurationUnitMocks(),
1229+
data = unitMocks.seconds.data,
1230+
expected = unitMocks.seconds.expected,
1231+
realResult = data.map((dataItem) => VisualClass.getNewUnitByFloorDurationFloor(dataItem.unit, dataItem.duration));
1232+
1233+
expect(realResult).toEqual(expected);
1234+
});
1235+
});
1236+
11991237
describe("check not existent parent deletion from tasks", () => {
12001238
it("check on correct parent dataset", () => {
12011239
let taskMock = GanttBuilder.getTaskMockCommon(),
1202-
data = GanttBuilder.getTasksMockData(taskMock, "taskWithCorrectParentsMock"),
1240+
data = GanttBuilder.getTaskMockData(taskMock, "taskWithCorrectParentsMock"),
12031241
expectedResult = GanttBuilder.getTaskMockExpected(taskMock, "taskWithCorrectParentsMock"),
12041242
realResult: Task[] = data.map((task) => VisualClass.deleteNonExistentParents(data, task));
12051243

@@ -1208,7 +1246,7 @@ module powerbi.extensibility.visual.test {
12081246

12091247
it("check on not existent parent dataset - parent.children", () => {
12101248
let taskMock = GanttBuilder.getTaskMockCommon(),
1211-
data = GanttBuilder.getTasksMockData(taskMock, "taskWithNotExistentParentsMock"),
1249+
data = GanttBuilder.getTaskMockData(taskMock, "taskWithNotExistentParentsMock"),
12121250
expectedResult = GanttBuilder.getTaskMockExpected(taskMock, "taskWithNotExistentParentsMock"),
12131251
realResult: Task[] = data.map((task) => VisualClass.deleteNonExistentParents(data, task));
12141252

@@ -1218,7 +1256,7 @@ module powerbi.extensibility.visual.test {
12181256
it("check on not existent in the middle parent dataset", () => {
12191257
// parent.nonExistentParent.children -> parent.children
12201258
let taskMock = GanttBuilder.getTaskMockCommon(),
1221-
data = GanttBuilder.getTasksMockData(taskMock, "taskWithNotExistentMiddleParentsMock"),
1259+
data = GanttBuilder.getTaskMockData(taskMock, "taskWithNotExistentMiddleParentsMock"),
12221260
expectedResult = GanttBuilder.getTaskMockExpected(taskMock, "taskWithNotExistentMiddleParentsMock"),
12231261
realResult: Task[] = data.map((task) => VisualClass.deleteNonExistentParents(data, task));
12241262

0 commit comments

Comments
 (0)