rsence 2.1.1 → 2.1.2
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.
- data/VERSION +1 -1
- data/js/comm/transporter/transporter.js +1 -0
- data/js/controls/imageview/imageview.js +15 -6
- data/js/core/elem/elem.js +20 -4
- data/js/datetime/timesheet/timesheet.js +67 -23
- data/js/datetime/timesheet_item/timesheet_item.js +49 -14
- data/js/foundation/control/dyncontrol/dyncontrol.js +17 -3
- data/js/foundation/view/view.js +9 -8
- data/lib/values/hvalue.rb +4 -1
- data/plugins/main/main.rb +4 -5
- metadata +4 -4
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.1.
|
1
|
+
2.1.2
|
@@ -240,6 +240,7 @@ COMM.Transporter = HApplication.extend({
|
|
240
240
|
// console.log('sync.');
|
241
241
|
this.busy = true;
|
242
242
|
if(window['sesWatcher'] && window.sesWatcher['sesTimeoutValue']){
|
243
|
+
// Sets the value of the session watcher to the current time. It could cause an unnecessary re-sync poll immediately after this sync otherwise.
|
243
244
|
sesWatcher.sesTimeoutValue.set( new Date().getTime() );
|
244
245
|
}
|
245
246
|
var _this = this,
|
@@ -32,10 +32,13 @@ HImageView = HControl.extend({
|
|
32
32
|
})),
|
33
33
|
|
34
34
|
_makeScaleToFit: function(_parentId){
|
35
|
-
this.elemId = ELEM.make(_parentId,'img'
|
36
|
-
|
37
|
-
|
38
|
-
|
35
|
+
this.elemId = ELEM.make( _parentId, 'img', {
|
36
|
+
attrs: [
|
37
|
+
[ 'src', this.getImgSrc() ],
|
38
|
+
[ 'alt', this.label ],
|
39
|
+
[ 'title', this.label ]
|
40
|
+
]
|
41
|
+
} );
|
39
42
|
},
|
40
43
|
_makeScaleToOriginal: function(_parentId){
|
41
44
|
this.elemId = ELEM.make(_parentId,'div');
|
@@ -58,11 +61,17 @@ HImageView = HControl.extend({
|
|
58
61
|
*
|
59
62
|
**/
|
60
63
|
refreshValue: function(){
|
64
|
+
var _src = this.getImgSrc();
|
61
65
|
if(this.options.scaleToFit){
|
62
|
-
ELEM.
|
66
|
+
if(ELEM.getAttr(this.elemId,'src')!==_src){
|
67
|
+
ELEM.setAttr(this.elemId,'src',_src);
|
68
|
+
}
|
63
69
|
}
|
64
70
|
else{
|
65
|
-
|
71
|
+
var _url = 'url('+this.getImgSrc()+')';
|
72
|
+
if(ELEM.getStyle(this.elemId,'background-image') != _url){
|
73
|
+
ELEM.setStyle(this.elemId,'background-image',_url);
|
74
|
+
}
|
66
75
|
}
|
67
76
|
},
|
68
77
|
|
data/js/core/elem/elem.js
CHANGED
@@ -774,7 +774,6 @@ ELEM = {
|
|
774
774
|
_key = _currTodo.pop();
|
775
775
|
_val = _attrCache[_key];
|
776
776
|
_elem.setAttribute(_key, _val);
|
777
|
-
//_elem[_key]=_val;
|
778
777
|
}
|
779
778
|
},
|
780
779
|
|
@@ -827,7 +826,7 @@ ELEM = {
|
|
827
826
|
_attrTodo = _this._attrTodo[_id],
|
828
827
|
_attrCache = _this._attrCache[_id],
|
829
828
|
_differs = _value !== _this.getAttr(_id, _key);
|
830
|
-
if (_differs) {
|
829
|
+
if (_differs || _bypass) {
|
831
830
|
_attrCache[_key] = _value;
|
832
831
|
if (_bypass) {
|
833
832
|
_this._elements[_id].setAttribute(_key, _value);
|
@@ -1043,11 +1042,15 @@ ELEM = {
|
|
1043
1042
|
* +_tagName+:: The tag name of the element.
|
1044
1043
|
* (Optional, default: 'DIV')
|
1045
1044
|
*
|
1045
|
+
* +_options+:: Options to set before appending child to parent.
|
1046
|
+
* Supported option attrs: [[key,value],[key,value]]
|
1047
|
+
* (Optional, rarely necessary except when creating IMG tags)
|
1048
|
+
*
|
1046
1049
|
* = Returns
|
1047
1050
|
* The new ELEM ID.
|
1048
1051
|
*
|
1049
1052
|
**/
|
1050
|
-
make: function(_targetId, _tagName) {
|
1053
|
+
make: function(_targetId, _tagName, _options) {
|
1051
1054
|
if (_targetId === undefined) {
|
1052
1055
|
_targetId = 0;
|
1053
1056
|
}
|
@@ -1084,9 +1087,22 @@ ELEM = {
|
|
1084
1087
|
}
|
1085
1088
|
}
|
1086
1089
|
_elem = document.createElement(_tagName);
|
1087
|
-
_this._elements[_targetId].appendChild(_elem);
|
1088
1090
|
_id = _this._add(_elem);
|
1089
1091
|
_this._initCache(_id);
|
1092
|
+
if(_options!==undefined){
|
1093
|
+
if(_options.attrs){
|
1094
|
+
var
|
1095
|
+
i = 0,
|
1096
|
+
_key, _value;
|
1097
|
+
for( ; i<_options.attrs.length; i++ ){
|
1098
|
+
_key = _options.attrs[i][0];
|
1099
|
+
_value = _options.attrs[i][1];
|
1100
|
+
_elem[_key] = _value;
|
1101
|
+
_this.setAttr( _id, _key, _value );
|
1102
|
+
}
|
1103
|
+
}
|
1104
|
+
}
|
1105
|
+
_this._elements[_targetId].appendChild(_elem);
|
1090
1106
|
return _id;
|
1091
1107
|
},
|
1092
1108
|
|
@@ -11,10 +11,36 @@
|
|
11
11
|
***/
|
12
12
|
var//RSence.DateTime
|
13
13
|
HTimeSheet = HControl.extend({
|
14
|
+
|
14
15
|
componentName: 'timesheet',
|
16
|
+
|
17
|
+
/* Default amount of pixels per hour. Override with options when necessary. */
|
15
18
|
pxPerHour: 24,
|
19
|
+
|
20
|
+
/* Default amount of pixels from left. Override with options when necessary. */
|
16
21
|
itemOffsetLeft: 36,
|
22
|
+
|
23
|
+
/* Default amount of pixels from right. Override with options when necessary. */
|
17
24
|
itemOffsetRight: 0,
|
25
|
+
|
26
|
+
controlDefaults: HControlDefaults.extend({
|
27
|
+
pxPerHour: null,
|
28
|
+
itemOffsetLeft: null,
|
29
|
+
itemOffsetRight: null,
|
30
|
+
newItemLabel: 'New Item',
|
31
|
+
constructor: function(_ctrl){
|
32
|
+
if(this.pxPerHour !== null){
|
33
|
+
_ctrl.pxPerHour = this.pxPerHour;
|
34
|
+
}
|
35
|
+
if(this.itemOffsetLeft !== null){
|
36
|
+
_ctrl.itemOffsetLeft = this.itemOffsetLeft;
|
37
|
+
}
|
38
|
+
if(this.itemOffsetRight !== null){
|
39
|
+
_ctrl.itemOffsetRight = this.itemOffsetRight;
|
40
|
+
}
|
41
|
+
}
|
42
|
+
}),
|
43
|
+
|
18
44
|
/** = Description
|
19
45
|
* Redraws the timesheet.
|
20
46
|
*
|
@@ -82,16 +108,7 @@ HTimeSheet = HControl.extend({
|
|
82
108
|
if(origY>maxY){
|
83
109
|
origY = maxY;
|
84
110
|
}
|
85
|
-
|
86
|
-
this.createItemRect(origY,lineHeight),
|
87
|
-
this, {
|
88
|
-
label: 'New Item',
|
89
|
-
events: {
|
90
|
-
draggable: true
|
91
|
-
}
|
92
|
-
}
|
93
|
-
);
|
94
|
-
this.dragItem = item;
|
111
|
+
this.dragItem = this.createTimeSheetItem( { label: this.options.newItemLabel }, origY, lineHeight, 'create' );
|
95
112
|
},
|
96
113
|
|
97
114
|
/** = Description
|
@@ -144,6 +161,44 @@ HTimeSheet = HControl.extend({
|
|
144
161
|
this.base();
|
145
162
|
},
|
146
163
|
|
164
|
+
/** = Description
|
165
|
+
* Returns a new time sheet item control. By default returns an instance
|
166
|
+
* of HTimeSheetItem. Extend to use custom time sheet controls customized
|
167
|
+
* for application specific purposes.
|
168
|
+
*
|
169
|
+
* = Parameters
|
170
|
+
* *_value*:: A value object for the item.
|
171
|
+
* *_top*:: Top position, 0 by default.
|
172
|
+
* *_height*:: Height, same as half of +#pxPerHour+ by default.
|
173
|
+
* *_drogMode*:: Dragging mode. 'normal' or 'create'. Is 'normal' by default.
|
174
|
+
*
|
175
|
+
**/
|
176
|
+
createTimeSheetItem: function( _value, _top, _height, _dragMode ) {
|
177
|
+
if(_dragMode===undefined){
|
178
|
+
_dragMode = 'normal';
|
179
|
+
}
|
180
|
+
if(_top===undefined){
|
181
|
+
_top = 0;
|
182
|
+
}
|
183
|
+
if(_height===undefined){
|
184
|
+
_height = Math.round(this.pxPerHour/2);
|
185
|
+
}
|
186
|
+
var
|
187
|
+
_label = _value['label'],
|
188
|
+
_item = HTimeSheetItem.nu(
|
189
|
+
this.createItemRect( _top, _height ),
|
190
|
+
this, {
|
191
|
+
label: _label,
|
192
|
+
value: _value,
|
193
|
+
events: {
|
194
|
+
draggable: true
|
195
|
+
}
|
196
|
+
}
|
197
|
+
);
|
198
|
+
_item.dragMode = _dragMode;
|
199
|
+
return _item;
|
200
|
+
},
|
201
|
+
|
147
202
|
/** = Description
|
148
203
|
* Redraws and refreshes the values on timesheet.
|
149
204
|
*
|
@@ -160,21 +215,10 @@ HTimeSheet = HControl.extend({
|
|
160
215
|
this.listItemViews = [];
|
161
216
|
}
|
162
217
|
if(_data instanceof Array){
|
163
|
-
var _value,
|
218
|
+
var _value, _item;
|
164
219
|
for( i=0; i<_data.length; i++){
|
165
220
|
_value = _data[i];
|
166
|
-
|
167
|
-
_item = HTimeSheetItem.nu(
|
168
|
-
this.createItemRect( 0, 12 ),
|
169
|
-
this, {
|
170
|
-
label: _label,
|
171
|
-
value: _value,
|
172
|
-
events: {
|
173
|
-
draggable: true
|
174
|
-
}
|
175
|
-
}
|
176
|
-
);
|
177
|
-
_item.dragMode = 'normal';
|
221
|
+
_item = this.createTimeSheetItem( _value );
|
178
222
|
this.listItemViews.push( _item );
|
179
223
|
}
|
180
224
|
}
|
@@ -11,11 +11,25 @@
|
|
11
11
|
***/
|
12
12
|
var//RSence.DateTime
|
13
13
|
HTimeSheetItem = HControl.extend({
|
14
|
+
|
14
15
|
componentName: 'timesheet_item',
|
16
|
+
|
17
|
+
/* Which mode the component is in. When created by dragging, acts in 'create' mode, otherwise is 'normal'. Can be overridden in options. */
|
15
18
|
dragMode: 'create',
|
19
|
+
|
20
|
+
/* The previous coordinate. Used to detect double-drag as double-click. */
|
16
21
|
prevXY: [0,0],
|
22
|
+
|
23
|
+
/* The time at the previous coordinate. Used to detect double-drag as double-click. */
|
17
24
|
prevXYTime: 0,
|
18
25
|
|
26
|
+
controlDefaults: HControlDefaults.extend({
|
27
|
+
dragMode: 'create',
|
28
|
+
constructor: function(_ctrl){
|
29
|
+
_ctrl.dragMode = this.dragMode;
|
30
|
+
}
|
31
|
+
}),
|
32
|
+
|
19
33
|
/** = Description
|
20
34
|
* Dragging is used to change coordinates.
|
21
35
|
*
|
@@ -31,7 +45,7 @@ HTimeSheetItem = HControl.extend({
|
|
31
45
|
_xEquals = (Math.round(this.prevXY[0]/4) === Math.round(x/4)),
|
32
46
|
_yEquals = (Math.round(this.prevXY[1]/4) === Math.round(y/4)),
|
33
47
|
_noTimeout = ((_timeNow - this.prevXYTime) < 500);
|
34
|
-
if( _xEquals && _yEquals && _noTimeout ) {
|
48
|
+
if( _xEquals && _yEquals && _noTimeout ) { // doubleClick
|
35
49
|
if( this.parent['editor'] ){
|
36
50
|
var _editor = this.parent.editor;
|
37
51
|
_editor.setTimeSheetItem(this);
|
@@ -207,19 +221,18 @@ HTimeSheetItem = HControl.extend({
|
|
207
221
|
_value;
|
208
222
|
if(this.dragMode === 'create'){
|
209
223
|
this.parent.listItemViews.push( this );
|
210
|
-
_value = {
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
};
|
224
|
+
_value = {};
|
225
|
+
this._setValueTop( _value );
|
226
|
+
this._setValueBottom( _value );
|
227
|
+
this._setValueLabel( _value );
|
215
228
|
if(this.parent['editor']){
|
216
229
|
this.parent.editor.createItem( _value );
|
217
230
|
}
|
218
231
|
}
|
219
232
|
else {
|
220
233
|
_value = COMM.Values.clone( this.value );
|
221
|
-
_value
|
222
|
-
_value
|
234
|
+
this._setValueTop( _value );
|
235
|
+
this._setValueBottom( _value );
|
223
236
|
if(this.parent['editor']){
|
224
237
|
this.parent.editor.modifyItem( _value );
|
225
238
|
}
|
@@ -229,17 +242,39 @@ HTimeSheetItem = HControl.extend({
|
|
229
242
|
return true;
|
230
243
|
},
|
231
244
|
|
245
|
+
_setValueTop: function( _value ) {
|
246
|
+
_value['timeBegin'] = this.rect.top/this.parent.pxPerHour;
|
247
|
+
},
|
248
|
+
|
249
|
+
_setValueBottom: function( _value ) {
|
250
|
+
_value['timeEnd'] = this.rect.bottom/this.parent.pxPerHour;
|
251
|
+
},
|
252
|
+
|
253
|
+
_setValueLabel: function( _value ) {
|
254
|
+
_value['label'] = this.label;
|
255
|
+
},
|
256
|
+
|
257
|
+
_getValueLabel: function( _value ){
|
258
|
+
return _value.label;
|
259
|
+
},
|
260
|
+
|
261
|
+
_getValueTop: function( _value ){
|
262
|
+
return _value.timeBegin * this.parent.pxPerHour;
|
263
|
+
},
|
264
|
+
|
265
|
+
_getValueBottom: function( _value ){
|
266
|
+
return _value.timeEnd * this.parent.pxPerHour;
|
267
|
+
},
|
268
|
+
|
232
269
|
/** = Description
|
233
270
|
* Refreshes the object's label and place on the HTimeSheet.
|
234
271
|
*
|
235
272
|
**/
|
236
273
|
refreshValue: function(){
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
this.
|
241
|
-
this.rect.setTop( _value['timeBegin'] * _pxPerHour );
|
242
|
-
this.rect.setBottom( _value['timeEnd'] * _pxPerHour );
|
274
|
+
if ( HVM.type(this.value) === 'h' ){
|
275
|
+
this.setLabel( this._getValueLabel( this.value ) );
|
276
|
+
this.rect.setTop( this._getValueTop( this.value ) );
|
277
|
+
this.rect.setBottom( this._getValueBottom( this.value ) );
|
243
278
|
this.drawRect();
|
244
279
|
}
|
245
280
|
}
|
@@ -431,7 +431,13 @@ HDynControl = HControl.extend({
|
|
431
431
|
**/
|
432
432
|
startDrag: function(x,y,_isRightButton){
|
433
433
|
var _parent = this.parent;
|
434
|
-
|
434
|
+
// parent outer position
|
435
|
+
// parent inner position, if it has subviews with different offset.
|
436
|
+
if ( _parent.markupElemIds && _parent.markupElemIds.subview ) {
|
437
|
+
x -= ELEM._getVisibleLeftPosition( _parent.markupElemIds.subview );
|
438
|
+
y -= ELEM._getVisibleTopPosition( _parent.markupElemIds.subview );
|
439
|
+
}
|
440
|
+
else if(_parent.elemId){
|
435
441
|
x-=_parent.pageX();
|
436
442
|
y-=_parent.pageY();
|
437
443
|
}
|
@@ -459,7 +465,11 @@ HDynControl = HControl.extend({
|
|
459
465
|
**/
|
460
466
|
drag: function(x,y){
|
461
467
|
var _parent = this.parent;
|
462
|
-
if(_parent.
|
468
|
+
if ( _parent.markupElemIds && _parent.markupElemIds.subview ) {
|
469
|
+
x -= ELEM._getVisibleLeftPosition( _parent.markupElemIds.subview );
|
470
|
+
y -= ELEM._getVisibleTopPosition( _parent.markupElemIds.subview );
|
471
|
+
}
|
472
|
+
else if(_parent.elemId){
|
463
473
|
x-=_parent.pageX();
|
464
474
|
y-=_parent.pageY();
|
465
475
|
}
|
@@ -485,7 +495,11 @@ HDynControl = HControl.extend({
|
|
485
495
|
endDrag: function(x,y,_isRightButton){
|
486
496
|
this.base();
|
487
497
|
var _parent = this.parent;
|
488
|
-
if(_parent.
|
498
|
+
if ( _parent.markupElemIds && _parent.markupElemIds.subview ) {
|
499
|
+
x -= ELEM._getVisibleLeftPosition( _parent.markupElemIds.subview );
|
500
|
+
y -= ELEM._getVisibleTopPosition( _parent.markupElemIds.subview );
|
501
|
+
}
|
502
|
+
else if(_parent.elemId){
|
489
503
|
x-=_parent.pageX();
|
490
504
|
y-=_parent.pageY();
|
491
505
|
}
|
data/js/foundation/view/view.js
CHANGED
@@ -882,14 +882,15 @@ HView = HClass.extend({
|
|
882
882
|
else {
|
883
883
|
var
|
884
884
|
_rect = this.parent.rect,
|
885
|
-
_width = _rect.width,
|
886
|
-
_height = _rect.height;
|
887
|
-
|
888
|
-
|
889
|
-
|
890
|
-
|
891
|
-
|
892
|
-
|
885
|
+
_width, // = _rect.width,
|
886
|
+
_height, // = _rect.height;
|
887
|
+
_parentElemId = ( this.parent.markupElemIds && this.parent.markupElemIds.subview ) ? this.parent.markupElemIds.subview : this.parent.elemId;
|
888
|
+
// if (this.parent.flexLeft && this.parent.flexRight){
|
889
|
+
_width = parseInt( ELEM.getStyle( _parentElemId, 'width', true ), 10 );
|
890
|
+
// }
|
891
|
+
// if (this.parent.flexBottom && this.parent.flexTop){
|
892
|
+
_height = parseInt( ELEM.getStyle( _parentElemId, 'height', true ), 10 );
|
893
|
+
// }
|
893
894
|
return [ _width, _height ];
|
894
895
|
}
|
895
896
|
},
|
data/lib/values/hvalue.rb
CHANGED
@@ -84,7 +84,10 @@ module RSence
|
|
84
84
|
if RSence.args[:debug] and meta[:name] and not msg.valuemanager.id_exists?( msg, meta[:name] )
|
85
85
|
@value_id = meta[:name]
|
86
86
|
else
|
87
|
-
@value_id
|
87
|
+
@value_id = '_'
|
88
|
+
while @value_id[0] == 95 # ascii for '_'
|
89
|
+
@value_id = msg.valuemanager.randgen.gen
|
90
|
+
end
|
88
91
|
end
|
89
92
|
|
90
93
|
@meta = meta
|
data/plugins/main/main.rb
CHANGED
@@ -282,16 +282,15 @@ class MainPlugin < Plugin
|
|
282
282
|
## url_responder is bound in the client-space
|
283
283
|
## to tell the server its status by updating its value
|
284
284
|
location_href_id = ses[:location_href].val_id.to_json
|
285
|
-
msg.reply "COMM.Values.values[#{location_href_id}].bind(COMM.urlResponder);"
|
285
|
+
msg.reply "try{COMM.Values.values[#{location_href_id}].bind(COMM.urlResponder);}catch(e){console.log('urlResponder failed, reason:',e);}"
|
286
286
|
|
287
|
-
## This enables SesWatcher that changes :client_time every
|
288
|
-
## It makes the client to poll the server on regular intervals, when polling mode
|
289
|
-
## is disabled.
|
287
|
+
## This enables SesWatcher that changes :client_time every n seconds, which depends on the server_poll_interval configuration setting.
|
288
|
+
## It makes the client to poll the server on regular intervals, when polling mode is disabled.
|
290
289
|
# 5000ms = 5secs
|
291
290
|
|
292
291
|
client_time_id = ses[:client_time].val_id.to_json
|
293
292
|
poll_interval = ::RSence.config[:main_plugin][:server_poll_interval]
|
294
|
-
msg.reply "sesWatcher
|
293
|
+
msg.reply "try{window.sesWatcher=COMM.SessionWatcher.nu(#{poll_interval},#{client_time_id});}catch(e){console.log('sesWatcher failed, reason:',e);}"
|
295
294
|
|
296
295
|
end
|
297
296
|
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rsence
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 15
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 2
|
8
8
|
- 1
|
9
|
-
-
|
10
|
-
version: 2.1.
|
9
|
+
- 2
|
10
|
+
version: 2.1.2
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Riassence Inc.
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-12-
|
18
|
+
date: 2010-12-09 00:00:00 +02:00
|
19
19
|
default_executable: rsence
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|