First commit.

Commit
5783ea6885640bb9e1e2102bb6553b81150ab09a
Author
Marius Peter <marius.peter@tutanota.com>
Author date
Committer
Marius Peter <marius.peter@tutanota.com>
Committer date
Changed files
.project
index 00000000..81083cc7 000000..100644
@@ -0,0 +1,3 @@
1 Added: {
2 Added: 'srcDirectory' : 'src'
3 Added: }
src/.properties
index 00000000..ad0471de 000000..100644
@@ -0,0 +1,3 @@
1 Added: {
2 Added: #format : #tonel
3 Added: }
src/MyFitnessTracker-Tests/MFTExerciseTest.class.st
index 00000000..489a016c 000000..100644
@@ -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
index 00000000..fb5a1c23 000000..100644
@@ -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
index 00000000..9c8280be 000000..100644
@@ -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
index 00000000..9b820ea8 000000..100644
@@ -0,0 +1,1 @@
1 Added: Package { #name : #'MyFitnessTracker-Tests' }
src/MyFitnessTracker/MFTExercise.class.st
index 00000000..9ca74109 000000..100644
@@ -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
index 00000000..8ba032f4 000000..100644
@@ -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
index 00000000..a0b86109 000000..100644
@@ -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
index 00000000..f4c601a5 000000..100644
@@ -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
index 00000000..b913f97a 000000..100644
@@ -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
index 00000000..16ecd833 000000..100644
@@ -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
index 00000000..9be3fe8e 000000..100644
@@ -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
index 00000000..fd762111 000000..100644
@@ -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
index 00000000..d6095f28 000000..100644
@@ -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
index 00000000..4bcb4a13 000000..100644
@@ -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
index 00000000..36546171 000000..100644
@@ -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
index 00000000..854c0e17 000000..100644
@@ -0,0 +1,1 @@
1 Added: Package { #name : #MyFitnessTracker }