[Pharo] Personal fitness tracker web app.
Remove independent form components; each form is now responsible for its components.
Changed files
- src/MyFitnessTracker-Components/MFTConfirmForm.class.st
- src/MyFitnessTracker-Components/MFTDateFormComponent.class.st
- src/MyFitnessTracker-Components/MFTExercisesForm.class.st
- src/MyFitnessTracker-Components/MFTForm.class.st
- src/MyFitnessTracker-Components/MFTFormComponent.class.st
- src/MyFitnessTracker-Components/MFTPrimaryMuscleGroupFormComponent.class.st
- src/MyFitnessTracker-Components/MFTSecondaryMuscleGroupsFormComponent.class.st
- src/MyFitnessTracker-Components/MFTSetGroupForm.class.st
- src/MyFitnessTracker-Components/MFTSetGroupsFormComponent.class.st
- src/MyFitnessTracker-Components/MFTWeightForm.class.st
- src/MyFitnessTracker-Components/MFTWorkoutForm.class.st
src/MyFitnessTracker-Components/MFTConfirmForm.class.st
@@ -1,6 +1,9 @@
1
1
Class {
2
2
#name : 'MFTConfirmForm',
3
3
#superclass : 'MFTForm',
4
Added:
#instVars : [
5
Added:
'message'
6
Added:
],
4
7
#category : 'MyFitnessTracker-Components-Forms',
5
8
#package : 'MyFitnessTracker-Components',
6
9
#tag : 'Forms'
@@ -25,6 +28,38 @@
25
28
26
29
super initialize .
27
30
heading := 'Heads up!'
31
Added:
]
32
Added:
33
Added:
{ #category : 'accessing' }
34
Added:
MFTConfirmForm >> message: anObject [
35
Added:
36
Added:
message := anObject
37
Added:
]
38
Added:
39
Added:
{ #category : 'rendering' }
40
Added:
MFTConfirmForm >> renderContentOn: html [
41
Added:
42
Added:
self renderFormOn: html with: [
43
Added:
html
44
Added:
text: message;
45
Added:
break;
46
Added:
text: 'To avoid this warning, go back and fix this issue.' ]
47
Added:
]
48
Added:
49
Added:
{ #category : 'as yet unclassified' }
50
Added:
MFTConfirmForm >> renderSubmitOn: html [
51
Added:
52
Added:
html buttonGroup: [
53
Added:
html formButton
54
Added:
beSubmit;
55
Added:
bePrimary;
56
Added:
callback: [ self submitForm ];
57
Added:
with: 'Confirm'.
58
Added:
html formButton
59
Added:
beSubmit;
60
Added:
beSecondary;
61
Added:
callback: [ self cancelForm ];
62
Added:
with: 'Cancel' ]
28
63
]
29
64
30
65
{ #category : 'as yet unclassified' }
src/MyFitnessTracker-Components/MFTDateFormComponent.class.st
@@ -1,24 +0,0 @@
1
Removed:
Class {
2
Removed:
#name : 'MFTDateFormComponent',
3
Removed:
#superclass : 'MFTFormComponent',
4
Removed:
#category : 'MyFitnessTracker-Components-Forms',
5
Removed:
#package : 'MyFitnessTracker-Components',
6
Removed:
#tag : 'Forms'
7
Removed:
}
8
Removed:
9
Removed:
{ #category : 'initialization' }
10
Removed:
MFTDateFormComponent >> initialize [
11
Removed:
12
Removed:
super initialize.
13
Removed:
heading := 'Date'
14
Removed:
]
15
Removed:
16
Removed:
{ #category : 'rendering' }
17
Removed:
MFTDateFormComponent >> renderContentOn: html [
18
Removed:
19
Removed:
self renderFormComponentOn: html with: [
20
Removed:
html dateInput5 formControl
21
Removed:
value: modelObject date yyyymmdd;
22
Removed:
callback: [ :value |
23
Removed:
modelObject date: (Date readFrom: value pattern: 'yyyy-mm-dd') ] ]
24
Removed:
]
src/MyFitnessTracker-Components/MFTExercisesForm.class.st
@@ -1,6 +1,9 @@
1
1
Class {
2
2
#name : 'MFTExercisesForm',
3
3
#superclass : 'MFTForm',
4
Added:
#instVars : [
5
Added:
'exercises'
6
Added:
],
4
7
#category : 'MyFitnessTracker-Components-Forms',
5
8
#package : 'MyFitnessTracker-Components',
6
9
#tag : 'Forms'
@@ -14,33 +17,43 @@
14
17
1 to: anInteger do: [ :i |
15
18
exercises add: (MFTSQLite3Database allExercises at: i) ].
16
19
^ self new
17
Removed:
modelObject: exercises;
20
Added:
exercises: exercises;
18
21
yourself
19
22
]
20
23
24
Added:
{ #category : 'accessing' }
25
Added:
MFTExercisesForm >> exercises: anObject [
26
Added:
27
Added:
exercises := anObject
28
Added:
]
29
Added:
21
30
{ #category : 'initialization' }
22
31
MFTExercisesForm >> initialize [
23
32
24
33
super initialize.
25
Removed:
modelObject := OrderedCollection new.
26
Removed:
heading := 'Exercises'
34
Added:
heading := 'Exercises'.
35
Added:
exercises := OrderedCollection new
27
36
]
28
37
29
38
{ #category : 'rendering' }
30
39
MFTExercisesForm >> renderContentOn: html [
31
40
32
Removed:
self renderFormOn: html with: [ self renderSelectExercisesOn: html ]
41
Added:
self renderFormOn: html with: [
42
Added:
exercises doWithIndex: [ :selectedExercise :i |
43
Added:
html div
44
Added:
class: 'form-floating';
45
Added:
marginBottom: 3;
46
Added:
with: [
47
Added:
html formSelect formControl
48
Added:
list: MFTSQLite3Database allExercises;
49
Added:
selected: selectedExercise;
50
Added:
callback: [ :exercise | exercises at: i put: exercise ];
51
Added:
labels: #englishName.
52
Added:
html label: 'Exercise ' , i asString ] ] ]
33
53
]
34
54
35
Removed:
{ #category : 'rendering' }
36
Removed:
MFTExercisesForm >> renderSelectExercisesOn: html [
55
Added:
{ #category : 'as yet unclassified' }
56
Added:
MFTExercisesForm >> submitForm [
37
57
38
Removed:
modelObject doWithIndex: [ :selectedExercise :i |
39
Removed:
html formGroup: [
40
Removed:
html label: 'Exercise ' , i asString.
41
Removed:
html select formControl
42
Removed:
list: MFTSQLite3Database allExercises;
43
Removed:
selected: selectedExercise;
44
Removed:
callback: [ :exercise | modelObject at: i put: exercise ];
45
Removed:
labels: [ :each | each englishName ] ] ]
58
Added:
self answer: exercises
46
59
]
src/MyFitnessTracker-Components/MFTForm.class.st
@@ -8,7 +8,6 @@
8
8
#name : 'MFTForm',
9
9
#superclass : 'SBSComponent',
10
10
#instVars : [
11
Removed:
'modelObject',
12
11
'heading'
13
12
],
14
13
#category : 'MyFitnessTracker-Components-Forms',
@@ -29,22 +28,10 @@
29
28
heading := 'Form heading'
30
29
]
31
30
32
Removed:
{ #category : 'accessing' }
33
Removed:
MFTForm >> modelObject [
34
Removed:
35
Removed:
^ modelObject
36
Removed:
]
37
Removed:
38
Removed:
{ #category : 'accessing' }
39
Removed:
MFTForm >> modelObject: anObject [
40
Removed:
41
Removed:
modelObject := anObject
42
Removed:
]
43
Removed:
44
31
{ #category : 'rendering' }
45
32
MFTForm >> renderContentOn: html [
46
33
47
Removed:
self renderFormOn: html with: [ html render: modelObject ]
34
Added:
self subclassResponsibility
48
35
]
49
36
50
37
{ #category : 'as yet unclassified' }
@@ -81,5 +68,5 @@
81
68
{ #category : 'as yet unclassified' }
82
69
MFTForm >> submitForm [
83
70
84
Removed:
self answer: modelObject
71
Added:
self subclassResponsibility
85
72
]
src/MyFitnessTracker-Components/MFTFormComponent.class.st
@@ -1,92 +0,0 @@
1
Removed:
"
2
Removed:
When instantiated with the `MFTFormComponent class>>#set:` message, I return an instance of the appropriate subclass for setting the model object attribute.
3
Removed:
"
4
Removed:
Class {
5
Removed:
#name : 'MFTFormComponent',
6
Removed:
#superclass : 'SBSComponent',
7
Removed:
#instVars : [
8
Removed:
'heading',
9
Removed:
'modelObject'
10
Removed:
],
11
Removed:
#category : 'MyFitnessTracker-Components-Forms',
12
Removed:
#package : 'MyFitnessTracker-Components',
13
Removed:
#tag : 'Forms'
14
Removed:
}
15
Removed:
16
Removed:
{ #category : 'as yet unclassified' }
17
Removed:
MFTFormComponent class >> formComponentFor: anAttribute [
18
Removed:
19
Removed:
| formComponents |
20
Removed:
formComponents := Dictionary newFrom: {
21
Removed:
(#date -> MFTDateFormComponent).
22
Removed:
(#setGroups -> MFTSetGroupsFormComponent).
23
Removed:
(#primaryMuscleGroup
24
Removed:
-> MFTPrimaryMuscleGroupFormComponent).
25
Removed:
(#secondaryMuscleGroups
26
Removed:
-> MFTSecondaryMuscleGroupsFormComponent) }.
27
Removed:
28
Removed:
^ formComponents at: anAttribute ifAbsent: [
29
Removed:
self error:
30
Removed:
('no appropriate {1} subclass for setting attribute "{2}"'
31
Removed:
format: {
32
Removed:
self.
33
Removed:
anAttribute }) ]
34
Removed:
]
35
Removed:
36
Removed:
{ #category : 'as yet unclassified' }
37
Removed:
MFTFormComponent class >> set: anAttribute [
38
Removed:
39
Removed:
| formComponent |
40
Removed:
formComponent := self formComponentFor: anAttribute.
41
Removed:
^ formComponent new
42
Removed:
modelObject: thisContext sender receiver modelObject;
43
Removed:
yourself
44
Removed:
]
45
Removed:
46
Removed:
{ #category : 'accessing' }
47
Removed:
MFTFormComponent >> heading [
48
Removed:
49
Removed:
^ heading
50
Removed:
]
51
Removed:
52
Removed:
{ #category : 'accessing' }
53
Removed:
MFTFormComponent >> heading: anObject [
54
Removed:
55
Removed:
heading := anObject
56
Removed:
]
57
Removed:
58
Removed:
{ #category : 'initialization' }
59
Removed:
MFTFormComponent >> initialize [
60
Removed:
61
Removed:
super initialize
62
Removed:
]
63
Removed:
64
Removed:
{ #category : 'accessing' }
65
Removed:
MFTFormComponent >> modelObject [
66
Removed:
67
Removed:
^ modelObject
68
Removed:
]
69
Removed:
70
Removed:
{ #category : 'accessing' }
71
Removed:
MFTFormComponent >> modelObject: anObject [
72
Removed:
73
Removed:
modelObject := anObject
74
Removed:
]
75
Removed:
76
Removed:
{ #category : 'rendering' }
77
Removed:
MFTFormComponent >> renderContentOn: html [
78
Removed:
79
Removed:
self renderFormComponentOn: html with: [ html render: modelObject ]
80
Removed:
]
81
Removed:
82
Removed:
{ #category : 'as yet unclassified' }
83
Removed:
MFTFormComponent >> renderFormComponentOn: html with: aBlock [
84
Removed:
85
Removed:
html formGroup
86
Removed:
class: 'my-4';
87
Removed:
with: [
88
Removed:
html paragraph
89
Removed:
heading: 3;
90
Removed:
with: [ html text: heading ].
91
Removed:
aBlock value ]
92
Removed:
]
src/MyFitnessTracker-Components/MFTPrimaryMuscleGroupFormComponent.class.st
@@ -1,32 +0,0 @@
1
Removed:
Class {
2
Removed:
#name : 'MFTPrimaryMuscleGroupFormComponent',
3
Removed:
#superclass : 'MFTFormComponent',
4
Removed:
#category : 'MyFitnessTracker-Components-Forms',
5
Removed:
#package : 'MyFitnessTracker-Components',
6
Removed:
#tag : 'Forms'
7
Removed:
}
8
Removed:
9
Removed:
{ #category : 'initialization' }
10
Removed:
MFTPrimaryMuscleGroupFormComponent >> initialize [
11
Removed:
12
Removed:
super initialize.
13
Removed:
heading := 'Primary Group'
14
Removed:
]
15
Removed:
16
Removed:
{ #category : 'rendering' }
17
Removed:
MFTPrimaryMuscleGroupFormComponent >> renderContentOn: html [
18
Removed:
19
Removed:
| allMuscleGroups selectedMuscleGroup |
20
Removed:
allMuscleGroups := MFTSQLite3Database allMuscleGroups.
21
Removed:
selectedMuscleGroup := modelObject primaryMuscleGroup ifNotNil: [
22
Removed:
allMuscleGroups detect: [ :muscleGroup |
23
Removed:
muscleGroup englishName
24
Removed:
= modelObject primaryMuscleGroup englishName ] ].
25
Removed:
26
Removed:
self renderFormComponentOn: html with: [
27
Removed:
html select formControl
28
Removed:
list: allMuscleGroups;
29
Removed:
selected: selectedMuscleGroup;
30
Removed:
labels: [ :muscleGroup | muscleGroup englishName ];
31
Removed:
callback: [ :group | modelObject primaryMuscleGroup: group ] ]
32
Removed:
]
src/MyFitnessTracker-Components/MFTSecondaryMuscleGroupsFormComponent.class.st
@@ -1,40 +0,0 @@
1
Removed:
Class {
2
Removed:
#name : 'MFTSecondaryMuscleGroupsFormComponent',
3
Removed:
#superclass : 'MFTFormComponent',
4
Removed:
#instVars : [
5
Removed:
'allMuscleGroups'
6
Removed:
],
7
Removed:
#category : 'MyFitnessTracker-Components-Forms',
8
Removed:
#package : 'MyFitnessTracker-Components',
9
Removed:
#tag : 'Forms'
10
Removed:
}
11
Removed:
12
Removed:
{ #category : 'as yet unclassified' }
13
Removed:
MFTSecondaryMuscleGroupsFormComponent >> getSelectedMuscleGroups [
14
Removed:
15
Removed:
| selectedMuscleGroups |
16
Removed:
selectedMuscleGroups := allMuscleGroups select: [ :muscleGroup |
17
Removed:
modelObject secondaryMuscleGroupIds
18
Removed:
includes: muscleGroup id ].
19
Removed:
^ selectedMuscleGroups
20
Removed:
]
21
Removed:
22
Removed:
{ #category : 'initialization' }
23
Removed:
MFTSecondaryMuscleGroupsFormComponent >> initialize [
24
Removed:
25
Removed:
super initialize.
26
Removed:
heading := 'Secondary Groups'.
27
Removed:
allMuscleGroups := MFTSQLite3Database allMuscleGroups
28
Removed:
]
29
Removed:
30
Removed:
{ #category : 'rendering' }
31
Removed:
MFTSecondaryMuscleGroupsFormComponent >> renderContentOn: html [
32
Removed:
33
Removed:
self renderFormComponentOn: html with: [
34
Removed:
html multiSelect formControl
35
Removed:
list: allMuscleGroups;
36
Removed:
selected: self getSelectedMuscleGroups;
37
Removed:
labels: [ :muscleGroup | muscleGroup englishName ];
38
Removed:
callback: [ :muscleGroups |
39
Removed:
modelObject secondaryMuscleGroups: muscleGroups ] ]
40
Removed:
]
src/MyFitnessTracker-Components/MFTSetGroupForm.class.st
@@ -2,6 +2,7 @@
2
2
#name : 'MFTSetGroupForm',
3
3
#superclass : 'MFTForm',
4
4
#instVars : [
5
Added:
'setGroup',
5
6
'exerciseCount',
6
7
'renderRpe',
7
8
'renderRestAfter'
@@ -21,7 +22,7 @@
21
22
exercise: exercise;
22
23
reps: 8 ]).
23
24
^ self new
24
Removed:
modelObject: setGroup;
25
Added:
setGroup: setGroup;
25
26
exerciseCount: anMFTExerciseCollection size;
26
27
yourself
27
28
]
@@ -36,8 +37,8 @@
36
37
MFTSetGroupForm >> initialize [
37
38
38
39
super initialize.
39
Removed:
modelObject := MFTSetGroup new addSet: (MFTSet new reps: 8).
40
40
heading := 'Sets'.
41
Added:
setGroup := MFTSetGroup new addSet: (MFTSet new reps: 8).
41
42
renderRpe := false.
42
43
renderRestAfter := false
43
44
]
@@ -54,10 +55,10 @@
54
55
MFTSetGroupForm >> renderSetGroupRowsOn: html [
55
56
56
57
| selectedExercises renderSetGroupExercisesName |
57
Removed:
selectedExercises := modelObject sets collect: #exercise.
58
Removed:
renderSetGroupExercisesName := modelObject isIrregularSetGroup.
58
Added:
selectedExercises := setGroup sets collect: #exercise.
59
Added:
renderSetGroupExercisesName := setGroup isIrregularSetGroup.
59
60
60
Removed:
modelObject sets do: [ :set |
61
Added:
setGroup sets do: [ :set |
61
62
html tableRow: [
62
63
renderSetGroupExercisesName ifTrue: [
63
64
html tableData with: set exercise englishName capitalized ].
@@ -91,7 +92,7 @@
91
92
MFTSetGroupForm >> renderSetGroupTableHeaderOn: html [
92
93
93
94
html tableHead: [
94
Removed:
modelObject isIrregularSetGroup ifTrue: [
95
Added:
setGroup isIrregularSetGroup ifTrue: [
95
96
html tableHeading with: 'Exercise' ].
96
97
html tableHeading with: 'Reps'.
97
98
html tableHeading with: 'Load'.
@@ -113,13 +114,13 @@
113
114
MFTSetGroupForm >> renderSetsButtonGroupOn: html [
114
115
115
116
html buttonGroup
116
Removed:
class: 'my-3';
117
Added:
marginTopAndBottom: 3;
117
118
with: [
118
119
html outlineButton
119
120
bePrimary;
120
121
beSmall;
121
Removed:
callback: [ modelObject addSets: modelObject sets ];
122
Removed:
with: 'Add sets'.
122
Added:
callback: [ setGroup addSets: setGroup sets ];
123
Added:
with: 'Add set'.
123
124
renderRpe ifFalse: [
124
125
html outlineButton
125
126
beSecondary;
@@ -137,8 +138,20 @@
137
138
beSmall;
138
139
callback: [
139
140
| firstSets |
140
Removed:
firstSets := modelObject sets first: exerciseCount.
141
Removed:
modelObject := MFTSetGroup new addSets: firstSets.
141
Added:
firstSets := setGroup sets first: exerciseCount.
142
Added:
setGroup := MFTSetGroup new addSets: firstSets.
142
143
renderRpe := renderRestAfter := false ];
143
144
with: 'Reset' ]
145
Added:
]
146
Added:
147
Added:
{ #category : 'accessing' }
148
Added:
MFTSetGroupForm >> setGroup: anObject [
149
Added:
150
Added:
setGroup := anObject
151
Added:
]
152
Added:
153
Added:
{ #category : 'as yet unclassified' }
154
Added:
MFTSetGroupForm >> submitForm [
155
Added:
156
Added:
self answer: setGroup
144
157
]
src/MyFitnessTracker-Components/MFTSetGroupsFormComponent.class.st
@@ -1,62 +0,0 @@
1
Removed:
Class {
2
Removed:
#name : 'MFTSetGroupsFormComponent',
3
Removed:
#superclass : 'MFTFormComponent',
4
Removed:
#category : 'MyFitnessTracker-Components-Forms',
5
Removed:
#package : 'MyFitnessTracker-Components',
6
Removed:
#tag : 'Forms'
7
Removed:
}
8
Removed:
9
Removed:
{ #category : 'adding' }
10
Removed:
MFTSetGroupsFormComponent >> addSetGroupsForExerciseCount: anInteger [
11
Removed:
12
Removed:
| setGroup |
13
Removed:
setGroup := self session pageManager activePage call:
14
Removed:
(MFTSetGroupTask forExerciseCount: anInteger).
15
Removed:
setGroup ifNotNil: [ modelObject addSetGroup: setGroup ]
16
Removed:
]
17
Removed:
18
Removed:
{ #category : 'initialization' }
19
Removed:
MFTSetGroupsFormComponent >> initialize [
20
Removed:
21
Removed:
super initialize.
22
Removed:
heading := 'Exercises'
23
Removed:
]
24
Removed:
25
Removed:
{ #category : 'rendering' }
26
Removed:
MFTSetGroupsFormComponent >> renderContentOn: html [
27
Removed:
28
Removed:
self renderFormComponentOn: html with: [
29
Removed:
modelObject renderSetGroupsTableOn: html.
30
Removed:
self renderSetGroupButtonsOn: html ]
31
Removed:
]
32
Removed:
33
Removed:
{ #category : 'rendering' }
34
Removed:
MFTSetGroupsFormComponent >> renderSetGroupButtonsOn: html [
35
Removed:
36
Removed:
html buttonGroup: [
37
Removed:
html outlineButton
38
Removed:
bePrimary;
39
Removed:
beSmall;
40
Removed:
callback: [ self addSetGroupsForExerciseCount: 1 ];
41
Removed:
with: 'Add exercise'.
42
Removed:
html outlineButton
43
Removed:
beSecondary;
44
Removed:
beSmall;
45
Removed:
callback: [ self addSetGroupsForExerciseCount: 2 ];
46
Removed:
with: 'Add superset'.
47
Removed:
html outlineButton
48
Removed:
beSecondary;
49
Removed:
beSmall;
50
Removed:
callback: [ self addSetGroupsForExerciseCount: 3 ];
51
Removed:
with: 'Add tri-set'.
52
Removed:
html outlineButton
53
Removed:
beSecondary;
54
Removed:
beSmall;
55
Removed:
callback: [ self addSetGroupsForExerciseCount: 4 ];
56
Removed:
with: 'Add giant set'.
57
Removed:
html outlineButton
58
Removed:
beDanger;
59
Removed:
beSmall;
60
Removed:
callback: [ modelObject setGroups removeAll ];
61
Removed:
with: 'Remove all' ]
62
Removed:
]
src/MyFitnessTracker-Components/MFTWeightForm.class.st
@@ -0,0 +1,61 @@
1
Added:
Class {
2
Added:
#name : 'MFTWeightForm',
3
Added:
#superclass : 'MFTForm',
4
Added:
#instVars : [
5
Added:
'weight'
6
Added:
],
7
Added:
#category : 'MyFitnessTracker-Components-Forms',
8
Added:
#package : 'MyFitnessTracker-Components',
9
Added:
#tag : 'Forms'
10
Added:
}
11
Added:
12
Added:
{ #category : 'initialization' }
13
Added:
MFTWeightForm >> initialize [
14
Added:
15
Added:
super initialize.
16
Added:
heading := 'Weight'.
17
Added:
weight := MFTWeight new
18
Added:
]
19
Added:
20
Added:
{ #category : 'rendering' }
21
Added:
MFTWeightForm >> renderContentOn: html [
22
Added:
23
Added:
self renderFormOn: html with: [
24
Added:
html formGroup: [
25
Added:
html div
26
Added:
class: 'form-floating';
27
Added:
marginBottom: 3;
28
Added:
with: [
29
Added:
html dateInput5 formControl
30
Added:
placeholder: 'RequiredEntry-PutItAndDoNotUse';
31
Added:
callback: [ :input |
32
Added:
input ifEmpty: [ self error: 'Workout date required.' ].
33
Added:
weight date: (Date readFrom: input pattern: 'yyyy-mm-dd') ];
34
Added:
value: weight date yyyymmdd.
35
Added:
html label: 'Date' ] ].
36
Added:
37
Added:
html formGroup: [
38
Added:
html div
39
Added:
class: 'form-floating';
40
Added:
marginBottom: 3;
41
Added:
with: [
42
Added:
html numberInput formControl
43
Added:
placeholder: 'RequiredEntry-PutItAndDoNotUse';
44
Added:
callback: [ :input |
45
Added:
input ifEmpty: [ self error: 'Weight value required.' ].
46
Added:
weight value: input ];
47
Added:
value: weight value.
48
Added:
html label: 'Weight' ] ] ]
49
Added:
]
50
Added:
51
Added:
{ #category : 'as yet unclassified' }
52
Added:
MFTWeightForm >> submitForm [
53
Added:
54
Added:
self answer: weight
55
Added:
]
56
Added:
57
Added:
{ #category : 'accessing' }
58
Added:
MFTWeightForm >> weight: anObject [
59
Added:
60
Added:
weight := anObject
61
Added:
]
src/MyFitnessTracker-Components/MFTWorkoutForm.class.st
@@ -1,45 +1,155 @@
1
1
Class {
2
2
#name : 'MFTWorkoutForm',
3
3
#superclass : 'MFTForm',
4
Added:
#instVars : [
5
Added:
'workout'
6
Added:
],
4
7
#category : 'MyFitnessTracker-Components-Forms',
5
8
#package : 'MyFitnessTracker-Components',
6
9
#tag : 'Forms'
7
10
}
8
11
12
Added:
{ #category : 'adding' }
13
Added:
MFTWorkoutForm >> addSetGroupsForExerciseCount: anInteger [
14
Added:
15
Added:
| setGroup |
16
Added:
setGroup := self session pageManager activePage call:
17
Added:
(MFTSetGroupTask forExerciseCount: anInteger).
18
Added:
setGroup ifNotNil: [ workout addSetGroup: setGroup ]
19
Added:
]
20
Added:
9
21
{ #category : 'as yet unclassified' }
10
Removed:
MFTWorkoutForm class >> edit: aMFTWorkout [
22
Added:
MFTWorkoutForm >> getSelectedMuscleGroups [
11
23
12
Removed:
^ self new
13
Removed:
modelObject: aMFTWorkout;
14
Removed:
yourself
24
Added:
| selectedMuscleGroups |
25
Added:
selectedMuscleGroups := MFTSQLite3Database allMuscleGroups select: [
26
Added:
:muscleGroup |
27
Added:
workout secondaryMuscleGroups includes:
28
Added:
muscleGroup ].
29
Added:
^ selectedMuscleGroups
15
30
]
16
31
17
32
{ #category : 'initialization' }
18
33
MFTWorkoutForm >> initialize [
19
34
20
35
super initialize.
21
Removed:
modelObject := MFTWorkout new.
22
Removed:
heading := 'Workout'
36
Added:
heading := 'Workout'.
37
Added:
workout := MFTWorkout new
23
38
]
24
39
25
40
{ #category : 'rendering' }
26
41
MFTWorkoutForm >> renderContentOn: html [
27
42
28
43
self renderFormOn: html with: [
29
Removed:
html
30
Removed:
render: (MFTFormComponent set: #date);
31
Removed:
render: (MFTFormComponent set: #setGroups);
32
Removed:
render: (MFTFormComponent set: #primaryMuscleGroup);
33
Removed:
render: (MFTFormComponent set: #secondaryMuscleGroups) ]
44
Added:
self renderDatePickerOn: html.
45
Added:
self renderExercisesPickerOn: html.
46
Added:
self renderPrimaryMuscleGroupPickerOn: html.
47
Added:
self renderSecondaryMuscleGroupsPickerOn: html ]
34
48
]
35
49
36
50
{ #category : 'as yet unclassified' }
51
Added:
MFTWorkoutForm >> renderDatePickerOn: html [
52
Added:
53
Added:
html formGroup: [
54
Added:
html div
55
Added:
class: 'form-floating';
56
Added:
marginBottom: 3;
57
Added:
with: [
58
Added:
html dateInput5 formControl
59
Added:
placeholder: 'RequiredEntry-PutItAndDoNotUse';
60
Added:
callback: [ :input |
61
Added:
input ifEmpty: [ self error: 'Workout date required.' ].
62
Added:
workout date: (Date readFrom: input pattern: 'yyyy-mm-dd') ];
63
Added:
value: workout date yyyymmdd.
64
Added:
html label: 'Date' ] ]
65
Added:
]
66
Added:
67
Added:
{ #category : 'as yet unclassified' }
68
Added:
MFTWorkoutForm >> renderExercisesPickerOn: html [
69
Added:
70
Added:
workout renderSetGroupsTableOn: html.
71
Added:
html buttonGroup
72
Added:
marginBottom: 3;
73
Added:
with: [
74
Added:
html outlineButton
75
Added:
bePrimary;
76
Added:
beSmall;
77
Added:
callback: [ self addSetGroupsForExerciseCount: 1 ];
78
Added:
with: 'Add exercise'.
79
Added:
html outlineButton
80
Added:
beSecondary;
81
Added:
beSmall;
82
Added:
callback: [ self addSetGroupsForExerciseCount: 2 ];
83
Added:
with: 'Add superset'.
84
Added:
html outlineButton
85
Added:
beSecondary;
86
Added:
beSmall;
87
Added:
callback: [ self addSetGroupsForExerciseCount: 3 ];
88
Added:
with: 'Add tri-set'.
89
Added:
html outlineButton
90
Added:
beSecondary;
91
Added:
beSmall;
92
Added:
callback: [ self addSetGroupsForExerciseCount: 4 ];
93
Added:
with: 'Add giant set'.
94
Added:
html outlineButton
95
Added:
beDanger;
96
Added:
beSmall;
97
Added:
callback: [ workout setGroups removeAll ];
98
Added:
with: 'Remove all' ]
99
Added:
]
100
Added:
101
Added:
{ #category : 'as yet unclassified' }
102
Added:
MFTWorkoutForm >> renderPrimaryMuscleGroupPickerOn: html [
103
Added:
104
Added:
| selectedMuscleGroup |
105
Added:
selectedMuscleGroup := workout primaryMuscleGroup ifNotNil: [
106
Added:
MFTSQLite3Database allMuscleGroups detect: [
107
Added:
:muscleGroup |
108
Added:
muscleGroup englishName
109
Added:
= workout primaryMuscleGroup englishName ] ].
110
Added:
111
Added:
html formGroup: [
112
Added:
html div
113
Added:
class: 'form-floating';
114
Added:
marginBottom: 3;
115
Added:
with: [
116
Added:
html formSelect
117
Added:
list: MFTSQLite3Database allMuscleGroups;
118
Added:
callback: [ :group | workout primaryMuscleGroup: group ];
119
Added:
selected: selectedMuscleGroup;
120
Added:
labels: [ :muscleGroup | muscleGroup englishName ].
121
Added:
html label: 'Primary Muscle Group' ] ]
122
Added:
]
123
Added:
124
Added:
{ #category : 'as yet unclassified' }
125
Added:
MFTWorkoutForm >> renderSecondaryMuscleGroupsPickerOn: html [
126
Added:
127
Added:
html formGroup: [
128
Added:
html div
129
Added:
class: 'form-floating';
130
Added:
marginBottom: 3;
131
Added:
with: [
132
Added:
html multiSelect formControl class: 'h-25';
133
Added:
list: MFTSQLite3Database allMuscleGroups;
134
Added:
callback: [ :muscleGroups |
135
Added:
workout secondaryMuscleGroups: muscleGroups ];
136
Added:
selected: self getSelectedMuscleGroups;
137
Added:
labels: [ :muscleGroup | muscleGroup englishName ].
138
Added:
html label: 'Secondary Muscle Groups' ] ]
139
Added:
]
140
Added:
141
Added:
{ #category : 'as yet unclassified' }
37
142
MFTWorkoutForm >> submitForm [
38
143
39
Removed:
modelObject setGroups ifEmpty: [
144
Added:
workout setGroups ifEmpty: [
40
145
(self call:
41
Removed:
(MFTConfirmForm new modelObject: 'No exercises were specified.'))
146
Added:
(MFTConfirmForm new message: 'No exercises were specified.'))
42
147
ifFalse: [ self answer: nil ] ].
148
Added:
self answer: workout
149
Added:
]
43
150
44
Removed:
self answer: modelObject
151
Added:
{ #category : 'accessing' }
152
Added:
MFTWorkoutForm >> workout: anObject [
153
Added:
154
Added:
workout := anObject
45
155
]