From da10dce320434e48fd8cfed6b1f2baf88ad4e2ed Mon Sep 17 00:00:00 2001 From: Igor Zhukov Date: Fri, 30 Jan 2015 18:58:01 +0300 Subject: [PATCH] WIP added new emoji tooltip class added new emoji panel class wip: textarea composer --- app/css/app.css | 243 +++++++----- app/css/desktop.css | 61 +-- app/img/icons/General.png | Bin 12521 -> 13342 bytes app/img/icons/General_1x.png | Bin 6007 -> 6344 bytes app/img/icons/IconsetSmiles.png | Bin 6975 -> 10026 bytes app/img/icons/IconsetSmiles_1x.png | Bin 3283 -> 5046 bytes app/index.html | 1 + app/js/app.js | 38 +- app/js/controllers.js | 4 +- app/js/directives.js | 12 +- app/js/lib/ng_utils.js | 109 ------ app/js/lib/utils.js | 200 +++++++++- app/js/message_composer.js | 396 ++++++++++++++++++++ app/js/services.js | 6 +- app/partials/desktop/emoji_btn_tooltip.html | 26 ++ app/partials/desktop/im.html | 11 +- app/webogram.appcache | 2 +- 17 files changed, 824 insertions(+), 285 deletions(-) create mode 100644 app/js/message_composer.js create mode 100644 app/partials/desktop/emoji_btn_tooltip.html diff --git a/app/css/app.css b/app/css/app.css index a65e8e92..b7a22ed3 100644 --- a/app/css/app.css +++ b/app/css/app.css @@ -771,7 +771,7 @@ a.tg_radio_on:hover i.icon-radio { display: inline-block; vertical-align: top; background: url(../img/icons/General.png) no-repeat -5px -10px; - background-size: 40px 678px; + background-size: 40px 778px; margin-right: 18px; } .icon-tg-title { @@ -809,7 +809,7 @@ a.tg_radio_on:hover i.icon-radio { display: inline-block; vertical-align: middle; background: url(../img/icons/General.png) no-repeat -18px -50px; - background-size: 40px 678px; + background-size: 40px 778px; margin-left: 12px; margin-top: -1px; } @@ -1453,7 +1453,7 @@ div.im_message_video_thumb { display: inline-block; line-height: 0; background: url(../img/icons/General.png) no-repeat -14px -509px; - background-size: 40px 678px; + background-size: 40px 778px; width: 12px; height: 18px; margin: 12px 15px; @@ -1476,7 +1476,7 @@ div.im_message_video_thumb { width: 14px; height: 16px; background: url(../img/icons/General.png) no-repeat -13px -611px; - background-size: 40px 678px;; + background-size: 40px 778px;; margin: 13px 16px; } .is_1x .im_message_file_button_dl_audio .im_message_file_button_icon { @@ -1775,42 +1775,6 @@ a.im_message_fwd_photo { line-height: 150%; } -span.emoji { - display: -moz-inline-box; - -moz-box-orient: vertical; - display: inline-block; - vertical-align: baseline; - *vertical-align: auto; - *zoom: 1; - *display: inline; - height: 18px; - width: 18px; - background-repeat: no-repeat; - text-indent: -9999px; -} - -/* widths and heights calculated according to spritesheet dimensions and icon size */ -.emoji-spritesheet-0 { - background-size: 486px 126px; - background-image: url('../img/emojisprite_0.png'); -} -.emoji-spritesheet-1 { - background-size: 522px 72px; - background-image: url('../img/emojisprite_1.png'); -} -.emoji-spritesheet-2 { - background-size: 594px 126px; - background-image: url('../img/emojisprite_2.png'); -} -.emoji-spritesheet-3 { - background-size: 612px 54px; - background-image: url('../img/emojisprite_3.png'); -} -.emoji-spritesheet-4 { - background-size: 612px 126px; - background-image: url('../img/emojisprite_4.png'); -} - .im_history_not_selected, .im_history_empty { visibility: hidden; @@ -1995,116 +1959,189 @@ img.img_fullsize { vertical-align: middle; margin: -3px 0 0 0; } -.emoji-menu { + + + +.composer_emoji_insert_btn { + display: block; + position: absolute; + right: 3px; + top: 2px; + cursor: pointer; + padding: 0; + + width: 22px; + height: 22px; + margin-top: 1px; +} +.icon-emoji { + display: inline-block; + width: 22px; + height: 22px; + vertical-align: top; + background: url(../img/icons/General.png) no-repeat -9px -335px; + background-size: 40px 778px; + opacity: 0.8; +} +.composer_emoji_tooltip { + display: none; position: absolute; z-index: 999; width: 220px; - margin-left: -107px; - margin-top: -252px; - overflow: hidden; + margin-left: -100px; + margin-top: -248px; border: 1px #dfdfdf solid; -webkit-border-radius: 3px; -moz-border-radius: 3px; border-radius: 3px; - overflow: hidden; -webkit-box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.1); -moz-box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.1); box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.1); -} -.emoji-items-wrap1 { background: #FFF; padding: 5px 2px 5px 5px; } -.emoji-items-wrap1 .emoji-menu-tabs { +.icon-tooltip-tail { + background: #FFF; + width: 18px; + height: 18px; + -webkit-transform: rotate(45deg); + -moz-transform: rotate(45deg); + -ms-transform: rotate(45deg); + -o-transform: rotate(45deg); + transform: rotate(45deg); + display: inline-block; + -webkit-box-shadow: 1px 1px 1px rgba(0, 0, 0, 0.1); + -moz-box-shadow: 1px 1px 1px rgba(0, 0, 0, 0.1); + box-shadow: 1px 1px 1px rgba(0, 0, 0, 0.1); + border: 1px #dfdfdf solid; + border-width: 0 1px 1px 0; + -webkit-border-radius: 2px; + -moz-border-radius: 2px; + border-radius: 2px; + position: absolute; + bottom: -10px; + left: 50%; + margin-left: -9px; +} + +.composer_emoji_tooltip_tabs { width: 100%; margin-bottom: 8px; margin-top: 3px; } -.emoji-items-wrap1 .emoji-menu-tabs td { - text-align: center; - color: white; +.composer_emoji_tooltip_tab { line-height: 0; -} -.emoji-menu-tabs .emoji-menu-tab { + color: white; display: inline-block; width: 24px; height: 29px; background: url(../img/icons/IconsetSmiles.png) no-repeat; - background-size: 42px 350px; + background-size: 42px 470px; + cursor: pointer; + opacity: 0.7; + margin: 0 3px; } -.is_1x .emoji-menu-tabs .emoji-menu-tab { +.is_1x .composer_emoji_tooltip_tab { background-image: url(../img/icons/IconsetSmiles_1x.png); } +.composer_emoji_tooltip_tab.active { + opacity: 1; +} -.emoji-menu-tabs .icon-recent {background-position: -9px -306px; } -.emoji-menu-tabs .icon-recent-selected {background-position: -9px -277px; } +.composer_emoji_tooltip_tab_recent {background-position: -9px -306px; } +.composer_emoji_tooltip_tab_recent.active {background-position: -9px -277px; } -.emoji-menu-tabs .icon-smile {background-position: -9px -34px; } -.emoji-menu-tabs .icon-smile-selected {background-position: -9px -5px; } +.composer_emoji_tooltip_tab_smile {background-position: -9px -34px; } +.composer_emoji_tooltip_tab_smile.active {background-position: -9px -5px; } -.emoji-menu-tabs .icon-flower {background-position: -9px -145px; } -.emoji-menu-tabs .icon-flower-selected {background-position: -9px -118px; } +.composer_emoji_tooltip_tab_flower {background-position: -9px -145px; } +.composer_emoji_tooltip_tab_flower.active {background-position: -9px -118px; } -.emoji-menu-tabs .icon-bell {background-position: -9px -89px; } -.emoji-menu-tabs .icon-bell-selected {background-position: -9px -61px; } +.composer_emoji_tooltip_tab_bell {background-position: -9px -89px; } +.composer_emoji_tooltip_tab_bell.active {background-position: -9px -61px; } -.emoji-menu-tabs .icon-car {background-position: -9px -196px; } -.emoji-menu-tabs .icon-car-selected {background-position: -9px -170px; } +.composer_emoji_tooltip_tab_car {background-position: -9px -196px; } +.composer_emoji_tooltip_tab_car.active {background-position: -9px -170px; } -.emoji-menu-tabs .icon-grid {background-position: -9px -248px; } -.emoji-menu-tabs .icon-grid-selected {background-position: -9px -222px; } - -.emoji-menu-tabs .icon-recent, -.emoji-menu-tabs .icon-smile, -.emoji-menu-tabs .icon-flower, -.emoji-menu-tabs .icon-bell, -.emoji-menu-tabs .icon-car, -.emoji-menu-tabs .icon-grid { - opacity: 0.7; -} -.emoji-menu-tabs .icon-recent:hover, -.emoji-menu-tabs .icon-smile:hover, -.emoji-menu-tabs .icon-flower:hover, -.emoji-menu-tabs .icon-bell:hover, -.emoji-menu-tabs .icon-car:hover, -.emoji-menu-tabs .icon-grid:hover { - opacity: 1; -} +.composer_emoji_tooltip_tab_grid {background-position: -9px -248px; } +.composer_emoji_tooltip_tab_grid.active {background-position: -9px -222px; } +.composer_emoji_tooltip_tab_stickers {background-position: -9px -361px; } +.composer_emoji_tooltip_tab_stickers.active {background-position: -9px -333px; } -.emoji-menu .emoji-items-wrap { +.composer_emoji_tooltip_content { position: relative; height: 174px; + overflow: hidden; + overflow-y: auto; } -.emoji-menu .emoji-items { - padding-right: 8px; - outline: 0 !important; -} -.emoji-menu img { - width: 20px; - height: 20px; - vertical-align: middle; - border: 0 none; -} -.emoji-menu .emoji-items a { + + +a.composer_emoji_btn { margin: -1px 0 0 -1px; padding: 5px; display: block; float: left; border-radius: 2px; } -.emoji-menu .emoji-items a:hover { +a.composer_emoji_btn:hover { background-color: #edf2f5; } -.emoji-menu:after { - content: ' '; - display: block; - clear: left; + + + +.emoji { + display: -moz-inline-box; + -moz-box-orient: vertical; + display: inline-block; + vertical-align: baseline; + *vertical-align: auto; + *zoom: 1; + *display: inline; + height: 18px; + width: 18px; + background-repeat: no-repeat; + text-indent: -9999px; } -.emoji-menu a .label { - display: none; + +/* widths and heights calculated according to spritesheet dimensions and icon size */ +.emoji-spritesheet-0 { + background-size: 486px 126px; + background-image: url('../img/emojisprite_0.png'); +} +.emoji-spritesheet-1 { + background-size: 522px 72px; + background-image: url('../img/emojisprite_1.png'); +} +.emoji-spritesheet-2 { + background-size: 594px 126px; + background-image: url('../img/emojisprite_2.png'); +} +.emoji-spritesheet-3 { + background-size: 612px 54px; + background-image: url('../img/emojisprite_3.png'); } +.emoji-spritesheet-4 { + background-size: 612px 126px; + background-image: url('../img/emojisprite_4.png'); +} + + +.composer_emoji_btn .emoji { + width: 20px; + height: 20px; + vertical-align: middle; + border: 0 none; + display: inline-block; +} +.composer_emoji_btn .emoji-spritesheet-0 {background-size: 540px 140px;} +.composer_emoji_btn .emoji-spritesheet-1 {background-size: 580px 80px;} +.composer_emoji_btn .emoji-spritesheet-2 {background-size: 660px 140px;} +.composer_emoji_btn .emoji-spritesheet-3 {background-size: 680px 60px;} +.composer_emoji_btn .emoji-spritesheet-4 {background-size: 680px 140px;} + + .error_modal_window .modal-dialog { diff --git a/app/css/desktop.css b/app/css/desktop.css index aa88269e..5bbb607f 100644 --- a/app/css/desktop.css +++ b/app/css/desktop.css @@ -171,7 +171,7 @@ margin-right: 38px; display: inline-block; background: url(../img/icons/General.png) no-repeat -10px -111px; - background-size: 40px 678px; + background-size: 40px 778px; vertical-align: top; margin-top: 3px; } @@ -183,7 +183,7 @@ display: inline-block; vertical-align: top; background: url(../img/icons/General.png) no-repeat -11px -135px; - background-size: 40px 678px; + background-size: 40px 778px; } .icon-settings { width: 20px; @@ -193,7 +193,7 @@ display: inline-block; vertical-align: top; background: url(../img/icons/General.png) no-repeat -10px -163px; - background-size: 40px 678px; + background-size: 40px 778px; } .icon-faq { width: 20px; @@ -203,7 +203,7 @@ display: inline-block; vertical-align: top; background: url(../img/icons/General.png) no-repeat -10px -637px; - background-size: 40px 678px; + background-size: 40px 778px; } .icon-about { width: 21px; @@ -212,7 +212,7 @@ display: inline-block; vertical-align: top; background: url(../img/icons/General.png) no-repeat -10px -193px; - background-size: 40px 678px; + background-size: 40px 778px; } .is_1x .icon-new-group, .is_1x .icon-contacts, @@ -315,7 +315,7 @@ .icon-filter-audio { display: inline-block; background: url(../img/icons/General.png) no-repeat 0 0; - background-size: 40px 678px; + background-size: 40px 778px; margin-right: 12px; vertical-align: top; } @@ -722,26 +722,21 @@ a.footer_link.active:active { background: inherit; } -.im_emoji_quick_select_area { +.composer_emoji_panel { display: block; height: 30px; overflow: hidden; max-width: 210px; } - -.im_emoji_quick_select_area a { +.composer_emoji_panel a { display: inline-block; padding: 5px; outline: 0; border-radius: 2px; } - -.im_emoji_quick_select_area a:hover { +/*.composer_emoji_panel a:hover { background-color: #edf2f5; -} -.im_emoji_quick_select_area a .label { - display: none; -} +}*/ .im_message_selected .im_message_date, .im_message_selected .im_message_document_size, @@ -940,7 +935,8 @@ a.im_panel_peer_photo .peer_initials { margin-left: 36px; } -.im_emoji_btn { +/*.composer_emoji_insert_btn { + display: block; position: absolute; right: 3px; top: 2px; @@ -950,28 +946,43 @@ a.im_panel_peer_photo .peer_initials { width: 22px; height: 22px; margin-top: 1px; -} -.icon-emoji { +}*/ +/*.icon-emoji { display: inline-block; width: 22px; height: 22px; vertical-align: top; background: url(../img/icons/General.png) no-repeat -9px -335px; - background-size: 40px 678px; + background-size: 40px 778px; opacity: 0.8; -} +}*/ .is_1x .icon-emoji { background-image: url(../img/icons/General_1x.png); } -.im_emoji_btn:hover .icon-emoji { +.composer_emoji_insert_btn:hover .icon-emoji { opacity: 1; } -.im_emoji_btn:active .icon-emoji, -.im_emoji_btn.on .icon-emoji { +.composer_emoji_insert_btn:active .icon-emoji, +.composer_emoji_insert_btn.on .icon-emoji { background-position: -9px -367px; opacity: 1; } + + + + + + + + + + + + + + + .im_send_field_wrap { margin-bottom: 15px; } @@ -1014,7 +1025,7 @@ a.im_panel_peer_photo .peer_initials { height: 17px; vertical-align: top; background: url(../img/icons/General.png) no-repeat -11px -455px; - background-size: 40px 678px; + background-size: 40px 778px; opacity: 0.8; margin: 0; } @@ -1050,7 +1061,7 @@ a.im_panel_peer_photo .peer_initials { height: 18px; vertical-align: top; background: url(../img/icons/General.png) no-repeat -10px -399px; - background-size: 40px 678px; + background-size: 40px 778px; opacity: 0.8; } .is_1x .icon-camera { diff --git a/app/img/icons/General.png b/app/img/icons/General.png index b6f3fdf6fc8b3962d4eeb1c98b1724fb984fade1..aa2e7ec894b5d2bb36930f0f0b66a64df986671a 100644 GIT binary patch literal 13342 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 Y7pBrSLGI(5e?Cx_*O04uZ1wE_14|54{r~^~ diff --git a/app/img/icons/General_1x.png b/app/img/icons/General_1x.png index 271503ca33cffcf47715e1d89f72e5999340436f..045dccad9adeb1204bf714bc55a8636a74d47fc7 100644 GIT binary patch delta 5724 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 LQmp_hTL=9gzd(Ar delta 5384 zcmZ`-bySpV&|eyX1rc0QTDrSok?!v9ZV-fJSC)`oghf(n>9~ZHbeDuEjg+KxOQ;{- z>pkE1{c+DT=RD`knVIK3Q@@#ai0_IU0m4Tw#>EBz05Xe9`?d5>(aoRni$3EM<$Wf` zFRIALrywXNBqt2!l^5bulmpB0iYYSC1$lUDXo$;u*#&qwc>1fzOEKJYxb0o+#sBEa z|Ceq`0Xpx$4}kwmh=I<}U)RA=-2T5Gkozy)6mASTDE_Nsb^w56PemTAAGENa^PqXU z@A2SvU3OQ0xd3gKUQiIPPm!ELAh=q80}%WAqZj z$K?%YjXICaM$nsSqzNN_A|4GH58)1t55gY3oKPKAeFPQnO846bA*UdOgzR>PtDL}q=3z}_M~t)UwC3|-5gbnlEJ#y$}@ zFkM2sc1nK)I0MxyopLpx<_z>SKLy%KL9; z31*)c{t^yxC<@6T;5xiAi{l~0GpaUM&G~rD6ks#T{B3CqsK413>pK4pSRVBG%(4VJ z9rX_0woZ1;U{Qk|P+oC~l`zdS?vBzNlDR?Hw=?if)0$r0DF6Y7Yi#- zt1`<$B{L@m=lE|b^`)biuLthBRnDL*Mn{|$n|lLZ-#IJ~s>ka!zB?{*2du1Ym77J& zlq_2{GW+4*T^Kf;o+X5tH0}bbPyPBIH(yI7jiK%6Hw51{IW#mGtA$kf17tq8@Cz|c zbm(5Dio9_~TFf_m_LDXRnH%f5fvm`PN8K_e8pRFxmt#}4p2eW!VMFF zh*=0mf!0#On5YHUc$nKRktu57$H4ky@e=9%86u~%(qXPn6{r1^FNad!o|9~qW*Q_J z?1^}M@@Z1U2{3N86A-g~zQ^zErAYUNmgTjG6rWr(pQU$L$m7*B%UIYGlKl!~W@Xd;RiLAP8_xDh#BDPPwz}=Dw$$BIVcE zep{B8L?5)|`v4^+(R@KSP3Pb3<=$QRrsd5X2~$ui-fcE!UjFz5HY?hP8n&lNJ($0< zc@QIr_G%&^Wq~jZ&jnSvO{X!3)FP#m3NFZB8b(y@U%0D2qAOxYOh8jFR-;xmbuzWm z)_1-oMphacMz~8oJ5({XGEbmaDa=AH+ttryW#~^WfTtE%+KL#eGnl&A%~P~iRi{Mb ze`H{z933g#;xjXHBdfZL(cbt{DQlNxIb&#G=%Qc@ienlV4C|-(c>uh7vi`15zi}Pb zny+6im>&CRT%WiES`aSa0xx4-RX2K_>LN;lWO`JkBEbqnzo#JbRoP_|I9n|k zE!C8>!I(V;pvskI%88W!r)-s$QmEBM64SwFrMo{?5ATvR!H9#20qXQ>lV&K^6s2oRcBx@!=dVF>S%{b z;|kZ4LAn|&7D}ryCHZ&Jch>ZPq&n+uq=4M_FK59}F?-6U&_!}=+Aj|QM*g6s} zo`xbrkqFR;DI{F-AXq;xfBp$G8pQ3PwM_RGy+ga3(MO*kzKzhX1378*4n>orVG+F< zJa(v{MEX`>JMOi_DNlg@rOS7yArwGv$!ore?yi){ee-2d^_E*QZ&{ z1b=4!)4{PVjcP1*R_nf78j3-BdRzJjT2o>@tN;al^>#E_P3G;FuovFO8>bV8+pl`R zjND*i1k1f!QZyrlxadQLgSb$Se|b(Ywx}02ok~g{?hZYJ->D1;;U4I0#2U&ypb9T^ zV5S1cNoXvtelb~kGOc?RsYW(Wq^;3>!)SynL+0L7$|Z4|Ceedl1lx2*vb|QLhNVarU{VcbaYK3 zN*>#{r~Ys3nsS9lpc&hQgcAz7aV)QaY;HPNB*+_>g8!rq-{70dO?C(Ug?9`7hlKJw+U|9xX*;iehA8X)Vbsomt=4G5&{c~v#>e+ z*?MlFxCGj{PNLE7GY3CXKswGfXir4A4_%_!nk@2c;Dr-&yExmyfPq#d4*6{;81Mi_C5~YfXd)?&6^~OY^j3# zL!#r z4KF03cM1s)t{b_-o`;KjgWD-$i4&(JOHzN;wyygd?<&Z?C{I0rvz;3T%2$PKDmHD*ACjB3+u(Y>yS*K`|1G@iWK- zFRX&zAQ3O(64(iSk`YKs&O{hy`kq^EWi)^*K^&D!7odFpkWrkMv`xDgaAU#E@&*`cob? z=QZU_k8PWk);qrbEc|Hg!acw=m4f>lQ2JoekR7{<*OSrzSOGAHsq1DsSikiEeXOkYNGeO+bC{7yIl{ z`$InFYL9Xr=CLPV=ae!fx!K0$%AzZfbE>-R4d1F!wD==J;wik0uXxvnQ{n#MlHJ-kbV*=wSzVPA$Ejp~Q&W#leo-DB^RNdr|K@5SU8ww+$s*!5v(BRpHsSvWS*J2>1G7nSZu&x z6(yBV8ML-7&a*%Gm5kVizR%B{N-lXuZ!7`__zFjyf~=P2M8OcF*lKI%*O zSf&aUN<#+W$Uckok>xhL5mrHStHKpo*gacfpOfreKtVSN7H+sab4-_V*LKX9q<-}1 zthY&BFQIp&i2>y>43G_v?4(f`o}wbwRlgeQ3?CM)Izr5y>e+yn{oeHl-pw{vLxjq- zWa<2abCynL4b}W6eVyx7enMV1(!%qz5bkYz@wASCerB|Z)dLA^@#u3Q({xOAo{i1W z>2(?hE@+rv=crglB2u*41y!*)2K0Vg2dO6%R#-t%W#w-Lw#Vu?)YC%&bB%szUKl38;BKE%A+KK!b+5?0d1N(u>j^!yo0SL6cNV!Ln|)rRKo(fy=zIS~CTm&uAm2(CA!20mRzQ+;n2pdlD(k;VAp~qvE)9VM{03cRr+{v9BtgdN2`gJ%ge*6o%dB%4-Pf?yxF^6@y=wN6l zBJKil&w2N0yXBq}7AN5yItk^WemYKN5&Do)lu7y()i}_2k0^#{U3}{+JWzD0hQ}TU zm4vUJVdwtWBU*wi!oR-ft*E|!yO~8Ku|QK7f=UNg4Yc9RjtCTW$De?gcw0`uT|XYu z_BH0<2T={VD)XY>_$KEU;ws8}M!Z#CkvW)jlmaid54 z&Lfnx@sLTTueNBU_dQe=?ek@+K=E)23sK{B?6_dFQWDLxUUQlK`uBUa!Ap$z7I)&Z zn(@>RdEXV>6|&#qTtJ=6J}<-GIxJvobm^26W;|4QT4pnO>DFfvw_9&U3aXsGu_6wj#H8>Uel|Pq42mJQ+&p+Jml3T)oN=SWHA$ zA*MABh_g{cb&r0|xBAK0>>28A&5hQYcS?Xh#6F{sk>=+dMV$D>CXRCh1u7vCdfMyp zxBw>fhIrhIOZb9tt4Q^%zEg+vWET6#>=Bmr9M2Bb$8q> z_4VD~z=V4-p1;Ln#=6q@2OPf}d)f(T02oO+ZgwW#pdCXkxDqOAZw zGx6WSA(izT4f@O6zfj@_PHzj}{8r!SW06!E|;_V2hz%8Q5-9ow9)4 z)QtZ-cBz=((85eGDgV8YNwuqHEvZVCaUZNANBi%f{WV?Q$yVV8tZ{>eSiupo5h52o zPu^5P@^xwFC($8l7xTDL5z^s?gdg+XRP8z&ym<6GQ`E`xBBZmS|7#~5!8bg#Z7G3L z`?hiro=RH#2h#AY{R_pNR5wA z8k<;sr@}7-vC&`jqxHS*czOO(A2*0g>%lk9=A3utCbYaEd}T-!+hVcKZF~WUszED7 zVLwe6d}uIJVtnc+Ql#J?$IyxNMSs6?OY;0d?~OP zkJ91so9Np5(wp^mL@mNq=e*mc41p;DO&JRR<7dS;a=`-kt7LMthKRD01H`xkM7xkz zdE_z?p-yGB6!3iC;>l`tpCdUcFs;%`4jbU>$_WE-3_csl5} zL=@5+(B;tOik_ZF#wY5-%`5fHS53hJi%){jYJ-WU`jUU)ZR9voBRHUa>||Mc_h{LF zQvF@(?cj&@S})LLGP9G|DHP2G_BBME%%_Rq@p`~=;nnxIGM#lOwl)FXS$Uf=Z@D5+u2L#m!!mgL%1mZ=ac7SQ-*1- z=A+HnCA*{vN~Sm&p4147Vl!*5#Aek++{Td@H`WRwVc4xho5jMl#v8UwixPPJxh#R_>~{N=x=&;LtZy-$vz c=mY@F{NkSEL>b=uAD#de1x@*CIqUHM0a4n}%>V!Z diff --git a/app/img/icons/IconsetSmiles.png b/app/img/icons/IconsetSmiles.png index 4fb10645a37c32678ce1c3f17338d3b6bec94163..6618c24b81f9967b3c4ea5e2d5d67fa76a265bbc 100644 GIT binary patch literal 10026 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%0DWVU$y4Xs^xc?I=xXt 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 Ee-DyZp8x;= literal 6975 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 XQG`iqo+RlD7(h!y4^pmX_42;}Z4eef diff --git a/app/img/icons/IconsetSmiles_1x.png b/app/img/icons/IconsetSmiles_1x.png index 9679265dbb861609a159389cad337849012d1d1a..b244cb765c20173aaf5183dd366095ca7151974c 100644 GIT binary patch literal 5046 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 GiuxZ*;18Ps delta 3257 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 + diff --git a/app/js/app.js b/app/js/app.js index e8ec4a78..a80ee454 100644 --- a/app/js/app.js +++ b/app/js/app.js @@ -27,25 +27,25 @@ angular.module('myApp', [ ]). config(['$locationProvider', '$routeProvider', '$compileProvider', 'StorageProvider', function($locationProvider, $routeProvider, $compileProvider, StorageProvider) { - var icons = {}, reverseIcons = {}, i, j, hex, name, dataItem, row, column, totalColumns; - - for (j = 0; j < Config.EmojiCategories.length; j++) { - totalColumns = Config.EmojiCategorySpritesheetDimens[j][1]; - for (i = 0; i < Config.EmojiCategories[j].length; i++) { - dataItem = Config.Emoji[Config.EmojiCategories[j][i]]; - name = dataItem[1][0]; - row = Math.floor(i / totalColumns); - column = (i % totalColumns); - icons[':' + name + ':'] = [j, row, column, ':'+name+':']; - reverseIcons[name] = dataItem[0]; - } - } - - $.emojiarea.spritesheetPath = 'img/emojisprite_!.png'; - $.emojiarea.spritesheetDimens = Config.EmojiCategorySpritesheetDimens; - $.emojiarea.iconSize = 20; - $.emojiarea.icons = icons; - $.emojiarea.reverseIcons = reverseIcons; + // var icons = {}, reverseIcons = {}, i, j, hex, name, dataItem, row, column, totalColumns; + + // for (j = 0; j < Config.EmojiCategories.length; j++) { + // totalColumns = Config.EmojiCategorySpritesheetDimens[j][1]; + // for (i = 0; i < Config.EmojiCategories[j].length; i++) { + // dataItem = Config.Emoji[Config.EmojiCategories[j][i]]; + // name = dataItem[1][0]; + // row = Math.floor(i / totalColumns); + // column = (i % totalColumns); + // icons[':' + name + ':'] = [j, row, column, ':'+name+':']; + // reverseIcons[name] = dataItem[0]; + // } + // } + + // $.emojiarea.spritesheetPath = 'img/emojisprite_!.png'; + // $.emojiarea.spritesheetDimens = Config.EmojiCategorySpritesheetDimens; + // $.emojiarea.iconSize = 20; + // $.emojiarea.icons = icons; + // $.emojiarea.reverseIcons = reverseIcons; $compileProvider.imgSrcSanitizationWhitelist(/^\s*(https?|ftp|file|blob|filesystem|chrome-extension|app):|data:image\//); $compileProvider.aHrefSanitizationWhitelist(/^\s*(https?|ftp|file|mailto|blob|filesystem|chrome-extension|app):|data:image\//); diff --git a/app/js/controllers.js b/app/js/controllers.js index 4c98edbf..cb8aeda4 100644 --- a/app/js/controllers.js +++ b/app/js/controllers.js @@ -2992,7 +2992,7 @@ angular.module('myApp.controllers', ['myApp.i18n']) }) - .controller('CountrySelectModalController', function ($scope, $modalInstance, $rootScope, SearchIndexManager, _) { + .controller('CountrySelectModalController', function ($scope, $modalInstance, $rootScope, _) { $scope.search = {}; $scope.slice = {limit: 20, limitDelta: 20} @@ -3035,7 +3035,7 @@ angular.module('myApp.controllers', ['myApp.i18n']) }) - .controller('PhonebookModalController', function ($scope, $modalInstance, $rootScope, AppUsersManager, PhonebookContactsService, SearchIndexManager, ErrorService) { + .controller('PhonebookModalController', function ($scope, $modalInstance, $rootScope, AppUsersManager, PhonebookContactsService, ErrorService) { $scope.search = {}; $scope.phonebook = []; diff --git a/app/js/directives.js b/app/js/directives.js index 6d919047..0c6f78d9 100755 --- a/app/js/directives.js +++ b/app/js/directives.js @@ -1071,6 +1071,16 @@ angular.module('myApp.directives', ['myApp.filters']) }; function link ($scope, element, attrs) { + + var emojiButton = $('.composer_emoji_insert_btn', element)[0]; + new EmojiTooltip(emojiButton); + + var emojiPanel = $('.composer_emoji_panel', element)[0]; + new EmojiPanel(emojiPanel); + + return; + + var messageField = $('textarea', element)[0], fileSelects = $('input', element), dropbox = $('.im_send_dropbox_wrap', element)[0], @@ -2587,4 +2597,4 @@ angular.module('myApp.directives', ['myApp.filters']) } }; - }) + }) \ No newline at end of file diff --git a/app/js/lib/ng_utils.js b/app/js/lib/ng_utils.js index c7bb80e5..f26139ac 100644 --- a/app/js/lib/ng_utils.js +++ b/app/js/lib/ng_utils.js @@ -734,115 +734,6 @@ angular.module('izhukov.utils', []) }; }) -.service('SearchIndexManager', function () { - var badCharsRe = /[`~!@#$%^&*()\-_=+\[\]\\|{}'";:\/?.>,<\s]+/g, - trimRe = /^\s+|\s$/g, - accentsReplace = { - a: /[åáâäà]/g, - e: /[éêëè]/g, - i: /[íîïì]/g, - o: /[óôöò]/g, - u: /[úûüù]/g, - c: /ç/g, - ss: /ß/g - } - - return { - createIndex: createIndex, - indexObject: indexObject, - cleanSearchText: cleanSearchText, - search: search - }; - - function createIndex () { - return { - shortIndexes: {}, - fullTexts: {} - } - } - - function cleanSearchText (text) { - text = text.replace(badCharsRe, ' ').replace(trimRe, '').toLowerCase(); - - for (var key in accentsReplace) { - if (accentsReplace.hasOwnProperty(key)) { - text = text.replace(accentsReplace[key], key); - } - } - - return text; - } - - function indexObject (id, searchText, searchIndex) { - if (searchIndex.fullTexts[id] !== undefined) { - return false; - } - - searchText = cleanSearchText(searchText); - - if (!searchText.length) { - return false; - } - - var shortIndexes = searchIndex.shortIndexes; - - searchIndex.fullTexts[id] = searchText; - - angular.forEach(searchText.split(' '), function(searchWord) { - var len = Math.min(searchWord.length, 3), - wordPart, i; - for (i = 1; i <= len; i++) { - wordPart = searchWord.substr(0, i); - if (shortIndexes[wordPart] === undefined) { - shortIndexes[wordPart] = [id]; - } else { - shortIndexes[wordPart].push(id); - } - } - }); - } - - function search (query, searchIndex) { - var shortIndexes = searchIndex.shortIndexes, - fullTexts = searchIndex.fullTexts; - - query = cleanSearchText(query); - - var queryWords = query.split(' '), - foundObjs = false, - newFoundObjs, i, j, searchText, found; - - for (i = 0; i < queryWords.length; i++) { - newFoundObjs = shortIndexes[queryWords[i].substr(0, 3)]; - if (!newFoundObjs) { - foundObjs = []; - break; - } - if (foundObjs === false || foundObjs.length > newFoundObjs.length) { - foundObjs = newFoundObjs; - } - } - - newFoundObjs = {}; - - for (j = 0; j < foundObjs.length; j++) { - found = true; - searchText = fullTexts[foundObjs[j]]; - for (i = 0; i < queryWords.length; i++) { - if (searchText.indexOf(queryWords[i]) == -1) { - found = false; - break; - } - } - if (found) { - newFoundObjs[foundObjs[j]] = true; - } - } - - return newFoundObjs; - } -}) - .service('ExternalResourcesManager', function ($q, $http) { var urlPromises = {}; diff --git a/app/js/lib/utils.js b/app/js/lib/utils.js index f7b2f77d..60cea630 100644 --- a/app/js/lib/utils.js +++ b/app/js/lib/utils.js @@ -58,9 +58,64 @@ function onCtrlEnter (textarea, cb) { }); } +function setFieldSelection(field, from, to) { + field = $(field)[0]; + try { + field.focus(); + if (from === undefined || from === false) { + from = field.value.length; + } + if (to === undefined || to === false) { + to = from; + } + if (field.createTextRange) { + var range = field.createTextRange(); + range.collapse(true); + range.moveEnd('character', to); + range.moveStart('character', from); + range.select(); + } + else if (field.setSelectionRange) { + field.setSelectionRange(from, to); + } + } catch(e) {} +} + +function getFieldSelection (field) { + if (field.selectionStart) { + return field.selectionStart; + } + else if (!document.selection) { + return 0; + } + + var c = "\001", + sel = document.selection.createRange(), + txt = sel.text, + dup = sel.duplicate(), + len = 0; + + try { + dup.moveToElementText(field); + } catch(e) { + return 0; + } + + sel.text = txt + c; + len = dup.text.indexOf(c); + sel.moveStart('character',-1); + sel.text = ''; + + // if (browser.msie && len == -1) { + // return field.value.length; + // } + return len; +} + + function onContentLoaded (cb) { setTimeout(cb, 0); -}; +} function tsNow (seconds) { var t = +new Date() + (window.tsOffset || 0); @@ -153,27 +208,140 @@ function calcImageInBox(imageW, imageH, boxW, boxH, noZooom) { } function versionCompare (ver1, ver2) { - if (typeof ver1 !== 'string') { - ver1 = ''; + if (typeof ver1 !== 'string') { + ver1 = ''; + } + if (typeof ver2 !== 'string') { + ver2 = ''; + } + ver1 = ver1.replace(/^\s+|\s+$/g, '').split('.'); + ver2 = ver2.replace(/^\s+|\s+$/g, '').split('.'); + + var a = Math.max(ver1.length, ver2.length), i; + + for (i = 0; i < a; i++) { + if (ver1[i] == ver2[i]) { + continue; + } + if (ver1[i] > ver2[i]) { + return 1; + } else { + return -1; + } + } + + return 0; +} + + +(function (global) { + + var badCharsRe = /[`~!@#$%^&*()\-_=+\[\]\\|{}'";:\/?.>,<\s]+/g, + trimRe = /^\s+|\s$/g, + accentsReplace = { + a: /[åáâäà]/g, + e: /[éêëè]/g, + i: /[íîïì]/g, + o: /[óôöò]/g, + u: /[úûüù]/g, + c: /ç/g, + ss: /ß/g + }; + + function createIndex () { + return { + shortIndexes: {}, + fullTexts: {} + } + } + + function cleanSearchText (text) { + text = text.replace(badCharsRe, ' ').replace(trimRe, '').toLowerCase(); + + for (var key in accentsReplace) { + if (accentsReplace.hasOwnProperty(key)) { + text = text.replace(accentsReplace[key], key); + } + } + + return text; + } + + function indexObject (id, searchText, searchIndex) { + if (searchIndex.fullTexts[id] !== undefined) { + return false; + } + + searchText = cleanSearchText(searchText); + + if (!searchText.length) { + return false; } - if (typeof ver2 !== 'string') { - ver2 = ''; + + var shortIndexes = searchIndex.shortIndexes; + + searchIndex.fullTexts[id] = searchText; + + angular.forEach(searchText.split(' '), function(searchWord) { + var len = Math.min(searchWord.length, 3), + wordPart, i; + for (i = 1; i <= len; i++) { + wordPart = searchWord.substr(0, i); + if (shortIndexes[wordPart] === undefined) { + shortIndexes[wordPart] = [id]; + } else { + shortIndexes[wordPart].push(id); + } + } + }); + } + + function search (query, searchIndex) { + var shortIndexes = searchIndex.shortIndexes, + fullTexts = searchIndex.fullTexts; + + query = cleanSearchText(query); + + var queryWords = query.split(' '), + foundObjs = false, + newFoundObjs, i, j, searchText, found; + + for (i = 0; i < queryWords.length; i++) { + newFoundObjs = shortIndexes[queryWords[i].substr(0, 3)]; + if (!newFoundObjs) { + foundObjs = []; + break; + } + if (foundObjs === false || foundObjs.length > newFoundObjs.length) { + foundObjs = newFoundObjs; + } } - ver1 = ver1.replace(/^\s+|\s+$/g, '').split('.'); - ver2 = ver2.replace(/^\s+|\s+$/g, '').split('.'); - var a = Math.max(ver1.length, ver2.length), i; + newFoundObjs = {}; - for (i = 0; i < a; i++) { - if (ver1[i] == ver2[i]) { - continue; + for (j = 0; j < foundObjs.length; j++) { + found = true; + searchText = fullTexts[foundObjs[j]]; + for (i = 0; i < queryWords.length; i++) { + if (searchText.indexOf(queryWords[i]) == -1) { + found = false; + break; + } } - if (ver1[i] > ver2[i]) { - return 1; - } else { - return -1; + if (found) { + newFoundObjs[foundObjs[j]] = true; } } - return 0; + return newFoundObjs; } + + global.SearchIndexManager = { + createIndex: createIndex, + indexObject: indexObject, + cleanSearchText: cleanSearchText, + search: search + }; + +})(window); + diff --git a/app/js/message_composer.js b/app/js/message_composer.js new file mode 100644 index 00000000..1a5d21cd --- /dev/null +++ b/app/js/message_composer.js @@ -0,0 +1,396 @@ +/*! + * Webogram v0.3.9 - messaging web application for MTProto + * https://github.com/zhukov/webogram + * Copyright (C) 2014 Igor Zhukov + * https://github.com/zhukov/webogram/blob/master/LICENSE + */ + +'use strict'; + +/* EmojiHelper */ + +(function (global, emojis, categories, spritesheets) { + + + var emojis = {}; + var shortcuts = {}; + var spritesheetPositions = {}; + var index = false; + + var popular = 'joy,kissing_heart,heart,heart_eyes,blush,grin,+1,relaxed,pensive,smile,sob,kiss,unamused,flushed,stuck_out_tongue_winking_eye,see_no_evil,wink,smiley,cry,stuck_out_tongue_closed_eyes,scream,rage,smirk,disappointed,sweat_smile,kissing_closed_eyes,speak_no_evil,relieved,grinning,yum,laughing,ok_hand,neutral_face,confused'.split(','); + + var i, j, code, shortcut, emoji, row, column, totalColumns; + var len1, len2; + + for (i = 0, len1 = categories.length; i < len1; i++) { + totalColumns = spritesheets[i][1]; + for (j = 0, len2 = categories[i].length; j < len2; j++) { + code = categories[i][j]; + emoji = Config.Emoji[code]; + shortcut = emoji[1][0]; + emojis[code] = [emoji[0], shortcut]; + shortcuts[shortcut] = code; + spritesheetPositions[code] = [i, j, Math.floor(j / totalColumns), j % totalColumns]; + } + } + + function getPopularEmoji (callback) { + ConfigStorage.get('emojis_popular', function (popEmojis) { + var result = []; + if (popEmojis && popEmojis.length) { + for (var i = 0, len = popEmojis.length; i < len; i++) { + result.push({code: popEmojis[i][0], rate: popEmojis[i][1]}); + } + callback(result); + return; + }; + ConfigStorage.get('emojis_recent', function (recentEmojis) { + recentEmojis = recentEmojis || popular || []; + var shortcut, code; + for (var i = 0, len = recentEmojis.length; i < len; i++) { + shortcut = recentEmojis[i]; + if (Array.isArray(shortcut)) { + shortcut = shortcut[0]; + } + if (shortcut.charAt(0) == ':') { + shortcut = shortcut.substr(1, shortcut.length - 2); + } + if (code = shortcuts[shortcut]) { + result.push({code: code, rate: 1}); + } + } + callback(result); + }); + }); + } + + function pushPopularEmoji (code) { + getPopularEmoji(function (popularEmoji) { + var exists = false; + var count = popularEmoji.length; + var result = []; + for (var i = 0; i < count; i++) { + if (popularEmoji[i].code == code) { + exists = true; + popularEmoji[i].rate++; + } + result.push([popularEmoji[i].code, popularEmoji[i].rate]); + } + if (exists) { + result.sort(function (a, b) { + return b[1] - a[1]; + }); + } else { + if (result.length > 41) { + result = result.slice(0, 41); + } + result.push([code, 1]); + } + ConfigStorage.set({emojis_popular: result}); + }); + } + + function indexEmojis () { + if (index === false) { + index = SearchIndexManager.createIndex(); + var shortcut; + for (shortcut in shortcuts) { + if (shortcuts.hasOwnProperty(shortcut)) { + SearchIndexManager.indexObject(shortcuts[shortcut], shortcut, index); + } + } + } + } + + function searchEmojis (q) { + indexEmojis(); + return SearchIndexManager.search(q, index); + } + + global.EmojiHelper = { + emojis: emojis, + shortcuts: shortcuts, + spritesheetPositions: spritesheetPositions, + getPopularEmoji: getPopularEmoji, + pushPopularEmoji: pushPopularEmoji, + indexEmojis: indexEmojis, + searchEmojis: searchEmojis + }; + +})(window, Config.Emoji, Config.EmojiCategories, Config.EmojiCategorySpritesheetDimens); + + +function EmojiTooltip (btnEl, options) { + options = options || {}; + var self = this; + + this.btnEl = $(btnEl); + this.onEmojiSelected = options.onEmojiSelected; + + $(this.btnEl).on('mouseenter mouseleave', function (e) { + self.isOverBtn = e.type == 'mouseenter'; + self.createTooltip(); + + if (self.isOverBtn) { + self.onMouseEnter(true); + } else { + self.onMouseLeave(true); + } + }); +} + +EmojiTooltip.prototype.onMouseEnter = function (triggerShow) { + if (this.hideTimeout) { + clearTimeout(this.hideTimeout); + delete this.hideTimeout; + } + else if (triggerShow && !this.showTimeout) { + this.showTimeout = setTimeout(this.show.bind(this), 500); + } +}; + +EmojiTooltip.prototype.onMouseLeave = function (triggerUnshow) { + if (!this.hideTimeout) { + var self = this; + this.hideTimeout = setTimeout(function () { + self.hide(); + }, 500); + } + else if (triggerUnshow && this.showTimeout) { + clearTimeout(this.showTimeout); + delete this.showTimeout; + } +}; + + + +EmojiTooltip.prototype.createTooltip = function () { + if (this.tooltipEl) { + return false; + } + + var self = this; + this.tooltipEl = $('
').appendTo(document.body); + + this.tabsEl = $('.composer_emoji_tooltip_tabs', this.tooltip); + this.contentEl = $('.composer_emoji_tooltip_content', this.tooltip); + this.footerEl = $('.composer_emoji_tooltip_footer', this.tooltip); + this.settingsEl = $('.composer_emoji_tooltip_settings', this.tooltip); + + angular.forEach(['recent', 'smile', 'flower', 'bell', 'car', 'grid', 'stickers'], function (tabName, tabIndex) { + $('') + .on('mousedown', function (e) { + self.selectTab(tabIndex); + return cancelEvent(e); + }) + .appendTo(self.tabsEl); + }); + + this.contentEl.on('mousedown', function (e) { + e = e.originalEvent || e; + var target = $(e.target), code; + if (target.hasClass('emoji')) { + target = $(target[0].parentNode); + } + if (code = target.attr('data-code')) { + if (self.onEmojiSelected) { + self.onEmojiSelected(code); + } + EmojiHelper.pushPopularEmoji(code); + } + return cancelEvent(e); + }); + + this.tooltipEl.on('mouseenter mouseleave', function (e) { + console.log(dT(), e.type); + if (e.type == 'mouseenter') { + self.onMouseEnter(); + } else { + self.onMouseLeave(); + } + }); + + this.selectTab(0); + + return true; +} + + +EmojiTooltip.prototype.selectTab = function (tab) { + if (this.tab === tab) { + return false; + } + $('.active', this.tabsEl).removeClass('active'); + this.tab = tab; + $(this.tabsEl[0].childNodes[tab]).addClass('active'); + + this.updateTabContents(); +}; + +EmojiTooltip.prototype.updateTabContents = function (tab) { + var html = []; + var self = this; + var iconSize = Config.Mobile ? 26 : 20; + + if (this.tab > 0) { + var categoryIndex = this.tab - 1; + var emoticonCodes = Config.EmojiCategories[categoryIndex]; + var totalColumns = Config.EmojiCategorySpritesheetDimens[categoryIndex][1]; + var count = emoticonCodes.length; + var emoticonCode, emoticonData, i, x, y; + + for (i = 0; i < count; i++) { + emoticonCode = emoticonCodes[i]; + emoticonData = Config.Emoji[emoticonCode]; + x = iconSize * (i % totalColumns); + y = iconSize * Math.floor(i / totalColumns); + html.push(''); + } + this.contentEl.html(html.join('')); + } + else { + EmojiHelper.getPopularEmoji(function (popularEmoji) { + var emoticonCode, emoticonData, spritesheet, pos, categoryIndex; + var count = popularEmoji.length; + var i, x, y; + + for (i = 0; i < count; i++) { + emoticonCode = popularEmoji[i].code; + if (emoticonData = Config.Emoji[emoticonCode]) { + spritesheet = EmojiHelper.spritesheetPositions[emoticonCode]; + categoryIndex = spritesheet[0]; + pos = spritesheet[1]; + x = iconSize * spritesheet[3]; + y = iconSize * spritesheet[2]; + html.push(''); + } + } + self.contentEl.html(html.join('')); + }); + } +}; + +EmojiTooltip.prototype.updatePosition = function () { + var offset = this.btnEl.offset(); + this.tooltipEl.css({top: offset.top, left: offset.left}); +}; + +EmojiTooltip.prototype.show = function () { + this.updatePosition(); + this.tooltipEl.show(); + delete this.showTimeout; +}; + +EmojiTooltip.prototype.hide = function () { + this.tooltipEl.hide(); + delete this.hideTimeout; +}; + + + + +function EmojiPanel (containerEl, options) { + options = options || {}; + // var self = this; + + this.containerEl = $(containerEl); + this.onEmojiSelected = options.onEmojiSelected; + + this.containerEl.on('mousedown', function (e) { + e = e.originalEvent || e; + var target = $(e.target), code; + if (target.hasClass('emoji')) { + target = $(target[0].parentNode); + } + if (code = target.attr('data-code')) { + if (self.onEmojiSelected) { + self.onEmojiSelected(code); + } + EmojiHelper.pushPopularEmoji(code); + } + return cancelEvent(e); + }); + + this.update(); +} + +EmojiPanel.prototype.update = function () { + var html = []; + var self = this; + var iconSize = Config.Mobile ? 26 : 20; + + EmojiHelper.getPopularEmoji(function (popularEmoji) { + var emoticonCode, emoticonData, spritesheet, pos, categoryIndex; + var count = popularEmoji.length; + var i, x, y; + + for (i = 0; i < count; i++) { + emoticonCode = popularEmoji[i].code; + if (emoticonData = Config.Emoji[emoticonCode]) { + spritesheet = EmojiHelper.spritesheetPositions[emoticonCode]; + categoryIndex = spritesheet[0]; + pos = spritesheet[1]; + x = iconSize * spritesheet[3]; + y = iconSize * spritesheet[2]; + html.push(''); + } + } + self.containerEl.html(html.join('')); + }); +} + + + + + +function MessageComposer (textarea, options) { + this.textareaEl = $(textarea); + + this.textareaEl.on('keyup keydown', this.onKeyEvent.bind(this)); + this.textareaEl.on('focus blur', this.onFocusBlur.bind(this)); + + this.isActive = false; +} + +MessageComposer.prototype.onKeyEvent = function (e) { + var self = this; + if (e.type == 'keyup') { + this.checkAutocomplete(); + } +} + +MessageComposer.prototype.checkAutocomplete = function (e) { + var pos = getFieldSelection(e.target); + var value = this.textareaEl[0].value.substr(0, pos); + var matches = value.match(/:([A-Za-z_]*)$/); + if (matches) { + if (matches[1]) { + var found = EmojiHelper.searchEmojis(matches[1]); + self.showEmojiSuggestions(found); + } else { + EmojiHelper.getPopularEmoji(function (found) { + self.showEmojiSuggestions(found); + }); + } + } + else { + self.hideSuggestions(); + } +} + +MessageComposer.prototype.onFocusBlur = function (e) { + this.isActive = e.type == 'focus'; + + if (!this.isActive) { + this.hideSuggestions(); + } +} + + +MessageComposer.prototype.showEmojiSuggestions = function (codes) { + this.autocompleteShown = true; +} + +MessageComposer.prototype.hideSuggestions = function () { + delete this.autocompleteShown; +} diff --git a/app/js/services.js b/app/js/services.js index 9229ec7d..1d7aa89d 100644 --- a/app/js/services.js +++ b/app/js/services.js @@ -11,7 +11,7 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) -.service('AppUsersManager', function ($rootScope, $modal, $modalStack, $filter, $q, qSync, MtpApiFileManager, MtpApiManager, RichTextProcessor, SearchIndexManager, ErrorService, Storage, _) { +.service('AppUsersManager', function ($rootScope, $modal, $modalStack, $filter, $q, qSync, MtpApiFileManager, MtpApiManager, RichTextProcessor, ErrorService, Storage, _) { var users = {}, usernames = {}, cachedPhotoLocations = {}, @@ -507,7 +507,7 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) }) -.service('AppChatsManager', function ($rootScope, $modal, _, MtpApiFileManager, MtpApiManager, AppUsersManager, RichTextProcessor, SearchIndexManager) { +.service('AppChatsManager', function ($rootScope, $modal, _, MtpApiFileManager, MtpApiManager, AppUsersManager, RichTextProcessor) { var chats = {}, cachedPhotoLocations = {}; @@ -687,7 +687,7 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) } }) -.service('AppMessagesManager', function ($q, $rootScope, $location, $filter, ApiUpdatesManager, AppUsersManager, AppChatsManager, AppPeersManager, AppPhotosManager, AppVideoManager, AppDocsManager, AppAudioManager, MtpApiManager, MtpApiFileManager, RichTextProcessor, NotificationsManager, SearchIndexManager, PeersSelectService, Storage, FileManager, TelegramMeWebService, StatusManager, _) { +.service('AppMessagesManager', function ($q, $rootScope, $location, $filter, ApiUpdatesManager, AppUsersManager, AppChatsManager, AppPeersManager, AppPhotosManager, AppVideoManager, AppDocsManager, AppAudioManager, MtpApiManager, MtpApiFileManager, RichTextProcessor, NotificationsManager, PeersSelectService, Storage, FileManager, TelegramMeWebService, StatusManager, _) { var messagesStorage = {}; var messagesForHistory = {}; diff --git a/app/partials/desktop/emoji_btn_tooltip.html b/app/partials/desktop/emoji_btn_tooltip.html new file mode 100644 index 00000000..51354a1b --- /dev/null +++ b/app/partials/desktop/emoji_btn_tooltip.html @@ -0,0 +1,26 @@ +
+ +
+
+ +
+ +
+ +
+
+ +
+
+ +
+
+ +
+
+ + + + + +
\ No newline at end of file diff --git a/app/partials/desktop/im.html b/app/partials/desktop/im.html index 01e3cc84..c152e5fc 100644 --- a/app/partials/desktop/im.html +++ b/app/partials/desktop/im.html @@ -171,14 +171,13 @@ -
+
-
- -
+ +
- +
@@ -194,7 +193,7 @@
-
+
diff --git a/app/webogram.appcache b/app/webogram.appcache index a43a10bd..9802e602 100644 --- a/app/webogram.appcache +++ b/app/webogram.appcache @@ -1,6 +1,6 @@ CACHE MANIFEST -# 55 +# 57 NETWORK: *