Browse Source

First commit for the Community feature

pull/325/head
Timothée Jaussoin 9 years ago
parent
commit
d1576a61ff
  1. 6
      app/controllers/GroupController.php
  2. 15
      app/controllers/PostController.php
  3. 4
      app/models/item/Item.php
  4. 49
      app/models/item/ItemDAO.php
  5. 27
      app/views/group.tpl
  6. 7
      app/views/news.tpl
  7. 16
      app/views/post.tpl
  8. 61
      app/widgets/Communities/Communities.php
  9. 63
      app/widgets/Communities/_communities.tpl
  10. 3
      app/widgets/Communities/communities.js
  11. 1
      app/widgets/Communities/communities.tpl
  12. 143
      app/widgets/CommunitiesServer/CommunitiesServer.php
  13. 88
      app/widgets/CommunitiesServer/_communitiesserver.tpl
  14. 21
      app/widgets/CommunitiesServer/_communitiesserver_add.tpl
  15. 6
      app/widgets/CommunitiesServer/communitiesserver.js
  16. 1
      app/widgets/CommunitiesServer/communitiesserver.tpl
  17. 36
      app/widgets/CommunityAffiliations/CommunityAffiliations.php
  18. 22
      app/widgets/CommunityAffiliations/_communityaffiliations.tpl
  19. 3
      app/widgets/CommunityAffiliations/communityaffiliations.tpl
  20. 44
      app/widgets/CommunityData/CommunityData.php
  21. 9
      app/widgets/CommunityData/_communitydata.tpl
  22. 3
      app/widgets/CommunityData/communitydata.tpl
  23. 47
      app/widgets/CommunityHeader/CommunityHeader.php
  24. 36
      app/widgets/CommunityHeader/_communityheader.tpl
  25. 3
      app/widgets/CommunityHeader/communityheader.tpl
  26. 141
      app/widgets/Group/Group.php
  27. 57
      app/widgets/Group/_group_header.tpl
  28. 19
      app/widgets/Group/_group_posts.tpl
  29. 2
      app/widgets/Group/group.js
  30. 5
      app/widgets/Group/group.tpl
  31. 19
      app/widgets/Groups/Groups.php
  32. 8
      app/widgets/Menu/Menu.php
  33. 49
      app/widgets/Menu/_menu_list.tpl
  34. 2
      app/widgets/Menu/_menu_refresh.tpl
  35. 4
      app/widgets/Menu/menu.css
  36. 6
      app/widgets/Navigation/navigation.tpl
  37. 22
      app/widgets/NewsNav/NewsNav.php
  38. 115
      app/widgets/NewsNav/newsnav.tpl
  39. 9
      app/widgets/Post/Post.php
  40. 2
      app/widgets/Post/_post.tpl
  41. 81
      app/widgets/Post/_post_card.tpl
  42. 4
      linker.php
  43. 1
      locales/locales.ini
  44. 5
      src/Movim/Bootstrap.php
  45. 1
      src/Movim/Route.php
  46. 23
      themes/material/css/article.css
  47. 4
      themes/material/css/icon.css
  48. 2
      themes/material/css/listn.css
  49. 33
      themes/material/css/style.css

6
app/controllers/GroupController.php

@ -3,11 +3,13 @@ use Movim\Controller\Base;
class GroupController extends Base
{
function load() {
function load()
{
$this->session_only = true;
}
function dispatch() {
function dispatch()
{
$this->page->setTitle(__('page.groups'));
$user = new User();

15
app/controllers/PostController.php

@ -0,0 +1,15 @@
<?php
use Movim\Controller\Base;
class PostController extends Base
{
function load()
{
$this->session_only = true;
}
function dispatch()
{
$this->page->setTitle(__('page.post'));
}
}

4
app/models/item/Item.php

@ -128,10 +128,10 @@ class Item extends Model
}
}
public function getLogo()
public function getLogo($size = 120)
{
$p = new Picture;
return $p->get($this->server.$this->node, 120);
return $p->get($this->server.$this->node, $size);
}
public function getName()

49
app/models/item/ItemDAO.php

@ -91,9 +91,9 @@ class ItemDAO extends SQL
$this->prepare(
'Item',
array(
[
'node' => 'urn:xmpp:microblog:0:comments%'
)
]
);
return $this->run('Server');
@ -172,9 +172,9 @@ class ItemDAO extends SQL
$this->prepare(
'Item',
array(
[
'server' => $server
)
]
);
return $this->run('Item');
@ -190,9 +190,9 @@ class ItemDAO extends SQL
$this->prepare(
'Item',
array(
[
'server' => $server
)
]
);
return $this->run('Item', 'item');
@ -207,9 +207,9 @@ class ItemDAO extends SQL
$this->prepare(
'Item',
array(
[
'server' => $server
)
]
);
return $this->run('Item', 'item');
@ -230,9 +230,9 @@ class ItemDAO extends SQL
$this->prepare(
'Item',
array(
[
'node' => 'urn:xmpp:microblog%'
)
]
);
return $this->run('Item');
@ -245,9 +245,9 @@ class ItemDAO extends SQL
$this->prepare(
'Item',
array(
[
'server' => $server
)
]
);
return $this->run('Item');
@ -261,15 +261,32 @@ class ItemDAO extends SQL
$this->prepare(
'Item',
array(
[
'server' => $server,
'node' => $item
)
]
);
return $this->run('Item');
}
function getJid($jid) {
$this->_sql = '
select * from item
where
jid = :jid
and node = \'\'';
$this->prepare(
'Item',
[
'jid' => $jid
]
);
return $this->run('Item', 'item');
}
function getItem($server, $item) {
$this->_sql = '
select * from item
@ -279,10 +296,10 @@ class ItemDAO extends SQL
$this->prepare(
'Item',
array(
[
'node' => $item,
'server' => $server
)
]
);
return $this->run('Item', 'item');

27
app/views/group.tpl

@ -9,9 +9,28 @@
</nav>
<main>
<section>
<?php $this->widget('Groups'); ?>
<?php $this->widget('Group'); ?>
<?php $this->widget('Publish'); ?>
<section style="background-color: #EEE;">
<?php if(empty($_GET['s'])) { ?>
<aside>
</aside>
<?php $this->widget('Communities'); ?>
<?php } elseif(empty($_GET['n'])) { ?>
<aside>
</aside>
<?php $this->widget('CommunitiesServer'); ?>
<?php } else { ?>
<aside>
<?php $this->widget('CommunityData'); ?>
<?php $this->widget('CommunityAffiliations'); ?>
</aside>
<div id="community">
<?php $this->widget('CommunityHeader'); ?>
<?php //$this->widget('Groups'); ?>
<?php $this->widget('Group'); ?>
<?php //$this->widget('Publish'); ?>
</div>
<?php } ?>
</section>
</main>

7
app/views/news.tpl

@ -10,9 +10,10 @@
</nav>
<main>
<section>
<section style="background-color: #EEE;">
<aside><?php $this->widget('NewsNav');?></aside>
<?php $this->widget('Menu');?>
<?php $this->widget('Post');?>
<?php $this->widget('Publish');?>
<?php //$this->widget('Post');?>
<?php //$this->widget('Publish');?>
</section>
</main>

16
app/views/post.tpl

@ -0,0 +1,16 @@
<?php $this->widget('Init');?>
<?php $this->widget('VisioLink');?>
<?php $this->widget('Notification');?>
<?php $this->widget('Upload');?>
<?php $this->widget('Search');?>
<nav class="color dark">
<?php $this->widget('Presence');?>
<?php $this->widget('Navigation');?>
</nav>
<main>
<section>
<?php $this->widget('Post');?>
</section>
</main>

61
app/widgets/Communities/Communities.php

@ -0,0 +1,61 @@
<?php
use Moxl\Xec\Action\Disco\Items;
use Respect\Validation\Validator;
class Communities extends \Movim\Widget\Base
{
public function load()
{
$this->registerEvent('disco_items_handle', 'onDisco');
$this->addjs('communities.js');
}
function onDisco($packet)
{
$this->ajaxGet();
}
function ajaxDisco($server)
{
if(!$this->validateServer($server)) {
Notification::append(null, $this->__('groups.disco_error'));
return;
}
RPC::call('MovimTpl.fill', '#groups_widget', '');
$r = new Items;
$r->setTo($server)->request();
}
function ajaxGet()
{
RPC::call('MovimTpl.fill', '#communities', $this->prepareCommunities());
}
function prepareCommunities()
{
$id = new \Modl\ItemDAO();
$view = $this->tpl();
$view->assign('servers', $id->getGroupServers());
return $view->draw('_communities', true);
}
/**
* @brief Validate the server
*
* @param string $server
*/
private function validateServer($server)
{
$validate_server = Validator::noWhitespace()->alnum('.-_')->length(6, 40);
return ($validate_server->validate($server));
}
public function display()
{
}
}

63
app/widgets/Communities/_communities.tpl

@ -0,0 +1,63 @@
<header>
<ul class="list middle">
<li>
<span class="primary icon gray active on_mobile" onclick="history.back()">
<i class="zmdi zmdi-arrow-left"></i>
</span>
<p class="center">{$c->__('page.communities')}</p>
<p class="center line">{$c->__('group.empty_text')}</p>
</li>
</ul>
</header>
<!--
<ul class="list card thick">
<li></li>
<li class="block">
<span class="primary icon gray">
<i class="zmdi zmdi-help"></i>
</span>
<p class="all">
{$c->__('group.help_info1')}
</p>
<p>
{$c->___('group.help_info2', '<i class="zmdi zmdi-bookmark"></i>', '<i class="zmdi zmdi-plus"></i> ')}<br />
{$c->___('group.help_info3', '<i class="zmdi zmdi-edit"></i>')}<br />
</p>
<p>
{$c->___('group.help_info4', '<a href="'.$c->route('news').'"><i class="zmdi zmdi-receipt"></i> ','</a>')}
</p>
</li>
</ul>-->
<ul class="list flex middle active">
<li class="block large">
<p>{$c->__('group.servers')}</p>
</li>
{loop="$servers"}
{if="!filter_var($value->server, FILTER_VALIDATE_EMAIL)"}
<li class="block
{if="empty($value->number)"}faded{/if}"
onclick="MovimUtils.redirect('{$c->route('group', $value->server)}')">
<span class="primary icon bubble color {$value->server|stringToColor}">
{$value->server|firstLetterCapitalize}
</span>
<p class="line" title="{$value->server} - {$value->name}">
{$value->server}
<span class="second">{$value->name}</span>
</p>
<p>{$c->__('group.counter', (empty($value->number)) ? 0 : $value->number)}</p>
</li>
{/if}
{/loop}
<li class="block large">
<span class="primary icon">
<i class="zmdi zmdi-search-for"></i>
</span>
<form>
<div>
<input placeholder="pubsub.server.com" onkeypress="
if(event.keyCode == 13) { Communities_ajaxDisco(this.value); return false; }" >
<label>{$c->__('group.search_server')}</label>
</div>
</form>
</li>
</ul>

3
app/widgets/Communities/communities.js

@ -0,0 +1,3 @@
MovimWebsocket.attach(function() {
Communities_ajaxGet();
});

1
app/widgets/Communities/communities.tpl

@ -0,0 +1 @@
<div id="communities"></div>

143
app/widgets/CommunitiesServer/CommunitiesServer.php

@ -0,0 +1,143 @@
<?php
use Moxl\Xec\Action\Pubsub\GetItems;
use Moxl\Xec\Action\Disco\Items;
use Respect\Validation\Validator;
use Moxl\Xec\Action\Pubsub\Create;
use Moxl\Xec\Action\Pubsub\TestCreate;
use Cocur\Slugify\Slugify;
class CommunitiesServer extends \Movim\Widget\Base
{
public function load()
{
$this->registerEvent('disco_items_handle', 'onDisco');
$this->registerEvent('disco_items_error', 'onDiscoError');
$this->registerEvent('pubsub_create_handle', 'onCreate');
$this->registerEvent('pubsub_testcreate_handle', 'onTestCreate');
$this->registerEvent('pubsub_testcreate_error', 'onTestCreateError');
$this->addjs('communitiesserver.js');
}
function onCreate($packet)
{
Notification::append(null, $this->__('groups.created'));
list($server, $node) = array_values($packet->content);
$this->ajaxDisco($server);
}
function onDisco($packet)
{
$server = $packet->content;
RPC::call('MovimTpl.fill', '#communities_server', $this->prepareCommunitiesServer($server));
}
function onDiscoError($packet)
{
$server = $packet->content;
$id = new \Modl\ItemDAO();
$id->deleteItems($server);
RPC::call('MovimTpl.fill', '#communities_server', $this->prepareCommunitiesServer($server));
Notification::append(null, $this->__('groups.disco_error'));
}
function onTestCreate($packet)
{
$server = $packet->content;
$view = $this->tpl();
$view->assign('server', $server);
Dialog::fill($view->draw('_communitiesserver_add', true));
}
function onTestCreateError($packet)
{
Notification::append(null, $this->__('groups.no_creation'));
}
function ajaxDisco($server)
{
if(!$this->validateServer($server)) {
Notification::append(null, $this->__('groups.disco_error'));
return;
}
RPC::call('MovimTpl.fill', '#communities_server', '');
$r = new Items;
$r->setTo($server)->request();
}
/*
* Seriously ? We need to put this hack because of buggy XEP-0060...
*/
function ajaxTestAdd($server)
{
if(!$this->validateServer($server)) return;
$t = new TestCreate;
$t->setTo($server)
->request();
}
function ajaxAddConfirm($server, $form)
{
if(!$this->validateServer($server)) return;
$validate_name = Validator::stringType()->length(4, 80);
if(!$validate_name->validate($form->name->value)) {
Notification::append(null, $this->__('groups.name_error'));
return;
}
$slugify = new Slugify();
$uri = $slugify->slugify($form->name->value);
if($uri == '') {
Notification::append(null, $this->__('groups.name_error'));
return;
}
$c = new Create;
$c->setTo($server)
->setNode($uri)
->setName($form->name->value)
->request();
}
public function prepareCommunitiesServer($server)
{
$id = new \Modl\ItemDAO;
$view = $this->tpl();
$view->assign('item', $id->getJid($server));
$view->assign('nodes', $id->getItems($server));
$view->assign('server', $server);
return $view->draw('_communitiesserver', true);
}
/**
* @brief Validate the server
*
* @param string $server
*/
private function validateServer($server)
{
$validate_server = Validator::noWhitespace()->alnum('.-_')->length(6, 40);
return ($validate_server->validate($server));
}
public function display()
{
$this->view->assign('server', $this->get('s'));
}
}

88
app/widgets/CommunitiesServer/_communitiesserver.tpl

@ -0,0 +1,88 @@
<header>
<ul class="list middle">
<li>
<span class="primary icon icon gray active" onclick="history.back()">
<i class="zmdi zmdi-arrow-back"></i>
</span>
{if="count($nodes) > 0"}
<span class="control icon gray">
{$nodes|count}
</span>
{/if}
<p class="center">{$c->__('page.communities')}</p>
<p class="center line">{$server}</p>
</li>
</ul>
</header>
{if="$nodes == null"}
<ul class="thick">
<div class="placeholder icon pages">
<h1>{$c->__('error.oops')}</h1>
<h4>{$c->__('groups.empty_server')}</h4>
</li>
</ul>
{else}
<ul class="list middle divided spaced active all flex">
<!--<li class="subheader" >
<span class="primary icon"><i class="zmdi zmdi-arrow-back"></i></span>
<p class="normal">{$server}</p>
</li>-->
{loop="$nodes"}
<li
class="block
{if="$value->subscription == 'subscribed'"}action{/if}
{if="$value->sub > 0 || $value->num > 0"}condensed{/if}
"
onclick="MovimUtils.redirect('{$c->route('group', [$value->server, $value->node])}')"
title="{$value->server} - {$value->node}"
>
{if="$value->subscription == 'subscribed'"}
<span class="control icon gray">
<i class="zmdi zmdi-bookmark"></i>
</span>
{/if}
{if="$value->logo"}
<span class="primary icon bubble">
<img src="{$value->getLogo(50)}">
</span>
{else}
<span class="primary icon bubble color {$value->node|stringToColor}">
{$value->node|firstLetterCapitalize}
</span>
{/if}
<p class="line">
{if="$value->name"}
{$value->name}
{else}
{$value->node}
{/if}
<span class="second">
{if="$value->description"}
{$value->description|strip_tags}
{/if}
</span>
</p>
<p>
{if="$value->num > 0"}
{$c->__('groups.num', $value->num)}
{/if}
{if="$value->sub > 0 && $value->num > 0"}
-
{/if}
{if="$value->sub > 0"}
<span title="{$c->__('groups.sub', $value->sub)}">
{$value->sub} <i class="zmdi zmdi-accounts"></i>
</span>
{/if}
<span class="info">
{$value->published|strtotime|prepareDate:true,true}
</span>
</p>
</li>
{/loop}
</ul>
{/if}
<a onclick="CommunitiesServer_ajaxTestAdd('{$server}')" class="button action color">
<i class="zmdi zmdi-plus"></i>
</a>

21
app/widgets/CommunitiesServer/_communitiesserver_add.tpl

@ -0,0 +1,21 @@
<section>
<form name="groupadd" onsubmit="return false;">
<h3>{$c->__('groups.add', $server)}</h3>
<div>
<input name="name" placeholder="{$c->__('groups.name_example')}" type="text" required />
<label for="name">{$c->__('groups.name')}</label>
</div>
</section>
<div>
<a class="button flat" onclick="Dialog_ajaxClear()">
{$c->__('button.close')}
</a>
<a
class="button flat"
onclick="CommunitiesServer_ajaxAddConfirm('{$server}', MovimUtils.formToJson('groupadd')); Dialog_ajaxClear();">
{$c->__('button.add')}
</a>
</div>
</div>

6
app/widgets/CommunitiesServer/communitiesserver.js

@ -0,0 +1,6 @@
MovimWebsocket.attach(function() {
var parts = MovimUtils.urlParts();
if(parts.params.length > 0) {
CommunitiesServer_ajaxDisco(parts.params[0]);
}
});

1
app/widgets/CommunitiesServer/communitiesserver.tpl

@ -0,0 +1 @@
<div id="communities_server" class="spin"></div>

36
app/widgets/CommunityAffiliations/CommunityAffiliations.php

@ -0,0 +1,36 @@
<?php
use Respect\Validation\Validator;
class CommunityAffiliations extends \Movim\Widget\Base
{
public function load()
{
$this->registerEvent('pubsub_getaffiliations_handle', 'onAffiliations');
}
function onAffiliations($packet)
{
list($affiliations, $server, $node) = array_values($packet->content);
$role = null;
foreach($affiliations as $r) {
if($r[0] == $this->user->getLogin())
$role = (string)$r[1];
}
$id = new \Modl\ItemDAO;
$item = $id->getItem($server, $node);
$view = $this->tpl();
$view->assign('role', $role);
$view->assign('item', $item);
RPC::call('MovimTpl.fill', '#community_affiliation', $view->draw('_communityaffiliations', true));
}
public function display()
{
}
}

22
app/widgets/CommunityAffiliations/_communityaffiliations.tpl

@ -0,0 +1,22 @@
{if="$role == 'owner'"}
<ul class="list active">
<li onclick="Group_ajaxGetConfig('{$item->server|echapJS}', '{$item->node|echapJS}')">
<span class="primary icon gray">
<i class="zmdi zmdi-settings"></i>
</span>
<p class="normal">{$c->__('group.configuration')}</p>
</li>
<li onclick="Group_ajaxGetSubscriptions('{$item->server|echapJS}', '{$item->node|echapJS}', true)">
<span class="primary icon gray">
<i class="zmdi zmdi-accounts-list"></i>
</span>
<p class="normal">{$c->__('group.subscriptions')}</p>
</li>
<li onclick="Group_ajaxDelete('{$item->server|echapJS}', '{$item->node|echapJS}')">
<span class="primary icon gray">
<i class="zmdi zmdi-delete"></i>
</span>
<p class="normal">{$c->__('button.delete')}</p>
</li>
</ul>
{/if}

3
app/widgets/CommunityAffiliations/communityaffiliations.tpl

@ -0,0 +1,3 @@
<ul class="list card">
<li id="community_affiliation"></li>
</ul>

44
app/widgets/CommunityData/CommunityData.php

@ -0,0 +1,44 @@
<?php
use Respect\Validation\Validator;
class CommunityData extends \Movim\Widget\Base
{
public function load()
{
$this->registerEvent('pubsub_getmetadata_handle', 'onMetadata');
}
function onMetadata($packet)
{
list($server, $node) = $packet->content;
RPC::call('MovimTpl.fill', '#community_data', $this->prepareData($server, $node));
}
public function prepareData($server, $node)
{
$id = new \Modl\ItemDAO;
$item = $id->getItem($server, $node);
if($item && !$item->logo) {
$item->setPicture();
$id->set($item);
}
$pd = new \Modl\SubscriptionDAO;
$subscription = $pd->get($server, $node);
$view = $this->tpl();
$view->assign('item', $item);
$view->assign('subscription', $subscription);
return $view->draw('_communitydata', true);
}
public function display()
{
$this->view->assign('server', $this->get('s'));
$this->view->assign('node', $this->get('n'));
}
}

9
app/widgets/CommunityData/_communitydata.tpl

@ -0,0 +1,9 @@
<br />
{if="$item->logo"}
<li class="block large">
<p class="center">
<img src="{$item->getLogo(400)}" style="max-width: 100%"/>
</p>
<p>{$item->created|strtotime|prepareDate:true,true}</p>
</li>
{/if}

3
app/widgets/CommunityData/communitydata.tpl

@ -0,0 +1,3 @@
<ul id="community_data" class="list card thick">
{$c->prepareData($server, $node)}
</ul>

47
app/widgets/CommunityHeader/CommunityHeader.php

@ -0,0 +1,47 @@
<?php
use Respect\Validation\Validator;
class CommunityHeader extends \Movim\Widget\Base
{
public function load()
{
$this->registerEvent('pubsub_getmetadata_handle', 'onMetadata');
}
function onMetadata($packet)
{
list($server, $node) = $packet->content;
RPC::call('MovimTpl.fill', '#community_header', $this->prepareHeader($server, $node));
}
public function prepareHeader($server, $node)
{
$id = new \Modl\ItemDAO;
$item = $id->getItem($server, $node);
if($item && !$item->logo) {
$item->setPicture();
$id->set($item);
}
$pd = new \Modl\SubscriptionDAO;
$subscription = $pd->get($server, $node);
$view = $this->tpl();
$view->assign('item', $item);
$view->assign('subscription', $subscription);
$view->assign('node', $node);
$view->assign('server', $server);
return $view->draw('_communityheader', true);
}
public function display()
{
$this->view->assign('server', $this->get('s'));
$this->view->assign('node', $this->get('n'));
}
}

36
app/widgets/CommunityHeader/_communityheader.tpl

@ -0,0 +1,36 @@
<ul class="list thick">
<li>
{if="$subscription == null"}
<a class="button oppose green color" title="{$c->__('group.subscribe')}"
onclick="Group_ajaxAskSubscribe('{$item->server|echapJS}', '{$item->node|echapJS}')">
Join
</a>
{else}
<a class="button oppose flat" title="{$c->__('group.unsubscribe')}"
onclick="Group_ajaxAskUnsubscribe('{$item->server|echapJS}', '{$item->node|echapJS}')">
Leave
</a>
{/if}
<span id="back" class="primary icon active gray" onclick="history.back()">
<i class="zmdi zmdi-arrow-back"></i>
</span>
<p class="line">
{if="$item != null"}
{if="$item->name"}
{$item->name}
{else}
{$item->node}
{/if}
{else}
{$node}
{/if}
</p>
{if="$item != null && $item->description"}
<p class="line" title="{$item->description|strip_tags}">
{$item->description|strip_tags}
</p>
{else}
<p class="line">{$server}</p>
{/if}
</li>
</ul>

3
app/widgets/CommunityHeader/communityheader.tpl

@ -0,0 +1,3 @@
<header id="community_header" class="relative">
{$c->prepareHeader($server, $node)}
</header>

141
app/widgets/Group/Group.php

@ -18,6 +18,8 @@ use Moxl\Xec\Action\Pubsub\Delete;
use Respect\Validation\Validator;
use Cocur\Slugify\Slugify;
include_once WIDGETS_PATH.'Post/Post.php';
class Group extends \Movim\Widget\Base
{
private $_paging = 8;
@ -25,24 +27,27 @@ class Group extends \Movim\Widget\Base
function load()
{
$this->registerEvent('pubsub_getitem_handle', 'onItems', 'groups');
$this->registerEvent('pubsub_getitems_handle', 'onItems', 'groups');
$this->registerEvent('pubsub_getitemsid_handle', 'onItems', 'groups');
$this->registerEvent('pubsub_getitems_error', 'onItemsError', 'groups');
$this->registerEvent('pubsub_getitemsid_error', 'onItemsError', 'groups');
$this->registerEvent('pubsub_getmetadata_handle', 'onMetadata', 'groups');
$this->registerEvent('pubsub_getitem_handle', 'onItems');
$this->registerEvent('pubsub_getitems_handle', 'onItems');
$this->registerEvent('pubsub_getitemsid_handle', 'onItems');
$this->registerEvent('pubsub_getitems_error', 'onItemsError');
$this->registerEvent('pubsub_getitemsid_error', 'onItemsError');
// $this->registerEvent('pubsub_getmetadata_handle', 'onMetadata');
$this->registerEvent('pubsub_subscribe_handle', 'onSubscribed');
$this->registerEvent('pubsub_unsubscribe_handle', 'onUnsubscribed');
$this->registerEvent('pubsub_getaffiliations_handle', 'onAffiliations');
//$this->registerEvent('pubsub_getaffiliations_handle', 'onAffiliations');
$this->registerEvent('pubsub_getsubscriptions_handle', 'onSubscriptions');
$this->registerEvent('disco_items_handle', 'onDisco', 'groups');
$this->registerEvent('pubsub_delete_handle', 'onDisco');
//$this->registerEvent('disco_items_handle', 'onDisco', 'groups');
//$this->registerEvent('pubsub_delete_handle', 'onDisco');
$this->registerEvent('pubsub_getconfig_handle', 'onConfig');
$this->registerEvent('pubsub_setconfig_handle', 'onConfigSaved');
$this->registerEvent('bookmark_set_handle', 'onBookmark');
$this->registerEvent('pubsub_delete_handle', 'onDelete');
$this->registerEvent('pubsub_delete_error', 'onDeleteError');
//$this->registerEvent('bookmark_set_handle', 'onBookmark');
$this->addjs('group.js');
}
@ -51,27 +56,27 @@ class Group extends \Movim\Widget\Base
list($server, $node) = array_values($packet->content);
$this->ajaxGetMetadata($server, $node);
$this->ajaxGetAffiliations($server, $node);
//$this->ajaxGetAffiliations($server, $node);
$this->displayItems($server, $node);
RPC::call('Group.clearLoad');
RPC::call('MovimTpl.showPanel');
//RPC::call('Group.clearLoad');
//RPC::call('MovimTpl.showPanel');
}
function onDisco($packet)
/*function onDisco($packet)
{
$this->ajaxClear();
}
}*/
function onBookmark()
/*function onBookmark()
{
$this->ajaxClear();
$g = new Groups;
$g->ajaxHeader();
$g->ajaxSubscriptions();
}
}*/
function onItemsError($packet)
{
@ -94,33 +99,6 @@ class Group extends \Movim\Widget\Base
}
}
function onMetadata($packet)
{
list($server, $node) = $packet->content;
RPC::call('MovimTpl.fill', '#group_widget > header', $this->prepareHeader($server, $node));
}
function onAffiliations($packet)
{
list($affiliations, $server, $node) = array_values($packet->content);
foreach($affiliations as $r) {
if($r[0] == $this->user->getLogin())
$this->_role = (string)$r[1];
}
RPC::call('MovimTpl.fill', '#group_widget > header', $this->prepareHeader($server, $node));
//if(isset($this->_role)
//&& ($this->_role == 'owner' || $this->_role == 'publisher')) {
// $view = $this->tpl();
// $view->assign('server', $server);
// $view->assign('node', $node);
// RPC::call('MovimTpl.append', '#group_widget', $view->draw('_group_publish', true));
//}
}
function onSubscriptions($packet)
{
list($subscriptions, $server, $node) = array_values($packet->content);
@ -158,12 +136,14 @@ class Group extends \Movim\Widget\Base
function onSubscribed($packet)
{
$arr = $packet->content;
list($server, $node) = array_values($packet->content);
// Set the bookmark
$r = new Rooms;
$r->setBookmark();
$this->ajaxGetMetadata($server, $node);
Notification::append(null, $this->__('group.subscribed'));
// Set the public list
@ -183,19 +163,43 @@ class Group extends \Movim\Widget\Base
function onUnsubscribed($packet)
{
list($server, $node) = array_values($packet->content);
// Set the bookmark
$r = new Rooms;
$r->setBookmark();
$this->ajaxGetMetadata($server, $node);
Notification::append(null, $this->__('group.unsubscribed'));
}
function onDelete($packet)
{
Notification::append(null, $this->__('groups.deleted'));
list($server, $node) = array_values($packet->content);
$this->rpc('MovimUtils.redirect', $this->route('group', $server));
//$this->displayServer($server);
}
function onDeleteError($packet)
{
Notification::append(null, $this->__('groups.deleted'));
$m = new Rooms;
$m->setBookmark();
list($server, $node) = array_values($packet->content);
$this->rpc('MovimUtils.redirect', $this->route('group', $server));
//$this->ajaxSubscriptions();
}
private function displayItems($server, $node)
{
if(!$this->validateServerNode($server, $node)) return;
$html = $this->prepareGroup($server, $node);
$slugify = new Slugify();
RPC::call('MovimTpl.fill', '#group_widget.'.$slugify->slugify($server.'_'.$node), $html);
@ -262,9 +266,9 @@ class Group extends \Movim\Widget\Base
if(!$this->validateServerNode($server, $node)) return;
$slugify = new Slugify();
RPC::call('Group.addLoad', $slugify->slugify($server.'_'.$node));
RPC::call('MovimUtils.pushState', $this->route('group', [$server, $node]));
RPC::call('MovimTpl.fill', '#group_widget.'.$slugify->slugify($server.'_'.$node), '');
//RPC::call('Group.addLoad', $slugify->slugify($server.'_'.$node));
//RPC::call('MovimUtils.pushState', $this->route('group', [$server, $node]));
//RPC::call('MovimTpl.fill', '#group_widget.'.$slugify->slugify($server.'_'.$node), '');
$r = new GetItemsId;
$r->setTo($server)
@ -402,45 +406,29 @@ class Group extends \Movim\Widget\Base
return $html;
}
/*
public function preparePost($p) {
$pw = new Post;
return $pw->preparePost($p, true);
$pw = new \Post;
return $pw->preparePost($p, true, true, true);
}
*/
private function prepareHeader($server, $node)
private function prepareGroup($server, $node, $page = 0)
{
$pd = new \Modl\PostnDAO;
$posts = $pd->getNodeUnfiltered($server, $node, $page*$this->_paging, $this->_paging);
$id = new \Modl\ItemDAO;
$item = $id->getItem($server, $node);
if($item && !$item->logo) {
$item->setPicture();
$id->set($item);
}
$pd = new \Modl\SubscriptionDAO;
$subscription = $pd->get($server, $node);
$view = $this->tpl();
$view->assign('item', $item);
$view->assign('subscription', $subscription);
$view->assign('role', $this->_role);
return $view->draw('_group_header', true);
}
private function prepareGroup($server, $node, $page = 0)
{
$pd = new \Modl\PostnDAO;
$posts = $pd->getNodeUnfiltered($server, $node, $page*$this->_paging, $this->_paging);
$view = $this->tpl();
$view->assign('server', $server);
$view->assign('node', $node);
$view->assign('page', $page);
$view->assign('posts', $posts);
$view->assign('item', $item);
$view->assign('subscription', $subscription);
$view->assign('paging', $this->_paging);
$html = $view->draw('_group_posts', true);
@ -467,11 +455,14 @@ class Group extends \Movim\Widget\Base
function display()
{
$this->view->assign('server', false);
$slugify = new Slugify();
/*$this->view->assign('server', false);
$this->view->assign('node', false);
if($this->validateServerNode($this->get('s'), $this->get('n'))) {
$this->view->assign('server', $this->get('s'));
$this->view->assign('node', $this->get('n'));
}
}*/
$this->view->assign('class', $slugify->slugify($this->get('s').'_'.$this->get('n')));
$this->view->assign('html', $this->prepareGroup($this->get('s'), $this->get('n')));
}
}

57
app/widgets/Group/_group_header.tpl

@ -1,57 +0,0 @@
<ul class="list middle">
<li>
<span id="back" class="primary icon active" onclick="MovimTpl.hidePanel(); Group_ajaxClear();">
<i class="zmdi zmdi-arrow-back"></i>
</span>
{if="$role == 'owner'"}
<span class="control show_context_menu icon active">
<i class="zmdi zmdi-more-vert"></i>
</span>
{/if}
{if="$subscription == null"}
<span class="control icon active" title="{$c->__('group.subscribe')}"
onclick="Group_ajaxAskSubscribe('{$item->server|echapJS}', '{$item->node|echapJS}')">
<i class="zmdi zmdi-bookmark-outline"></i>
</span>
{else}
<span class="control icon active" title="{$c->__('group.unsubscribe')}"
onclick="Group_ajaxAskUnsubscribe('{$item->server|echapJS}', '{$item->node|echapJS}')">
<i class="zmdi zmdi-bookmark"></i>
</span>
{/if}
<p class="line">
{if="$item != null"}
{if="$item->name"}
{$item->name}
{else}
{$item->node}
{/if}
{/if}
</p>
{if="$item->description"}
<p class="line" title="{$item->description|strip_tags}">
{$item->description|strip_tags}
</p>
{else}
<p class="line">{$item->server}</p>
{/if}
</li>
</ul>
{if="$role == 'owner'"}
<ul class="list context_menu active">
<li onclick="Group_ajaxGetConfig('{$item->server|echapJS}', '{$item->node|echapJS}')">
<p class="normal">{$c->__('group.configuration')}</p>
</li>
<li onclick="Group_ajaxGetSubscriptions('{$item->server|echapJS}', '{$item->node|echapJS}', true)">
<p class="normal">{$c->__('group.subscriptions')}</p>
</li>
<li onclick="Group_ajaxDelete('{$item->server|echapJS}', '{$item->node|echapJS}')">
<p class="normal">{$c->__('button.delete')}</p>
</li>
</ul>
{/if}
<a onclick="Publish_ajaxTestPublish('{$item->server|echapJS}','{$item->node|echapJS}')" class="button action color">
<i class="zmdi zmdi-edit"></i>
</a>

19
app/widgets/Group/_group_posts.tpl

@ -1,19 +1,7 @@
{if="$page == 0"}
<header class="relative">
<ul class="list middle">
<li>
<span id="back" class="primary icon active" onclick="MovimTpl.hidePanel(); Group_ajaxClear();">
<i class="zmdi zmdi-arrow-back"></i>
</span>
</li>
</ul>
</header>
{/if}
{if="!empty($posts)"}
<ul class="list card active flex shadow">
<ul class="list card shadow">
{loop="$posts"}
<li class="block" onclick="MovimUtils.redirect('{$c->route('news', [$value->origin, $value->node, $value->nodeid])}')">
<!-- <li class="block" onclick="MovimUtils.redirect('{$c->route('news', [$value->origin, $value->node, $value->nodeid])}')">
{$picture = $value->getPicture()}
{if="$picture != null"}
<span class="icon top" style="background-image: url({$picture});"></span>
@ -46,7 +34,8 @@
{/if}
<span class="info">{$value->published|strtotime|prepareDate}</span>
</p>
</li>
</li>-->
{$c->preparePost($value)}
{/loop}
</ul>
{else}

2
app/widgets/Group/group.js

@ -13,6 +13,8 @@ var Group = {
MovimWebsocket.attach(function() {
var parts = MovimUtils.urlParts();
if(parts.params.length > 0) {
Group_ajaxGetMetadata(parts.params[0], parts.params[1]);
Group_ajaxGetAffiliations(parts.params[0], parts.params[1]);
Group_ajaxGetItems(parts.params[0], parts.params[1]);
}
});

5
app/widgets/Group/group.tpl

@ -1,3 +1,4 @@
<div id="group_widget" class="spin" style="background-color: #EEE;">
{$c->prepareEmpty()}
<div id="group_widget" class="spin {$class}" style="background-color: #EEE;">
<!--{$c->prepareEmpty()}-->
{$html}
</div>

19
app/widgets/Groups/Groups.php

@ -38,25 +38,6 @@ class Groups extends \Movim\Widget\Base
$this->ajaxDisco($server);
}
function onDelete($packet)
{
Notification::append(null, $this->__('groups.deleted'));
list($server, $node) = array_values($packet->content);
$this->displayServer($server);
}
function onDeleteError($packet)
{
Notification::append(null, $this->__('groups.deleted'));
$m = new Rooms;
$m->setBookmark();
list($server, $node) = array_values($packet->content);
$this->ajaxSubscriptions();
}
function onDiscoError($packet)
{
$id = new \Modl\ItemDAO();

8
app/widgets/Menu/Menu.php

@ -2,6 +2,8 @@
use Moxl\Xec\Action\Pubsub\GetItems;
include_once WIDGETS_PATH.'Post/Post.php';
class Menu extends \Movim\Widget\Base
{
private $_paging = 15;
@ -193,6 +195,12 @@ class Menu extends \Movim\Widget\Base
return $html;
}
function preparePost($p)
{
$pw = new \Post;
return $pw->preparePost($p, true, true, true);
}
function display()
{
}

49
app/widgets/Menu/_menu_list.tpl

@ -8,17 +8,31 @@
<span class="primary on_desktop icon gray">
<i class="zmdi zmdi-filter-list"></i>
</span>
<span class="control icon active gray on_mobile" onclick="MovimTpl.showPanel()">
<!--<span class="control icon active gray on_mobile" onclick="MovimTpl.showPanel()">
<i class="zmdi zmdi-eye"></i>
</span>
</span>-->
<p class="center line">{$c->__('page.news')}</p>
</li>
</ul>
<ul class="tabs wide">
<li {if="$type == 'all'"}class="active"{/if}><a href="#" onclick="Menu_ajaxGetAll()">{$c->__('menu.all')}</a></li>
<li {if="$type == 'news'"}class="active"{/if} ><a href="#" onclick="Menu_ajaxGetNews()" title="{$c->__('page.news')}"><i class="zmdi zmdi-pages"></i></a></li>
<li {if="$type == 'feed'"}class="active"{/if}><a href="#" onclick="Menu_ajaxGetFeed()" title="{$c->__('page.feed')}"><i class="zmdi zmdi-accounts"></i></a></li>
<li {if="$type == 'me'"}class="active"{/if}><a href="#" onclick="Menu_ajaxGetMe()" title="{$c->__('menu.mine')}"><i class="zmdi zmdi-edit"></i></a></li>
<li {if="$type == 'all'"}class="active"{/if}>
<a href="#" onclick="Menu_ajaxGetAll()">{$c->__('menu.all')}</a>
</li>
<li {if="$type == 'news'"}class="active"{/if} >
<a href="#" onclick="Menu_ajaxGetNews()" title="{$c->__('page.news')}">
{$c->__('page.communities')}
</a>
</li>
<li {if="$type == 'feed'"}class="active"{/if}>
<a href="#" onclick="Menu_ajaxGetFeed()" title="{$c->__('page.feed')}">
{$c->__('page.contacts')}
</a>
</li>
<li {if="$type == 'me'"}class="active"{/if}>
<a href="#" onclick="Menu_ajaxGetMe()" title="{$c->__('menu.mine')}">
{$c->__('page.blog')}
</a>
</li>
</ul>
</header>
{/if}
@ -26,11 +40,11 @@
{if="$items"}
{if="$page == 0"}
<div id="menu_refresh"></div>
<ul class="list card shadow active flex stacked" id="menu_wrapper">
<div class="list card shadow" id="menu_wrapper">
{/if}
{loop="$items"}
<li
<!--<li
tabindex="{$page*$paging+$key+1}"
class="block large"
data-id="{$value->nodeid}"
@ -127,19 +141,22 @@
</ul>
{/if}
</li>
</li>-->
{$c->preparePost($value)}
{/loop}
{if="count($items) == $paging"}
<li id="history" class="block large" onclick="{$history} this.parentNode.removeChild(this);">
<span class="icon primary gray">
<i class="zmdi zmdi-time-restore"></i>
</span>
<p class="normal center line">{$c->__('post.older')}</p>
</li>
<ul class="block list active thick">
<li id="history" class="block large" onclick="{$history} this.parentNode.removeChild(this);">
<span class="icon primary gray">
<i class="zmdi zmdi-time-restore"></i>
</span>
<p class="normal center">{$c->__('post.older')}</p>
</li>
</ul>
{/if}
{if="$page == 0"}
</ul>
</div>
{/if}
{elseif="$page == 0"}
<div id="menu_refresh"></div>

2
app/widgets/Menu/_menu_refresh.tpl

@ -1,4 +1,4 @@
<ul class="list card thin shadow flex stacked active">
<ul class="list card thick shadow active">
<li class="block large" onclick="{$refresh} Notification_ajaxClear('news');">
<span class="primary icon"><i class="zmdi zmdi-refresh-sync"></i></span>
<p>{$c->__('button.refresh')}</p>

4
app/widgets/Menu/menu.css

@ -1,7 +1,3 @@
#menu_widget {
background-color: #EEE;
}
#menu_widget #history {
padding-top: 2rem;
}

6
app/widgets/Navigation/navigation.tpl

@ -37,11 +37,11 @@
</a>
<a class="classic {if="!$c->supported('pubsub')"}disabled{/if}"
href="{$c->route('group')}"
title="{$c->__('page.groups')}">
title="{$c->__('page.communities')}">
<li {if="$page == 'group'"}class="active"{/if}>
<span class="primary icon"><i class="zmdi zmdi-pages"></i></span>
<span class="primary icon"><i class="zmdi zmdi-group-work"></i></span>
<span class="counter"></span>
<p class="normal">{$c->__('page.groups')}</p>
<p class="normal">{$c->__('page.communities')}</p>
</li>
</a>
<a class="classic" href="{$c->route('chat')}"

22
app/widgets/NewsNav/NewsNav.php

@ -0,0 +1,22 @@
<?php
class NewsNav extends \Movim\Widget\Base
{
public function load()
{
}
public function display()
{
$nd = new \Modl\PostnDAO;
$cd = new \Modl\ContactDAO;
$this->view->assign('presencestxt', getPresencesTxt());
$this->view->assign('top', $cd->getTop(6));
$this->view->assign('blogs', $nd->getLastBlogPublic(0, 3));
$this->view->assign('posts', $nd->getLastPublished(0, 2));
$this->view->assign('me', $cd->get($this->user->getLogin()), true);
$this->view->assign('jid', $this->user->getLogin());
}
}

115
app/widgets/NewsNav/newsnav.tpl

@ -0,0 +1,115 @@
<ul class="list thick">
<li>
<p class="line">
<h4 class="gray">{$c->__('post.blog_last')}</h4>
</p>
</li>
</ul>
<ul class="list active">
{loop="$blogs"}
{$attachments = $value->getAttachments()}
<li
class="block condensed"
data-id="{$value->nodeid}"
data-server="{$value->origin}"
data-node="{$value->node}">
<p class="line" {if="isset($value->title)"}title="{$value->title}"{/if}>
{if="isset($value->title)"}
{$value->title}
{else}
{$value->node}
{/if}
</p>
<p dir="auto">{$value->contentcleaned|strip_tags|truncate:140}</p>
<p>
<a href="{$c->route('contact', $value->getContact()->jid)}">
<i class="zmdi zmdi-account"></i> {$value->getContact()->getTrueName()}
</a>
{$count = $value->countComments()}
{if="$count > 0"}
{$count} <i class="zmdi zmdi-comment-outline"></i>
{/if}
<span class="info">
{$value->published|strtotime|prepareDate:true,true}
</span>
</p>
</li>
{/loop}
</ul>
{if="$c->supported('pubsub')"}
<ul class="list active on_desktop middle">
<a href="{$c->route('blog', array($jid))}" target="_blank">
<li>
<span class="primary icon">
<i class="zmdi zmdi-portable-wifi"></i>
</span>
<span class="control icon">
<i class="zmdi zmdi-chevron-right"></i>
</span>
<p class="normal line">{$c->__('hello.blog_title')}</p>
</li>
</a>
</ul>
{/if}
<ul class="list thick">
<li>
<p class="line">
<h4 class="gray">{$c->__('page.communities')}</h4>
</p>
</li>
</ul>
<ul class="list active">
{loop="$posts"}
<li
class="block condensed"
data-id="{$value->nodeid}"
data-server="{$value->origin}"
data-node="{$value->node}">
<p class="line" {if="isset($value->title)"}title="{$value->title}"{/if}>
{if="isset($value->title)"}
{$value->title}
{else}
{$value->node}
{/if}
</p>
<p dir="auto">{$value->contentcleaned|strip_tags|truncate:140}</p>
<p>
{$value->origin} /
<a href="{$c->route('group', [$value->origin, $value->node])}">
<i class="zmdi zmdi-pages"></i> {$value->node}
</a>
<span class="info">
{$value->published|strtotime|prepareDate}
</span>
</p>
</li>
{/loop}
</ul>
{if="$c->supported('pubsub')"}
<ul class="list active middle">
<a href="{$c->route('group')}">
<li>
<span class="primary icon"><i class="zmdi zmdi-pages"></i></span>
<span class="control icon">
<i class="zmdi zmdi-chevron-right"></i>
</span>
<p class="normal line">{$c->__('post.discover')}</p>
</li>
</a>
</ul>
<ul class="list thick on_desktop card">
<li class="block">
<p class="line">{$c->__('hello.share_title')}</p>
<p class="all">{$c->__('hello.share_text')}</p>
<p class="center">
<a class="button" onclick="return false;" href="javascript:(function(){location.href='{$c->route('share', '\'+encodeURIComponent(location.href);')}})();"><i class="zmdi zmdi-share"></i> {$c->__('button.share')}</a></p>
</li>
</ul>
{/if}

9
app/widgets/Post/Post.php

@ -220,7 +220,7 @@ class Post extends \Movim\Widget\Base
return $view->draw('_post_empty', true);
}
function preparePost($p, $external = false, $public = false)
function preparePost($p, $external = false, $public = false, $card = false)
{
$view = $this->tpl();
@ -244,7 +244,12 @@ class Post extends \Movim\Widget\Base
$view->assign('post', $p);
$view->assign('attachments', $p->getAttachments());
return $view->draw('_post', true);
if($card) {
return $view->draw('_post_card', true);
} else {
return $view->draw('_post', true);
}
} elseif(!$external) {
return $this->prepareEmpty();
}

2
app/widgets/Post/_post.tpl

@ -15,7 +15,7 @@
{if="!$external && !$public"}
<ul class="list middle">
<li>
<span class="primary icon active" onclick="MovimTpl.hidePanel(); Post_ajaxClear();">
<span class="primary icon gray active" onclick="history.back();">
<i class="zmdi zmdi-arrow-back"></i>
</span>

81
app/widgets/Post/_post_card.tpl

@ -0,0 +1,81 @@
<article class="block large">
<ul class="list thick">
<li>
<span class="primary icon gray">
{if="$post->isMicroblog()"}
<i class="zmdi zmdi-account"></i>
{else}
<i class="zmdi zmdi-group-work"></i>
{/if}
</span>
<p class="normal">{$post->title}</p>
<p>
{if="$post->isMicroblog()"}
<a href="{$c->route('contact', $post->getContact()->jid)}">
{$post->getContact()->getTrueName()}
</a> –
{else}
<a href="{$c->route('group', $post->origin)}">
{$post->origin}
</a> /
<a href="{$c->route('group', [$post->origin, $post->node])}">
{$post->node}
</a> –
{/if}
{$post->published|strtotime|prepareDate}
{if="$post->published != $post->updated"}
– <i class="zmdi zmdi-edit"></i> {$post->updated|strtotime|prepareDate:true,true}
{/if}
</p>
</li>
</ul>
<ul class="list">
<li class="active">
<p>
</p>
<p>
<section {if="!$post->isShort()"}class="limited"{/if}>
<content>
{if="$post->isShort() && isset($attachments.pictures)"}
{loop="$attachments.pictures"}
{if="$value.type != 'picture'"}
<a href="{$value.href}" class="alternate" target="_blank">
<img class="big_picture" type="{$value.type}" src="{$value.href|urldecode}"/>
</a>
{/if}
{/loop}
{/if}
{if="$post->getYoutube()"}
<div class="video_embed">
<iframe src="https://www.youtube.com/embed/{$post->getYoutube()}" frameborder="0" allowfullscreen></iframe>
</div>
{/if}
{$post->contentcleaned}
</content>
<section>
</p>
</li>
<li>
<p class="normal">
{$tags = $post->getTags()}
{if="isset($tags)"}
{loop="$tags"}
<a target="_blank" href="{$c->route('tag', [$value])}">#{$value}</a>
{/loop}
{/if}
</p>
<p class="normal">
<a class="button flat gray">
{$post->countComments()} <i class="zmdi zmdi-comment"></i>
</a>
<a class="button flat gray">
<i class="zmdi zmdi-share"></i>
</a>
<a class="button flat oppose" href="{$c->route('post', [$post->origin, $post->node, $post->nodeid])}">
Read more
</a>
</p>
</li>
</ul>
</article>

4
linker.php

@ -82,7 +82,7 @@ function writeXMPP($xml)
if(!empty($xml) && $conn) {
$conn->write(trim($xml));
#fwrite(STDERR, colorize(trim($xml), 'yellow')." : ".colorize('sent to XMPP', 'green')."\n");
fwrite(STDERR, colorize(trim($xml), 'yellow')." : ".colorize('sent to XMPP', 'green')."\n");
}
}
@ -194,7 +194,7 @@ $xmpp_behaviour = function (React\Stream\Stream $stream) use (&$conn, $loop, &$s
if(!empty($message)) {
$restart = false;
#fwrite(STDERR, colorize($message, 'yellow')." : ".colorize('received', 'green')."\n");
fwrite(STDERR, colorize($message, 'yellow')." : ".colorize('received', 'green')."\n");
if($message == '</stream:stream>') {
$conn->close();

1
locales/locales.ini

@ -6,6 +6,7 @@ loading = Loading…
[page]
account = Account
administration = Administration
communities = Communities
home = Home
explore = Explore
account_creation = Account Creation

5
src/Movim/Bootstrap.php

@ -307,8 +307,9 @@ class Bootstrap
public function getWidgets()
{
// Return a list of interesting widgets to load (to save memory)
return["Account","AccountNext","Ack","AdHoc","Avatar","Bookmark","Chat",
"Chats","Config","Contact","Dialog","Drawer","Group","Groups","Header",
return["Account","AccountNext","Ack","AdHoc","Avatar","Bookmark","Communities",
"CommunityAffiliations","CommunityData","CommunityHeader","CommunitiesServer","Chat",
"Chats","Config","Contact","Dialog","Drawer","Group","Header",
"Init","Login","LoginAnonymous","Menu","Notifs","Post","Presence",
"Publish","Rooms","Roster","Stickers","Upload","Vcard4", "Visio",
"VisioLink"];

1
src/Movim/Route.php

@ -30,6 +30,7 @@ class Route extends Base
'infos' => false,
'login' => ['err'],
'news' => ['s', 'n', 'i'],
'post' => ['s', 'n', 'i'],
'room' => ['r'],
'share' => ['url'],
'visio' => false

23
themes/material/css/article.css

@ -18,6 +18,29 @@ article section {
padding-top: 2rem;
}
article section.limited {
display: block;
max-height: 80rem;
overflow: hidden;
}
article section.limited:after {
content: "";
display: block;
background: linear-gradient(to bottom, rgba(255, 255, 255, 0), white);
width: 100%;
height: 5rem;
position: absolute;
bottom: 0;
pointer-events: none;
}
@media screen and (max-width: 1024px) {
article section.limited {
max-height: 40rem;
}
}
article img,
article video {
max-width: 100%;

4
themes/material/css/icon.css

@ -24,6 +24,10 @@ span.icon.top {
left: 0;
}
span.icon.top.preview {
height: 25rem;
}
span.icon.primary.thumb {
left: 0;
width: 7rem;

2
themes/material/css/listn.css

@ -69,7 +69,7 @@ ul.list.thick li .primary:not(.bubble):not(.thumb):not(.top) {
padding: 1.75rem 0.5rem;
}
ul.list > li > *:not(img):not(.counter):not(span):not(.bubble):not(.button):not(ul),
ul.list > li > *:not(img):not(.counter):not(span):not(.bubble):not(.button):not(ul):not(article),
ul.list li.subheader p {
box-sizing: border-box;
padding-right: 2rem;

33
themes/material/css/style.css

@ -193,12 +193,33 @@ main > section > div:first-child:nth-last-child(2) ~ div {
width: 70%;
position: absolute;
right: 0;
/*transition: left .3s cubic-bezier(.4,0,.2,1);*/
}
@media screen and (min-width: 1025px) {
main > section > aside {
width: 33%;
right: 0;
position: absolute;
margin-right: 2%;
}
main > section > aside > * {
max-width: 40rem;
}
main > section > aside + div {
width: 100%;
}
main > section > aside + div > * {
margin-right: 35%;
margin-left: auto;
}
}
/*
main > section > div:first-child:nth-last-child(2) ~ div {
background-color: white;
}
}*/
main > section > div > div.contained { /* Specific behaviour when the scroll need to be inside the block */
height: calc(100% - 7.5rem);
@ -245,6 +266,14 @@ main > section > div > div.contained > * {
body > nav {
width: 0;
}
aside {
display: none;
}
main > section:not(.enabled) > aside + div:not(:first-child) {
display: block;
}
}
main footer {

Loading…
Cancel
Save