Skip to content

Commit e1e89fe

Browse files
committed
Merge branch 'release/2.0.0'
2 parents b36d4b4 + cd71abb commit e1e89fe

File tree

11 files changed

+1556
-0
lines changed

11 files changed

+1556
-0
lines changed

package.json

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
{
2+
"name": "troopjs-browser",
3+
"version": "2.0.0",
4+
"description": "TroopJS browser package",
5+
"licenses": [
6+
{
7+
"type": "MIT",
8+
"url": "http://troopjs.mit-license.org"
9+
}
10+
],
11+
"repositories": [
12+
{
13+
"type": "git",
14+
"url": "https://github.com/troopjs/troopjs-browser"
15+
}
16+
],
17+
"bugs": "https://github.com/troopjs/troopjs-browser/issues",
18+
"maintainers": [
19+
{
20+
"name": "Mikael Karon",
21+
"web": "http://github.com/mikaelkaron"
22+
}
23+
]
24+
}

src/ajax/service.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/**
2+
* TroopJS browser/ajax/service
3+
* @license MIT http://troopjs.mit-license.org/ © Mikael Karon mailto:mikael@karon.se
4+
*/
5+
/*global define:false */
6+
define([ "troopjs-core/component/service", "jquery", "troopjs-utils/merge" ], function AjaxModule(Service, $, merge) {
7+
var TRACE = "trace";
8+
var TYPEOF_FUNCTION = typeof function () {};
9+
10+
return Service.extend({
11+
"displayName" : "browser/ajax/service",
12+
13+
"hub/ajax" : function ajax(topic, settings) {
14+
// Request
15+
return $.ajax(merge.call({
16+
"headers": {
17+
"x-request-id": new Date().getTime(),
18+
"x-components": typeof topic[TRACE] === TYPEOF_FUNCTION ? topic[TRACE]() : topic
19+
}
20+
}, settings));
21+
}
22+
});
23+
});

src/application/widget.js

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
/**
2+
* TroopJS browser/application/widget
3+
* @license MIT http://troopjs.mit-license.org/ © Mikael Karon mailto:mikael@karon.se
4+
*/
5+
/*global define:false */
6+
define([ "module", "../component/widget", "when" ], function ApplicationWidgetModule(module, Widget, when) {
7+
/*jshint laxbreak:true */
8+
9+
var CHILDREN = "children";
10+
var ARRAY_SLICE = Array.prototype.slice;
11+
12+
function forward() {
13+
var self = this;
14+
var _signal = this.signal;
15+
var children = self[CHILDREN];
16+
var length = children ? children.length : 0;
17+
var index = 0;
18+
var args;
19+
20+
function next(_args) {
21+
// Update args
22+
args = _args || args;
23+
24+
// Return a chained promise of next callback, or a promise resolved with args
25+
return length > index
26+
? when(_signal.apply(children[index++], args), next)
27+
: when.resolve(args);
28+
}
29+
30+
return next(ARRAY_SLICE.call(arguments));
31+
}
32+
33+
return Widget.extend(function ApplicationWidget($element, name, children) {
34+
this[CHILDREN] = children || [];
35+
}, {
36+
"displayName" : "browser/application/widget",
37+
38+
"sig/initialize" : forward,
39+
"sig/start" : function start() {
40+
var self = this;
41+
var _weave = self.weave;
42+
var args = arguments;
43+
44+
return forward.apply(self, args).then(function started() {
45+
return _weave.apply(self, ARRAY_SLICE.call(args, 1));
46+
});
47+
},
48+
"sig/stop" : function stop() {
49+
var self = this;
50+
var _unweave = self.unweave;
51+
var args = arguments;
52+
53+
return _unweave.apply(self, ARRAY_SLICE.call(args, 1)).then(function stopped() {
54+
return forward.apply(self, args);
55+
});
56+
},
57+
"sig/finalize" : forward
58+
});
59+
});

src/component/widget.js

Lines changed: 232 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,232 @@
1+
/**
2+
* TroopJS browser/component/widget
3+
* @license MIT http://troopjs.mit-license.org/ © Mikael Karon mailto:mikael@karon.se
4+
*/
5+
/*global define:false */
6+
define([ "troopjs-core/component/gadget", "jquery", "troopjs-jquery/weave", "troopjs-jquery/action" ], function WidgetModule(Gadget, $) {
7+
8+
var UNDEFINED;
9+
var ARRAY_PROTO = Array.prototype;
10+
var ARRAY_SLICE = ARRAY_PROTO.slice;
11+
var ARRAY_PUSH = ARRAY_PROTO.push;
12+
var TYPEOF_FUNCTION = typeof function () {};
13+
var $TRIGGER = $.fn.trigger;
14+
var $ON = $.fn.on;
15+
var $OFF = $.fn.off;
16+
var $WEAVE = $.fn.weave;
17+
var $UNWEAVE = $.fn.unweave;
18+
var $ELEMENT = "$element";
19+
var $HANDLERS = "$handlers";
20+
var ATTR_WEAVE = "[data-weave]";
21+
var ATTR_WOVEN = "[data-woven]";
22+
var LENGTH = "length";
23+
var FEATURES = "features";
24+
var TYPE = "type";
25+
var VALUE = "value";
26+
27+
/**
28+
* Creates a proxy of the inner method 'handlerProxy' with the 'topic', 'widget' and handler parameters set
29+
* @param {string} topic event topic
30+
* @param {object} widget target widget
31+
* @param {function} handler target handler
32+
* @returns {function} proxied handler
33+
*/
34+
function eventProxy(topic, widget, handler) {
35+
/**
36+
* Creates a proxy of the outer method 'handler' that first adds 'topic' to the arguments passed
37+
* @returns result of proxied hanlder invocation
38+
*/
39+
return function handlerProxy() {
40+
// Create args
41+
var args = [ topic ];
42+
43+
// Add add arguments to args
44+
ARRAY_PUSH.apply(args, arguments);
45+
46+
// Apply with shifted arguments to handler
47+
return handler.apply(widget, args);
48+
};
49+
}
50+
51+
/**
52+
* Creates a proxy of the inner method 'render' with the '$fn' parameter set
53+
* @param $fn jQuery method
54+
* @returns {Function} proxied render
55+
*/
56+
function renderProxy($fn) {
57+
/**
58+
* Renders contents into element
59+
* @param {Function|String} contents Template/String to render
60+
* @param {Object..} (data) If contents is a template - template data
61+
* @returns {Object} self
62+
*/
63+
function render(contents, data) {
64+
var self = this;
65+
var args = ARRAY_SLICE.call(arguments, 1);
66+
67+
// Call render with contents (or result of contents if it's a function)
68+
$fn.call(self[$ELEMENT], typeof contents === TYPEOF_FUNCTION ? contents.apply(self, args) : contents);
69+
70+
return self.weave();
71+
}
72+
73+
return render;
74+
}
75+
76+
return Gadget.extend(function Widget($element, displayName) {
77+
var self = this;
78+
79+
if ($element === UNDEFINED) {
80+
throw new Error("No $element provided");
81+
}
82+
83+
self[$ELEMENT] = $element;
84+
self[$HANDLERS] = [];
85+
86+
if (displayName !== UNDEFINED) {
87+
self.displayName = displayName;
88+
}
89+
}, {
90+
"displayName" : "browser/component/widget",
91+
92+
/**
93+
* Signal handler for 'initialize'
94+
*/
95+
"sig/initialize" : function initialize() {
96+
var self = this;
97+
var $element = self[$ELEMENT];
98+
var $handler;
99+
var $handlers = self[$HANDLERS];
100+
var handler;
101+
var handlers = self.constructor.specials.dom;
102+
var type;
103+
var features;
104+
var value;
105+
var i;
106+
var iMax;
107+
108+
// Iterate handlers
109+
for (i = 0, iMax = handlers ? handlers[LENGTH] : 0; i < iMax; i++) {
110+
// Get handler
111+
handler = handlers[i];
112+
113+
// Create $handler
114+
$handler = $handlers[i] = {};
115+
116+
// Set $handler properties
117+
$handler[TYPE] = type = handler[TYPE];
118+
$handler[FEATURES] = features = handler[FEATURES];
119+
$handler[VALUE] = value = eventProxy(type, self, handler[VALUE]);
120+
121+
// Attach event handler
122+
$ON.call($element, type, features, self, value);
123+
}
124+
},
125+
126+
/**
127+
* Signal handler for 'finalize'
128+
*/
129+
"sig/finalize" : function finalize() {
130+
var self = this;
131+
var $element = self[$ELEMENT];
132+
var $handler;
133+
var $handlers = self[$HANDLERS];
134+
var i;
135+
var iMax;
136+
137+
// Iterate $handlers
138+
for (i = 0, iMax = $handlers[LENGTH]; i < iMax; i++) {
139+
// Get $handler
140+
$handler = $handlers[i];
141+
142+
// Detach event handler
143+
$OFF.call($element, $handler[TYPE], $handler[FEATURES], $handler[VALUE]);
144+
}
145+
146+
// Delete ref to $ELEMENT (for safety)
147+
delete self[$ELEMENT];
148+
},
149+
150+
/**
151+
* Weaves all children of $element
152+
* @returns {Promise} from $.fn.weave
153+
*/
154+
"weave" : function weave() {
155+
return $WEAVE.apply(this[$ELEMENT].find(ATTR_WEAVE), arguments);
156+
},
157+
158+
/**
159+
* Unweaves all children of $element _and_ self
160+
* @returns {Promise} from $.fn.unweave
161+
*/
162+
"unweave" : function unweave() {
163+
return $UNWEAVE.apply(this[$ELEMENT].find(ATTR_WOVEN).addBack(), arguments);
164+
},
165+
166+
/**
167+
* Binds event to $element
168+
* @returns self
169+
*/
170+
"$on" : function $on() {
171+
var self = this;
172+
173+
$ON.apply(self[$ELEMENT], arguments);
174+
175+
return self;
176+
},
177+
178+
/**
179+
* Unbinds event from $element
180+
* @returns self
181+
*/
182+
"$off" : function $off() {
183+
var self = this;
184+
185+
$OFF.apply(self[$ELEMENT], arguments);
186+
187+
return self;
188+
},
189+
190+
/**
191+
* Triggers event on $element
192+
* @returns self
193+
*/
194+
"$emit" : function $emit() {
195+
var self = this;
196+
197+
$TRIGGER.apply(self[$ELEMENT], arguments);
198+
199+
return self;
200+
},
201+
202+
/**
203+
* Renders content and inserts it before $element
204+
*/
205+
"before" : renderProxy($.fn.before),
206+
207+
/**
208+
* Renders content and inserts it after $element
209+
*/
210+
"after" : renderProxy($.fn.after),
211+
212+
/**
213+
* Renders content and replaces $element contents
214+
*/
215+
"html" : renderProxy($.fn.html),
216+
217+
/**
218+
* Renders content and replaces $element contents
219+
*/
220+
"text" : renderProxy($.fn.text),
221+
222+
/**
223+
* Renders content and appends it to $element
224+
*/
225+
"append" : renderProxy($.fn.append),
226+
227+
/**
228+
* Renders content and prepends it to $element
229+
*/
230+
"prepend" : renderProxy($.fn.prepend)
231+
});
232+
});

src/dimensions/widget.js

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
/**
2+
* TroopJS browser/dimensions/widget
3+
* @license MIT http://troopjs.mit-license.org/ © Mikael Karon mailto:mikael@karon.se
4+
*/
5+
/*global define:false */
6+
define([ "../component/widget", "troopjs-jquery/dimensions", "troopjs-jquery/resize" ], function DimensionsModule(Widget) {
7+
var UNDEFINED;
8+
var DIMENSIONS = "dimensions";
9+
10+
function onDimensions($event, w, h) {
11+
var self = $event.data;
12+
13+
self.publish(self.displayName, w, h, $event);
14+
}
15+
16+
return Widget.extend(function DimensionsWidget($element, displayName, dimensions) {
17+
if (dimensions === UNDEFINED) {
18+
throw new Error("No dimensions provided");
19+
}
20+
21+
this[DIMENSIONS] = dimensions;
22+
}, {
23+
"displayName" : "browser/dimensions/widget",
24+
25+
"sig/initialize" : function initialize() {
26+
var self = this;
27+
28+
self.$on(DIMENSIONS + "." + self[DIMENSIONS], self, onDimensions);
29+
},
30+
31+
"sig/start" : function start() {
32+
this.$emit("resize." + DIMENSIONS);
33+
},
34+
35+
"sig/finalize" : function finalize() {
36+
var self = this;
37+
38+
self.$off(DIMENSIONS + "." + self[DIMENSIONS], onDimensions);
39+
}
40+
});
41+
});

0 commit comments

Comments
 (0)