[Pharo] Personal fitness tracker web app.
Workouts now directly store their set groups.
Changed files
src/MyFitnessTracker/MFTSQLite3Database.class.st
@@ -117,16 +117,25 @@
117
117
{ #category : #accessing }
118
118
MFTSQLite3Database class >> getAllWorkoutsForUser: aMFTUser connection: openConnection [
119
119
120
Removed:
| allWorkoutRows workouts sets |
120
Added:
| allWorkoutRows workouts allSets |
121
121
allWorkoutRows := (openConnection
122
122
execute:
123
123
'SELECT * FROM Workouts WHERE user_id = ?'
124
124
value: aMFTUser id) rows.
125
Removed:
sets := self getAllSetsForUser: aMFTUser connection: openConnection.
125
Added:
allSets := self
126
Added:
getAllSetsForUser: aMFTUser
127
Added:
connection: openConnection.
128
Added:
126
129
workouts := allWorkoutRows collect: [ :row |
127
130
MFTWorkout newFromDictionary: row asDictionary ].
128
Removed:
workouts do: [ :workout |
129
Removed:
workout sets: (sets select: [ :set | set workoutId = workout id ]) ].
131
Added:
(allSets groupedBy: #workoutId) keysAndAllValuesDo: [
132
Added:
:workoutId
133
Added:
:workoutSets |
134
Added:
| workout |
135
Added:
workout := workouts detect: [ :w | w id = workoutId ].
136
Added:
(workoutSets groupedBy: #groupId) keysAndAllValuesDo: [ :groupId :sets |
137
Added:
workout addSetGroup: (MFTSetGroup id: groupId sets: sets) ] ].
138
Added:
130
139
^ workouts
131
140
]
132
141
src/MyFitnessTracker/MFTSet.class.st
@@ -6,7 +6,7 @@
6
6
'workoutId',
7
7
'exerciseId',
8
8
'number',
9
Removed:
'group',
9
Added:
'groupId',
10
10
'reps',
11
11
'load',
12
12
'rpe',
@@ -35,7 +35,7 @@
35
35
workoutId: (aDictionary at: 'workout_id');
36
36
exerciseId: (aDictionary at: 'exercise_id');
37
37
number: (aDictionary at: 'set_number');
38
Removed:
group: (aDictionary at: 'set_group');
38
Added:
groupId: (aDictionary at: 'set_group');
39
39
reps: (aDictionary at: 'reps');
40
40
rpe: (aDictionary at: 'rpe');
41
41
restAfter: (aDictionary at: 'rest_after');
@@ -51,7 +51,7 @@
51
51
id: 1;
52
52
workoutId: 1;
53
53
exerciseId: 2;
54
Removed:
group: 1;
54
Added:
groupId: 1;
55
55
number: 1;
56
56
reps: 8;
57
57
load: 20;
@@ -60,7 +60,7 @@
60
60
id: 2;
61
61
workoutId: 1;
62
62
exerciseId: 2;
63
Removed:
group: 1;
63
Added:
groupId: 1;
64
64
number: 2;
65
65
reps: 8;
66
66
load: 25;
@@ -69,7 +69,7 @@
69
69
id: 3;
70
70
workoutId: 1;
71
71
exerciseId: 2;
72
Removed:
group: 1;
72
Added:
groupId: 1;
73
73
number: 3;
74
74
reps: 8;
75
75
load: 30;
@@ -79,7 +79,7 @@
79
79
id: 4;
80
80
workoutId: 2;
81
81
exerciseId: 3;
82
Removed:
group: 1;
82
Added:
groupId: 1;
83
83
number: 1;
84
84
reps: 50;
85
85
load: 15;
@@ -88,7 +88,7 @@
88
88
id: 5;
89
89
workoutId: 2;
90
90
exerciseId: 4;
91
Removed:
group: 2;
91
Added:
groupId: 2;
92
92
number: 2;
93
93
reps: 8;
94
94
load: 25;
@@ -97,7 +97,7 @@
97
97
id: 6;
98
98
workoutId: 2;
99
99
exerciseId: 4;
100
Removed:
group: 2;
100
Added:
groupId: 2;
101
101
number: 3;
102
102
reps: 8;
103
103
load: 30;
@@ -107,7 +107,7 @@
107
107
id: 7;
108
108
workoutId: 3;
109
109
exerciseId: 10;
110
Removed:
group: 1;
110
Added:
groupId: 1;
111
111
number: 1;
112
112
reps: 5;
113
113
load: 100;
@@ -116,7 +116,7 @@
116
116
id: 8;
117
117
workoutId: 3;
118
118
exerciseId: 11;
119
Removed:
group: 1;
119
Added:
groupId: 1;
120
120
number: 2;
121
121
reps: 5;
122
122
load: 100;
@@ -125,16 +125,16 @@
125
125
id: 9;
126
126
workoutId: 3;
127
127
exerciseId: 12;
128
Removed:
group: 2;
128
Added:
groupId: 2;
129
129
number: 3;
130
130
reps: 5;
131
131
load: 100;
132
132
rpe: 10) }.
133
133
134
Removed:
^ {
135
Removed:
forWorkout1.
136
Removed:
forWorkout2.
137
Removed:
forWorkout3 } flattened
134
Added:
^ OrderedCollection withAll: {
135
Added:
forWorkout1.
136
Added:
forWorkout2.
137
Added:
forWorkout3 } flattened
138
138
]
139
139
140
140
{ #category : #accessing }
@@ -204,15 +204,15 @@
204
204
]
205
205
206
206
{ #category : #accessing }
207
Removed:
MFTSet >> group [
207
Added:
MFTSet >> groupId [
208
208
209
Removed:
^ group
209
Added:
^ groupId
210
210
]
211
211
212
212
{ #category : #accessing }
213
Removed:
MFTSet >> group: anInteger [
213
Added:
MFTSet >> groupId: anInteger [
214
214
215
Removed:
group := anInteger
215
Added:
groupId := anInteger
216
216
]
217
217
218
218
{ #category : #testing }
src/MyFitnessTracker/MFTSetGroup.class.st
@@ -61,9 +61,9 @@
61
61
]
62
62
63
63
{ #category : #accessing }
64
Removed:
MFTSetGroup >> sets: anObject [
64
Added:
MFTSetGroup >> sets: aMFTSetCollection [
65
65
66
Removed:
sets := anObject
66
Added:
sets := aMFTSetCollection
67
67
]
68
68
69
69
{ #category : #initialization }
src/MyFitnessTracker/MFTWorkout.class.st
@@ -7,7 +7,7 @@
7
7
'date',
8
8
'primaryMuscleGroupId',
9
9
'secondaryMuscleGroupIds',
10
Removed:
'sets'
10
Added:
'setGroups'
11
11
],
12
12
#category : #'MyFitnessTracker-Model'
13
13
}
@@ -55,16 +55,22 @@
55
55
workout3 }
56
56
]
57
57
58
Added:
{ #category : #adding }
59
Added:
MFTWorkout >> addSetGroup: aMFTSetGroup [
60
Added:
61
Added:
setGroups add: aMFTSetGroup
62
Added:
]
63
Added:
58
64
{ #category : #'as yet unclassified' }
59
65
MFTWorkout >> anySetHasLoad [
60
66
61
Removed:
^ sets anySatisfy: #hasLoad
67
Added:
^ self sets anySatisfy: #hasLoad
62
68
]
63
69
64
70
{ #category : #'as yet unclassified' }
65
71
MFTWorkout >> anySetHasVolume [
66
72
67
Removed:
^ sets anySatisfy: #hasVolume
73
Added:
^ self sets anySatisfy: #hasVolume
68
74
]
69
75
70
76
{ #category : #accessing }
@@ -105,7 +111,7 @@
105
111
106
112
super initialize.
107
113
date := Date today.
108
Removed:
sets := OrderedCollection new.
114
Added:
setGroups := OrderedCollection new.
109
115
secondaryMuscleGroupIds := OrderedCollection new
110
116
]
111
117
@@ -130,40 +136,6 @@
130
136
]
131
137
132
138
{ #category : #rendering }
133
Removed:
MFTWorkout >> renderAllSetsTableOn: html [
134
Removed:
135
Removed:
| renderLoad renderVolume |
136
Removed:
"We avoid recalculating these render predicates in the main loop below."
137
Removed:
renderLoad := self anySetHasLoad.
138
Removed:
renderVolume := self anySetHasVolume.
139
Removed:
140
Removed:
html table
141
Removed:
class: 'table table-striped table-bordered';
142
Removed:
with: [
143
Removed:
self renderSetsTableHeaderOn: html.
144
Removed:
sets do: [ :set |
145
Removed:
html tableRow: [
146
Removed:
html tableData
147
Removed:
style: 'text-align: right';
148
Removed:
with: ('n{1} g{2}' format: {
149
Removed:
set number.
150
Removed:
set group }).
151
Removed:
html tableData: set exercise englishName capitalized.
152
Removed:
html tableData
153
Removed:
style: 'text-align: right';
154
Removed:
with: set reps.
155
Removed:
renderLoad ifTrue: [
156
Removed:
html tableData
157
Removed:
style: 'text-align: right';
158
Removed:
with: set load ].
159
Removed:
renderVolume ifTrue: [
160
Removed:
html tableData
161
Removed:
style: 'text-align: right';
162
Removed:
with: set volume ] ] ].
163
Removed:
self renderSetsTableFooterOn: html ]
164
Removed:
]
165
Removed:
166
Removed:
{ #category : #rendering }
167
139
MFTWorkout >> renderContentOn: html [
168
140
169
141
html definitionList: [
@@ -179,11 +151,11 @@
179
151
definitionTerm: 'Secondary Muscle Group';
180
152
definitionData:
181
153
(self secondaryMuscleGroups collect: #englishName) asCommaString ] ].
182
Removed:
sets ifNotEmpty: [ self renderGroupedSetsTableOn: html ]
154
Added:
setGroups ifNotEmpty: [ self renderSetGroupsTableOn: html ]
183
155
]
184
156
185
157
{ #category : #rendering }
186
Removed:
MFTWorkout >> renderGroupedSetsTableOn: html [
158
Added:
MFTWorkout >> renderSetGroupsTableOn: html [
187
159
188
160
| renderLoad renderVolume |
189
161
renderLoad := self anySetHasLoad.
@@ -220,8 +192,8 @@
220
192
MFTWorkout >> renderSetsTableFooterOn: html [
221
193
222
194
| totalReps totalVolume |
223
Removed:
totalReps := (sets collect: #reps) sum.
224
Removed:
totalVolume := (sets collect: #volume) sum.
195
Added:
totalReps := (self sets collect: #reps) sum.
196
Added:
totalVolume := (self sets collect: #volume) sum.
225
197
html tableFoot: [
226
198
html tableData.
227
199
html tableData: 'Total'.
@@ -276,23 +248,30 @@
276
248
{ #category : #accessing }
277
249
MFTWorkout >> setGroups [
278
250
279
Removed:
| setGroups |
280
Removed:
setGroups := OrderedCollection new.
281
Removed:
(sets groupedBy: #group) keysAndValuesDo: [ :groupId :group |
282
Removed:
setGroups add: (MFTSetGroup id: groupId sets: group) ].
283
251
^ setGroups
284
252
]
285
253
286
254
{ #category : #accessing }
255
Added:
MFTWorkout >> setGroups: aMFTSetGroupCollection [
256
Added:
257
Added:
setGroups := aMFTSetGroupCollection
258
Added:
]
259
Added:
260
Added:
{ #category : #accessing }
287
261
MFTWorkout >> sets [
288
262
289
Removed:
^ sets
263
Added:
^ setGroups flatCollect: #sets
290
264
]
291
265
292
266
{ #category : #accessing }
293
267
MFTWorkout >> sets: aMFTSetCollection [
294
268
295
Removed:
sets := aMFTSetCollection
269
Added:
| groups |
270
Added:
groups := OrderedCollection new.
271
Added:
(aMFTSetCollection groupedBy: #groupId) keysAndValuesDo: [
272
Added:
:groupId
273
Added:
:sets | groups add: (MFTSetGroup id: groupId sets: sets) ].
274
Added:
self setGroups: groups
296
275
]
297
276
298
277
{ #category : #accessing }
@@ -310,5 +289,5 @@
310
289
{ #category : #'as yet unclassified' }
311
290
MFTWorkout >> volume [
312
291
313
Removed:
^ (sets collect: #volume) sum
292
Added:
^ (setGroups collect: #volume) sum
314
293
]