ende 0.3.5 → 0.3.6

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,39 +1,111 @@
1
1
  'use strict';
2
2
 
3
+ window.domo = []
4
+
3
5
  # TODO define componentjs required packages, as requirejs packages
4
6
  observable = require('indefinido-observable').mixin
5
7
 
6
- define ->
7
- (widget) ->
8
+ define ['stampit/stampit'], (stampit) ->
8
9
 
9
- widget = observable widget
10
+ scopingable = stampit
11
+ start: ->
12
+ deferred = @widget.sandbox.data.deferred()
10
13
 
11
- # TODO transfer data from old scope to new one
12
- # widget.subscribe 'scope', ->
14
+ # Update the scope after resolution
15
+ deferred.done ->
16
+ for scope_name, data of @widget.scopings
17
+ @widget.forward_scope_data scope_name, data
13
18
 
14
- enhance_presenter = (presenter) ->
15
- widget = @
16
- presenter.presentation ||= {binders: {}}
17
- presenter.presentation.binders ||= {}
19
+ # TODO think of a better method name than repopulate
20
+ @widget.repopulate()
21
+
22
+ @deferred = deferred
23
+
24
+ reset: ->
25
+ @start()
26
+
27
+ # TODO move bindings logic to here
28
+ enqueue: (scope_name, value) ->
29
+ @widget.scopings[scope_name] = value
30
+ ,
31
+ deferred: null
32
+ scopings: null
33
+ , ->
34
+
35
+ @widget.scopings ||= {}
18
36
 
19
- {presentation: {binders}} = presenter
37
+ # Resolve scopings after scoping has ended
38
+ @resolve = _.debounce =>
39
+ @deferred.resolveWith @, [@scopings]
40
+ @reset()
20
41
 
42
+ @
43
+
44
+
45
+
46
+ scopable = stampit
47
+ forward_scope_data: (scope_name, data) ->
48
+ switch @scope['$' + scope_name].constructor
49
+ when Array
50
+ data = [data] unless $.type(data) == 'array'
51
+ @scope[scope_name] data...
52
+ else
53
+ @scope[scope_name] data
54
+
55
+ enhancable_presenter: (presenter) ->
56
+ widget = @
57
+ scoping = scopingable widget: @
58
+ scoping.start()
59
+
60
+ # Update presenter interface to support binders customization
61
+ presenter.presentation ||= {binders: {}}
62
+ presenter.presentation.binders ||= {}
63
+ {presentation: {binders}} = presenter
21
64
 
65
+ # Create custom bindings for this scope, for storing scope
66
+ # changes per widget instance
22
67
  binders['scope-*'] =
23
68
  bind: ->
24
69
  @scope_name = @args[0].replace /-/g, '_'
70
+ @widget = widget
25
71
  routine: (element, value) ->
26
- widget.scope_to widget.scope[@scope_name] value
72
+ scoping.enqueue @scope_name, value
73
+ scoping.resolve()
27
74
 
28
75
  binders.scope =
29
-
76
+ bind: ->
77
+ @widget = widget
30
78
  routine: (element, value) ->
31
79
  keypath = @keypath.substring 1 if @keypath[0] == '_'
32
80
  name = "by_#{@key}_#{keypath || @keypath}"
33
- widget.scope_to widget.scope[name] value
34
81
 
35
- enhance_presenter.call widget, widget.presenter
36
- widget.subscribe 'presenter', enhance_presenter
82
+ scoping.enqueue name, value
83
+ scoping.resolve()
84
+
85
+
86
+ ,
87
+ scopings: null
88
+ , ->
89
+
90
+ observable @widget
91
+
92
+ # TODO compose this factory with the widget factory instead of
93
+ # creating a new instance and merging methods
94
+ stampit.mixIn @widget, scopable.fixed.methods
95
+
96
+ # TODO transfer data from old scope to new one
97
+ # widget.subscribe 'scope', ->
98
+
99
+ # TODO @widget.scopings = scopings = []
100
+ @widget.scopings = []
101
+ @enhancable_presenter.call @widget, @widget.presenter
102
+ @widget.subscribe 'presenter', @widget.enhancable_presenter
103
+
104
+ @widget
105
+
106
+
107
+ (widget) -> scopable widget: widget
108
+
37
109
 
38
110
 
39
111
 
data/lib/ende/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Ende
2
- VERSION = "0.3.5"
2
+ VERSION = "0.3.6"
3
3
  end
@@ -0,0 +1,111 @@
1
+ .overlay {
2
+ position: absolute;
3
+ top: 0;
4
+ left: 0;
5
+ opacity: 1;
6
+ width: 100%;
7
+ height: 100%;
8
+ background: rgba(0,0,0,.75);
9
+ -webkit-transition: opacity 300ms;
10
+ -moz-transition: opacity 300ms;
11
+ transition: opacity 300ms;
12
+ z-index: 500;
13
+ }
14
+
15
+ .overlay.hide {
16
+ pointer-events: none;
17
+ opacity: 0;
18
+ }
19
+
20
+ #dialog {
21
+ position: fixed;
22
+ left: 50%;
23
+ top: 150px;
24
+ max-width: 600px;
25
+ min-width: 250px;
26
+ border: 1px solid #eee;
27
+ background: white;
28
+ z-index: 1000;
29
+ }
30
+
31
+ #dialog .content {
32
+ padding: 15px 20px;
33
+ }
34
+
35
+ #dialog h1 {
36
+ margin: 0 0 5px 0;
37
+ font-size: 16px;
38
+ font-weight: normal;
39
+ }
40
+
41
+ #dialog p {
42
+ margin: 0;
43
+ padding: 0;
44
+ font-size: .9em;
45
+ }
46
+
47
+ /* close */
48
+
49
+ #dialog .close {
50
+ position: absolute;
51
+ top: 3px;
52
+ right: 10px;
53
+ text-decoration: none;
54
+ color: #888;
55
+ font-size: 16px;
56
+ font-weight: bold;
57
+ display: none;
58
+ }
59
+
60
+ #dialog .close em {
61
+ display: none;
62
+ }
63
+
64
+ #dialog.closable .close {
65
+ display: block;
66
+ }
67
+
68
+ #dialog .close:hover {
69
+ color: black;
70
+ }
71
+
72
+ #dialog .close:active {
73
+ margin-top: 1px;
74
+ }
75
+
76
+ /* slide */
77
+
78
+ #dialog.slide {
79
+ -webkit-transition: opacity 300ms, top 300ms;
80
+ -moz-transition: opacity 300ms, top 300ms;
81
+ }
82
+
83
+ #dialog.slide.hide {
84
+ opacity: 0;
85
+ top: -500px;
86
+ }
87
+
88
+ /* fade */
89
+
90
+ #dialog.fade {
91
+ -webkit-transition: opacity 300ms;
92
+ -moz-transition: opacity 300ms;
93
+ }
94
+
95
+ #dialog.fade.hide {
96
+ opacity: 0;
97
+ }
98
+
99
+ /* scale */
100
+
101
+ #dialog.scale {
102
+ -webkit-transition: -webkit-transform 300ms;
103
+ -moz-transition: -moz-transform 300ms;
104
+ -webkit-transform: scale(1);
105
+ -moz-transform: scale(1);
106
+ }
107
+
108
+ #dialog.scale.hide {
109
+ -webkit-transform: scale(0);
110
+ -moz-transform: scale(0);
111
+ }