[Pharo] Personal fitness tracker web app.
Realign architecture with TinyBlog tutorial.
Pass page-switching callbacks to subcomponents as blocks.
Changed files
- src/MyFitnessTracker-Web/MFTActionsComponent.class.st
- src/MyFitnessTracker-Web/MFTHomePage.class.st
- src/MyFitnessTracker-Web/MFTLogWorkoutPage.class.st
- src/MyFitnessTracker-Web/MFTMainActionsComponent.class.st
- src/MyFitnessTracker-Web/MFTNavbarComponent.class.st
- src/MyFitnessTracker-Web/MFTPage.class.st
- src/MyFitnessTracker-Web/MFTPageManager.class.st
- src/MyFitnessTracker-Web/MFTRootComponent.class.st
- src/MyFitnessTracker-Web/MFTScreenComponent.class.st
- src/MyFitnessTracker-Web/MFTSession.class.st
- src/MyFitnessTracker-Web/MFTSetGroupLogEditorComponent.class.st
- src/MyFitnessTracker-Web/MFTSetGroupLogViewerComponent.class.st
- src/MyFitnessTracker-Web/MFTStatusComponent.class.st
- src/MyFitnessTracker-Web/MFTUser.class.st
- src/MyFitnessTracker-Web/MFTWorkoutLogEditorPage.class.st
- src/MyFitnessTracker-Web/MFTWorkoutPrescriptionComponent.class.st
- src/MyFitnessTracker-Web/MFTWorkoutPrescriptionViewerComponent.class.st
src/MyFitnessTracker-Web/MFTActionsComponent.class.st
@@ -1,21 +0,0 @@
1
Removed:
Class {
2
Removed:
#name : 'MFTActionsComponent',
3
Removed:
#superclass : 'WAComponent',
4
Removed:
#category : 'MyFitnessTracker-Web-Components',
5
Removed:
#package : 'MyFitnessTracker-Web',
6
Removed:
#tag : 'Components'
7
Removed:
}
8
Removed:
9
Removed:
{ #category : 'rendering' }
10
Removed:
MFTActionsComponent >> renderContentOn: html [
11
Removed:
12
Removed:
| nextWorkout |
13
Removed:
nextWorkout := self session user nextWorkoutPrescription.
14
Removed:
15
Removed:
html section: [
16
Removed:
html button
17
Removed:
callback: [
18
Removed:
self session pageManager setActivePage:
19
Removed:
(MFTLogWorkoutPage forWorkoutPrescription: nextWorkout) ];
20
Removed:
with: 'Log workout' ]
21
Removed:
]
src/MyFitnessTracker-Web/MFTHomePage.class.st
@@ -4,7 +4,7 @@
4
4
#instVars : [
5
5
'statusComponent',
6
6
'nextWorkoutComponent',
7
Removed:
'mainActionsComponent'
7
Added:
'homePageActionsComponent'
8
8
],
9
9
#category : 'MyFitnessTracker-Web-Components',
10
10
#package : 'MyFitnessTracker-Web',
@@ -16,7 +16,7 @@
16
16
17
17
^ {
18
18
statusComponent.
19
Removed:
mainActionsComponent.
19
Added:
homePageActionsComponent.
20
20
nextWorkoutComponent }
21
21
]
22
22
@@ -25,16 +25,27 @@
25
25
26
26
super initialize.
27
27
statusComponent := MFTStatusComponent new.
28
Removed:
mainActionsComponent := MFTActionsComponent new.
29
Removed:
nextWorkoutComponent := MFTWorkoutPrescriptionComponent new heading:
30
Removed:
'Next workout'
28
Added:
homePageActionsComponent := MFTMainActionsComponent new
29
Added:
onLogWorkout: [
30
Added:
| trainee workoutLog |
31
Added:
trainee := self session user trainee.
32
Added:
workoutLog := self call:
33
Added:
(MFTWorkoutLogEditorPage
34
Added:
forWorkoutPrescription:
35
Added:
trainee
36
Added:
nextWorkoutPrescription).
37
Added:
workoutLog ifNotNil: [
38
Added:
trainee logWorkout: workoutLog ] ];
39
Added:
yourself.
40
Added:
nextWorkoutComponent := MFTWorkoutPrescriptionViewerComponent new
41
Added:
heading: 'Next workout'
31
42
]
32
43
33
44
{ #category : 'rendering' }
34
45
MFTHomePage >> renderContentOn: html [
35
46
36
47
| trainee |
37
Removed:
trainee := self session user.
48
Added:
trainee := self session user trainee.
38
49
nextWorkoutComponent workoutPrescription:
39
50
trainee nextWorkoutPrescription.
40
51
@@ -42,15 +53,10 @@
42
53
html heading
43
54
level: 1;
44
55
with: trainee routine canonicalName capitalized.
45
Removed:
trainee logBook workoutLogs ifNotEmpty: [
46
Removed:
html heading
47
Removed:
level: 2;
48
Removed:
with: 'Plan started '
49
Removed:
, trainee logBook workoutLogs first start asDate asString ].
50
Removed:
51
Removed:
html render: statusComponent.
52
Removed:
html render: mainActionsComponent.
53
Removed:
html render: nextWorkoutComponent ]
56
Added:
html
57
Added:
render: statusComponent;
58
Added:
render: homePageActionsComponent;
59
Added:
render: nextWorkoutComponent ]
54
60
]
55
61
56
62
{ #category : 'accessing' }
src/MyFitnessTracker-Web/MFTLogWorkoutPage.class.st
@@ -1,64 +0,0 @@
1
Removed:
Class {
2
Removed:
#name : 'MFTLogWorkoutPage',
3
Removed:
#superclass : 'MFTPage',
4
Removed:
#instVars : [
5
Removed:
'workoutLog',
6
Removed:
'logWorkoutComponent'
7
Removed:
],
8
Removed:
#category : 'MyFitnessTracker-Web-Components',
9
Removed:
#package : 'MyFitnessTracker-Web',
10
Removed:
#tag : 'Components'
11
Removed:
}
12
Removed:
13
Removed:
{ #category : 'as yet unclassified' }
14
Removed:
MFTLogWorkoutPage class >> forWorkoutLog: aMFTWorkoutLog [
15
Removed:
16
Removed:
^ self new
17
Removed:
workoutLog: aMFTWorkoutLog;
18
Removed:
yourself
19
Removed:
]
20
Removed:
21
Removed:
{ #category : 'as yet unclassified' }
22
Removed:
MFTLogWorkoutPage class >> forWorkoutPrescription: aMFTWorkoutPrescription [
23
Removed:
24
Removed:
^ self new
25
Removed:
workoutLog:
26
Removed:
(MFTWorkoutLog forPrescription: aMFTWorkoutPrescription);
27
Removed:
yourself
28
Removed:
]
29
Removed:
30
Removed:
{ #category : 'as yet unclassified' }
31
Removed:
MFTLogWorkoutPage >> children [
32
Removed:
33
Removed:
^ { logWorkoutComponent }
34
Removed:
]
35
Removed:
36
Removed:
{ #category : 'initialization' }
37
Removed:
MFTLogWorkoutPage >> initialize [
38
Removed:
39
Removed:
super initialize.
40
Removed:
logWorkoutComponent := MFTWorkoutPrescriptionComponent new
41
Removed:
]
42
Removed:
43
Removed:
{ #category : 'rendering' }
44
Removed:
MFTLogWorkoutPage >> renderContentOn: html [
45
Removed:
46
Removed:
self renderPageOn: html with: [
47
Removed:
html heading
48
Removed:
level: 1;
49
Removed:
with: 'Log Workout'.
50
Removed:
html render: logWorkoutComponent ]
51
Removed:
]
52
Removed:
53
Removed:
{ #category : 'accessing' }
54
Removed:
MFTLogWorkoutPage >> title [
55
Removed:
56
Removed:
^ 'Log workout'
57
Removed:
]
58
Removed:
59
Removed:
{ #category : 'as yet unclassified' }
60
Removed:
MFTLogWorkoutPage >> workoutLog: aMFTWorkoutLog [
61
Removed:
62
Removed:
workoutLog := aMFTWorkoutLog.
63
Removed:
logWorkoutComponent workoutLog: aMFTWorkoutLog
64
Removed:
]
src/MyFitnessTracker-Web/MFTMainActionsComponent.class.st
@@ -0,0 +1,26 @@
1
Added:
Class {
2
Added:
#name : 'MFTMainActionsComponent',
3
Added:
#superclass : 'WAComponent',
4
Added:
#instVars : [
5
Added:
'onLogWorkout'
6
Added:
],
7
Added:
#category : 'MyFitnessTracker-Web-Components',
8
Added:
#package : 'MyFitnessTracker-Web',
9
Added:
#tag : 'Components'
10
Added:
}
11
Added:
12
Added:
{ #category : 'accessing' }
13
Added:
MFTMainActionsComponent >> onLogWorkout: aBlock [
14
Added:
15
Added:
onLogWorkout := aBlock
16
Added:
]
17
Added:
18
Added:
{ #category : 'rendering' }
19
Added:
MFTMainActionsComponent >> renderContentOn: html [
20
Added:
21
Added:
html section: [
22
Added:
html form: [
23
Added:
html submitButton
24
Added:
callback: [ onLogWorkout value ];
25
Added:
with: 'Log workout' ] ]
26
Added:
]
src/MyFitnessTracker-Web/MFTNavbarComponent.class.st
@@ -1,22 +1,27 @@
1
1
Class {
2
2
#name : 'MFTNavbarComponent',
3
3
#superclass : 'WAComponent',
4
Added:
#instVars : [
5
Added:
'onHome'
6
Added:
],
4
7
#category : 'MyFitnessTracker-Web-Components',
5
8
#package : 'MyFitnessTracker-Web',
6
9
#tag : 'Components'
7
10
}
8
11
12
Added:
{ #category : 'accessing' }
13
Added:
MFTNavbarComponent >> onHome: aBlock [
14
Added:
15
Added:
onHome := aBlock
16
Added:
]
17
Added:
9
18
{ #category : 'rendering' }
10
19
MFTNavbarComponent >> renderContentOn: html [
11
20
12
Removed:
| pm |
13
Removed:
pm := self session pageManager.
14
Removed:
15
21
html navigation: [
16
22
html unorderedList: [
17
Removed:
pm mainPages collect: [ :page |
18
Removed:
html listItem: [
19
Removed:
html anchor
20
Removed:
callback: [ pm setActivePage: page ];
21
Removed:
with: page title ] ] ] ]
23
Added:
html listItem: [
24
Added:
html anchor
25
Added:
callback: [ onHome value ];
26
Added:
with: 'Home' ] ] ]
22
27
]
src/MyFitnessTracker-Web/MFTPage.class.st
@@ -14,10 +14,7 @@
14
14
15
15
html div
16
16
id: 'content';
17
Removed:
with: [
18
Removed:
html div
19
Removed:
id: 'notebook-paper';
20
Removed:
with: aBlock ]
17
Added:
with: aBlock
21
18
]
22
19
23
20
{ #category : 'accessing' }
src/MyFitnessTracker-Web/MFTPageManager.class.st
@@ -1,68 +0,0 @@
1
Removed:
Class {
2
Removed:
#name : 'MFTPageManager',
3
Removed:
#superclass : 'Object',
4
Removed:
#instVars : [
5
Removed:
'activePage',
6
Removed:
'navbar',
7
Removed:
'footer'
8
Removed:
],
9
Removed:
#category : 'MyFitnessTracker-Web-Base',
10
Removed:
#package : 'MyFitnessTracker-Web',
11
Removed:
#tag : 'Base'
12
Removed:
}
13
Removed:
14
Removed:
{ #category : 'accessing' }
15
Removed:
MFTPageManager >> activePage [
16
Removed:
17
Removed:
^ activePage
18
Removed:
]
19
Removed:
20
Removed:
{ #category : 'accessing' }
21
Removed:
MFTPageManager >> activePage: aMFTPage [
22
Removed:
23
Removed:
activePage := aMFTPage
24
Removed:
]
25
Removed:
26
Removed:
{ #category : 'accessing' }
27
Removed:
MFTPageManager >> footer [
28
Removed:
29
Removed:
^ footer
30
Removed:
]
31
Removed:
32
Removed:
{ #category : 'accessing' }
33
Removed:
MFTPageManager >> footer: anObject [
34
Removed:
35
Removed:
footer := anObject
36
Removed:
]
37
Removed:
38
Removed:
{ #category : 'initialization' }
39
Removed:
MFTPageManager >> initialize [
40
Removed:
41
Removed:
activePage := MFTHomePage new.
42
Removed:
navbar := MFTNavbarComponent new.
43
Removed:
footer := MFTFooterComponent new
44
Removed:
]
45
Removed:
46
Removed:
{ #category : 'accessing' }
47
Removed:
MFTPageManager >> mainPages [
48
Removed:
49
Removed:
^ { MFTHomePage new }
50
Removed:
]
51
Removed:
52
Removed:
{ #category : 'accessing' }
53
Removed:
MFTPageManager >> navbar [
54
Removed:
55
Removed:
^ navbar
56
Removed:
]
57
Removed:
58
Removed:
{ #category : 'accessing' }
59
Removed:
MFTPageManager >> navbar: aNavbar [
60
Removed:
61
Removed:
navbar := aNavbar
62
Removed:
]
63
Removed:
64
Removed:
{ #category : 'accessing' }
65
Removed:
MFTPageManager >> setActivePage: aMFTPage [
66
Removed:
67
Removed:
activePage := aMFTPage
68
Removed:
]
src/MyFitnessTracker-Web/MFTRootComponent.class.st
@@ -2,7 +2,7 @@
2
2
#name : 'MFTRootComponent',
3
3
#superclass : 'WAComponent',
4
4
#instVars : [
5
Removed:
'pageManager'
5
Added:
'main'
6
6
],
7
7
#category : 'MyFitnessTracker-Web-Components',
8
8
#package : 'MyFitnessTracker-Web',
@@ -27,26 +27,20 @@
27
27
{ #category : 'hooks' }
28
28
MFTRootComponent >> children [
29
29
30
Removed:
^ {
31
Removed:
pageManager navbar.
32
Removed:
pageManager activePage.
33
Removed:
pageManager footer }
30
Added:
^ { main }
34
31
]
35
32
36
33
{ #category : 'initialization' }
37
34
MFTRootComponent >> initialize [
38
35
39
36
super initialize.
40
Removed:
pageManager := self session pageManager
37
Added:
main := MFTScreenComponent new
41
38
]
42
39
43
40
{ #category : 'rendering' }
44
41
MFTRootComponent >> renderContentOn: html [
45
42
46
Removed:
html
47
Removed:
render: pageManager navbar;
48
Removed:
render: pageManager activePage;
49
Removed:
render: pageManager footer
43
Added:
html render: main
50
44
]
51
45
52
46
{ #category : 'updating' }
@@ -57,7 +51,7 @@
57
51
aRoot meta
58
52
name: 'viewport';
59
53
content: 'width=device-width, initial-scale=1'.
60
Removed:
aRoot title: 'MFT ' , self session pageManager activePage title.
54
Added:
aRoot title: 'MFT ' , main activePage title.
61
55
aRoot link
62
56
beShortcutIcon;
63
57
url: MFTFileLibrary / #faviconPng.
src/MyFitnessTracker-Web/MFTScreenComponent.class.st
@@ -0,0 +1,74 @@
1
Added:
Class {
2
Added:
#name : 'MFTScreenComponent',
3
Added:
#superclass : 'WAComponent',
4
Added:
#instVars : [
5
Added:
'activePage',
6
Added:
'navbar',
7
Added:
'footer'
8
Added:
],
9
Added:
#category : 'MyFitnessTracker-Web-Components',
10
Added:
#package : 'MyFitnessTracker-Web',
11
Added:
#tag : 'Components'
12
Added:
}
13
Added:
14
Added:
{ #category : 'accessing' }
15
Added:
MFTScreenComponent >> activePage [
16
Added:
17
Added:
^ activePage
18
Added:
]
19
Added:
20
Added:
{ #category : 'accessing' }
21
Added:
MFTScreenComponent >> activePage: aMFTPage [
22
Added:
23
Added:
activePage := aMFTPage
24
Added:
]
25
Added:
26
Added:
{ #category : 'accessing' }
27
Added:
MFTScreenComponent >> children [
28
Added:
29
Added:
^ {
30
Added:
navbar.
31
Added:
activePage.
32
Added:
footer }
33
Added:
]
34
Added:
35
Added:
{ #category : 'accessing' }
36
Added:
MFTScreenComponent >> footer [
37
Added:
38
Added:
^ footer
39
Added:
]
40
Added:
41
Added:
{ #category : 'accessing' }
42
Added:
MFTScreenComponent >> footer: anObject [
43
Added:
44
Added:
footer := anObject
45
Added:
]
46
Added:
47
Added:
{ #category : 'initialization' }
48
Added:
MFTScreenComponent >> initialize [
49
Added:
50
Added:
super initialize.
51
Added:
activePage := MFTHomePage new.
52
Added:
navbar := MFTNavbarComponent new
53
Added:
onHome: [ self showHome ];
54
Added:
yourself.
55
Added:
footer := MFTFooterComponent new
56
Added:
]
57
Added:
58
Added:
{ #category : 'accessing' }
59
Added:
MFTScreenComponent >> navbar [
60
Added:
61
Added:
^ navbar
62
Added:
]
63
Added:
64
Added:
{ #category : 'accessing' }
65
Added:
MFTScreenComponent >> navbar: aNavbar [
66
Added:
67
Added:
navbar := aNavbar
68
Added:
]
69
Added:
70
Added:
{ #category : 'initialization' }
71
Added:
MFTScreenComponent >> showHome [
72
Added:
73
Added:
self activePage: MFTHomePage new
74
Added:
]
src/MyFitnessTracker-Web/MFTSession.class.st
@@ -3,7 +3,6 @@
3
3
#superclass : 'WASession',
4
4
#instVars : [
5
5
'user',
6
Removed:
'pageManager',
7
6
'glorpSession'
8
7
],
9
8
#category : 'MyFitnessTracker-Web-Base',
@@ -23,27 +22,14 @@
23
22
super initialize.
24
23
"glorpSession := MFTDescriptorSystem sessionForDefaultLogin."
25
24
"glorpSession login."
26
Removed:
user := MFTTrainee newDefault.
27
Removed:
pageManager := MFTPageManager new
25
Added:
user := MFTUser newDefault
28
26
]
29
27
30
28
{ #category : 'parent/child' }
31
29
MFTSession >> logout [
30
Added:
"glorpSession connection close."
32
31
33
Removed:
glorpSession connection close.
34
Removed:
user := MFTTrainee newDefault
35
Removed:
]
36
Removed:
37
Removed:
{ #category : 'accessing' }
38
Removed:
MFTSession >> pageManager [
39
Removed:
40
Removed:
^ pageManager
41
Removed:
]
42
Removed:
43
Removed:
{ #category : 'accessing' }
44
Removed:
MFTSession >> pageManager: aMFTPageManager [
45
Removed:
46
Removed:
pageManager := aMFTPageManager
32
Added:
user := MFTUser newDefault
47
33
]
48
34
49
35
{ #category : 'parent/child' }
src/MyFitnessTracker-Web/MFTSetGroupLogEditorComponent.class.st
@@ -0,0 +1,70 @@
1
Added:
Class {
2
Added:
#name : 'MFTSetGroupLogEditorComponent',
3
Added:
#superclass : 'WAComponent',
4
Added:
#instVars : [
5
Added:
'setGroupLog'
6
Added:
],
7
Added:
#category : 'MyFitnessTracker-Web-Components',
8
Added:
#package : 'MyFitnessTracker-Web',
9
Added:
#tag : 'Components'
10
Added:
}
11
Added:
12
Added:
{ #category : 'as yet unclassified' }
13
Added:
MFTSetGroupLogEditorComponent class >> forSetGroupLog: aMFTSetGroupLog [
14
Added:
15
Added:
^ self new
16
Added:
setGroupLog: aMFTSetGroupLog;
17
Added:
yourself
18
Added:
]
19
Added:
20
Added:
{ #category : 'rendering' }
21
Added:
MFTSetGroupLogEditorComponent >> renderContentOn: html [
22
Added:
23
Added:
html fieldSet: [
24
Added:
setGroupLog sets do: [ :setLog |
25
Added:
self renderSetLogEditorOn: html setLog: setLog ].
26
Added:
html submitButton
27
Added:
callback: [ self answer: setGroupLog ];
28
Added:
with: 'Save' ]
29
Added:
]
30
Added:
31
Added:
{ #category : 'rendering' }
32
Added:
MFTSetGroupLogEditorComponent >> renderSetLogEditorOn: html setLog: setLog [
33
Added:
34
Added:
html heading
35
Added:
level: 4;
36
Added:
with: setLog exercise canonicalName capitalized.
37
Added:
38
Added:
html div
39
Added:
class: 'mft-form-items-container';
40
Added:
with: [
41
Added:
html label: 'Reps'.
42
Added:
html numberInput
43
Added:
value: setLog reps;
44
Added:
callback: [ :value |
45
Added:
value ifNotEmpty: [ setLog reps: value asNumber ] ] ].
46
Added:
47
Added:
html div
48
Added:
class: 'mft-form-items-container';
49
Added:
with: [
50
Added:
html label: 'Load'.
51
Added:
html numberInput
52
Added:
value: setLog load;
53
Added:
callback: [ :value |
54
Added:
value ifNotEmpty: [ setLog load: value asNumber ] ] ].
55
Added:
56
Added:
html div
57
Added:
class: 'mft-form-items-container';
58
Added:
with: [
59
Added:
html checkbox
60
Added:
value: setLog failureAchieved;
61
Added:
callback: [ :value |
62
Added:
value ifNotNil: [ setLog failureAchieved: value ] ].
63
Added:
html label: 'Failure achieved' ]
64
Added:
]
65
Added:
66
Added:
{ #category : 'accessing' }
67
Added:
MFTSetGroupLogEditorComponent >> setGroupLog: aMFTSetGroupLog [
68
Added:
69
Added:
setGroupLog := aMFTSetGroupLog
70
Added:
]
src/MyFitnessTracker-Web/MFTSetGroupLogViewerComponent.class.st
@@ -0,0 +1,79 @@
1
Added:
Class {
2
Added:
#name : 'MFTSetGroupLogViewerComponent',
3
Added:
#superclass : 'WAComponent',
4
Added:
#instVars : [
5
Added:
'setGroupLog'
6
Added:
],
7
Added:
#category : 'MyFitnessTracker-Web-Components',
8
Added:
#package : 'MyFitnessTracker-Web',
9
Added:
#tag : 'Components'
10
Added:
}
11
Added:
12
Added:
{ #category : 'as yet unclassified' }
13
Added:
MFTSetGroupLogViewerComponent class >> forSetGroupLog: aMFTSetGroupLog [
14
Added:
15
Added:
^ self new
16
Added:
setGroupLog: aMFTSetGroupLog;
17
Added:
yourself
18
Added:
]
19
Added:
20
Added:
{ #category : 'rendering' }
21
Added:
MFTSetGroupLogViewerComponent >> renderContentOn: html [
22
Added:
23
Added:
| completelyLogged buttonLabel |
24
Added:
completelyLogged := setGroupLog isCompletelyLogged.
25
Added:
buttonLabel := completelyLogged
26
Added:
ifTrue: [ 'Edit' ]
27
Added:
ifFalse: [ 'Log' ].
28
Added:
29
Added:
html fieldSet: [
30
Added:
completelyLogged
31
Added:
ifTrue: [ self renderSetGroupLogDataOn: html ]
32
Added:
ifFalse: [ self renderSetGroupLogExercisesOn: html ].
33
Added:
html anchor
34
Added:
callback: [
35
Added:
| editedLog |
36
Added:
editedLog := self call:
37
Added:
(MFTSetGroupLogEditorComponent forSetGroupLog:
38
Added:
setGroupLog).
39
Added:
editedLog ifNotNil: [ setGroupLog := editedLog ] ];
40
Added:
with: buttonLabel ]
41
Added:
]
42
Added:
43
Added:
{ #category : 'rendering' }
44
Added:
MFTSetGroupLogViewerComponent >> renderSetGroupLogDataOn: html [
45
Added:
46
Added:
setGroupLog sets do: [ :setLog |
47
Added:
html heading
48
Added:
level: 4;
49
Added:
with: setLog exercise canonicalName capitalized.
50
Added:
html table: [
51
Added:
html tableBody: [
52
Added:
html tableRow: [
53
Added:
html
54
Added:
tableData: 'Reps';
55
Added:
tableData: setLog reps ].
56
Added:
html tableRow: [
57
Added:
html
58
Added:
tableData: 'Load';
59
Added:
tableData: setLog load ].
60
Added:
html tableRow: [
61
Added:
html
62
Added:
tableData: 'Failure achieved';
63
Added:
tableData: setLog failureAchieved ] ] ] ]
64
Added:
]
65
Added:
66
Added:
{ #category : 'rendering' }
67
Added:
MFTSetGroupLogViewerComponent >> renderSetGroupLogExercisesOn: html [
68
Added:
69
Added:
html heading
70
Added:
level: 4;
71
Added:
with: ((setGroupLog sets collect: #exercise) joinUsing: ', ')
72
Added:
asCapitalizedPhrase
73
Added:
]
74
Added:
75
Added:
{ #category : 'accessing' }
76
Added:
MFTSetGroupLogViewerComponent >> setGroupLog: aMFTSetGroupLog [
77
Added:
78
Added:
setGroupLog := aMFTSetGroupLog
79
Added:
]
src/MyFitnessTracker-Web/MFTStatusComponent.class.st
@@ -10,7 +10,7 @@
10
10
MFTStatusComponent >> renderContentOn: html [
11
11
12
12
| trainee |
13
Removed:
trainee := self session user.
13
Added:
trainee := self session user trainee.
14
14
15
15
html section: [
16
16
html definitionList: [
src/MyFitnessTracker-Web/MFTUser.class.st
@@ -0,0 +1,30 @@
1
Added:
Class {
2
Added:
#name : 'MFTUser',
3
Added:
#superclass : 'Object',
4
Added:
#instVars : [
5
Added:
'trainee'
6
Added:
],
7
Added:
#category : 'MyFitnessTracker-Web-Base',
8
Added:
#package : 'MyFitnessTracker-Web',
9
Added:
#tag : 'Base'
10
Added:
}
11
Added:
12
Added:
{ #category : 'instance creation' }
13
Added:
MFTUser class >> newDefault [
14
Added:
15
Added:
^ self new
16
Added:
trainee: MFTTrainee newDefault;
17
Added:
yourself
18
Added:
]
19
Added:
20
Added:
{ #category : 'accessing' }
21
Added:
MFTUser >> trainee [
22
Added:
23
Added:
^ trainee
24
Added:
]
25
Added:
26
Added:
{ #category : 'accessing' }
27
Added:
MFTUser >> trainee: aMFTTrainee [
28
Added:
29
Added:
trainee := aMFTTrainee
30
Added:
]
src/MyFitnessTracker-Web/MFTWorkoutLogEditorPage.class.st
@@ -0,0 +1,128 @@
1
Added:
Class {
2
Added:
#name : 'MFTWorkoutLogEditorPage',
3
Added:
#superclass : 'MFTPage',
4
Added:
#instVars : [
5
Added:
'workoutLog',
6
Added:
'setGroupLogComponents'
7
Added:
],
8
Added:
#category : 'MyFitnessTracker-Web-Components',
9
Added:
#package : 'MyFitnessTracker-Web',
10
Added:
#tag : 'Components'
11
Added:
}
12
Added:
13
Added:
{ #category : 'as yet unclassified' }
14
Added:
MFTWorkoutLogEditorPage class >> forWorkoutLog: aMFTWorkoutLog [
15
Added:
16
Added:
^ self new
17
Added:
workoutLog: aMFTWorkoutLog;
18
Added:
yourself
19
Added:
]
20
Added:
21
Added:
{ #category : 'as yet unclassified' }
22
Added:
MFTWorkoutLogEditorPage class >> forWorkoutPrescription: aMFTWorkoutPrescription [
23
Added:
24
Added:
| workoutLog |
25
Added:
workoutLog := MFTWorkoutLog forPrescription: aMFTWorkoutPrescription.
26
Added:
workoutLog start ifNil: [ workoutLog startNow ].
27
Added:
workoutLog finish ifNil: [ workoutLog finish: workoutLog start ].
28
Added:
29
Added:
^ self forWorkoutLog: workoutLog
30
Added:
]
31
Added:
32
Added:
{ #category : 'as yet unclassified' }
33
Added:
MFTWorkoutLogEditorPage >> children [
34
Added:
35
Added:
^ setGroupLogComponents
36
Added:
]
37
Added:
38
Added:
{ #category : 'initialization' }
39
Added:
MFTWorkoutLogEditorPage >> initialize [
40
Added:
41
Added:
super initialize.
42
Added:
setGroupLogComponents := OrderedCollection new
43
Added:
]
44
Added:
45
Added:
{ #category : 'rendering' }
46
Added:
MFTWorkoutLogEditorPage >> renderContentOn: html [
47
Added:
48
Added:
self renderPageOn: html with: [
49
Added:
html heading
50
Added:
level: 1;
51
Added:
with: 'Log Workout'.
52
Added:
html heading
53
Added:
level: 2;
54
Added:
with: workoutLog prescription canonicalName.
55
Added:
html form: [
56
Added:
self renderWorkoutLogMetadataOn: html.
57
Added:
setGroupLogComponents do: [ :each | html render: each ].
58
Added:
self renderFormActionsOn: html ] ]
59
Added:
]
60
Added:
61
Added:
{ #category : 'rendering' }
62
Added:
MFTWorkoutLogEditorPage >> renderFormActionsOn: html [
63
Added:
64
Added:
html submitButton
65
Added:
callback: [ self answer: workoutLog ];
66
Added:
with: 'Save workout'.
67
Added:
68
Added:
html submitButton
69
Added:
callback: [ self answer: nil ];
70
Added:
with: 'Discard workout'
71
Added:
]
72
Added:
73
Added:
{ #category : 'rendering' }
74
Added:
MFTWorkoutLogEditorPage >> renderWorkoutLogMetadataOn: html [
75
Added:
76
Added:
^ html fieldSet with: [
77
Added:
html div
78
Added:
class: 'mft-form-items-container';
79
Added:
with: [
80
Added:
html label
81
Added:
for: 'start-date';
82
Added:
with: 'Start'.
83
Added:
html span: [
84
Added:
html dateInput5
85
Added:
id: 'start-date';
86
Added:
value: Date today yyyymmdd;
87
Added:
callback: [ :value |
88
Added:
workoutLog startDate:
89
Added:
(Date readFrom: value pattern: 'yyyy-mm-dd') ].
90
Added:
html timeInput5
91
Added:
id: 'start-time';
92
Added:
value: workoutLog start asTime print24;
93
Added:
callback: [ :value |
94
Added:
workoutLog startTime: (Time fromString: value) ] ] ].
95
Added:
html div
96
Added:
class: 'mft-form-items-container';
97
Added:
with: [
98
Added:
html label
99
Added:
for: 'finish-date';
100
Added:
with: 'Finish'.
101
Added:
html span: [
102
Added:
html dateInput5
103
Added:
id: 'finish-date';
104
Added:
value: Date today yyyymmdd;
105
Added:
callback: [ :value |
106
Added:
workoutLog finishDate:
107
Added:
(Date readFrom: value pattern: 'yyyy-mm-dd') ].
108
Added:
html timeInput5
109
Added:
id: 'finish-time';
110
Added:
callback: [ :value |
111
Added:
value ifNotEmpty: [
112
Added:
workoutLog finishTime: (Time fromString: value) ] ] ] ] ]
113
Added:
]
114
Added:
115
Added:
{ #category : 'accessing' }
116
Added:
MFTWorkoutLogEditorPage >> title [
117
Added:
118
Added:
^ 'Log workout'
119
Added:
]
120
Added:
121
Added:
{ #category : 'accessing' }
122
Added:
MFTWorkoutLogEditorPage >> workoutLog: aMFTWorkoutLog [
123
Added:
124
Added:
workoutLog := aMFTWorkoutLog.
125
Added:
setGroupLogComponents := workoutLog setGroups collect: [ :setGroupLog |
126
Added:
MFTSetGroupLogViewerComponent forSetGroupLog:
127
Added:
setGroupLog ]
128
Added:
]
src/MyFitnessTracker-Web/MFTWorkoutPrescriptionComponent.class.st
@@ -1,39 +0,0 @@
1
Removed:
Class {
2
Removed:
#name : 'MFTWorkoutPrescriptionComponent',
3
Removed:
#superclass : 'WAComponent',
4
Removed:
#instVars : [
5
Removed:
'heading',
6
Removed:
'workoutPrescription'
7
Removed:
],
8
Removed:
#category : 'MyFitnessTracker-Web-Components',
9
Removed:
#package : 'MyFitnessTracker-Web',
10
Removed:
#tag : 'Components'
11
Removed:
}
12
Removed:
13
Removed:
{ #category : 'accessing' }
14
Removed:
MFTWorkoutPrescriptionComponent >> heading: aString [
15
Removed:
16
Removed:
heading := aString
17
Removed:
]
18
Removed:
19
Removed:
{ #category : 'rendering' }
20
Removed:
MFTWorkoutPrescriptionComponent >> renderContentOn: html [
21
Removed:
22
Removed:
html section: [
23
Removed:
html heading
24
Removed:
level: 2;
25
Removed:
with: heading.
26
Removed:
html heading
27
Removed:
level: 3;
28
Removed:
with: workoutPrescription canonicalName.
29
Removed:
html orderedList: [
30
Removed:
workoutPrescription setGroups do: [ :setGroup |
31
Removed:
html listItem:
32
Removed:
((setGroup sets collect: #exercise) joinUsing: ', ') ] ] ]
33
Removed:
]
34
Removed:
35
Removed:
{ #category : 'accessing' }
36
Removed:
MFTWorkoutPrescriptionComponent >> workoutPrescription: aMFTWorkoutPrescription [
37
Removed:
38
Removed:
workoutPrescription := aMFTWorkoutPrescription
39
Removed:
]
src/MyFitnessTracker-Web/MFTWorkoutPrescriptionViewerComponent.class.st
@@ -0,0 +1,39 @@
1
Added:
Class {
2
Added:
#name : 'MFTWorkoutPrescriptionViewerComponent',
3
Added:
#superclass : 'WAComponent',
4
Added:
#instVars : [
5
Added:
'heading',
6
Added:
'workoutPrescription'
7
Added:
],
8
Added:
#category : 'MyFitnessTracker-Web-Components',
9
Added:
#package : 'MyFitnessTracker-Web',
10
Added:
#tag : 'Components'
11
Added:
}
12
Added:
13
Added:
{ #category : 'accessing' }
14
Added:
MFTWorkoutPrescriptionViewerComponent >> heading: aString [
15
Added:
16
Added:
heading := aString
17
Added:
]
18
Added:
19
Added:
{ #category : 'rendering' }
20
Added:
MFTWorkoutPrescriptionViewerComponent >> renderContentOn: html [
21
Added:
22
Added:
html section: [
23
Added:
html heading
24
Added:
level: 2;
25
Added:
with: heading.
26
Added:
html heading
27
Added:
level: 3;
28
Added:
with: workoutPrescription canonicalName.
29
Added:
html orderedList: [
30
Added:
workoutPrescription setGroups do: [ :setGroup |
31
Added:
html listItem:
32
Added:
((setGroup sets collect: #exercise) joinUsing: ', ') ] ] ]
33
Added:
]
34
Added:
35
Added:
{ #category : 'accessing' }
36
Added:
MFTWorkoutPrescriptionViewerComponent >> workoutPrescription: aMFTWorkoutPrescription [
37
Added:
38
Added:
workoutPrescription := aMFTWorkoutPrescription
39
Added:
]