[Pharo] Personal fitness tracker web app.
Merge 09ec9e8ef7b4c32594cf86ddcb7242704fb84a03
Changed files
- src/MyFitnessTracker/MFTConfirmDialog.class.st
- src/MyFitnessTracker/MFTConfirmForm.class.st
- src/MyFitnessTracker/MFTDateDialog.class.st
- src/MyFitnessTracker/MFTDateFormComponent.class.st
- src/MyFitnessTracker/MFTExercise.class.st
- src/MyFitnessTracker/MFTExercisesForm.class.st
- src/MyFitnessTracker/MFTForm.class.st
- src/MyFitnessTracker/MFTFormComponent.class.st
- src/MyFitnessTracker/MFTMainPublicCard.class.st
- src/MyFitnessTracker/MFTPrimaryMuscleGroupFormComponent.class.st
- src/MyFitnessTracker/MFTSecondaryMuscleGroupsFormComponent.class.st
- src/MyFitnessTracker/MFTSetDialog.class.st
- src/MyFitnessTracker/MFTSetGroupDialog.class.st
- src/MyFitnessTracker/MFTSetGroupForm.class.st
- src/MyFitnessTracker/MFTSetGroupTask.class.st
- src/MyFitnessTracker/MFTSetGroupsDialogOld.class.st
- src/MyFitnessTracker/MFTSetGroupsFormComponent.class.st
- src/MyFitnessTracker/MFTSetsDialog.class.st
- src/MyFitnessTracker/MFTUserTask.class.st
- src/MyFitnessTracker/MFTWorkout.class.st
- src/MyFitnessTracker/MFTWorkoutForm.class.st
- src/MyFitnessTracker/MFTWorkoutTask.class.st
- src/MyFitnessTracker/MFTWorkoutsLog.class.st
src/MyFitnessTracker/MFTConfirmDialog.class.st
@@ -14,7 +14,7 @@
14
14
component class }
15
15
]
16
16
17
Removed:
{ #category : 'rendering' }
17
Added:
{ #category : 'as yet unclassified' }
18
18
MFTConfirmDialog >> renderContentOn: html [
19
19
20
20
self renderDialogOn: html with: [
src/MyFitnessTracker/MFTConfirmForm.class.st
@@ -0,0 +1,34 @@
1
Added:
Class {
2
Added:
#name : 'MFTConfirmForm',
3
Added:
#superclass : 'MFTForm',
4
Added:
#category : 'MyFitnessTracker-Forms',
5
Added:
#package : 'MyFitnessTracker',
6
Added:
#tag : 'Forms'
7
Added:
}
8
Added:
9
Added:
{ #category : 'submorphs - add/remove' }
10
Added:
MFTConfirmForm class >> delete [
11
Added:
12
Added:
^ self new
13
Added:
modelObject: 'Confirm deletion?';
14
Added:
yourself
15
Added:
]
16
Added:
17
Added:
{ #category : 'as yet unclassified' }
18
Added:
MFTConfirmForm >> cancelForm [
19
Added:
20
Added:
self answer: false
21
Added:
]
22
Added:
23
Added:
{ #category : 'initialization' }
24
Added:
MFTConfirmForm >> initialize [
25
Added:
26
Added:
super initialize .
27
Added:
heading := 'Heads up!'
28
Added:
]
29
Added:
30
Added:
{ #category : 'as yet unclassified' }
31
Added:
MFTConfirmForm >> submitForm [
32
Added:
33
Added:
self answer: true
34
Added:
]
src/MyFitnessTracker/MFTDateDialog.class.st
@@ -38,7 +38,7 @@
38
38
date := Date readFrom: value pattern: 'yyyy-mm-dd' ] ]
39
39
]
40
40
41
Removed:
{ #category : 'rendering' }
41
Added:
{ #category : 'as yet unclassified' }
42
42
MFTDateDialog >> renderSubmitOn: html [
43
43
44
44
html buttonGroup: [
src/MyFitnessTracker/MFTDateFormComponent.class.st
@@ -0,0 +1,24 @@
1
Added:
Class {
2
Added:
#name : 'MFTDateFormComponent',
3
Added:
#superclass : 'MFTFormComponent',
4
Added:
#category : 'MyFitnessTracker-Forms',
5
Added:
#package : 'MyFitnessTracker',
6
Added:
#tag : 'Forms'
7
Added:
}
8
Added:
9
Added:
{ #category : 'initialization' }
10
Added:
MFTDateFormComponent >> initialize [
11
Added:
12
Added:
super initialize.
13
Added:
heading := 'Date'
14
Added:
]
15
Added:
16
Added:
{ #category : 'rendering' }
17
Added:
MFTDateFormComponent >> renderContentOn: html [
18
Added:
19
Added:
self renderFormComponentOn: html with: [
20
Added:
html dateInput5 formControl
21
Added:
value: modelObject date yyyymmdd;
22
Added:
callback: [ :value |
23
Added:
modelObject date: (Date readFrom: value pattern: 'yyyy-mm-dd') ] ]
24
Added:
]
src/MyFitnessTracker/MFTExercise.class.st
@@ -6,29 +6,6 @@
6
6
2. used to create a new custom exercise,
7
7
3. used to track an amount of sets performed by the user.
8
8
I know about primary and secondary muscle groups I target...
9
Removed:
10
Removed:
For the Responsibility part: Three sentences about my main responsibilities - what I do, what I know.
11
Removed:
12
Removed:
For the Collaborators Part: State my main collaborators and one line about how I interact with them.
13
Removed:
14
Removed:
Public API and Key Messages
15
Removed:
16
Removed:
- message one
17
Removed:
- message two
18
Removed:
- (for bonus points) how to create instances.
19
Removed:
20
Removed:
One simple example is simply gorgeous.
21
Removed:
22
Removed:
Internal Representation and Key Implementation Points.
23
Removed:
24
Removed:
Instance Variables
25
Removed:
name: <Object>
26
Removed:
primaryGroup: <Object>
27
Removed:
secondaryGroup: <Object>
28
Removed:
sets: <Object>
29
Removed:
30
Removed:
31
Removed:
Implementation Points
32
9
"
33
10
Class {
34
11
#name : 'MFTExercise',
src/MyFitnessTracker/MFTExercisesForm.class.st
@@ -0,0 +1,46 @@
1
Added:
Class {
2
Added:
#name : 'MFTExercisesForm',
3
Added:
#superclass : 'MFTForm',
4
Added:
#category : 'MyFitnessTracker-Forms',
5
Added:
#package : 'MyFitnessTracker',
6
Added:
#tag : 'Forms'
7
Added:
}
8
Added:
9
Added:
{ #category : 'as yet unclassified' }
10
Added:
MFTExercisesForm class >> forExerciseCount: anInteger [
11
Added:
12
Added:
| exercises |
13
Added:
exercises := OrderedCollection new: anInteger.
14
Added:
1 to: anInteger do: [ :i |
15
Added:
exercises add: (MFTSQLite3Database allExercises at: i) ].
16
Added:
^ self new
17
Added:
modelObject: exercises;
18
Added:
yourself
19
Added:
]
20
Added:
21
Added:
{ #category : 'initialization' }
22
Added:
MFTExercisesForm >> initialize [
23
Added:
24
Added:
super initialize.
25
Added:
modelObject := OrderedCollection new.
26
Added:
heading := 'Exercises'
27
Added:
]
28
Added:
29
Added:
{ #category : 'rendering' }
30
Added:
MFTExercisesForm >> renderContentOn: html [
31
Added:
32
Added:
self renderFormOn: html with: [ self renderSelectExercisesOn: html ]
33
Added:
]
34
Added:
35
Added:
{ #category : 'rendering' }
36
Added:
MFTExercisesForm >> renderSelectExercisesOn: html [
37
Added:
38
Added:
modelObject doWithIndex: [ :selectedExercise :i |
39
Added:
html formGroup: [
40
Added:
html label: 'Exercise ' , i asString.
41
Added:
html select formControl
42
Added:
list: MFTSQLite3Database allExercises;
43
Added:
selected: selectedExercise;
44
Added:
callback: [ :exercise | modelObject at: i put: exercise ];
45
Added:
labels: [ :each | each englishName ] ] ]
46
Added:
]
src/MyFitnessTracker/MFTForm.class.st
@@ -0,0 +1,85 @@
1
Added:
"
2
Added:
I represent a user-fillable form.
3
Added:
4
Added:
Upon submitting the form (""submit"" button), I return (`WAComponent>>#answer:`) the `#modelObject` with its attributes populated by the appropriate `MFTFormComponent` subclasses.
5
Added:
Upon canceling the form (""cancel"" button), I return `nil`.
6
Added:
"
7
Added:
Class {
8
Added:
#name : 'MFTForm',
9
Added:
#superclass : 'SBSComponent',
10
Added:
#instVars : [
11
Added:
'modelObject',
12
Added:
'heading'
13
Added:
],
14
Added:
#category : 'MyFitnessTracker-Forms',
15
Added:
#package : 'MyFitnessTracker',
16
Added:
#tag : 'Forms'
17
Added:
}
18
Added:
19
Added:
{ #category : 'as yet unclassified' }
20
Added:
MFTForm >> cancelForm [
21
Added:
22
Added:
self answer: nil
23
Added:
]
24
Added:
25
Added:
{ #category : 'initialization' }
26
Added:
MFTForm >> initialize [
27
Added:
28
Added:
super initialize.
29
Added:
heading := 'Form heading'
30
Added:
]
31
Added:
32
Added:
{ #category : 'accessing' }
33
Added:
MFTForm >> modelObject [
34
Added:
35
Added:
^ modelObject
36
Added:
]
37
Added:
38
Added:
{ #category : 'accessing' }
39
Added:
MFTForm >> modelObject: anObject [
40
Added:
41
Added:
modelObject := anObject
42
Added:
]
43
Added:
44
Added:
{ #category : 'rendering' }
45
Added:
MFTForm >> renderContentOn: html [
46
Added:
47
Added:
self renderFormOn: html with: [ html render: modelObject ]
48
Added:
]
49
Added:
50
Added:
{ #category : 'as yet unclassified' }
51
Added:
MFTForm >> renderFormOn: html with: aBlock [
52
Added:
53
Added:
html container
54
Added:
style: 'max-width: 40rem';
55
Added:
with: [
56
Added:
html displayHeading
57
Added:
level: 3;
58
Added:
with: heading.
59
Added:
html form: [
60
Added:
aBlock value.
61
Added:
html horizontalRule.
62
Added:
self renderSubmitOn: html ] ]
63
Added:
]
64
Added:
65
Added:
{ #category : 'as yet unclassified' }
66
Added:
MFTForm >> renderSubmitOn: html [
67
Added:
68
Added:
html buttonGroup: [
69
Added:
html formButton
70
Added:
beSubmit;
71
Added:
bePrimary;
72
Added:
callback: [ self submitForm ];
73
Added:
with: 'Submit'.
74
Added:
html formButton
75
Added:
beSubmit;
76
Added:
beSecondary;
77
Added:
callback: [ self cancelForm ];
78
Added:
with: 'Cancel' ]
79
Added:
]
80
Added:
81
Added:
{ #category : 'as yet unclassified' }
82
Added:
MFTForm >> submitForm [
83
Added:
84
Added:
self answer: modelObject
85
Added:
]
src/MyFitnessTracker/MFTFormComponent.class.st
@@ -0,0 +1,92 @@
1
Added:
"
2
Added:
When instantiated with the `MFTFormComponent class>>#set:` message, I return an instance of the appropriate subclass for setting the model object attribute.
3
Added:
"
4
Added:
Class {
5
Added:
#name : 'MFTFormComponent',
6
Added:
#superclass : 'SBSComponent',
7
Added:
#instVars : [
8
Added:
'heading',
9
Added:
'modelObject'
10
Added:
],
11
Added:
#category : 'MyFitnessTracker-Forms',
12
Added:
#package : 'MyFitnessTracker',
13
Added:
#tag : 'Forms'
14
Added:
}
15
Added:
16
Added:
{ #category : 'as yet unclassified' }
17
Added:
MFTFormComponent class >> formComponentFor: anAttribute [
18
Added:
19
Added:
| formComponents |
20
Added:
formComponents := Dictionary newFrom: {
21
Added:
(#date -> MFTDateFormComponent).
22
Added:
(#setGroups -> MFTSetGroupsFormComponent).
23
Added:
(#primaryMuscleGroup
24
Added:
-> MFTPrimaryMuscleGroupFormComponent).
25
Added:
(#secondaryMuscleGroups
26
Added:
-> MFTSecondaryMuscleGroupsFormComponent) }.
27
Added:
28
Added:
^ formComponents at: anAttribute ifAbsent: [
29
Added:
self error:
30
Added:
('no appropriate {1} subclass for setting attribute "{2}"'
31
Added:
format: {
32
Added:
self.
33
Added:
anAttribute }) ]
34
Added:
]
35
Added:
36
Added:
{ #category : 'as yet unclassified' }
37
Added:
MFTFormComponent class >> set: anAttribute [
38
Added:
39
Added:
| formComponent |
40
Added:
formComponent := self formComponentFor: anAttribute.
41
Added:
^ formComponent new
42
Added:
modelObject: thisContext sender receiver modelObject;
43
Added:
yourself
44
Added:
]
45
Added:
46
Added:
{ #category : 'accessing' }
47
Added:
MFTFormComponent >> heading [
48
Added:
49
Added:
^ heading
50
Added:
]
51
Added:
52
Added:
{ #category : 'accessing' }
53
Added:
MFTFormComponent >> heading: anObject [
54
Added:
55
Added:
heading := anObject
56
Added:
]
57
Added:
58
Added:
{ #category : 'initialization' }
59
Added:
MFTFormComponent >> initialize [
60
Added:
61
Added:
super initialize
62
Added:
]
63
Added:
64
Added:
{ #category : 'accessing' }
65
Added:
MFTFormComponent >> modelObject [
66
Added:
67
Added:
^ modelObject
68
Added:
]
69
Added:
70
Added:
{ #category : 'accessing' }
71
Added:
MFTFormComponent >> modelObject: anObject [
72
Added:
73
Added:
modelObject := anObject
74
Added:
]
75
Added:
76
Added:
{ #category : 'rendering' }
77
Added:
MFTFormComponent >> renderContentOn: html [
78
Added:
79
Added:
self renderFormComponentOn: html with: [ html render: modelObject ]
80
Added:
]
81
Added:
82
Added:
{ #category : 'as yet unclassified' }
83
Added:
MFTFormComponent >> renderFormComponentOn: html with: aBlock [
84
Added:
85
Added:
html formGroup
86
Added:
class: 'my-4';
87
Added:
with: [
88
Added:
html paragraph
89
Added:
heading: 3;
90
Added:
with: [ html text: heading ].
91
Added:
aBlock value ]
92
Added:
]
src/MyFitnessTracker/MFTMainPublicCard.class.st
@@ -11,8 +11,10 @@
11
11
12
12
| newWorkout |
13
13
newWorkout := self session pageManager activePage call:
14
Removed:
MFTWorkoutTask new.
15
Removed:
newWorkout ifNil: [ ^ self ].
14
Added:
MFTWorkoutForm new.
15
Added:
newWorkout
16
Added:
ifNil: [ ^ self ]
17
Added:
ifNotNil: [ self session pageManager setActivePageAt: #logs ].
16
18
17
19
self session user isLoggedIn
18
20
ifTrue: [ self session db insert: newWorkout ]
@@ -28,11 +30,11 @@
28
30
with: [
29
31
html displayHeading
30
32
level: 1;
31
Removed:
with: 'Free Software never looked so fit.'.
33
Added:
with: 'Log, plan, share your workouts.'.
32
34
html heading
33
35
level: 2;
34
36
textMuted;
35
Removed:
with: 'No registration needed to explore my app''s features!'.
37
Added:
with: 'Free Software never looked so fit!'.
36
38
html form: [
37
39
html formButton
38
40
bePrimary;
src/MyFitnessTracker/MFTPrimaryMuscleGroupFormComponent.class.st
@@ -0,0 +1,32 @@
1
Added:
Class {
2
Added:
#name : 'MFTPrimaryMuscleGroupFormComponent',
3
Added:
#superclass : 'MFTFormComponent',
4
Added:
#category : 'MyFitnessTracker-Forms',
5
Added:
#package : 'MyFitnessTracker',
6
Added:
#tag : 'Forms'
7
Added:
}
8
Added:
9
Added:
{ #category : 'initialization' }
10
Added:
MFTPrimaryMuscleGroupFormComponent >> initialize [
11
Added:
12
Added:
super initialize.
13
Added:
heading := 'Primary Group'
14
Added:
]
15
Added:
16
Added:
{ #category : 'rendering' }
17
Added:
MFTPrimaryMuscleGroupFormComponent >> renderContentOn: html [
18
Added:
19
Added:
| allMuscleGroups selectedMuscleGroup |
20
Added:
allMuscleGroups := MFTSQLite3Database allMuscleGroups.
21
Added:
selectedMuscleGroup := modelObject primaryMuscleGroup ifNotNil: [
22
Added:
allMuscleGroups detect: [ :muscleGroup |
23
Added:
muscleGroup englishName
24
Added:
= modelObject primaryMuscleGroup englishName ] ].
25
Added:
26
Added:
self renderFormComponentOn: html with: [
27
Added:
html select formControl
28
Added:
list: allMuscleGroups;
29
Added:
selected: selectedMuscleGroup;
30
Added:
labels: [ :muscleGroup | muscleGroup englishName ];
31
Added:
callback: [ :group | modelObject primaryMuscleGroup: group ] ]
32
Added:
]
src/MyFitnessTracker/MFTSecondaryMuscleGroupsFormComponent.class.st
@@ -0,0 +1,40 @@
1
Added:
Class {
2
Added:
#name : 'MFTSecondaryMuscleGroupsFormComponent',
3
Added:
#superclass : 'MFTFormComponent',
4
Added:
#instVars : [
5
Added:
'allMuscleGroups'
6
Added:
],
7
Added:
#category : 'MyFitnessTracker-Forms',
8
Added:
#package : 'MyFitnessTracker',
9
Added:
#tag : 'Forms'
10
Added:
}
11
Added:
12
Added:
{ #category : 'as yet unclassified' }
13
Added:
MFTSecondaryMuscleGroupsFormComponent >> getSelectedMuscleGroups [
14
Added:
15
Added:
| selectedMuscleGroups |
16
Added:
selectedMuscleGroups := allMuscleGroups select: [ :muscleGroup |
17
Added:
modelObject secondaryMuscleGroupIds
18
Added:
includes: muscleGroup id ].
19
Added:
^ selectedMuscleGroups
20
Added:
]
21
Added:
22
Added:
{ #category : 'initialization' }
23
Added:
MFTSecondaryMuscleGroupsFormComponent >> initialize [
24
Added:
25
Added:
super initialize.
26
Added:
heading := 'Secondary Groups'.
27
Added:
allMuscleGroups := MFTSQLite3Database allMuscleGroups
28
Added:
]
29
Added:
30
Added:
{ #category : 'rendering' }
31
Added:
MFTSecondaryMuscleGroupsFormComponent >> renderContentOn: html [
32
Added:
33
Added:
self renderFormComponentOn: html with: [
34
Added:
html multiSelect formControl
35
Added:
list: allMuscleGroups;
36
Added:
selected: self getSelectedMuscleGroups;
37
Added:
labels: [ :muscleGroup | muscleGroup englishName ];
38
Added:
callback: [ :muscleGroups |
39
Added:
modelObject secondaryMuscleGroups: muscleGroups ] ]
40
Added:
]
src/MyFitnessTracker/MFTSetDialog.class.st
@@ -8,102 +8,3 @@
8
8
#package : 'MyFitnessTracker',
9
9
#tag : 'Dialogs'
10
10
}
11
Removed:
12
Removed:
{ #category : 'actions' }
13
Removed:
MFTSetDialog class >> edit: aMFTSet [
14
Removed:
15
Removed:
^ self new
16
Removed:
set: aMFTSet;
17
Removed:
action: #edit;
18
Removed:
yourself
19
Removed:
]
20
Removed:
21
Removed:
{ #category : 'actions' }
22
Removed:
MFTSetDialog class >> edit: aMFTSet withExercise: aMFTExercise [
23
Removed:
24
Removed:
^ self new
25
Removed:
set: (aMFTSet exercise: aMFTExercise);
26
Removed:
action: #edit;
27
Removed:
yourself
28
Removed:
]
29
Removed:
30
Removed:
{ #category : 'instance creation' }
31
Removed:
MFTSetDialog class >> newForExercise: aMFTExercise [
32
Removed:
33
Removed:
^ self new
34
Removed:
set: (MFTSet new exercise: aMFTExercise);
35
Removed:
subheading: aMFTExercise englishName;
36
Removed:
yourself
37
Removed:
]
38
Removed:
39
Removed:
{ #category : 'initialization' }
40
Removed:
MFTSetDialog >> initialize [
41
Removed:
42
Removed:
super initialize.
43
Removed:
set := MFTSet new reps: 8
44
Removed:
]
45
Removed:
46
Removed:
{ #category : 'rendering' }
47
Removed:
MFTSetDialog >> renderContentOn: html [
48
Removed:
49
Removed:
self renderDialogOn: html with: [
50
Removed:
html table: [
51
Removed:
html tableRow: [
52
Removed:
html tableHeading: 'Reps'.
53
Removed:
html tableData: [
54
Removed:
html numberInput formControl
55
Removed:
value: set reps;
56
Removed:
callback: [ :value | set reps: value asInteger ] ] ].
57
Removed:
html tableRow: [
58
Removed:
html tableHeading: 'Load'.
59
Removed:
html tableData: [
60
Removed:
html numberInput formControl
61
Removed:
value: set load;
62
Removed:
callback: [ :value |
63
Removed:
set load:
64
Removed:
(value ifNotEmpty: [ value asNumber ] ifEmpty: [ nil ]) ] ] ].
65
Removed:
html tableRow: [
66
Removed:
html tableHeading: 'RPE'.
67
Removed:
html tableData: [
68
Removed:
html numberInput formControl
69
Removed:
value: set rpe;
70
Removed:
callback: [ :value |
71
Removed:
set rpe:
72
Removed:
(value ifNotEmpty: [ value asInteger ] ifEmpty: [ nil ]) ] ] ].
73
Removed:
html tableRow: [
74
Removed:
html tableHeading: 'Rest after (s)'.
75
Removed:
html tableData: [
76
Removed:
html numberInput formControl
77
Removed:
value: set restAfter;
78
Removed:
callback: [ :value |
79
Removed:
set restAfter:
80
Removed:
(value ifNotEmpty: [ value asNumber ] ifEmpty: [ nil ]) ] ] ] ] ]
81
Removed:
]
82
Removed:
83
Removed:
{ #category : 'delegation' }
84
Removed:
MFTSetDialog >> renderSubmitOn: html [
85
Removed:
86
Removed:
html buttonGroup: [
87
Removed:
html formButton
88
Removed:
beSubmit;
89
Removed:
bePrimary;
90
Removed:
callback: [ self answer: (set reps ifNotNil: [ set ]) ];
91
Removed:
with: (completion ifNil: [ 'Submit' ] ifNotNil: [ 'Next' ]).
92
Removed:
html formButton
93
Removed:
beSubmit;
94
Removed:
beSecondary;
95
Removed:
callback: [ self answer: nil ];
96
Removed:
with: (completion ifNil: [ 'Cancel' ] ifNotNil: [ 'Skip' ]) ]
97
Removed:
]
98
Removed:
99
Removed:
{ #category : 'accessing' }
100
Removed:
MFTSetDialog >> set [
101
Removed:
102
Removed:
^ set
103
Removed:
]
104
Removed:
105
Removed:
{ #category : 'accessing' }
106
Removed:
MFTSetDialog >> set: anObject [
107
Removed:
108
Removed:
set := anObject
109
Removed:
]
src/MyFitnessTracker/MFTSetGroupDialog.class.st
@@ -11,28 +11,7 @@
11
11
#tag : 'Dialogs'
12
12
}
13
13
14
Removed:
{ #category : 'actions' }
15
Removed:
MFTSetGroupDialog class >> edit: aMFTSetGroup [
16
Removed:
17
Removed:
^ self new
18
Removed:
setGroup: aMFTSetGroup;
19
Removed:
selectedExercises:
20
Removed:
(aMFTSetGroup sets collect: #exercise) asSet asOrderedCollection;
21
Removed:
action: #edit;
22
Removed:
yourself
23
Removed:
]
24
Removed:
25
Removed:
{ #category : 'actions' }
26
Removed:
MFTSetGroupDialog class >> edit: aMFTSetGroup withExercises: aMFTExerciseCollection [
27
Removed:
28
Removed:
^ self new
29
Removed:
setGroup: aMFTSetGroup;
30
Removed:
selectedExercises: aMFTExerciseCollection;
31
Removed:
action: #edit;
32
Removed:
yourself
33
Removed:
]
34
Removed:
35
Removed:
{ #category : 'adding' }
14
Added:
{ #category : 'as yet unclassified' }
36
15
MFTSetGroupDialog >> addSet [
37
16
38
17
| set |
@@ -43,7 +22,7 @@
43
22
setGroup addSet: (set exercise: selectedExercises first)
44
23
]
45
24
46
Removed:
{ #category : 'adding' }
25
Added:
{ #category : 'as yet unclassified' }
47
26
MFTSetGroupDialog >> addSets: aMFTExerciseCollection [
48
27
49
28
| sets |
@@ -54,7 +33,7 @@
54
33
sets ifNotEmpty: [ setGroup addSets: sets ]
55
34
]
56
35
57
Removed:
{ #category : 'actions' }
36
Added:
{ #category : 'as yet unclassified' }
58
37
MFTSetGroupDialog >> editSet: aMFTSet [
59
38
60
39
| oldSet newSet |
@@ -66,7 +45,7 @@
66
45
newSet ifNotNil: [ setGroup updateSet: oldSet with: newSet ]
67
46
]
68
47
69
Removed:
{ #category : 'actions' }
48
Added:
{ #category : 'as yet unclassified' }
70
49
MFTSetGroupDialog >> editSets: aMFTSetCollection [
71
50
72
51
| oldSets newSets |
@@ -88,7 +67,7 @@
88
67
selectedExercises := OrderedCollection with: allExercises first
89
68
]
90
69
91
Removed:
{ #category : 'rendering' }
70
Added:
{ #category : 'as yet unclassified' }
92
71
MFTSetGroupDialog >> makeGiantSet [
93
72
94
73
self heading: 'Giant Sets'.
@@ -97,7 +76,7 @@
97
76
self populateSetsForExercises: selectedExercises
98
77
]
99
78
100
Removed:
{ #category : 'rendering' }
79
Added:
{ #category : 'as yet unclassified' }
101
80
MFTSetGroupDialog >> makeRegularExercise [
102
81
103
82
self heading: 'Sets'.
@@ -105,7 +84,7 @@
105
84
self populateSetsForExercises: selectedExercises
106
85
]
107
86
108
Removed:
{ #category : 'rendering' }
87
Added:
{ #category : 'as yet unclassified' }
109
88
MFTSetGroupDialog >> makeSuperset [
110
89
111
90
self heading: 'Supersets'.
@@ -115,7 +94,7 @@
115
94
self populateSetsForExercises: selectedExercises
116
95
]
117
96
118
Removed:
{ #category : 'rendering' }
97
Added:
{ #category : 'as yet unclassified' }
119
98
MFTSetGroupDialog >> makeTriset [
120
99
121
100
self heading: 'Tri-sets'.
@@ -136,7 +115,7 @@
136
115
exercise: exercise ])
137
116
]
138
117
139
Removed:
{ #category : 'rendering' }
118
Added:
{ #category : 'as yet unclassified' }
140
119
MFTSetGroupDialog >> renderConfigureSetGroupButtonsOn: html [
141
120
142
121
selectedExercises size = 1
@@ -179,7 +158,7 @@
179
158
self renderConfigureSetGroupButtonsOn: html ]
180
159
]
181
160
182
Removed:
{ #category : 'rendering' }
161
Added:
{ #category : 'as yet unclassified' }
183
162
MFTSetGroupDialog >> renderSelectExercisesOn: html [
184
163
185
164
| allSets |
@@ -286,7 +265,7 @@
286
265
self renderSetGroupRowsOn: html ]
287
266
]
288
267
289
Removed:
{ #category : 'rendering' }
268
Added:
{ #category : 'as yet unclassified' }
290
269
MFTSetGroupDialog >> renderSubmitOn: html [
291
270
292
271
html buttonGroup: [
@@ -302,25 +281,25 @@
302
281
with: (completion ifNil: [ 'Cancel' ] ifNotNil: [ 'Skip' ]) ]
303
282
]
304
283
305
Removed:
{ #category : 'accessing' }
284
Added:
{ #category : 'as yet unclassified' }
306
285
MFTSetGroupDialog >> selectedExercises [
307
286
308
287
^ selectedExercises
309
288
]
310
289
311
Removed:
{ #category : 'accessing' }
290
Added:
{ #category : 'as yet unclassified' }
312
291
MFTSetGroupDialog >> selectedExercises: aMFTExerciseCollection [
313
292
314
293
selectedExercises := aMFTExerciseCollection
315
294
]
316
295
317
Removed:
{ #category : 'accessing' }
296
Added:
{ #category : 'as yet unclassified' }
318
297
MFTSetGroupDialog >> setGroup [
319
298
320
299
^ setGroup
321
300
]
322
301
323
Removed:
{ #category : 'accessing' }
302
Added:
{ #category : 'as yet unclassified' }
324
303
MFTSetGroupDialog >> setGroup: anObject [
325
304
326
305
setGroup := anObject
src/MyFitnessTracker/MFTSetGroupForm.class.st
@@ -0,0 +1,144 @@
1
Added:
Class {
2
Added:
#name : 'MFTSetGroupForm',
3
Added:
#superclass : 'MFTForm',
4
Added:
#instVars : [
5
Added:
'exerciseCount',
6
Added:
'renderRpe',
7
Added:
'renderRestAfter'
8
Added:
],
9
Added:
#category : 'MyFitnessTracker-Forms',
10
Added:
#package : 'MyFitnessTracker',
11
Added:
#tag : 'Forms'
12
Added:
}
13
Added:
14
Added:
{ #category : 'as yet unclassified' }
15
Added:
MFTSetGroupForm class >> forExercises: anMFTExerciseCollection [
16
Added:
17
Added:
| setGroup |
18
Added:
setGroup := MFTSetGroup new addSets:
19
Added:
(anMFTExerciseCollection collect: [ :exercise |
20
Added:
MFTSet new
21
Added:
exercise: exercise;
22
Added:
reps: 8 ]).
23
Added:
^ self new
24
Added:
modelObject: setGroup;
25
Added:
exerciseCount: anMFTExerciseCollection size;
26
Added:
yourself
27
Added:
]
28
Added:
29
Added:
{ #category : 'accessing' }
30
Added:
MFTSetGroupForm >> exerciseCount: anInteger [
31
Added:
32
Added:
exerciseCount := anInteger
33
Added:
]
34
Added:
35
Added:
{ #category : 'initialization' }
36
Added:
MFTSetGroupForm >> initialize [
37
Added:
38
Added:
super initialize.
39
Added:
modelObject := MFTSetGroup new addSet: (MFTSet new reps: 8).
40
Added:
heading := 'Sets'.
41
Added:
renderRpe := false.
42
Added:
renderRestAfter := false
43
Added:
]
44
Added:
45
Added:
{ #category : 'rendering' }
46
Added:
MFTSetGroupForm >> renderContentOn: html [
47
Added:
48
Added:
self renderFormOn: html with: [
49
Added:
self renderSetsButtonGroupOn: html.
50
Added:
self renderSetGroupTableOn: html ]
51
Added:
]
52
Added:
53
Added:
{ #category : 'rendering' }
54
Added:
MFTSetGroupForm >> renderSetGroupRowsOn: html [
55
Added:
56
Added:
| selectedExercises renderSetGroupExercisesName |
57
Added:
selectedExercises := modelObject sets collect: #exercise.
58
Added:
renderSetGroupExercisesName := modelObject isIrregularSetGroup.
59
Added:
60
Added:
modelObject sets do: [ :set |
61
Added:
html tableRow: [
62
Added:
renderSetGroupExercisesName ifTrue: [
63
Added:
html tableData with: set exercise englishName capitalized ].
64
Added:
html tableData: [
65
Added:
html numberInput formControl
66
Added:
value: set reps;
67
Added:
callback: [ :value | set reps: value asInteger ] ].
68
Added:
html tableData: [
69
Added:
html numberInput formControl
70
Added:
value: set load;
71
Added:
callback: [ :value |
72
Added:
set load:
73
Added:
(value ifNotEmpty: [ value asNumber ] ifEmpty: [ nil ]) ] ].
74
Added:
renderRpe ifTrue: [
75
Added:
html tableData: [
76
Added:
html numberInput formControl
77
Added:
value: set rpe;
78
Added:
callback: [ :value |
79
Added:
set rpe:
80
Added:
(value ifNotEmpty: [ value asInteger ] ifEmpty: [ nil ]) ] ] ].
81
Added:
renderRestAfter ifTrue: [
82
Added:
html tableData: [
83
Added:
html numberInput formControl
84
Added:
value: set restAfter;
85
Added:
callback: [ :value |
86
Added:
set restAfter:
87
Added:
(value ifNotEmpty: [ value asNumber ] ifEmpty: [ nil ]) ] ] ] ] ]
88
Added:
]
89
Added:
90
Added:
{ #category : 'rendering' }
91
Added:
MFTSetGroupForm >> renderSetGroupTableHeaderOn: html [
92
Added:
93
Added:
html tableHead: [
94
Added:
modelObject isIrregularSetGroup ifTrue: [
95
Added:
html tableHeading with: 'Exercise' ].
96
Added:
html tableHeading with: 'Reps'.
97
Added:
html tableHeading with: 'Load'.
98
Added:
renderRpe ifTrue: [ html tableHeading with: 'RPE' ].
99
Added:
renderRestAfter ifTrue: [ html tableHeading with: 'Rest After (s)' ] ]
100
Added:
]
101
Added:
102
Added:
{ #category : 'rendering' }
103
Added:
MFTSetGroupForm >> renderSetGroupTableOn: html [
104
Added:
105
Added:
html table
106
Added:
class: 'table table-bordered';
107
Added:
with: [
108
Added:
self renderSetGroupTableHeaderOn: html.
109
Added:
self renderSetGroupRowsOn: html ]
110
Added:
]
111
Added:
112
Added:
{ #category : 'rendering' }
113
Added:
MFTSetGroupForm >> renderSetsButtonGroupOn: html [
114
Added:
115
Added:
html buttonGroup
116
Added:
class: 'my-3';
117
Added:
with: [
118
Added:
html outlineButton
119
Added:
bePrimary;
120
Added:
beSmall;
121
Added:
callback: [ modelObject addSets: modelObject sets ];
122
Added:
with: 'Add sets'.
123
Added:
renderRpe ifFalse: [
124
Added:
html outlineButton
125
Added:
beSecondary;
126
Added:
beSmall;
127
Added:
callback: [ renderRpe := true ];
128
Added:
with: 'Add RPE' ].
129
Added:
renderRestAfter ifFalse: [
130
Added:
html outlineButton
131
Added:
beSecondary;
132
Added:
beSmall;
133
Added:
callback: [ renderRestAfter := true ];
134
Added:
with: 'Add rest' ].
135
Added:
html outlineButton
136
Added:
beDanger;
137
Added:
beSmall;
138
Added:
callback: [
139
Added:
| firstSets |
140
Added:
firstSets := modelObject sets first: exerciseCount.
141
Added:
modelObject := MFTSetGroup new addSets: firstSets.
142
Added:
renderRpe := renderRestAfter := false ];
143
Added:
with: 'Reset' ]
144
Added:
]
src/MyFitnessTracker/MFTSetGroupTask.class.st
@@ -0,0 +1,63 @@
1
Added:
Class {
2
Added:
#name : 'MFTSetGroupTask',
3
Added:
#superclass : 'WATask',
4
Added:
#instVars : [
5
Added:
'exercises',
6
Added:
'exerciseCount',
7
Added:
'setGroup'
8
Added:
],
9
Added:
#category : 'MyFitnessTracker-Tasks',
10
Added:
#package : 'MyFitnessTracker',
11
Added:
#tag : 'Tasks'
12
Added:
}
13
Added:
14
Added:
{ #category : 'as yet unclassified' }
15
Added:
MFTSetGroupTask class >> forExerciseCount: anInteger [
16
Added:
17
Added:
^ self new
18
Added:
exerciseCount: anInteger;
19
Added:
yourself
20
Added:
]
21
Added:
22
Added:
{ #category : 'accessing' }
23
Added:
MFTSetGroupTask >> exerciseCount: anObject [
24
Added:
25
Added:
exerciseCount := anObject
26
Added:
]
27
Added:
28
Added:
{ #category : 'accessing' }
29
Added:
MFTSetGroupTask >> exercises [
30
Added:
31
Added:
^ exercises
32
Added:
]
33
Added:
34
Added:
{ #category : 'accessing' }
35
Added:
MFTSetGroupTask >> exercises: anObject [
36
Added:
37
Added:
exercises := anObject
38
Added:
]
39
Added:
40
Added:
{ #category : 'running' }
41
Added:
MFTSetGroupTask >> go [
42
Added:
43
Added:
exercises := self call:
44
Added:
(MFTExercisesForm forExerciseCount: exerciseCount).
45
Added:
exercises ifNil: [ self answer: nil ].
46
Added:
47
Added:
setGroup := self call: (MFTSetGroupForm forExercises: exercises).
48
Added:
setGroup ifNil: [ self answer: nil ].
49
Added:
50
Added:
self answer: setGroup
51
Added:
]
52
Added:
53
Added:
{ #category : 'accessing' }
54
Added:
MFTSetGroupTask >> setGroups [
55
Added:
56
Added:
^ setGroups
57
Added:
]
58
Added:
59
Added:
{ #category : 'accessing' }
60
Added:
MFTSetGroupTask >> setGroups: anObject [
61
Added:
62
Added:
setGroups := anObject
63
Added:
]
src/MyFitnessTracker/MFTSetGroupsDialogOld.class.st
@@ -0,0 +1,179 @@
1
Added:
Class {
2
Added:
#name : 'MFTSetGroupsDialogOld',
3
Added:
#superclass : 'MFTDialog',
4
Added:
#instVars : [
5
Added:
'setGroups'
6
Added:
],
7
Added:
#category : 'MyFitnessTracker-Dialogs',
8
Added:
#package : 'MyFitnessTracker',
9
Added:
#tag : 'Dialogs'
10
Added:
}
11
Added:
12
Added:
{ #category : 'adding' }
13
Added:
MFTSetGroupsDialogOld >> addExercise [
14
Added:
15
Added:
| setGroup |
16
Added:
setGroup := self call: (MFTSetGroupDialog new heading: 'Exercise').
17
Added:
setGroup ifNotNil: [ setGroups add: setGroup ]
18
Added:
]
19
Added:
20
Added:
{ #category : 'rendering' }
21
Added:
MFTSetGroupsDialogOld >> editSetGroup: aMFTSetGroup [
22
Added:
23
Added:
| oldSetGroup newSetGroup |
24
Added:
oldSetGroup := aMFTSetGroup.
25
Added:
newSetGroup := self call: (MFTSetGroupDialog edit: aMFTSetGroup copy).
26
Added:
newSetGroup ifNotNil: [
27
Added:
setGroups at: (setGroups indexOf: oldSetGroup) put: newSetGroup ]
28
Added:
]
29
Added:
30
Added:
{ #category : 'initialization' }
31
Added:
MFTSetGroupsDialogOld >> initialize [
32
Added:
33
Added:
super initialize.
34
Added:
setGroups := OrderedCollection new
35
Added:
]
36
Added:
37
Added:
{ #category : 'rendering' }
38
Added:
MFTSetGroupsDialogOld >> renderAddSetGroupButtonsOn: html [
39
Added:
40
Added:
html outlineButton
41
Added:
bePrimary;
42
Added:
beSmall;
43
Added:
callback: [ self addExercise ];
44
Added:
with: 'Add exercise'
45
Added:
]
46
Added:
47
Added:
{ #category : 'rendering' }
48
Added:
MFTSetGroupsDialogOld >> renderContentOn: html [
49
Added:
50
Added:
self renderDialogOn: html with: [
51
Added:
setGroups ifNotEmpty: [ self renderSetsTableOn: html ].
52
Added:
self renderAddSetGroupButtonsOn: html ]
53
Added:
]
54
Added:
55
Added:
{ #category : 'as yet unclassified' }
56
Added:
MFTSetGroupsDialogOld >> renderLoad [
57
Added:
58
Added:
^ (setGroups flatCollect: #sets) anySatisfy: #hasLoad
59
Added:
]
60
Added:
61
Added:
{ #category : 'as yet unclassified' }
62
Added:
MFTSetGroupsDialogOld >> renderRestAfter [
63
Added:
64
Added:
^ (setGroups flatCollect: #sets) anySatisfy: #hasRestAfter
65
Added:
]
66
Added:
67
Added:
{ #category : 'as yet unclassified' }
68
Added:
MFTSetGroupsDialogOld >> renderRpe [
69
Added:
70
Added:
^ (setGroups flatCollect: #sets) anySatisfy: #hasRpe
71
Added:
]
72
Added:
73
Added:
{ #category : 'as yet unclassified' }
74
Added:
MFTSetGroupsDialogOld >> renderSetGroupButtonsOn: html For: setGroup [
75
Added:
76
Added:
html buttonGroup: [
77
Added:
html outlineButton
78
Added:
beDanger;
79
Added:
beSmall;
80
Added:
callback: [ setGroups remove: setGroup ];
81
Added:
with: 'Remove'.
82
Added:
html outlineButton
83
Added:
beSecondary;
84
Added:
beSmall;
85
Added:
callback: [ self editSetGroup: setGroup ];
86
Added:
with: 'Edit'.
87
Added:
html outlineButton
88
Added:
beSecondary;
89
Added:
beSmall;
90
Added:
callback: [
91
Added:
setGroups add: setGroup afterIndex: (setGroups indexOf: setGroup) ];
92
Added:
with: 'Duplicate' ]
93
Added:
]
94
Added:
95
Added:
{ #category : 'as yet unclassified' }
96
Added:
MFTSetGroupsDialogOld >> renderSetGroupsRowsOn: html [
97
Added:
98
Added:
| renderLoad renderRpe renderRestAfter |
99
Added:
renderLoad := self renderLoad.
100
Added:
renderRpe := self renderRpe.
101
Added:
renderRestAfter := self renderRestAfter.
102
Added:
setGroups do: [ :setGroup |
103
Added:
html tableRow with: [
104
Added:
html tableData
105
Added:
attributeAt: 'rowspan' put: setGroup sets size + 1;
106
Added:
style: 'vertical-align: middle';
107
Added:
with: [ self renderSetGroupButtonsOn: html For: setGroup ] ].
108
Added:
setGroup sets do: [ :set |
109
Added:
html tableRow: [
110
Added:
html tableData: set exercise englishName.
111
Added:
html tableData: set reps.
112
Added:
setGroup hasLoad ifTrue: [ html tableData: set load ].
113
Added:
setGroup hasRpe ifTrue: [ html tableData: set rpe ].
114
Added:
setGroup hasRestAfter ifTrue: [ html tableData: set restAfter ] ] ] ]
115
Added:
]
116
Added:
117
Added:
{ #category : 'as yet unclassified' }
118
Added:
MFTSetGroupsDialogOld >> renderSetGroupsTableHeaderOn: html [
119
Added:
120
Added:
html tableHead: [
121
Added:
html
122
Added:
tableHeading;
123
Added:
tableHeading: 'Exercise';
124
Added:
tableHeading: 'Reps'.
125
Added:
self renderLoad ifTrue: [ html tableHeading: 'Load' ].
126
Added:
self renderRpe ifTrue: [ html tableHeading: 'RPE' ].
127
Added:
self renderRestAfter ifTrue: [ html tableHeading: 'Rest after (s) ' ] ]
128
Added:
]
129
Added:
130
Added:
{ #category : 'as yet unclassified' }
131
Added:
MFTSetGroupsDialogOld >> renderSetsTableHeaderOn: html [
132
Added:
133
Added:
html tableHead: [
134
Added:
html
135
Added:
tableHeading;
136
Added:
tableHeading: 'Exercise';
137
Added:
tableHeading: 'Reps'.
138
Added:
self renderLoad ifTrue: [ html tableHeading: 'Load' ].
139
Added:
self renderRpe ifTrue: [ html tableHeading: 'RPE' ].
140
Added:
self renderRestAfter ifTrue: [ html tableHeading: 'Rest after (s) ' ] ]
141
Added:
]
142
Added:
143
Added:
{ #category : 'as yet unclassified' }
144
Added:
MFTSetGroupsDialogOld >> renderSetsTableOn: html [
145
Added:
146
Added:
html table
147
Added:
class: 'table table-bordered';
148
Added:
with: [
149
Added:
self renderSetGroupsTableHeaderOn: html.
150
Added:
self renderSetGroupsRowsOn: html ]
151
Added:
]
152
Added:
153
Added:
{ #category : 'rendering' }
154
Added:
MFTSetGroupsDialogOld >> renderSubmitOn: html [
155
Added:
156
Added:
html buttonGroup: [
157
Added:
html formButton
158
Added:
beSubmit;
159
Added:
bePrimary;
160
Added:
callback: [ self answer: setGroups ];
161
Added:
with: (completion ifNil: [ 'Submit' ] ifNotNil: [ 'Next' ]).
162
Added:
html formButton
163
Added:
beSubmit;
164
Added:
beSecondary;
165
Added:
callback: [ self answer: OrderedCollection new ];
166
Added:
with: (completion ifNil: [ 'Cancel' ] ifNotNil: [ 'Skip' ]) ]
167
Added:
]
168
Added:
169
Added:
{ #category : 'accessing' }
170
Added:
MFTSetGroupsDialogOld >> setGroups [
171
Added:
172
Added:
^ setGroups
173
Added:
]
174
Added:
175
Added:
{ #category : 'accessing' }
176
Added:
MFTSetGroupsDialogOld >> setGroups: anObject [
177
Added:
178
Added:
setGroups := anObject
179
Added:
]
src/MyFitnessTracker/MFTSetGroupsFormComponent.class.st
@@ -0,0 +1,62 @@
1
Added:
Class {
2
Added:
#name : 'MFTSetGroupsFormComponent',
3
Added:
#superclass : 'MFTFormComponent',
4
Added:
#category : 'MyFitnessTracker-Forms',
5
Added:
#package : 'MyFitnessTracker',
6
Added:
#tag : 'Forms'
7
Added:
}
8
Added:
9
Added:
{ #category : 'adding' }
10
Added:
MFTSetGroupsFormComponent >> addSetGroupsForExerciseCount: anInteger [
11
Added:
12
Added:
| setGroup |
13
Added:
setGroup := self session pageManager activePage call:
14
Added:
(MFTSetGroupTask forExerciseCount: anInteger).
15
Added:
setGroup ifNotNil: [ modelObject addSetGroup: setGroup ]
16
Added:
]
17
Added:
18
Added:
{ #category : 'initialization' }
19
Added:
MFTSetGroupsFormComponent >> initialize [
20
Added:
21
Added:
super initialize.
22
Added:
heading := 'Exercises'
23
Added:
]
24
Added:
25
Added:
{ #category : 'rendering' }
26
Added:
MFTSetGroupsFormComponent >> renderContentOn: html [
27
Added:
28
Added:
self renderFormComponentOn: html with: [
29
Added:
modelObject renderSetGroupsTableOn: html.
30
Added:
self renderSetGroupButtonsOn: html ]
31
Added:
]
32
Added:
33
Added:
{ #category : 'rendering' }
34
Added:
MFTSetGroupsFormComponent >> renderSetGroupButtonsOn: html [
35
Added:
36
Added:
html buttonGroup: [
37
Added:
html outlineButton
38
Added:
bePrimary;
39
Added:
beSmall;
40
Added:
callback: [ self addSetGroupsForExerciseCount: 1 ];
41
Added:
with: 'Add exercise'.
42
Added:
html outlineButton
43
Added:
beSecondary;
44
Added:
beSmall;
45
Added:
callback: [ self addSetGroupsForExerciseCount: 2 ];
46
Added:
with: 'Add superset'.
47
Added:
html outlineButton
48
Added:
beSecondary;
49
Added:
beSmall;
50
Added:
callback: [ self addSetGroupsForExerciseCount: 3 ];
51
Added:
with: 'Add tri-set'.
52
Added:
html outlineButton
53
Added:
beSecondary;
54
Added:
beSmall;
55
Added:
callback: [ self addSetGroupsForExerciseCount: 4 ];
56
Added:
with: 'Add giant set'.
57
Added:
html outlineButton
58
Added:
beDanger;
59
Added:
beSmall;
60
Added:
callback: [ modelObject setGroups removeAll ];
61
Added:
with: 'Remove all' ]
62
Added:
]
src/MyFitnessTracker/MFTSetsDialog.class.st
@@ -8,107 +8,3 @@
8
8
#package : 'MyFitnessTracker',
9
9
#tag : 'Dialogs'
10
10
}
11
Removed:
12
Removed:
{ #category : 'actions' }
13
Removed:
MFTSetsDialog class >> edit: aMFTSetCollection [
14
Removed:
15
Removed:
^ self new
16
Removed:
sets: aMFTSetCollection;
17
Removed:
action: #edit;
18
Removed:
yourself
19
Removed:
]
20
Removed:
21
Removed:
{ #category : 'actions' }
22
Removed:
MFTSetsDialog class >> edit: aMFTSetCollection withExercises: aMFTExerciseCollection [
23
Removed:
24
Removed:
^ self new
25
Removed:
sets: (aMFTSetCollection
26
Removed:
with: aMFTExerciseCollection
27
Removed:
do: [ :set :exercise | set exercise: exercise ]);
28
Removed:
action: #edit;
29
Removed:
yourself
30
Removed:
]
31
Removed:
32
Removed:
{ #category : 'actions' }
33
Removed:
MFTSetsDialog class >> newForExercises: aMFTExerciseCollection [
34
Removed:
35
Removed:
^ self new
36
Removed:
sets: (aMFTExerciseCollection collect: [ :exercise |
37
Removed:
MFTSet new
38
Removed:
reps: 8;
39
Removed:
exercise: exercise ]);
40
Removed:
yourself
41
Removed:
]
42
Removed:
43
Removed:
{ #category : 'initialization' }
44
Removed:
MFTSetsDialog >> initialize [
45
Removed:
46
Removed:
super initialize.
47
Removed:
sets := OrderedCollection new
48
Removed:
]
49
Removed:
50
Removed:
{ #category : 'rendering' }
51
Removed:
MFTSetsDialog >> renderContentOn: html [
52
Removed:
53
Removed:
self renderDialogOn: html with: [
54
Removed:
html table
55
Removed:
class: 'table table-bordered';
56
Removed:
with: [
57
Removed:
html tableRow: [
58
Removed:
html
59
Removed:
tableHeading: 'Exercise';
60
Removed:
tableHeading: 'Reps';
61
Removed:
tableHeading: 'Load';
62
Removed:
tableHeading: 'RPE';
63
Removed:
tableHeading: 'Rest after (s)' ].
64
Removed:
sets do: [ :set |
65
Removed:
html tableRow: [
66
Removed:
html tableData: set exercise englishName.
67
Removed:
html tableData: [
68
Removed:
html numberInput formControl
69
Removed:
value: set reps;
70
Removed:
callback: [ :value | set reps: value asInteger ] ].
71
Removed:
html tableData: [
72
Removed:
html numberInput formControl
73
Removed:
value: set load;
74
Removed:
callback: [ :value |
75
Removed:
value ifNotEmpty: [ set load: value asNumber ] ] ].
76
Removed:
html tableData: [
77
Removed:
html numberInput formControl
78
Removed:
value: set rpe;
79
Removed:
callback: [ :value |
80
Removed:
value ifNotEmpty: [ set rpe: value asInteger ] ] ].
81
Removed:
html tableData: [
82
Removed:
html numberInput formControl
83
Removed:
value: set restAfter;
84
Removed:
callback: [ :value |
85
Removed:
value ifNotEmpty: [ set restAfter: value asNumber ] ] ] ] ] ] ]
86
Removed:
]
87
Removed:
88
Removed:
{ #category : 'delegation' }
89
Removed:
MFTSetsDialog >> renderSubmitOn: html [
90
Removed:
91
Removed:
html buttonGroup: [
92
Removed:
html formButton
93
Removed:
beSubmit;
94
Removed:
bePrimary;
95
Removed:
callback: [ self answer: sets ];
96
Removed:
with: (completion ifNil: [ 'Submit' ] ifNotNil: [ 'Next' ]).
97
Removed:
html formButton
98
Removed:
beSubmit;
99
Removed:
beSecondary;
100
Removed:
callback: [ self answer: OrderedCollection new ];
101
Removed:
with: (completion ifNil: [ 'Cancel' ] ifNotNil: [ 'Skip' ]) ]
102
Removed:
]
103
Removed:
104
Removed:
{ #category : 'accessing' }
105
Removed:
MFTSetsDialog >> sets [
106
Removed:
107
Removed:
^ sets
108
Removed:
]
109
Removed:
110
Removed:
{ #category : 'accessing' }
111
Removed:
MFTSetsDialog >> sets: anObject [
112
Removed:
113
Removed:
sets := anObject
114
Removed:
]
src/MyFitnessTracker/MFTUserTask.class.st
@@ -5,9 +5,9 @@
5
5
'user',
6
6
'action'
7
7
],
8
Removed:
#category : 'MyFitnessTracker-Dialogs',
8
Added:
#category : 'MyFitnessTracker-Tasks',
9
9
#package : 'MyFitnessTracker',
10
Removed:
#tag : 'Dialogs'
10
Added:
#tag : 'Tasks'
11
11
}
12
12
13
13
{ #category : 'actions' }
src/MyFitnessTracker/MFTWorkout.class.st
@@ -49,6 +49,8 @@
49
49
userId: 1;
50
50
date: (Date year: 2024 month: 1 day: 3);
51
51
primaryMuscleGroupId: 6;
52
Added:
secondaryMuscleGroupIds:
53
Added:
(OrderedCollection withAll: { 5. 7 });
52
54
sets:
53
55
(placeholderSets select: [ :set | set workoutId = 3 ]).
54
56
^ OrderedCollection withAll: {
@@ -63,6 +65,12 @@
63
65
setGroups add: aMFTSetGroup
64
66
]
65
67
68
Added:
{ #category : 'adding' }
69
Added:
MFTWorkout >> addSetGroups: aMFTSetGroupCollection [
70
Added:
71
Added:
aMFTSetGroupCollection do: [ :setGroup | setGroups add: setGroup ]
72
Added:
]
73
Added:
66
74
{ #category : 'as yet unclassified' }
67
75
MFTWorkout >> allSetGroupsAreRegular [
68
76
@@ -138,6 +146,12 @@
138
146
]
139
147
140
148
{ #category : 'accessing' }
149
Added:
MFTWorkout >> primaryMuscleGroup: aMFTMuscleGroup [
150
Added:
151
Added:
primaryMuscleGroupId := aMFTMuscleGroup id
152
Added:
]
153
Added:
154
Added:
{ #category : 'accessing' }
141
155
MFTWorkout >> primaryMuscleGroupId [
142
156
143
157
^ primaryMuscleGroupId
@@ -156,16 +170,16 @@
156
170
html
157
171
definitionTerm: 'Date';
158
172
definitionData: date.
159
Removed:
self primaryMuscleGroup ifNotNil: [
173
Added:
primaryMuscleGroupId ifNotNil: [
160
174
html
161
175
definitionTerm: 'Primary Muscle Group';
162
176
definitionData: self primaryMuscleGroup englishName ].
163
Removed:
self secondaryMuscleGroups ifNotEmpty: [
177
Added:
secondaryMuscleGroupIds ifNotEmpty: [
164
178
html
165
179
definitionTerm: 'Secondary Muscle Group';
166
180
definitionData:
167
181
(self secondaryMuscleGroups collect: #englishName) asCommaString ] ].
168
Removed:
setGroups ifNotEmpty: [ self renderSetGroupsTableOn: html ]
182
Added:
self renderSetGroupsTableOn: html
169
183
]
170
184
171
185
{ #category : 'rendering' }
@@ -248,12 +262,13 @@
248
262
{ #category : 'rendering' }
249
263
MFTWorkout >> renderSetGroupsTableOn: html [
250
264
251
Removed:
html table
252
Removed:
class: 'table table-bordered';
253
Removed:
with: [
254
Removed:
self renderSetGroupsTableHeaderOn: html.
255
Removed:
self renderSetGroupRowsOn: html.
256
Removed:
self renderSetGroupsTableFooterOn: html ]
265
Added:
setGroups ifNotEmpty: [
266
Added:
html table
267
Added:
class: 'table table-bordered';
268
Added:
with: [
269
Added:
self renderSetGroupsTableHeaderOn: html.
270
Added:
self renderSetGroupRowsOn: html.
271
Added:
self renderSetGroupsTableFooterOn: html ] ]
257
272
]
258
273
259
274
{ #category : 'accessing' }
@@ -273,6 +288,12 @@
273
288
274
289
^ MFTSQLite3Database allMuscleGroups select: [ :group |
275
290
secondaryMuscleGroupIds includes: group id ]
291
Added:
]
292
Added:
293
Added:
{ #category : 'as yet unclassified' }
294
Added:
MFTWorkout >> secondaryMuscleGroups: aMFTMuscleGroupCollection [
295
Added:
296
Added:
secondaryMuscleGroupIds := aMFTMuscleGroupCollection collect: #id
276
297
]
277
298
278
299
{ #category : 'accessing' }
src/MyFitnessTracker/MFTWorkoutForm.class.st
@@ -0,0 +1,45 @@
1
Added:
Class {
2
Added:
#name : 'MFTWorkoutForm',
3
Added:
#superclass : 'MFTForm',
4
Added:
#category : 'MyFitnessTracker-Forms',
5
Added:
#package : 'MyFitnessTracker',
6
Added:
#tag : 'Forms'
7
Added:
}
8
Added:
9
Added:
{ #category : 'as yet unclassified' }
10
Added:
MFTWorkoutForm class >> edit: aMFTWorkout [
11
Added:
12
Added:
^ self new
13
Added:
modelObject: aMFTWorkout;
14
Added:
yourself
15
Added:
]
16
Added:
17
Added:
{ #category : 'initialization' }
18
Added:
MFTWorkoutForm >> initialize [
19
Added:
20
Added:
super initialize.
21
Added:
modelObject := MFTWorkout new.
22
Added:
heading := 'Workout'
23
Added:
]
24
Added:
25
Added:
{ #category : 'rendering' }
26
Added:
MFTWorkoutForm >> renderContentOn: html [
27
Added:
28
Added:
self renderFormOn: html with: [
29
Added:
html
30
Added:
render: (MFTFormComponent set: #date);
31
Added:
render: (MFTFormComponent set: #setGroups);
32
Added:
render: (MFTFormComponent set: #primaryMuscleGroup);
33
Added:
render: (MFTFormComponent set: #secondaryMuscleGroups) ]
34
Added:
]
35
Added:
36
Added:
{ #category : 'as yet unclassified' }
37
Added:
MFTWorkoutForm >> submitForm [
38
Added:
39
Added:
modelObject setGroups ifEmpty: [
40
Added:
(self call:
41
Added:
(MFTConfirmForm new modelObject: 'No exercises were specified.'))
42
Added:
ifFalse: [ self answer: nil ] ].
43
Added:
44
Added:
self answer: modelObject
45
Added:
]
src/MyFitnessTracker/MFTWorkoutTask.class.st
@@ -5,9 +5,9 @@
5
5
'workout',
6
6
'action'
7
7
],
8
Removed:
#category : 'MyFitnessTracker-Dialogs',
8
Added:
#category : 'MyFitnessTracker-Tasks',
9
9
#package : 'MyFitnessTracker',
10
Removed:
#tag : 'Dialogs'
10
Added:
#tag : 'Tasks'
11
11
}
12
12
13
13
{ #category : 'actions' }
src/MyFitnessTracker/MFTWorkoutsLog.class.st
@@ -36,7 +36,7 @@
36
36
MFTWorkoutsLog >> addWorkout [
37
37
38
38
| newWorkout |
39
Removed:
newWorkout := self call: MFTWorkoutTask new.
39
Added:
newWorkout := self call: MFTWorkoutForm new.
40
40
newWorkout ifNil: [ ^ self ].
41
41
42
42
self session user isLoggedIn
@@ -53,7 +53,7 @@
53
53
{ #category : 'accessing' }
54
54
MFTWorkoutsLog >> confirmDelete: workout [
55
55
56
Removed:
(self call: (MFTConfirmDialog delete: workout)) ifFalse: [ ^ self ].
56
Added:
(self call: (MFTConfirmForm delete)) ifFalse: [ ^ self ].
57
57
self session user isLoggedIn
58
58
ifTrue: [ self session db delete: workout ]
59
59
ifFalse: [ workouts remove: workout ]
@@ -63,7 +63,7 @@
63
63
MFTWorkoutsLog >> editWorkout: oldWorkout [
64
64
65
65
| newWorkout |
66
Removed:
newWorkout := self call: (MFTWorkoutTask edit: oldWorkout copy).
66
Added:
newWorkout := self call: (MFTWorkoutForm edit: oldWorkout copy).
67
67
newWorkout ifNil: [ ^ self ].
68
68
69
69
self session user isLoggedIn