diff --git a/protected/humhub/docs/CHANGELOG_DEV.md b/protected/humhub/docs/CHANGELOG_DEV.md index d15c255bec..c5429df581 100644 --- a/protected/humhub/docs/CHANGELOG_DEV.md +++ b/protected/humhub/docs/CHANGELOG_DEV.md @@ -16,3 +16,5 @@ HumHub Change Log - Fix #4199: Pinned posts of other spaces are excluded from profile stream - Enh #3995: Added additional user profile stream filter to include or exclude non profile stream content - Enh: Added `humhub\modules\stream\actions\Stream:initQuery` to manage query filter in subclasses +- Enh: Make profile content archivable +- Enh: Archived stream filter now only included archived content diff --git a/protected/humhub/modules/stream/actions/Stream.php b/protected/humhub/modules/stream/actions/Stream.php index 1292c8736d..9675357031 100644 --- a/protected/humhub/modules/stream/actions/Stream.php +++ b/protected/humhub/modules/stream/actions/Stream.php @@ -223,7 +223,7 @@ abstract class Stream extends Action $streamQueryClass = $this->streamQueryClass; /* @var $instance StreamQuery */ $instance = $streamQueryClass::find($this->includes, $this->excludes)->forUser($this->user); - $instance->setAttributes($options); + $instance->setAttributes($options, false); return $instance; } diff --git a/protected/humhub/modules/stream/models/filters/DefaultStreamFilter.php b/protected/humhub/modules/stream/models/filters/DefaultStreamFilter.php index c04c91fcff..35b6b27aeb 100644 --- a/protected/humhub/modules/stream/models/filters/DefaultStreamFilter.php +++ b/protected/humhub/modules/stream/models/filters/DefaultStreamFilter.php @@ -61,8 +61,10 @@ class DefaultStreamFilter extends StreamQueryFilter $this->filterFile(); } - // Only apply archived filter when we should load more than one entry - if (!$this->streamQuery->isSingleContentQuery() && !$this->isFilterActive(self::FILTER_ARCHIVED)) { + if ($this->isFilterActive(self::FILTER_ARCHIVED)) { + $this->filterArchived(); + } else if(!$this->streamQuery->isSingleContentQuery()) { + // Only omit archived content by default when we load more than one entry $this->unFilterArchived(); } @@ -108,6 +110,12 @@ class DefaultStreamFilter extends StreamQueryFilter return $this; } + protected function filterArchived() + { + $this->query->andWhere("(content.archived = 1)"); + return $this; + } + protected function filterMine() { if ($this->streamQuery->user) { diff --git a/protected/humhub/modules/stream/widgets/WallStreamFilterNavigation.php b/protected/humhub/modules/stream/widgets/WallStreamFilterNavigation.php index 6bc4121eee..147437be46 100644 --- a/protected/humhub/modules/stream/widgets/WallStreamFilterNavigation.php +++ b/protected/humhub/modules/stream/widgets/WallStreamFilterNavigation.php @@ -72,6 +72,7 @@ class WallStreamFilterNavigation extends FilterNavigation const FILTER_BLOCK_BASIC = 'basic'; const FILTER_BLOCK_VISIBILITY = 'visibility'; const FILTER_BLOCK_SORTING = 'sorting'; + const FILTER_BLOCK_SCOPE = 'scope'; const FILTER_BLOCK_CONTENT_TYPE = 'contentType'; const FILTER_BLOCK_TOPIC = 'topics'; const FILTER_BLOCK_ORIGINATORS = 'originators'; @@ -183,6 +184,12 @@ class WallStreamFilterNavigation extends FilterNavigation 'title' => Yii::t('ContentModule.base', 'With file attachments'), 'sortOrder' => 300 ], static::FILTER_BLOCK_BASIC); + + $this->addFilter([ + 'id' => static::FILTER_ARCHIVED, + 'title' => Yii::t('ContentModule.base', 'Archived'), + 'sortOrder' => 200 + ], static::FILTER_BLOCK_BASIC); } protected function initVisibilityFilters() @@ -192,7 +199,7 @@ class WallStreamFilterNavigation extends FilterNavigation // Private spaces do not have public content if($container && $container->canAccessPrivateContent() && ($container instanceof User - || ($container instanceof Space && $container->visibility != Space::VISIBILITY_NONE))) { + || ($container instanceof Space && $container->visibility !== Space::VISIBILITY_NONE))) { $this->addFilter([ 'id' => static::FILTER_VISIBILITY_PUBLIC, @@ -212,12 +219,6 @@ class WallStreamFilterNavigation extends FilterNavigation 'sortOrder' => 200 ], static::FILTER_BLOCK_VISIBILITY); } - - $this->addFilter([ - 'id' => static::FILTER_ARCHIVED, - 'title' => Yii::t('ContentModule.base', 'Include archived content'), - 'sortOrder' => 200 - ], static::FILTER_BLOCK_VISIBILITY); } protected function initSortFilters() diff --git a/protected/humhub/modules/user/stream/ProfileStreamQuery.php b/protected/humhub/modules/user/stream/ProfileStreamQuery.php index 8be70b5d5c..323529cd3a 100644 --- a/protected/humhub/modules/user/stream/ProfileStreamQuery.php +++ b/protected/humhub/modules/user/stream/ProfileStreamQuery.php @@ -30,9 +30,13 @@ class ProfileStreamQuery extends ContentContainerStreamQuery { parent::beforeApplyFilters(); $this->removeFilterHandler(ContentContainerStreamFilter::class); + + // The default scope may be overwritten by first request, the real default is handled in the stream filter navigation $this->addFilterHandler(new IncludeAllContributionsFilter([ 'container' => $this->container, - 'filters' => $this->includeContributions ? [IncludeAllContributionsFilter::ID] : [] + 'scope' => $this->includeContributions + ? IncludeAllContributionsFilter::SCOPE_PROFILE + : IncludeAllContributionsFilter::SCOPE_ALL ])); } } diff --git a/protected/humhub/modules/user/stream/filters/IncludeAllContributionsFilter.php b/protected/humhub/modules/user/stream/filters/IncludeAllContributionsFilter.php index cf723cc7b1..6f62e5d879 100644 --- a/protected/humhub/modules/user/stream/filters/IncludeAllContributionsFilter.php +++ b/protected/humhub/modules/user/stream/filters/IncludeAllContributionsFilter.php @@ -8,18 +8,23 @@ use humhub\modules\user\models\User; use Yii; /** - * Class IncludeAllContributionsFilter - * @package humhub\modules\user\stream\filters + * This stream query filter manages the scope of a profile stream. This filter supports two scopes + * + * - `StreamQuery[scope] = 'all'`: Include all user related contributions + * - `StreamQuery[scope] = 'profile'`: Only include profile posts + * + * @since 1.6 */ class IncludeAllContributionsFilter extends ContentContainerStreamFilter { - const ID = 'includeAllContributions'; + const SCOPE_ALL = 'all'; + const SCOPE_PROFILE = 'profile'; /** * @var array */ - public $filters = []; + public $scope; /** * @inheritdoc @@ -27,7 +32,7 @@ class IncludeAllContributionsFilter extends ContentContainerStreamFilter public function rules() { return [ - [['filters'], 'safe'] + [['scope'], 'safe'], ]; } @@ -79,8 +84,11 @@ class IncludeAllContributionsFilter extends ContentContainerStreamFilter $this->query->andWhere("{$conditionSpace} OR {$conditionUser} OR content.contentcontainer_id IS NULL"); } + /** + * @return bool whether or not the include all filter is active or not + */ public function isActive() { - return $this->container instanceof User && $this->streamQuery->user !== null && in_array(static::ID, $this->filters); + return $this->container instanceof User && $this->streamQuery->user !== null && $this->scope === static::SCOPE_ALL; } } diff --git a/protected/humhub/modules/user/widgets/ProfileStreamFilterNavigation.php b/protected/humhub/modules/user/widgets/ProfileStreamFilterNavigation.php index b0cc4a9f16..e6d65f065d 100644 --- a/protected/humhub/modules/user/widgets/ProfileStreamFilterNavigation.php +++ b/protected/humhub/modules/user/widgets/ProfileStreamFilterNavigation.php @@ -5,19 +5,64 @@ namespace humhub\modules\user\widgets; use humhub\modules\stream\widgets\WallStreamFilterNavigation; +use humhub\modules\ui\filter\widgets\RadioFilterInput; use humhub\modules\user\Module; use humhub\modules\user\stream\filters\IncludeAllContributionsFilter; use Yii; +/** + * Stream filter navigation for profile streams. The profile stream adds some additional filters as a scope. + */ class ProfileStreamFilterNavigation extends WallStreamFilterNavigation { + /** + * Extra filter category for profile scope + * @since 1.6 + */ + const FILTER_BLOCK_SCOPE = 'scope'; + + /** + * @inheritDoc + */ + protected function initFilterBlocks() + { + parent::initFilterBlocks(); + $this->initScopeFilterBlock(); + } + + /** + * Initializes the profile scope filter block + * @since 1.6 + */ + protected function initScopeFilterBlock() + { + if(!$this->isScopeFilterSupported()) { + return; + } + + $this->addFilterBlock('scope', [ + 'title' => Yii::t('StreamModule.filter', 'Scope'), + 'sortOrder' => 90 + ], static::PANEL_POSITION_CENTER); + } + + /** + * @inheritDoc + */ protected function initFilters() { parent::initFilters(); + $this->initScopeFilter(); + } - // IncludeAllContributionsFilter currently only supported for non guest users - if(Yii::$app->user->isGuest) { + /** + * Initializes the profile scope filter + * @since 1.6 + */ + protected function initScopeFilter() + { + if(!$this->isScopeFilterSupported()) { return; } @@ -25,11 +70,33 @@ class ProfileStreamFilterNavigation extends WallStreamFilterNavigation $module = Yii::$app->getModule('user'); $this->addFilter([ - 'id' => IncludeAllContributionsFilter::ID, - 'title' => Yii::t('UserModule.base', 'Include all content'), + 'id' => IncludeAllContributionsFilter::SCOPE_ALL, + 'title' => Yii::t('UserModule.base', 'Show all content'), + 'class' => RadioFilterInput::class, + 'category' => 'scope', + 'radioGroup' => 'scope', + 'force' => true, 'sortOrder' => 500, 'checked' => $module->includeAllUserContentsOnProfile - ], static::FILTER_BLOCK_BASIC); + ], static::FILTER_BLOCK_SCOPE); + + $this->addFilter([ + 'id' => IncludeAllContributionsFilter::SCOPE_PROFILE, + 'title' => Yii::t('UserModule.base', 'Profile posts only'), + 'class' => RadioFilterInput::class, + 'category' => 'scope', + 'radioGroup' => 'scope', + 'force' => true, + 'sortOrder' => 510, + 'checked' => !$module->includeAllUserContentsOnProfile + ], static::FILTER_BLOCK_SCOPE); } + /** + * @return bool scope filter is currently not supported for guest users + */ + protected function isScopeFilterSupported() + { + return !Yii::$app->user->isGuest; + } }