From db4df87be19da4c45fa4c5ca91f11042996ac23d Mon Sep 17 00:00:00 2001 From: Felix Niklas Date: Thu, 18 Sep 2014 12:40:17 +0200 Subject: [PATCH] add unique avatar support --- app/assets/images/avatar-bg.png | Bin 0 -> 25852 bytes .../app/controllers/layout_ref.js.coffee | 18 ++ .../app/lib/base/seedrandom.min.js | 1 + .../app/views/layout_ref/content.jst.eco | 28 +++ app/assets/stylesheets/zzz.css.erb | 162 ++++++++++-------- 5 files changed, 139 insertions(+), 70 deletions(-) create mode 100644 app/assets/images/avatar-bg.png create mode 100644 app/assets/javascripts/app/lib/base/seedrandom.min.js diff --git a/app/assets/images/avatar-bg.png b/app/assets/images/avatar-bg.png new file mode 100644 index 0000000000000000000000000000000000000000..1a42bffd76dd69939a87d875a6b5e96639b07f30 GIT binary patch literal 25852 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 + width = 300 + height = 226 + + holder.addClass 'unique' + + rng = new Math.seedrandom(id); + x = rng() * (width - size) + y = rng() * (height - size) + holder.css('background-position', "-#{ x }px -#{ y }px") + + holder.text(firstname[0] + lastname[0]) + render: -> @html App.view('layout_ref/content')() diff --git a/app/assets/javascripts/app/lib/base/seedrandom.min.js b/app/assets/javascripts/app/lib/base/seedrandom.min.js new file mode 100644 index 000000000..c1f5c2341 --- /dev/null +++ b/app/assets/javascripts/app/lib/base/seedrandom.min.js @@ -0,0 +1 @@ +!function(a,b,c,d,e,f,g,h,i){function j(a){var b,c=a.length,e=this,f=0,g=e.i=e.j=0,h=e.S=[];for(c||(a=[c++]);d>f;)h[f]=f++;for(f=0;d>f;f++)h[f]=h[g=r&g+a[f%c]+(b=h[f])],h[g]=b;(e.g=function(a){for(var b,c=0,f=e.i,g=e.j,h=e.S;a--;)b=h[f=r&f+1],c=c*d+h[r&(h[f]=h[g=r&g+b])+(h[g]=b)];return e.i=f,e.j=g,c})(d)}function k(a,b){var c,d=[],e=typeof a;if(b&&"object"==e)for(c in a)try{d.push(k(a[c],b-1))}catch(f){}return d.length?d:"string"==e?a:a+"\0"}function l(a,b){for(var c,d=a+"",e=0;ea;)a=(a+c)*d,b*=d,c=s.g(1);for(;a>=q;)a/=2,b/=2,c>>>=1;return(a+c)/b},r,"global"in f?f.global:this==c)};l(c[i](),b),g&&g.exports?g.exports=s:h&&h.amd&&h(function(){return s})}(this,[],Math,256,6,52,"object"==typeof module&&module,"function"==typeof define&&define,"random"); \ No newline at end of file diff --git a/app/assets/javascripts/app/views/layout_ref/content.jst.eco b/app/assets/javascripts/app/views/layout_ref/content.jst.eco index cb60df4dc..757be48d7 100644 --- a/app/assets/javascripts/app/views/layout_ref/content.jst.eco +++ b/app/assets/javascripts/app/views/layout_ref/content.jst.eco @@ -14,6 +14,34 @@


+

Avatars

+ +

+ Users and customers might not have a profile images because: +

+
    +
  1. They didn't upload one +
  2. They didn't login using a authentication provider like facebook, twitter or google where we get an avatar +
  3. They have no avatar associated with their email address (gravatar) +
+

+ They will get a random avatar consisting of a blured version of the Zammad logo and their initials. +

+

+ The background is generated by using a random numbers generator (RNG) with the user-id as the seed. The RNG is then used to create the x and y position of the background. Since the user-id is unique and does not change it's guaranteed that the avatar background stays the same and this makes it possible to calculate the avatar on the client without having to store the coordinates on the server side. +

+ + + + + + + + + + +
+

Headlines

h1. Bootstrap heading

h2. Bootstrap heading

diff --git a/app/assets/stylesheets/zzz.css.erb b/app/assets/stylesheets/zzz.css.erb index cab56d4ce..9880e9642 100644 --- a/app/assets/stylesheets/zzz.css.erb +++ b/app/assets/stylesheets/zzz.css.erb @@ -7,8 +7,6 @@ body { ol, ul { - list-style: none; - padding: 0; } a.create { @@ -595,6 +593,7 @@ ol.tabs li { } .tabs { + padding: 0; margin-bottom: 20px; color: #b8b8b8; border: 1px solid rgba(0,8,14,.08); @@ -1864,6 +1863,23 @@ footer { height: 50px; } + .unique.avatar { + background-image: url(<%= asset_path "avatar-bg.png" %>); + background-size: auto; + color: white; + line-height: 42px; + text-align: center; + font-size: 13px; + letter-spacing: 1px; + text-transform: uppercase; + text-shadow: 0 1px rgba(0,0,0,.2); + } + + .unique.big.avatar { + font-size: 16px; + line-height: 52px; + } + .sidebar { width: 32%; max-width: 300px; @@ -3174,77 +3190,83 @@ footer { box-shadow: none; } -.recipientList-entry .recipientList-iconSpacer { - width: 20px; - margin-left: -5px; -} - -.recipientList-entry .icon:not(.plus) { - opacity: 0.2; -} - -.recipientList-entry:hover .icon { - opacity: 1; -} - -.recipientList-name { - margin-left: 10px; - margin-top: 2px; -} - -.recipientList-detail { - opacity: 0.5; -} - -.recipientList-icon.plus { - margin-left: 13px; -} - -.recipientList-new { - background: hsl(145,51%,45%); -} - -.dropdown .recipientList-new:hover { - background: hsl(147,52%,43%); -} - -li.recipientList-controls, -li.recipientList-controls:hover { - padding: 0; - background: hsl(206,7%,28%); -} - -.recipientList-backClickArea { - height: 100%; - float: left; - padding: 0 10px; -} - -.recipientList-backButton { - padding: 5px 10px; - font-size: 12px; - color: white; - border-radius: 3px; - border: 1px solid hsl(234,10%,10%); - box-shadow: 0 1px rgba(255,255,255,.03) inset; -} - -.recipientList-backClickArea:active .recipientList-backButton { - background: hsl(206,7%,25%); - box-shadow: 0 1px rgba(0,0,0,.1) inset; -} - -.recipientList-backButton .icon { - margin-bottom: -2px; -} - +.recipientList, .recipientList-organisationMembers { - position: absolute; - top: 0; - left: 0; - right: 0; + list-style: none; + padding: 0; } + .recipientList-entry .recipientList-iconSpacer { + width: 20px; + margin-left: -5px; + } + + .recipientList-entry .icon:not(.plus) { + opacity: 0.2; + } + + .recipientList-entry:hover .icon { + opacity: 1; + } + + .recipientList-name { + margin-left: 10px; + margin-top: 2px; + } + + .recipientList-detail { + opacity: 0.5; + } + + .recipientList-icon.plus { + margin-left: 13px; + } + + .recipientList-new { + background: hsl(145,51%,45%); + } + + .dropdown .recipientList-new:hover { + background: hsl(147,52%,43%); + } + + li.recipientList-controls, + li.recipientList-controls:hover { + padding: 0; + background: hsl(206,7%,28%); + } + + .recipientList-backClickArea { + height: 100%; + float: left; + padding: 0 10px; + } + + .recipientList-backButton { + padding: 5px 10px; + font-size: 12px; + color: white; + border-radius: 3px; + border: 1px solid hsl(234,10%,10%); + box-shadow: 0 1px rgba(255,255,255,.03) inset; + } + + .recipientList-backClickArea:active .recipientList-backButton { + background: hsl(206,7%,25%); + box-shadow: 0 1px rgba(0,0,0,.1) inset; + } + + .recipientList-backButton .icon { + margin-bottom: -2px; + } + + .recipientList-organisationMembers { + position: absolute; + top: 0; + left: 0; + right: 0; + } + /* ----------------