1
- goog . require ( 'goog.array' ) ;
2
- goog . require ( 'goog.events.EventType' ) ;
3
- goog . require ( 'goog.events.KeyCodes' ) ;
4
- goog . require ( 'goog.ui.Component' ) ;
5
- goog . require ( 'goog.ui.Control' ) ;
6
-
7
- goog . require ( 'todomvc.model.ToDoItem' ) ;
8
- goog . require ( 'todomvc.view' ) ;
9
- goog . require ( 'todomvc.view.ClearCompletedControlRenderer' ) ;
10
- goog . require ( 'todomvc.view.ItemCountControlRenderer' ) ;
11
- goog . require ( 'todomvc.view.ToDoItemControl' ) ;
12
- goog . require ( 'todomvc.view.ToDoListContainer' ) ;
13
-
14
- /**
15
- * @fileoverview The controller/business logic for the application.
16
- *
17
- * This file creates the interface and marshalls changes from the interface to the model and back.
18
- */
19
-
20
-
21
- /**
22
- * @type {Array.<todomvc.model.ToDoItem> }
23
- */
24
- var items = [ ] ;
25
-
26
- /**
27
- * @type {Element }
28
- */
29
- var todoStats = document . getElementById ( 'todo-stats' ) ;
30
-
31
- /**
32
- * @type {goog.ui.Control }
33
- */
34
- var itemCountControl = new goog . ui . Control ( null , todomvc . view . ItemCountControlRenderer . getInstance ( ) ) ;
35
- itemCountControl . render ( todoStats ) ;
36
-
37
- /**
38
- * @type {goog.ui.Control }
39
- */
40
- var clearCompletedControl = new goog . ui . Control ( null , todomvc . view . ClearCompletedControlRenderer . getInstance ( ) ) ;
41
- clearCompletedControl . render ( todoStats ) ;
42
-
43
- goog . events . listen ( clearCompletedControl , goog . ui . Component . EventType . ACTION , function ( e ) {
44
- // go backwards to avoid collection modification problems
45
- goog . array . forEachRight ( items , function ( model ) {
46
- if ( model . isDone ( ) ) {
47
- goog . array . remove ( items , model ) ;
48
- // do optimised model view sync
49
- container . forEachChild ( function ( control ) {
50
- if ( control . getModel ( ) === model ) {
51
- container . removeChild ( control , true ) ;
52
- }
53
- } ) ;
54
- }
55
- } ) ;
56
- updateStats ( ) ;
57
- } ) ;
58
-
59
- function updateStats ( ) {
60
- var doneCount = goog . array . reduce ( items , function ( count , model ) {
61
- return model . isDone ( ) ? count + 1 : count ;
62
- } , 0 ) ;
63
- var remainingCount = items . length - ( /**@type {number }*/ doneCount ) ;
64
- itemCountControl . setContent ( ( /**@type {string }*/ remainingCount ) ) ;
65
- itemCountControl . setVisible ( remainingCount > 0 ) ;
66
- clearCompletedControl . setContent ( ( /**@type {string }*/ doneCount ) ) ;
67
- clearCompletedControl . setVisible ( ( /**@type {number }*/ doneCount ) > 0 ) ;
68
- }
69
- updateStats ( ) ;
70
-
71
- /**
72
- * @type {todomvc.view.ToDoListContainer }
73
- */
74
- var container = new todomvc . view . ToDoListContainer ( ) ;
75
- container . decorate ( document . getElementById ( 'todo-list' ) ) ;
76
-
77
- goog . events . listen ( container , todomvc . view . ToDoItemControl . EventType . EDIT , function ( e ) {
78
- /**
79
- * @type {todomvc.view.ToDoItemControl }
80
- */
81
- var control = e . target ;
82
-
83
- /**
84
- * @type {todomvc.model.ToDoItem }
85
- */
86
- var model = ( /**@type {todomvc.model.ToDoItem } */ control . getModel ( ) ) ;
87
-
88
- // do optimised model view sync
89
- model . setNote ( ( /**@type {!string } */ control . getContent ( ) ) ) ;
90
- model . setDone ( ( /**@type {!boolean } */ control . isChecked ( ) ) ) ;
91
-
92
- updateStats ( ) ;
93
- } ) ;
94
-
95
- goog . events . listen ( container , todomvc . view . ToDoItemControl . EventType . DESTROY , function ( e ) {
96
- /**
97
- * @type {todomvc.view.ToDoItemControl }
98
- */
99
- var control = e . target ;
100
-
101
- /**
102
- * @type {todomvc.model.ToDoItem }
103
- */
104
- var model = ( /**@type {todomvc.model.ToDoItem } */ control . getModel ( ) ) ;
105
-
106
- // do optimised model view sync
107
- goog . array . remove ( items , model ) ;
108
- container . removeChild ( control , true ) ;
109
-
110
- updateStats ( ) ;
111
- } ) ;
112
-
113
- /**
114
- * @type {Element }
115
- */
116
- var newToDo = document . getElementById ( 'new-todo' ) ;
117
- goog . events . listen ( newToDo , goog . events . EventType . KEYUP , function ( e ) {
118
- if ( e . keyCode === goog . events . KeyCodes . ENTER ) {
119
- /**
120
- * @type {todomvc.model.ToDoItem }
121
- */
122
- var model = new todomvc . model . ToDoItem ( newToDo . value ) ;
123
-
124
- /**
125
- * @type {todomvc.view.ToDoItemControl }
126
- */
127
- var control = new todomvc . view . ToDoItemControl ( ) ;
128
-
129
- // do optimised model view sync
130
- items . push ( model ) ;
131
-
132
- control . setContent ( model . getNote ( ) ) ;
133
- control . setChecked ( model . isDone ( ) ) ;
134
- control . setModel ( model ) ;
135
-
136
- container . addChild ( control , true ) ;
137
-
138
- // clear the input box
139
- newToDo . value = '' ;
140
-
141
- updateStats ( ) ;
142
- }
1
+ goog . require ( 'goog.array' ) ;
2
+ goog . require ( 'goog.events.EventType' ) ;
3
+ goog . require ( 'goog.events.KeyCodes' ) ;
4
+ goog . require ( 'goog.ui.Component' ) ;
5
+ goog . require ( 'goog.ui.Control' ) ;
6
+
7
+ goog . require ( 'todomvc.model.ToDoItem' ) ;
8
+ goog . require ( 'todomvc.view' ) ;
9
+ goog . require ( 'todomvc.view.ClearCompletedControlRenderer' ) ;
10
+ goog . require ( 'todomvc.view.ItemCountControlRenderer' ) ;
11
+ goog . require ( 'todomvc.view.ToDoItemControl' ) ;
12
+ goog . require ( 'todomvc.view.ToDoListContainer' ) ;
13
+
14
+ /**
15
+ * @fileoverview The controller/business logic for the application.
16
+ *
17
+ * This file creates the interface and marshalls changes from the interface to the model and back.
18
+ */
19
+
20
+
21
+ /**
22
+ * @type {Array.<todomvc.model.ToDoItem> }
23
+ */
24
+ var items = [ ] ;
25
+
26
+ /**
27
+ * @type {Element }
28
+ */
29
+ var todoStats = document . getElementById ( 'todo-stats' ) ;
30
+
31
+ /**
32
+ * @type {goog.ui.Control }
33
+ */
34
+ var itemCountControl = new goog . ui . Control ( null , todomvc . view . ItemCountControlRenderer . getInstance ( ) ) ;
35
+ itemCountControl . render ( todoStats ) ;
36
+
37
+ /**
38
+ * @type {goog.ui.Control }
39
+ */
40
+ var clearCompletedControl = new goog . ui . Control ( null , todomvc . view . ClearCompletedControlRenderer . getInstance ( ) ) ;
41
+ clearCompletedControl . render ( todoStats ) ;
42
+
43
+ goog . events . listen ( clearCompletedControl , goog . ui . Component . EventType . ACTION , function ( e ) {
44
+ // go backwards to avoid collection modification problems
45
+ goog . array . forEachRight ( items , function ( model ) {
46
+ if ( model . isDone ( ) ) {
47
+ goog . array . remove ( items , model ) ;
48
+ // do optimised model view sync
49
+ container . forEachChild ( function ( control ) {
50
+ if ( control . getModel ( ) === model ) {
51
+ container . removeChild ( control , true ) ;
52
+ }
53
+ } ) ;
54
+ }
55
+ } ) ;
56
+ updateStats ( ) ;
57
+ } ) ;
58
+
59
+ function updateStats ( ) {
60
+ var doneCount = goog . array . reduce ( items , function ( count , model ) {
61
+ return model . isDone ( ) ? count + 1 : count ;
62
+ } , 0 ) ;
63
+ var remainingCount = items . length - ( /**@type {number }*/ doneCount ) ;
64
+ itemCountControl . setContent ( ( /**@type {string }*/ remainingCount ) ) ;
65
+ itemCountControl . setVisible ( remainingCount > 0 ) ;
66
+ clearCompletedControl . setContent ( ( /**@type {string }*/ doneCount ) ) ;
67
+ clearCompletedControl . setVisible ( ( /**@type {number }*/ doneCount ) > 0 ) ;
68
+ }
69
+ updateStats ( ) ;
70
+
71
+ /**
72
+ * @type {todomvc.view.ToDoListContainer }
73
+ */
74
+ var container = new todomvc . view . ToDoListContainer ( ) ;
75
+ container . decorate ( document . getElementById ( 'todo-list' ) ) ;
76
+
77
+ goog . events . listen ( container , todomvc . view . ToDoItemControl . EventType . EDIT , function ( e ) {
78
+ /**
79
+ * @type {todomvc.view.ToDoItemControl }
80
+ */
81
+ var control = e . target ;
82
+
83
+ /**
84
+ * @type {todomvc.model.ToDoItem }
85
+ */
86
+ var model = ( /**@type {todomvc.model.ToDoItem } */ control . getModel ( ) ) ;
87
+
88
+ // do optimised model view sync
89
+ model . setNote ( ( /**@type {!string } */ control . getContent ( ) ) ) ;
90
+ model . setDone ( ( /**@type {!boolean } */ control . isChecked ( ) ) ) ;
91
+
92
+ updateStats ( ) ;
93
+ } ) ;
94
+
95
+ goog . events . listen ( container , todomvc . view . ToDoItemControl . EventType . DESTROY , function ( e ) {
96
+ /**
97
+ * @type {todomvc.view.ToDoItemControl }
98
+ */
99
+ var control = e . target ;
100
+
101
+ /**
102
+ * @type {todomvc.model.ToDoItem }
103
+ */
104
+ var model = ( /**@type {todomvc.model.ToDoItem } */ control . getModel ( ) ) ;
105
+
106
+ // do optimised model view sync
107
+ goog . array . remove ( items , model ) ;
108
+ container . removeChild ( control , true ) ;
109
+
110
+ updateStats ( ) ;
111
+ } ) ;
112
+
113
+ /**
114
+ * @type {Element }
115
+ */
116
+ var newToDo = document . getElementById ( 'new-todo' ) ;
117
+ goog . events . listen ( newToDo , goog . events . EventType . KEYUP , function ( e ) {
118
+ if ( e . keyCode === goog . events . KeyCodes . ENTER ) {
119
+ /**
120
+ * @type {todomvc.model.ToDoItem }
121
+ */
122
+ var model = new todomvc . model . ToDoItem ( newToDo . value ) ;
123
+
124
+ /**
125
+ * @type {todomvc.view.ToDoItemControl }
126
+ */
127
+ var control = new todomvc . view . ToDoItemControl ( ) ;
128
+
129
+ // do optimised model view sync
130
+ items . push ( model ) ;
131
+
132
+ control . setContent ( model . getNote ( ) ) ;
133
+ control . setChecked ( model . isDone ( ) ) ;
134
+ control . setModel ( model ) ;
135
+
136
+ container . addChild ( control , true ) ;
137
+
138
+ // clear the input box
139
+ newToDo . value = '' ;
140
+
141
+ updateStats ( ) ;
142
+ }
143
143
} ) ;
0 commit comments