[Pharo] Personal fitness tracker web app.
Workout and its editing component.
Changed files
src/MyFitnessTracker/MFTWorkout.class.st
@@ -1,6 +1,6 @@
1
1
Class {
2
2
#name : #MFTWorkout,
3
Removed:
#superclass : #WAComponent,
3
Added:
#superclass : #SBSComponent,
4
4
#instVars : [
5
5
'date',
6
6
'exercises',
@@ -27,9 +27,9 @@
27
27
]
28
28
29
29
{ #category : #initialization }
30
Removed:
MFTWorkout >> addExercise: anExercise [
30
Added:
MFTWorkout >> addExercise: aMFTExercise [
31
31
32
Removed:
exercises add: anExercise
32
Added:
exercises add: aMFTExercise
33
33
]
34
34
35
35
{ #category : #accessing }
@@ -54,20 +54,53 @@
54
54
exercises := listOfExercises
55
55
]
56
56
57
Added:
{ #category : #'as yet unclassified' }
58
Added:
MFTWorkout >> guessPrimaryMuscle [
59
Added:
"TODO: guess the workout's primary muscle based on the most represented primary muscle in the workout's exercises."
60
Added:
61
Added:
| primaryMuscles groupedByMuscle mostFrequentMuscle |
62
Added:
primaryMuscles := exercises collect: [ :each | each primaryMuscle ].
63
Added:
groupedByMuscle := primaryMuscles groupBy: [ :each | each ].
64
Added:
mostFrequentMuscle := groupedByMuscle keys max: [ :muscle |
65
Added:
(groupedByMuscle at: muscle) size ]
66
Added:
]
67
Added:
57
68
{ #category : #initialization }
58
69
MFTWorkout >> initialize [
59
70
60
71
super initialize.
61
Removed:
self exercises: OrderedCollection new.
62
Removed:
self date: Date today.
63
Removed:
self primaryMuscle: MFTMuscle new.
64
Removed:
self secondaryMuscles: OrderedCollection new
72
Added:
exercises := OrderedCollection new.
73
Added:
date := Date today.
74
Added:
primaryMuscle := MFTMuscle new.
75
Added:
secondaryMuscles := OrderedCollection new
65
76
]
66
77
78
Added:
{ #category : #rendering }
79
Added:
MFTWorkout >> placeholder [
80
Added:
"Delete me"
81
Added:
82
Added:
^ self
83
Added:
primaryMuscle: MFTMuscle chest;
84
Added:
exercises: {
85
Added:
(MFTExercise cableRow sets: {
86
Added:
(MFTSet reps: 8 rpe: 6).
87
Added:
(MFTSet reps: 6 rpe: 8).
88
Added:
(MFTSet reps: 6 rpe: 10).
89
Added:
(MFTSet reps: 15 rpe: 4) }).
90
Added:
(MFTExercise shoulderPressDumbell sets: {
91
Added:
(MFTSet reps: 10 rpe: 6).
92
Added:
(MFTSet reps: 6 rpe: 8).
93
Added:
(MFTSet reps: 6 rpe: 10) }).
94
Added:
(MFTExercise declineBenchPress sets: {
95
Added:
(MFTSet reps: 5 rpe: 6).
96
Added:
(MFTSet reps: 6 rpe: 8).
97
Added:
(MFTSet reps: 8 rpe: 10) }) }
98
Added:
]
99
Added:
67
100
{ #category : #accessing }
68
101
MFTWorkout >> primaryMuscle [
69
102
70
Removed:
^ primaryMuscle name
103
Added:
^ primaryMuscle
71
104
]
72
105
73
106
{ #category : #accessing }
@@ -86,40 +119,43 @@
86
119
87
120
| grandTotal |
88
121
grandTotal := 0.
89
Removed:
html tbsButton
90
Removed:
callback: [
91
Removed:
Transcript
92
Removed:
show: 'Dongles';
93
Removed:
cr ];
122
Added:
html table
123
Added:
class: 'table table-striped';
94
124
with: [
95
Removed:
html text: self date ddmmyyyy.
96
Removed:
primaryMuscle ifNotNil: [ html text: ' -- ' , primaryMuscle name ] ].
97
Removed:
html break.
98
Removed:
html tbsTable with: [
99
Removed:
html tableHead: [
100
Removed:
html
101
Removed:
tableHeading: 'Exercise';
102
Removed:
tableHeading: 'Reps' ].
103
Removed:
exercises do: [ :exercise |
104
Removed:
html tableRow: [
105
Removed:
html tableData: [
106
Removed:
html
107
Removed:
text: exercise name;
108
Removed:
text: ': '.
109
Removed:
exercise sets ifNotNil: [
110
Removed:
html text: (self repsCountList: exercise) asCommaString.
111
Removed:
html tableData: (self repsCountList: exercise) sum.
112
Removed:
grandTotal := grandTotal + (self repsCountList: exercise) sum ] ] ] ].
113
Removed:
html tableFoot: [
114
Removed:
html
115
Removed:
tableData: 'Total';
116
Removed:
tableData: grandTotal ] ]
125
Added:
self renderTableHeaderOn: html.
126
Added:
exercises do: [ :exercise |
127
Added:
html tableRow: [
128
Added:
html tableData: [
129
Added:
html
130
Added:
text: exercise name;
131
Added:
text: ': '.
132
Added:
exercise sets
133
Added:
ifNotEmpty: [
134
Added:
html text: exercise repsBySet asCommaString.
135
Added:
html tableData: exercise repsBySet sum.
136
Added:
grandTotal := grandTotal + exercise repsBySet sum ]
137
Added:
ifEmpty: [
138
Added:
html text: 0.
139
Added:
html tableData: 0 ] ] ] ].
140
Added:
self renderTableFooterTotal: grandTotal on: html ]
117
141
]
118
142
119
143
{ #category : #rendering }
120
Removed:
MFTWorkout >> repsCountList: exercise [
144
Added:
MFTWorkout >> renderTableFooterTotal: grandTotal on: html [
121
145
122
Removed:
^ exercise sets collect: [ :set | set reps ]
146
Added:
^ html tableFoot: [
147
Added:
html
148
Added:
tableData: 'Total';
149
Added:
tableData: grandTotal ]
150
Added:
]
151
Added:
152
Added:
{ #category : #rendering }
153
Added:
MFTWorkout >> renderTableHeaderOn: html [
154
Added:
155
Added:
html tableHead: [
156
Added:
html
157
Added:
tableHeading: 'Exercise';
158
Added:
tableHeading: 'Reps' ]
123
159
]
124
160
125
161
{ #category : #accessing }
src/MyFitnessTracker/MFTWorkoutDialog.class.st
@@ -8,6 +8,15 @@
8
8
#category : #'MyFitnessTracker-Dialogs'
9
9
}
10
10
11
Added:
{ #category : #actions }
12
Added:
MFTWorkoutDialog class >> edit: aMFTWorkout [
13
Added:
14
Added:
^ self new
15
Added:
workout: aMFTWorkout;
16
Added:
addOrEdit: #edit;
17
Added:
yourself
18
Added:
]
19
Added:
11
20
{ #category : #adding }
12
21
MFTWorkoutDialog >> addExercise [
13
22