Skip to content

Commit efda41b

Browse files
committed
Feature/Bugfix: Show game event details in UI
1 parent 4ed4ec8 commit efda41b

File tree

6 files changed

+75
-78
lines changed

6 files changed

+75
-78
lines changed

internal/app/engine/process_proposals.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ func (e *Engine) processProposals() {
3030
majority := int(math.Floor(float64(numAutoRefs) / 2.0))
3131

3232
if numProposals > majority {
33-
log.Printf("Majority (%v > %v) reached for %v.", numProposals, majority, firstGameEvent.Type)
33+
log.Printf("Majority of %v reached with %v out of %v for %v.", majority, numProposals, numAutoRefs, firstGameEvent.Type)
3434
e.Enqueue(&statemachine.Change{
3535
Change: &statemachine.Change_AcceptGameEventProposals{
3636
AcceptGameEventProposals: &statemachine.AcceptGameEventProposals{

internal/app/statemachine/change_acceptproposal.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ func (s *StateMachine) processChangeAcceptGameEventProposals(newState *state.Sta
3333

3434
func (s *StateMachine) createMergedGameEvent(events []*state.GameEventProposal) *state.GameEvent {
3535
event := new(state.GameEvent)
36-
proto.Merge(event, events[0])
36+
proto.Merge(event, events[0].GameEvent)
3737
event.Origin = []string{}
3838
byTeam := map[state.Team]int{}
3939
for _, e := range events {

src/components/game-events/CurrentEvents.vue

Lines changed: 17 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,15 @@
44
<div class="game-event-item"
55
v-if="gameEventsPresent"
66
v-for="(gameEvent, index) in gameEvents"
7+
@click="eventSelected(index)"
78
:key="index">
89
<span :class="{'team-blue': byTeam(gameEvent) === 'BLUE', 'team-yellow': byTeam(gameEvent) === 'YELLOW'}">
910
{{gameEvent.type}}
1011
</span>
1112
<p class="details-row"
13+
v-if="selectedEvent === index"
1214
v-for="detail in detailsList(gameEvent)"
1315
:key="detail.key">{{detail.key}}: {{detail.value}}</p>
14-
<p class="details-row"
15-
v-if="gameEvent.origins && gameEvent.origins.length > 0">
16-
Submitted by: {{gameEvent.origins}}
17-
</p>
1816
<div class="btn-accept"
1917
v-if="showAcceptGoal(gameEvent)"
2018
v-b-tooltip.hover.d500.righttop="'Accept this goal'">
@@ -28,9 +26,15 @@
2826

2927
<script>
3028
import {submitGameEvent} from "../../submit";
29+
import {gameEventByTeam, gameEventDetailsList} from "../../gameEvents";
3130
3231
export default {
3332
name: "CurrentEvents",
33+
data() {
34+
return {
35+
selectedEvent: -1,
36+
}
37+
},
3438
computed: {
3539
gameEvents() {
3640
return this.$store.state.matchState.gameEvents;
@@ -48,34 +52,21 @@
4852
}
4953
},
5054
methods: {
55+
eventSelected(index) {
56+
if (this.selectedEvent === index) {
57+
this.selectedEvent = -1;
58+
} else {
59+
this.selectedEvent = index;
60+
}
61+
},
5162
showAcceptGoal(gameEvent) {
5263
return !this.goalEventPresent && gameEvent.type === 'POSSIBLE_GOAL';
5364
},
54-
details(gameEvent) {
55-
Object.keys(gameEvent).forEach(function (wrapperKey) {
56-
if (wrapperKey !== 'type' && wrapperKey !== 'origin') {
57-
return gameEvent[wrapperKey];
58-
}
59-
});
60-
return {};
61-
},
6265
detailsList(gameEvent) {
63-
let list = [];
64-
let i = 0;
65-
let eventDetails = this.details(gameEvent);
66-
Object.keys(eventDetails).forEach(function (key) {
67-
if (key !== 'byTeam') {
68-
list[i++] = {key: key, value: eventDetails[key]};
69-
}
70-
});
71-
return list;
66+
return gameEventDetailsList(gameEvent);
7267
},
7368
byTeam(gameEvent) {
74-
let eventDetails = this.details(gameEvent);
75-
if (eventDetails.hasOwnProperty('byTeam')) {
76-
return eventDetails.byTeam;
77-
}
78-
return '';
69+
return gameEventByTeam(gameEvent);
7970
},
8071
acceptGoal(gameEvent) {
8172
submitGameEvent({

src/components/game-events/EventProposals.vue

Lines changed: 23 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@
33
<div class="proposal-item"
44
v-if="eventProposalsPresent"
55
v-for="(proposal, index) in eventProposals"
6+
@click="eventSelected(index)"
67
:key="index">
7-
<span :class="{'team-blue': byTeam(proposal) === 2, 'team-yellow': byTeam(proposal) === 1}">
8+
<span :class="{'team-blue': byTeam(proposal.gameEvent) === 'BLUE', 'team-yellow': byTeam(proposal.gameEvent) === 'YELLOW'}">
89
{{proposal.gameEvent.type}}
910
</span>
10-
<span>by {{proposal.proposerId}}</span>
11-
(<span v-format-ns-duration="proposalTimeout(proposal.validUntil)"></span>):
1211
<p class="details-row"
13-
v-for="detail in detailsList(proposal)"
12+
v-if="selectedEvent === index"
13+
v-for="detail in detailsList(proposal.gameEvent)"
1414
:key="detail.key">{{detail.key}}: {{detail.value}}</p>
1515
<a class="btn-accept"
1616
v-b-tooltip.hover.d500
@@ -23,56 +23,41 @@
2323
</template>
2424

2525
<script>
26+
import {gameEventByTeam, gameEventDetailsList} from "../../gameEvents";
27+
2628
export default {
2729
name: "EventProposals",
30+
data() {
31+
return {
32+
selectedEvent: -1,
33+
}
34+
},
2835
computed: {
2936
eventProposals() {
30-
return this.$store.state.matchState.proposedGameEvents;
37+
return this.$store.state.matchState.gameEventProposals;
3138
},
3239
eventProposalsPresent() {
3340
return this.eventProposals != null && this.eventProposals.length > 0;
3441
}
3542
},
3643
methods: {
37-
details(gameEvent) {
38-
Object.keys(gameEvent).forEach(function (wrapperKey) {
39-
if (wrapperKey !== 'type' && wrapperKey !== 'origin') {
40-
return gameEvent[wrapperKey];
41-
}
42-
});
43-
return {};
44+
eventSelected(index) {
45+
if (this.selectedEvent === index) {
46+
this.selectedEvent = -1;
47+
} else {
48+
this.selectedEvent = index;
49+
}
4450
},
4551
detailsList(gameEvent) {
46-
let list = [];
47-
let i = 0;
48-
let eventDetails = this.details(gameEvent);
49-
Object.keys(eventDetails).forEach(function (key) {
50-
if (key !== 'byTeam') {
51-
list[i++] = {key: key, value: eventDetails[key]};
52-
}
53-
});
54-
return list;
52+
return gameEventDetailsList(gameEvent);
5553
},
5654
byTeam(gameEvent) {
57-
let eventDetails = this.details(gameEvent);
58-
if (eventDetails.hasOwnProperty('byTeam')) {
59-
return eventDetails.byTeam;
60-
}
61-
return '';
62-
},
63-
proposalTimeout(v) {
64-
let validUntil = new Date(v);
65-
let now = Date.now();
66-
let remaining = validUntil - now;
67-
if (remaining < 0) {
68-
return 0;
69-
}
70-
return remaining * 1e6;
55+
return gameEventByTeam(gameEvent);
7156
},
7257
accept(gameEvent) {
73-
this.$socket.sendObj({
74-
gameEvent: gameEvent
75-
});
58+
// TODO
59+
// submitChange();
60+
console.log('TODO: submit ' + gameEvent);
7661
},
7762
}
7863
}

src/components/protocol/ProtocolTable.vue

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
<script>
5050
import "../../date.format";
5151
import {submitChange} from "../../submit";
52+
import {gameEventDetails} from "../../gameEvents";
5253
5354
export default {
5455
name: "EventTable",
@@ -94,14 +95,6 @@
9495
}
9596
return '';
9697
},
97-
gameEventDetails(event) {
98-
for (let key of Object.keys(event)) {
99-
if (key !== 'origin' && key !== 'type') {
100-
return event[key];
101-
}
102-
}
103-
return {};
104-
},
10598
entryDetails(entry) {
10699
let type = this.protocolType(entry);
107100
return JSON.stringify(entry.change[type], null, 2);
@@ -118,11 +111,11 @@
118111
case 'yellowCardOver':
119112
return entry.change.yellowCardOver.forTeam;
120113
case 'addGameEvent':
121-
return this.gameEventDetails(entry.change.addGameEvent.gameEvent).byTeam;
114+
return gameEventDetails(entry.change.addGameEvent.gameEvent).byTeam;
122115
case 'addPassiveGameEvent':
123-
return this.gameEventDetails(entry.change.addPassiveGameEvent.gameEvent).byTeam;
116+
return gameEventDetails(entry.change.addPassiveGameEvent.gameEvent).byTeam;
124117
case 'addProposedGameEvent':
125-
return this.gameEventDetails(entry.change.addProposedGameEvent.gameEvent).byTeam;
118+
return gameEventDetails(entry.change.addProposedGameEvent.proposal.gameEvent).byTeam;
126119
case 'updateTeamState':
127120
return entry.change.updateTeamState.forTeam;
128121
case 'newGameState':
@@ -191,7 +184,7 @@
191184
case 'addPassiveGameEvent':
192185
return 'New passive game event: ' + entry.change.addPassiveGameEvent.gameEvent.type;
193186
case 'addProposedGameEvent':
194-
return 'New proposed game event: ' + entry.change.addProposedGameEvent.gameEvent.type;
187+
return 'New proposed game event: ' + entry.change.addProposedGameEvent.proposal.type;
195188
case 'startBallPlacement':
196189
return 'Start ball placement';
197190
case 'continue':

src/gameEvents.js

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
export const gameEventDetails = function(event) {
2+
for (let key of Object.keys(event)) {
3+
if (key !== 'origin' && key !== 'type') {
4+
return event[key];
5+
}
6+
}
7+
return {};
8+
};
9+
10+
export const gameEventByTeam = function(gameEvent) {
11+
let eventDetails = gameEventDetails(gameEvent);
12+
if (eventDetails.hasOwnProperty('byTeam')) {
13+
return eventDetails.byTeam;
14+
}
15+
return '';
16+
};
17+
18+
export const gameEventDetailsList = function(gameEvent) {
19+
let list = [{key: 'Origins', value: gameEvent.origin}];
20+
let i = 1;
21+
let eventDetails = gameEventDetails(gameEvent);
22+
Object.keys(eventDetails).forEach(function (key) {
23+
if (key !== 'byTeam') {
24+
list[i++] = {key: key, value: eventDetails[key]};
25+
}
26+
});
27+
return list;
28+
};

0 commit comments

Comments
 (0)