Realign architecture with TinyBlog tutorial.

Pass page-switching callbacks to subcomponents as blocks.

Commit
f4d97645707bf914cb9bec4934944842318731ca
Author
Marius Peter <dev@marius-peter.com>
Author date
Committer
Marius Peter <dev@marius-peter.com>
Committer date
Changed files
src/MyFitnessTracker-Web/MFTActionsComponent.class.st
index c30e7234..00000000 100644..000000
@@ -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
index 215fa28d..20f39405 100644..100644
@@ -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
index 05c6044c..00000000 100644..000000
@@ -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
index 00000000..77c7c55f 000000..100644
@@ -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
index 95e8dd3d..afbd57c9 100644..100644
@@ -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
index dd5870ca..af005c50 100644..100644
@@ -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
index a00cbd3a..00000000 100644..000000
@@ -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
index ff3bdbbd..39aec562 100644..100644
@@ -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
index 00000000..c42f297d 000000..100644
@@ -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
index fe124e4f..c13a6eb4 100644..100644
@@ -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
index 00000000..9f10068f 000000..100644
@@ -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
index 00000000..f3caf2e3 000000..100644
@@ -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
index ffdfa01b..0ba7010f 100644..100644
@@ -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
index 00000000..593dd5a1 000000..100644
@@ -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
index 00000000..e2a06d34 000000..100644
@@ -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
index 362a0fab..00000000 100644..000000
@@ -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
index 00000000..eae39dae 000000..100644
@@ -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: ]