%PDF- %PDF-
Direktori : /home/vacivi36/intranet.vacivitta.com.br/protected/humhub/modules/marketplace/ |
Current File : /home/vacivi36/intranet.vacivitta.com.br/protected/humhub/modules/marketplace/Events.php |
<?php /** * @link https://www.humhub.org/ * @copyright Copyright (c) 2019 HumHub GmbH & Co. KG * @license https://www.humhub.com/licences */ namespace humhub\modules\marketplace; use humhub\components\Module as CoreModule; use humhub\components\OnlineModule; use humhub\modules\admin\events\ModulesEvent; use humhub\modules\admin\libs\HumHubAPI; use humhub\modules\admin\widgets\ModuleControls; use humhub\modules\admin\widgets\ModuleFilters; use humhub\modules\admin\widgets\Modules; use humhub\modules\marketplace\models\Module as ModelModule; use yii\helpers\Url; use humhub\modules\ui\icon\widgets\Icon; use humhub\modules\ui\menu\MenuLink; use humhub\widgets\Button; use Yii; use yii\base\BaseObject; use yii\base\Event; class Events extends BaseObject { /** * On console application initialization * * @param Event $event */ public static function onConsoleApplicationInit($event) { if (!self::getEnabledMarketplaceModule()) { return; } $application = $event->sender; $application->controllerMap['module'] = commands\MarketplaceController::class; } public static function onHourlyCron($event) { Yii::$app->queue->push(new jobs\PeActiveCheckJob()); Yii::$app->queue->push(new jobs\ModuleCleanupsJob()); } private static function getEnabledMarketplaceModule(): ?Module { /* @var Module $marketplaceModule */ $marketplaceModule = Yii::$app->getModule('marketplace'); return $marketplaceModule->enabled ? $marketplaceModule : null; } public static function onAdminModuleFiltersInit($event) { if (!($marketplaceModule = self::getEnabledMarketplaceModule())) { return; } /* @var ModuleFilters $moduleFilters */ $moduleFilters = $event->sender; $marketplaceModule->onlineModuleManager->getModules(); $categories = $marketplaceModule->onlineModuleManager->getCategories(); if (!empty($categories)) { $moduleFilters->addFilter('categoryId', [ 'title' => Yii::t('MarketplaceModule.base', 'Categories'), 'type' => 'dropdown', 'options' => $categories, 'wrapperClass' => 'col-md-3', 'sortOrder' => 200, ]); } $moduleFilters->addFilter('tags', [ 'title' => Yii::t('MarketplaceModule.base', 'Tags'), 'type' => 'tags', 'tags' => [ '' => Yii::t('MarketplaceModule.base', 'All'), 'installed' => Yii::t('MarketplaceModule.base', 'Installed'), 'not_installed' => Yii::t('MarketplaceModule.base', 'Not Installed'), 'professional' => Yii::t('MarketplaceModule.base', 'Professional Edition'), 'featured' => Yii::t('MarketplaceModule.base', 'Featured'), 'official' => Yii::t('MarketplaceModule.base', 'Official'), 'partner' => Yii::t('MarketplaceModule.base', 'Partner'), 'new' => Yii::t('MarketplaceModule.base', 'New'), ], 'wrapperClass' => 'col-md-12 form-search-filter-tags', 'sortOrder' => 20000, ]); } public static function onAdminModuleFiltersAfterRun($event) { if (!self::getEnabledMarketplaceModule()) { return; } $latestVersion = HumHubAPI::getLatestHumHubVersion(); if (!$latestVersion) { return; } if (version_compare($latestVersion, Yii::$app->version, '>')) { $updateUrl = 'https://docs.humhub.org/docs/admin/updating/'; if (Yii::$app->hasModule('updater')) { $updateUrl = Url::to(['/updater/update']); } $info = [ 'class' => 'directory-filters-footer-warning', 'icon' => 'info-circle', 'info' => Yii::t('MarketplaceModule.base', 'A new update is available (HumHub %version%)!', ['%version%' => $latestVersion]), 'link' => Button::asLink(Yii::t('MarketplaceModule.base', 'Learn more'), $updateUrl) ->cssClass('btn btn-primary'), ]; } else { $info = [ 'class' => 'directory-filters-footer-info', 'icon' => 'check-circle', 'info' => Yii::t('MarketplaceModule.base', 'Your HumHub installation is up to date!'), 'link' => Button::asLink('https://www.humhub.com', 'https://www.humhub.com') ->cssClass('btn btn-info'), ]; } /* @var ModuleFilters $moduleFilters */ $moduleFilters = $event->sender; $event->result .= $moduleFilters->render('@humhub/modules/marketplace/widgets/views/moduleUpdateInfo', $info); } public static function onAdminModulesInit($event) { if (!($marketplaceModule = self::getEnabledMarketplaceModule())) { return; } /* @var Modules $modulesWidget */ $modulesWidget = $event->sender; $updateModules = $marketplaceModule->onlineModuleManager->getAvailableUpdateModules(); if ($updateModulesCount = count($updateModules)) { $updateAllButton = Button::primary(Yii::t('MarketplaceModule.base', 'Update all')) ->options([ 'data-stop-title' => Icon::get('pause') . ' ' . Yii::t('MarketplaceModule.base', 'Stop updating'), 'data-stop-class' => 'btn btn-warning pull-right', ]) ->action('marketplace.updateAll') ->loader(false) ->cssClass('active pull-right'); $modulesWidget->addGroup('availableUpdates', [ 'title' => Yii::t('MarketplaceModule.base', 'Available Updates'), 'modules' => $updateModules, 'count' => $updateModulesCount, 'view' => '@humhub/modules/marketplace/widgets/views/moduleUpdateCard', 'groupTemplate' => '<div class="container-module-updates">' . $updateAllButton . '{group}</div>', 'moduleTemplate' => '<div class="card card-module col-lg-2 col-md-3 col-sm-4 col-xs-6">{card}</div>', 'sortOrder' => 10, ]); } if (!$marketplaceModule->isFilteredBySingleTag('installed')) { $onlineModules = $marketplaceModule->onlineModuleManager->getNotInstalledModules(); if ($onlineModulesCount = count($onlineModules)) { $modulesWidget->addGroup('notInstalled', [ 'title' => Yii::t('AdminModule.modules', 'Not Installed'), 'modules' => Yii::$app->moduleManager->filterModules($onlineModules), 'count' => $onlineModulesCount, 'view' => '@humhub/modules/marketplace/widgets/views/moduleInstallCard', 'sortOrder' => 200, ]); } } } public static function onAdminModuleManagerAfterFilterModules(ModulesEvent $event) { if (!self::getEnabledMarketplaceModule()) { return; } if (!is_array($event->modules)) { return; } foreach ($event->modules as $m => $module) { if (!self::isFilteredModule($module)) { unset($event->modules[$m]); } } } /** * @param CoreModule|ModelModule $module * @return bool */ private static function isFilteredModule($module): bool { return self::isFilteredModuleByCategory($module) && self::isFilteredModuleByTags($module); } /** * @param CoreModule|ModelModule $module * @return bool */ private static function isFilteredModuleByCategory($module): bool { $categoryId = Yii::$app->request->get('categoryId', null); if (empty($categoryId)) { return true; } $moduleCategories = (new OnlineModule(['module' => $module]))->categories; return empty($moduleCategories) ? false : in_array($categoryId, $moduleCategories); } /** * @param CoreModule|ModelModule $module * @return bool */ private static function isFilteredModuleByTags($module): bool { $tags = Yii::$app->request->get('tags', null); if (empty($tags)) { return true; } $tags = explode(',', $tags); $onlineModule = new OnlineModule(['module' => $module]); $searchInstalled = in_array('installed', $tags); $searchNotInstalled = in_array('not_installed', $tags); if ($searchInstalled && $searchNotInstalled && count($tags) === 2) { // No need to filter when only 2 tags "Installed" and "Not Installed" are selected return true; } if ($searchInstalled && !$searchNotInstalled && !$onlineModule->isInstalled) { // Exclude all NOT Installed modules when requested only Installed modules return false; } if (!$searchInstalled && $searchNotInstalled && $onlineModule->isInstalled) { // Exclude all Installed modules when requested only NOT Installed modules return false; } if (($searchInstalled || $searchNotInstalled) && count($tags) === 1) { // No need to next filter when only 1 tag "Installed" or "Not Installed" is selected return true; } foreach ($tags as $tag) { switch ($tag) { case 'professional': if ($onlineModule->isProOnly) { return true; } break; case 'featured': if ($onlineModule->isFeatured) { return true; } break; case 'official': if (!$onlineModule->isThirdParty) { return true; } break; case 'partner': if ($onlineModule->isPartner) { return true; } break; case 'new': // TODO: Filter by new status break; } } return false; } public static function onAdminModuleControlsInit($event) { if (!self::getEnabledMarketplaceModule()) { return; } /* @var ModuleControls $moduleControls */ $moduleControls = $event->sender; $module = $moduleControls->module; if (!($module instanceof ModelModule)) { return; } /** @var \humhub\modules\marketplace\models\Module $module */ if ($module->isNonFree) { $moduleControls->addEntry(new MenuLink([ 'id' => 'marketplace-licence-key', 'label' => Yii::t('MarketplaceModule.base', 'Add Licence Key'), 'url' => ['/marketplace/purchase'], 'htmlOptions' => ['data-target' => '#globalModal'], 'icon' => 'key', 'sortOrder' => 1000, ])); } if ($module->isThirdParty) { $moduleControls->addEntry(new MenuLink([ 'id' => 'marketplace-third-party', 'label' => Yii::t('MarketplaceModule.base', 'Third-party') . ($module->isCommunity ? ' - ' . Yii::t('MarketplaceModule.base', 'Community') : ''), 'url' => ['/marketplace/browse/thirdparty-disclaimer'], 'htmlOptions' => ['data-target' => '#globalModal'], 'icon' => 'info-circle', 'sortOrder' => 1100, ])); } } }