Allow component groups to be collapsed by default. Closes #1398

This commit is contained in:
James Brooks
2016-01-29 16:02:14 +00:00
parent d907d1eecc
commit da7af1fca0
16 changed files with 141 additions and 34 deletions
@@ -27,14 +27,22 @@ final class AddComponentGroupCommand
*/ */
public $order; public $order;
/**
* Is the component group collapsed?
*
* @var bool
*/
public $collapsed;
/** /**
* The validation rules. * The validation rules.
* *
* @var string[] * @var string[]
*/ */
public $rules = [ public $rules = [
'name' => 'required|string', 'name' => 'required|string',
'order' => 'int', 'order' => 'int',
'collapsed' => 'bool',
]; ];
/** /**
@@ -42,12 +50,14 @@ final class AddComponentGroupCommand
* *
* @param string $name * @param string $name
* @param int $order * @param int $order
* @param bool $collapsed
* *
* @return void * @return void
*/ */
public function __construct($name, $order) public function __construct($name, $order, $collapsed)
{ {
$this->name = $name; $this->name = $name;
$this->order = (int) $order; $this->order = (int) $order;
$this->collapsed = $collapsed;
} }
} }
@@ -36,14 +36,22 @@ final class UpdateComponentGroupCommand
*/ */
public $order; public $order;
/**
* Is the component group collapsed?
*
* @var bool
*/
public $collapsed;
/** /**
* The validation rules. * The validation rules.
* *
* @var string[] * @var string[]
*/ */
public $rules = [ public $rules = [
'name' => 'string', 'name' => 'string',
'order' => 'int', 'order' => 'int',
'collapsed' => 'bool',
]; ];
/** /**
@@ -52,13 +60,15 @@ final class UpdateComponentGroupCommand
* @param \CachetHQ\Cachet\Models\ComponentGroup $group * @param \CachetHQ\Cachet\Models\ComponentGroup $group
* @param string $name * @param string $name
* @param int $order * @param int $order
* @param bool $collapsed
* *
* @return void * @return void
*/ */
public function __construct(ComponentGroup $group, $name, $order) public function __construct(ComponentGroup $group, $name, $order, $collapsed)
{ {
$this->group = $group; $this->group = $group;
$this->name = $name; $this->name = $name;
$this->order = (int) $order; $this->order = (int) $order;
$this->collapsed = $collapsed;
} }
} }
@@ -27,8 +27,9 @@ class AddComponentGroupCommandHandler
public function handle(AddComponentGroupCommand $command) public function handle(AddComponentGroupCommand $command)
{ {
$group = ComponentGroup::create([ $group = ComponentGroup::create([
'name' => $command->name, 'name' => $command->name,
'order' => $command->order, 'order' => $command->order,
'collapsed' => $command->collapsed,
]); ]);
event(new ComponentGroupWasAddedEvent($group)); event(new ComponentGroupWasAddedEvent($group));
@@ -26,13 +26,30 @@ class UpdateComponentGroupCommandHandler
public function handle(UpdateComponentGroupCommand $command) public function handle(UpdateComponentGroupCommand $command)
{ {
$group = $command->group; $group = $command->group;
$group->update([ $group->update($this->filter($command));
'name' => $command->name,
'order' => $command->order,
]);
event(new ComponentGroupWasUpdatedEvent($group)); event(new ComponentGroupWasUpdatedEvent($group));
return $group; return $group;
} }
/**
* Filter the command data.
*
* @param \CachetHQ\Cachet\Bus\Commands\ComponentGroup\UpdateComponentGroupCommand $command
*
* @return array
*/
protected function filter(UpdateComponentGroupCommand $command)
{
$params = [
'name' => $command->name,
'order' => $command->order,
'collapsed' => $command->collapsed,
];
return array_filter($params, function ($val) {
return $val !== null;
});
}
} }
@@ -56,7 +56,8 @@ class ComponentGroupController extends AbstractApiController
try { try {
$group = dispatch(new AddComponentGroupCommand( $group = dispatch(new AddComponentGroupCommand(
Binput::get('name'), Binput::get('name'),
Binput::get('order', 0) Binput::get('order', 0),
Binput::get('collapsed')
)); ));
} catch (QueryException $e) { } catch (QueryException $e) {
throw new BadRequestHttpException(); throw new BadRequestHttpException();
@@ -78,7 +79,8 @@ class ComponentGroupController extends AbstractApiController
$group = dispatch(new UpdateComponentGroupCommand( $group = dispatch(new UpdateComponentGroupCommand(
$group, $group,
Binput::get('name'), Binput::get('name'),
Binput::get('order', 0) Binput::get('order', 0),
Binput::get('collapsed')
)); ));
} catch (QueryException $e) { } catch (QueryException $e) {
throw new BadRequestHttpException(); throw new BadRequestHttpException();
@@ -276,7 +276,8 @@ class ComponentController extends Controller
try { try {
$group = dispatch(new AddComponentGroupCommand( $group = dispatch(new AddComponentGroupCommand(
Binput::get('name'), Binput::get('name'),
Binput::get('order', 0) Binput::get('order', 0),
Binput::get('collapsed')
)); ));
} catch (ValidationException $e) { } catch (ValidationException $e) {
return Redirect::route('dashboard.components.groups.add') return Redirect::route('dashboard.components.groups.add')
@@ -302,7 +303,8 @@ class ComponentController extends Controller
$group = dispatch(new UpdateComponentGroupCommand( $group = dispatch(new UpdateComponentGroupCommand(
$group, $group,
Binput::get('name'), Binput::get('name'),
Binput::get('order', 0) Binput::get('order', 0),
Binput::get('collapsed')
)); ));
} catch (ValidationException $e) { } catch (ValidationException $e) {
return Redirect::route('dashboard.components.groups.edit', ['id' => $group->id]) return Redirect::route('dashboard.components.groups.edit', ['id' => $group->id])
+7 -5
View File
@@ -26,8 +26,9 @@ class ComponentGroup extends Model implements HasPresenter
* @var string[] * @var string[]
*/ */
protected $casts = [ protected $casts = [
'name' => 'string', 'name' => 'string',
'order' => 'int', 'order' => 'int',
'collapsed' => 'bool',
]; ];
/** /**
@@ -35,7 +36,7 @@ class ComponentGroup extends Model implements HasPresenter
* *
* @var string[] * @var string[]
*/ */
protected $fillable = ['name', 'order']; protected $fillable = ['name', 'order', 'collapsed'];
/** /**
* The validation rules. * The validation rules.
@@ -43,8 +44,9 @@ class ComponentGroup extends Model implements HasPresenter
* @var string[] * @var string[]
*/ */
public $rules = [ public $rules = [
'name' => 'required|string', 'name' => 'required|string',
'order' => 'int', 'order' => 'int',
'collapsed' => 'bool',
]; ];
/** /**
+3 -2
View File
@@ -32,8 +32,9 @@ $factory->define(Component::class, function ($faker) {
$factory->define(ComponentGroup::class, function ($faker) { $factory->define(ComponentGroup::class, function ($faker) {
return [ return [
'name' => $faker->words(2, true), 'name' => $faker->words(2, true),
'order' => 0, 'order' => 0,
'collapsed' => false,
]; ];
}); });
@@ -0,0 +1,41 @@
<?php
/*
* This file is part of Cachet.
*
* (c) Alt Three Services Limited
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class AlterTableComponentGroupsAddCollapsedColumn extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('component_groups', function (Blueprint $table) {
$table->boolean('collapsed')->after('order')->default(false);
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('component_groups', function (Blueprint $table) {
$table->dropColumn('collapsed');
});
}
}
+2 -1
View File
@@ -68,7 +68,8 @@ return [
'enabled' => 'Component enabled?', 'enabled' => 'Component enabled?',
'groups' => [ 'groups' => [
'name' => 'Name', 'name' => 'Name',
'collapsed' => 'Collapse the group by default?',
], ],
], ],
@@ -18,9 +18,16 @@
<input type="hidden" name="_token" value="{{ csrf_token() }}"> <input type="hidden" name="_token" value="{{ csrf_token() }}">
<fieldset> <fieldset>
<div class="form-group"> <div class="form-group">
<label for="incident-name">{{ trans('forms.components.groups.name') }}</label> <label>{{ trans('forms.components.groups.name') }}</label>
<input type="text" class="form-control" name="name" id="group-name" required> <input type="text" class="form-control" name="name" id="group-name" required>
</div> </div>
<div class="form-group">
<label>
<input type="hidden" value="0" name="collapsed">
<input type="checkbox" value="1" name="collapsed">
{{ trans('forms.components.groups.collapsed') }}
</label>
</div>
</fieldset> </fieldset>
<div class="btn-group"> <div class="btn-group">
@@ -18,9 +18,16 @@
<input type="hidden" name="_token" value="{{ csrf_token() }}"> <input type="hidden" name="_token" value="{{ csrf_token() }}">
<fieldset> <fieldset>
<div class="form-group"> <div class="form-group">
<label for="incident-name">{{ trans('forms.components.groups.name') }}</label> <label>{{ trans('forms.components.groups.name') }}</label>
<input type="text" class="form-control" name="name" id="group-name" value="{{ $group->name }}" required> <input type="text" class="form-control" name="name" id="group-name" value="{{ $group->name }}" required>
</div> </div>
<div class="form-group">
<label>
<input type="hidden" value="0" name="collapsed">
<input type="checkbox" value="1" name="collapsed" {{ $group->collapsed ? "checked" : null }}>
{{ trans('forms.components.groups.collapsed') }}
</label>
</div>
</fieldset> </fieldset>
<div class="btn-group"> <div class="btn-group">
@@ -11,7 +11,7 @@
</div> </div>
</li> </li>
<div class="group-items"> <div class="group-items {{ $componentGroup->collapsed ? "hide" : null }}">
@foreach($componentGroup->enabled_components()->orderBy('order')->get() as $component) @foreach($componentGroup->enabled_components()->orderBy('order')->get() as $component)
@include('partials.component', compact($component)) @include('partials.component', compact($component))
@endforeach @endforeach
+4 -3
View File
@@ -56,10 +56,11 @@ class ComponentGroupTest extends AbstractApiTestCase
$this->beUser(); $this->beUser();
$this->post('/api/v1/components/groups', [ $this->post('/api/v1/components/groups', [
'name' => 'Foo', 'name' => 'Foo',
'order' => 1, 'order' => 1,
'collapsed' => true,
]); ]);
$this->seeJson(['name' => 'Foo']); $this->seeJson(['name' => 'Foo', 'order' => 1, 'collapsed' => true]);
$this->assertResponseOk(); $this->assertResponseOk();
} }
@@ -28,9 +28,9 @@ class AddComponentGroupCommandTest extends AbstractTestCase
protected function getObjectAndParams() protected function getObjectAndParams()
{ {
$params = ['name' => 'Test', 'order' => 0]; $params = ['name' => 'Test', 'order' => 0, 'collapsed' => true];
$object = new AddComponentGroupCommand($params['name'], $params['order']); $object = new AddComponentGroupCommand($params['name'], $params['order'], $params['collapsed']);
return compact('params', 'object'); return compact('params', 'object');
} }
@@ -29,8 +29,13 @@ class UpdateComponentGroupCommandTest extends AbstractTestCase
protected function getObjectAndParams() protected function getObjectAndParams()
{ {
$params = ['group' => new ComponentGroup(), 'name' => 'Foo', 'order' => 1]; $params = ['group' => new ComponentGroup(), 'name' => 'Foo', 'order' => 1, 'collapsed' => true];
$object = new UpdateComponentGroupCommand($params['group'], $params['name'], $params['order']); $object = new UpdateComponentGroupCommand(
$params['group'],
$params['name'],
$params['order'],
$params['collapsed']
);
return compact('params', 'object'); return compact('params', 'object');
} }