Allow component groups to be collapsed by default. Closes #1398
This commit is contained in:
@@ -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])
|
||||||
|
|||||||
@@ -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',
|
||||||
];
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -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');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -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');
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user