%PDF- %PDF-
| Direktori : /home/vacivi36/intranet.vacivitta.com.br/protected/humhub/modules/space/widgets/ |
| Current File : /home/vacivi36/intranet.vacivitta.com.br/protected/humhub/modules/space/widgets/Chooser.php |
<?php
namespace humhub\modules\space\widgets;
use humhub\components\Widget;
use humhub\modules\content\components\ContentContainerController;
use humhub\modules\space\assets\SpaceChooserAsset;
use humhub\modules\space\models\Membership;
use humhub\modules\space\models\Space;
use humhub\modules\space\permissions\CreatePrivateSpace;
use humhub\modules\space\permissions\CreatePublicSpace;
use humhub\modules\space\permissions\SpaceDirectoryAccess;
use humhub\modules\user\components\PermissionManager;
use humhub\modules\user\models\Follow;
use Yii;
use yii\db\Query;
use yii\helpers\Html;
use yii\helpers\Url;
/**
* Class Chooser
* @package humhub\modules\space\widgets
*/
class Chooser extends Widget
{
/**
* @var bool
* @since 1.10
*/
public $lazyLoad = true;
/**
* @var string
*/
public $viewName = '@space/widgets/views/spaceChooser';
/**
* @return bool
*/
public function beforeRun()
{
if (!$this->canRun()) {
return false;
}
$this->configure();
return parent::beforeRun();
}
/**
* @inheritdoc
* @throws \Throwable
* @throws \yii\base\InvalidConfigException
*/
public function run()
{
return $this->render($this->viewName, $this->getViewParams());
}
/**
* @return bool
*/
protected function canRun()
{
return !Yii::$app->user->isGuest;
}
/**
* Configure widget before run, used to register assets and js config
*/
protected function configure()
{
SpaceChooserAsset::register($this->view);
$this->view->registerJsConfig('space.chooser', $this->getJsConfigParams());
}
/**
* @return array
* @throws \Throwable
* @throws \yii\base\InvalidConfigException
*/
protected function getViewParams()
{
return [
'currentSpace' => $this->getCurrentSpace(),
'canCreateSpace' => $this->canCreateSpace(),
'canAccessDirectory' => Yii::$app->user->can(SpaceDirectoryAccess::class),
'renderedItems' => $this->renderItems(),
'noSpaceHtml' => $this->getNoSpaceHtml(),
];
}
/**
* @return array
*/
protected function getJsConfigParams()
{
return [
'lazyLoad' => $this->lazyLoad,
'noSpace' => $this->getNoSpaceHtml(),
'remoteSearchUrl' => Url::to(['/space/browse/search-json']),
'lazySearchUrl' => Url::to(['/space/browse/search-lazy']),
'text' => [
'info.remoteAtLeastInput' => Yii::t('SpaceModule.chooser', 'To search for other spaces, type at least {count} characters.', ['count' => 2]),
'info.emptyOwnResult' => Yii::t('SpaceModule.chooser', 'No member or following spaces found.'),
'info.emptyResult' => Yii::t('SpaceModule.chooser', 'No result found for the given filter.'),
],
];
}
/**
* @return string
*/
protected function getNoSpaceHtml()
{
$html = '<i class="fa fa-dot-circle-o"></i><br>' . Yii::t('SpaceModule.chooser', 'My spaces') . '<b class="caret"></b>';
return Html::tag('div', $html, ['class' => 'no-space']);
}
/**
* @param string $output
* @return mixed|string
* @throws \Throwable
*/
protected function renderItems($output = '')
{
if ($this->lazyLoad) {
return $output;
}
// render membership items
foreach ($this->getMemberships() as $membership) {
$result = SpaceChooserItem::widget([
'space' => $membership->space, 'updateCount' => $membership->countNewItems(), 'isMember' => true
]);
$output = $this->attachItem($output, $result);
}
// render follow spaces
foreach ($this->getFollowSpaces() as $space) {
$result = SpaceChooserItem::widget(['space' => $space, 'isFollowing' => true]);
$output = $this->attachItem($output, $result);
}
return $output;
}
/**
* If array passed to ouput, it will be added as ['output' => 'string']
* This is used for passing rendered items as json array to lazy load
* See getLazyLoadResult of the same class
*
* @param $output
* @param $result
* @return mixed|string
*/
protected function attachItem($output, $result)
{
if (is_array($output)) {
$output[] = ['output' => $result];
} elseif (is_string($output)) {
$output .= $result;
}
return $output;
}
/**
* @return Space[]
* @throws \Throwable
*/
protected function getFollowSpaces()
{
if (!Yii::$app->user->isGuest) {
return Follow::getFollowedSpacesQuery(Yii::$app->user->getIdentity())->all();
}
return [];
}
/**
* @return Membership[]
* @throws \Throwable
*/
protected function getMemberships()
{
if (!Yii::$app->user->isGuest) {
return Membership::findByUser(Yii::$app->user->getIdentity())->all();
}
return [];
}
/**
* @return bool
* @throws \yii\base\InvalidConfigException
*/
protected function canCreateSpace()
{
/** @var PermissionManager $manager */
$manager = Yii::$app->user->permissionmanager;
return $manager->can(new CreatePublicSpace) || $manager->can(new CreatePrivateSpace());
}
/**
* @return Space | null
*/
protected function getCurrentSpace()
{
if (!Yii::$app->controller instanceof ContentContainerController) {
return null;
}
if ((Yii::$app->controller->contentContainer ?? null) instanceof Space) {
return Yii::$app->controller->contentContainer;
}
return null;
}
/**
* Returns the membership query
*
* @return Query
* @deprecated since version 1.2
*/
protected function getMembershipQuery()
{
$query = Membership::find()->joinWith('space')
->where(['space_membership.user_id' => Yii::$app->user->id, 'space_membership.status' => Membership::STATUS_MEMBER]);
if (Yii::$app->getModule('space')->settings->get('spaceOrder') == 0) {
$query->orderBy('name ASC');
} else {
$query->orderBy('last_visit DESC');
}
return $query;
}
/**
* @param Space $space
* @param bool $withChooserItem
* @param array $itemOptions
* @return array
* @throws \Exception
*/
public static function getSpaceResult($space, $withChooserItem = true, $itemOptions = [])
{
$spaceInfo = [
'guid' => $space->guid, 'title' => $space->name, 'tags' => Html::encode(implode(', ', $space->getTags())),
'image' => Image::widget(['space' => $space, 'width' => 24]), 'link' => $space->getUrl(),
];
if ($withChooserItem) {
$options = array_merge(['space' => $space, 'isMember' => false, 'isFollowing' => false], $itemOptions);
$spaceInfo['output'] = SpaceChooserItem::widget($options);
}
return $spaceInfo;
}
/**
* @return mixed|string
* @throws \Throwable
*/
public static function getLazyLoadResult()
{
$widget = new self(['lazyLoad' => false]);
return $widget->renderItems([]);
}
}