Merge 09ec9e8ef7b4c32594cf86ddcb7242704fb84a03

Commit
1c87f860080fcf33c1789615d84e2c24a2d2e6be
Author
Marius Peter <marius.peter@tutanota.com>
Author date
Committer
Marius Peter <marius.peter@tutanota.com>
Committer date
Changed files
src/MyFitnessTracker/MFTConfirmDialog.class.st
index 2f5a86f4..8fec1951 100644..100644
@@ -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
index 00000000..91076d2d 000000..100644
@@ -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
index 1672ce8e..6d563dd6 100644..100644
@@ -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
index 00000000..651cf557 000000..100644
@@ -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
index dfe778d9..472a5249 100644..100644
@@ -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
index 00000000..070cbb5f 000000..100644
@@ -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
index 00000000..f12a79fc 000000..100644
@@ -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
index 00000000..fa9cbbdd 000000..100644
@@ -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
index aa2297e2..71a1c827 100644..100644
@@ -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
index 00000000..b735a4f9 000000..100644
@@ -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
index 00000000..51d81612 000000..100644
@@ -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
index 37d642a8..1301a587 100644..100644
@@ -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
index 0aa20b27..7af393d2 100644..100644
@@ -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
index 00000000..1002a9e8 000000..100644
@@ -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
index 00000000..05b6ff4c 000000..100644
@@ -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
index 00000000..cb18e1eb 000000..100644
@@ -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
index 00000000..1197d4f4 000000..100644
@@ -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
index f54a9b63..2aff4f3d 100644..100644
@@ -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
index 4cd454bd..14c1f287 100644..100644
@@ -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
index 1233457e..c0617606 100644..100644
@@ -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
index 00000000..df7c09db 000000..100644
@@ -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
index a8435ee3..a081da58 100644..100644
@@ -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
index b819d2ff..766e3844 100644..100644
@@ -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