From 0a3f83ade9e417f21b39dd27b6340f1801a04c1c Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Wed, 11 Jun 2014 16:47:46 -0400 Subject: [PATCH] added realtime box --- app/assets/images/MMCCicon_realtime_blue.png | Bin 4005 -> 5827 bytes app/assets/images/MMCCicon_realtime_junto.png | Bin 2378 -> 5281 bytes .../javascripts/Jit/graphsettings-model.js | 4 + .../javascripts/jquery/AllMappingPages.js | 4 +- .../javascripts/jquery/AuthCanEditMapPage.js | 75 ++++++++++++++++-- .../jquery/AuthCanEditMappingPages.js | 17 ++++ app/assets/javascripts/jquery/EveryPage.js | 4 +- app/assets/javascripts/realtime/realtime.js | 47 +++++++++-- app/assets/stylesheets/application.css | 69 ++++++++++------ app/views/maps/show.html.erb | 20 ++++- realtime/realtime-server.js | 3 +- 11 files changed, 198 insertions(+), 45 deletions(-) diff --git a/app/assets/images/MMCCicon_realtime_blue.png b/app/assets/images/MMCCicon_realtime_blue.png index e821e243ae23d24ede7e696a00a542e68f1eb2c9..98bd1982fcc62e5cb28b567a82d0cd930f5f1664 100644 GIT binary patch delta 5823 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 JPDHLkV1hsGIs5 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 diff --git a/app/assets/images/MMCCicon_realtime_junto.png b/app/assets/images/MMCCicon_realtime_junto.png index 4f687b4ddf6e0d1ecb0bf506eb9e2b5f8b275748..587065b43ed04314c65935da5d908133a3736325 100644 GIT binary patch delta 5273 zcmV;K6lUwn5}_%OIDZOHX+uL$P-t&-Z*ypGa3D!TLm+T+Z)Rz1WdHzp+MQEpR8#2| zJ@?-9LQ9B%luK_?6$l_wLW_VDktQl32@pz%A)(n7QNa;KMFbnjpojyGj)066Q7jCK z3fKqaA)=0hqlk*i`{8?|Yu3E?=FR@K*FNX0^PRKL2fzpnmVZbyQ8j=JsX`tR;Dg7+ z#^K~HK!FM*Z~zbpvt%K2{UZSY_f59&ghTmgWD z0l;*TI7e|ZE3OddDgXd@nX){&BsoQaTL>+22Uk}v9w^R9 z7b_GtVFF>AKrX_0nHe&HG!NkO%m4tOkrff(gY*4(&VLTB&dxTDwhmt{>c0m6B4T3W z{^ifBa6kY6;dFk{{wy!E8h|?nfNlPwCGG@hUJIag_lst-4?wj5py}FI^KkfnJUm6A zkh$5}<>chpO2k52Vaiv1{%68pz*qfj`F=e7_x0eu;v|7GU4cgg_~63K^h~83&yop* zV%+ABM}Pdc3;+Bb(;~!4V!2o<6ys46agIcqjPo+3B8fthDa9qy|77CdEc*jK-!%ZR zYCZvbku9iQV*~a}ClFY4z~c7+0P?$U!PF=S1Au6Q;m>#f??3%Vpd|o+W=WE9003S@ zBra6Svp>fO002awfhw>;8}z{#EWidF!3EsG3xE7zHiSYX#KJ-lLJDMn9CBbOtb#%) zhRv`YDqt_vKpix|QD}yfa1JiQRk#j4a1Z)n2%fLC6RbVIkUx0b+_+BaR3c znT7Zv!AJxWizFb)h!jyGOOZ85F;a?DAXP{m@;!0_Ifqlp|(=5QHQ7#Gr)$3XMd?XsE4X&sBct1q<&fbi3VB2Ov6t@q*0);U*o*S zAPZv|vv@2aYYnT0b%8a+Cb7-ge0D0knEf5Qi#@8Tp*ce{N;6lpQuCB%KL_KOarm5c zP6_8IrP_yNQcbz0DW*G2J50yT%*~?B)|oY%Ju%lZ z=bPu7*PGwBU|M)uEVih&xMfMQuC{HqePL%}7iYJ{uEXw=y_0>qeSeMpJqHbk*$%56 zS{;6Kv~mM9! zg3B(KJ}#RZ#@)!hR=4N)wtYw9={>5&Kw=W)*2gz%*kgNq+ zEef_mrsz~!DAy_nvS(#iX1~pe$~l&+o-57m%(KedkbgIv@1Ote62cPUlD4IWOIIx& zSmwQ~YB{nzae3Pc;}r!fhE@iwJh+OsDs9zItL;~pu715HdQEGAUct(O!LkCy1 z<%NCg+}G`0PgpNm-?d@-hMgNe6^V+j6x$b<6@S<$+<4_1hi}TincS4LsjI}fWY1>O zX6feMEq|U{4wkBy=9dm`4cXeX4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC- zq*U}&`cyXV(%rRT*Z6MH?i+i&_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-N zmiuj8txj!m?Z*Ss1N{dh4z}01)YTo*JycSU)_*JOM-ImyzW$x>cP$Mz4ONYt#^NJz zM0w=t_X*$k9t}F$c8q(h;Rn+nb{%IOFKR-X@|s4QQ=0o*Vq3aT%s$c9>fU<%N829{ zoHRUHc}nwC$!Xf@g42^{^3RN&m7RTlF8SPG+oHC6=VQ*_Y7cMkx)5~X(nbG^=R3SR z&VO9;xODQe+vO8ixL2C5I$v$-bm~0*lhaSfyPUh4uDM)mx$b(swR>jw=^LIm&fWCA zdGQwi*43UlJ>9+YdT;l|_x0Zv-F|W>{m#p~*>@-It-MdXU-UrjLD@syht)q@{@mE_ z+<$7occAmp+(-8Yg@e!jk@b%cLj{kSkAKUC4TkHUI6gT!;y-fz>HMcd&t%Ugo)`Y2 z{>!cx7B7DI)$7;J(U{Spm-3gBzioV_{p!H$8L!*M!p0uH$#^p{Ui4P`?ZJ24cOCDe z-w#jZd?0@)|7iKK^;6KN`;!@ylm7$*nDhK&GcDTy001CkNK#Dz0D2_=0Dyx40Dt-a z004mL004C`008P>0026e000+nl3&F}000ThNklG z*h#}nO9K`-qzPH=tX;_mnlL3*wX`a95^SX(nn~I2KCBAWrnN~sl|@ynnQbzf*0O16 zG>HnU!2)@VPOH|Eq-73byU1pru= z3$ZK!nx-4$@%Vp-hlf3(P)M7umq;WYyWaz%IUtRG}q)<98||E>biG~LcHjA4F$ zKGWZO0r<6A?as2YGMeK!X5+?<5~uTH#^G=zNs?SFFE6*JRvk1=D}MnD0I2f&{fI;& zTwmWQuD<@U;}k`0ziR+AO;^^{)jeNUR>ryAZmHMnJ=NIQ*qjLm0Fg)}2>=|&1s#r$ zvVy^&Orz24e&v-{e#bD(c>wJIs!~x3EXzv8VzG2=Y^wvSrJ^ zckI}q1%SfBLI9{|S%20}QB*Tc(?$Rm08pt^SpX0Ug-E?#PnDLIN`t`w0Q~+d(+2&1 z|Ia@A?6duDx4Tj-7U!3imcB+&)ZSGWGQD1Z>5)esDW061)E#)b_W9!?1zcJFRH0RUdFk56gG>H$3P zzypV~v$M4ye1CA!1K{1()|M%jWt#zX0x(opS1VguT2NYA>PnA!^UXJ1I$eP(KR;h) zweBeF?(XjG?(S|E2n4p=++5|hZQF99(P+-8Q>Qy@w$5Gvuc!6|5sgMIHe09l+t?;( zZ*Tv9t8d!6b?cKtp)lL&bjk>V_@t($raKyq4gip(`+q4E3RF~7C~9kK5e|m~7cN{N zghF9lsZ<7dp0Bum{rV<@!LY5auI|@XtCf;SB$%3-;;vtxGy^D4&vWivf868oMD+Ti z@|v0&`-+8(rsr-kpnxI%LJ|~mOraC%ae}N=P?wMzrq#}{%+1Az; z`$}ENnp)w0zn{tRc;=_)=iQ3#?rxIj`5XY4n3y=`a=Cs1fc@%VxmG zE*?LA3|(FJs@B$)#;2ctYJVySNS#h6lh%!u0)JEiKxJj61HhjHfxr~UakmnQgfvr` z&1SRh+sqe@Mgx6)r!X-wA#pgyRWH8yV(8qtb6-2!p3BY*h(4kDx zn#zbgjV#L=0mx&q*t}3E%>4%AdyXADz9$-urk^1aiOEgt;O z?0@X+u~mseUwrX}=nkLr?-{=jPE1T3NG6lvciwsDj>daDo=+SOhgPjtkBda2*>wHP z%#7^QPp@x0a^%QA0K5PI+qeG+a=F}>o2w123c&mCzn`B-Bt$IBW`?XEyId|W0OaTA zdyGb7-N})vntlFH|k4DHUe0T^z`)1pFe*- zN2ydckR-`9G(3(?n>KMqqd_eY2>!Dg0AoDQ3w!mupGGuxr<@*~-dFJpf!88}onS{CE&Rug&(C0f9g;Qc_Z~ zs8A@fwrqJQW;7bq!EhMvn{&KWDt`^>^@UoJB;N(lY_VAUD+ai&s&5?)h1iF^UT+Qn z7z~D`bO8Y3@i?-wzKjR;_4U)6H*YooKwn?q_!Cb&@gQ#R(sr3l_VdER!s5xvNzQ0o z&+Xm2H(5}Sug!SfOBRczeN|J5wzlVXDHPQ6>(;HCRVr1??CecUPfvsAd4IUw?wQ%y zS)`LU0C2nAdFkIrj~>l8o6YU12y;-SQWZxc5l$wPd3l~wyId~Cm*eIye;4DwQ#RVx z_S`>(LeYa7jpm5KV1P!Wb%jEq=~yh5l*wc+iDW6Oz|EUCmo%cPswyH9iGE2CM5|V- z<)u<7#A5MPolf^Rxm^BIIDfn_7Y>KhUow1GkCdq+VY|)Nd5|Co-skfH0Hji>A{BZ3 z00w+MpL=d@?x0Sm%d=Xo`k|qrr8yFbghL<@?CkFD_5*;;)@hB!;_Gi8gm~j!1;{9Y z)QV-z&CTg&W@fsEhK80z&SvZE9T*tQtF7J4m6erA4;(mvuCA_I*MF{E6Zw2T!R5=B zmo_Is5akqg+lxq2;J#NkbE7hu3^JKamU?b7o6V+_@r?j>1Hka`m8$@rEh{Vg6~i!# zIXO9M07kRfY)tiS7YGCbk|Ys}#gI%UZ`>;YyHF@J=ybZwENvhKVa;%tK8m936h(E! z^(eYgkS@y-2&DJ>;3lHgYLSz?TNg+Jf*>~PAV3Q(=KVXSSQ*h)$xr%lsHN zG3)+V1C!mXmzmA5Wa4C*-A##EFPkyTs6mj65Xp`XA}s^x;D73H5sE!gO|an!o+F zCv0|hR>0%&oKk6|IV~+MK`xiuF+{Ua5DNkTt2!=JD}ynWsNAG?a`FT)A>( zWL{pLF*!L|ZnavOYu9R>F#H;ZRO0AiS4K+?c;k(wW`BU@qvb3F#6n}Bw5zLY7{)8O zoi3M4HZU+?iI0zW1q1}hCnqP#co%t{sB-x5Asc6SaP3B0N@nM_>1lV@$9(YEEwmmhUHoz|qJq|mOeyVj15j#*G zmd*e&+R^cK(CFx>Fe)l)=ZO<1eh=`?ctqpUSe2qf5E2q1Fc=KWGcz;Q0MX-f0OYl- ztgL@+-n`k(`M9_^I_2WWNe&O-xf=I5)EOBW>3^OV6yqT#M9Y>f6O4{htTKOiYT8k( zz%L#?d{_jBqymHjV?V-tyM3O>V92d4Tec)Tc<{gp{$D`X&saS#XlQ8ogr$VLf%9U- zgZnxrCf0#?a9S*uUOMb{yOmT60dLRG&u=<=_H5P7n>XLaYPHjN%>R?}^3T*h1px0J z*nhQam(*-F3%~lR1xwxjJ9vqB|3?B57#O&ZlceS|Rc|j79UUEx76IB+Vx@{`wcznS z%+sHdk-;oox^xqp=$M^5wN-Q;8L_z7+~GR_D^{#H6%i33`|``1X54-OHR-_*6ZbzO z!(oi%(4j*NmVemu&gs*qhht-7A{7dSP=BM@9C!Zw`AQrm09y`Vk_{U+h@n#Anwo2+ z@Hjc+V>TuN(4T`ojZb0#-cR4LW5*g;FEoC&U} zsTq?b!M6CkuJau)oe4cZ0Dnpg z3k$XP?%j*HbEl05H4z5~2R~S|CL`wJ#f#H0SPY4@Y~8w53S*ynpRzFJ0|fRn&vZJS z4U~~!&QS#Lb)it$Q(F4*`;@8o?=KJ_xgEr6>lRBPw->U)e>JVt?-$K0kzq zcj|BpAFOr96;UW7V~qmBVep9xJ$m$r|D5Ig2j{vN9zBAkcbq$S?zzT8I=?|#Aw${S z32qN~`uqF)h4=6OH>s?w>G^GRw2d!MPM6FCtPQsJ92?&9yxw%;k z0mviI=jHvBS-pC-Q>|7>A-SLX0)T;}@z$+dwC=?K(Rk|AsXX-Mz@t%EW*c&VtiHb9 z+1A!ZaiIq#T%MPyoW@>2X0_T>xK^M9XS%!ZJE1;yl-nT%1^c7_qknH33lA5CgsDd0C8e$R>5*P$^e^pgg0#?KO z4)VqTf?i42cMJyGH(hs|sA4TI|7#<>+6KetplU%`S#M2|v7-(LV;mfEAwP^Om2s47 zzM%3O0Bnl}FrQUFy?-=5KDG(fr&~7RC2zSvjcS{qpzrh`H#fI;-MV$|LDkjOoqP7| zS;fppX$iFcT@-@uno6x+;@rJ^_iRjzLdN;I4`6tSPfLly!e8&e62F(2m^dJjL|O+1 z2HnOJwNOR&V-v%8iZ^QLlY6c&UAm+o!&!wXMovhe`X4|>Ab*uotX%ka@0nU&#P}Dg zMgiiV!NL4h$eLxe0#Q*i+L85w@3Sywm`Vdr8yp<;<_PS2C!jjNf~FtFhKFdvAnUfr z#>V~~O7nrk@npyW3b8Bcc&S@Tc1u`-LaP`Cxu`y(2BX4R<)P<|=rHvty~e4x|bfRDYxzsP9z)(4kyVfg;>0t&s(x z;n1ZT8z0(omSVLE$xz6r1xafajMu^Yzm1Pqx)liX+3~FOMGaZ-hb@p#0SC`E zBe8|)^?&+d4~W*b);D8fVjS?c&}y}O5+9%7l|?G6u^W@aXxgoLjHe`5v=HML{cRMh zAb|w_8T*8vqhbx?K1)ngjYLF<9H7zcJVp3Cp->PG(2<~vf&B=eTd3ha0q~sN8wIC3 zKv8-(HZ?U-Or*1Yq&#G-{)dzZ{}%xMe{lE#_#^@N0r&y<0r&yDVEdl{0{~e9M_zt8 R3GM&@002ovPDHLkV1mu!bcg@| diff --git a/app/assets/javascripts/Jit/graphsettings-model.js b/app/assets/javascripts/Jit/graphsettings-model.js index 3416be8c..5877e47b 100644 --- a/app/assets/javascripts/Jit/graphsettings-model.js +++ b/app/assets/javascripts/Jit/graphsettings-model.js @@ -9,6 +9,10 @@ var MetamapsModel = new Object(); MetamapsModel.embed = false; +// if you're on a map, this will be an object that has a reference to each user that has loaded the map, and whether they are +// in realtime or not +MetamapsModel.mappersOnMap = {}; + MetamapsModel.metacodeScrollerInit = false; // indicates whether the scrollbar in the custom metacode set space has been init diff --git a/app/assets/javascripts/jquery/AllMappingPages.js b/app/assets/javascripts/jquery/AllMappingPages.js index c4077c4d..c3f519d3 100644 --- a/app/assets/javascripts/jquery/AllMappingPages.js +++ b/app/assets/javascripts/jquery/AllMappingPages.js @@ -56,9 +56,9 @@ $(document).ready(function () { // hide the other two $('.sidebarAccountBox').hide(); - $('.sidebarWandBox').hide(); + $('.sidebarCollaborateBox').hide(); $('.sidebarAccountIcon').css('background-color', '#0F1519'); - $('.sidebarWandIcon').css('background-color', '#0F1519'); + $('.sidebarCollaborateIcon').css('background-color', '#0F1519'); $('.sidebarFilterIcon').css('background-color', '#000'); $('.sidebarFilterBox').fadeIn(200, function () { diff --git a/app/assets/javascripts/jquery/AuthCanEditMapPage.js b/app/assets/javascripts/jquery/AuthCanEditMapPage.js index 0800caec..6c79ffb3 100644 --- a/app/assets/javascripts/jquery/AuthCanEditMapPage.js +++ b/app/assets/javascripts/jquery/AuthCanEditMapPage.js @@ -7,28 +7,91 @@ $(document).ready(function () { + function bindRealtimeHover() { + + var realtimeIsOpen = false + + // controls the sliding hover of the bottom left menu + var sliding1 = false; + var lT; + + var closeRealtime = function () { + lT = setTimeout(function () { + if (!sliding1) { + sliding1 = true; + $('.sidebarCollaborateIcon').css('background-color', '#0F1519'); + $('.sidebarCollaborateBox').fadeOut(200, function () { + sliding1 = false; + realtimeIsOpen = false; + }); + } + }, 300); + } + + var openRealtime = function () { + clearTimeout(lT); + if (!sliding1) { + sliding1 = true; + + // hide the other two + $('.sidebarFilterBox').hide(); + $('.sidebarAccountBox').hide(); + $('.sidebarFilterIcon').css('background-color', '#0F1519'); + $('.sidebarAccountIcon').css('background-color', '#0F1519'); + + $('.sidebarCollaborateIcon').css('background-color', '#000'); + $('.sidebarCollaborateBox').fadeIn(200, function () { + sliding1 = false; + realtimeIsOpen = true; + }); + } + } + // bind the hover events + $(".sidebarCollaborate").hover(openRealtime, closeRealtime); + } // end bindRealtimeHover + + function bindSaveHover() { + var closeSave = function () { + + } + + var openSave = function () { + // hide the other three + $('.sidebarFilterBox, .sidebarAccountBox, .sidebarCollaborateBox').hide(); + $('.sidebarFilterIcon, .sidebarAccountIcon, .sidebarCollaborateIcon').css('background-color', '#0F1519'); + } + // bind the hover events + $(".sidebarSave").hover(openSave, closeSave); + } // end bindSaveHover + + // bind hover events + bindRealtimeHover(); + bindSaveHover(); + // because anyone who can edit the map can collaborate on it in realtime - $(".sidebarCollaborateIcon").click(function (event) { + $(".realtimeOnOff").click(function (event) { if (!goRealtime) { window.realtime.sendRealtimeOn(); - $('.sidebarCollaborate .tip').html('Stop Realtime Collaboration'); + $(this).html('ON').removeClass('rtOff').addClass('rtOn'); + $(".rtMapperSelf").removeClass('littleRtOff').addClass('littleRtOn'); } else { window.realtime.sendRealtimeOff(); - $('.sidebarCollaborate .tip').html('Start Realtime Collaboration'); + $(this).html('OFF').removeClass('rtOn').addClass('rtOff'); + $(".rtMapperSelf").removeClass('littleRtOn').addClass('littleRtOff'); } goRealtime = !goRealtime; $(".sidebarCollaborateIcon").toggleClass("blue"); }); - + // because anyone who can edit the map can save a new map layout $('.sidebarSave').click(function () { saveLayoutAll(); }); - + // because anyone who can edit the map can change the map title $('.mapInfoName .best_in_place_name').bind("ajax:success", function () { var name = $(this).html(); $('.mapName').html(name); }); - + }); // end document.ready \ No newline at end of file diff --git a/app/assets/javascripts/jquery/AuthCanEditMappingPages.js b/app/assets/javascripts/jquery/AuthCanEditMappingPages.js index e952e338..ba9794a9 100644 --- a/app/assets/javascripts/jquery/AuthCanEditMappingPages.js +++ b/app/assets/javascripts/jquery/AuthCanEditMappingPages.js @@ -9,6 +9,23 @@ this code adds required jQuery for creating, or pulling in, topics and synapses $(document).ready(function () { + function bindForkHover() { + var closeFork = function () { + + } + + var openFork = function () { + // hide the other three + $('.sidebarFilterBox, .sidebarAccountBox, .sidebarCollaborateBox').hide(); + $('.sidebarFilterIcon, .sidebarAccountIcon, .sidebarCollaborateIcon').css('background-color', '#0F1519'); + } + // bind the hover events + $(".sidebarFork").hover(openFork, closeFork); + } // end bindForkHover + + // bind hover events + bindForkHover(); + ////// ////// //// TOPIC CREATION diff --git a/app/assets/javascripts/jquery/EveryPage.js b/app/assets/javascripts/jquery/EveryPage.js index 1d9ade1f..2898883d 100644 --- a/app/assets/javascripts/jquery/EveryPage.js +++ b/app/assets/javascripts/jquery/EveryPage.js @@ -371,9 +371,9 @@ $(document).ready(function () { // hide the other two $('.sidebarFilterBox').hide(); - $('.sidebarWandBox').hide(); + $('.sidebarCollaborateBox').hide(); $('.sidebarFilterIcon').css('background-color', '#0F1519'); - $('.sidebarWandIcon').css('background-color', '#0F1519'); + $('.sidebarCollaborateIcon').css('background-color', '#0F1519'); $('.sidebarAccountIcon').css('background-color', '#000'); $('.sidebarAccountBox').fadeIn(200, function () { diff --git a/app/assets/javascripts/realtime/realtime.js b/app/assets/javascripts/realtime/realtime.js index 2428e3f3..a63126ca 100644 --- a/app/assets/javascripts/realtime/realtime.js +++ b/app/assets/javascripts/realtime/realtime.js @@ -26,6 +26,17 @@ window.realtime.setupSocket = function () { socket.on(userid + '-' + mapid + '-UpdateMapperList', function (data) { // data.userid // data.username + // data.userrealtime + + MetamapsModel.mappersOnMap[data.userid] = { + name: data.username, + realtime: data.userrealtime + }; + + var onOff = data.userrealtime ? "On" : "Off"; + var mapperListItem = '
  • ' + data.username + '
  • '; + $('.realtimeMapperList ul').append(mapperListItem); + //alert(data.username + ' is already online'); }); @@ -33,6 +44,14 @@ window.realtime.setupSocket = function () { socket.on('maps-' + mapid + '-newmapper', function (data) { // data.userid // data.username + + MetamapsModel.mappersOnMap[data.userid] = { + name: data.username, + realtime: false + }; + + var mapperListItem = '
  • ' + data.username + '
  • '; + $('.realtimeMapperList ul').append(mapperListItem); window.realtime.notifyUser(data.username + ' just joined the map'); @@ -41,15 +60,32 @@ window.realtime.setupSocket = function () { userToNotify: data.userid, username: username, userid: userid, + userrealtime: goRealtime, mapid: mapid }; socket.emit('updateNewMapperList', update); }); + // receive word that a mapper left the map + socket.on('maps-' + mapid + '-lostmapper', function (data) { + // data.userid + // data.username + + delete MetamapsModel.mappersOnMap[data.userid]; + + $('#mapper' + data.userid).remove(); + + window.realtime.notifyUser(data.username + ' just left the map'); + }); + // receive word that there's a mapper turned on realtime socket.on('maps-' + mapid + '-newrealtime', function (data) { // data.userid // data.username + + MetamapsModel.mappersOnMap[data.userid].realtime = true; + + $('#mapper' + data.userid).removeClass('littleRtOff').addClass('littleRtOn'); window.realtime.notifyUser(data.username + ' just turned on realtime'); }); @@ -59,16 +95,13 @@ window.realtime.setupSocket = function () { // data.userid // data.username + MetamapsModel.mappersOnMap[data.userid].realtime = false; + + $('#mapper' + data.userid).removeClass('littleRtOn').addClass('littleRtOff'); + window.realtime.notifyUser(data.username + ' just turned off realtime'); }); - socket.on('maps-' + mapid + '-lostmapper', function (data) { - // data.userid - // data.username - - window.realtime.notifyUser(data.username + ' just left the map'); - }); - socket.on('maps-' + mapid, function (data) { diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index 2d84e310..88fbee2a 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -887,17 +887,15 @@ h3.filterByMetacode { position: absolute; width: 35px; height: 35px; - background: #0F1519 url('MMCCicon_realtime_junto.png') no-repeat 0px 1px; + background-image: url('MMCCicon_realtime_junto.png'); background-size: 36px 36px; + background-position: center center; + background-repeat: no-repeat; + background-color: #0F1519; cursor: pointer; } -.sidebarCollaborateIcon:hover, -.sidebarCollaborateIcon.blue:hover { - background-color: black; -} .sidebarCollaborateIcon.blue { - background: #0F1519 url('MMCCicon_realtime_blue.png') no-repeat center center; - background-size: 26px 25px; + background-image: url('MMCCicon_realtime_blue.png'); } .sidebarCollaborateBox { position: absolute; @@ -905,30 +903,55 @@ h3.filterByMetacode { height: auto; width: auto; background: #000; - top: 36px; + top: 35px; right: 0; padding: 10px; border: 1px solid black; - min-width: 120px; + min-width: 135px; font-family: 'LatoLight', helvetica, sans-serif; } -.sidebarCollaborate .hoverForTip:hover .tip { - display: block; +h3.realtimeBoxTitle { + margin-bottom: 10px; + text-align: left; + float: left; + font-family: 'Lato', helvetica, sans-serif; } -.sidebarCollaborate .tip { - display: none; - position: absolute; - background: black; +.sidebarCollaborateBox .realtimeOnOff { + float: left; + padding: 4px; + border-radius: 2px; + margin-left: 12px; + cursor: pointer; + width: 31px; text-align: center; - top: 36px; - right: 0; +} +.sidebarCollaborateBox .rtOff { + background: white; + color: black; +} +.sidebarCollaborateBox .rtOff:hover { + padding: 3px; + border: 1px solid #15bad4; +} +.sidebarCollaborateBox .rtOn { + background: #15bad4; color: white; - border-radius: 4px; - font-size: 15px !important; - font-family: 'LatoRegular'; - line-height: 17px; - padding: 3px 5px 2px; - z-index: 100; +} +.realtimeMapperList .rtMapper { + list-style-type: none; + white-space: nowrap; + padding: 2px 5px 2px 30px; + display: block; + background-size: 26px 26px; + background-repeat: no-repeat; + background-position: 4px center; + margin-bottom: 5px; +} +.realtimeMapperList .littleRtOff { + background-image: url('/assets/MMCCicon_realtime_junto.png'); +} +.realtimeMapperList .littleRtOn { + background-image: url('/assets/MMCCicon_realtime_blue.png'); } /* end collaborate */ diff --git a/app/views/maps/show.html.erb b/app/views/maps/show.html.erb index 6fd4daf9..474a6c1a 100644 --- a/app/views/maps/show.html.erb +++ b/app/views/maps/show.html.erb @@ -6,6 +6,11 @@ <% content_for :title, @map.name + " | Metamaps" %> +
    + +
    + + <% if authenticated? %> <% if @map.permission == "commons" || @map.user == user %>
    @@ -23,11 +28,18 @@
    <% if @map.permission == "commons" || @map.user == user %>
    -
    -
    Start Realtime Collaboration
    -
    +
    - +

    Realtime:

    + OFF +
    +
    +
      +
    • + <%= user.name %> (me) +
    • +
    +
    <% end %> diff --git a/realtime/realtime-server.js b/realtime/realtime-server.js index 0f714535..06aae339 100644 --- a/realtime/realtime-server.js +++ b/realtime/realtime-server.js @@ -44,7 +44,8 @@ function start() { socket.on('updateNewMapperList', function (data) { var existingUser = { userid: data.userid, - username: data.username + username: data.username, + userrealtime: data.userrealtime }; socket.broadcast.emit(data.userToNotify + '-' + data.mapid + '-UpdateMapperList', existingUser); });