Browse Source

Move to a two columns design for blogs and communities public pages

Refactor and unify some views between the public and private widgets
pull/992/head
Timothée Jaussoin 5 years ago
parent
commit
29599b767d
  1. 2
      CHANGELOG.md
  2. 3
      app/views/blog.tpl
  3. 3
      app/views/node.tpl
  4. 3
      app/widgets/Blog/blog.tpl
  5. 8
      app/widgets/CommunityAffiliations/CommunityAffiliations.php
  6. 37
      app/widgets/CommunityAffiliations/_communityaffiliations.tpl
  7. 38
      app/widgets/CommunityAffiliations/_communityaffiliations_subscriptions_list.tpl
  8. 19
      app/widgets/CommunityData/CommunityData.php
  9. 50
      app/widgets/CommunityData/_communitydata.tpl
  10. 49
      app/widgets/CommunityData/_communitydata_card.tpl
  11. 37
      app/widgets/CommunityDataPublic/CommunityDataPublic.php
  12. 12
      app/widgets/CommunityDataPublic/communitydatapublic.tpl
  13. 18
      app/widgets/ContactData/ContactData.php
  14. 139
      app/widgets/ContactData/_contactdata.tpl
  15. 86
      app/widgets/ContactData/_contactdata_card.tpl
  16. 48
      app/widgets/ContactData/_contactdata_subscriptions.tpl
  17. 5
      app/widgets/ContactData/contactdata.css
  18. 34
      app/widgets/ContactDataPublic/ContactDataPublic.php
  19. 10
      app/widgets/ContactDataPublic/contactdatapublic.tpl

2
CHANGELOG.md

@ -18,6 +18,8 @@ v0.19.1 (trunk)
* Enforces pubsub#multi-items support to ensure a good Movim-XMPP server compatibiliy
* Redesign the avatar widget and integrate it in the Profile tab
* Move from OpenSans to Roboto for the default font
* Move to a two columns design for blogs and communities public pages
* Refactor and unify some views between the public and private widgets
v0.19
---------------------------

3
app/views/blog.tpl

@ -1,4 +1,7 @@
<main style="background-color: var(--movim-background);">
<aside>
<?php $this->widget('ContactDataPublic'); ?>
</aside>
<div>
<?php $this->widget('Blog');?>
<ul class="list">

3
app/views/node.tpl

@ -1,4 +1,7 @@
<main style="background-color: var(--movim-background);">
<aside>
<?php $this->widget('CommunityDataPublic'); ?>
</aside>
<div>
<?php $this->widget('Blog');?>
<ul class="list">

3
app/widgets/Blog/blog.tpl

@ -21,9 +21,6 @@
{$c->__('blog.title', $contact->truename)}
</a>
</p>
{if="$contact->description"}
<p>{$contact->description}</p>
{/if}
<p>
{$c->__('page.blog')}
</p>

8
app/widgets/CommunityAffiliations/CommunityAffiliations.php

@ -131,6 +131,14 @@ class CommunityAffiliations extends Base
return \App\Contact::firstOrNew(['id' => $jid]);
}
public function prepareSubscriptionsList($subscriptions)
{
$view = $this->tpl();
$view->assign('subscriptions', $subscriptions);
return $view->draw('_communityaffiliations_subscriptions_list');
}
public function ajaxGetAffiliations($origin, $node)
{
if (!$this->validateServerNode($origin, $node)) {

37
app/widgets/CommunityAffiliations/_communityaffiliations.tpl

@ -104,38 +104,7 @@
{/if}
{if="$subscriptions->isNotEmpty()"}
<ul class="list card active thin">
<li class="subheader">
<div>
<p>{$c->__('communityaffiliation.subscriptions')}</p>
</div>
</li>
{loop="$subscriptions"}
<li title="{$value->jid}"
onclick="MovimUtils.reload('{$c->route('contact', $value->jid)}')">
{if="$value->contact"}
{$url = $value->contact->getPhoto('m')}
{if="$url"}
<span class="primary icon bubble small"
style="background-image: url({$url});">
</span>
{else}
<span class="primary icon bubble small color {$value->jid|stringToColor}">
{$value->contact->truename|firstLetterCapitalize:true}
</span>
{/if}
<div>
<p class="normal">{$value->contact->truename}</p>
</div>
{else}
<span class="primary icon bubble small color {$value->jid|stringToColor}">
{$value->jid|firstLetterCapitalize:true}
</span>
<div>
<p class="normal">{$value->jid}</p>
</div>
{/if}
</li>
{/loop}
</ul>
{autoescape="off"}
{$c->prepareSubscriptionsList($subscriptions)}
{/autoescape}
{/if}

38
app/widgets/CommunityAffiliations/_communityaffiliations_subscriptions_list.tpl

@ -0,0 +1,38 @@
<ul class="list card active thin">
<li class="subheader">
<div>
<p>{$c->__('communityaffiliation.subscriptions')}</p>
</div>
</li>
{loop="$subscriptions"}
<a href="{$c->route('contact', $value->jid)}">
<li title="{$value->jid}">
<span class="control icon gray">
<i class="material-icons">chevron_right</i>
</span>
{if="$value->contact"}
{$url = $value->contact->getPhoto('m')}
{if="$url"}
<span class="primary icon bubble small"
style="background-image: url({$url});">
</span>
{else}
<span class="primary icon bubble small color {$value->jid|stringToColor}">
{$value->contact->truename|firstLetterCapitalize:true}
</span>
{/if}
<div>
<p class="normal">{$value->contact->truename}</p>
</div>
{else}
<span class="primary icon bubble small color {$value->jid|stringToColor}">
{$value->jid|firstLetterCapitalize:true}
</span>
<div>
<p class="normal">{$value->jid}</p>
</div>
{/if}
</li>
</a>
{/loop}
</ul>

19
app/widgets/CommunityData/CommunityData.php

@ -34,6 +34,25 @@ class CommunityData extends Base
->request();
}
public function prepareCard($info)
{
$view = $this->tpl();
$view->assign('info', $info);
$view->assign('num', 0);
if ($info) {
$view->assign('num',
($info->items > 0)
? $info->items
: \App\Post::where('server', $info->server)
->where('node', $info->node)
->count()
);
}
return $view->draw('_communitydata_card');
}
public function prepareData($origin, $node)
{
$view = $this->tpl();

50
app/widgets/CommunityData/_communitydata.tpl

@ -1,55 +1,11 @@
<br />
{if="$info"}
{$url = $info->getPhoto('l')}
{if="$url"}
<ul class="list">
<li class="block large">
<div>
<p class="center">
<img class="avatar" src="{$url}"/>
</p>
</div>
</li>
</ul>
{/if}
{autoescape="off"}
{$c->prepareCard($info)}
{/autoescape}
<ul class="list block middle flex">
<li class="block large">
<div>
<p class="normal center line" title="{$info->name}">
{if="$info->name"}
{$info->name}
{else}
{$info->node}
{/if}
</p>
{if="$info->description != null && trim($info->description) != ''"}
<p class="center" title="{$info->description}">{$info->description}</p>
{/if}
{if="$info->created"}
<p class="center">
{$info->created|strtotime|prepareDate:true,true}
</p>
{/if}
<p class="center">
<i class="material-icons">receipt</i> {$c->__('communitydata.num', $num)}
·
<i class="material-icons">people</i> {$c->__('communitydata.sub', $info->occupants)}
</p>
{if="$info->pubsubpublishmodel == 'publishers'"}
<p class="center">
<i class="material-icons">assignment_ind</i> {$c->__('communitydata.publishmodel_publishers')}
</p>
{/if}
{if="$info->pubsubpublishmodel == 'subscribers'"}
<p class="center">
<i class="material-icons">assignment_turned_in</i> {$c->__('communitydata.publishmodel_subscribers')}
</p>
{/if}
</div>
</li>
{if="$info->related"}
{$related = $info->related}
<li onclick="MovimUtils.redirect('{$c->route('chat', [$related->server,'room'])}')"

49
app/widgets/CommunityData/_communitydata_card.tpl

@ -0,0 +1,49 @@
{$url = $info->getPhoto('l')}
{if="$url"}
<ul class="list">
<li class="block large">
<div>
<p class="center">
<img class="avatar" src="{$url}"/>
</p>
</div>
</li>
</ul>
{/if}
<ul class="list block middle flex">
<li class="block large">
<div>
<p class="normal center line" title="{$info->name}">
{if="$info->name"}
{$info->name}
{else}
{$info->node}
{/if}
</p>
{if="$info->description != null && trim($info->description) != ''"}
<p class="center" title="{$info->description}">{$info->description}</p>
{/if}
{if="$info->created"}
<p class="center">
{$info->created|strtotime|prepareDate:true,true}
</p>
{/if}
<p class="center">
<i class="material-icons">receipt</i> {$c->__('communitydata.num', $num)}
·
<i class="material-icons">people</i> {$c->__('communitydata.sub', $info->occupants)}
</p>
{if="$info->pubsubpublishmodel == 'publishers'"}
<p class="center">
<i class="material-icons">assignment_ind</i> {$c->__('communitydata.publishmodel_publishers')}
</p>
{/if}
{if="$info->pubsubpublishmodel == 'subscribers'"}
<p class="center">
<i class="material-icons">assignment_turned_in</i> {$c->__('communitydata.publishmodel_subscribers')}
</p>
{/if}
</div>
</li>
</ul>

37
app/widgets/CommunityDataPublic/CommunityDataPublic.php

@ -0,0 +1,37 @@
<?php
use Movim\Widget\Base;
include_once WIDGETS_PATH.'CommunityData/CommunityData.php';
include_once WIDGETS_PATH.'CommunityAffiliations/CommunityAffiliations.php';
class CommunityDataPublic extends Base
{
public function prepareCard($info)
{
return (new CommunityData)->prepareCard($info);
}
public function prepareSubscriptions($subscriptions)
{
return (new CommunityAffiliations)->prepareSubscriptionsList($subscriptions);
}
public function display()
{
$server = $this->get('s');
$node = $this->get('n');
$info = \App\Info::where('server', $server)
->where('node', $node)
->first();
$subscriptions = \App\Subscription::where('server', $server)
->where('node', $node)
->where('public', true)
->get();
$this->view->assign('subscriptions', $subscriptions);
$this->view->assign('info', $info);
}
}

12
app/widgets/CommunityDataPublic/communitydatapublic.tpl

@ -0,0 +1,12 @@
<ul id="community_data_public" class="list card">
<br />
{autoescape="off"}
{$c->prepareCard($info)}
{/autoescape}
{if="$subscriptions->isNotEmpty()"}
{autoescape="off"}
{$c->prepareSubscriptions($subscriptions)}
{/autoescape}
{/if}
</ul>

18
app/widgets/ContactData/ContactData.php

@ -9,7 +9,6 @@ class ContactData extends Base
public function load()
{
$this->addjs('contactdata.js');
$this->addcss('contactdata.css');
$this->registerEvent('vcard_get_handle', 'onVcardReceived', 'contact');
$this->registerEvent('vcard4_get_handle', 'onVcardReceived', 'contact');
}
@ -43,6 +42,23 @@ class ContactData extends Base
return $view->draw('_contactdata');
}
public function prepareCard($contact, $roster = null)
{
$view = $this->tpl();
$view->assign('contact', $contact);
$view->assign('roster', $roster);
return $view->draw('_contactdata_card');
}
public function prepareSubscriptions($subscriptions)
{
$view = $this->tpl();
$view->assign('subscriptions', $subscriptions);
return $view->draw('_contactdata_subscriptions');
}
public function ajaxRefresh($jid)
{
if (!$this->validateJid($jid)) {

139
app/widgets/ContactData/_contactdata.tpl

@ -1,91 +1,9 @@
<br />
{$url = $contact->getPhoto('l')}
{if="$url"}
<ul class="list middle">
<li>
<div>
<p class="center">
<img class="avatar" src="{$url}">
</p>
</div>
</li>
</ul>
{/if}
{autoescape="off"}
{$c->prepareCard($contact, $roster)}
{/autoescape}
<div class="block">
<ul class="list middle">
<li>
<div>
<p class="normal center ">
{$contact->truename}
{if="isset($roster) && isset($roster->presence)"}
<span class="second">{$roster->presence->presencetext}</span>
{/if}
</p>
{if="$roster && $roster->presence && $roster->presence->seen"}
<p class="center">
<span class="second">
{$c->__('last.title')} {$roster->presence->seen|strtotime|prepareDate:true,true}
</span>
</p>
{/if}
{if="$contact->email"}
<p class="center"><a href="mailto:{$contact->email}">{$contact->email}</a></p>
{/if}
{if="$contact->description != null && trim($contact->description) != ''"}
<p class="center all" title="{$contact->description}">
{autoescape="off"}
{$contact->description|nl2br|addEmojis}
{/autoescape}
</p>
{/if}
</div>
</li>
<!--<li>
<span class="primary icon gray">
<i class="material-icons">accounts</i>
</span>
<p class="normal">{$c->__('communitydata.sub', 0)}</p>
</li>-->
</ul>
{if="$contact->url != null"}
<ul class="list thin">
<li>
<span class="primary icon gray"><i class="material-icons">link</i></span>
<div>
<p class="normal line">
{if="filter_var($contact->url, FILTER_VALIDATE_URL)"}
<a href="{$contact->url}" target="_blank">{$contact->url}</a>
{else}
{$contact->url}
{/if}
</p>
</div>
</li>
</ul>
{/if}
{if="$contact->adrlocality != null || $contact->adrcountry != null"}
<ul class="list middle">
<li>
<span class="primary icon gray"><i class="material-icons">location_city</i></span>
<div>
{if="$contact->adrlocality != null"}
<p class="normal">{$contact->adrlocality}</p>
{/if}
{if="$contact->adrcountry != null"}
<p {if="$contact->adrlocality == null"}class="normal"{/if}>
{$contact->adrcountry}
</p>
{/if}
</div>
</li>
</ul>
{/if}
</div>
<div class="block">
<ul class="list middle active divided spaced">
{if="!$contact->isMe()"}
@ -223,51 +141,6 @@
</ul>
</div>
{if="count($subscriptions) > 0"}
<ul class="list active large">
<li class="subheader large">
<div>
<p>
<span class="info">{$subscriptions|count}</span>
{$c->__('page.communities')}
</p>
</div>
</li>
{loop="$subscriptions"}
<a href="{$c->route('community', [$value->server, $value->node])}">
<li title="{$value->server} - {$value->node}">
{if="$value->info"}
{$url = $value->info->getPhoto('m')}
{/if}
{if="$url"}
<span class="primary icon bubble">
<img src="{$url}"/>
</span>
{else}
<span class="primary icon bubble color {$value->node|stringToColor}">
{$value->node|firstLetterCapitalize}
</span>
{/if}
<span class="control icon gray">
<i class="material-icons">chevron_right</i>
</span>
<div>
<p class="line normal">
{if="$value->info && $value->info->name"}
{$value->info->name}
{elseif="$value->name"}
{$value->name}
{else}
{$value->node}
{/if}
</p>
{if="$value->info && $value->info->description"}
<p class="line">{$value->info->description|strip_tags}</p>
{/if}
</div>
</li>
</a>
{/loop}
</ul>
{/if}
{autoescape="off"}
{$c->prepareSubscriptions($subscriptions)}
{/autoescape}

86
app/widgets/ContactData/_contactdata_card.tpl

@ -0,0 +1,86 @@
{$url = $contact->getPhoto('l')}
{if="$url"}
<ul class="list middle">
<li>
<div>
<p class="center">
<img class="avatar" src="{$url}">
</p>
</div>
</li>
</ul>
{/if}
<div class="block">
<ul class="list middle">
<li>
<div>
<p class="normal center ">
{$contact->truename}
{if="isset($roster) && isset($roster->presence)"}
<span class="second">{$roster->presence->presencetext}</span>
{/if}
</p>
{if="$roster && $roster->presence && $roster->presence->seen"}
<p class="center">
<span class="second">
{$c->__('last.title')} {$roster->presence->seen|strtotime|prepareDate:true,true}
</span>
</p>
{/if}
{if="$contact->email"}
<p class="center"><a href="mailto:{$contact->email}">{$contact->email}</a></p>
{/if}
{if="$contact->description != null && trim($contact->description) != ''"}
<p class="center all" title="{$contact->description}">
{autoescape="off"}
{$contact->description|nl2br|addEmojis}
{/autoescape}
</p>
{/if}
</div>
</li>
<!--<li>
<span class="primary icon gray">
<i class="material-icons">accounts</i>
</span>
<p class="normal">{$c->__('communitydata.sub', 0)}</p>
</li>-->
</ul>
{if="$contact->url != null"}
<ul class="list thin">
<li>
<span class="primary icon gray"><i class="material-icons">link</i></span>
<div>
<p class="normal line">
{if="filter_var($contact->url, FILTER_VALIDATE_URL)"}
<a href="{$contact->url}" target="_blank">{$contact->url}</a>
{else}
{$contact->url}
{/if}
</p>
</div>
</li>
</ul>
{/if}
{if="$contact->adrlocality != null || $contact->adrcountry != null"}
<ul class="list middle">
<li>
<span class="primary icon gray"><i class="material-icons">location_city</i></span>
<div>
{if="$contact->adrlocality != null"}
<p class="normal">{$contact->adrlocality}</p>
{/if}
{if="$contact->adrcountry != null"}
<p {if="$contact->adrlocality == null"}class="normal"{/if}>
{$contact->adrcountry}
</p>
{/if}
</div>
</li>
</ul>
{/if}
</div>

48
app/widgets/ContactData/_contactdata_subscriptions.tpl

@ -0,0 +1,48 @@
{if="count($subscriptions) > 0"}
<ul class="list active large">
<li class="subheader large">
<div>
<p>
<span class="info">{$subscriptions|count}</span>
{$c->__('page.communities')}
</p>
</div>
</li>
{loop="$subscriptions"}
<a href="{$c->route('community', [$value->server, $value->node])}">
<li title="{$value->server} - {$value->node}">
{if="$value->info"}
{$url = $value->info->getPhoto('m')}
{/if}
{if="$url"}
<span class="primary icon bubble">
<img src="{$url}"/>
</span>
{else}
<span class="primary icon bubble color {$value->node|stringToColor}">
{$value->node|firstLetterCapitalize}
</span>
{/if}
<span class="control icon gray">
<i class="material-icons">chevron_right</i>
</span>
<div>
<p class="line normal">
{if="$value->info && $value->info->name"}
{$value->info->name}
{elseif="$value->name"}
{$value->name}
{else}
{$value->node}
{/if}
</p>
{if="$value->info && $value->info->description"}
<p class="line">{$value->info->description|strip_tags}</p>
{/if}
</div>
</li>
</a>
{/loop}
</ul>
{/if}

5
app/widgets/ContactData/contactdata.css

@ -1,5 +0,0 @@
.contact_data ul.list:first-child li:first-child img.avatar {
height: 25rem;
margin-left: 5rem;
display: inline-block;
}

34
app/widgets/ContactDataPublic/ContactDataPublic.php

@ -0,0 +1,34 @@
<?php
use Movim\Widget\Base;
include_once WIDGETS_PATH.'ContactData/ContactData.php';
class ContactDataPublic extends Base
{
public function prepareCard($contact)
{
return (new ContactData)->prepareCard($contact);
}
public function prepareSubscriptions($subscriptions)
{
return (new ContactData)->prepareSubscriptions($subscriptions);
}
public function display()
{
$jid = $this->get('f');
$user = \App\User::where('nickname', $jid)->first();
if ($user) {
$jid = $user->id;
}
$this->view->assign('contact', App\Contact::firstOrNew(['id' => $jid]));
$this->view->assign('subscriptions', \App\Subscription::where('jid', $jid)
->where('public', true)
->get());
$this->view->assign('jid', $jid);
}
}

10
app/widgets/ContactDataPublic/contactdatapublic.tpl

@ -0,0 +1,10 @@
<ul id="contact_public_data" class="contact_data list card">
<br />
{autoescape="off"}
{$c->prepareCard($contact)}
{/autoescape}
{autoescape="off"}
{$c->prepareSubscriptions($subscriptions)}
{/autoescape}
</ul>
Loading…
Cancel
Save