[Pharo] Personal fitness tracker web app.
First commit.
Changed files
- .project
- src/.properties
- src/MyFitnessTracker-Tests/MFTExerciseTest.class.st
- src/MyFitnessTracker-Tests/MFTWeightTest.class.st
- src/MyFitnessTracker-Tests/MFTWorkoutTest.class.st
- src/MyFitnessTracker-Tests/package.st
- src/MyFitnessTracker/MFTExercise.class.st
- src/MyFitnessTracker/MFTHeaderComponent.class.st
- src/MyFitnessTracker/MFTMainTabsComponent.class.st
- src/MyFitnessTracker/MFTMuscle.class.st
- src/MyFitnessTracker/MFTRootComponent.class.st
- src/MyFitnessTracker/MFTScreenComponent.class.st
- src/MyFitnessTracker/MFTSet.class.st
- src/MyFitnessTracker/MFTWeight.class.st
- src/MyFitnessTracker/MFTWeightsListComponent.class.st
- src/MyFitnessTracker/MFTWorkout.class.st
- src/MyFitnessTracker/MFTWorkoutsListComponent.class.st
- src/MyFitnessTracker/package.st
.project
@@ -0,0 +1,3 @@
1
Added:
{
2
Added:
'srcDirectory' : 'src'
3
Added:
}
src/.properties
@@ -0,0 +1,3 @@
1
Added:
{
2
Added:
#format : #tonel
3
Added:
}
src/MyFitnessTracker-Tests/MFTExerciseTest.class.st
@@ -0,0 +1,13 @@
1
Added:
Class {
2
Added:
#name : #MFTExerciseTest,
3
Added:
#superclass : #TestCase,
4
Added:
#category : #'MyFitnessTracker-Tests'
5
Added:
}
6
Added:
7
Added:
{ #category : #tests }
8
Added:
MFTExerciseTest >> testExerciseIsCreatedCorrectly [
9
Added:
| exercise |
10
Added:
exercise := MFTExercise
11
Added:
name: 'bicep curl'.
12
Added:
self assert: exercise name equals: 'bicep curl'.
13
Added:
]
src/MyFitnessTracker-Tests/MFTWeightTest.class.st
@@ -0,0 +1,23 @@
1
Added:
Class {
2
Added:
#name : #MFTWeightTest,
3
Added:
#superclass : #TestCase,
4
Added:
#category : #'MyFitnessTracker-Tests'
5
Added:
}
6
Added:
7
Added:
{ #category : #tests }
8
Added:
MFTWeightTest >> testWeightIsCreatedCorrectlyBirthday [
9
Added:
| weight |
10
Added:
weight := MFTWeight date: (Date fromString: '06/14/1996').
11
Added:
weight value: 90.5.
12
Added:
self assert: weight date equals: (Date fromString: '06/14/1996').
13
Added:
self assert: weight value equals: 90.5.
14
Added:
]
15
Added:
16
Added:
{ #category : #tests }
17
Added:
MFTWeightTest >> testWeightIsCreatedCorrectlyToday [
18
Added:
| weight |
19
Added:
weight := MFTWeight new.
20
Added:
weight value: 90.0.
21
Added:
self assert: weight date equals: Date today.
22
Added:
self assert: weight value equals: 90.0.
23
Added:
]
src/MyFitnessTracker-Tests/MFTWorkoutTest.class.st
@@ -0,0 +1,82 @@
1
Added:
Class {
2
Added:
#name : #MFTWorkoutTest,
3
Added:
#superclass : #TestCase,
4
Added:
#category : #'MyFitnessTracker-Tests'
5
Added:
}
6
Added:
7
Added:
{ #category : #tests }
8
Added:
MFTWorkoutTest >> testWorkoutHasExercises [
9
Added:
"This was my workout today, 11 September 2023."
10
Added:
| workout |
11
Added:
workout := MFTWorkout new
12
Added:
addExercise:
13
Added:
(MFTExercise cableRow sets:
14
Added:
{ MFTSet reps: 8 rpe: 6.
15
Added:
MFTSet reps: 6 rpe: 8.
16
Added:
MFTSet reps: 6 rpe: 10.
17
Added:
MFTSet reps: 15 rpe: 4. });
18
Added:
addExercise:
19
Added:
(MFTExercise name: 'hammer curl' sets:
20
Added:
{ MFTSet reps: 8 rpe: 5.
21
Added:
MFTSet reps: 8 rpe: 8.
22
Added:
MFTSet reps: 6 rpe: 9. });
23
Added:
addExercise:
24
Added:
(MFTExercise name: 'barbell row' sets:
25
Added:
{ MFTSet reps: 8 rpe: 5.
26
Added:
MFTSet reps: 6 rpe: 8.
27
Added:
MFTSet reps: 6 rpe: 10. });
28
Added:
addExercise:
29
Added:
(MFTExercise name: 'lat pulldown' sets:
30
Added:
{ MFTSet reps: 8 rpe: 6.
31
Added:
MFTSet reps: 6 rpe: 8.
32
Added:
MFTSet reps: 6 rpe: 10.
33
Added:
MFTSet reps: 16 rpe: 4. });
34
Added:
addExercise:
35
Added:
(MFTExercise name: 'reverse grip bicep curl' sets:
36
Added:
{ MFTSet reps: 8 rpe: 6.
37
Added:
MFTSet reps: 6 rpe: 8.
38
Added:
MFTSet reps: 6 rpe: 9. });
39
Added:
addExercise:
40
Added:
(MFTExercise name: 'seated rear delt fly' sets:
41
Added:
{ MFTSet reps: 12 rpe: 6.
42
Added:
MFTSet reps: 12 rpe: 6.
43
Added:
MFTSet reps: 12 rpe: 6. }).
44
Added:
self assert: workout exercises size equals: 6.
45
Added:
self assert: (workout exercises at: 1) name equals: 'cable row'.
46
Added:
self assert: (workout exercises at: 2) name equals: 'hammer curl'.
47
Added:
self assert: (workout exercises at: 5) sets first reps equals: 8.
48
Added:
self assert: (workout exercises at: 6) sets first rpe equals: 6.
49
Added:
]
50
Added:
51
Added:
{ #category : #tests }
52
Added:
MFTWorkoutTest >> testWorkoutIsCreatedCorrectly [
53
Added:
| workout |
54
Added:
workout := MFTWorkout new.
55
Added:
self assert: workout date equals: Date today.
56
Added:
]
57
Added:
58
Added:
{ #category : #tests }
59
Added:
MFTWorkoutTest >> testWorkoutWithPrimaryIsCreatedCorrectly [
60
Added:
61
Added:
| workout |
62
Added:
workout := MFTWorkout primaryMuscle: MFTMuscle back.
63
Added:
self
64
Added:
assert: workout primaryMuscle equals: 'back';
65
Added:
assert: workout date equals: Date today
66
Added:
]
67
Added:
68
Added:
{ #category : #tests }
69
Added:
MFTWorkoutTest >> testWorkoutWithPrimarySecondaryIsCreatedCorrectly [
70
Added:
71
Added:
| workout |
72
Added:
workout := MFTWorkout
73
Added:
primaryMuscle: MFTMuscle back
74
Added:
secondaryMuscles: {
75
Added:
MFTMuscle biceps.
76
Added:
MFTMuscle chest }.
77
Added:
self
78
Added:
assert: workout primaryMuscle equals: 'back';
79
Added:
assert: workout secondaryMuscles first name equals: 'biceps';
80
Added:
assert: (workout secondaryMuscles at: 2) name equals: 'chest';
81
Added:
assert: workout date equals: Date today
82
Added:
]
src/MyFitnessTracker-Tests/package.st
@@ -0,0 +1,1 @@
1
Added:
Package { #name : #'MyFitnessTracker-Tests' }
src/MyFitnessTracker/MFTExercise.class.st
@@ -0,0 +1,136 @@
1
Added:
"
2
Added:
I represent an exercise performed by a user.
3
Added:
4
Added:
I can be either:
5
Added:
1. instantiated as a pre-existing exercise,
6
Added:
2. used to create a new custom exercise,
7
Added:
3. used to track an amount of sets performed by the user.
8
Added:
I know about primary and secondary muscle groups I target...
9
Added:
10
Added:
For the Responsibility part: Three sentences about my main responsibilities - what I do, what I know.
11
Added:
12
Added:
For the Collaborators Part: State my main collaborators and one line about how I interact with them.
13
Added:
14
Added:
Public API and Key Messages
15
Added:
16
Added:
- message one
17
Added:
- message two
18
Added:
- (for bonus points) how to create instances.
19
Added:
20
Added:
One simple example is simply gorgeous.
21
Added:
22
Added:
Internal Representation and Key Implementation Points.
23
Added:
24
Added:
Instance Variables
25
Added:
name: <Object>
26
Added:
primaryGroup: <Object>
27
Added:
secondaryGroup: <Object>
28
Added:
sets: <Object>
29
Added:
30
Added:
31
Added:
Implementation Points
32
Added:
"
33
Added:
Class {
34
Added:
#name : #MFTExercise,
35
Added:
#superclass : #Object,
36
Added:
#instVars : [
37
Added:
'name',
38
Added:
'sets',
39
Added:
'primaryGroup',
40
Added:
'secondaryGroup'
41
Added:
],
42
Added:
#category : #MyFitnessTracker
43
Added:
}
44
Added:
45
Added:
{ #category : #accessing }
46
Added:
MFTExercise class >> cableRow [
47
Added:
48
Added:
^ self new
49
Added:
name: 'cable row';
50
Added:
primaryMuscle: MFTMuscle back;
51
Added:
secondaryMuscles: MFTMuscle biceps;
52
Added:
yourself
53
Added:
]
54
Added:
55
Added:
{ #category : #accessing }
56
Added:
MFTExercise class >> declineBenchPress [
57
Added:
58
Added:
^ self new
59
Added:
name: 'decline bench press';
60
Added:
primaryMuscle: MFTMuscle pectoral;
61
Added:
secondaryMuscles: MFTMuscle triceps;
62
Added:
yourself
63
Added:
]
64
Added:
65
Added:
{ #category : #accessing }
66
Added:
MFTExercise class >> name: aString [
67
Added:
^ self new
68
Added:
name: aString;
69
Added:
yourself
70
Added:
]
71
Added:
72
Added:
{ #category : #accessing }
73
Added:
MFTExercise class >> name: aString sets: aSetList [
74
Added:
^ self new
75
Added:
name: aString;
76
Added:
sets: aSetList;
77
Added:
yourself
78
Added:
]
79
Added:
80
Added:
{ #category : #accessing }
81
Added:
MFTExercise class >> shoulderPressDumbell [
82
Added:
83
Added:
^ self new
84
Added:
name: 'shoulder press (dumbell)';
85
Added:
primaryMuscle: MFTMuscle deltoidAnterior;
86
Added:
secondaryMuscles: { MFTMuscle deltoidLateral. MFTMuscle deltoidPosterior };
87
Added:
yourself
88
Added:
]
89
Added:
90
Added:
{ #category : #accessing }
91
Added:
MFTExercise >> name [
92
Added:
93
Added:
^ name
94
Added:
]
95
Added:
96
Added:
{ #category : #accessing }
97
Added:
MFTExercise >> name: aString [
98
Added:
99
Added:
name := aString
100
Added:
]
101
Added:
102
Added:
{ #category : #accessing }
103
Added:
MFTExercise >> primaryMuscle [
104
Added:
105
Added:
^ primaryGroup
106
Added:
]
107
Added:
108
Added:
{ #category : #accessing }
109
Added:
MFTExercise >> primaryMuscle: anObject [
110
Added:
111
Added:
primaryGroup := anObject
112
Added:
]
113
Added:
114
Added:
{ #category : #accessing }
115
Added:
MFTExercise >> secondaryMuscles [
116
Added:
117
Added:
^ secondaryGroup
118
Added:
]
119
Added:
120
Added:
{ #category : #accessing }
121
Added:
MFTExercise >> secondaryMuscles: anObject [
122
Added:
123
Added:
secondaryGroup := anObject
124
Added:
]
125
Added:
126
Added:
{ #category : #accessing }
127
Added:
MFTExercise >> sets [
128
Added:
129
Added:
^ sets
130
Added:
]
131
Added:
132
Added:
{ #category : #accessing }
133
Added:
MFTExercise >> sets: anObject [
134
Added:
135
Added:
sets := anObject
136
Added:
]
src/MyFitnessTracker/MFTHeaderComponent.class.st
@@ -0,0 +1,14 @@
1
Added:
Class {
2
Added:
#name : #MFTHeaderComponent,
3
Added:
#superclass : #WAComponent,
4
Added:
#category : #'MyFitnessTracker-Components'
5
Added:
}
6
Added:
7
Added:
{ #category : #rendering }
8
Added:
MFTHeaderComponent >> renderContentOn: html [
9
Added:
10
Added:
html tbsNavbar beDefault with: [
11
Added:
html tbsNavbarBrand
12
Added:
url: '#';
13
Added:
with: 'MyFitnessTracker' ]
14
Added:
]
src/MyFitnessTracker/MFTMainTabsComponent.class.st
@@ -0,0 +1,48 @@
1
Added:
Class {
2
Added:
#name : #MFTMainTabsComponent,
3
Added:
#superclass : #WAComponent,
4
Added:
#instVars : [
5
Added:
'tab1',
6
Added:
'tab2',
7
Added:
'tab3',
8
Added:
'tab4',
9
Added:
'activeTab'
10
Added:
],
11
Added:
#category : #'MyFitnessTracker-Components'
12
Added:
}
13
Added:
14
Added:
{ #category : #hooks }
15
Added:
MFTMainTabsComponent >> children [
16
Added:
17
Added:
^ {
18
Added:
tab1.
19
Added:
tab2 }
20
Added:
]
21
Added:
22
Added:
{ #category : #initialization }
23
Added:
MFTMainTabsComponent >> initialize [
24
Added:
25
Added:
super initialize.
26
Added:
tab1 := MFTWorkoutsListComponent placeholder.
27
Added:
tab2 := MFTWeightsListComponent placeholder
28
Added:
]
29
Added:
30
Added:
{ #category : #rendering }
31
Added:
MFTMainTabsComponent >> renderContentOn: html [
32
Added:
33
Added:
html div
34
Added:
class: 'tabs';
35
Added:
with: [
36
Added:
self
37
Added:
renderTab: tab1 on: html;
38
Added:
renderTab: tab2 on: html ].
39
Added:
html text: 'This is working, finally!'
40
Added:
]
41
Added:
42
Added:
{ #category : #rendering }
43
Added:
MFTMainTabsComponent >> renderTab: aTabComponent on: html [
44
Added:
45
Added:
html div
46
Added:
class: 'tab';
47
Added:
with: [ html render: aTabComponent ]
48
Added:
]
src/MyFitnessTracker/MFTMuscle.class.st
@@ -0,0 +1,87 @@
1
Added:
Class {
2
Added:
#name : #MFTMuscle,
3
Added:
#superclass : #Object,
4
Added:
#instVars : [
5
Added:
'name'
6
Added:
],
7
Added:
#category : #MyFitnessTracker
8
Added:
}
9
Added:
10
Added:
{ #category : #'as yet unclassified' }
11
Added:
MFTMuscle class >> back [
12
Added:
13
Added:
^ self new
14
Added:
name: 'back';
15
Added:
yourself
16
Added:
]
17
Added:
18
Added:
{ #category : #'as yet unclassified' }
19
Added:
MFTMuscle class >> biceps [
20
Added:
21
Added:
^ self new
22
Added:
name: 'biceps';
23
Added:
yourself
24
Added:
]
25
Added:
26
Added:
{ #category : #'as yet unclassified' }
27
Added:
MFTMuscle class >> chest [
28
Added:
"comment stating purpose of class-side method"
29
Added:
30
Added:
"scope: class-variables & class-instance-variables"
31
Added:
32
Added:
^ self new
33
Added:
name: 'chest';
34
Added:
yourself
35
Added:
]
36
Added:
37
Added:
{ #category : #'as yet unclassified' }
38
Added:
MFTMuscle class >> deltoidAnterior [
39
Added:
40
Added:
^ self new
41
Added:
name: 'anterior deltoid';
42
Added:
yourself
43
Added:
]
44
Added:
45
Added:
{ #category : #'as yet unclassified' }
46
Added:
MFTMuscle class >> deltoidLateral [
47
Added:
48
Added:
^ self new
49
Added:
name: 'lateral deltoid';
50
Added:
yourself
51
Added:
]
52
Added:
53
Added:
{ #category : #'as yet unclassified' }
54
Added:
MFTMuscle class >> deltoidPosterior [
55
Added:
56
Added:
^ self new
57
Added:
name: 'posterior deltoid';
58
Added:
yourself
59
Added:
]
60
Added:
61
Added:
{ #category : #'as yet unclassified' }
62
Added:
MFTMuscle class >> pectoral [
63
Added:
64
Added:
^ self new
65
Added:
name: 'pectoral';
66
Added:
yourself
67
Added:
]
68
Added:
69
Added:
{ #category : #'as yet unclassified' }
70
Added:
MFTMuscle class >> triceps [
71
Added:
72
Added:
^ self new
73
Added:
name: 'triceps';
74
Added:
yourself
75
Added:
]
76
Added:
77
Added:
{ #category : #accessing }
78
Added:
MFTMuscle >> name [
79
Added:
80
Added:
^ name asString
81
Added:
]
82
Added:
83
Added:
{ #category : #accessing }
84
Added:
MFTMuscle >> name: aString [
85
Added:
86
Added:
name := aString
87
Added:
]
src/MyFitnessTracker/MFTRootComponent.class.st
@@ -0,0 +1,57 @@
1
Added:
Class {
2
Added:
#name : #MFTRootComponent,
3
Added:
#superclass : #WAComponent,
4
Added:
#instVars : [
5
Added:
'main'
6
Added:
],
7
Added:
#category : #'MyFitnessTracker-Components'
8
Added:
}
9
Added:
10
Added:
{ #category : #initialization }
11
Added:
MFTRootComponent class >> canBeRoot [
12
Added:
^ true
13
Added:
]
14
Added:
15
Added:
{ #category : #'class initialization' }
16
Added:
MFTRootComponent class >> initialize [
17
Added:
"self initialize"
18
Added:
| app |
19
Added:
app := WAAdmin register: self asApplicationAt: 'MyFitnessTracker'.
20
Added:
app
21
Added:
addLibrary: JQDeploymentLibrary;
22
Added:
addLibrary: JQUiDeploymentLibrary;
23
Added:
addLibrary: TBSDeploymentLibrary
24
Added:
]
25
Added:
26
Added:
{ #category : #rendering }
27
Added:
MFTRootComponent >> children [
28
Added:
29
Added:
^ { main }
30
Added:
]
31
Added:
32
Added:
{ #category : #initialization }
33
Added:
MFTRootComponent >> initialize [
34
Added:
35
Added:
super initialize.
36
Added:
main := MFTScreenComponent new
37
Added:
]
38
Added:
39
Added:
{ #category : #initialization }
40
Added:
MFTRootComponent >> main: aComponent [
41
Added:
42
Added:
main := aComponent
43
Added:
]
44
Added:
45
Added:
{ #category : #rendering }
46
Added:
MFTRootComponent >> renderContentOn: html [
47
Added:
48
Added:
html render: main
49
Added:
]
50
Added:
51
Added:
{ #category : #updating }
52
Added:
MFTRootComponent >> updateRoot: anHtmlRoot [
53
Added:
54
Added:
super updateRoot: anHtmlRoot.
55
Added:
anHtmlRoot beHtml5.
56
Added:
anHtmlRoot title: 'My Fitness Tracker'
57
Added:
]
src/MyFitnessTracker/MFTScreenComponent.class.st
@@ -0,0 +1,32 @@
1
Added:
Class {
2
Added:
#name : #MFTScreenComponent,
3
Added:
#superclass : #WAComponent,
4
Added:
#instVars : [
5
Added:
'header',
6
Added:
'mainTabs'
7
Added:
],
8
Added:
#category : #'MyFitnessTracker-Components'
9
Added:
}
10
Added:
11
Added:
{ #category : #hooks }
12
Added:
MFTScreenComponent >> children [
13
Added:
14
Added:
^ {
15
Added:
header.
16
Added:
mainTabs }
17
Added:
]
18
Added:
19
Added:
{ #category : #initialization }
20
Added:
MFTScreenComponent >> initialize [
21
Added:
22
Added:
super initialize.
23
Added:
header := MFTHeaderComponent new.
24
Added:
"mainTabs := MFTMainTabsComponent new"
25
Added:
]
26
Added:
27
Added:
{ #category : #rendering }
28
Added:
MFTScreenComponent >> renderContentOn: html [
29
Added:
30
Added:
html render: header.
31
Added:
"html render: mainTabs"
32
Added:
]
src/MyFitnessTracker/MFTSet.class.st
@@ -0,0 +1,48 @@
1
Added:
"
2
Added:
I represent a single set of an exercise.
3
Added:
4
Added:
I am defined by the number of reps performed during the exercise, as well as the Rate of Perceived Exertion.
5
Added:
"
6
Added:
Class {
7
Added:
#name : #MFTSet,
8
Added:
#superclass : #Object,
9
Added:
#instVars : [
10
Added:
'reps',
11
Added:
'rpe'
12
Added:
],
13
Added:
#category : #MyFitnessTracker
14
Added:
}
15
Added:
16
Added:
{ #category : #'as yet unclassified' }
17
Added:
MFTSet class >> reps: aRepCount rpe: aRPE [
18
Added:
"Create an exercise set featuring a rep count, and a Rate of Perceived Exhaustion."
19
Added:
20
Added:
^ self new
21
Added:
reps: aRepCount;
22
Added:
rpe: aRPE;
23
Added:
yourself
24
Added:
]
25
Added:
26
Added:
{ #category : #accessing }
27
Added:
MFTSet >> reps [
28
Added:
29
Added:
^ reps
30
Added:
]
31
Added:
32
Added:
{ #category : #accessing }
33
Added:
MFTSet >> reps: anInteger [
34
Added:
35
Added:
reps := anInteger
36
Added:
]
37
Added:
38
Added:
{ #category : #accessing }
39
Added:
MFTSet >> rpe [
40
Added:
41
Added:
^ rpe
42
Added:
]
43
Added:
44
Added:
{ #category : #accessing }
45
Added:
MFTSet >> rpe: anInteger [
46
Added:
47
Added:
rpe := anInteger
48
Added:
]
src/MyFitnessTracker/MFTWeight.class.st
@@ -0,0 +1,64 @@
1
Added:
Class {
2
Added:
#name : #MFTWeight,
3
Added:
#superclass : #Object,
4
Added:
#instVars : [
5
Added:
'date',
6
Added:
'value'
7
Added:
],
8
Added:
#category : #MyFitnessTracker
9
Added:
}
10
Added:
11
Added:
{ #category : #accessing }
12
Added:
MFTWeight class >> date: aDate [
13
Added:
14
Added:
^ self new
15
Added:
date: aDate;
16
Added:
yourself
17
Added:
]
18
Added:
19
Added:
{ #category : #accessing }
20
Added:
MFTWeight class >> date: aDate value: aValue [
21
Added:
22
Added:
^ self new
23
Added:
date: aDate;
24
Added:
value: aValue;
25
Added:
yourself
26
Added:
]
27
Added:
28
Added:
{ #category : #accessing }
29
Added:
MFTWeight class >> value: aValue [
30
Added:
31
Added:
^ self new
32
Added:
value: aValue;
33
Added:
yourself
34
Added:
]
35
Added:
36
Added:
{ #category : #accessing }
37
Added:
MFTWeight >> date [
38
Added:
39
Added:
^ date
40
Added:
]
41
Added:
42
Added:
{ #category : #accessing }
43
Added:
MFTWeight >> date: aDate [
44
Added:
45
Added:
date := aDate
46
Added:
]
47
Added:
48
Added:
{ #category : #initialization }
49
Added:
MFTWeight >> initialize [
50
Added:
super initialize.
51
Added:
self date: Date today.
52
Added:
]
53
Added:
54
Added:
{ #category : #evaluating }
55
Added:
MFTWeight >> value [
56
Added:
57
Added:
^ value
58
Added:
]
59
Added:
60
Added:
{ #category : #accessing }
61
Added:
MFTWeight >> value: aValue [
62
Added:
63
Added:
value := aValue
64
Added:
]
src/MyFitnessTracker/MFTWeightsListComponent.class.st
@@ -0,0 +1,50 @@
1
Added:
Class {
2
Added:
#name : #MFTWeightsListComponent,
3
Added:
#superclass : #MFTScreenComponent,
4
Added:
#instVars : [
5
Added:
'weights'
6
Added:
],
7
Added:
#category : #'MyFitnessTracker-Components'
8
Added:
}
9
Added:
10
Added:
{ #category : #rendering }
11
Added:
MFTWeightsListComponent class >> placeholder [
12
Added:
13
Added:
^ self new
14
Added:
weights: {
15
Added:
(MFTWeight value: 90).
16
Added:
(MFTWeight value: 100).
17
Added:
(MFTWeight value: 102).
18
Added:
(MFTWeight date: (Date fromString: '01/01/2024') value: 105) };
19
Added:
yourself
20
Added:
]
21
Added:
22
Added:
{ #category : #initialization }
23
Added:
MFTWeightsListComponent >> initialize [
24
Added:
25
Added:
super initialize.
26
Added:
weights := OrderedCollection new
27
Added:
]
28
Added:
29
Added:
{ #category : #rendering }
30
Added:
MFTWeightsListComponent >> renderContentOn: html [
31
Added:
32
Added:
html tbsContainer
33
Added:
class: 'weights-list';
34
Added:
with: [
35
Added:
html heading
36
Added:
level: 2;
37
Added:
with: 'Weight'.
38
Added:
html tbsTable: [
39
Added:
weights do: [ :each |
40
Added:
html tableRow: [
41
Added:
html
42
Added:
tableData: each date ddmmyyyy;
43
Added:
tableData: each value ] ] ] ]
44
Added:
]
45
Added:
46
Added:
{ #category : #accessing }
47
Added:
MFTWeightsListComponent >> weights: aWeight [
48
Added:
49
Added:
weights := aWeight
50
Added:
]
src/MyFitnessTracker/MFTWorkout.class.st
@@ -0,0 +1,136 @@
1
Added:
Class {
2
Added:
#name : #MFTWorkout,
3
Added:
#superclass : #WAComponent,
4
Added:
#instVars : [
5
Added:
'date',
6
Added:
'exercises',
7
Added:
'primaryMuscle',
8
Added:
'secondaryMuscles'
9
Added:
],
10
Added:
#category : #'MyFitnessTracker-Components'
11
Added:
}
12
Added:
13
Added:
{ #category : #accessing }
14
Added:
MFTWorkout class >> primaryMuscle: aMuscle [
15
Added:
16
Added:
^ self new
17
Added:
primaryMuscle: aMuscle;
18
Added:
yourself
19
Added:
]
20
Added:
21
Added:
{ #category : #accessing }
22
Added:
MFTWorkout class >> primaryMuscle: aMuscle1 secondaryMuscles: aMuscle2 [
23
Added:
^ self new
24
Added:
primaryMuscle: aMuscle1;
25
Added:
secondaryMuscles: aMuscle2;
26
Added:
yourself
27
Added:
]
28
Added:
29
Added:
{ #category : #initialization }
30
Added:
MFTWorkout >> addExercise: anExercise [
31
Added:
32
Added:
exercises add: anExercise
33
Added:
]
34
Added:
35
Added:
{ #category : #accessing }
36
Added:
MFTWorkout >> date [
37
Added:
^ date
38
Added:
]
39
Added:
40
Added:
{ #category : #accessing }
41
Added:
MFTWorkout >> date: aDate [
42
Added:
date := aDate
43
Added:
]
44
Added:
45
Added:
{ #category : #accessing }
46
Added:
MFTWorkout >> exercises [
47
Added:
48
Added:
^ exercises
49
Added:
]
50
Added:
51
Added:
{ #category : #accessing }
52
Added:
MFTWorkout >> exercises: listOfExercises [
53
Added:
54
Added:
exercises := listOfExercises
55
Added:
]
56
Added:
57
Added:
{ #category : #initialization }
58
Added:
MFTWorkout >> initialize [
59
Added:
60
Added:
super initialize.
61
Added:
self exercises: OrderedCollection new.
62
Added:
self date: Date today.
63
Added:
self primaryMuscle: MFTMuscle new.
64
Added:
self secondaryMuscles: OrderedCollection new
65
Added:
]
66
Added:
67
Added:
{ #category : #accessing }
68
Added:
MFTWorkout >> primaryMuscle [
69
Added:
70
Added:
^ primaryMuscle name
71
Added:
]
72
Added:
73
Added:
{ #category : #accessing }
74
Added:
MFTWorkout >> primaryMuscle: aMuscle [
75
Added:
76
Added:
primaryMuscle := aMuscle
77
Added:
]
78
Added:
79
Added:
{ #category : #initialization }
80
Added:
MFTWorkout >> removeExercise: anExercise [
81
Added:
exercises remove: anExercise
82
Added:
]
83
Added:
84
Added:
{ #category : #rendering }
85
Added:
MFTWorkout >> renderContentOn: html [
86
Added:
87
Added:
| grandTotal |
88
Added:
grandTotal := 0.
89
Added:
html tbsButton
90
Added:
callback: [
91
Added:
Transcript
92
Added:
show: 'Dongles';
93
Added:
cr ];
94
Added:
with: [
95
Added:
html text: self date ddmmyyyy.
96
Added:
primaryMuscle ifNotNil: [ html text: ' -- ' , primaryMuscle name ] ].
97
Added:
html break.
98
Added:
html tbsTable with: [
99
Added:
html tableHead: [
100
Added:
html
101
Added:
tableHeading: 'Exercise';
102
Added:
tableHeading: 'Reps' ].
103
Added:
exercises do: [ :exercise |
104
Added:
html tableRow: [
105
Added:
html tableData: [
106
Added:
html
107
Added:
text: exercise name;
108
Added:
text: ': '.
109
Added:
exercise sets ifNotNil: [
110
Added:
html text: (self repsCountList: exercise) asCommaString.
111
Added:
html tableData: (self repsCountList: exercise) sum.
112
Added:
grandTotal := grandTotal + (self repsCountList: exercise) sum ] ] ] ].
113
Added:
html tableFoot: [
114
Added:
html
115
Added:
tableData: 'Total';
116
Added:
tableData: grandTotal ] ]
117
Added:
]
118
Added:
119
Added:
{ #category : #rendering }
120
Added:
MFTWorkout >> repsCountList: exercise [
121
Added:
122
Added:
^ exercise sets collect: [ :set | set reps ]
123
Added:
]
124
Added:
125
Added:
{ #category : #accessing }
126
Added:
MFTWorkout >> secondaryMuscles [
127
Added:
"TODO: "
128
Added:
129
Added:
^ secondaryMuscles do: [ :each | each name ]
130
Added:
]
131
Added:
132
Added:
{ #category : #accessing }
133
Added:
MFTWorkout >> secondaryMuscles: aMuscleArray [
134
Added:
135
Added:
secondaryMuscles := aMuscleArray
136
Added:
]
src/MyFitnessTracker/MFTWorkoutsListComponent.class.st
@@ -0,0 +1,109 @@
1
Added:
"
2
Added:
I represent the list of user workouts retrieved from the database.
3
Added:
4
Added:
I am rendered by `MFTRootComponent` when the user views their workouts. I know about user workouts retrieved from the database.
5
Added:
6
Added:
* Collaborators
7
Added:
8
Added:
- I work with lists of `MFTWorkout`s.
9
Added:
- I might work with `MFTExercise class`canonical exercises once the variable is implemented.
10
Added:
11
Added:
Public API and Key Messages
12
Added:
13
Added:
- message one
14
Added:
- message two
15
Added:
- (for bonus points) how to create instances.
16
Added:
17
Added:
One simple example is simply gorgeous.
18
Added:
19
Added:
Internal Representation and Key Implementation Points.
20
Added:
21
Added:
22
Added:
Implementation Points
23
Added:
"
24
Added:
Class {
25
Added:
#name : #MFTWorkoutsListComponent,
26
Added:
#superclass : #MFTScreenComponent,
27
Added:
#instVars : [
28
Added:
'workouts'
29
Added:
],
30
Added:
#category : #'MyFitnessTracker-Components'
31
Added:
}
32
Added:
33
Added:
{ #category : #rendering }
34
Added:
MFTWorkoutsListComponent class >> placeholder [
35
Added:
"Return a placeholder list of three workouts."
36
Added:
37
Added:
| placeholderWorkouts workout1 workout2 workout3 |
38
Added:
placeholderWorkouts := OrderedCollection new.
39
Added:
workout1 := MFTWorkout new
40
Added:
primaryMuscle: MFTMuscle chest;
41
Added:
exercises: {
42
Added:
(MFTExercise cableRow sets: {
43
Added:
(MFTSet reps: 8 rpe: 6).
44
Added:
(MFTSet reps: 6 rpe: 8).
45
Added:
(MFTSet reps: 6 rpe: 10).
46
Added:
(MFTSet reps: 15 rpe: 4) }).
47
Added:
(MFTExercise shoulderPressDumbell sets: {
48
Added:
(MFTSet reps: 10 rpe: 6).
49
Added:
(MFTSet reps: 6 rpe: 8).
50
Added:
(MFTSet reps: 6 rpe: 10) }).
51
Added:
(MFTExercise declineBenchPress sets: {
52
Added:
(MFTSet reps: 5 rpe: 6).
53
Added:
(MFTSet reps: 6 rpe: 8).
54
Added:
(MFTSet reps: 8 rpe: 10) }) }.
55
Added:
workout2 := MFTWorkout new
56
Added:
date: (Date fromString: '04/20/2023');
57
Added:
exercises: {
58
Added:
(MFTExercise cableRow sets: {
59
Added:
(MFTSet reps: 8 rpe: 6).
60
Added:
(MFTSet reps: 6 rpe: 8).
61
Added:
(MFTSet reps: 6 rpe: 10).
62
Added:
(MFTSet reps: 15 rpe: 4) }).
63
Added:
MFTExercise shoulderPressDumbell.
64
Added:
MFTExercise declineBenchPress }.
65
Added:
workout3 := MFTWorkout new
66
Added:
date: (Date fromString: '01/01/2023');
67
Added:
addExercise: MFTExercise cableRow;
68
Added:
addExercise: MFTExercise shoulderPressDumbell;
69
Added:
addExercise: MFTExercise declineBenchPress.
70
Added:
placeholderWorkouts
71
Added:
add: workout1;
72
Added:
add: workout2;
73
Added:
add: workout3.
74
Added:
75
Added:
^ self new
76
Added:
workouts: placeholderWorkouts;
77
Added:
yourself
78
Added:
]
79
Added:
80
Added:
{ #category : #hooks }
81
Added:
MFTWorkoutsListComponent >> children [
82
Added:
83
Added:
^ workouts
84
Added:
]
85
Added:
86
Added:
{ #category : #initialization }
87
Added:
MFTWorkoutsListComponent >> initialize [
88
Added:
89
Added:
super initialize.
90
Added:
workouts := OrderedCollection new
91
Added:
]
92
Added:
93
Added:
{ #category : #rendering }
94
Added:
MFTWorkoutsListComponent >> renderContentOn: html [
95
Added:
96
Added:
html tbsContainer
97
Added:
class: 'workouts-list';
98
Added:
with: [
99
Added:
html heading
100
Added:
level: 2;
101
Added:
with: 'Workouts'.
102
Added:
workouts do: [ :each | html render: each ] ]
103
Added:
]
104
Added:
105
Added:
{ #category : #accessing }
106
Added:
MFTWorkoutsListComponent >> workouts: aListOfWorkouts [
107
Added:
108
Added:
workouts := aListOfWorkouts
109
Added:
]
src/MyFitnessTracker/package.st
@@ -0,0 +1,1 @@
1
Added:
Package { #name : #MyFitnessTracker }