From 5a9fcbabb35695e0df7a849dd31ce718e1769238 Mon Sep 17 00:00:00 2001 From: Antoine GIRARD Date: Wed, 17 Aug 2016 01:12:21 +0200 Subject: [PATCH] Add sitcked incident --- .../Incident/ReportIncidentCommand.php | 12 +++++- .../Incident/UpdateIncidentCommand.php | 12 +++++- .../Incident/ReportIncidentCommandHandler.php | 1 + .../ReportMaintenanceCommandHandler.php | 1 + .../Incident/UpdateIncidentCommandHandler.php | 1 + app/Composers/Modules/StickedComposer.php | 41 +++++++++++++++++++ app/Console/Commands/DemoSeederCommand.php | 15 +++++++ .../Providers/ComposerServiceProvider.php | 2 + .../Providers/ModuleServiceProvider.php | 1 + .../Controllers/Api/IncidentController.php | 2 + .../Dashboard/IncidentController.php | 2 + app/Models/Incident.php | 17 ++++++++ database/factories/ModelFactory.php | 1 + ...00_AlterTableIncidentsAddStickedColumn.php | 39 ++++++++++++++++++ resources/lang/en/cachet.php | 1 + resources/lang/en/forms.php | 3 ++ .../views/dashboard/incidents/add.blade.php | 7 ++++ .../views/dashboard/incidents/edit.blade.php | 7 ++++ .../views/partials/modules/sticked.blade.php | 8 ++++ tests/Api/IncidentTest.php | 3 ++ .../Incident/ReportIncidentCommandTest.php | 2 + .../Incident/UpdateIncidentCommandTest.php | 2 + 22 files changed, 178 insertions(+), 2 deletions(-) create mode 100644 app/Composers/Modules/StickedComposer.php create mode 100644 database/migrations/2016_08_30_143400_AlterTableIncidentsAddStickedColumn.php create mode 100644 resources/views/partials/modules/sticked.blade.php diff --git a/app/Bus/Commands/Incident/ReportIncidentCommand.php b/app/Bus/Commands/Incident/ReportIncidentCommand.php index 4e1e972f94dc..c6a05413fd32 100644 --- a/app/Bus/Commands/Incident/ReportIncidentCommand.php +++ b/app/Bus/Commands/Incident/ReportIncidentCommand.php @@ -62,6 +62,13 @@ final class ReportIncidentCommand */ public $notify; + /** + * Whether to stick the incident on top. + * + * @var bool + */ + public $sticked; + /** * The date at which the incident occurred. * @@ -96,6 +103,7 @@ final class ReportIncidentCommand 'component_id' => 'int|required_with:component_status', 'component_status' => 'int|min:1|max:4|required_with:component_id', 'notify' => 'bool', + 'sticked' => 'bool', 'incident_date' => 'string', 'template' => 'string', ]; @@ -110,13 +118,14 @@ final class ReportIncidentCommand * @param int $component_id * @param int $component_status * @param bool $notify + * @param bool $sticked * @param string|null $incident_date * @param string|null $template * @param array|null $template_vars * * @return void */ - public function __construct($name, $status, $message, $visible, $component_id, $component_status, $notify, $incident_date, $template, array $template_vars = null) + public function __construct($name, $status, $message, $visible, $component_id, $component_status, $notify, $sticked, $incident_date, $template, array $template_vars = null) { $this->name = $name; $this->status = $status; @@ -125,6 +134,7 @@ public function __construct($name, $status, $message, $visible, $component_id, $ $this->component_id = $component_id; $this->component_status = $component_status; $this->notify = $notify; + $this->sticked = $sticked; $this->incident_date = $incident_date; $this->template = $template; $this->template_vars = $template_vars; diff --git a/app/Bus/Commands/Incident/UpdateIncidentCommand.php b/app/Bus/Commands/Incident/UpdateIncidentCommand.php index 2d5f2c731919..811e61edff77 100644 --- a/app/Bus/Commands/Incident/UpdateIncidentCommand.php +++ b/app/Bus/Commands/Incident/UpdateIncidentCommand.php @@ -71,6 +71,13 @@ final class UpdateIncidentCommand */ public $notify; + /** + * Whether to stick the incident on top. + * + * @var bool + */ + public $sticked; + /** * The date that the incident occurred on. * @@ -105,6 +112,7 @@ final class UpdateIncidentCommand 'component_id' => 'int', 'component_status' => 'int|min:1|max:4|required_with:component_id', 'notify' => 'bool', + 'sticked' => 'bool', 'template' => 'string', ]; @@ -119,13 +127,14 @@ final class UpdateIncidentCommand * @param int $component_id * @param int $component_status * @param bool $notify + * @param bool $sticked * @param string|null $incident_date * @param string|null $template * @param array|null $template_vars * * @return void */ - public function __construct(Incident $incident, $name, $status, $message, $visible, $component_id, $component_status, $notify, $incident_date, $template, array $template_vars = null) + public function __construct(Incident $incident, $name, $status, $message, $visible, $component_id, $component_status, $notify, $sticked, $incident_date, $template, array $template_vars = null) { $this->incident = $incident; $this->name = $name; @@ -135,6 +144,7 @@ public function __construct(Incident $incident, $name, $status, $message, $visib $this->component_id = $component_id; $this->component_status = $component_status; $this->notify = $notify; + $this->sticked = $sticked; $this->incident_date = $incident_date; $this->template = $template; $this->template_vars = $template_vars; diff --git a/app/Bus/Handlers/Commands/Incident/ReportIncidentCommandHandler.php b/app/Bus/Handlers/Commands/Incident/ReportIncidentCommandHandler.php index 6117074891e0..e3441c5e07bf 100644 --- a/app/Bus/Handlers/Commands/Incident/ReportIncidentCommandHandler.php +++ b/app/Bus/Handlers/Commands/Incident/ReportIncidentCommandHandler.php @@ -68,6 +68,7 @@ public function handle(ReportIncidentCommand $command) 'name' => $command->name, 'status' => $command->status, 'visible' => $command->visible, + 'sticked' => $command->sticked, ]; if ($command->template) { diff --git a/app/Bus/Handlers/Commands/Incident/ReportMaintenanceCommandHandler.php b/app/Bus/Handlers/Commands/Incident/ReportMaintenanceCommandHandler.php index 4126909d0d3d..ad47398ff10b 100644 --- a/app/Bus/Handlers/Commands/Incident/ReportMaintenanceCommandHandler.php +++ b/app/Bus/Handlers/Commands/Incident/ReportMaintenanceCommandHandler.php @@ -54,6 +54,7 @@ public function handle(ReportMaintenanceCommand $command) 'scheduled_at' => $scheduledAt, 'status' => 0, 'visible' => 1, + 'sticked' => false, ]); $maintenanceEvent->notify = (bool) $command->notify; diff --git a/app/Bus/Handlers/Commands/Incident/UpdateIncidentCommandHandler.php b/app/Bus/Handlers/Commands/Incident/UpdateIncidentCommandHandler.php index 53bc3f7f9a8e..0cb5593f315c 100644 --- a/app/Bus/Handlers/Commands/Incident/UpdateIncidentCommandHandler.php +++ b/app/Bus/Handlers/Commands/Incident/UpdateIncidentCommandHandler.php @@ -107,6 +107,7 @@ protected function filter(UpdateIncidentCommand $command) 'status' => $command->status, 'message' => $command->message, 'visible' => $command->visible, + 'sticked' => $command->sticked, 'component_id' => $command->component_id, 'component_status' => $command->component_status, 'notify' => $command->notify, diff --git a/app/Composers/Modules/StickedComposer.php b/app/Composers/Modules/StickedComposer.php new file mode 100644 index 000000000000..fcbfbd7f1dcc --- /dev/null +++ b/app/Composers/Modules/StickedComposer.php @@ -0,0 +1,41 @@ + + * @author Connor S. Parks + * @author Antoine Girard + */ +class StickedComposer +{ + /** + * Index page view composer. + * + * @param \Illuminate\Contracts\View\View $view + * + * @return void + */ + public function compose(View $view) + { + $stickedIncidents = Incident::sticked()->orderBy('scheduled_at', 'desc')->orderBy('created_at', 'desc')->get()->groupBy(function (Incident $incident) { + return app(DateFactory::class)->make($incident->is_scheduled ? $incident->scheduled_at : $incident->created_at)->toDateString(); + }); + $view->withStickedIncidents($stickedIncidents); + } +} diff --git a/app/Console/Commands/DemoSeederCommand.php b/app/Console/Commands/DemoSeederCommand.php index 8048891ca62d..9c72258c9d52 100644 --- a/app/Console/Commands/DemoSeederCommand.php +++ b/app/Console/Commands/DemoSeederCommand.php @@ -205,6 +205,7 @@ protected function seedIncidents() 'component_id' => 0, 'scheduled_at' => null, 'visible' => 1, + 'sticked' => false, ], [ 'name' => 'Awesome', @@ -213,6 +214,7 @@ protected function seedIncidents() 'component_id' => 0, 'scheduled_at' => null, 'visible' => 1, + 'sticked' => false, ], [ 'name' => 'Monitoring the fix', @@ -221,6 +223,7 @@ protected function seedIncidents() 'component_id' => 0, 'scheduled_at' => null, 'visible' => 1, + 'sticked' => false, ], [ 'name' => 'Update', @@ -229,6 +232,7 @@ protected function seedIncidents() 'component_id' => 0, 'scheduled_at' => null, 'visible' => 1, + 'sticked' => false, ], [ 'name' => 'Test Incident', @@ -237,6 +241,7 @@ protected function seedIncidents() 'component_id' => 0, 'scheduled_at' => null, 'visible' => 1, + 'sticked' => false, ], [ 'name' => 'Investigating the API', @@ -245,6 +250,16 @@ protected function seedIncidents() 'component_id' => 1, 'scheduled_at' => null, 'visible' => 1, + 'sticked' => false, + ], + [ + 'name' => 'Sticked to the top', + 'message' => 'Will be forever hanged here.', + 'status' => 1, + 'component_id' => 1, + 'scheduled_at' => null, + 'visible' => 1, + 'sticked' => true, ], ]; diff --git a/app/Foundation/Providers/ComposerServiceProvider.php b/app/Foundation/Providers/ComposerServiceProvider.php index 876903d31bff..1024c7c8eb7f 100644 --- a/app/Foundation/Providers/ComposerServiceProvider.php +++ b/app/Foundation/Providers/ComposerServiceProvider.php @@ -19,6 +19,7 @@ use CachetHQ\Cachet\Composers\Modules\MetricsComposer as MetricsModuleComposer; use CachetHQ\Cachet\Composers\Modules\ScheduledComposer as ScheduledModuleComposer; use CachetHQ\Cachet\Composers\Modules\StatusComposer as StatusModuleComposer; +use CachetHQ\Cachet\Composers\Modules\StickedComposer as StickedModuleComposer; use CachetHQ\Cachet\Composers\Modules\TimelineComposer as TimelineModuleComposer; use CachetHQ\Cachet\Composers\ThemeComposer; use CachetHQ\Cachet\Composers\TimezoneLocaleComposer; @@ -43,6 +44,7 @@ public function boot(Factory $factory) $factory->composer('*', ModuleComposer::class); $factory->composer('partials.modules.components', ComponentsModuleComposer::class); $factory->composer('partials.modules.metrics', MetricsModuleComposer::class); + $factory->composer('partials.modules.sticked', StickedModuleComposer::class); $factory->composer('partials.modules.scheduled', ScheduledModuleComposer::class); $factory->composer('partials.modules.status', StatusModuleComposer::class); $factory->composer('partials.modules.timeline', TimelineModuleComposer::class); diff --git a/app/Foundation/Providers/ModuleServiceProvider.php b/app/Foundation/Providers/ModuleServiceProvider.php index c997d1e70204..89f0c2e4ccdc 100644 --- a/app/Foundation/Providers/ModuleServiceProvider.php +++ b/app/Foundation/Providers/ModuleServiceProvider.php @@ -28,6 +28,7 @@ class ModuleServiceProvider extends ServiceProvider ['group' => 'status', 'partial' => 'partials.modules.status'], ['group' => 'components', 'partial' => 'partials.modules.components'], ['group' => 'metrics', 'partial' => 'partials.modules.metrics'], + ['group' => 'sticked', 'partial' => 'partials.modules.sticked'], ['group' => 'scheduled', 'partial' => 'partials.modules.scheduled'], ['group' => 'timeline', 'partial' => 'partials.modules.timeline'], ], diff --git a/app/Http/Controllers/Api/IncidentController.php b/app/Http/Controllers/Api/IncidentController.php index 3a3066e695f4..e21097b8dc12 100644 --- a/app/Http/Controllers/Api/IncidentController.php +++ b/app/Http/Controllers/Api/IncidentController.php @@ -75,6 +75,7 @@ public function postIncidents() Binput::get('component_id'), Binput::get('component_status'), Binput::get('notify', true), + Binput::get('sticked', false), Binput::get('created_at'), Binput::get('template'), Binput::get('vars') @@ -105,6 +106,7 @@ public function putIncident(Incident $incident) Binput::get('component_id'), Binput::get('component_status'), Binput::get('notify', true), + Binput::get('sticked', false), Binput::get('created_at'), Binput::get('template'), Binput::get('vars') diff --git a/app/Http/Controllers/Dashboard/IncidentController.php b/app/Http/Controllers/Dashboard/IncidentController.php index 80b5bd507c1c..1fcd4a87c336 100644 --- a/app/Http/Controllers/Dashboard/IncidentController.php +++ b/app/Http/Controllers/Dashboard/IncidentController.php @@ -115,6 +115,7 @@ public function createIncidentAction() Binput::get('component_id'), Binput::get('component_status'), Binput::get('notify', false), + Binput::get('sticked', false), Binput::get('created_at'), null, null @@ -240,6 +241,7 @@ public function editIncidentAction(Incident $incident) Binput::get('component_id'), Binput::get('component_status'), Binput::get('notify', true), + Binput::get('sticked', false), Binput::get('created_at'), null, null diff --git a/app/Models/Incident.php b/app/Models/Incident.php index 19fe678f4900..74ee93a31739 100644 --- a/app/Models/Incident.php +++ b/app/Models/Incident.php @@ -32,6 +32,7 @@ class Incident extends Model implements HasPresenter */ protected $casts = [ 'visible' => 'int', + 'sticked' => 'int', 'scheduled_at' => 'date', 'deleted_at' => 'date', ]; @@ -46,6 +47,7 @@ class Incident extends Model implements HasPresenter 'name', 'status', 'visible', + 'sticked', 'message', 'scheduled_at', 'created_at', @@ -62,6 +64,7 @@ class Incident extends Model implements HasPresenter 'name' => 'required', 'status' => 'required|int', 'visible' => 'required|bool', + 'sticked' => 'bool', 'message' => 'required', ]; @@ -76,6 +79,7 @@ class Incident extends Model implements HasPresenter 'name', 'status', 'visible', + 'sticked', ]; /** @@ -88,6 +92,7 @@ class Incident extends Model implements HasPresenter 'name', 'status', 'visible', + 'sticked', 'message', ]; @@ -113,6 +118,18 @@ public function scopeVisible(Builder $query) return $query->where('visible', 1); } + /** + * Finds all sticked incidents. + * + * @param \Illuminate\Database\Eloquent\Builder $query + * + * @return \Illuminate\Database\Eloquent\Builder + */ + public function scopeSticked(Builder $query) + { + return $query->where('sticked', true); + } + /** * Finds all scheduled incidents (maintenance). * diff --git a/database/factories/ModelFactory.php b/database/factories/ModelFactory.php index 15862fa3fef7..0aed361f39d0 100644 --- a/database/factories/ModelFactory.php +++ b/database/factories/ModelFactory.php @@ -44,6 +44,7 @@ 'message' => $faker->paragraph(), 'status' => random_int(1, 4), 'visible' => 1, + 'sticked' => false, ]; }); diff --git a/database/migrations/2016_08_30_143400_AlterTableIncidentsAddStickedColumn.php b/database/migrations/2016_08_30_143400_AlterTableIncidentsAddStickedColumn.php new file mode 100644 index 000000000000..49844a8018d8 --- /dev/null +++ b/database/migrations/2016_08_30_143400_AlterTableIncidentsAddStickedColumn.php @@ -0,0 +1,39 @@ +boolean('sticked')->after('visible')->default(false); + + $table->index('sticked'); + }); + } + + /** + * Reverse the migrations. + */ + public function down() + { + Schema::table('incidents', function (Blueprint $table) { + $table->dropColumn('sticked'); + }); + } +} diff --git a/resources/lang/en/cachet.php b/resources/lang/en/cachet.php index c3035a79c7ad..8edceeb18c74 100644 --- a/resources/lang/en/cachet.php +++ b/resources/lang/en/cachet.php @@ -28,6 +28,7 @@ 'incidents' => [ 'none' => 'No incidents reported', 'past' => 'Past Incidents', + 'sticked' => 'Sticked Incidents', 'previous_week' => 'Previous Week', 'next_week' => 'Next Week', 'scheduled' => 'Scheduled Maintenance', diff --git a/resources/lang/en/forms.php b/resources/lang/en/forms.php index 34293f6f228b..9aad2e335d6c 100644 --- a/resources/lang/en/forms.php +++ b/resources/lang/en/forms.php @@ -53,6 +53,9 @@ 'incident_time' => 'When did this incident occur?', 'notify_subscribers' => 'Notify subscribers?', 'visibility' => 'Incident Visibility', + 'stick_status' => 'Stick Incident', + 'sticked' => 'Sticked', + 'not_sticked' => 'Not Sticked', 'public' => 'Viewable by public', 'logged_in_only' => 'Only visible to logged in users', 'templates' => [ diff --git a/resources/views/dashboard/incidents/add.blade.php b/resources/views/dashboard/incidents/add.blade.php index f799042f7e65..f56f60df391c 100644 --- a/resources/views/dashboard/incidents/add.blade.php +++ b/resources/views/dashboard/incidents/add.blade.php @@ -62,6 +62,13 @@ +
+ + +
@if(!$components_in_groups->isEmpty() || !$components_out_groups->isEmpty())
diff --git a/resources/views/dashboard/incidents/edit.blade.php b/resources/views/dashboard/incidents/edit.blade.php index d42d6520722e..1894c5e4367d 100644 --- a/resources/views/dashboard/incidents/edit.blade.php +++ b/resources/views/dashboard/incidents/edit.blade.php @@ -51,6 +51,13 @@
+
+ + +
@if($incident->component)
diff --git a/resources/views/partials/modules/sticked.blade.php b/resources/views/partials/modules/sticked.blade.php new file mode 100644 index 000000000000..9fd8162124ef --- /dev/null +++ b/resources/views/partials/modules/sticked.blade.php @@ -0,0 +1,8 @@ +@if(!$sticked_incidents->isEmpty()) +
+

{{ trans('cachet.incidents.sticked') }}

+ @foreach($sticked_incidents as $date => $incidents) + @include('partials.incidents', [compact($date), compact($incidents)]) + @endforeach +
+@endif diff --git a/tests/Api/IncidentTest.php b/tests/Api/IncidentTest.php index f0ebafc32232..ec9b56282072 100644 --- a/tests/Api/IncidentTest.php +++ b/tests/Api/IncidentTest.php @@ -59,6 +59,7 @@ public function testPostIncident() 'message' => 'Lorem ipsum dolor sit amet', 'status' => 1, 'visible' => 1, + 'sticked' => false, ]); $this->seeJson(['name' => 'Foo']); $this->assertResponseOk(); @@ -77,6 +78,7 @@ public function testPostIncidentWithComponentStatus() 'component_id' => $component->id, 'component_status' => 1, 'visible' => 1, + 'sticked' => false, ]); $this->seeJson(['name' => 'Foo']); $this->assertResponseOk(); @@ -91,6 +93,7 @@ public function testCreateIncidentWithTemplate() 'name' => 'Foo', 'status' => 1, 'visible' => 1, + 'sticked' => false, 'template' => $template->slug, 'vars' => [ 'name' => 'Foo', diff --git a/tests/Bus/Commands/Incident/ReportIncidentCommandTest.php b/tests/Bus/Commands/Incident/ReportIncidentCommandTest.php index 0b66aa72df52..6419bc08c295 100644 --- a/tests/Bus/Commands/Incident/ReportIncidentCommandTest.php +++ b/tests/Bus/Commands/Incident/ReportIncidentCommandTest.php @@ -36,6 +36,7 @@ protected function getObjectAndParams() 'component_id' => 1, 'component_status' => 1, 'notify' => false, + 'sticked' => false, 'incident_date' => null, 'template' => null, 'template_vars' => null, @@ -49,6 +50,7 @@ protected function getObjectAndParams() $params['component_id'], $params['component_status'], $params['notify'], + $params['sticked'], $params['incident_date'], $params['template'], $params['template_vars'] diff --git a/tests/Bus/Commands/Incident/UpdateIncidentCommandTest.php b/tests/Bus/Commands/Incident/UpdateIncidentCommandTest.php index 6a4926e5c4fa..f72107c62714 100644 --- a/tests/Bus/Commands/Incident/UpdateIncidentCommandTest.php +++ b/tests/Bus/Commands/Incident/UpdateIncidentCommandTest.php @@ -38,6 +38,7 @@ protected function getObjectAndParams() 'component_id' => 1, 'component_status' => 1, 'notify' => false, + 'sticked' => false, 'incident_date' => null, 'template' => null, 'template_vars' => null, @@ -52,6 +53,7 @@ protected function getObjectAndParams() $params['component_id'], $params['component_status'], $params['notify'], + $params['sticked'], $params['incident_date'], $params['template'], $params['template_vars']