added colors to tags (#1631)
This commit is contained in:
@@ -44,6 +44,8 @@ class Tag
|
|||||||
*/
|
*/
|
||||||
private $name;
|
private $name;
|
||||||
|
|
||||||
|
use ColorTrait;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var Timesheet[]|ArrayCollection
|
* @var Timesheet[]|ArrayCollection
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
namespace App\Form;
|
namespace App\Form;
|
||||||
|
|
||||||
use App\Entity\Tag;
|
use App\Entity\Tag;
|
||||||
|
use App\Form\Type\ColorPickerType;
|
||||||
use Symfony\Component\Form\AbstractType;
|
use Symfony\Component\Form\AbstractType;
|
||||||
use Symfony\Component\Form\Extension\Core\Type\TextType;
|
use Symfony\Component\Form\Extension\Core\Type\TextType;
|
||||||
use Symfony\Component\Form\FormBuilderInterface;
|
use Symfony\Component\Form\FormBuilderInterface;
|
||||||
@@ -29,7 +30,7 @@ class TagEditForm extends AbstractType
|
|||||||
'autofocus' => 'autofocus'
|
'autofocus' => 'autofocus'
|
||||||
],
|
],
|
||||||
])
|
])
|
||||||
;
|
->add('color', ColorPickerType::class);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
38
src/Migrations/Version20200413133226.php
Normal file
38
src/Migrations/Version20200413133226.php
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file is part of the Kimai time-tracking app.
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view the LICENSE
|
||||||
|
* file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace DoctrineMigrations;
|
||||||
|
|
||||||
|
use App\Doctrine\AbstractMigration;
|
||||||
|
use Doctrine\DBAL\Schema\Schema;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @version 1.9
|
||||||
|
*/
|
||||||
|
final class Version20200413133226 extends AbstractMigration
|
||||||
|
{
|
||||||
|
public function getDescription(): string
|
||||||
|
{
|
||||||
|
return 'Add color for tags';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function up(Schema $schema): void
|
||||||
|
{
|
||||||
|
$tags = $schema->getTable('kimai2_tags');
|
||||||
|
$tags->addColumn('color', 'string', ['length' => 7, 'notnull' => false, 'default' => null]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function down(Schema $schema): void
|
||||||
|
{
|
||||||
|
$tags = $schema->getTable('kimai2_tags');
|
||||||
|
$tags->dropColumn('color');
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -108,10 +108,11 @@ class TagRepository extends EntityRepository
|
|||||||
$qb = $this->createQueryBuilder('tag');
|
$qb = $this->createQueryBuilder('tag');
|
||||||
|
|
||||||
$qb
|
$qb
|
||||||
->select('tag.id, tag.name, count(timesheets.id) as amount')
|
->select('tag.id, tag.name, tag.color, count(timesheets.id) as amount')
|
||||||
->leftJoin('tag.timesheets', 'timesheets')
|
->leftJoin('tag.timesheets', 'timesheets')
|
||||||
->addGroupBy('tag.id')
|
->addGroupBy('tag.id')
|
||||||
->addGroupBy('tag.name')
|
->addGroupBy('tag.name')
|
||||||
|
->addGroupBy('tag.color')
|
||||||
;
|
;
|
||||||
|
|
||||||
$orderBy = $query->getOrderBy();
|
$orderBy = $query->getOrderBy();
|
||||||
|
|||||||
@@ -159,8 +159,7 @@
|
|||||||
{% endmacro %}
|
{% endmacro %}
|
||||||
|
|
||||||
{% macro badge(title, color) %}
|
{% macro badge(title, color) %}
|
||||||
{# black, green, blue, yellow #}
|
<span class="badge" style="background-color:{{ color|default('#dd4b39') }}">{{ title|trans }}</span>
|
||||||
<span class="badge bg-{{ color|default('red') }}">{{ title|trans }}</span>
|
|
||||||
{% endmacro %}
|
{% endmacro %}
|
||||||
|
|
||||||
{% macro alert(type, description, title, icon) %}
|
{% macro alert(type, description, title, icon) %}
|
||||||
@@ -369,7 +368,7 @@
|
|||||||
{% macro tag_list(taglist) %}
|
{% macro tag_list(taglist) %}
|
||||||
{% import _self as macro %}
|
{% import _self as macro %}
|
||||||
{% for tag in taglist %}
|
{% for tag in taglist %}
|
||||||
{{ macro.badge(tag.name , 'green') }}
|
{{ macro.badge(tag.name, tag.color|default('#00a65a')) }}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
{% endmacro %}
|
{% endmacro %}
|
||||||
|
|
||||||
|
|||||||
@@ -38,7 +38,10 @@
|
|||||||
|
|
||||||
<tr{% if manageAllowed %} class="modal-ajax-form open-edit" data-href="{{ path('tags_edit', {'id': tag.id}) }}"{% endif %}>
|
<tr{% if manageAllowed %} class="modal-ajax-form open-edit" data-href="{{ path('tags_edit', {'id': tag.id}) }}"{% endif %}>
|
||||||
<td class="text-nowrap">{{ tables.datatable_multiupdate_row(tag.id) }}</td>
|
<td class="text-nowrap">{{ tables.datatable_multiupdate_row(tag.id) }}</td>
|
||||||
<td>{{ tag.name }}</td>
|
<td>
|
||||||
|
{{ widgets.color_dot(tag.color|default('#00a65a')) }}
|
||||||
|
{{ tag.name }}
|
||||||
|
</td>
|
||||||
<td>{{ widgets.label(tag.amount, type) }}</td>
|
<td>{{ widgets.label(tag.amount, type) }}</td>
|
||||||
<td class="actions">
|
<td class="actions">
|
||||||
{{ actions.tag(tag, 'index') }}
|
{{ actions.tag(tag, 'index') }}
|
||||||
|
|||||||
@@ -132,7 +132,7 @@ class TagControllerTest extends APIControllerBaseTest
|
|||||||
protected function assertStructure(array $result, $full = true)
|
protected function assertStructure(array $result, $full = true)
|
||||||
{
|
{
|
||||||
$expectedKeys = [
|
$expectedKeys = [
|
||||||
'id', 'name', 'timesheets'
|
'id', 'name', 'color', 'timesheets'
|
||||||
];
|
];
|
||||||
|
|
||||||
if ($full) {
|
if ($full) {
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ class TagTest extends TestCase
|
|||||||
$sut = new Tag();
|
$sut = new Tag();
|
||||||
$this->assertNull($sut->getId());
|
$this->assertNull($sut->getId());
|
||||||
$this->assertNull($sut->getName());
|
$this->assertNull($sut->getName());
|
||||||
|
$this->assertNull($sut->getColor());
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testSetterAndGetter()
|
public function testSetterAndGetter()
|
||||||
@@ -32,6 +33,9 @@ class TagTest extends TestCase
|
|||||||
$this->assertInstanceOf(Tag::class, $sut->setName('foo'));
|
$this->assertInstanceOf(Tag::class, $sut->setName('foo'));
|
||||||
$this->assertEquals('foo', $sut->getName());
|
$this->assertEquals('foo', $sut->getName());
|
||||||
$this->assertEquals('foo', (string) $sut);
|
$this->assertEquals('foo', (string) $sut);
|
||||||
|
|
||||||
|
$this->assertInstanceOf(Tag::class, $sut->setColor('#fffccc'));
|
||||||
|
$this->assertEquals('#fffccc', $sut->getColor());
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testWithTimesheet()
|
public function testWithTimesheet()
|
||||||
|
|||||||
Binary file not shown.
Reference in New Issue
Block a user