Skip to content

Commit a6a3ec3

Browse files
committed
Factored out timer and states into separate components
1 parent fe3424f commit a6a3ec3

File tree

11 files changed

+206
-171
lines changed

11 files changed

+206
-171
lines changed

PlanningPoker.sln

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@ Microsoft Visual Studio Solution File, Format Version 12.00
33
# Visual Studio 2012
44
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PlanningPoker", "PlanningPoker\PlanningPoker.csproj", "{AA727F91-A618-4D4E-B4E4-1FFC588159D6}"
55
EndProject
6-
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestDurandalJs", "..\..\..\..\Test\TestDurandalJs\TestDurandalJs.csproj", "{010E31A7-E10C-487F-99C2-E0EE6EF8AA9F}"
7-
EndProject
86
Global
97
GlobalSection(SolutionConfigurationPlatforms) = preSolution
108
Debug|Any CPU = Debug|Any CPU
@@ -15,10 +13,6 @@ Global
1513
{AA727F91-A618-4D4E-B4E4-1FFC588159D6}.Debug|Any CPU.Build.0 = Debug|Any CPU
1614
{AA727F91-A618-4D4E-B4E4-1FFC588159D6}.Release|Any CPU.ActiveCfg = Release|Any CPU
1715
{AA727F91-A618-4D4E-B4E4-1FFC588159D6}.Release|Any CPU.Build.0 = Release|Any CPU
18-
{010E31A7-E10C-487F-99C2-E0EE6EF8AA9F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
19-
{010E31A7-E10C-487F-99C2-E0EE6EF8AA9F}.Debug|Any CPU.Build.0 = Debug|Any CPU
20-
{010E31A7-E10C-487F-99C2-E0EE6EF8AA9F}.Release|Any CPU.ActiveCfg = Release|Any CPU
21-
{010E31A7-E10C-487F-99C2-E0EE6EF8AA9F}.Release|Any CPU.Build.0 = Release|Any CPU
2216
EndGlobalSection
2317
GlobalSection(SolutionProperties) = preSolution
2418
HideSolutionNode = FALSE

PlanningPoker/App/components/signalr.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@
1616
proxy.server.newViewer(team, player);
1717
},
1818

19-
newTeam: function (team, duration) {
19+
newTeam: function (team, duration, participating) {
2020

21-
proxy.server.newTeam(team, duration);
21+
proxy.server.newTeam(team, duration, participating);
2222
},
2323

2424
start: function () {
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
define(function () {
2+
3+
return {
4+
5+
Init: 0,
6+
Running: 1,
7+
Paused: 2,
8+
Stopped: 3,
9+
Finished: 4
10+
11+
}
12+
13+
});
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
define(['components/states'], function (states) {
2+
3+
function TimeManager() {
4+
5+
var scale = Math.pow(10, 7);
6+
var remaining = 120;
7+
var self = this;
8+
9+
this.hostState = states.Init;
10+
this.timerId = null;
11+
this.endTime = null;
12+
13+
this.totalDuration = remaining;
14+
this.plannedDuration = ko.observable(remaining.toString());
15+
this.remainingDuration = ko.observable("");
16+
this.progress = ko.observable(0);
17+
18+
formatDuration = function (duration) {
19+
20+
var remainingMinutes = parseInt(duration / 60);
21+
var remainingSeconds = parseInt(duration % 60);
22+
23+
self.totalDuration = duration;
24+
return remainingMinutes + ":" + (remainingSeconds < 10 ? "0" : "") + remainingSeconds;
25+
};
26+
27+
this.getTicks = function (dateTime) {
28+
29+
return ((dateTime.getTime() * 10000) + 621355968000000000);
30+
}
31+
32+
this.updateTime = function () {
33+
34+
var duration = 0;
35+
36+
switch (self.hostState) {
37+
38+
case states.Init:
39+
duration = parseInt(self.plannedDuration());
40+
break;
41+
42+
case states.Running:
43+
44+
var nowTicks = self.getTicks(new Date());
45+
var endTicks = self.getTicks(new Date(self.endTime));
46+
duration = parseInt((endTicks - nowTicks) / scale);
47+
break;
48+
49+
case states.Stopped:
50+
case states.Paused:
51+
duration = self.totalDuration;
52+
break;
53+
}
54+
55+
var totalDuration = parseInt(self.plannedDuration());
56+
var remainingDuration = duration;
57+
var progression = (100 - (100 * (duration / totalDuration))) + "%";
58+
self.progress(progression);
59+
self.remainingDuration(formatDuration(duration));
60+
};
61+
62+
this.updateState = function (state) {
63+
64+
self.hostState = state;
65+
66+
if (state != states.Finished)
67+
timerId = setInterval(self.updateTime, 1000);
68+
else
69+
clearInterval(timerId);
70+
71+
};
72+
73+
this.formattedPlannedDuration = function () {
74+
75+
return formatDuration(parseInt(self.plannedDuration()));
76+
};
77+
78+
//this.updateRemainingTime = function () {
79+
80+
// self.remainingDuration(self.formattedPlannedDuration());
81+
//};
82+
83+
this.updateEndTime = function(endTime, duration) {
84+
85+
self.endTime = endTime;
86+
self.duration = duration;
87+
88+
};
89+
};
90+
91+
return new TimeManager();
92+
});

PlanningPoker/App/viewmodels/team/host.js

Lines changed: 40 additions & 129 deletions
Original file line numberDiff line numberDiff line change
@@ -1,182 +1,93 @@
1-
define(['components/signalr', 'knockout'], function (signalr, ko) {
2-
3-
// state 'enum'
4-
var stateInit = 0;
5-
var stateRunning = 1;
6-
var statePaused = 2;
7-
var stateStopped = 3;
8-
var stateFinished = 4;
9-
10-
function TimeManager() {
11-
12-
var scale = Math.pow(10, 7);
13-
var remaining = 120;
14-
var self = this;
15-
16-
this.hostState = stateInit;
17-
this.timerId = null;
18-
this.endTime = null;
19-
20-
this.totalDuration = remaining;
21-
this.plannedDuration = ko.observable(remaining.toString());
22-
this.remainingDuration = ko.observable("");
23-
this.progress = ko.observable(0);
24-
25-
formatDuration = function (duration) {
26-
27-
var remainingMinutes = parseInt(duration / 60);
28-
var remainingSeconds = parseInt(duration % 60);
29-
30-
self.totalDuration = duration;
31-
return remainingMinutes + ":" + (remainingSeconds < 10 ? "0" : "") + remainingSeconds;
32-
};
33-
34-
this.getTicks = function (dateTime) {
35-
36-
return ((dateTime.getTime() * 10000) + 621355968000000000);
37-
}
38-
39-
this.updateTime = function () {
40-
41-
var duration = 0;
42-
43-
switch (self.hostState) {
44-
45-
case stateInit:
46-
duration = parseInt(self.plannedDuration());
47-
break;
48-
49-
case stateRunning:
50-
51-
var nowTicks = self.getTicks(new Date());
52-
var endTicks = self.getTicks(new Date(self.endTime));
53-
duration = parseInt((endTicks - nowTicks) / scale);
54-
break;
55-
56-
case stateStopped:
57-
case statePaused:
58-
duration = self.totalDuration;
59-
break;
60-
}
61-
62-
var totalDuration = parseInt(self.plannedDuration());
63-
var remainingDuration = duration;
64-
var progression = (100 - (100 * (duration / totalDuration))) + "%";
65-
self.progress(progression);
66-
self.remainingDuration(formatDuration(duration));
67-
};
68-
69-
this.updateState = function (state) {
70-
71-
self.hostState = state;
72-
73-
if (state != stateFinished)
74-
timerId = setInterval(self.updateTime, 1000);
75-
else
76-
clearInterval(timerId);
77-
78-
};
79-
80-
this.formattedPlannedDuration = function () {
81-
82-
return formatDuration(parseInt(self.plannedDuration()));
83-
};
84-
85-
this.updateRemainingTime = function () {
86-
87-
self.remainingDuration(self.formattedPlannedDuration());
88-
};
89-
};
1+
define(['components/signalr', 'components/timeManager', 'components/states', 'knockout'], function (signalr, timer, states, ko) {
902

913
function Host() {
924

935
var self = this;
946

957
this.topClassName = ko.observable("");
968
this.bottomClassName = ko.observable("hide");
97-
this.groupName = ko.observable("Violet Team");
989
this.pauseTitle = ko.observable("Pause");
10+
this.groupName = ko.observable("Violet Team");
9911

100-
this.state = stateInit;
12+
this.state = states.Init;
10113
this.canStart = ko.observable();
10214
this.canStop = ko.observable();
10315
this.canPause = ko.observable();
10416
this.canReset = ko.observable();
10517

10618
this.participating = ko.observable(false);
10719
this.playerName = ko.observable("");
20+
this.players = ko.observableArray([]);
10821

10922
this.playerNameShow = ko.computed(
23+
11024
function () { return self.participating() ? "" : "hide"; },
11125
self
11226
);
11327

114-
this.players = ko.observableArray();
115-
this.players().push({ name: "Ben", score: "?" });
116-
this.players().push({ name: "Lin", score: "?" });
117-
this.players().push({ name: "Lily", score: "?" });
118-
this.players().push({ name: "Aiden", score: "?" });
119-
this.players().push({ name: "Dog", score: "?" });
120-
this.players().push({ name: "Cat", score: "?" });
28+
// copy observables from timer for ease of knockout binding
29+
this.plannedDuration = timer.plannedDuration;
30+
this.remainingDuration = timer.remainingDuration;
31+
this.progress = timer.progress;
12132

122-
this.timer = new TimeManager();
33+
// delegate button actions to the signalr client proxy..
34+
this.start = signalr.start;
35+
this.stop = signalr.stop;
36+
this.pause = signalr.pause;
37+
this.newRound = signalr.newRound;
12338

12439
this.updateState = function (state) {
12540

12641
self.state = state;
127-
self.canStart(state == stateInit);
128-
self.canStop(state == stateRunning || state == statePaused);
129-
self.canPause(state == stateRunning || state == statePaused);
130-
self.canReset(state == stateStopped || state == stateFinished || state == statePaused);
42+
self.canStart(state == states.Init);
43+
self.canStop(state == states.Running || state == states.Paused);
44+
self.canPause(state == states.Running || state == states.Paused);
45+
self.canReset(state == states.Stopped || state == states.Finished || state == states.Paused);
13146

132-
self.pauseTitle(state == statePaused ? "Resume" : "Pause ");
47+
self.pauseTitle(state == states.Paused ? "Resume" : "Pause");
13348

134-
self.timer.updateState(self.state);
49+
timer.updateState(self.state);
13550
};
13651

13752
this.submit = function () {
13853

139-
signalr.newTeam(this.groupName(), parseInt(self.timer.plannedDuration()));
54+
signalr.newTeam(this.groupName(), parseInt(timer.plannedDuration()), this.participating());
14055

141-
if (this.participating())
142-
signalr.newPlayer(this.groupName(), this.playerName());
143-
else
144-
signalr.newViewer(this.groupName(), this.groupName() + "Host");
145-
146-
this.topClassName("hide");
147-
this.bottomClassName("");
148-
this.timer.updateRemainingTime();
56+
self.topClassName("hide");
57+
self.bottomClassName("");
14958
};
15059

151-
this.start = signalr.start;
152-
this.stop = signalr.stop;
153-
this.pause = signalr.pause;
154-
this.newRound = signalr.newRound;
155-
15660
signalr.client.started = function (endTime) {
15761

158-
self.timer.endTime = endTime;
159-
self.updateState(stateRunning);
62+
timer.endTime = endTime;
63+
self.updateState(states.Running);
16064
};
16165

16266
signalr.client.stopped = function () {
16367

164-
self.timer.totalDuration = 0;
165-
self.updateState(stateFinished);
68+
timer.totalDuration = 0;
69+
self.updateState(states.Finished);
16670
};
16771

16872
signalr.client.paused = function (endTime, durationRemaining) {
16973

170-
self.timer.endTime = endTime;
171-
self.timer.duration = durationRemaining;
172-
173-
self.updateState(self.state == statePaused ? stateRunning : statePaused);
74+
timer.updateEndTime(endTime, durationRemaining);
75+
self.updateState(self.state == states.Paused ? states.Running : states.Paused);
17476
};
17577

17678
signalr.client.reset = function () {
17779

178-
updateState(stateInit);
179-
self.pauseTitle("Pause");
80+
self.updateState(states.Init);
81+
};
82+
83+
signalr.client.addPlayer = function (playerName) {
84+
85+
self.players.push({ name: playerName, score: "?" });
86+
};
87+
88+
signalr.client.removePlayer = function (playerName) {
89+
90+
self.players.remove(function (p) { p.name == playerName; });
18091
};
18192

18293
this.updateState(this.state);
Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
1-
define(['components/signalr', 'knockout'], function (signalr, ko) {
1+
define(['components/signalr', 'components/timeManager', 'components/states', 'knockout'], function (signalr, timer, states, ko) {
22

3-
var join = new Client()
3+
function Client()
44
{
5-
groupName = ko.observable("");
6-
playerName = ko.observable("");
5+
groupName = ko.observable("Violet Team");
6+
playerName = ko.observable("Laany");
77

88
submit = function () {
99

1010
signalr.newPlayer(groupName(), playerName());
1111

1212
};
13-
};
13+
}
1414

15-
return join;
15+
return new Client();
1616
});

0 commit comments

Comments
 (0)