diff --git a/app/Foundation/Providers/AppServiceProvider.php b/app/Foundation/Providers/AppServiceProvider.php index 40c35aa4..8b7c9757 100644 --- a/app/Foundation/Providers/AppServiceProvider.php +++ b/app/Foundation/Providers/AppServiceProvider.php @@ -15,6 +15,7 @@ use AltThree\Bus\Dispatcher; use CachetHQ\Cachet\Bus\Middleware\UseDatabaseTransactions; use CachetHQ\Cachet\Dates\DateFactory; use CachetHQ\Cachet\Integrations\Credits; +use CachetHQ\Cachet\Integrations\Feed; use CachetHQ\Cachet\Integrations\Releases; use Illuminate\Support\ServiceProvider; use Illuminate\Support\Str; @@ -55,6 +56,7 @@ class AppServiceProvider extends ServiceProvider { $this->registerDateFactory(); $this->registerCredits(); + $this->registerFeed(); $this->registerReleases(); } @@ -87,6 +89,20 @@ class AppServiceProvider extends ServiceProvider }); } + /** + * Register the feed class. + * + * @return void + */ + protected function registerFeed() + { + $this->app->singleton(Feed::class, function ($app) { + $cache = $app['cache.store']; + + return new Feed($cache); + }); + } + /** * Register the releases class. * diff --git a/app/Http/Controllers/Dashboard/DashboardController.php b/app/Http/Controllers/Dashboard/DashboardController.php index ec103531..dcb60c92 100644 --- a/app/Http/Controllers/Dashboard/DashboardController.php +++ b/app/Http/Controllers/Dashboard/DashboardController.php @@ -11,6 +11,7 @@ namespace CachetHQ\Cachet\Http\Controllers\Dashboard; +use CachetHQ\Cachet\Integrations\Feed; use CachetHQ\Cachet\Models\Component; use CachetHQ\Cachet\Models\Incident; use CachetHQ\Cachet\Models\Subscriber; @@ -36,12 +37,22 @@ class DashboardController extends Controller protected $timeZone; /** - * Creates a new dashboard controller. + * The feed integration. + * + * @var \CachetHQ\Cachet\Integrations\Feed + */ + protected $feed; + + /** + * Creates a new dashboard controller instance. + * + * @param \CachetHQ\Cachet\Integrations\Feed $feed * * @return void */ - public function __construct() + public function __construct(Feed $feed) { + $this->feed = $feed; $this->startDate = new Date(); $this->dateTimeZone = Config::get('cachet.timezone'); } @@ -56,12 +67,16 @@ class DashboardController extends Controller $components = Component::orderBy('order')->get(); $incidents = $this->getIncidents(); $subscribers = $this->getSubscribers(); + $feed = $this->feed->entries(); + + $entries = array_slice($feed->channel->item, 0, 5); return View::make('dashboard.index') ->withPageTitle(trans('dashboard.dashboard')) ->withComponents($components) ->withIncidents($incidents) - ->withSubscribers($subscribers); + ->withSubscribers($subscribers) + ->withEntries($entries); } /** diff --git a/app/Integrations/Feed.php b/app/Integrations/Feed.php new file mode 100644 index 00000000..9be9c474 --- /dev/null +++ b/app/Integrations/Feed.php @@ -0,0 +1,74 @@ + + */ +class Feed +{ + /** + * The default url. + * + * @var string + */ + const URL = 'https://blog.alt-three.com/tag/cachet/rss'; + + /** + * The cache repository instance. + * + * @var \Illuminate\Contracts\Cache\Repository + */ + protected $cache; + + /** + * The url to use. + * + * @var string|null + */ + protected $url; + + /** + * Creates a new feed instance. + * + * @param \Illuminate\Contracts\Cache\Repository $cache + * @param string|null $url + * + * @return void + */ + public function __construct(Repository $cache, $url = null) + { + $this->cache = $cache; + $this->url = $url ?: static::URL; + } + + /** + * Returns the entries. + * + * @return array + */ + public function entries() + { + return $this->cache->remember('feeds', 2880, function () { + $xml = simplexml_load_string((new Client())->get($this->url, [ + 'headers' => ['Accept' => 'application/rss+xml', 'User-Agent' => defined('CACHET_VERSION') ? 'cachet/'.constant('CACHET_VERSION') : 'cachet'], + ])->getBody()->getContents(), null, LIBXML_NOCDATA); + + return json_decode(json_encode($xml)); + }); + } +} diff --git a/resources/assets/sass/modules/_stats.scss b/resources/assets/sass/modules/_stats.scss index 160ddf56..da60616f 100644 --- a/resources/assets/sass/modules/_stats.scss +++ b/resources/assets/sass/modules/_stats.scss @@ -40,6 +40,28 @@ padding-top: 10px; } + .stats-body { + margin-top: -20px; + padding-top: 10px; + + .list-group { + border: none; + padding-bottom: 0; + margin-bottom: 0; + + .list-group-item { + border-right: none; + border-left: none; + + border-color: #eee; + + &:last-child { + border-bottom: none; + } + } + } + } + .stats-bottom { border-top: #eee 1px solid; color: #777; diff --git a/resources/lang/en/dashboard.php b/resources/lang/en/dashboard.php index 54270b24..0078d64f 100755 --- a/resources/lang/en/dashboard.php +++ b/resources/lang/en/dashboard.php @@ -249,6 +249,14 @@ return [ 'whoops' => 'Whoops.', ], + // Widgets + 'widgets' => [ + 'support' => 'Support Cachet', + 'support_subtitle' => 'Check out our Patreon page!', + 'news' => 'Latest News', + 'news_subtitle' => 'Get the latest updates', + ], + // Welcome modal 'welcome' => [ 'welcome' => 'Welcome to your new status page!', diff --git a/resources/views/dashboard/index.blade.php b/resources/views/dashboard/index.blade.php index 1f98adf8..cbc07663 100644 --- a/resources/views/dashboard/index.blade.php +++ b/resources/views/dashboard/index.blade.php @@ -1,86 +1,113 @@ @extends('layout.dashboard') @section('content') -