Browse Source

- Merge with edhelas

pull/16/head
Jaussoin Timothée 11 years ago
parent
commit
ecc5fc49a6
  1. 2
      app/models/contact/Contact.php
  2. 29
      app/widgets/About/about.tpl
  3. 15
      app/widgets/Avatar/Avatar.php
  4. 78
      app/widgets/Avatar/_avatar_form.tpl
  5. 52
      app/widgets/Avatar/avatar.css
  6. 92
      app/widgets/Avatar/avatar.js
  7. 2
      app/widgets/Avatar/locales.ini
  8. 30
      app/widgets/Contact/_contact_explore.tpl
  9. 4
      app/widgets/Contact/locales.ini
  10. 19
      app/widgets/Notifs/Notifs.php
  11. 27
      app/widgets/Notifs/_notifs_confirm.tpl
  12. 11
      app/widgets/Notifs/_notifs_from.tpl
  13. 1
      app/widgets/Notifs/locales.ini
  14. 4
      composer.json
  15. 1
      locales/locales.ini
  16. 1
      system/Utils.php
  17. 18
      themes/material/css/block.css
  18. 5
      themes/material/css/form.css
  19. 4
      themes/material/css/list.css
  20. 1
      themes/material/css/style.css

2
app/models/contact/Contact.php

@ -10,7 +10,7 @@ class Contact extends Model {
protected $date;
protected $url;
protected $email;
public $email;
protected $adrlocality;
protected $adrpostalcode;

29
app/widgets/About/about.tpl

@ -11,8 +11,8 @@
<span class="icon bubble color red"><i class="md md-developer-mode"></i></span>
<span>{$c->__('title.developers')}</span>
<p>
<a href="http://edhelas.movim.eu/">Jaussoin Timothée aka edhelas</a></br>
<a href="https://launchpad.net/~nodpounod">Ho Christine aka nodpounod</a></br>
<a href="http://edhelas.movim.eu/">Jaussoin Timothée aka edhelas</a><br/>
<a href="https://launchpad.net/~nodpounod">Ho Christine aka nodpounod</a><br/>
<a href="https://etenil.net/">Pasquet Guillaume aka Etenil</a>
</p>
</li>
@ -20,36 +20,37 @@
<span class="icon bubble color purple"><i class="md md-flag"></i></span>
<span>{$c->__('title.translators')}</span>
<p>
Thanks to all the translators https://translations.launchpad.net/movim
Thanks to all the translators <a href="https://translations.launchpad.net/movim">translations.launchpad.net/movim</a>
</p>
</li>
<li class="subheader">{$c->__('title.software')}</li>
<li class="condensed">
<span class="icon bubble color orange"><i class="md md-archive"></i></span>
<p>
Modl - Movim DB Layer - <a href="https://github.com/edhelas/modl">GitHub Modl</a> under AGPLv3</br>
Moxl - Movim XMPP Library - <a href="https://github.com/edhelas/moxl">GitHub Moxl</a> under AGPLv3</br>
<p class="all">
Modl - Movim DB Layer - <a href="https://github.com/edhelas/modl">GitHub Modl</a> under AGPLv3<br/>
Moxl - Movim XMPP Library - <a href="https://github.com/edhelas/moxl">GitHub Moxl</a> under AGPLv3<br/>
Map Library - Leaflet <a href="http://leafletjs.com/">leafletjs.com</a> under BSD</br>
Markdown - Michel Fortin <a href="http://michelf.ca/projects/php-markdown/">michelf.ca</a> ©Michel Fortin
</dl>
Map Library - Leaflet <a href="http://leafletjs.com/">leafletjs.com</a> under BSD<br/>
Markdown - Michel Fortin <a href="http://michelf.ca/projects/php-markdown/">michelf.ca</a> ©Michel Fortin<br/>
Template Engine - RainTPL - Federico Ulfo <a href="http://www.raintpl.com/">www.raintpl.com</a> under MIT<br/>
Embed - Oscar Otero <a href="https://github.com/oscarotero/Embed">GitHub Embed</a> under MIT<br/><br />
WebSocket and Daemon engine - ReactPHP - <a href="http://socketo.me/">socketo.me</a> ©Chris Boden<br/>
</p>
</li>
<li class="condensed">
<span class="icon bubble color brown"><i class="md md-insert-emoticon"></i></span>
<span>{$c->__('title.resources')}</span>
<p>
FontAwesome <a href="http://fortawesome.github.io/">by Dave Gandy</a> under CC BY 3.0</br>
Boyan Kostov <a href="http://boyankostov.com/">boyankostov.com</a> <a href="https://www.iconfinder.com/iconsets/flatified">Free for commercial use</a>
Material Design Iconic Font <a href="http://zavoloklom.github.io/material-design-iconic-font/icons.html">by Google and Sergey Kupletsky</a> under SIL OFL 1.1<br/>
</p>
</li>
<li class="condensed">
<span class="icon bubble color indigo"><i class="md md-import-export"></i></span>
<span>{$c->__('title.api')}</span>
<p>
OpenStreetMap - Nominatim <a href="http://nominatim.openstreetmap.org/">nominatim.openstreetmap.org</a></br>
Last.fm API - <a href="http://www.last.fm/api">www.last.fm/api</a></br>
Youtube API - <a href="http://developers.google.com/youtube">developers.google.com/youtube</a></br>
OpenStreetMap - Nominatim <a href="http://nominatim.openstreetmap.org/">nominatim.openstreetmap.org</a><br/>
Last.fm API - <a href="http://www.last.fm/api">www.last.fm/api</a><br/>
Youtube API - <a href="http://developers.google.com/youtube">developers.google.com/youtube</a><br/>
</p>
</li>
</ul>

15
app/widgets/Avatar/Avatar.php

@ -17,6 +17,7 @@
use Moxl\Xec\Action\Avatar\Get;
use Moxl\Xec\Action\Avatar\Set;
use forxer\Gravatar\Gravatar;
class Avatar extends WidgetBase
{
@ -61,9 +62,19 @@ class Avatar extends WidgetBase
$avatarform->assign('photobin', $p->toBase());
$avatarform->assign('me', $me);
if(isset($me->email)) {
$result = requestURL(Gravatar::profile($me->email, 'json'), 3);
$obj = json_decode($result);
if($obj != 'User not found') {
$avatarform->assign('gravatar_bin', base64_encode(requestURL('http://www.gravatar.com/avatar/'.$obj->entry[0]->hash.'?s=250')));
$avatarform->assign('gravatar', $obj);
}
}
$avatarform->assign(
'submit',
$this->call('ajaxAvatarSubmit', "movim_form_to_json('avatarform')")
$this->call('ajaxSubmit', "movim_form_to_json('avatarform')")
);
return $avatarform->draw('_avatar_form', true);
@ -77,7 +88,7 @@ class Avatar extends WidgetBase
->request();
}
function ajaxAvatarSubmit($avatar)
function ajaxSubmit($avatar)
{
$p = new \Picture;
$p->fromBase((string)$avatar->photobin->value);

78
app/widgets/Avatar/_avatar_form.tpl

@ -1,11 +1,59 @@
<form name="avatarform" id="avatarform" class="flex">
<h3 class="block large">{$c->__('page.avatar')}</h3>
<br />
<h3 class="block large">{$c->__('page.avatar')}</h3>
<div class="flex">
<div id="preview" class="block">
<div>
<form name="avatarform" id="avatarform">
<img src="data:image/jpeg;base64,{$photobin}">
<input type="hidden" name="photobin" value="{$photobin}"/>
</form>
</div>
</div>
<div class="block">
<ul class="thick divided">
<li class="condensed">
<span class="icon bubble color green">
<i class="md md-attach-file"></i>
</span>
<span>{$c->__('avatar.file')}</span>
<p><input type="file" onchange="Avatar.file(this.files);"></p>
</li>
{if="$gravatar != null"}
<li class="condensed action">
<div class="action">
<a
onclick="Avatar.preview('data:image/jpeg;base64,{$gravatar_bin}')"
class="button flat">
{$c->__('avatar.use_it')}
</a>
</div>
<span class="icon bubble color blue">
<img src="http://www.gravatar.com/avatar/{$gravatar->entry[0]->hash}?s=50" />
</span>
<span>Gravatar</span>
<p>We found a Gravatar picture</p>
</li>
{/if}
</ul>
</div>
</div>
<!--
<div class="block">
<input type="file" onchange="vCardImageLoad(this.files);">
<label for="avatar">{$c->__('page.avatar')}</label>
<input type="hidden" name="photobin" value="{$photobin}"/>
</div>
{if="$gravatar != null"}
<div class="block">
<h4>Gravatar</h4>
{$gravatar->entry[0]|var_dump}
<img src="http://www.gravatar.com/avatar/{$gravatar->entry[0]->hash}?s=500" />
</div>
{/if}
<div class="block" id="result">
<img id="vCardPhotoPreview" src="data:image/jpeg;base64,{$photobin}">
<span id="picturesize" class="clean"></span>
@ -30,17 +78,17 @@
{$c->__('avatar.snapshot')}
</a>
<label for="url">{$c->__('avatar.webcam')}</label>
</div>
</div>-->
<div class="block large">
<a
onclick="
{$submit}
movim_button_save('#avatarvalidate');
this.value = '{$c->__('button.submitting')}';
this.className='button inactive oppose';"
class="button color oppose"
id="avatarvalidate"
>{$c->__('button.submit')}</a>
</div>
<div class="block large">
<a
onclick="
{$submit}
movim_button_save('#avatarvalidate');
this.value = '{$c->__('button.submitting')}';
this.className='button inactive oppose';"
class="button color oppose"
id="avatarvalidate"
>{$c->__('button.submit')}</a>
</div>
</form>

52
app/widgets/Avatar/avatar.css

@ -1,4 +1,52 @@
#avatar form {
#avatar_form div#preview {
flex: 1 1 20%;
text-align: center;
padding-top: 2rem;
}
#avatar_form input[type=file] {
max-width: 200px;
}
#avatar_form div#preview > div,
#avatar_form div#preview img {
max-width: 250px;
border-radius: 0.25rem;
margin: 0 auto;
}
/*
#avatar_form div.flex div:first-child {
flex: 1 1 25%;
background-color: #333;
display: block;
height: 25rem;
}
#avatar_form div.flex div:nth-child(2) {
padding-left: 2rem;
}
#avatar_form div.flex div#preview div {
display: table;
width: 100%;
}
#avatar_form div.flex div:first-child form {
display: table-cell;
text-align: center;
vertical-align: middle;
}
#avatar_form div.flex div:first-child div form img {
max-width: 300px;
}
#avatar_form input[type=file] {
max-width: 200px;
}*/
/*#avatar form {
margin-top: 2rem;
}
@ -53,7 +101,7 @@
font-size: 1.5rem;
margin-left: -3rem;
}
*/
/*
.squares, #snap{
height:200px;

92
app/widgets/Avatar/avatar.js

@ -1,58 +1,48 @@
function vCardImageResize(img) {
var canvas = document.createElement('canvas');
canvas.width = canvas.height = 210;
var width = canvas.width;
var height = canvas.height;
if (img.width == img.height) {
canvas.getContext("2d").drawImage(img, 0, 0, width, height);
} else {
minVal = Math.min(img.width, img.height);
if (img.width > img.height) {
canvas.getContext("2d").drawImage(img, (img.width - minVal) / 2, 0, minVal, minVal, 0, 0, width, height);
var Avatar = {
file : function(files) {
var f = files[0];
if (!f.type.match(/image.*/)) {
console.log("Not a picture !");
} else {
canvas.getContext("2d").drawImage(img, 0, (img.height - minVal) / 2, minVal, minVal, 0, 0, width, height);
var reader = new FileReader();
reader.readAsDataURL(f);
reader.onload = function (ev) {
var img = new Image();
img.src = ev.target.result;
Avatar.preview(img.src);
};
};
},
preview : function(src) {
var canvas = document.createElement('canvas');
width = height = canvas.width = canvas.height = 210;
var image = new Image();
image.src = src;
image.onload = function(){
if (image.width == image.height) {
canvas.getContext("2d").drawImage(image, 0, 0, width, height);
} else {
minVal = parseInt(Math.min(image.width, image.height));
if (image.width > image.height) {
canvas.getContext("2d").drawImage(image, (parseInt(image.width) - minVal) / 2, 0, minVal, minVal, 0, 0, width, height);
} else {
canvas.getContext("2d").drawImage(image, 0, (parseInt(image.height) - minVal) / 2, minVal, minVal, 0, 0, width, height);
}
}
var base64 = canvas.toDataURL('image/jpeg', 0.9);
var preview = document.querySelector('form[name=avatarform] img');
var input = document.querySelector('input[name="photobin"]');
preview.src = base64;
var bin = base64.split(",");
input.value = bin[1];
}
}
}
canvas.style.width = 200;
canvas.style.height = 200;
var base64 = canvas.toDataURL('image/jpeg', 0.9);
var bin = base64.split(",");
document.querySelector('#vCardPhotoPreview').src = base64;
//document.querySelector('input[name="phototype"]').value = 'image/jpeg';
document.querySelector('input[name="photobin"]').value = bin[1];
function bytesToSize(bytes) {
var sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];
if (bytes == 0) return 'n/a';
var i = parseInt(Math.floor(Math.log(bytes) / Math.log(1024)));
return (bytes / Math.pow(1024, i)).toFixed(1) + ' ' + sizes[i];
};
document.getElementById("picturesize").innerHTML = bytesToSize(encodeURI(base64).split(/%..|./).length - 1);
};
function vCardImageLoad(files) {
var f = files[0];
if (!f.type.match(/image.*/)) {
console.log("Not a picture !");
} else {
var reader = new FileReader();
reader.readAsDataURL(f);
reader.onload = function ( ev ) {
var img = new Image();
img.src = ev.target.result;
img.onload = function() {
vCardImageResize(this);
};
};
};
};
function showVideo(){
navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia;

2
app/widgets/Avatar/locales.ini

@ -1,3 +1,5 @@
avatar.file = 'File'
avatar.use_it = 'Use it'
avatar.webcam = 'Webcam'
avatar.cheese = 'Cheese !'
avatar.snapshot = 'Take a webcam snapshot'

30
app/widgets/Contact/_contact_explore.tpl

@ -1,23 +1,31 @@
<h2 class="padded">{$c->__('last_registered')}</h2>
<br />
<h2>{$c->__('explore')}</h2>
<ul class="active">
<ul class="flex card active thick">
{loop="$users"}
<li class="condensed" onclick="Contact_ajaxGetContact('{$value->jid}');">
<span class="icon bubble"><img class="avatar" src="{$value->getPhoto('m')}"/></span>
<li class="{if="$value->description != ''"}condensed{/if} block" style="background-image: url();" onclick="Contact_ajaxGetContact('{$value->jid}');">
<span class="icon bubble">
<img src="{$value->getPhoto('m')}"/>
</span>
<span>{$value->getTrueName()}</span>
<p>
{if="$value->getAge()"}
<span class="tag blue on_desktop">{$value->getAge()}</span>
<span class="info">{$c->__('age.years', $value->getAge())}</span>
{/if}
{if="$value->getGender()"}
<span class="tag green on_desktop">{$value->getGender()}</span>
<span class="info">{$value->getGender()}</span>
{/if}
<!--
{if="$value->getMarital()"}
<span class="tag yellow on_desktop">{$value->getMarital()}</span>
<span class="info">{$value->getMarital()}</span>
{/if}
-->
{if="$value->description != ''"}
<p>
{$value->description|strip_tags}
</p>
{/if}
<br/>
<span class="desc on_desktop">{$value->description|strip_tags}</span>
</p>
</li>
{/loop}
</ul>

4
app/widgets/Contact/locales.ini

@ -31,6 +31,7 @@ client.title = 'Client Informations'
[explore]
last_registered = 'Last registered'
explore = 'Find some new friends'
[edit]
edit.title = 'Edit'
@ -41,3 +42,6 @@ edit.updated = 'Contact updated'
[delete]
delete.title = 'Are you sure?'
delete.text = 'You are going to delete one of your contacts, please confirm your action'
[age]
age.years = '%s years'

19
app/widgets/Notifs/Notifs.php

@ -66,7 +66,15 @@ class Notifs extends WidgetCommon
return $nft->draw('_notifs_from', true);
}
function ajaxAccept($jid) {
function ajaxAsk($jid)
{
$view = $this->tpl();
$view->assign('jid', $jid);
Dialog::fill($view->draw('_notifs_confirm', true));
}
function ajaxAccept($jid)
{
$jid = echapJid($jid);
$r = new AddItem;
@ -90,7 +98,8 @@ class Notifs extends WidgetCommon
Cache::c('activenotifs', $notifs);
}
function ajaxRefuse($jid) {
function ajaxRefuse($jid)
{
$jid = echapJid($jid);
$p = new Unsubscribed;
@ -107,11 +116,13 @@ class Notifs extends WidgetCommon
$this->onNotifs();
}
function genCallAccept($jid) {
function genCallAccept($jid)
{
return $this->call('ajaxAccept', "'".$jid."'");
}
function genCallRefuse($jid) {
function genCallRefuse($jid)
{
return $this->call('ajaxRefuse', "'".$jid."'");
}
}

27
app/widgets/Notifs/_notifs_confirm.tpl

@ -0,0 +1,27 @@
<section>
<h3>{$c->__('notifs.manage')}</h3>
<br />
<h4 class="gray">{$c->__('wants_to_talk', $jid)}</h4>
<ul class="active">
<li onclick="Notifs_ajaxAccept('$jid')">
<span class="icon green">
<i class="md md-person-add"></i>
</span>
{$c->__('button.accept')}
</li>
<li onclick="Notifs_ajaxRefuse('$jid')">
<span class="icon red">
<i class="md md-close"></i>
</span>
{$c->__('button.refuse')}
</li>
</ul>
</section>
<div>
<a onclick="Dialog.clear()" class="button flat">
{$c->__('button.close')}
</a>
</div>

11
app/widgets/Notifs/_notifs_from.tpl

@ -1,11 +1,12 @@
<ul class="active">
<ul class="active thick all">
{if="$invitations"}
<li class="subheader">{$c->__('notifs.title')}</li>
{/if}
{loop="$invitations"}
{if="isset($value)"}
<li data-jid="{$value->jid}">
<div class="control">
<li data-jid="{$value->jid}" class="action">
<div class="action">
<!--
<a class="button flat red"
onclick="{$c->genCallRefuse($value->jid)}">
<i class="fa fa-times"></i>
@ -14,6 +15,10 @@
onclick="{$c->genCallAccept($value->jid)}">
{$c->__('button.add')}
</a>
-->
<a class="button flat" onclick="Notifs_ajaxAsk('{$value->jid}')">
{$c->__('notifs.manage')}
</a>
</div>
<span class="icon"><img src="{$value->getPhoto('xs')}"/></span>
<span href="{$c->route('friend', $value->jid)}">

1
app/widgets/Notifs/locales.ini

@ -1,2 +1,3 @@
notifs.title = 'Pending Invitations'
wants_to_talk = '%s wants to talk with you'
notifs.manage = 'Manage'

4
composer.json

@ -17,9 +17,9 @@
"embed/embed": "dev-master",
"cboden/ratchet": "0.3.*",
"devristo/phpws": "dev-master",
"react/child-process": "0.5.*@dev",
"ratchet/pawl": "dev-master",
"react/socket-client": "0.4.*@dev"
"forxer/Gravatar": "~1.2"
}
}

1
locales/locales.ini

@ -83,6 +83,7 @@ button.no = 'No'
button.edit = 'Edit'
button.return = 'Return'
button.accept = 'Accept'
button.refuse = 'Refuse'
[step]
step.step = 'Step %s'

1
system/Utils.php

@ -573,6 +573,7 @@ function requestURL($url, $timeout = 10, $post = false) {
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:31.0) Gecko/20100101 Firefox/31.0');
if(is_array($post)) {
$params = '';

18
themes/material/css/block.css

@ -11,8 +11,26 @@
flex: 1 100%;
}
.flex.card {
padding: 0;
}
.flex.card .block {
margin: 1rem;
flex: 1 calc(50% - 2rem);
min-height: 12rem;
padding-top: 1.5rem;
padding-bottom: 1.5rem;
}
.flex.card .block:not(.condensed) {
padding-top: 3rem;
}
@media screen and (max-width: 1024px) {
.flex.card .block,
.flex .block {
margin-bottom: 0;
flex: 1 100%;
}
}

5
themes/material/css/form.css

@ -282,6 +282,11 @@ input[type=button].flat:focus {
font-size: 3rem;
}
li.action div.action .button {
margin: 0.5rem;
display: block;
}
@media screen and (min-width: 1024px) {
main > section > div:first-child:nth-last-child(2) .button.action {
right: calc(75% + 3rem);

4
themes/material/css/list.css

@ -95,6 +95,10 @@ ul li > p {
line-height: 2.5rem;
}
ul li > p.all {
max-height: 100%;
}
ul li p.wrap {
white-space: nowrap;
}

1
themes/material/css/style.css

@ -567,6 +567,7 @@ main ul li .control > i {
}
.card > * {
background-color: white;
border-radius: 2px;
border: 1px solid rgba(0, 0, 0, 0.12);
}

Loading…
Cancel
Save