From ddfca60134d9287b4f5c682c1cf4131d1036bf30 Mon Sep 17 00:00:00 2001 From: Rodolphe Breard Date: Sat, 12 Jan 2013 13:34:16 +0100 Subject: [PATCH] UI recasting: new look, avatars, history and so on and so forth --- CREDITS.md | 3 +- chromesoul.css | 153 +++++++++++++++++++++++++++++----------- chromesoul.html | 31 ++++---- img/chromesoul-logo.png | Bin 0 -> 4284 bytes img/default-avatar.jpg | Bin 0 -> 24765 bytes img/preferences.png | Bin 1014 -> 0 bytes img/settings.png | Bin 0 -> 1038 bytes img/user-available.png | Bin 1036 -> 0 bytes img/user-away.png | Bin 1064 -> 0 bytes img/user-busy.png | Bin 972 -> 0 bytes img/user-idle.png | Bin 1037 -> 0 bytes img/user-invisible.png | Bin 959 -> 0 bytes img/user-offline.png | Bin 1076 -> 0 bytes lib/contacts.nsui.js | 65 ++++++++++++----- lib/ns_client.js | 33 +++++---- lib/nsui.js | 55 ++++++++++----- lib/tab.nsui.js | 53 +++++++++----- manifest.json | 3 +- 18 files changed, 275 insertions(+), 121 deletions(-) create mode 100644 img/chromesoul-logo.png create mode 100644 img/default-avatar.jpg delete mode 100644 img/preferences.png create mode 100644 img/settings.png delete mode 100644 img/user-available.png delete mode 100644 img/user-away.png delete mode 100644 img/user-busy.png delete mode 100644 img/user-idle.png delete mode 100644 img/user-invisible.png delete mode 100644 img/user-offline.png diff --git a/CREDITS.md b/CREDITS.md index 7c363c2..0b97806 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -1,6 +1,7 @@ ## [Chromesoul](https://github.com/TychoBrahe/chromesoul) -* Rodolphe Breard +* Rodolphe Breard (development) +* Romain Mardargent (design) ### Special thanks diff --git a/chromesoul.css b/chromesoul.css index 24b2a93..10930ef 100644 --- a/chromesoul.css +++ b/chromesoul.css @@ -1,18 +1,50 @@ -#l-lst { +/* + * Page itself + */ + +body { + margin: 0; + padding: 0; + background: #347db0 url(img/chromesoul-logo.png) no-repeat 10px 10px; +} + +/* + * Top menu + */ + +#user-status { + position: fixed; + right: 285px; + top: 10px; + margin: 0; + padding: 0; + width: 150px; +} + +#settings-btn { + position: fixed; + right: 222px; + top: 10px; + margin: 0; + padding: 0; +} + +/* + * Contact list + */ + +#contact-lst-wrapper { position: fixed; right: 0; top: 0; + margin: 0; padding: 0 5px 0 5px; width: 200px; height: 100%; border-left: 1px solid #aaa; -} - -#l-lst > h2 { - margin: 0; - padding: 0; - text-align: center; - font-size: 1em; + background-color: #e4e4e4; + box-shadow: 0px 0px 10px #666; + overflow-y: scroll; } #contact-lst { @@ -23,15 +55,53 @@ #contact-lst > li { margin: 5px 0 0 0; - padding: 5px; + padding: 5px 5px 5px 28px; border: 1px solid #aaa; + background-size: 23px 26px; + background-repeat: no-repeat; } -#r-lst { - padding-right: 210px; +#add-contact::-webkit-input-placeholder { + color: rgba(52, 125, 176, 0.42); +} + +#add-contact { + padding: 2px; + outline: 0px solid #aaa; + width: 184px; + height: 20px; + margin: 5px 0 0 0; +} + +#add-contact, #contact-lst > li { + box-shadow: inset 0px 0px 1px #666; + background-color: #f3f3f3; + border: 1px solid #347db0; + color: #347db0; + font-family: monospace; +} + +.remove { + float: right; + font-family: sans-serif; + font-size: 12px; + cursor: pointer; +} + +/* + * Main content + */ + +#main-ctn { + margin: 135px 0 0 0; + padding: 10px 220px 10px 10px; min-width: 400px; } +/* + * Tabs + */ + #tab-lst { margin: 0; padding: 0; @@ -75,6 +145,10 @@ margin: 5px; } +/* + * Chat + */ + .chat-log { margin: 0; padding: 2px 5px 2px 0; @@ -84,38 +158,23 @@ font-family: monospace; } -#add-contact, .chat-input { - padding: 0; - border-style: none; - outline: 1px solid #aaa; + +.chat-input-wrapper { + padding-right: 2px; +} + +.chat-input { + padding: 0px; + outline: 0px solid #aaa; width: 100%; height: 20px; margin: 5px 0 0 0; } -#add-contact:focus, .chat-input:focus { +.chat-input:focus { outline-offset: 0; } -.chat-input-wrapper { - background-image: url('img/user-offline.png'); - background-repeat: no-repeat; - background-position: left bottom; - padding-left: 24px; -} - -#tab-lst > #tab-config { - background-image: url('img/preferences.png'); - background-repeat: no-repeat; - background-position: center; - padding-left: 12px; - padding-right: 12px; -} - -#tab-config > span { - display: none; -} - .spk-oth { color: red; } @@ -124,9 +183,23 @@ color: blue; } -.remove { - float: right; - font-family: sans-serif; - font-size: 12px; - cursor: pointer; +/* + * Scrollbar + */ + +::-webkit-scrollbar { + width: 10px; + height: 10px; + background-color: green; +} + +::-webkit-scrollbar-track-piece { + background-color: #e4e4e4; +} + +::-webkit-scrollbar-thumb { + height: 40px; + background-color: #347db0; + border-left: 1px solid #e4e4e4; + border-right: 1px solid #e4e4e4; } diff --git a/chromesoul.html b/chromesoul.html index 786bdfe..01dfb44 100644 --- a/chromesoul.html +++ b/chromesoul.html @@ -6,30 +6,29 @@ -

Welcome to chromesoul

- -

+

Status:

-
-

Contacts

+
+ +
    -
    -
      -
    • configuration
    • -
    -
    -
    - Login:
    - Password (socks):
    - Enable messages:
    - -
    +
    +

    You haven't configured chromesoul yet, you should go to the configuration pannel.

    +
    + Login:
    + Password (socks):
    + Enable messages:
    + +
    +
    +
      +
      diff --git a/img/chromesoul-logo.png b/img/chromesoul-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..6be344924f6702972a76815e18dce7bbf99bd76d GIT binary patch literal 4284 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 @gJ)wEmD{!4AZmkU-M2$k>8W(Gu zu(1cWUH^Mc|3{X>RU9)EjcMQ%?Fu}5Vs-XC(Z+%Rk_HDnQS#EUjKwF;5Sy&sO_pPk7faMbFYQ=X~Z)x{aZ{`%m=wl12b{q8_V*wH) z_fVC$yDj=L)~K+QUAA??$M^8H2a*DqPk-Ey9{~CSyUPEEfaZPu*oq(903B$V!=k%z zB(NG^1v{^>lIfrI(9bJ08QH>EBf)z?oka67gRa}hlbi!rhIEa$P0$_RzP;}7d@bzV zPI{)%ebW+CXH#90S&>O2uqswybG^s7_^E!-bhzaF*GUoIGqn}=HH;&EjDZx&{wkpa znnXF@`0r`_dy3ZFl&q@c!5EkweZE8HaVwwt@?4vPW(8YUPK!2Jwq?N%L$;?!Z4QE* zK1>e;Rx8X~5kJ~Vg^k<9@&A|EGJgF$tTkWkw|k?euzhrt7$9w>^X0kEGs*9KKzZ1M^VA;VUNw=EIv7qqL!{IXvXFF5e5UGCRdN4s}$&1r)qt#WRu%GHrpIld41rP;rFh)^M* z3w-@P{UO8Q6=L7#YvA?=C9=8#+zS-`(m2D@GeB={t=N)zN&c#0y8y}xY)Hbl&0NPn zoEVtT$KMBL1kZAvcLiIIwyItIq#TZTYK$O(KUcv;Mcnv%;|b6VT2zxG8xq z2A}l-$Ue;R?B~5s_#XH++x@Xo4W8jK8-b#=FX^aW(WED+0YZI|YT#pSaB;FP>T9C5 zuaU^AFywgqZAvpr+5JPczn`kXIM=5Gf) zcMiUFEc&QfjSJWL4CPVP2#<3X*1I3uJua4eE9T@RfwPi(77DQQ5FfSCb4M~sQ`_#^ qi>Q6;3&+>Zufz;bsbzl4UtIb9QTXpoI?k$UcVa`~?RX;d)BgoCpH##E literal 0 HcmV?d00001 diff --git a/img/preferences.png b/img/preferences.png deleted file mode 100644 index eb28840aa6fbcb03ec8d2a095cab0eb8bb937ed8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1014 zcmVgSB~TO zh8G*NWl~93CVZ&Xboimdf)9@!IkrQYBfkm&v{Wp%=jEwikSp1tSU7H)nw~&zjtX}Z z!nXV2=9cDH)#|P9TRW_(@vGxunxaPmfKDb;?5yU4e+bRa{@LH>aJQwMQG^g!JFTUxMA8jHw5e2z-@W^B z?X%BRF;15=;a^#%8k-u#!-FFskH`D9+jYir|7%pb#1&u~iVm6zZ%=>!|C<@f} z{l_i2N@>>zM-8%Ta~!P{C(wQBOH7=57gw%a-n=|E=A$W!B_KXN8aaCMq~jVz2tjeJ zT}?C6OUA0lige|VN=GJ_K;mI?{``-dc``oy`b)ZO!~W-)zn7P>MYRQiI{~;)ySPYb zeJ=$Ns`$W(pWkV(*6}n;kBr}hoEGrQ#S5``G`g?4Bzaw~V1GB6OglzLM>m#yw?z6{ zgIKFAWE{@kN%3~W@s53!J1aOLi~ecKi_k^{zj?0ncQ<3bD^t!%0BAqlrjW5R%rDF* z<9uS<;LzZO;-aFmq>$w4ED>$lSzN$enqI)_+B*Ec#U#%K)gx$tJzn$H{IgSR~?AyMt0IJ=tW&z$|jJ2P{m zPOsN1SJ&=nR07*qoM6N<$f)cCcmH+?% diff --git a/img/settings.png b/img/settings.png new file mode 100644 index 0000000000000000000000000000000000000000..322a98737427df1c8dfde61fa9bcd0aaac97e97e GIT binary patch literal 1038 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 Hu0mjfez(@v diff --git a/img/user-invisible.png b/img/user-invisible.png deleted file mode 100644 index f73116aebddd4314c65620f36f4376e0443521f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 959 zcmV;w13>(VP)AVO?!Z)ABOQ*>c;b#rrNa{^^MrT_o{ z7j#8fbU}4=Xm4@=Okr?uAVXnnVQpb2*7d}uF$485;7R@|vCds|W#dLHkEmqrqk#O$0`S|WhAk4BX06=GFXDAXWM)02* z8SxA0blNM|?7@S91xz!$6=)xUG{zVJKm!99P_8ROL;wK_R9P#gvFpkc$9sA%e=$6% zbtUTRTj~}jbOr{7F&G2JZeT#EAOZnUgc6ttLP$;Y&J$i~~-oI%D&~D@l`7q}kf#>t{-4|B=`*ce=aq8F; z(+nYB$cF*I5W)ok;GDyF_1}dU=LY$Q9jOY*zIg-z*k} zCsnEfJJiwkSq0w7J-ZHE>+kQa*UV_T7dAx|7*?&_BsXqrHVq|^9sQ{0#+Pf|XAYAe_)63CAI^8@=8NYqE~Zkc zS4Jk2d7a5*x&T}Ppic&_t*wm}glK#A_|e`CTbqrh^;?Wc*o2gUx;tR6a~wwi7y&Sx zN~OTce~`b$wrw3i-I67XmaSN|`dBO$YueU)Aav_STII8%+Vi|Z<$hyIQ~;J`NdTX0 z+a7-V_Whg2#>O?GC{8OW8z$O6W#b7>5CxE2w_)w}@1xmE@p#;;>`&SF&sdgK0Pxbb h?I8euJRTp{{|Nz4aNzL#Y~BC>002ovPDHLkV1g`enh^j1 diff --git a/img/user-offline.png b/img/user-offline.png deleted file mode 100644 index c5fa77c3f1f62ac867c62965d2fb87f1d73c1946..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1076 zcmV-41k3x0P)AVO?!Z)ABOQ*>c;b#rrNa{^^MrT_o{ z7j#8fbU}4=Xm4@=Okr?uAVXnnVQpbUiik>}94#1Z zh#H~A+K84Iu7#ddD{7kCotv9`wl8+~vWXW6KJ3iS>^$>*zVm%%W}Rxa3c&pQeD27R zW*@I2(!O*3`uBNqqi2Ys_XHf(byex}iplOOsfi+y^^W1kg@uKtYdVK! zN@H(L9vk-^*L7nc6~iU3UEl&pf+R^pL@?I!XMJ<>@#DG$mQ>5Mr^ZVs9F#&NohTrJ zB*j|6q{XCti?M>Xg0XSoVq(8++r2r8bL;&d@nDI|>{UBImAK*!_)tq}n$V3TEAD{)(dmDLqCHaD?W*x1}; z_0~!(kFX<^2#IQ zXTM98|VSC%)xdl#^C)o;YSKDj=R}?{zCNJ3)#_ruXu|3%`-L|p9 zw%$FSo<0DpG8${GyC4Qa5po1-dHb8Ft*t?_o z!NH>w$B#QhgC3si>{D`hu0km&zR{0T5Jk}MI^|nm zz;>ll!L3%S5%6D9_O)8A=3Kpe^~J0ZmUKE8S5hj-4-edz*}%jJKH#bP__?;apE z03-yqYPDMP(W6VxDwRqp48u>Q(<%1y&-uQ8P;3Bv-;aFX*Q=|m&)4s*Z;T8Vp5MNG u=WpNlqpY8k{!CxjYPH%xwOZACzyA-NSn+}-@`jQC0000: {name: , li: , avatar: }} this.lst = document.getElementById("contact-lst"); }; ContactList.prototype.insertContact = function(elem) { - var i, nb_el = this.lst.children.length; + var i, next = null; - for (i = 0; i < nb_el; i++) { - if (this.lst.children[i].children[0].innerHTML > elem.children[0].innerHTML) { - this.lst.insertBefore(elem, this.lst.children[i]); - return ; + for (i in this.contacts) { + if (this.contacts.hasOwnProperty(i)) { + if (elem.name < this.contacts[i].name && (next === null || this.contacts[i].name < next.name)) { + next = this.contacts[i]; + } } } - this.lst.appendChild(elem); + + if (next !== null) { + this.lst.insertBefore(elem.li, next.li); + } else { + this.lst.appendChild(elem.li); + } }; +ContactList.prototype.getContactPic = function(elem, infos) { + var xhr = new XMLHttpRequest(); + + xhr.open("GET", "http://www.epitech.eu/intra/photos/" + infos.name + ".jpg", true); + xhr.responseType = "blob"; + xhr.onload = (function(el) { + return function(e) { + if (e.target.status === 200) { + infos.avatar = window.webkitURL.createObjectURL(this.response); + } else { + infos.avatar= "img/default-avatar.jpg"; + } + + elem.style.backgroundImage = "url('" + infos.avatar + "')"; + }; + })(this); + xhr.send(); +} + ContactList.prototype.addContact = function(name) { - var li = null, login = null, close = null; + var infos = {}, li = null, login = null, close = null; if (typeof this.contacts[name] === "undefined") { + infos = { + "name": name, + "li": null, + "avatar": null + }; + li = document.createElement("li"); + this.getContactPic(li, infos); login = document.createElement("span"); close = document.createElement("span"); close.classList.add("remove"); @@ -55,20 +87,19 @@ ContactList.prototype.addContact = function(name) { elem.rmContact(name); }; })(this)); - this.contacts[name] = li; + + infos.li = li; + this.contacts[name] = infos; this.save(); - this.insertContact(li); + this.insertContact(infos); } }; ContactList.prototype.rmContact = function(name) { - for (var i = this.lst.children.length - 1; i >= 0; --i) { - if (this.lst.children[i].children[0].innerHTML === name) { - this.lst.removeChild(this.lst.children[i]); - delete this.contacts[name]; - this.save(); - break ; - } + if (typeof this.contacts[name] !== "undefined") { + this.lst.removeChild(this.contacts[name].li); + delete this.contacts[name]; + this.save(); } }; diff --git a/lib/ns_client.js b/lib/ns_client.js index 1ff216a..7f11d05 100644 --- a/lib/ns_client.js +++ b/lib/ns_client.js @@ -57,22 +57,31 @@ var NsClient = function() { })(this); }; +NsClient.prototype.replacePairs = function(str, pairs) { + for (var i in pairs) { + if (pairs.hasOwnProperty(i)) { + str = str.replace(pairs[i], i); + } + } + return str; +} + NsClient.prototype.msgDecode = function(msg) { - msg = unescape(msg) - msg = msg.replace('@', '@'); - msg = msg.replace('*', '*'); - msg = msg.replace('/', '/'); - msg = msg.replace('+', '+'); - return msg; + return this.replacePairs(unescape(msg), { + "@": /%40/g, + "*": /%2A/g, + "/": /%2F/g, + "+": /%2B/g + }); }; NsClient.prototype.msgEncode = function(msg) { - msg = escape(msg) - msg = msg.replace('@', '@'); - msg = msg.replace('*', '*'); - msg = msg.replace('/', '/'); - msg = msg.replace('+', '+'); - return msg; + return this.replacePairs(escape(msg), { + "%40": /@/g, + "%2A": /\*/g, + "%2F": /\//g, + "%2B": /\+/g, + }); }; NsClient.prototype.connect = function() { diff --git a/lib/nsui.js b/lib/nsui.js index 7512825..729c0e5 100644 --- a/lib/nsui.js +++ b/lib/nsui.js @@ -39,13 +39,10 @@ Nsui.prototype.deleteTab = function(tab) { if (new_tab !== null) { new_tab.show(); - } else { - document.getElementById("configuration").style.display = "block"; } }; Nsui.prototype.hideAllTabs = function() { - document.getElementById("configuration").style.display = "none"; for (i = this.tab_lst.length - 1; i >= 0; --i) { this.tab_lst[i].hide(); } @@ -86,7 +83,9 @@ Nsui.prototype.addNewTab = function(tab_name) { if (tab === null) { tab = this.createTab(tab_name); } - if (!tab.isCurrent()) { + if (this.tab_lst.length <= 1) { + tab.show(); + } else if (!tab.isCurrent()) { tab.setActive(); } @@ -98,7 +97,7 @@ Nsui.prototype.addContentToTab = function(tab_name, content) { if ($cs.opts.get("enable_msg")) { tab = this.addNewTab(tab_name); - tab.appendText(this.formatMessage(content)); + tab.appendMessage(content); } }; @@ -122,23 +121,40 @@ Nsui.prototype.formatMessage = function(msg) { fmt += '' + document.getElementById('login').value + ': '; } - msg.message = msg.message.replace("<", "<"); - msg.message = msg.message.replace(">", ">"); - fmt += msg.message; - - fmt += '
      '; + fmt += this.sanitizeText(msg.message); + fmt += "
      "; return fmt; }; +Nsui.prototype.sanitizeText = function(str) { + return str.replace(/&/g, '&').replace(//g, '>'); +}; + +Nsui.prototype.showContent = function(part_id) { + var i, ctn_lst = ["config-pannel", "chat-pannel", "pre-conf-pannel"]; + + for (i = ctn_lst.length - 1; i>= 0; --i) { + if (ctn_lst[i] === part_id) { + document.getElementById(ctn_lst[i]).style.display = "block"; + } else { + document.getElementById(ctn_lst[i]).style.display = "none"; + } + } +}; + +Nsui.prototype.switchContent = function(part_id, part_id_to) { + if (document.getElementById(part_id).style.display !== "block") { + this.showContent(part_id); + } else { + this.showContent(part_id_to); + } +} + Nsui.prototype.init = function() { - document.getElementById("tab-config").addEventListener("click", (function(elem) { + document.getElementById("settings-btn").addEventListener("click", (function(elem) { return function() { - for (var i = elem.tab_lst.length - 1; i >= 0; --i) { - elem.tab_lst[i].hide(); - } - this.classList.add("tab-current"); - document.getElementById("configuration").style.display = "block"; + elem.switchContent("config-pannel", "chat-pannel"); }; })(this), false); @@ -153,4 +169,11 @@ Nsui.prototype.init = function() { elem.hideAllTabs(); }; })(this); + + this.showContent("chat-pannel"); + setTimeout(function() { + if ($cs.opts.get("login") === null || $cs.opts.get("pwd_socks") === null) { + $cs.ui.showContent("pre-conf-pannel"); + } + }, 600); }; diff --git a/lib/tab.nsui.js b/lib/tab.nsui.js index 3f6b47d..9120742 100644 --- a/lib/tab.nsui.js +++ b/lib/tab.nsui.js @@ -19,27 +19,19 @@ var Tab = function(name) { this.chat_input = null; this.wr_lst = document.getElementById("tab-lst"); this.wr_body = document.getElementById("tab-body-wrapper"); + this.buff_len = 1000; + this.history_index = 0; + this.history = []; this.initListElement(); this.initBodyElement(); }; Tab.prototype.filterName = function(name) { - // TODO: enforce an id compliant name - return name; + return name.replace(/[^a-z0-9\-_]/g, "").replace(/^[0-9]/g, "_"); }; Tab.prototype.initListElement = function() { - var inner = document.createElement("span"), - evt_click = function(elem) { - return function() { - elem.show(); - }; - }, - evt_dblclick = function(elem) { - return function() { - elem.close(); - }; - }; + var inner = document.createElement("span"); inner.innerHTML = this.name; this.el_lst = document.createElement("li"); @@ -73,7 +65,9 @@ Tab.prototype.initBodyElement = function() { this.chat_input.setAttribute("type", "text"); this.chat_input.addEventListener("keyup", (function(elem) { return function(event) { - if (event.keyCode == 13 && this.value != "") { + var key_submit = 13, key_up = 38, key_down = 40; + + if (event.keyCode === key_submit && this.value != "") { var msg = this.value; this.value = ""; @@ -83,6 +77,20 @@ Tab.prototype.initBodyElement = function() { } else { console.error("chromesoul client not found"); } + } else if (event.keyCode === key_up) { + if (elem.history_index < elem.history.length) { + elem.history_index++; + this.value = elem.history[elem.history.length - elem.history_index]; + } + } else if (event.keyCode === key_down) { + if (elem.history_index > 0) { + elem.history_index--; + if (elem.history_index > 0) { + this.value = elem.history[elem.history.length - elem.history_index]; + } else { + this.value = ""; + } + } } }; })(this), false); @@ -128,13 +136,22 @@ Tab.prototype.setActive = function() { Tab.prototype.flushText = function() { var str = this.chat_log.innerHTML, sep = "
      ", t = str.split(sep); - if (t.length > 1000) { + if (t.length > this.buff_len + 1) { this.chat_log.innerHTML = str.substring(str.indexOf(sep) + sep.length); } + while (this.history.length > this.buff_len) { + this.history.shift(); + } }; -Tab.prototype.appendText = function(text) { +Tab.prototype.appendMessage = function(msg) { + this.history_index = 0; + this.chat_log.innerHTML += $cs.ui.formatMessage(msg); + + if (!(typeof msg.login !== "undefined" && msg.login !== null)) { + this.history.push(msg.message); + } + this.flushText(); - this.chat_log.innerHTML += text; - this.chat_log.scrollTop = 42000; + this.chat_log.scrollTop = 42 * this.buff_len; }; diff --git a/manifest.json b/manifest.json index 42c3107..52a275d 100644 --- a/manifest.json +++ b/manifest.json @@ -1,6 +1,6 @@ { "name": "chromesoul", - "version": "0.3.4", + "version": "0.4.2", "minimum_chrome_version": "24", "manifest_version": 2, "offline_enabled": false, @@ -11,6 +11,7 @@ } }, "permissions": [ + "http://www.epitech.eu/intra/photos/", "background", "storage", {"socket": ["tcp-connect:ns-server.epita.fr:4242"]}