Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
T
todomvc
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Sven Franck
todomvc
Commits
2a837ab2
Commit
2a837ab2
authored
Dec 29, 2012
by
Peter Michaux
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
use assests folder instead of copies part of Maria example
parent
4f11e9ad
Changes
13
Hide whitespace changes
Inline
Side-by-side
Showing
13 changed files
with
326 additions
and
740 deletions
+326
-740
labs/architecture-examples/maria/src/css/app.css
labs/architecture-examples/maria/src/css/app.css
+1
-1
labs/architecture-examples/maria/src/css/base.css
labs/architecture-examples/maria/src/css/base.css
+0
-414
labs/architecture-examples/maria/src/index.html
labs/architecture-examples/maria/src/index.html
+24
-24
labs/architecture-examples/maria/src/js/bootstrap.js
labs/architecture-examples/maria/src/js/bootstrap.js
+29
-29
labs/architecture-examples/maria/src/js/controllers/TodoController.js
...cture-examples/maria/src/js/controllers/TodoController.js
+28
-28
labs/architecture-examples/maria/src/js/controllers/TodosController.js
...ture-examples/maria/src/js/controllers/TodosController.js
+26
-26
labs/architecture-examples/maria/src/js/models/TodoModel.js
labs/architecture-examples/maria/src/js/models/TodoModel.js
+37
-37
labs/architecture-examples/maria/src/js/models/TodosModel.js
labs/architecture-examples/maria/src/js/models/TodosModel.js
+57
-57
labs/architecture-examples/maria/src/js/templates/TodoTemplate.js
...hitecture-examples/maria/src/js/templates/TodoTemplate.js
+8
-8
labs/architecture-examples/maria/src/js/templates/TodosTemplate.js
...itecture-examples/maria/src/js/templates/TodosTemplate.js
+31
-31
labs/architecture-examples/maria/src/js/util.js
labs/architecture-examples/maria/src/js/util.js
+3
-3
labs/architecture-examples/maria/src/js/views/TodoView.js
labs/architecture-examples/maria/src/js/views/TodoView.js
+32
-32
labs/architecture-examples/maria/src/js/views/TodosView.js
labs/architecture-examples/maria/src/js/views/TodosView.js
+50
-50
No files found.
labs/architecture-examples/maria/src/css/app.css
View file @
2a837ab2
ul
.completed
li
.incompleted
,
ul
.incompleted
li
.completed
{
display
:
none
;
display
:
none
;
}
labs/architecture-examples/maria/src/css/base.css
deleted
100644 → 0
View file @
4f11e9ad
html
,
body
{
margin
:
0
;
padding
:
0
;
}
button
{
margin
:
0
;
padding
:
0
;
border
:
0
;
background
:
none
;
font-size
:
100%
;
vertical-align
:
baseline
;
font-family
:
inherit
;
color
:
inherit
;
-webkit-appearance
:
none
;
/*-moz-appearance: none;*/
-ms-appearance
:
none
;
-o-appearance
:
none
;
appearance
:
none
;
}
body
{
font
:
14px
'Helvetica Neue'
,
Helvetica
,
Arial
,
sans-serif
;
line-height
:
1.4em
;
background
:
#eaeaea
url('bg.png')
;
color
:
#4d4d4d
;
width
:
550px
;
margin
:
0
auto
;
-webkit-font-smoothing
:
antialiased
;
-moz-font-smoothing
:
antialiased
;
-ms-font-smoothing
:
antialiased
;
-o-font-smoothing
:
antialiased
;
font-smoothing
:
antialiased
;
}
#todoapp
{
background
:
#fff
;
background
:
rgba
(
255
,
255
,
255
,
0.9
);
margin
:
130px
0
40px
0
;
border
:
1px
solid
#ccc
;
position
:
relative
;
border-top-left-radius
:
2px
;
border-top-right-radius
:
2px
;
box-shadow
:
0
2px
6px
0
rgba
(
0
,
0
,
0
,
0.2
),
0
25px
50px
0
rgba
(
0
,
0
,
0
,
0.15
);
}
#todoapp
:before
{
content
:
''
;
border-left
:
1px
solid
#f5d6d6
;
border-right
:
1px
solid
#f5d6d6
;
width
:
2px
;
position
:
absolute
;
top
:
0
;
left
:
40px
;
height
:
100%
;
}
#todoapp
input
::-webkit-input-placeholder
{
font-style
:
italic
;
}
#todoapp
input
:-moz-placeholder
{
font-style
:
italic
;
color
:
#a9a9a9
;
}
#todoapp
h1
{
position
:
absolute
;
top
:
-120px
;
width
:
100%
;
font-size
:
70px
;
font-weight
:
bold
;
text-align
:
center
;
color
:
#b3b3b3
;
color
:
rgba
(
255
,
255
,
255
,
0.3
);
text-shadow
:
-1px
-1px
rgba
(
0
,
0
,
0
,
0.2
);
-webkit-text-rendering
:
optimizeLegibility
;
-moz-text-rendering
:
optimizeLegibility
;
-ms-text-rendering
:
optimizeLegibility
;
-o-text-rendering
:
optimizeLegibility
;
text-rendering
:
optimizeLegibility
;
}
#header
{
padding-top
:
15px
;
border-radius
:
inherit
;
}
#header
:before
{
content
:
''
;
position
:
absolute
;
top
:
0
;
right
:
0
;
left
:
0
;
height
:
15px
;
z-index
:
2
;
border-bottom
:
1px
solid
#6c615c
;
background
:
#8d7d77
;
background
:
-webkit-gradient
(
linear
,
left
top
,
left
bottom
,
from
(
rgba
(
132
,
110
,
100
,
0.8
)),
to
(
rgba
(
101
,
84
,
76
,
0.8
)));
background
:
-webkit-linear-gradient
(
top
,
rgba
(
132
,
110
,
100
,
0.8
),
rgba
(
101
,
84
,
76
,
0.8
));
background
:
-moz-linear-gradient
(
top
,
rgba
(
132
,
110
,
100
,
0.8
),
rgba
(
101
,
84
,
76
,
0.8
));
background
:
-o-linear-gradient
(
top
,
rgba
(
132
,
110
,
100
,
0.8
),
rgba
(
101
,
84
,
76
,
0.8
));
background
:
-ms-linear-gradient
(
top
,
rgba
(
132
,
110
,
100
,
0.8
),
rgba
(
101
,
84
,
76
,
0.8
));
background
:
linear-gradient
(
top
,
rgba
(
132
,
110
,
100
,
0.8
),
rgba
(
101
,
84
,
76
,
0.8
));
filter
:
progid
:
DXImageTransform
.
Microsoft
.
gradient
(
GradientType
=
0
,
StartColorStr
=
'#9d8b83'
,
EndColorStr
=
'#847670'
);
border-top-left-radius
:
1px
;
border-top-right-radius
:
1px
;
}
#new-todo
,
.edit
{
position
:
relative
;
margin
:
0
;
width
:
100%
;
font-size
:
24px
;
font-family
:
inherit
;
line-height
:
1.4em
;
border
:
0
;
outline
:
none
;
color
:
inherit
;
padding
:
6px
;
border
:
1px
solid
#999
;
box-shadow
:
inset
0
-1px
5px
0
rgba
(
0
,
0
,
0
,
0.2
);
-webkit-box-sizing
:
border-box
;
-moz-box-sizing
:
border-box
;
-ms-box-sizing
:
border-box
;
-o-box-sizing
:
border-box
;
box-sizing
:
border-box
;
-webkit-font-smoothing
:
antialiased
;
-moz-font-smoothing
:
antialiased
;
-ms-font-smoothing
:
antialiased
;
-o-font-smoothing
:
antialiased
;
font-smoothing
:
antialiased
;
}
#new-todo
{
padding
:
16px
16px
16px
60px
;
border
:
none
;
background
:
rgba
(
0
,
0
,
0
,
0.02
);
z-index
:
2
;
box-shadow
:
none
;
}
#main
{
position
:
relative
;
z-index
:
2
;
border-top
:
1px
dotted
#adadad
;
}
label
[
for
=
'toggle-all'
]
{
display
:
none
;
}
#toggle-all
{
position
:
absolute
;
top
:
-42px
;
left
:
-4px
;
width
:
40px
;
text-align
:
center
;
border
:
none
;
/* Mobile Safari */
}
#toggle-all
:before
{
content
:
'»'
;
font-size
:
28px
;
color
:
#d9d9d9
;
padding
:
0
25px
7px
;
}
#toggle-all
:checked:before
{
color
:
#737373
;
}
#todo-list
{
margin
:
0
;
padding
:
0
;
list-style
:
none
;
}
#todo-list
li
{
position
:
relative
;
font-size
:
24px
;
border-bottom
:
1px
dotted
#ccc
;
}
#todo-list
li
:last-child
{
border-bottom
:
none
;
}
#todo-list
li
.editing
{
border-bottom
:
none
;
padding
:
0
;
}
#todo-list
li
.editing
.edit
{
display
:
block
;
width
:
506px
;
padding
:
13px
17px
12px
17px
;
margin
:
0
0
0
43px
;
}
#todo-list
li
.editing
.view
{
display
:
none
;
}
#todo-list
li
.toggle
{
text-align
:
center
;
width
:
40px
;
/* auto, since non-WebKit browsers doesn't support input styling */
height
:
auto
;
position
:
absolute
;
top
:
0
;
bottom
:
0
;
margin
:
auto
0
;
border
:
none
;
/* Mobile Safari */
-webkit-appearance
:
none
;
/*-moz-appearance: none;*/
-ms-appearance
:
none
;
-o-appearance
:
none
;
appearance
:
none
;
}
#todo-list
li
.toggle
:after
{
content
:
'✔'
;
line-height
:
43px
;
/* 40 + a couple of pixels visual adjustment */
font-size
:
20px
;
color
:
#d9d9d9
;
text-shadow
:
0
-1px
0
#bfbfbf
;
}
#todo-list
li
.toggle
:checked:after
{
color
:
#85ada7
;
text-shadow
:
0
1px
0
#669991
;
bottom
:
1px
;
position
:
relative
;
}
#todo-list
li
label
{
word-break
:
break-word
;
padding
:
15px
;
margin-left
:
45px
;
display
:
block
;
line-height
:
1.2
;
-webkit-transition
:
color
0.4s
;
-moz-transition
:
color
0.4s
;
-ms-transition
:
color
0.4s
;
-o-transition
:
color
0.4s
;
transition
:
color
0.4s
;
}
#todo-list
li
.completed
label
{
color
:
#a9a9a9
;
text-decoration
:
line-through
;
}
#todo-list
li
.destroy
{
display
:
none
;
position
:
absolute
;
top
:
0
;
right
:
10px
;
bottom
:
0
;
width
:
40px
;
height
:
40px
;
margin
:
auto
0
;
font-size
:
22px
;
color
:
#a88a8a
;
-webkit-transition
:
all
0.2s
;
-moz-transition
:
all
0.2s
;
-ms-transition
:
all
0.2s
;
-o-transition
:
all
0.2s
;
transition
:
all
0.2s
;
}
#todo-list
li
.destroy
:hover
{
text-shadow
:
0
0
1px
#000
,
0
0
10px
rgba
(
199
,
107
,
107
,
0.8
);
-webkit-transform
:
scale
(
1.3
);
-moz-transform
:
scale
(
1.3
);
-ms-transform
:
scale
(
1.3
);
-o-transform
:
scale
(
1.3
);
transform
:
scale
(
1.3
);
}
#todo-list
li
.destroy
:after
{
content
:
'✖'
;
}
#todo-list
li
:hover
.destroy
{
display
:
block
;
}
#todo-list
li
.edit
{
display
:
none
;
}
#todo-list
li
.editing
:last-child
{
margin-bottom
:
-1px
;
}
#footer
{
color
:
#777
;
padding
:
0
15px
;
position
:
absolute
;
right
:
0
;
bottom
:
-31px
;
left
:
0
;
height
:
20px
;
z-index
:
1
;
text-align
:
center
;
}
#footer
:before
{
content
:
''
;
position
:
absolute
;
right
:
0
;
bottom
:
31px
;
left
:
0
;
height
:
50px
;
z-index
:
-1
;
box-shadow
:
0
1px
1px
rgba
(
0
,
0
,
0
,
0.3
),
0
6px
0
-3px
rgba
(
255
,
255
,
255
,
0.8
),
0
7px
1px
-3px
rgba
(
0
,
0
,
0
,
0.3
),
0
43px
0
-6px
rgba
(
255
,
255
,
255
,
0.8
),
0
44px
2px
-6px
rgba
(
0
,
0
,
0
,
0.2
);
}
#todo-count
{
float
:
left
;
text-align
:
left
;
}
#filters
{
margin
:
0
;
padding
:
0
;
list-style
:
none
;
position
:
absolute
;
right
:
0
;
left
:
0
;
}
#filters
li
{
display
:
inline
;
}
#filters
li
a
{
color
:
#83756f
;
margin
:
2px
;
text-decoration
:
none
;
}
#filters
li
a
.selected
{
font-weight
:
bold
;
}
#clear-completed
{
float
:
right
;
position
:
relative
;
line-height
:
20px
;
text-decoration
:
none
;
background
:
rgba
(
0
,
0
,
0
,
0.1
);
font-size
:
11px
;
padding
:
0
10px
;
border-radius
:
3px
;
box-shadow
:
0
-1px
0
0
rgba
(
0
,
0
,
0
,
0.2
);
}
#clear-completed
:hover
{
background
:
rgba
(
0
,
0
,
0
,
0.15
);
box-shadow
:
0
-1px
0
0
rgba
(
0
,
0
,
0
,
0.3
);
}
#info
{
margin
:
65px
auto
0
;
color
:
#a6a6a6
;
font-size
:
12px
;
text-shadow
:
0
1px
0
rgba
(
255
,
255
,
255
,
0.7
);
text-align
:
center
;
}
#info
a
{
color
:
inherit
;
}
/*
Hack to remove background from Mobile Safari.
Can't use it globally since it destroys checkboxes in Firefox and Opera
*/
@media
screen
and
(
-webkit-min-device-pixel-ratio
:
0
)
{
#toggle-all
,
#todo-list
li
.toggle
{
background
:
none
;
}
#todo-list
li
.toggle
{
height
:
40px
;
}
#toggle-all
{
top
:
-56px
;
left
:
-15px
;
width
:
65px
;
height
:
41px
;
-webkit-transform
:
rotate
(
90deg
);
transform
:
rotate
(
90deg
);
-webkit-appearance
:
none
;
appearance
:
none
;
}
}
.hidden
{
display
:
none
;
}
labs/architecture-examples/maria/src/index.html
View file @
2a837ab2
<!DOCTYPE html>
<html>
<head>
<meta
charset=
"utf-8"
>
<title>
Maria • TodoMVC
</title>
<meta
charset=
"utf-8"
>
<title>
Maria • TodoMVC
</title>
<link
href=
"../../../../assets/base.css"
rel=
"stylesheet"
>
<link
href=
"css/app.css"
rel=
"stylesheet"
>
<link
href=
"../../../../assets/base.css"
rel=
"stylesheet"
>
<link
href=
"css/app.css"
rel=
"stylesheet"
>
</head>
<body>
<noscript>
<p>
This application uses JavaScript. Please enable JavaScript in your browser and refresh the page.
</p>
</noscript>
<script>
document
.
write
(
'
<p id="loading">loading...</p>
'
);
</script>
<noscript>
<p>
This application uses JavaScript. Please enable JavaScript in your browser and refresh the page.
</p>
</noscript>
<script>
document
.
write
(
'
<p id="loading">loading...</p>
'
);
</script>
<script
src=
"../lib/maria/maria.js"
></script>
<script
src=
"../lib/aristocrat/aristocrat.js"
></script>
<script
src=
"../../../../assets/director.min.js"
></script>
<script
src=
"../lib/maria/maria.js"
></script>
<script
src=
"../lib/aristocrat/aristocrat.js"
></script>
<script
src=
"../../../../assets/director.min.js"
></script>
<script
src=
"js/namespace.js"
></script>
<script
src=
"js/util.js"
></script>
<script
src=
"js/models/TodoModel.js"
></script>
<script
src=
"js/models/TodosModel.js"
></script>
<script
src=
"js/templates/TodosTemplate.js"
></script>
<script
src=
"js/views/TodosView.js"
></script>
<script
src=
"js/controllers/TodosController.js"
></script>
<script
src=
"js/templates/TodoTemplate.js"
></script>
<script
src=
"js/views/TodoView.js"
></script>
<script
src=
"js/controllers/TodoController.js"
></script>
<script
src=
"js/bootstrap.js"
></script>
<script
src=
"js/namespace.js"
></script>
<script
src=
"js/util.js"
></script>
<script
src=
"js/models/TodoModel.js"
></script>
<script
src=
"js/models/TodosModel.js"
></script>
<script
src=
"js/templates/TodosTemplate.js"
></script>
<script
src=
"js/views/TodosView.js"
></script>
<script
src=
"js/controllers/TodosController.js"
></script>
<script
src=
"js/templates/TodoTemplate.js"
></script>
<script
src=
"js/views/TodoView.js"
></script>
<script
src=
"js/controllers/TodoController.js"
></script>
<script
src=
"js/bootstrap.js"
></script>
</body>
</html>
labs/architecture-examples/maria/src/js/bootstrap.js
View file @
2a837ab2
maria
.
on
(
window
,
'
load
'
,
function
()
{
var
loading
=
document
.
getElementById
(
'
loading
'
);
loading
.
parentNode
.
removeChild
(
loading
);
var
loading
=
document
.
getElementById
(
'
loading
'
);
loading
.
parentNode
.
removeChild
(
loading
);
var
model
;
if
((
typeof
localStorage
===
'
object
'
)
&&
(
typeof
JSON
===
'
object
'
))
{
var
store
=
localStorage
.
getItem
(
'
todos-maria
'
);
model
=
store
?
checkit
.
TodosModel
.
fromJSON
(
JSON
.
parse
(
store
))
:
new
checkit
.
TodosModel
();
maria
.
on
(
model
,
'
change
'
,
function
()
{
localStorage
.
setItem
(
'
todos-maria
'
,
JSON
.
stringify
(
model
.
toJSON
()));
});
}
else
{
model
=
new
checkit
.
TodosModel
();
}
var
model
;
if
((
typeof
localStorage
===
'
object
'
)
&&
(
typeof
JSON
===
'
object
'
))
{
var
store
=
localStorage
.
getItem
(
'
todos-maria
'
);
model
=
store
?
checkit
.
TodosModel
.
fromJSON
(
JSON
.
parse
(
store
))
:
new
checkit
.
TodosModel
();
maria
.
on
(
model
,
'
change
'
,
function
()
{
localStorage
.
setItem
(
'
todos-maria
'
,
JSON
.
stringify
(
model
.
toJSON
()));
});
}
else
{
model
=
new
checkit
.
TodosModel
();
}
var
routes
=
{
'
/
'
:
function
()
{
model
.
setMode
(
'
all
'
);
},
'
/active
'
:
function
()
{
model
.
setMode
(
'
incompleted
'
);
},
'
/completed
'
:
function
()
{
model
.
setMode
(
'
completed
'
);
}
};
var
router
=
Router
(
routes
);
router
.
init
();
var
routes
=
{
'
/
'
:
function
()
{
model
.
setMode
(
'
all
'
);
},
'
/active
'
:
function
()
{
model
.
setMode
(
'
incompleted
'
);
},
'
/completed
'
:
function
()
{
model
.
setMode
(
'
completed
'
);
}
};
var
router
=
Router
(
routes
);
router
.
init
();
var
view
=
new
checkit
.
TodosAppView
(
model
);
document
.
body
.
appendChild
(
view
.
build
());
var
view
=
new
checkit
.
TodosAppView
(
model
);
document
.
body
.
appendChild
(
view
.
build
());
});
labs/architecture-examples/maria/src/js/controllers/TodoController.js
View file @
2a837ab2
maria
.
Controller
.
subclass
(
checkit
,
'
TodoController
'
,
{
properties
:
{
onClickDestroy
:
function
()
{
this
.
getModel
().
destroy
();
},
onClickToggle
:
function
()
{
this
.
getModel
().
toggleCompleted
();
},
onDblclickLabel
:
function
()
{
this
.
getView
().
showEdit
();
},
onKeyupEdit
:
function
(
evt
)
{
if
(
checkit
.
isEnterKeyCode
(
evt
.
keyCode
))
{
this
.
onBlurEdit
();
}
},
onBlurEdit
:
function
()
{
var
model
=
this
.
getModel
();
var
view
=
this
.
getView
();
var
value
=
view
.
getInputValue
();
view
.
showDisplay
();
if
(
checkit
.
isBlank
(
value
))
{
model
.
destroy
();
}
else
{
model
.
setTitle
(
value
);
}
}
}
properties
:
{
onClickDestroy
:
function
()
{
this
.
getModel
().
destroy
();
},
onClickToggle
:
function
()
{
this
.
getModel
().
toggleCompleted
();
},
onDblclickLabel
:
function
()
{
this
.
getView
().
showEdit
();
},
onKeyupEdit
:
function
(
evt
)
{
if
(
checkit
.
isEnterKeyCode
(
evt
.
keyCode
))
{
this
.
onBlurEdit
();
}
},
onBlurEdit
:
function
()
{
var
model
=
this
.
getModel
();
var
view
=
this
.
getView
();
var
value
=
view
.
getInputValue
();
view
.
showDisplay
();
if
(
checkit
.
isBlank
(
value
))
{
model
.
destroy
();
}
else
{
model
.
setTitle
(
value
);
}
}
}
});
labs/architecture-examples/maria/src/js/controllers/TodosController.js
View file @
2a837ab2
maria
.
Controller
.
subclass
(
checkit
,
'
TodosAppController
'
,
{
properties
:
{
onKeyupNewTodo
:
function
(
evt
)
{
if
(
checkit
.
isEnterKeyCode
(
evt
.
keyCode
))
{
var
view
=
this
.
getView
();
var
value
=
view
.
getInputValue
();
if
(
!
checkit
.
isBlank
(
value
))
{
var
todo
=
new
checkit
.
TodoModel
();
todo
.
setTitle
(
value
);
this
.
getModel
().
add
(
todo
);
view
.
clearInput
();
}
}
},
onClickToggleAll
:
function
()
{
var
model
=
this
.
getModel
();
if
(
model
.
isAllCompleted
())
{
model
.
markAllIncompleted
();
}
else
{
model
.
markAllCompleted
();
}
},
onClickClearCompleted
:
function
()
{
this
.
getModel
().
deleteCompleted
();
}
}
properties
:
{
onKeyupNewTodo
:
function
(
evt
)
{
if
(
checkit
.
isEnterKeyCode
(
evt
.
keyCode
))
{
var
view
=
this
.
getView
();
var
value
=
view
.
getInputValue
();
if
(
!
checkit
.
isBlank
(
value
))
{
var
todo
=
new
checkit
.
TodoModel
();
todo
.
setTitle
(
value
);
this
.
getModel
().
add
(
todo
);
view
.
clearInput
();
}
}
},
onClickToggleAll
:
function
()
{
var
model
=
this
.
getModel
();
if
(
model
.
isAllCompleted
())
{
model
.
markAllIncompleted
();
}
else
{
model
.
markAllCompleted
();
}
},
onClickClearCompleted
:
function
()
{
this
.
getModel
().
deleteCompleted
();
}
}
});
labs/architecture-examples/maria/src/js/models/TodoModel.js
View file @
2a837ab2
maria
.
Model
.
subclass
(
checkit
,
'
TodoModel
'
,
{
properties
:
{
_title
:
''
,
_completed
:
false
,
getTitle
:
function
()
{
return
this
.
_title
;
},
setTitle
:
function
(
title
)
{
title
=
(
''
+
title
).
trim
();
if
(
this
.
_title
!==
title
)
{
this
.
_title
=
title
;
this
.
dispatchEvent
({
type
:
'
change
'
});
}
},
isCompleted
:
function
()
{
return
this
.
_completed
;
},
setCompleted
:
function
(
completed
)
{
completed
=
!!
completed
;
if
(
this
.
_completed
!==
completed
)
{
this
.
_completed
=
completed
;
this
.
dispatchEvent
({
type
:
'
change
'
});
}
},
toggleCompleted
:
function
()
{
this
.
setCompleted
(
!
this
.
isCompleted
());
},
toJSON
:
function
()
{
return
{
title
:
this
.
_title
,
completed
:
this
.
_completed
};
}
}
properties
:
{
_title
:
''
,
_completed
:
false
,
getTitle
:
function
()
{
return
this
.
_title
;
},
setTitle
:
function
(
title
)
{
title
=
(
''
+
title
).
trim
();
if
(
this
.
_title
!==
title
)
{
this
.
_title
=
title
;
this
.
dispatchEvent
({
type
:
'
change
'
});
}
},
isCompleted
:
function
()
{
return
this
.
_completed
;
},
setCompleted
:
function
(
completed
)
{
completed
=
!!
completed
;
if
(
this
.
_completed
!==
completed
)
{
this
.
_completed
=
completed
;
this
.
dispatchEvent
({
type
:
'
change
'
});
}
},
toggleCompleted
:
function
()
{
this
.
setCompleted
(
!
this
.
isCompleted
());
},
toJSON
:
function
()
{
return
{
title
:
this
.
_title
,
completed
:
this
.
_completed
};
}
}
});
checkit
.
TodoModel
.
fromJSON
=
function
(
todoJSON
)
{
var
model
=
new
checkit
.
TodoModel
();
model
.
_title
=
todoJSON
.
title
;
model
.
_completed
=
todoJSON
.
completed
;
return
model
;
var
model
=
new
checkit
.
TodoModel
();
model
.
_title
=
todoJSON
.
title
;
model
.
_completed
=
todoJSON
.
completed
;
return
model
;
};
labs/architecture-examples/maria/src/js/models/TodosModel.js
View file @
2a837ab2
maria
.
SetModel
.
subclass
(
checkit
,
'
TodosModel
'
,
{
properties
:
{
_mode
:
'
all
'
,
getPossibleModes
:
function
()
{
return
[
'
all
'
,
'
incompleted
'
,
'
completed
'
];
},
getMode
:
function
()
{
return
this
.
_mode
;
},
setMode
:
function
(
mode
)
{
if
(
this
.
getPossibleModes
().
some
(
function
(
m
)
{
return
m
===
mode
;}))
{
if
(
this
.
_mode
!==
mode
)
{
this
.
_mode
=
mode
;
this
.
dispatchEvent
({
type
:
'
change
'
});
}
}
else
{
throw
new
Error
(
'
checkit.TodosModel.prototype.setMode: unsupported mode "
'
+
mode
+
'
".
'
);
}
},
getCompleted
:
function
()
{
return
this
.
filter
(
function
(
todo
)
{
return
todo
.
isCompleted
();
});
},
getIncompleted
:
function
()
{
return
this
.
filter
(
function
(
todo
)
{
return
!
todo
.
isCompleted
();
});
},
isAllCompleted
:
function
()
{
return
(
this
.
length
>
0
)
&&
(
this
.
getCompleted
().
length
===
this
.
length
);
},
markAllCompleted
:
function
()
{
this
.
forEach
(
function
(
todo
)
{
todo
.
setCompleted
(
true
);
});
},
markAllIncompleted
:
function
()
{
this
.
forEach
(
function
(
todo
)
{
todo
.
setCompleted
(
false
);
});
},
deleteCompleted
:
function
()
{
this
[
'
delete
'
].
apply
(
this
,
this
.
getCompleted
());
},
toJSON
:
function
()
{
return
this
.
map
(
function
(
todo
)
{
return
todo
.
toJSON
();
});
}
}
properties
:
{
_mode
:
'
all
'
,
getPossibleModes
:
function
()
{
return
[
'
all
'
,
'
incompleted
'
,
'
completed
'
];
},
getMode
:
function
()
{
return
this
.
_mode
;
},
setMode
:
function
(
mode
)
{
if
(
this
.
getPossibleModes
().
some
(
function
(
m
)
{
return
m
===
mode
;}))
{
if
(
this
.
_mode
!==
mode
)
{
this
.
_mode
=
mode
;
this
.
dispatchEvent
({
type
:
'
change
'
});
}
}
else
{
throw
new
Error
(
'
checkit.TodosModel.prototype.setMode: unsupported mode "
'
+
mode
+
'
".
'
);
}
},
getCompleted
:
function
()
{
return
this
.
filter
(
function
(
todo
)
{
return
todo
.
isCompleted
();
});
},
getIncompleted
:
function
()
{
return
this
.
filter
(
function
(
todo
)
{
return
!
todo
.
isCompleted
();
});
},
isAllCompleted
:
function
()
{
return
(
this
.
length
>
0
)
&&
(
this
.
getCompleted
().
length
===
this
.
length
);
},
markAllCompleted
:
function
()
{
this
.
forEach
(
function
(
todo
)
{
todo
.
setCompleted
(
true
);
});
},
markAllIncompleted
:
function
()
{
this
.
forEach
(
function
(
todo
)
{
todo
.
setCompleted
(
false
);
});
},
deleteCompleted
:
function
()
{
this
[
'
delete
'
].
apply
(
this
,
this
.
getCompleted
());
},
toJSON
:
function
()
{
return
this
.
map
(
function
(
todo
)
{
return
todo
.
toJSON
();
});
}
}
});
checkit
.
TodosModel
.
fromJSON
=
function
(
todosJSON
)
{
var
model
=
new
checkit
.
TodosModel
();
for
(
var
i
=
0
,
ilen
=
todosJSON
.
length
;
i
<
ilen
;
i
++
)
{
model
.
add
(
checkit
.
TodoModel
.
fromJSON
(
todosJSON
[
i
]));
}
return
model
;
var
model
=
new
checkit
.
TodosModel
();
for
(
var
i
=
0
,
ilen
=
todosJSON
.
length
;
i
<
ilen
;
i
++
)
{
model
.
add
(
checkit
.
TodoModel
.
fromJSON
(
todosJSON
[
i
]));
}
return
model
;
};
labs/architecture-examples/maria/src/js/templates/TodoTemplate.js
View file @
2a837ab2
...
...
@@ -7,11 +7,11 @@
// included here.
//
checkit
.
TodoTemplate
=
'
<li>
'
+
'
<div class="view">
'
+
'
<input class="toggle" type="checkbox">
'
+
'
<label></label>
'
+
'
<button class="destroy"></span>
'
+
'
</div>
'
+
'
<input class="edit">
'
+
'
</li>
'
;
'
<li>
'
+
'
<div class="view">
'
+
'
<input class="toggle" type="checkbox">
'
+
'
<label></label>
'
+
'
<button class="destroy"></span>
'
+
'
</div>
'
+
'
<input class="edit">
'
+
'
</li>
'
;
labs/architecture-examples/maria/src/js/templates/TodosTemplate.js
View file @
2a837ab2
...
...
@@ -7,34 +7,34 @@
// included here.
//
checkit
.
TodosAppTemplate
=
'
<section id="todoapp">
'
+
'
<header id="header">
'
+
'
<h1>todos</h1>
'
+
'
<input id="new-todo" placeholder="What needs to be done?" autofocus>
'
+
'
</header>
'
+
'
<section id="main">
'
+
'
<input id="toggle-all" type="checkbox">
'
+
'
<label for="toggle-all">Mark all as completed</label>
'
+
'
<ul id="todo-list"></ul>
'
+
'
</section>
'
+
'
<footer id="footer">
'
+
'
<span id="todo-count"></span>
'
+
'
<ul id="filters">
'
+
'
<li>
'
+
'
<a class="all-filter" href="#/">All</a>
'
+
'
</li>
'
+
'
<li>
'
+
'
<a class="incompleted-filter" href="#/active">Active</a>
'
+
'
</li>
'
+
'
<li>
'
+
'
<a class="completed-filter" href="#/completed">Completed</a>
'
+
'
</li>
'
+
'
</ul>
'
+
'
<button id="clear-completed"></button>
'
+
'
</footer>
'
+
'
</section>
'
+
'
<footer id="info">
'
+
'
<p>Double-click to edit a todo</p>
'
+
'
<p>Inspired by the official <a href="https://github.com/maccman/spine.todos">Spine.Todos</a></p>
'
+
'
<p>Created by <a href="http://github.com/petermichaux">Peter Michaux</a></p>
'
+
'
</footer>
'
;
'
<section id="todoapp">
'
+
'
<header id="header">
'
+
'
<h1>todos</h1>
'
+
'
<input id="new-todo" placeholder="What needs to be done?" autofocus>
'
+
'
</header>
'
+
'
<section id="main">
'
+
'
<input id="toggle-all" type="checkbox">
'
+
'
<label for="toggle-all">Mark all as completed</label>
'
+
'
<ul id="todo-list"></ul>
'
+
'
</section>
'
+
'
<footer id="footer">
'
+
'
<span id="todo-count"></span>
'
+
'
<ul id="filters">
'
+
'
<li>
'
+
'
<a class="all-filter" href="#/">All</a>
'
+
'
</li>
'
+
'
<li>
'
+
'
<a class="incompleted-filter" href="#/active">Active</a>
'
+
'
</li>
'
+
'
<li>
'
+
'
<a class="completed-filter" href="#/completed">Completed</a>
'
+
'
</li>
'
+
'
</ul>
'
+
'
<button id="clear-completed"></button>
'
+
'
</footer>
'
+
'
</section>
'
+
'
<footer id="info">
'
+
'
<p>Double-click to edit a todo</p>
'
+
'
<p>Inspired by the official <a href="https://github.com/maccman/spine.todos">Spine.Todos</a></p>
'
+
'
<p>Created by <a href="http://github.com/petermichaux">Peter Michaux</a></p>
'
+
'
</footer>
'
;
labs/architecture-examples/maria/src/js/util.js
View file @
2a837ab2
checkit
.
isBlank
=
function
(
str
)
{
return
/^
\s
*$/
.
test
(
str
);
return
/^
\s
*$/
.
test
(
str
);
};
checkit
.
escapeHTML
=
function
(
str
)
{
return
str
.
replace
(
'
&
'
,
'
&
'
).
replace
(
'
<
'
,
'
<
'
);
return
str
.
replace
(
'
&
'
,
'
&
'
).
replace
(
'
<
'
,
'
<
'
);
};
checkit
.
isEnterKeyCode
=
function
(
keyCode
)
{
return
keyCode
===
13
;
return
keyCode
===
13
;
};
labs/architecture-examples/maria/src/js/views/TodoView.js
View file @
2a837ab2
maria
.
ElementView
.
subclass
(
checkit
,
'
TodoView
'
,
{
uiActions
:
{
'
click .destroy
'
:
'
onClickDestroy
'
,
'
click .toggle
'
:
'
onClickToggle
'
,
'
dblclick label
'
:
'
onDblclickLabel
'
,
'
keyup .edit
'
:
'
onKeyupEdit
'
,
'
blur .edit
'
:
'
onBlurEdit
'
},
properties
:
{
buildData
:
function
()
{
var
model
=
this
.
getModel
();
uiActions
:
{
'
click .destroy
'
:
'
onClickDestroy
'
,
'
click .toggle
'
:
'
onClickToggle
'
,
'
dblclick label
'
:
'
onDblclickLabel
'
,
'
keyup .edit
'
:
'
onKeyupEdit
'
,
'
blur .edit
'
:
'
onBlurEdit
'
},
properties
:
{
buildData
:
function
()
{
var
model
=
this
.
getModel
();
var
item
=
this
.
find
(
'
li
'
);
aristocrat
.
removeClass
(
item
,
'
(in|)completed
'
);
aristocrat
.
addClass
(
item
,
(
model
.
isCompleted
()
?
'
completed
'
:
'
incompleted
'
));
var
item
=
this
.
find
(
'
li
'
);
aristocrat
.
removeClass
(
item
,
'
(in|)completed
'
);
aristocrat
.
addClass
(
item
,
(
model
.
isCompleted
()
?
'
completed
'
:
'
incompleted
'
));
this
.
find
(
'
label
'
).
innerHTML
=
checkit
.
escapeHTML
(
model
.
getTitle
());
this
.
find
(
'
label
'
).
innerHTML
=
checkit
.
escapeHTML
(
model
.
getTitle
());
this
.
find
(
'
.toggle
'
).
checked
=
model
.
isCompleted
();
},
update
:
function
()
{
this
.
buildData
();
},
showEdit
:
function
()
{
var
input
=
this
.
find
(
'
.edit
'
);
input
.
value
=
this
.
getModel
().
getTitle
();
aristocrat
.
addClass
(
this
.
find
(
'
li
'
),
'
editing
'
);
input
.
focus
();
},
showDisplay
:
function
()
{
aristocrat
.
removeClass
(
this
.
find
(
'
li
'
),
'
editing
'
);
},
getInputValue
:
function
()
{
return
this
.
find
(
'
.edit
'
).
value
;
}
}
this
.
find
(
'
.toggle
'
).
checked
=
model
.
isCompleted
();
},
update
:
function
()
{
this
.
buildData
();
},
showEdit
:
function
()
{
var
input
=
this
.
find
(
'
.edit
'
);
input
.
value
=
this
.
getModel
().
getTitle
();
aristocrat
.
addClass
(
this
.
find
(
'
li
'
),
'
editing
'
);
input
.
focus
();
},
showDisplay
:
function
()
{
aristocrat
.
removeClass
(
this
.
find
(
'
li
'
),
'
editing
'
);
},
getInputValue
:
function
()
{
return
this
.
find
(
'
.edit
'
).
value
;
}
}
});
labs/architecture-examples/maria/src/js/views/TodosView.js
View file @
2a837ab2
maria
.
SetView
.
subclass
(
checkit
,
'
TodosAppView
'
,
{
uiActions
:
{
'
keyup #new-todo
'
:
'
onKeyupNewTodo
'
,
'
click #toggle-all
'
:
'
onClickToggleAll
'
,
'
click #clear-completed
'
:
'
onClickClearCompleted
'
},
properties
:
{
buildData
:
function
()
{
var
model
=
this
.
getModel
();
uiActions
:
{
'
keyup #new-todo
'
:
'
onKeyupNewTodo
'
,
'
click #toggle-all
'
:
'
onClickToggleAll
'
,
'
click #clear-completed
'
:
'
onClickClearCompleted
'
},
properties
:
{
buildData
:
function
()
{
var
model
=
this
.
getModel
();
var
checkbox
=
this
.
find
(
'
#toggle-all
'
);
checkbox
.
checked
=
model
.
isAllCompleted
();
checkbox
.
disabled
=
model
.
isEmpty
();
var
checkbox
=
this
.
find
(
'
#toggle-all
'
);
checkbox
.
checked
=
model
.
isAllCompleted
();
checkbox
.
disabled
=
model
.
isEmpty
();
var
todoList
=
this
.
find
(
'
#todo-list
'
);
model
.
getPossibleModes
().
forEach
(
function
(
mode
)
{
aristocrat
.
removeClass
(
todoList
,
mode
);
});
aristocrat
.
addClass
(
todoList
,
model
.
getMode
());
var
incompletedLength
=
model
.
getIncompleted
().
length
;
this
.
find
(
'
#todo-count
'
).
innerHTML
=
'
<strong>
'
+
incompletedLength
+
'
</strong>
'
+
((
incompletedLength
===
1
)
?
'
item
'
:
'
items
'
)
+
'
left
'
;
var
todoList
=
this
.
find
(
'
#todo-list
'
);
model
.
getPossibleModes
().
forEach
(
function
(
mode
)
{
aristocrat
.
removeClass
(
todoList
,
mode
);
});
aristocrat
.
addClass
(
todoList
,
model
.
getMode
());
var
incompletedLength
=
model
.
getIncompleted
().
length
;
this
.
find
(
'
#todo-count
'
).
innerHTML
=
'
<strong>
'
+
incompletedLength
+
'
</strong>
'
+
((
incompletedLength
===
1
)
?
'
item
'
:
'
items
'
)
+
'
left
'
;
var
selected
=
this
.
find
(
'
.selected
'
);
if
(
selected
)
{
aristocrat
.
removeClass
(
selected
,
'
selected
'
);
}
aristocrat
.
addClass
(
this
.
find
(
'
.
'
+
model
.
getMode
()
+
'
-filter
'
),
'
selected
'
);
var
selected
=
this
.
find
(
'
.selected
'
);
if
(
selected
)
{
aristocrat
.
removeClass
(
selected
,
'
selected
'
);
}
aristocrat
.
addClass
(
this
.
find
(
'
.
'
+
model
.
getMode
()
+
'
-filter
'
),
'
selected
'
);
var
completedLength
=
model
.
getCompleted
().
length
;
var
clearButton
=
this
.
find
(
'
#clear-completed
'
);
clearButton
.
style
.
display
=
(
completedLength
>
0
)
?
''
:
'
none
'
;
clearButton
.
innerHTML
=
'
Clear completed (
'
+
completedLength
+
'
)
'
;
},
update
:
function
(
evt
)
{
maria
.
SetView
.
prototype
.
update
.
call
(
this
,
evt
);
this
.
buildData
();
},
getContainerEl
:
function
()
{
// child views will be appended to this element
return
this
.
find
(
'
#todo-list
'
);
},
createChildView
:
function
(
todoModel
)
{
return
new
checkit
.
TodoView
(
todoModel
);
},
getInputValue
:
function
()
{
return
this
.
find
(
'
#new-todo
'
).
value
;
},
clearInput
:
function
()
{
this
.
find
(
'
#new-todo
'
).
value
=
''
;
}
}
var
completedLength
=
model
.
getCompleted
().
length
;
var
clearButton
=
this
.
find
(
'
#clear-completed
'
);
clearButton
.
style
.
display
=
(
completedLength
>
0
)
?
''
:
'
none
'
;
clearButton
.
innerHTML
=
'
Clear completed (
'
+
completedLength
+
'
)
'
;
},
update
:
function
(
evt
)
{
maria
.
SetView
.
prototype
.
update
.
call
(
this
,
evt
);
this
.
buildData
();
},
getContainerEl
:
function
()
{
// child views will be appended to this element
return
this
.
find
(
'
#todo-list
'
);
},
createChildView
:
function
(
todoModel
)
{
return
new
checkit
.
TodoView
(
todoModel
);
},
getInputValue
:
function
()
{
return
this
.
find
(
'
#new-todo
'
).
value
;
},
clearInput
:
function
()
{
this
.
find
(
'
#new-todo
'
).
value
=
''
;
}
}
});
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment