rsence-pre 3.0.0.8 → 3.0.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/VERSION +1 -1
- data/client/conf/client_pkg.yaml +6 -2
- data/client/js/comm/queue/queue.js +32 -44
- data/client/js/comm/transporter/transporter.js +24 -16
- data/client/js/comm/values/values.js +27 -15
- data/client/js/controls/button/button.coffee +14 -5
- data/client/js/controls/button/themes/default/button.css +4 -2
- data/client/js/controls/checkbox/checkbox.js +4 -4
- data/client/js/controls/dialogs/sheet/sheet.js +11 -11
- data/client/js/controls/dialogs/sheet/themes/default/sheet.html +1 -1
- data/client/js/controls/imageview/imageview.js +15 -15
- data/client/js/controls/numerictextcontrol/numerictextcontrol.coffee +32 -10
- data/client/js/controls/onoffbutton/onoffbutton.coffee +5 -5
- data/client/js/controls/progress/progressbar/progressbar.js +6 -7
- data/client/js/controls/progress/progressbar/themes/default/progressbar.css +4 -4
- data/client/js/controls/progress/progressbar/themes/default/progressbar.html +1 -2
- data/client/js/controls/sliders/slider/slider.js +74 -79
- data/client/js/controls/stepper/stepper.js +31 -31
- data/client/js/controls/stringview/stringview.js +20 -8
- data/client/js/controls/tab/tab.js +57 -63
- data/client/js/controls/tab/themes/default/tab.html +4 -1
- data/client/js/controls/textcontrol/textcontrol.coffee +13 -3
- data/client/js/controls/validatorview/validatorview.js +4 -4
- data/client/js/controls/window/window.js +43 -56
- data/client/js/core/class/class.js +25 -23
- data/client/js/core/elem/elem.coffee +8 -1
- data/client/js/core/rsence_ns/rsence_ns.coffee +6 -2
- data/client/js/core/util/util_methods/util_methods.coffee +57 -15
- data/client/js/datetime/calendar/calendar.coffee +196 -199
- data/client/js/datetime/calendar/themes/default/calendar.css +81 -159
- data/client/js/datetime/calendar/themes/default/calendar.html +9 -18
- data/client/js/datetime/datepicker/datepicker.coffee +18 -3
- data/client/js/datetime/datetimepicker/datetimepicker.coffee +6 -1
- data/client/js/datetime/datetimevalue/datetimevalue.coffee +194 -0
- data/client/js/datetime/momentjs/momentjs.js +310 -76
- data/client/js/datetime/timepicker/timepicker.coffee +6 -1
- data/client/js/datetime/timesheet/timesheet.js +59 -61
- data/client/js/foundation/control/control.js +45 -44
- data/client/js/foundation/control/controldefaults/controldefaults.js +13 -9
- data/client/js/foundation/control/dyncontrol/dyncontrol.js +45 -57
- data/client/js/foundation/control/eventresponder/eventresponder.js +97 -97
- data/client/js/foundation/control/valuematrix/valuematrix.js +13 -13
- data/client/js/foundation/eventmanager/eventmanager.coffee +50 -32
- data/client/js/foundation/geom/rect/rect.js +43 -32
- data/client/js/foundation/locale_settings/locale_settings.js +36 -25
- data/client/js/foundation/system/system.js +79 -67
- data/client/js/foundation/thememanager/thememanager.coffee +11 -1
- data/client/js/foundation/value/pullvalue/pullvalue.coffee +7 -0
- data/client/js/foundation/value/pushvalue/pushvalue.coffee +25 -0
- data/client/js/foundation/value/value.js +22 -15
- data/client/js/foundation/view/view.js +94 -55
- data/client/js/foundation/view/viewdefaults/viewdefaults.js +5 -1
- data/client/js/lists/listitems/listitems.js +26 -4
- data/client/js/menus/combobox/combobox.coffee +55 -0
- data/client/js/menus/minimenu/minimenu.js +61 -30
- data/client/js/menus/minimenu/themes/default/minimenu.css +1 -6
- data/client/js/menus/minimenu/themes/default/minimenu.html +5 -4
- data/client/js/menus/minimenuitem/minimenuitem.js +6 -6
- data/client/js/menus/popupmenu/themes/default/popupmenu.css +1 -6
- data/client/js/menus/popupmenu/themes/default/popupmenu.html +5 -4
- data/client/js/tables/table/table.coffee +109 -64
- data/client/js/tables/table/themes/default/table.css +4 -0
- data/lib/rsence/msg.rb +64 -64
- data/lib/rsence/plugins/plugin.rb +68 -52
- data/lib/rsence/session/sequel_sessionstorage.rb +5 -5
- data/lib/rsence/value.rb +79 -59
- data/plugins/client_pkg/lib/client_pkg_build.rb +5 -1
- data/plugins/client_pkg/lib/client_pkg_serve.rb +40 -32
- data/plugins/main/js/main.js +46 -28
- metadata +6 -8
- data/client/js/datetime/calendar/themes/default/calendar_arrows.png +0 -0
- data/client/js/datetime/calendar/themes/default/calendar_bg.png +0 -0
- data/client/js/datetime/calendar/themes/default/calendar_parts1.png +0 -0
- data/client/js/datetime/calendar/themes/default/calendar_parts2.png +0 -0
- data/client/js/datetime/datetimepicker/datetimepicker.js +0 -210
- data/client/js/datetime/datetimevalue/datetimevalue.js +0 -265
@@ -9,13 +9,13 @@
|
|
9
9
|
***/
|
10
10
|
var//RSence.Controls
|
11
11
|
HWindow = HDynControl.extend({
|
12
|
-
|
12
|
+
|
13
13
|
componentName: 'window',
|
14
|
-
|
14
|
+
|
15
15
|
/** = Description
|
16
16
|
* In addition to the standard HControl#constructor options,
|
17
17
|
* the following properties can be set:
|
18
|
-
*
|
18
|
+
*
|
19
19
|
* Key:: Description
|
20
20
|
* +minX+:: The minimum X-coordinate allowed to be dragged or resized to.
|
21
21
|
* Defaults to +0+.
|
@@ -45,7 +45,7 @@ HWindow = HDynControl.extend({
|
|
45
45
|
* Defaults to +[ 16, 16 ]+
|
46
46
|
* +noResize+:: A flag (when true) disables all resizing and only allows
|
47
47
|
* moving. Does not disable the (-) and (+) buttons.
|
48
|
-
* +fullWindowMove+:: A flag (when true) enables the full HWindow area
|
48
|
+
* +fullWindowMove+:: A flag (when true) enables the full HWindow area
|
49
49
|
* responds to drag events. By default it's false,
|
50
50
|
* meaning only the title bar is draggable.
|
51
51
|
* +closeButton+:: A flag (when true) enables the close button of HWindow.
|
@@ -54,13 +54,13 @@ HWindow = HDynControl.extend({
|
|
54
54
|
* the HWindow instance.
|
55
55
|
* +collapseButton+:: A flag (when true) enables the collapse (or minimize)
|
56
56
|
* button of the HWindow instance. By default it's
|
57
|
-
* disabled. When enabled, extend the
|
57
|
+
* disabled. When enabled, extend the
|
58
58
|
* HWindow#windowCollapse method, which by default
|
59
59
|
* zooms the window to its +minSize+.
|
60
60
|
* +minimizeButton+:: An alias for +collapseButton+
|
61
61
|
* +zoomButton+:: A flag (when true) enables the zoom (or maximize)
|
62
62
|
* button of the HWindow instance. By default it's
|
63
|
-
* disabled. When enabled, extend the
|
63
|
+
* disabled. When enabled, extend the
|
64
64
|
* HWindow#windowZoom method, which by default zooms the
|
65
65
|
* contents of the HWindow to fit or the +maxSize+ depending
|
66
66
|
* on which is smaller.
|
@@ -68,41 +68,7 @@ HWindow = HDynControl.extend({
|
|
68
68
|
* +maximizeButton+:: An alias for +zoomButton+
|
69
69
|
*
|
70
70
|
**/
|
71
|
-
controlDefaults:
|
72
|
-
constructor: function(_ctrl){
|
73
|
-
var _winSize = ELEM.windowSize(),
|
74
|
-
_winWidth = _winSize[0],
|
75
|
-
_winHeight = _winSize[1];
|
76
|
-
if(!this.minSize){
|
77
|
-
this.minSize = [96,54];
|
78
|
-
}
|
79
|
-
if(!this.maxSize){
|
80
|
-
this.maxSize = _winSize;
|
81
|
-
}
|
82
|
-
if(!this.maxX){
|
83
|
-
this.maxX = _winWidth-this.minSize[0];
|
84
|
-
}
|
85
|
-
if(!this.maxY){
|
86
|
-
this.maxY = _winHeight-this.minSize[1];
|
87
|
-
}
|
88
|
-
if(!this.events){
|
89
|
-
this.events = {
|
90
|
-
draggable: true
|
91
|
-
};
|
92
|
-
}
|
93
|
-
if(!this.resizeNW){
|
94
|
-
this.resizeNW = [ 6, 6 ];
|
95
|
-
}
|
96
|
-
if(!this.resizeNE){
|
97
|
-
this.resizeNE = [ 6, 6 ];
|
98
|
-
}
|
99
|
-
if(!this.resizeSW){
|
100
|
-
this.resizeSW = [ 6, 6 ];
|
101
|
-
}
|
102
|
-
if(!this.resizeSE){
|
103
|
-
this.resizeSE = [ 25, 25 ];
|
104
|
-
}
|
105
|
-
},
|
71
|
+
controlDefaults: HDynControl.prototype.controlDefaults.extend({
|
106
72
|
maxX: 'auto',
|
107
73
|
maxY: 'auto',
|
108
74
|
maxSize: 'auto',
|
@@ -117,8 +83,29 @@ HWindow = HDynControl.extend({
|
|
117
83
|
zoomButton: false,
|
118
84
|
resizeButton: false,
|
119
85
|
maximizeButton: false
|
120
|
-
})
|
121
|
-
|
86
|
+
}),
|
87
|
+
|
88
|
+
customOptions: function(_options){
|
89
|
+
var
|
90
|
+
_winSize = ELEM.windowSize(),
|
91
|
+
_winWidth = _winSize[0],
|
92
|
+
_winHeight = _winSize[1];
|
93
|
+
if(!_options.minSize){ _options.minSize = [96,54]; }
|
94
|
+
|
95
|
+
if(!_options.maxSize){ _options.maxSize = _winSize; }
|
96
|
+
if(!_options.maxX ){ _options.maxX = _winWidth-_options.minSize[0]; }
|
97
|
+
if(!_options.maxY ){ _options.maxY = _winHeight-_options.minSize[1]; }
|
98
|
+
|
99
|
+
if(!_options.resizeNW){ _options.resizeNW = [ 6, 6 ]; }
|
100
|
+
if(!_options.resizeNE){ _options.resizeNE = [ 6, 6 ]; }
|
101
|
+
if(!_options.resizeSW){ _options.resizeSW = [ 6, 6 ]; }
|
102
|
+
if(!_options.resizeSE){ _options.resizeSE = [ 25, 25 ]; }
|
103
|
+
},
|
104
|
+
|
105
|
+
defaultEvents: {
|
106
|
+
draggable: true
|
107
|
+
},
|
108
|
+
|
122
109
|
draw: function(){
|
123
110
|
var _drawn = this.drawn;
|
124
111
|
this.base();
|
@@ -181,7 +168,7 @@ HWindow = HDynControl.extend({
|
|
181
168
|
this.base(_state);
|
182
169
|
this.refreshWidgetStates();
|
183
170
|
},
|
184
|
-
|
171
|
+
|
185
172
|
// -- overrides the drag rules to adapt to the !fullWindowMove as well
|
186
173
|
// as disabling draggability in window button areas. ++
|
187
174
|
|
@@ -210,7 +197,7 @@ HWindow = HDynControl.extend({
|
|
210
197
|
}
|
211
198
|
return _rectRules;
|
212
199
|
},
|
213
|
-
|
200
|
+
|
214
201
|
maxRect: function(){
|
215
202
|
var _rect = this.base(), _opts = this.options;
|
216
203
|
if(_rect[2]<_opts.minSize[0]){
|
@@ -230,29 +217,29 @@ HWindow = HDynControl.extend({
|
|
230
217
|
|
231
218
|
hasWindowFocus: false,
|
232
219
|
|
233
|
-
/** Reports to HSystem that this window has the focus and the
|
234
|
-
* previously active window needs to blur
|
220
|
+
/** Reports to HSystem that this window has the focus and the
|
221
|
+
* previously active window needs to blur
|
235
222
|
**/
|
236
223
|
gainedActiveStatus: function(){
|
237
224
|
HSystem.windowFocus(this);
|
238
225
|
},
|
239
|
-
|
226
|
+
|
240
227
|
/** HSystem calls this method, whenever this window is allowed to be focused
|
241
228
|
**/
|
242
229
|
windowFocus: function(){
|
243
230
|
this.hasWindowFocus = true;
|
244
231
|
this.toggleCSSClass(this.elemId, 'inactive', false);
|
245
232
|
},
|
246
|
-
|
247
|
-
/** HSystem calls this method, whenever this window needs to lose its
|
248
|
-
* focus (another window focused)
|
233
|
+
|
234
|
+
/** HSystem calls this method, whenever this window needs to lose its
|
235
|
+
* focus (another window focused)
|
249
236
|
**/
|
250
237
|
windowBlur: function(){
|
251
238
|
this.hasWindowFocus = false;
|
252
239
|
this.toggleCSSClass(this.elemId, 'inactive', true);
|
253
240
|
this.setStyle('cursor','default');
|
254
241
|
},
|
255
|
-
|
242
|
+
|
256
243
|
/** This method gets called, whenever the close button has been clicked
|
257
244
|
**/
|
258
245
|
windowClose: function(){
|
@@ -274,8 +261,8 @@ HWindow = HDynControl.extend({
|
|
274
261
|
}
|
275
262
|
this.makeRectRules();
|
276
263
|
},
|
277
|
-
|
278
|
-
/** This method gets called, whenever the collapse (minimize) button has
|
264
|
+
|
265
|
+
/** This method gets called, whenever the collapse (minimize) button has
|
279
266
|
* been clicked
|
280
267
|
**/
|
281
268
|
windowCollapse: function(_rectOnly){
|
@@ -308,8 +295,8 @@ HWindow = HDynControl.extend({
|
|
308
295
|
}
|
309
296
|
this.makeRectRules();
|
310
297
|
},
|
311
|
-
|
312
|
-
/** This method gets called, whenever the zoom (maximize/restore)
|
298
|
+
|
299
|
+
/** This method gets called, whenever the zoom (maximize/restore)
|
313
300
|
* button has been clicked
|
314
301
|
**/
|
315
302
|
windowZoom: function(){
|
@@ -18,7 +18,7 @@
|
|
18
18
|
* * To achieve the above without resorting to global functions to build prototype chains
|
19
19
|
* * To achieve the above without affecting Object.prototype
|
20
20
|
*
|
21
|
-
* The HClass class extends the 'Object' object by adding one instance method (base)
|
21
|
+
* The HClass class extends the 'Object' object by adding one instance method (base)
|
22
22
|
* and two class methods (extend, implement). Instance method extend can be also called directly.
|
23
23
|
*
|
24
24
|
* == Example:
|
@@ -30,10 +30,10 @@
|
|
30
30
|
* this.foo = foo;
|
31
31
|
* }
|
32
32
|
* });
|
33
|
-
*
|
33
|
+
*
|
34
34
|
* myClassInstance1 = MyClass.nu( 'rabbids' );
|
35
35
|
* myClassInstance2 = new MyClass( 'ribbit' );
|
36
|
-
*
|
36
|
+
*
|
37
37
|
* MyEqualsClass = MyClass.extend({
|
38
38
|
* testFoo: function( that ){
|
39
39
|
* return this.foo === that.foo;
|
@@ -68,10 +68,10 @@ HClass.prototype = {
|
|
68
68
|
for (prop in e) {
|
69
69
|
err[prop] = e[prop];
|
70
70
|
}
|
71
|
-
err
|
71
|
+
err.string = e.toString();
|
72
72
|
return err;
|
73
73
|
},
|
74
|
-
|
74
|
+
|
75
75
|
/* The property copying method. */
|
76
76
|
extend: function(_source, _value) {
|
77
77
|
var _extend = HClass.prototype.extend,
|
@@ -79,7 +79,7 @@ HClass.prototype = {
|
|
79
79
|
if (arguments.length === 2) {
|
80
80
|
_ancestor = this[_source];
|
81
81
|
// only methods are inherited
|
82
|
-
if ((_ancestor
|
82
|
+
if ((typeof _ancestor === 'function') && (typeof _value === 'function') &&
|
83
83
|
_ancestor.valueOf() !== _value.valueOf() && (/\bbase\b/).test(_value)) {
|
84
84
|
_method = _value;
|
85
85
|
_value = function() {
|
@@ -96,7 +96,7 @@ HClass.prototype = {
|
|
96
96
|
_returnValue = _method.apply(this, arguments);
|
97
97
|
}
|
98
98
|
catch(e){
|
99
|
-
!this.isProduction && console.warn("An exception occurred while calling base: ",HClass.prototype._exceptionProperties(e)," object: ",
|
99
|
+
!this.isProduction && console.warn("An exception occurred while calling base: ",HClass.prototype._exceptionProperties(e)," object: ",_method);
|
100
100
|
_returnValue = null;
|
101
101
|
}
|
102
102
|
// then because event this function can be called from child method
|
@@ -133,21 +133,23 @@ HClass.prototype = {
|
|
133
133
|
}
|
134
134
|
}
|
135
135
|
}
|
136
|
-
|
136
|
+
|
137
137
|
// alternative constructor (use instead of the new keywoard)
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
138
|
+
var
|
139
|
+
_nu = function(){
|
140
|
+
try{
|
141
|
+
return new (this.extend({ constructor: function( _args ){ this.base.apply( this, _args ); } } ))( arguments );
|
142
|
+
}
|
143
|
+
catch(e){
|
144
|
+
console.log(e,this);
|
145
|
+
return {};
|
146
|
+
}
|
146
147
|
};
|
148
|
+
this.nu = _nu;
|
149
|
+
this['new'] = _nu;
|
147
150
|
this.hasAncestor = function( _obj ){
|
148
151
|
return !!~this.ancestors.indexOf( _obj );
|
149
152
|
};
|
150
|
-
this['new'] = this.nu;
|
151
153
|
return this;
|
152
154
|
},
|
153
155
|
/** = Description
|
@@ -224,7 +226,7 @@ HClass.extend = function(_instance, _static) {
|
|
224
226
|
_constructor = _prototype.constructor;
|
225
227
|
_prototype.constructor = this;
|
226
228
|
delete HClass._prototyping;
|
227
|
-
|
229
|
+
|
228
230
|
_ancestors = [];
|
229
231
|
_klass = function() {
|
230
232
|
if (!HClass._prototyping) {
|
@@ -268,7 +270,7 @@ HClass.ancestors = [ HClass ];
|
|
268
270
|
*
|
269
271
|
* = Usage:
|
270
272
|
* Defines an interface:
|
271
|
-
*
|
273
|
+
*
|
272
274
|
* AreaInterface = HClass.extend({
|
273
275
|
* constructor: null,
|
274
276
|
* // implement
|
@@ -279,7 +281,7 @@ HClass.ancestors = [ HClass ];
|
|
279
281
|
* return this.getWidth() * this.getHeight();
|
280
282
|
* }
|
281
283
|
* });
|
282
|
-
*
|
284
|
+
*
|
283
285
|
* Rectangle = HClass.extend({
|
284
286
|
* constructor: function(x, y, width, height) {
|
285
287
|
* this.x = x;
|
@@ -294,7 +296,7 @@ HClass.ancestors = [ HClass ];
|
|
294
296
|
* return this.height;
|
295
297
|
* }
|
296
298
|
* });
|
297
|
-
*
|
299
|
+
*
|
298
300
|
* Rectangle.implement(AreaInterface);
|
299
301
|
*
|
300
302
|
**/
|
@@ -353,8 +355,8 @@ if (!Function.prototype.bind) {
|
|
353
355
|
// closest thing possible to the ECMAScript 5 internal IsCallable function
|
354
356
|
throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable");
|
355
357
|
}
|
356
|
-
var aArgs = Array.prototype.slice.call(arguments, 1),
|
357
|
-
fToBind = this,
|
358
|
+
var aArgs = Array.prototype.slice.call(arguments, 1),
|
359
|
+
fToBind = this,
|
358
360
|
fNOP = function () {},
|
359
361
|
fBound = function () {
|
360
362
|
return fToBind.apply(
|
@@ -435,6 +435,13 @@ ELEM = HClass.extend
|
|
435
435
|
flush: ->
|
436
436
|
@flushLoop()
|
437
437
|
|
438
|
+
flushElem: (_elemIds)->
|
439
|
+
_elemIds = [_elemIds] if typeof _elemIds == 'number'
|
440
|
+
for _id in _elemIds
|
441
|
+
continue unless @_elemTodoH[_id]
|
442
|
+
@_elemTodoH[_id] = false
|
443
|
+
@_flushStyleCache(_id)
|
444
|
+
@_flushAttrCache(_id)
|
438
445
|
###
|
439
446
|
Performs the flush of flushLoop
|
440
447
|
###
|
@@ -932,7 +939,7 @@ ELEM = HClass.extend
|
|
932
939
|
@_init()
|
933
940
|
else
|
934
941
|
ELEM._domLoadTimer = setTimeout( =>
|
935
|
-
|
942
|
+
@._domWaiter()
|
936
943
|
, 10 )
|
937
944
|
null
|
938
945
|
ELEM.reset()
|
@@ -22,7 +22,7 @@ RSence =
|
|
22
22
|
user-select: text;
|
23
23
|
}
|
24
24
|
''')
|
25
|
-
|
25
|
+
|
26
26
|
# Call this method from the index page for
|
27
27
|
# client-only features
|
28
28
|
clientConf: (_clientPrefix)->
|
@@ -38,7 +38,7 @@ RSence =
|
|
38
38
|
RSence.clientConf( _clientPrefix )
|
39
39
|
COMM.AutoSyncStarter.start()
|
40
40
|
null
|
41
|
-
|
41
|
+
|
42
42
|
# Storage for guiTrees, cantains
|
43
43
|
# JSONRenderer instances by plugin name.
|
44
44
|
guiTrees: {}
|
@@ -50,3 +50,7 @@ RSence =
|
|
50
50
|
_guiTree.die()
|
51
51
|
_guiTrees[_guiName] = null
|
52
52
|
delete _guiTrees[_guiName]
|
53
|
+
|
54
|
+
# Passthrough hook for setting locale data
|
55
|
+
setLocaleData: (_localeData)->
|
56
|
+
HLocale.setData(_localeData)
|
@@ -10,9 +10,28 @@ UtilMethods = (->
|
|
10
10
|
's' # string
|
11
11
|
]
|
12
12
|
|
13
|
+
pushTask: (_fn)->
|
14
|
+
COMM.Queue.push(_fn)
|
15
|
+
|
16
|
+
unshiftTask: (_fn)->
|
17
|
+
COMM.Queue.unshift(_fn)
|
18
|
+
|
19
|
+
msNow: ->
|
20
|
+
new Date().getTime()
|
21
|
+
|
13
22
|
getValueById: (_id)->
|
14
23
|
COMM.Values.values[_id]
|
15
24
|
|
25
|
+
isFloat: (_num)-> ( Math.round(_num) != _num )
|
26
|
+
|
27
|
+
moment: (_date,_format)->
|
28
|
+
if @options
|
29
|
+
if @options.useUTC == true or (@options.useUTC == null and HLocale.dateTime.defaultOptions.useUTC == true)
|
30
|
+
return moment.utc(_date,_format)
|
31
|
+
else if HLocale.dateTime.defaultOptions.useUTC == true
|
32
|
+
return moment.utc(_date,_format)
|
33
|
+
moment(_date,_format)
|
34
|
+
|
16
35
|
###
|
17
36
|
# Returns object type as a single-char string.
|
18
37
|
# Use this method to detect the type of the object given.
|
@@ -26,8 +45,9 @@ UtilMethods = (->
|
|
26
45
|
# - 'h': Hash (Generic Object)
|
27
46
|
# - 'd': Date
|
28
47
|
# - 'b': Boolean (true/false)
|
29
|
-
# - 'n': Number (
|
48
|
+
# - 'n': Number (integer or float, use #isFloat to see whether it's a float or integer )
|
30
49
|
# - 's': String
|
50
|
+
# - '>': Function
|
31
51
|
# - '~': Null
|
32
52
|
# - '-': Undefined
|
33
53
|
# - false: unknown
|
@@ -35,12 +55,13 @@ UtilMethods = (->
|
|
35
55
|
typeChr: (_obj)->
|
36
56
|
return '~' if _obj == null
|
37
57
|
return '-' unless _obj?
|
58
|
+
return '>' if _obj instanceof Function
|
38
59
|
_typeChr = (typeof _obj).slice(0,1)
|
39
60
|
return _typeChr if @arrIncludes(@_builtinTypeChr,_typeChr)
|
40
61
|
if _typeChr == 'o'
|
41
|
-
return 'a' if _obj
|
62
|
+
return 'a' if _obj instanceof Array
|
63
|
+
return 'd' if _obj instanceof Date
|
42
64
|
return 'h' if _obj.constructor == Object
|
43
|
-
return 'd' if _obj.constructor == Date
|
44
65
|
return false
|
45
66
|
|
46
67
|
baseStrToNum: (_str, _base)->
|
@@ -61,10 +82,10 @@ UtilMethods = (->
|
|
61
82
|
|
62
83
|
base36ToNum: (_base36)->
|
63
84
|
@baseStrToNum(_base36,36)
|
64
|
-
|
85
|
+
|
65
86
|
numToBase36: (_num)->
|
66
87
|
@baseIntToStr(_num,36)
|
67
|
-
|
88
|
+
|
68
89
|
_hexColorLengths: [3,4,6,7]
|
69
90
|
_hexCharacters: ['0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f']
|
70
91
|
_hex3To6Ratio: 4097 # parseInt('1001',16)
|
@@ -132,6 +153,27 @@ UtilMethods = (->
|
|
132
153
|
catch e
|
133
154
|
console.log('_'+'decodeString failed for _'+'str: ',_str)
|
134
155
|
return _str
|
156
|
+
# Recursively merges two objects of identical structure (array or object)
|
157
|
+
updateObject: (_src,_dst)->
|
158
|
+
_typeSrc = @typeChr(_src)
|
159
|
+
_typeDst = @typeChr(_dst)
|
160
|
+
_merge = (_item,_src,_dst,i)=>
|
161
|
+
_itemType = @typeChr(_item)
|
162
|
+
if _itemType == @typeChr(_dst[i])
|
163
|
+
if _itemType == 'a' or _itemType == 'h'
|
164
|
+
@updateObjects( _item, _dst[i] )
|
165
|
+
else
|
166
|
+
_dst[i] = _item
|
167
|
+
else if !@isProduction
|
168
|
+
console.warn('updateObject; mismatching item type: ', _itemType, ' (', _item, ') vs ', @_typeChr(_dst[i]), ' (',_dst[i], ')')
|
169
|
+
if _typeSrc == _typeDst
|
170
|
+
if _typeSrc == 'a'
|
171
|
+
for _item, i in _src
|
172
|
+
_merge(_item,_src,_dst,i)
|
173
|
+
else if _typeSrc == 'h'
|
174
|
+
for i, _item of _src
|
175
|
+
_itemType = @typeChr(_item)
|
176
|
+
_merge(_itemType,_src,_dst,i)
|
135
177
|
# Returns a decoded Array with the decoded content of Array _arr
|
136
178
|
_decodeArr: (_arr)->
|
137
179
|
_output = []
|
@@ -146,13 +188,13 @@ UtilMethods = (->
|
|
146
188
|
_output
|
147
189
|
## = Description
|
148
190
|
# Decodes a JSON object. Decodes the url-encoded strings within.
|
149
|
-
#
|
191
|
+
#
|
150
192
|
# = Parameters
|
151
193
|
# +_ibj+:: A raw object with special characters contained.
|
152
|
-
#
|
194
|
+
#
|
153
195
|
# = Returns
|
154
196
|
# A version of the object with the contained strings decoded to unicode.
|
155
|
-
#
|
197
|
+
#
|
156
198
|
##
|
157
199
|
decodeObject: (_obj)->
|
158
200
|
return null unless _obj?
|
@@ -178,7 +220,7 @@ UtilMethods = (->
|
|
178
220
|
catch e
|
179
221
|
console.log('invalid json:',_obj)
|
180
222
|
return "{}"
|
181
|
-
|
223
|
+
|
182
224
|
# decodeObject: (_obj)->
|
183
225
|
# return null unless _obj?
|
184
226
|
# _type = @typeChr(_obj)
|
@@ -192,7 +234,7 @@ UtilMethods = (->
|
|
192
234
|
# catch e
|
193
235
|
# console.log e, _obj
|
194
236
|
# _obj
|
195
|
-
|
237
|
+
|
196
238
|
cloneObject: ( _obj )->
|
197
239
|
unless _obj?
|
198
240
|
console.log 'WARNING: clone of undefined returns null.' if _obj == undefined
|
@@ -217,10 +259,10 @@ UtilMethods = (->
|
|
217
259
|
'{'+_output.join(',')+'}'
|
218
260
|
## = Description
|
219
261
|
# Encodes any object into an ASCII string. Special characters are url-encoded.
|
220
|
-
#
|
262
|
+
#
|
221
263
|
# = Parameters
|
222
264
|
# +_obj+:: Any object (including primary types)
|
223
|
-
#
|
265
|
+
#
|
224
266
|
# = Returns
|
225
267
|
# A +String+ representation of +_obj+
|
226
268
|
##
|
@@ -240,14 +282,14 @@ UtilMethods = (->
|
|
240
282
|
'null'
|
241
283
|
## = Description
|
242
284
|
# Makes a deep copy of the object.
|
243
|
-
#
|
285
|
+
#
|
244
286
|
# When you use assignment of a js object, only primitive object
|
245
287
|
# types (strings, numbers and booleans) are copied. This method
|
246
288
|
# makes a deep (nested) clone of the input object.
|
247
|
-
#
|
289
|
+
#
|
248
290
|
# = Parameters
|
249
291
|
# +_obj+:: Any object
|
250
|
-
#
|
292
|
+
#
|
251
293
|
# = Returns
|
252
294
|
# A copy of the object
|
253
295
|
##
|