[Pharo] Personal fitness tracker web app.
Big MFTWorkout rework.
src/MyFitnessTracker/MFTWorkout.class.st
@@ -20,21 +20,36 @@
20
20
{ #category : #'instance creation' }
21
21
MFTWorkout class >> newFromDictionary: aDictionary [
22
22
23
Added:
| primaryMuscleConstructor primaryMuscle secondaryMusclesContructors secondaryMuscles |
24
Added:
primaryMuscleConstructor := (aDictionary
25
Added:
at: 'primary_muscle'
26
Added:
ifAbsent: [ String new ]) asSymbol.
27
Added:
primaryMuscle := (MFTMuscleGroup respondsTo: primaryMuscleConstructor)
28
Added:
ifTrue: [
29
Added:
MFTMuscleGroup perform: primaryMuscleConstructor ]
30
Added:
ifFalse: [ MFTMuscleGroup new ].
31
Added:
secondaryMusclesContructors := ((aDictionary
32
Added:
at: 'secondary_muscles'
33
Added:
ifAbsent: [ String new ]) splitOn:
34
Added:
', ') collect: #asSymbol.
35
Added:
secondaryMuscles := secondaryMusclesContructors collect: [ :symbol |
36
Added:
(MFTMuscleGroup respondsTo: symbol)
37
Added:
ifTrue: [ MFTMuscleGroup perform: symbol ]
38
Added:
ifFalse: [ MFTMuscleGroup new ] ].
39
Added:
23
40
^ self new
24
41
date: (Date fromString: (aDictionary at: 'date'));
25
Removed:
primaryMuscle:
26
Removed:
(MFTMuscle new latinName: (aDictionary at: 'primary_muscle'));
27
Removed:
secondaryMuscles:
28
Removed:
(MFTMuscle new latinName: (aDictionary at: 'secondary_muscles'));
42
Added:
primaryMuscle: primaryMuscle;
43
Added:
secondaryMuscles: secondaryMuscles;
29
44
yourself
30
45
]
31
46
32
47
{ #category : #'as yet unclassified' }
33
48
MFTWorkout class >> placeholderCollection [
34
49
35
Removed:
| workout1 workout2 workout3 |
50
Added:
| workout1 workout2 workout3 workout4 workout5 |
36
51
workout1 := self new
37
Removed:
date: (Date fromString: '01/03/2023');
52
Added:
date: (Date fromString: '01/01/2024');
38
53
primaryMuscle: MFTMuscleGroup chest;
39
54
exercises: (OrderedCollection
40
55
with: (MFTExercise cableRow sets: {
@@ -52,7 +67,7 @@
52
67
(MFTSet reps: 6 rpe: 8).
53
68
(MFTSet reps: 8 rpe: 10) } asOrderedCollection)).
54
69
workout2 := self new
55
Removed:
date: (Date fromString: '01/02/2023');
70
Added:
date: (Date fromString: '01/02/2024');
56
71
exercises: (OrderedCollection
57
72
with: (MFTExercise cableRow sets: {
58
73
(MFTSet reps: 8 rpe: 6).
@@ -62,15 +77,29 @@
62
77
with: MFTExercise shoulderPressDumbell
63
78
with: MFTExercise declineBenchPress).
64
79
workout3 := self new
65
Removed:
date: (Date fromString: '01/01/2023');
80
Added:
date: (Date fromString: '01/03/2024');
66
81
addExercise: MFTExercise cableRow;
67
82
addExercise: MFTExercise shoulderPressDumbell;
68
83
addExercise: MFTExercise declineBenchPress.
84
Added:
workout4 := self new
85
Added:
date: (Date fromString: '01/09/2024');
86
Added:
exercises: {
87
Added:
MFTExercise cableRow.
88
Added:
MFTExercise shoulderPressDumbell.
89
Added:
MFTExercise declineBenchPress } asOrderedCollection.
90
Added:
workout5 := self new
91
Added:
date: (Date fromString: '01/10/2024');
92
Added:
exercises: {
93
Added:
MFTExercise cableRow.
94
Added:
MFTExercise shoulderPressDumbell.
95
Added:
MFTExercise declineBenchPress } asOrderedCollection.
69
96
70
97
^ OrderedCollection withAll: {
71
98
workout1.
72
99
workout2.
73
Removed:
workout3 }
100
Added:
workout3.
101
Added:
workout4.
102
Added:
workout5 }
74
103
]
75
104
76
105
{ #category : #accessing }
@@ -82,11 +111,12 @@
82
111
]
83
112
84
113
{ #category : #accessing }
85
Removed:
MFTWorkout class >> primaryMuscle: aMFTMuscle1 secondaryMuscles: aMFTMuscle2 [
114
Added:
MFTWorkout class >> primaryMuscle: aMFTMuscle secondaryMuscles: aMFTMuscleCollection [
115
Added:
86
116
^ self new
87
Removed:
primaryMuscle: aMFTMuscle1;
88
Removed:
secondaryMuscles: aMFTMuscle2;
89
Removed:
yourself
117
Added:
primaryMuscle: aMFTMuscle;
118
Added:
secondaryMuscles: aMFTMuscleCollection;
119
Added:
yourself
90
120
]
91
121
92
122
{ #category : #initialization }
@@ -112,9 +142,9 @@
112
142
]
113
143
114
144
{ #category : #accessing }
115
Removed:
MFTWorkout >> exercises: listOfExercises [
145
Added:
MFTWorkout >> exercises: aMFTExerciseCollection [
116
146
117
Removed:
exercises := listOfExercises
147
Added:
exercises := aMFTExerciseCollection
118
148
]
119
149
120
150
{ #category : #'as yet unclassified' }
@@ -138,28 +168,6 @@
138
168
secondaryMuscles := OrderedCollection new
139
169
]
140
170
141
Removed:
{ #category : #rendering }
142
Removed:
MFTWorkout >> placeholder [
143
Removed:
"Delete me"
144
Removed:
145
Removed:
^ self
146
Removed:
primaryMuscle: MFTMuscleGroup chest;
147
Removed:
exercises: {
148
Removed:
(MFTExercise cableRow sets: {
149
Removed:
(MFTSet reps: 8 rpe: 6).
150
Removed:
(MFTSet reps: 6 rpe: 8).
151
Removed:
(MFTSet reps: 6 rpe: 10).
152
Removed:
(MFTSet reps: 15 rpe: 4) }).
153
Removed:
(MFTExercise shoulderPressDumbell sets: {
154
Removed:
(MFTSet reps: 10 rpe: 6).
155
Removed:
(MFTSet reps: 6 rpe: 8).
156
Removed:
(MFTSet reps: 6 rpe: 10) }).
157
Removed:
(MFTExercise declineBenchPress sets: {
158
Removed:
(MFTSet reps: 5 rpe: 6).
159
Removed:
(MFTSet reps: 6 rpe: 8).
160
Removed:
(MFTSet reps: 8 rpe: 10) }) }
161
Removed:
]
162
Removed:
163
171
{ #category : #accessing }
164
172
MFTWorkout >> primaryMuscle [
165
173
@@ -174,17 +182,17 @@
174
182
175
183
{ #category : #initialization }
176
184
MFTWorkout >> removeExercise: anExercise [
177
Removed:
exercises remove: anExercise
185
Added:
186
Added:
exercises remove: anExercise
178
187
]
179
188
180
189
{ #category : #rendering }
181
190
MFTWorkout >> renderContentOn: html [
182
191
183
192
html definitionList: [
184
Removed:
date ifNotNil: [
185
Removed:
html
186
Removed:
definitionTerm: 'Date';
187
Removed:
definitionData: date ].
193
Added:
html
194
Added:
definitionTerm: 'Date';
195
Added:
definitionData: date.
188
196
primaryMuscle englishName ifNotEmpty: [
189
197
html
190
198
definitionTerm: 'Primary Muscle';
@@ -219,6 +227,8 @@
219
227
{ #category : #rendering }
220
228
MFTWorkout >> renderExerciseTableOn: html [
221
229
230
Added:
| anExerciseHasVolume |
231
Added:
anExerciseHasVolume := exercises anySatisfy: [ :ex | ex volume ~~ 0 ].
222
232
html table
223
233
class: 'table table-striped table-bordered';
224
234
with: [
@@ -226,21 +236,15 @@
226
236
exercises do: [ :exercise |
227
237
html tableRow: [
228
238
html tableData: [
229
Removed:
html
230
Removed:
text: exercise englishName;
231
Removed:
text: ': '.
232
Removed:
exercise sets
233
Removed:
ifNotEmpty: [
234
Removed:
html text: exercise repsBySet asCommaString.
235
Removed:
html tableData
236
Removed:
style: 'text-align: right';
237
Removed:
with: exercise repsBySet sum ]
238
Removed:
ifEmpty: [
239
Removed:
html text: 0.
240
Removed:
html tableData
241
Removed:
style: 'text-align: right';
242
Removed:
with: 0 ] ].
243
Removed:
(exercises anySatisfy: [ :ex | ex volume ~~ 0 ]) ifTrue: [
239
Added:
html text: exercise englishName.
240
Added:
exercise sets ifNotEmpty: [
241
Added:
html
242
Added:
text: ': ';
243
Added:
text: exercise repsBySet asCommaString ] ].
244
Added:
html tableData
245
Added:
style: 'text-align: right';
246
Added:
with: exercise repsBySet sum.
247
Added:
anExerciseHasVolume ifTrue: [
244
248
html tableData
245
249
style: 'text-align: right';
246
250
with: exercise volume ] ] ].
@@ -262,30 +266,6 @@
262
266
with: 'Volume' ] ]
263
267
]
264
268
265
Removed:
{ #category : #'as yet unclassified' }
266
Removed:
MFTWorkout >> saveToDatabase [
267
Removed:
"Save data to the SQLite3 database"
268
Removed:
269
Removed:
| connection statement |
270
Removed:
connection := SQLite3Connection on:
271
Removed:
(Smalltalk imageDirectory / 'mft.db') fullName.
272
Removed:
connection open.
273
Removed:
connection execute: 'CREATE TABLE IF NOT EXISTS workout(
274
Removed:
id INTEGER PRIMARY KEY AUTOINCREMENT,
275
Removed:
date TEXT NOT NULL,
276
Removed:
exercises JSON,
277
Removed:
primaryMuscle TEXT,
278
Removed:
secondaryMuscles TEXT
279
Removed:
);'.
280
Removed:
"Insert data into the database"
281
Removed:
statement := 'INSERT INTO workout (date, exercises, primaryMuscle, secondaryMuscles) VALUES (?, ?, ?, ?)'.
282
Removed:
connection execute: statement with: {
283
Removed:
date.
284
Removed:
exercises.
285
Removed:
primaryMuscle latinName.
286
Removed:
secondaryMuscles }
287
Removed:
]
288
Removed:
289
269
{ #category : #accessing }
290
270
MFTWorkout >> secondaryMuscles [
291
271
@@ -293,9 +273,9 @@
293
273
]
294
274
295
275
{ #category : #accessing }
296
Removed:
MFTWorkout >> secondaryMuscles: aMuscleArray [
276
Added:
MFTWorkout >> secondaryMuscles: aMFTMuscleCollection [
297
277
298
Removed:
secondaryMuscles := aMuscleArray
278
Added:
secondaryMuscles := aMFTMuscleCollection
299
279
]
300
280
301
281
{ #category : #'as yet unclassified' }