social_stream 0.12.7 → 0.12.8
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/base/lib/social_stream/base.rb +4 -4
- data/base/lib/social_stream/base/version.rb +1 -1
- data/base/lib/social_stream/controllers/cancan_devise_integration.rb +4 -2
- data/base/spec/controllers/users_controller_spec.rb +1 -3
- data/lib/social_stream/version.rb +1 -1
- data/presence/app/assets/javascripts/xmpp_client.js.erb +227 -190
- data/presence/app/assets/stylesheets/chat.css +9 -3
- data/social_stream.gemspec +1 -1
- metadata +6 -6
@@ -25,10 +25,6 @@ module SocialStream
|
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
28
|
-
initializer "social_stream-base.cancan_devise_integration" do
|
29
|
-
ApplicationController.rescue_handlers += [["CanCan::AccessDenied", :rescue_from_access_denied]]
|
30
|
-
end
|
31
|
-
|
32
28
|
initializer "social_stream-base.toolbar_config" do
|
33
29
|
SocialStream::ToolbarConfig.module_eval do
|
34
30
|
include SocialStream::ToolbarConfig::Base
|
@@ -52,6 +48,10 @@ module SocialStream
|
|
52
48
|
config.email_method = :mailboxer_email
|
53
49
|
end
|
54
50
|
end
|
51
|
+
|
52
|
+
config.to_prepare do
|
53
|
+
ApplicationController.rescue_handlers += [["CanCan::AccessDenied", :rescue_from_access_denied]]
|
54
|
+
end
|
55
55
|
end
|
56
56
|
end
|
57
57
|
end
|
@@ -10,8 +10,10 @@ module SocialStream
|
|
10
10
|
|
11
11
|
# Redirect to login if the user is trying to access a protected resource
|
12
12
|
# and she is not authenticated
|
13
|
-
def rescue_from_access_denied
|
14
|
-
|
13
|
+
def rescue_from_access_denied(exception)
|
14
|
+
if user_signed_in?
|
15
|
+
raise exception
|
16
|
+
else
|
15
17
|
redirect_to new_user_session_path
|
16
18
|
end
|
17
19
|
end
|
@@ -6,7 +6,6 @@ function log(msg) {
|
|
6
6
|
//console.log(msg)
|
7
7
|
}
|
8
8
|
|
9
|
-
|
10
9
|
////////////////////
|
11
10
|
//Hash table
|
12
11
|
////////////////////
|
@@ -24,6 +23,18 @@ statusIcons['away'] = "away";
|
|
24
23
|
statusIcons['xa'] = "away";
|
25
24
|
statusIcons['dnd'] = "dnd";
|
26
25
|
|
26
|
+
var chatIcons = new Array();
|
27
|
+
chatIcons[':)'] = "face-smile.png";
|
28
|
+
chatIcons[':('] = "face-sad.png";
|
29
|
+
chatIcons['(B)'] = "beer.png";
|
30
|
+
chatIcons['(C)'] = "clock.png";
|
31
|
+
chatIcons['(P)'] = "present.png";
|
32
|
+
chatIcons[':P']= "face-raspberry.png";
|
33
|
+
chatIcons[':Z']= "face-tired.png";
|
34
|
+
chatIcons['(R)']= "rain.png";
|
35
|
+
chatIcons['(S)']= "sun.png";
|
36
|
+
chatIcons[';)']= "face-wink.png";
|
37
|
+
|
27
38
|
////////////////////
|
28
39
|
//Connect functions
|
29
40
|
////////////////////
|
@@ -230,32 +241,107 @@ function onMessage(msg) {
|
|
230
241
|
return true;
|
231
242
|
}
|
232
243
|
|
244
|
+
|
245
|
+
|
246
|
+
function onPresence(presence) {
|
247
|
+
|
248
|
+
//Check presence stanza type
|
249
|
+
ptype = $(presence).attr('type');
|
250
|
+
|
251
|
+
switch (ptype){
|
252
|
+
case undefined:
|
253
|
+
processAvailablePresenceStanza(presence)
|
254
|
+
break;
|
255
|
+
case "available":
|
256
|
+
processAvailablePresenceStanza(presence)
|
257
|
+
break;
|
258
|
+
case "unavailable":
|
259
|
+
processUnavailablePresenceStanza(presence)
|
260
|
+
break;
|
261
|
+
default :
|
262
|
+
//Stanza type not recognize
|
263
|
+
processAvailablePresenceStanza(presence)
|
264
|
+
}
|
265
|
+
|
266
|
+
return true;
|
267
|
+
}
|
268
|
+
|
269
|
+
function processAvailablePresenceStanza(presence){
|
270
|
+
from = $(presence).attr('from');
|
271
|
+
slug = from.split("@")[0];
|
272
|
+
|
273
|
+
if (slug != user_slug) {
|
274
|
+
if (getConnectionBoxFromSlug(slug)!=null){
|
275
|
+
status = $(presence).find('show').text();
|
276
|
+
setUserIconStatus(slug, status);
|
277
|
+
if (cacheConnectedUsers.indexOf(slug) != -1) {
|
278
|
+
showConnectionBoxFromSlug(slug);
|
279
|
+
}
|
280
|
+
} else {
|
281
|
+
setTimeout("refreshChatWindow()", 3000);
|
282
|
+
}
|
283
|
+
}
|
284
|
+
}
|
285
|
+
|
286
|
+
function processUnavailablePresenceStanza(presence){
|
287
|
+
from = $(presence).attr('from');
|
288
|
+
slug = from.split("@")[0];
|
289
|
+
|
290
|
+
if (slug != user_slug) {
|
291
|
+
if (getConnectionBoxFromSlug(slug)!=null){
|
292
|
+
hideConnectionBoxFromSlug(slug)
|
293
|
+
}
|
294
|
+
}
|
295
|
+
}
|
296
|
+
|
297
|
+
function sendChatMessage(from,to,text){
|
298
|
+
var type = "chat";
|
299
|
+
var body= $build("body");
|
300
|
+
body.t(text);
|
301
|
+
var message = $msg({to: to, from: from, type: 'chat'}).cnode(body.tree());
|
302
|
+
connection.send(message.tree());
|
303
|
+
resumeAwayTimerIfAway();
|
304
|
+
return true;
|
305
|
+
}
|
306
|
+
|
307
|
+
function authByCookie(){
|
308
|
+
var authMethod = '<%= SocialStream::Presence.auth_method %>';
|
309
|
+
return authMethod=="cookie";
|
310
|
+
}
|
311
|
+
|
312
|
+
function authByPassword(){
|
313
|
+
var authMethod = '<%= SocialStream::Presence.auth_method %>';
|
314
|
+
return authMethod=="password";
|
315
|
+
}
|
316
|
+
|
317
|
+
function ifCookie(){
|
318
|
+
return (!(typeof cookie == 'undefined'))
|
319
|
+
}
|
320
|
+
|
321
|
+
|
322
|
+
|
233
323
|
///////////////////////////////////////////////////////
|
234
|
-
//
|
324
|
+
// Parser functions
|
325
|
+
// Allow new features in chat msg like links, images, emoticons, ...
|
235
326
|
///////////////////////////////////////////////////////
|
236
327
|
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
chatIcons['(R)']= "rain.png";
|
246
|
-
chatIcons['(S)']= "sun.png";
|
247
|
-
chatIcons[';)']= "face-wink.png";
|
248
|
-
|
328
|
+
//Patterns
|
329
|
+
var html_tag_pattern=/.*\<[^>]+>.*/g
|
330
|
+
var simple_word_pattern=/^[aA-zZ0-9]+$/g
|
331
|
+
var http_urls_pattern=/(http(s)?:\/\/)([aA-zZ0-9%=_&+?])+([./-][aA-zZ0-9%=_&+?]+)*[/]?/g
|
332
|
+
var www_urls_pattern = /(www[.])([aA-zZ0-9%=_&+?])+([./-][aA-zZ0-9%=_&+?]+)*[/]?/g
|
333
|
+
var icons_a_pattern=/\([A-Z]\)/g
|
334
|
+
var icons_b_pattern=/((:|;)([()A-Z]))/g
|
335
|
+
var youtube_video_pattern=/(http(s)?:\/\/)?(((youtu.be\/)([aA-zZ0-9]+))|((www.youtube.com\/watch\?v=)([aA-z0-9Z&=.])+))/g
|
249
336
|
|
250
337
|
function parseContent(content){
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
content = content.replace(/>/g, ">");
|
338
|
+
|
339
|
+
if (content.match(html_tag_pattern)!=null){
|
340
|
+
content = content.replace(/>/g, ">");
|
255
341
|
content = content.replace(/</g, "<");
|
256
|
-
|
257
|
-
|
258
|
-
|
342
|
+
return "<pre>" + content + "</pre>"
|
343
|
+
}
|
344
|
+
|
259
345
|
words = content.split(" ");
|
260
346
|
for(i=0; i<words.length; i++){
|
261
347
|
words[i] = parseWord(words[i]);
|
@@ -266,93 +352,77 @@ function parseContent(content){
|
|
266
352
|
|
267
353
|
function parseWord(word){
|
268
354
|
|
269
|
-
//Look for empty words
|
270
|
-
if (word.trim()==""){
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
//Look for simple words
|
275
|
-
var simple_word_pattern=/^[aA-zZ0-9]+$/g
|
276
|
-
if (simple_word_pattern.test(word)){
|
277
|
-
return word
|
278
|
-
}
|
355
|
+
//Look for empty or simple words
|
356
|
+
if ((word.trim()=="")||(word.match(simple_word_pattern)!=null)){
|
357
|
+
return word
|
358
|
+
}
|
279
359
|
|
280
360
|
//Look for http urls
|
281
|
-
|
282
|
-
http_urls = word.match(http_urls_pattern)
|
361
|
+
var http_urls = word.match(http_urls_pattern)
|
283
362
|
if (http_urls!=null){
|
284
|
-
url = http_urls[0]
|
285
|
-
type = getUrlType(url);
|
363
|
+
var url = http_urls[0]
|
364
|
+
var type = getUrlType(url);
|
286
365
|
|
287
366
|
switch(type){
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
367
|
+
case "link":
|
368
|
+
var link = buildUrlLink(url,url)
|
369
|
+
var subwords = splitFirst(word,url)
|
370
|
+
return parseWord(subwords[0]) + link + parseWord(subwords[1])
|
371
|
+
case "image":
|
372
|
+
var imageLink = buildImageLink(url);
|
373
|
+
var subwords = splitFirst(word,url)
|
374
|
+
return parseWord(subwords[0]) + imageLink + parseWord(subwords[1])
|
375
|
+
case "video-youtube":
|
376
|
+
var youtubeLink = buildYoutubeVideoLink(url);
|
377
|
+
var subwords = splitFirst(word,url)
|
378
|
+
return parseWord(subwords[0]) + youtubeLink + parseWord(subwords[1])
|
379
|
+
default:
|
380
|
+
return word
|
299
381
|
}
|
300
|
-
return word
|
301
382
|
}
|
302
383
|
|
303
384
|
|
304
385
|
//Look for www urls
|
305
|
-
|
306
|
-
www_urls = word.match(www_urls_pattern)
|
386
|
+
var www_urls = word.match(www_urls_pattern)
|
307
387
|
if (www_urls!=null){
|
308
|
-
url = www_urls[0]
|
309
|
-
type = getUrlType(url);
|
388
|
+
var url = www_urls[0]
|
389
|
+
var type = getUrlType(url);
|
310
390
|
|
311
391
|
switch(type){
|
312
392
|
case "link":
|
313
|
-
|
314
|
-
subwords = word
|
315
|
-
|
316
|
-
break;
|
393
|
+
var link = buildUrlLink("http://" + url,url)
|
394
|
+
var subwords = splitFirst(word,url)
|
395
|
+
return parseWord(subwords[0]) + link + parseWord(subwords[1])
|
317
396
|
case "image":
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
397
|
+
var imageLink = buildImageLink("http://" + url);
|
398
|
+
var subwords = splitFirst(word,url)
|
399
|
+
return parseWord(subwords[0]) + imageLink + parseWord(subwords[1])
|
400
|
+
case "video-youtube":
|
401
|
+
var youtubeLink = buildYoutubeVideoLink("http://" + url);
|
402
|
+
var subwords = splitFirst(word,url)
|
403
|
+
return parseWord(subwords[0]) + youtubeLink + parseWord(subwords[1])
|
322
404
|
default:
|
323
|
-
|
324
|
-
|
405
|
+
return word
|
406
|
+
}
|
325
407
|
}
|
326
408
|
|
327
|
-
//Look for icons:
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
409
|
+
//Look for icons: Regex
|
410
|
+
var icons_a = word.match(icons_a_pattern)
|
411
|
+
if(icons_a!=null){
|
412
|
+
for(g=0; g<icons_a.length; g++){
|
413
|
+
word = word.replace(buildRegex(icons_a[g]), buildIconImage(icons_a[g]))
|
414
|
+
}
|
415
|
+
}
|
416
|
+
|
417
|
+
var icons_b = word.match(icons_b_pattern)
|
418
|
+
if(icons_b!=null){
|
419
|
+
for(h=0; h<icons_b.length; h++){
|
420
|
+
word = word.replace(buildRegex(icons_b[h]), buildIconImage(icons_b[h]))
|
421
|
+
}
|
334
422
|
}
|
335
|
-
|
336
|
-
//Look for icons with Regex
|
337
|
-
// var icons_a_pattern=/\(([A-Z])+\)/g
|
338
|
-
// if (icons_a_pattern.test(word)){
|
339
|
-
// icon = word.replace(/[^(]*(\([A-Z]+\))(\([A-Z]+\))?(.)*/g, "$1")
|
340
|
-
// subwords = splitFirst(word,icon)
|
341
|
-
// image = buildIconImage(icon);
|
342
|
-
// return subwords[0] + image + subwords[1];
|
343
|
-
// }
|
344
|
-
|
345
|
-
// var icons_b_pattern=/:([()A-Z])(.)*/g
|
346
|
-
// if (icons_b_pattern.test(word)){
|
347
|
-
// icon = word.replace(/[aA-zZ]*(:[()A-Z])(.)*/g, "$1")
|
348
|
-
// subwords = splitFirst(word,icon)
|
349
|
-
// image = buildIconImage(icon);
|
350
|
-
// return subwords[0] + image + subwords[1];
|
351
|
-
//return parseWord(subwords[0]) + image + parseWord(subwords[1]);
|
352
|
-
// }
|
353
423
|
|
354
|
-
|
355
|
-
//No special content detected
|
424
|
+
|
425
|
+
//No special content detected (maybe emoticons but not special pattern like urls)
|
356
426
|
return word
|
357
427
|
}
|
358
428
|
|
@@ -369,138 +439,105 @@ function splitFirst(word,key){
|
|
369
439
|
function buildIconImage(icon){
|
370
440
|
if (icon in chatIcons){
|
371
441
|
image_file = chatIcons[icon]
|
372
|
-
|
373
|
-
return image
|
442
|
+
return "<img class=\"chatEmoticon\" src=\"assets/emoticons/" + image_file + "\"/>";
|
374
443
|
}
|
375
444
|
return icon
|
376
445
|
}
|
377
446
|
|
378
447
|
function buildUrlLink(url,name){
|
379
|
-
|
380
|
-
return link
|
448
|
+
return "<a target=\"_blank\" class=\"chatLink\" href=\"" + url + "\">" + name + "</a>";
|
381
449
|
}
|
382
450
|
|
383
451
|
function buildImageLink(url){
|
384
|
-
|
385
|
-
|
386
|
-
|
452
|
+
return "<a target=\"_blank\" class=\"chatImageLink\" href=\"" + url + "\">" + "<img class=\"chatImage\" src=\"" + url + "\"/>" + "</a>";
|
453
|
+
}
|
454
|
+
|
455
|
+
function buildYoutubeVideoLink(url){
|
456
|
+
//Get youtube video id
|
457
|
+
var youtube_video_id=url.split(/v\/|v=|youtu\.be\//)[1].split(/[?&]/)[0];
|
458
|
+
var youtube_api_url = "http://gdata.youtube.com/feeds/api/videos/" + youtube_video_id
|
459
|
+
|
460
|
+
//Get info from the video
|
461
|
+
$.ajax({
|
462
|
+
type: "GET",
|
463
|
+
url: youtube_api_url,
|
464
|
+
cache: false,
|
465
|
+
dataType:'jsonp',
|
466
|
+
success: function(data){
|
467
|
+
var url_name = url;
|
468
|
+
var youtube_video_thumbnail = "";
|
469
|
+
|
470
|
+
//Video title
|
471
|
+
var video_title = $(data).find("media\\:title")
|
472
|
+
if (video_title.length > 0) {
|
473
|
+
//url_name = url + " (" + $(video_title).text() + ")";
|
474
|
+
url_name = $(video_title).text()
|
475
|
+
}
|
476
|
+
|
477
|
+
//Thumbnails
|
478
|
+
var thumbnails = $(data).find("media\\:thumbnail")
|
479
|
+
if (thumbnails.length>0){
|
480
|
+
var thumbnail_url = $(thumbnails[0]).attr("url")
|
481
|
+
if (thumbnail_url!=null){
|
482
|
+
youtube_video_thumbnail = "<p><img class=\"chatVideoImage\" src=\"" + thumbnail_url + "\"/></p>";
|
483
|
+
}
|
484
|
+
}
|
485
|
+
|
486
|
+
//Replace video link
|
487
|
+
$("a[youtube_id=" + youtube_video_id + "]").html(buildUrlLink(url,url_name)+youtube_video_thumbnail);
|
488
|
+
},
|
489
|
+
error: function(xOptions, textStatus){
|
490
|
+
//Handle errors
|
491
|
+
}
|
492
|
+
});
|
387
493
|
|
494
|
+
return "<a target=\"_blank\" youtube_id=\"" + youtube_video_id + "\" class=\"chatLink\" href=\"" + url + "\">" + url + "</a>";
|
495
|
+
}
|
388
496
|
|
389
497
|
function buildRegex(word){
|
390
|
-
|
391
|
-
|
392
|
-
pattern = "(" + word + ")";
|
498
|
+
word = word.replace(")","\\)")
|
499
|
+
word = word.replace("(","\\(")
|
500
|
+
var pattern = "(" + word + ")";
|
393
501
|
pattern = buildPattern(pattern)
|
394
502
|
return (new RegExp(pattern,'g'));
|
395
503
|
}
|
396
504
|
|
397
505
|
function buildPattern(pattern){
|
398
|
-
|
506
|
+
//Escape pattern special characters
|
399
507
|
pattern = pattern.replace("+","\\+")
|
400
508
|
pattern = pattern.replace("?","\\?")
|
401
509
|
return pattern
|
402
510
|
}
|
403
511
|
|
512
|
+
|
404
513
|
function getUrlType(url){
|
405
|
-
|
514
|
+
|
515
|
+
if (url.match(youtube_video_pattern)!=null){
|
516
|
+
return "video-youtube"
|
517
|
+
}
|
518
|
+
|
519
|
+
var urlArray = url.split(".");
|
406
520
|
if (urlArray!=null && urlArray.length>0){
|
407
|
-
extension= urlArray[urlArray.length-1]
|
521
|
+
var extension= urlArray[urlArray.length-1]
|
408
522
|
} else {
|
409
|
-
extension = null;
|
523
|
+
var extension = null;
|
410
524
|
}
|
411
525
|
|
412
526
|
switch(extension){
|
413
|
-
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
|
421
|
-
|
422
|
-
|
423
|
-
|
424
|
-
}
|
425
|
-
}
|
426
|
-
|
427
|
-
|
428
|
-
|
429
|
-
function onPresence(presence) {
|
430
|
-
|
431
|
-
//Check presence stanza type
|
432
|
-
ptype = $(presence).attr('type');
|
433
|
-
|
434
|
-
switch (ptype){
|
435
|
-
case undefined:
|
436
|
-
processAvailablePresenceStanza(presence)
|
437
|
-
break;
|
438
|
-
case "available":
|
439
|
-
processAvailablePresenceStanza(presence)
|
440
|
-
break;
|
441
|
-
case "unavailable":
|
442
|
-
processUnavailablePresenceStanza(presence)
|
443
|
-
break;
|
444
|
-
default :
|
445
|
-
//Stanza type not recognize
|
446
|
-
processAvailablePresenceStanza(presence)
|
447
|
-
}
|
448
|
-
|
449
|
-
return true;
|
450
|
-
}
|
451
|
-
|
452
|
-
function processAvailablePresenceStanza(presence){
|
453
|
-
from = $(presence).attr('from');
|
454
|
-
slug = from.split("@")[0];
|
455
|
-
|
456
|
-
if (slug != user_slug) {
|
457
|
-
if (getConnectionBoxFromSlug(slug)!=null){
|
458
|
-
status = $(presence).find('show').text();
|
459
|
-
setUserIconStatus(slug, status);
|
460
|
-
if (cacheConnectedUsers.indexOf(slug) != -1) {
|
461
|
-
showConnectionBoxFromSlug(slug);
|
462
|
-
}
|
463
|
-
} else {
|
464
|
-
setTimeout("refreshChatWindow()", 3000);
|
465
|
-
}
|
466
|
-
}
|
467
|
-
}
|
468
|
-
|
469
|
-
function processUnavailablePresenceStanza(presence){
|
470
|
-
from = $(presence).attr('from');
|
471
|
-
slug = from.split("@")[0];
|
472
|
-
|
473
|
-
if (slug != user_slug) {
|
474
|
-
if (getConnectionBoxFromSlug(slug)!=null){
|
475
|
-
hideConnectionBoxFromSlug(slug)
|
476
|
-
}
|
527
|
+
case "jpg":
|
528
|
+
return "image"
|
529
|
+
break;
|
530
|
+
case "png":
|
531
|
+
return "image"
|
532
|
+
break;
|
533
|
+
case "gif":
|
534
|
+
return "image"
|
535
|
+
break;
|
536
|
+
default:
|
537
|
+
return "link"
|
477
538
|
}
|
478
539
|
}
|
479
540
|
|
480
|
-
function sendChatMessage(from,to,text){
|
481
|
-
var type = "chat";
|
482
|
-
var body= $build("body");
|
483
|
-
body.t(text);
|
484
|
-
var message = $msg({to: to, from: from, type: 'chat'}).cnode(body.tree());
|
485
|
-
connection.send(message.tree());
|
486
|
-
resumeAwayTimerIfAway();
|
487
|
-
return true;
|
488
|
-
}
|
489
|
-
|
490
|
-
function authByCookie(){
|
491
|
-
var authMethod = '<%= SocialStream::Presence.auth_method %>';
|
492
|
-
return authMethod=="cookie";
|
493
|
-
}
|
494
|
-
|
495
|
-
function authByPassword(){
|
496
|
-
var authMethod = '<%= SocialStream::Presence.auth_method %>';
|
497
|
-
return authMethod=="password";
|
498
|
-
}
|
499
|
-
|
500
|
-
function ifCookie(){
|
501
|
-
return (!(typeof cookie == 'undefined'))
|
502
|
-
}
|
503
|
-
|
504
541
|
////////////////////
|
505
542
|
//Audio functions
|
506
543
|
////////////////////
|
@@ -239,14 +239,19 @@ input.connectChatButton{
|
|
239
239
|
}
|
240
240
|
|
241
241
|
|
242
|
-
/* Chat text */
|
242
|
+
/* Chat text style */
|
243
243
|
|
244
244
|
.chatImage {
|
245
245
|
max-width: 100px;
|
246
246
|
max-height: 100px;
|
247
247
|
}
|
248
248
|
|
249
|
-
.
|
249
|
+
.chatVideoImage {
|
250
|
+
max-width: 100px;
|
251
|
+
max-height: 100px;
|
252
|
+
}
|
253
|
+
|
254
|
+
.chatEmoticon {
|
250
255
|
max-width:20px;
|
251
256
|
max-height: 20px;
|
252
257
|
}
|
@@ -255,5 +260,6 @@ a.chatLink:link, a.chatLink:visited {
|
|
255
260
|
color: #1E726A;
|
256
261
|
}
|
257
262
|
|
258
|
-
.chatImageLink {
|
263
|
+
a.chatImageLink:link, a.chatImageLink:visited {
|
264
|
+
color: #1E726A;
|
259
265
|
}
|
data/social_stream.gemspec
CHANGED
@@ -11,7 +11,7 @@ Gem::Specification.new do |s|
|
|
11
11
|
s.files = `git ls-files`.split("\n")
|
12
12
|
|
13
13
|
# Gem dependencies
|
14
|
-
s.add_runtime_dependency('social_stream-base', '~> 0.9.
|
14
|
+
s.add_runtime_dependency('social_stream-base', '~> 0.9.30')
|
15
15
|
s.add_runtime_dependency('social_stream-documents', '~> 0.4.4')
|
16
16
|
s.add_runtime_dependency('social_stream-events', '~> 0.0.20')
|
17
17
|
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: social_stream
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 63
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 12
|
9
|
-
-
|
10
|
-
version: 0.12.
|
9
|
+
- 8
|
10
|
+
version: 0.12.8
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- GING - DIT - UPM
|
@@ -27,12 +27,12 @@ dependencies:
|
|
27
27
|
requirements:
|
28
28
|
- - ~>
|
29
29
|
- !ruby/object:Gem::Version
|
30
|
-
hash:
|
30
|
+
hash: 7
|
31
31
|
segments:
|
32
32
|
- 0
|
33
33
|
- 9
|
34
|
-
-
|
35
|
-
version: 0.9.
|
34
|
+
- 30
|
35
|
+
version: 0.9.30
|
36
36
|
type: :runtime
|
37
37
|
version_requirements: *id001
|
38
38
|
- !ruby/object:Gem::Dependency
|