[Pharo] Personal fitness tracker web app.
Added a bunch of new exercises.
Changed files
src/MyFitnessTracker/MFTExercise.class.st
@@ -43,42 +43,69 @@
43
43
}
44
44
45
45
{ #category : #exercise }
46
Added:
MFTExercise class >> benchPress [
47
Added:
48
Added:
^ self newWithEnglishName
49
Added:
primaryMuscle: MFTMuscle pectoralisMajor;
50
Added:
secondaryMuscles: {
51
Added:
MFTMuscle tricepsBrachii.
52
Added:
MFTMuscleGroup shoulder };
53
Added:
yourself
54
Added:
]
55
Added:
56
Added:
{ #category : #exercise }
57
Added:
MFTExercise class >> bicepCurl [
58
Added:
59
Added:
^ self newWithEnglishName
60
Added:
primaryMuscle: MFTMuscle bicepsBrachii;
61
Added:
secondaryMuscles: { MFTMuscleGroup forearm };
62
Added:
yourself
63
Added:
]
64
Added:
65
Added:
{ #category : #exercise }
46
66
MFTExercise class >> cableRow [
47
67
48
Removed:
^ self new
49
Removed:
name: 'cable row';
68
Added:
^ self newWithEnglishName
50
69
primaryMuscle: MFTMuscleGroup back;
51
70
secondaryMuscles: MFTMuscle bicepsBrachii;
52
71
yourself
53
72
]
54
73
55
Removed:
{ #category : #'as yet unclassified' }
74
Added:
{ #category : #exercise }
75
Added:
MFTExercise class >> cleanAndJerk [
76
Added:
77
Added:
^ self newWithEnglishName
78
Added:
primaryMuscle: MFTMuscle quadricepsFemoris;
79
Added:
secondaryMuscles: {
80
Added:
MFTMuscleGroup shoulder.
81
Added:
MFTMuscle trapezius };
82
Added:
yourself
83
Added:
]
84
Added:
85
Added:
{ #category : #exercise }
56
86
MFTExercise class >> deadlift [
57
87
58
Removed:
^ self new
59
Removed:
name: 'deadlift';
60
Removed:
primaryMuscle: MFTMuscleGroup leg;
88
Added:
^ self newWithEnglishName
89
Added:
primaryMuscle: MFTMuscle hamstring;
61
90
secondaryMuscles: {
62
Removed:
MFTMuscleGroup abdominal.
63
Removed:
MFTMuscleGroup back };
91
Added:
MFTMuscleGroup back.
92
Added:
MFTMuscleGroup hip };
64
93
yourself
65
94
]
66
95
67
96
{ #category : #exercise }
68
97
MFTExercise class >> declineBenchPress [
69
98
70
Removed:
^ self new
71
Removed:
name: 'decline bench press';
99
Added:
^ self newWithEnglishName
72
100
primaryMuscle: MFTMuscleGroup chest;
73
101
secondaryMuscles: MFTMuscle tricepsBrachii;
74
102
yourself
75
103
]
76
104
77
Removed:
{ #category : #'as yet unclassified' }
105
Added:
{ #category : #exercise }
78
106
MFTExercise class >> gobletSquat [
79
107
80
Removed:
^ self new
81
Removed:
name: 'goblet squat';
108
Added:
^ self newWithEnglishName
82
109
primaryMuscle: MFTMuscleGroup leg;
83
110
secondaryMuscles: {
84
111
MFTMuscleGroup abdominal.
@@ -86,24 +113,46 @@
86
113
yourself
87
114
]
88
115
89
Removed:
{ #category : #'as yet unclassified' }
116
Added:
{ #category : #exercise }
117
Added:
MFTExercise class >> latPulldown [
118
Added:
119
Added:
^ self newWithEnglishName
120
Added:
primaryMuscle: MFTMuscle latissimusDorsi;
121
Added:
secondaryMuscles: {
122
Added:
MFTMuscle bicepsBrachii.
123
Added:
MFTMuscleGroup shoulder };
124
Added:
yourself
125
Added:
]
126
Added:
127
Added:
{ #category : #exercise }
90
128
MFTExercise class >> legCurl [
91
129
92
Removed:
^ self new
93
Removed:
name: 'leg curl';
130
Added:
^ self newWithEnglishName
94
131
primaryMuscle: MFTMuscleGroup leg;
95
132
yourself
96
133
]
97
134
98
Removed:
{ #category : #'as yet unclassified' }
135
Added:
{ #category : #exercise }
99
136
MFTExercise class >> legExtension [
100
137
101
Removed:
^ self new
102
Removed:
name: 'leg extension';
138
Added:
^ self newWithEnglishName
103
139
primaryMuscle: MFTMuscleGroup leg;
104
140
yourself
105
141
]
106
142
143
Added:
{ #category : #'instance creation' }
144
Added:
MFTExercise class >> newWithEnglishName [
145
Added:
"I return a MFTMuscle instance for which latinName is set to the calling method selector, as a space-separated string."
146
Added:
147
Added:
| exerciseNameFromSender |
148
Added:
exerciseNameFromSender := (thisContext sender selector splitCamelCase
149
Added:
collect: [ :word | word asLowercase ])
150
Added:
joinUsing: ' '.
151
Added:
^ self new
152
Added:
englishName: exerciseNameFromSender;
153
Added:
yourself
154
Added:
]
155
Added:
107
156
{ #category : #exercise }
108
157
MFTExercise class >> shoulderPressDumbell [
109
158
@@ -114,15 +163,34 @@
114
163
yourself
115
164
]
116
165
117
Removed:
{ #category : #'as yet unclassified' }
166
Added:
{ #category : #exercise }
167
Added:
MFTExercise class >> snatch [
168
Added:
169
Added:
^ self newWithEnglishName
170
Added:
primaryMuscle: MFTMuscle quadricepsFemoris;
171
Added:
secondaryMuscles: {
172
Added:
MFTMuscleGroup shoulder.
173
Added:
MFTMuscle trapezius };
174
Added:
yourself
175
Added:
]
176
Added:
177
Added:
{ #category : #exercise }
118
178
MFTExercise class >> squat [
119
179
120
Removed:
^ self new
121
Removed:
name: 'squat';
180
Added:
^ self newWithEnglishName
122
181
primaryMuscle: MFTMuscleGroup leg;
123
182
secondaryMuscles: {
124
183
MFTMuscleGroup abdominal.
125
184
MFTMuscleGroup back };
185
Added:
yourself
186
Added:
]
187
Added:
188
Added:
{ #category : #exercise }
189
Added:
MFTExercise class >> tricepExtension [
190
Added:
191
Added:
^ self newWithEnglishName
192
Added:
primaryMuscle: MFTMuscle tricepsBrachii;
193
Added:
secondaryMuscles: { };
126
194
yourself
127
195
]
128
196
src/MyFitnessTracker/MFTExerciseDialog.class.st
@@ -3,6 +3,8 @@
3
3
#superclass : #SBSComponent,
4
4
#instVars : [
5
5
'selectedExercise',
6
Added:
'currentFilter',
7
Added:
'allExercises',
6
8
'addOrEdit',
7
9
'exercise',
8
10
'sets'
@@ -47,11 +49,23 @@
47
49
exercise := aMFTExercise
48
50
]
49
51
52
Added:
{ #category : #rendering }
53
Added:
MFTExerciseDialog >> filteredExercises [
54
Added:
55
Added:
^ currentFilter isEmpty
56
Added:
ifTrue: [ allExercises ]
57
Added:
ifFalse: [
58
Added:
allExercises select: [ :each |
59
Added:
each englishName asLowercase includesSubstring:
60
Added:
currentFilter asLowercase ] ]
61
Added:
]
62
Added:
50
63
{ #category : #initialization }
51
64
MFTExerciseDialog >> initialize [
52
65
53
66
super initialize.
54
67
exercise := MFTExercise new.
68
Added:
allExercises := MFTUtils allExercises.
55
69
sets := OrderedCollection new.
56
70
addOrEdit := #add
57
71
]
@@ -87,14 +101,30 @@
87
101
88
102
html formGroup: [
89
103
html label: 'Exercise'.
90
Removed:
html select formControl
91
Removed:
list: MFTUtils allExercises;
92
Removed:
selected: selectedExercise;
93
Removed:
labels: [ :each | each name ];
94
Removed:
callback: [ :value | selectedExercise := value ] ]
104
Added:
html formGroup: [ "html label: 'Filter exercises'.
105
Added:
html textInput
106
Added:
class: 'form-control';
107
Added:
placeholder: 'Type to search...';
108
Added:
callback: [ :value | currentFilter := value ];
109
Added:
onKeyUp:
110
Added:
(html jQuery this load html: [ :h |
111
Added:
self renderFilteredExercisesOn: h ]) "
112
Added:
html select formControl
113
Added:
list: MFTUtils allExercises;
114
Added:
selected: selectedExercise;
115
Added:
labels: [ :each | each englishName ];
116
Added:
callback: [ :value | selectedExercise := value ] ] ]
95
117
]
96
118
97
119
{ #category : #rendering }
120
Added:
MFTExerciseDialog >> renderFilteredExercisesOn: html [
121
Added:
122
Added:
html unorderedList: [
123
Added:
self filteredExercises do: [ :eachExercise |
124
Added:
html listItem: eachExercise englishName ] ]
125
Added:
]
126
Added:
127
Added:
{ #category : #rendering }
98
128
MFTExerciseDialog >> renderSetsRowsOn: html [
99
129
"TODO: something fishy is going on here. Why are reps and rpe instantiated as nil, but become the empty string after adding additional empty sets?"
100
130
@@ -130,7 +160,7 @@
130
160
html table
131
161
class: 'table table-hover';
132
162
with: [
133
Removed:
exercise sets ifNotEmpty: [ self renderTableHeaderOn: html ].
163
Added:
sets ifNotEmpty: [ self renderTableHeaderOn: html ].
134
164
self renderSetsRowsOn: html.
135
165
self renderAddSetRowOn: html ] ]
136
166
]
@@ -174,9 +204,9 @@
174
204
]
175
205
176
206
{ #category : #accessing }
177
Removed:
MFTExerciseDialog >> selectedExercise: anObject [
207
Added:
MFTExerciseDialog >> selectedExercise: aMFTExercise [
178
208
179
Removed:
selectedExercise := anObject
209
Added:
selectedExercise := aMFTExercise
180
210
]
181
211
182
212
{ #category : #accessing }
src/MyFitnessTracker/MFTSet.class.st
@@ -41,7 +41,7 @@
41
41
{ #category : #accessing }
42
42
MFTSet >> reps [
43
43
44
Removed:
^ reps
44
Added:
^ reps asInteger
45
45
]
46
46
47
47
{ #category : #accessing }
@@ -53,7 +53,7 @@
53
53
{ #category : #accessing }
54
54
MFTSet >> rpe [
55
55
56
Removed:
^ rpe
56
Added:
^ rpe asInteger
57
57
]
58
58
59
59
{ #category : #accessing }
src/MyFitnessTracker/MFTUtils.class.st
@@ -11,7 +11,8 @@
11
11
exercises := self
12
12
allInstancesOfClass: MFTExercise
13
13
matchingProtocol: 'exercise'.
14
Removed:
exercises := exercises sorted: [ :a :b | a name < b name ].
14
Added:
exercises := exercises sorted: [ :a :b |
15
Added:
a englishName < b englishName ].
15
16
^ exercises
16
17
]
17
18
@@ -33,8 +34,8 @@
33
34
| groups |
34
35
groups := self
35
36
allInstancesOfClass: MFTMuscleGroup
36
Removed:
matchingProtocol: 'body part creation'.
37
Removed:
groups := groups sorted: [ :a :b | a name < b name ].
37
Added:
matchingProtocol: 'muscle group'.
38
Added:
groups := groups sorted: [ :a :b | a englishName < b englishName ].
38
39
^ groups
39
40
]
40
41
src/MyFitnessTracker/MFTWorkout.class.st
@@ -11,18 +11,18 @@
11
11
}
12
12
13
13
{ #category : #accessing }
14
Removed:
MFTWorkout class >> primaryMuscle: aMuscle [
14
Added:
MFTWorkout class >> primaryMuscle: aMFTMuscle [
15
15
16
16
^ self new
17
Removed:
primaryMuscle: aMuscle;
17
Added:
primaryMuscle: aMFTMuscle;
18
18
yourself
19
19
]
20
20
21
21
{ #category : #accessing }
22
Removed:
MFTWorkout class >> primaryMuscle: aMuscle1 secondaryMuscles: aMuscle2 [
22
Added:
MFTWorkout class >> primaryMuscle: aMFTMuscle1 secondaryMuscles: aMFTMuscle2 [
23
23
^ self new
24
Removed:
primaryMuscle: aMuscle1;
25
Removed:
secondaryMuscles: aMuscle2;
24
Added:
primaryMuscle: aMFTMuscle1;
25
Added:
secondaryMuscles: aMFTMuscle2;
26
26
yourself
27
27
]
28
28
src/MyFitnessTracker/MFTWorkoutDialog.class.st
@@ -134,7 +134,7 @@
134
134
html tableRow: [
135
135
html tableData: [
136
136
self renderExerciseActionsButtonGroupOn: html at: i ].
137
Removed:
html tableData: exercise name.
137
Added:
html tableData: exercise englishName.
138
138
html tableData: exercise primaryMuscle englishName.
139
139
html tableData: exercise repsBySet asCommaString ] ]
140
140
]