[Pharo] Personal fitness tracker web app.
Started unification of the many workout dialog steps.
Changed files
- src/MyFitnessTracker/MFTDateDialog.class.st
- src/MyFitnessTracker/MFTDateFormComponent.class.st
- src/MyFitnessTracker/MFTFormComponent.class.st
- src/MyFitnessTracker/MFTLogsPage.class.st
- src/MyFitnessTracker/MFTMainPublicCard.class.st
- src/MyFitnessTracker/MFTSetGroupsDialog.class.st
- src/MyFitnessTracker/MFTSetGroupsDialogOld.class.st
- src/MyFitnessTracker/MFTWorkout.class.st
- src/MyFitnessTracker/MFTWorkoutDialog.class.st
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,39 @@
1
Added:
Class {
2
Added:
#name : 'MFTDateFormComponent',
3
Added:
#superclass : 'MFTFormComponent',
4
Added:
#instVars : [
5
Added:
'date'
6
Added:
],
7
Added:
#category : 'MyFitnessTracker-Forms',
8
Added:
#package : 'MyFitnessTracker',
9
Added:
#tag : 'Forms'
10
Added:
}
11
Added:
12
Added:
{ #category : 'accessing' }
13
Added:
MFTDateFormComponent >> date [
14
Added:
15
Added:
^ date
16
Added:
]
17
Added:
18
Added:
{ #category : 'accessing' }
19
Added:
MFTDateFormComponent >> date: anObject [
20
Added:
21
Added:
date := anObject
22
Added:
]
23
Added:
24
Added:
{ #category : 'initialization' }
25
Added:
MFTDateFormComponent >> initialize [
26
Added:
27
Added:
super initialize.
28
Added:
date := Date today
29
Added:
]
30
Added:
31
Added:
{ #category : 'rendering' }
32
Added:
MFTDateFormComponent >> renderContentOn: html [
33
Added:
34
Added:
self renderDialogOn: html with: [
35
Added:
html dateInput5 formControl
36
Added:
value: date yyyymmdd;
37
Added:
callback: [ :value |
38
Added:
date := Date readFrom: value pattern: 'yyyy-mm-dd' ] ]
39
Added:
]
src/MyFitnessTracker/MFTFormComponent.class.st
@@ -0,0 +1,7 @@
1
Added:
Class {
2
Added:
#name : 'MFTFormComponent',
3
Added:
#superclass : 'SBSComponent',
4
Added:
#category : 'MyFitnessTracker-Forms',
5
Added:
#package : 'MyFitnessTracker',
6
Added:
#tag : 'Forms'
7
Added:
}
src/MyFitnessTracker/MFTLogsPage.class.st
@@ -10,6 +10,12 @@
10
10
#tag : 'Components'
11
11
}
12
12
13
Added:
{ #category : 'hooks' }
14
Added:
MFTLogsPage >> children [
15
Added:
16
Added:
^ logs
17
Added:
]
18
Added:
13
19
{ #category : 'initialization' }
14
20
MFTLogsPage >> initialize [
15
21
src/MyFitnessTracker/MFTMainPublicCard.class.st
@@ -11,7 +11,7 @@
11
11
12
12
| newWorkout |
13
13
newWorkout := self session pageManager activePage call:
14
Removed:
MFTWorkoutTask new.
14
Added:
MFTWorkoutDialog new.
15
15
newWorkout ifNil: [ ^ self ].
16
16
17
17
self session user isLoggedIn
src/MyFitnessTracker/MFTSetGroupsDialog.class.st
@@ -53,104 +53,6 @@
53
53
]
54
54
55
55
{ #category : 'rendering' }
56
Removed:
MFTSetGroupsDialog >> renderLoad [
57
Removed:
58
Removed:
^ (setGroups flatCollect: #sets) anySatisfy: #hasLoad
59
Removed:
]
60
Removed:
61
Removed:
{ #category : 'rendering' }
62
Removed:
MFTSetGroupsDialog >> renderRestAfter [
63
Removed:
64
Removed:
^ (setGroups flatCollect: #sets) anySatisfy: #hasRestAfter
65
Removed:
]
66
Removed:
67
Removed:
{ #category : 'rendering' }
68
Removed:
MFTSetGroupsDialog >> renderRpe [
69
Removed:
70
Removed:
^ (setGroups flatCollect: #sets) anySatisfy: #hasRpe
71
Removed:
]
72
Removed:
73
Removed:
{ #category : 'rendering' }
74
Removed:
MFTSetGroupsDialog >> renderSetGroupButtonsOn: html For: setGroup [
75
Removed:
76
Removed:
html buttonGroup: [
77
Removed:
html outlineButton
78
Removed:
beDanger;
79
Removed:
beSmall;
80
Removed:
callback: [ setGroups remove: setGroup ];
81
Removed:
with: 'Remove'.
82
Removed:
html outlineButton
83
Removed:
beSecondary;
84
Removed:
beSmall;
85
Removed:
callback: [ self editSetGroup: setGroup ];
86
Removed:
with: 'Edit'.
87
Removed:
html outlineButton
88
Removed:
beSecondary;
89
Removed:
beSmall;
90
Removed:
callback: [
91
Removed:
setGroups add: setGroup afterIndex: (setGroups indexOf: setGroup) ];
92
Removed:
with: 'Duplicate' ]
93
Removed:
]
94
Removed:
95
Removed:
{ #category : 'rendering' }
96
Removed:
MFTSetGroupsDialog >> renderSetGroupsRowsOn: html [
97
Removed:
98
Removed:
| renderLoad renderRpe renderRestAfter |
99
Removed:
renderLoad := self renderLoad.
100
Removed:
renderRpe := self renderRpe.
101
Removed:
renderRestAfter := self renderRestAfter.
102
Removed:
setGroups do: [ :setGroup |
103
Removed:
html tableRow with: [
104
Removed:
html tableData
105
Removed:
attributeAt: 'rowspan' put: setGroup sets size + 1;
106
Removed:
style: 'vertical-align: middle';
107
Removed:
with: [ self renderSetGroupButtonsOn: html For: setGroup ] ].
108
Removed:
setGroup sets do: [ :set |
109
Removed:
html tableRow: [
110
Removed:
html tableData: set exercise englishName.
111
Removed:
html tableData: set reps.
112
Removed:
setGroup hasLoad ifTrue: [ html tableData: set load ].
113
Removed:
setGroup hasRpe ifTrue: [ html tableData: set rpe ].
114
Removed:
setGroup hasRestAfter ifTrue: [ html tableData: set restAfter ] ] ] ]
115
Removed:
]
116
Removed:
117
Removed:
{ #category : 'rendering' }
118
Removed:
MFTSetGroupsDialog >> renderSetGroupsTableHeaderOn: html [
119
Removed:
120
Removed:
html tableHead: [
121
Removed:
html
122
Removed:
tableHeading;
123
Removed:
tableHeading: 'Exercise';
124
Removed:
tableHeading: 'Reps'.
125
Removed:
self renderLoad ifTrue: [ html tableHeading: 'Load' ].
126
Removed:
self renderRpe ifTrue: [ html tableHeading: 'RPE' ].
127
Removed:
self renderRestAfter ifTrue: [ html tableHeading: 'Rest after (s) ' ] ]
128
Removed:
]
129
Removed:
130
Removed:
{ #category : 'rendering' }
131
Removed:
MFTSetGroupsDialog >> renderSetsTableHeaderOn: html [
132
Removed:
133
Removed:
html tableHead: [
134
Removed:
html
135
Removed:
tableHeading;
136
Removed:
tableHeading: 'Exercise';
137
Removed:
tableHeading: 'Reps'.
138
Removed:
self renderLoad ifTrue: [ html tableHeading: 'Load' ].
139
Removed:
self renderRpe ifTrue: [ html tableHeading: 'RPE' ].
140
Removed:
self renderRestAfter ifTrue: [ html tableHeading: 'Rest after (s) ' ] ]
141
Removed:
]
142
Removed:
143
Removed:
{ #category : 'rendering' }
144
Removed:
MFTSetGroupsDialog >> renderSetsTableOn: html [
145
Removed:
146
Removed:
html table
147
Removed:
class: 'table table-bordered';
148
Removed:
with: [
149
Removed:
self renderSetGroupsTableHeaderOn: html.
150
Removed:
self renderSetGroupsRowsOn: html ]
151
Removed:
]
152
Removed:
153
Removed:
{ #category : 'rendering' }
154
56
MFTSetGroupsDialog >> renderSubmitOn: html [
155
57
156
58
html buttonGroup: [
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/MFTWorkout.class.st
@@ -138,6 +138,12 @@
138
138
]
139
139
140
140
{ #category : 'accessing' }
141
Added:
MFTWorkout >> primaryMuscleGroup: aMFTMuscleGroup [
142
Added:
143
Added:
primaryMuscleGroupId := aMFTMuscleGroup id
144
Added:
]
145
Added:
146
Added:
{ #category : 'accessing' }
141
147
MFTWorkout >> primaryMuscleGroupId [
142
148
143
149
^ primaryMuscleGroupId
@@ -273,6 +279,12 @@
273
279
274
280
^ MFTSQLite3Database allMuscleGroups select: [ :group |
275
281
secondaryMuscleGroupIds includes: group id ]
282
Added:
]
283
Added:
284
Added:
{ #category : 'as yet unclassified' }
285
Added:
MFTWorkout >> secondaryMuscleGroups: aMFTMuscleGroupCollection [
286
Added:
287
Added:
secondaryMuscleGroupIds := aMFTMuscleGroupCollection collect: #id
276
288
]
277
289
278
290
{ #category : 'accessing' }
src/MyFitnessTracker/MFTWorkoutDialog.class.st
@@ -0,0 +1,216 @@
1
Added:
Class {
2
Added:
#name : 'MFTWorkoutDialog',
3
Added:
#superclass : 'MFTDialog',
4
Added:
#instVars : [
5
Added:
'workout',
6
Added:
'allMuscleGroups'
7
Added:
],
8
Added:
#category : 'MyFitnessTracker-Dialogs',
9
Added:
#package : 'MyFitnessTracker',
10
Added:
#tag : 'Dialogs'
11
Added:
}
12
Added:
13
Added:
{ #category : 'actions' }
14
Added:
MFTWorkoutDialog class >> edit: aString [
15
Added:
16
Added:
^ self new
17
Added:
action: #edit;
18
Added:
string: aString;
19
Added:
yourself
20
Added:
]
21
Added:
22
Added:
{ #category : 'adding' }
23
Added:
MFTWorkoutDialog >> addExercise [
24
Added:
25
Added:
| setGroup |
26
Added:
setGroup := self call: (MFTSetGroupDialog new heading: 'Exercise').
27
Added:
setGroup ifNotNil: [ workout addSetGroup: setGroup ]
28
Added:
]
29
Added:
30
Added:
{ #category : 'initialization' }
31
Added:
MFTWorkoutDialog >> initialize [
32
Added:
33
Added:
super initialize.
34
Added:
workout := MFTWorkout placeholderCollection first.
35
Added:
allMuscleGroups := MFTSQLite3Database allMuscleGroups
36
Added:
]
37
Added:
38
Added:
{ #category : 'adding' }
39
Added:
MFTWorkoutDialog >> renderAddSetsButtonGroupOn: html [
40
Added:
41
Added:
html buttonGroup: [
42
Added:
html outlineButton
43
Added:
bePrimary;
44
Added:
beSmall;
45
Added:
callback: [ self addExercise ];
46
Added:
with: 'Add exercise'.
47
Added:
html outlineButton
48
Added:
beSecondary;
49
Added:
beSmall;
50
Added:
callback: [ self addSuperset ];
51
Added:
with: 'Add superset'.
52
Added:
html outlineButton
53
Added:
beSecondary;
54
Added:
beSmall;
55
Added:
callback: [ self addTriSet ];
56
Added:
with: 'Add tri-set'.
57
Added:
html outlineButton
58
Added:
beSecondary;
59
Added:
beSmall;
60
Added:
callback: [ self addGiantSet ];
61
Added:
with: 'Add giant set' ]
62
Added:
]
63
Added:
64
Added:
{ #category : 'rendering' }
65
Added:
MFTWorkoutDialog >> renderContentOn: html [
66
Added:
67
Added:
self renderDialogOn: html with: [
68
Added:
self renderDatePickerOn: html.
69
Added:
self renderExercisePickerOn: html.
70
Added:
self renderPrimaryMuscleGroupPickerOn: html.
71
Added:
self renderSecondaryMuscleGroupsPickerOn: html ]
72
Added:
]
73
Added:
74
Added:
{ #category : 'rendering' }
75
Added:
MFTWorkoutDialog >> renderDatePickerOn: html [
76
Added:
77
Added:
html formGroup: [
78
Added:
html heading level2 with: 'Date'.
79
Added:
html dateInput5 formControl
80
Added:
value: workout date yyyymmdd;
81
Added:
callback: [ :value |
82
Added:
workout date: (Date readFrom: value pattern: 'yyyy-mm-dd') ] ]
83
Added:
]
84
Added:
85
Added:
{ #category : 'rendering' }
86
Added:
MFTWorkoutDialog >> renderExercisePickerOn: html [
87
Added:
88
Added:
html formGroup: [
89
Added:
html heading level2 with: 'Exercises'.
90
Added:
self renderAddSetsButtonGroupOn: html.
91
Added:
self renderSetsTableOn: html ]
92
Added:
]
93
Added:
94
Added:
{ #category : 'rendering' }
95
Added:
MFTWorkoutDialog >> renderLoad [
96
Added:
97
Added:
^ (workout setGroups flatCollect: #sets) anySatisfy: #hasLoad
98
Added:
]
99
Added:
100
Added:
{ #category : 'rendering' }
101
Added:
MFTWorkoutDialog >> renderPrimaryMuscleGroupPickerOn: html [
102
Added:
103
Added:
html formGroup: [
104
Added:
html heading level3 with: 'Primary Muscle Group'.
105
Added:
html formGroup: [
106
Added:
html select formControl
107
Added:
list: allMuscleGroups;
108
Added:
selected: workout primaryMuscleGroup;
109
Added:
labels: [ :muscleGroup | muscleGroup englishName ];
110
Added:
callback: [ :group | workout primaryMuscleGroup: group ] ] ]
111
Added:
]
112
Added:
113
Added:
{ #category : 'rendering' }
114
Added:
MFTWorkoutDialog >> renderRestAfter [
115
Added:
116
Added:
^ (workout setGroups flatCollect: #sets) anySatisfy: #hasRestAfter
117
Added:
]
118
Added:
119
Added:
{ #category : 'rendering' }
120
Added:
MFTWorkoutDialog >> renderRpe [
121
Added:
122
Added:
^ (workout setGroups flatCollect: #sets) anySatisfy: #hasRpe
123
Added:
]
124
Added:
125
Added:
{ #category : 'rendering' }
126
Added:
MFTWorkoutDialog >> renderSecondaryMuscleGroupsPickerOn: html [
127
Added:
128
Added:
^ html formGroup: [
129
Added:
html heading level3 with: 'Secondary Muscle Groups'.
130
Added:
html multiSelect formControl
131
Added:
list: allMuscleGroups;
132
Added:
selected: workout secondaryMuscleGroups;
133
Added:
labels: [ :muscleGroup | muscleGroup englishName ];
134
Added:
callback: [ :groups | workout secondaryMuscleGroups: groups ] ]
135
Added:
]
136
Added:
137
Added:
{ #category : 'rendering' }
138
Added:
MFTWorkoutDialog >> renderSetGroupButtonsOn: html For: setGroup [
139
Added:
140
Added:
html buttonGroupVertical: [
141
Added:
html outlineButton
142
Added:
beDanger;
143
Added:
beSmall;
144
Added:
callback: [ workout setGroups remove: setGroup ];
145
Added:
with: 'Remove'.
146
Added:
html outlineButton
147
Added:
beSecondary;
148
Added:
beSmall;
149
Added:
callback: [ self editSetGroup: setGroup ];
150
Added:
with: 'Edit'.
151
Added:
html outlineButton
152
Added:
beSecondary;
153
Added:
beSmall;
154
Added:
callback: [
155
Added:
workout setGroups
156
Added:
add: setGroup
157
Added:
afterIndex: (workout setGroups indexOf: setGroup) ];
158
Added:
with: 'Duplicate' ]
159
Added:
]
160
Added:
161
Added:
{ #category : 'rendering' }
162
Added:
MFTWorkoutDialog >> renderSetGroupsRowsOn: html [
163
Added:
164
Added:
workout setGroups do: [ :setGroup |
165
Added:
html tableRow with: [
166
Added:
html tableData
167
Added:
attributeAt: 'rowspan' put: setGroup sets size + 1;
168
Added:
style: 'vertical-align: middle';
169
Added:
with: [ self renderSetGroupButtonsOn: html For: setGroup ] ].
170
Added:
setGroup sets do: [ :set |
171
Added:
html tableRow: [
172
Added:
html tableData: set exercise englishName.
173
Added:
html tableData: set reps.
174
Added:
setGroup hasLoad ifTrue: [ html tableData: set load ].
175
Added:
setGroup hasRpe ifTrue: [ html tableData: set rpe ].
176
Added:
setGroup hasRestAfter ifTrue: [ html tableData: set restAfter ] ] ] ]
177
Added:
]
178
Added:
179
Added:
{ #category : 'rendering' }
180
Added:
MFTWorkoutDialog >> renderSetGroupsTableHeaderOn: html [
181
Added:
182
Added:
html tableHead: [
183
Added:
html
184
Added:
tableHeading;
185
Added:
tableHeading: 'Exercise';
186
Added:
tableHeading: 'Reps'.
187
Added:
self renderLoad ifTrue: [ html tableHeading: 'Load' ].
188
Added:
self renderRpe ifTrue: [ html tableHeading: 'RPE' ].
189
Added:
self renderRestAfter ifTrue: [ html tableHeading: 'Rest after (s) ' ] ]
190
Added:
]
191
Added:
192
Added:
{ #category : 'rendering' }
193
Added:
MFTWorkoutDialog >> renderSetsTableOn: html [
194
Added:
195
Added:
html table
196
Added:
class: 'table table-bordered';
197
Added:
with: [
198
Added:
self renderSetGroupsTableHeaderOn: html.
199
Added:
self renderSetGroupsRowsOn: html ]
200
Added:
]
201
Added:
202
Added:
{ #category : 'rendering' }
203
Added:
MFTWorkoutDialog >> renderSubmitOn: html [
204
Added:
205
Added:
html buttonGroup: [
206
Added:
html formButton
207
Added:
beSubmit;
208
Added:
bePrimary;
209
Added:
callback: [ self answer: workout ];
210
Added:
with: 'Submit'.
211
Added:
html formButton
212
Added:
beSubmit;
213
Added:
beSecondary;
214
Added:
callback: [ self answer: nil ];
215
Added:
with: 'Cancel' ]
216
Added:
]