diff --git a/changelog.md b/changelog.md index 1f8d683..f59c4bc 100644 --- a/changelog.md +++ b/changelog.md @@ -7,6 +7,7 @@ | 2021-03-31 | 1 | Release | [v1.0.0](###Release-v1.0.0) | | 2021-03-31 | 2 | Hotfix | [v1.0.1](###Release-v1.0.1) | | 2021-03-31 | 3 | Hotfix | [v1.0.2](###Release-v1.0.2) | +| 2021-04-06 | 4 | Hotfix | [v1.0.3](###Release-v1.0.3) | ## Changes ### Release v1.0.0 @@ -19,4 +20,13 @@ ### Release v1.0.2 #### Fix -- InvalidEnumKeyException namespace \ No newline at end of file +- InvalidEnumKeyException namespace + +### Release v1.0.3 +#### Feature +- Filter in activity view +- Links between tables + +#### Fix +- Activity form +- Typo on nav \ No newline at end of file diff --git a/composer.lock b/composer.lock index fbf301b..56c2493 100644 --- a/composer.lock +++ b/composer.lock @@ -320,16 +320,16 @@ }, { "name": "doctrine/common", - "version": "3.1.1", + "version": "3.1.2", "source": { "type": "git", "url": "https://github.com/doctrine/common.git", - "reference": "2afde5a9844126bc311cd5f548b5475e75f800d3" + "reference": "a036d90c303f3163b5be8b8fde9b6755b2be4a3a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/common/zipball/2afde5a9844126bc311cd5f548b5475e75f800d3", - "reference": "2afde5a9844126bc311cd5f548b5475e75f800d3", + "url": "https://api.github.com/repos/doctrine/common/zipball/a036d90c303f3163b5be8b8fde9b6755b2be4a3a", + "reference": "a036d90c303f3163b5be8b8fde9b6755b2be4a3a", "shasum": "" }, "require": { @@ -342,7 +342,8 @@ "phpstan/phpstan-phpunit": "^0.12", "phpunit/phpunit": "^7.5.20 || ^8.5 || ^9.0", "squizlabs/php_codesniffer": "^3.0", - "symfony/phpunit-bridge": "^4.0.5" + "symfony/phpunit-bridge": "^4.0.5", + "vimeo/psalm": "^4.4" }, "type": "library", "autoload": { @@ -389,7 +390,7 @@ ], "support": { "issues": "https://github.com/doctrine/common/issues", - "source": "https://github.com/doctrine/common/tree/3.1.1" + "source": "https://github.com/doctrine/common/tree/3.1.2" }, "funding": [ { @@ -405,7 +406,7 @@ "type": "tidelift" } ], - "time": "2021-01-20T19:58:05+00:00" + "time": "2021-02-10T20:18:51+00:00" }, { "name": "doctrine/dbal", @@ -558,16 +559,16 @@ }, { "name": "doctrine/doctrine-bundle", - "version": "2.3.0", + "version": "2.3.1", "source": { "type": "git", "url": "https://github.com/doctrine/DoctrineBundle.git", - "reference": "8b922578bdee2243a26202b13df795e170efaef8" + "reference": "a08bc3b4d8567cdff05e89b272ba1e06e9d71c21" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/8b922578bdee2243a26202b13df795e170efaef8", - "reference": "8b922578bdee2243a26202b13df795e170efaef8", + "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/a08bc3b4d8567cdff05e89b272ba1e06e9d71c21", + "reference": "a08bc3b4d8567cdff05e89b272ba1e06e9d71c21", "shasum": "" }, "require": { @@ -579,7 +580,7 @@ "symfony/config": "^4.3.3|^5.0", "symfony/console": "^3.4.30|^4.3.3|^5.0", "symfony/dependency-injection": "^4.3.3|^5.0", - "symfony/doctrine-bridge": "^4.3.7|^5.0", + "symfony/doctrine-bridge": "^4.4.7|^5.0", "symfony/framework-bundle": "^3.4.30|^4.3.3|^5.0", "symfony/service-contracts": "^1.1.1|^2.0" }, @@ -592,25 +593,25 @@ "doctrine/orm": "^2.6", "friendsofphp/proxy-manager-lts": "^1.0", "phpunit/phpunit": "^7.5 || ^8.0 || ^9.3", - "symfony/phpunit-bridge": "^4.2", + "psalm/plugin-phpunit": "^0.15.1", + "psalm/plugin-symfony": "^2.2.4", + "symfony/phpunit-bridge": "^5.2", "symfony/property-info": "^4.3.3|^5.0", "symfony/proxy-manager-bridge": "^3.4|^4.3.3|^5.0", + "symfony/security-bundle": "^4.4|5.0", "symfony/twig-bridge": "^3.4.30|^4.3.3|^5.0", "symfony/validator": "^3.4.30|^4.3.3|^5.0", "symfony/web-profiler-bundle": "^3.4.30|^4.3.3|^5.0", "symfony/yaml": "^3.4.30|^4.3.3|^5.0", - "twig/twig": "^1.34|^2.12|^3.0" + "twig/twig": "^1.34|^2.12|^3.0", + "vimeo/psalm": "^4.7" }, "suggest": { "doctrine/orm": "The Doctrine ORM integration is optional in the bundle.", + "ext-pdo": "*", "symfony/web-profiler-bundle": "To use the data collector." }, "type": "symfony-bundle", - "extra": { - "branch-alias": { - "dev-master": "2.3.x-dev" - } - }, "autoload": { "psr-4": { "Doctrine\\Bundle\\DoctrineBundle\\": "" @@ -648,7 +649,7 @@ ], "support": { "issues": "https://github.com/doctrine/DoctrineBundle/issues", - "source": "https://github.com/doctrine/DoctrineBundle/tree/2.3.0" + "source": "https://github.com/doctrine/DoctrineBundle/tree/2.3.1" }, "funding": [ { @@ -664,31 +665,32 @@ "type": "tidelift" } ], - "time": "2021-03-16T16:24:04+00:00" + "time": "2021-04-05T14:21:02+00:00" }, { "name": "doctrine/doctrine-migrations-bundle", - "version": "3.0.2", + "version": "3.1.0", "source": { "type": "git", "url": "https://github.com/doctrine/DoctrineMigrationsBundle.git", - "reference": "b8de89fe811e62f1dea8cf9aafda0ea45ca6f1f3" + "reference": "d1248471734c62b94baac36cb18e9c635775eeb0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/b8de89fe811e62f1dea8cf9aafda0ea45ca6f1f3", - "reference": "b8de89fe811e62f1dea8cf9aafda0ea45ca6f1f3", + "url": "https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/d1248471734c62b94baac36cb18e9c635775eeb0", + "reference": "d1248471734c62b94baac36cb18e9c635775eeb0", "shasum": "" }, "require": { "doctrine/doctrine-bundle": "~1.0|~2.0", - "doctrine/migrations": "~3.0", + "doctrine/migrations": "^3.1", "php": "^7.2|^8.0", "symfony/framework-bundle": "~3.4|~4.0|~5.0" }, "require-dev": { "doctrine/coding-standard": "^8.0", "doctrine/orm": "^2.6", + "doctrine/persistence": "^1.3||^2.0", "phpstan/phpstan": "^0.12", "phpstan/phpstan-deprecation-rules": "^0.12", "phpstan/phpstan-phpunit": "^0.12", @@ -696,11 +698,6 @@ "phpunit/phpunit": "^7.0|^8.0|^9.0" }, "type": "symfony-bundle", - "extra": { - "branch-alias": { - "dev-master": "3.0.x-dev" - } - }, "autoload": { "psr-4": { "Doctrine\\Bundle\\MigrationsBundle\\": "" @@ -736,7 +733,7 @@ ], "support": { "issues": "https://github.com/doctrine/DoctrineMigrationsBundle/issues", - "source": "https://github.com/doctrine/DoctrineMigrationsBundle/tree/3.0.2" + "source": "https://github.com/doctrine/DoctrineMigrationsBundle/tree/3.1.0" }, "funding": [ { @@ -752,7 +749,7 @@ "type": "tidelift" } ], - "time": "2020-12-23T15:13:22+00:00" + "time": "2021-04-05T20:45:07+00:00" }, { "name": "doctrine/event-manager", @@ -1201,16 +1198,16 @@ }, { "name": "doctrine/orm", - "version": "2.8.2", + "version": "2.8.3", "source": { "type": "git", "url": "https://github.com/doctrine/orm.git", - "reference": "ebae57eb9637acd8252b398df3121b120688ed5c" + "reference": "657a30f8ceef2a78c2ff36a9fe6c6a6717c1c448" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/orm/zipball/ebae57eb9637acd8252b398df3121b120688ed5c", - "reference": "ebae57eb9637acd8252b398df3121b120688ed5c", + "url": "https://api.github.com/repos/doctrine/orm/zipball/657a30f8ceef2a78c2ff36a9fe6c6a6717c1c448", + "reference": "657a30f8ceef2a78c2ff36a9fe6c6a6717c1c448", "shasum": "" }, "require": { @@ -1243,11 +1240,6 @@ "bin/doctrine" ], "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.7.x-dev" - } - }, "autoload": { "psr-4": { "Doctrine\\ORM\\": "lib/Doctrine/ORM" @@ -1287,9 +1279,9 @@ ], "support": { "issues": "https://github.com/doctrine/orm/issues", - "source": "https://github.com/doctrine/orm/tree/2.8.2" + "source": "https://github.com/doctrine/orm/tree/2.8.3" }, - "time": "2021-02-16T22:10:18+00:00" + "time": "2021-04-01T21:16:53+00:00" }, { "name": "doctrine/persistence", diff --git a/public/styles/form.css b/public/styles/form.css index 65dfed4..20662a7 100644 --- a/public/styles/form.css +++ b/public/styles/form.css @@ -83,6 +83,7 @@ box-shadow: none; margin: 0; padding: 0; + font-size: 1rem; } option, optgroup option { diff --git a/public/styles/table.css b/public/styles/table.css index f03a1f5..242e973 100644 --- a/public/styles/table.css +++ b/public/styles/table.css @@ -1,6 +1,6 @@ table { width: 100%; - text-align: center; + text-align: left; border-collapse: collapse; } @@ -9,6 +9,10 @@ color: var(--secondary); font-weight: bold; font-size: 1.5rem; + padding-left: 1rem; + padding-right: 1rem; + padding-top: 0.25rem; + padding-bottom: 0.25rem; } tbody tr:nth-child(even) { @@ -20,8 +24,11 @@ } tbody td { - padding: 0.25rem; color: var(--dark); font-weight: bold; font-size: 1rem; + padding-left: 1rem; + padding-right: 1rem; + padding-top: 0.25rem; + padding-bottom: 0.25rem; } \ No newline at end of file diff --git a/src/Controller/AbstractExtendedController.php b/src/Controller/AbstractExtendedController.php index ba33a59..0dd4f1d 100644 --- a/src/Controller/AbstractExtendedController.php +++ b/src/Controller/AbstractExtendedController.php @@ -3,6 +3,7 @@ use App\Form\AbstractFormManager; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; +use Symfony\Component\Form\FormFactory; use Symfony\Component\Form\Extension\Core\Type\FormType; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\Response; @@ -48,7 +49,28 @@ */ protected function createNamedCustomForm(string $name, string $type, array $options = []): AbstractFormManager { - $formBuilder = $this->container->get('form.factory')->createNamedBuilder($name, FormType::class); - return new $type($formBuilder, $options); + /** @var FormFactory $formFactory */ + $formFactory = $this->container->get('form.factory'); + $formBuilder = $formFactory->createNamedBuilder($name, FormType::class); + return new $type($formBuilder, $options, true); + } + + /** + * Create a form inherited from AbstractGenericForm with get method + * + * @param string $name + * @param string $type + * @param array $options + * @return AbstractFormManager + */ + protected function createNamedGetCustomForm(string $name, string $type, array $options = []): AbstractFormManager + { + /** @var FormFactory $formFactory */ + $formFactory = $this->container->get('form.factory'); + $formBuilder = $formFactory->createNamedBuilder($name, FormType::class, [], [ + 'csrf_protection' => false, + ]); + $formBuilder->setMethod('GET'); + return new $type($formBuilder, $options, false); } } diff --git a/src/Controller/ActivityController.php b/src/Controller/ActivityController.php index b0453a5..9dcf489 100644 --- a/src/Controller/ActivityController.php +++ b/src/Controller/ActivityController.php @@ -10,6 +10,7 @@ use App\Form\Activity\ActivityAddForm; use App\Form\Activity\ActivityDeleteForm; use App\Form\Activity\ActivityEditForm; +use App\Form\Activity\ActivityFilterForm; /** * Controller for activity related pages @@ -32,10 +33,13 @@ /** @var ActorRepository $actorRepository */ $actorRepository = $entityManager->getRepository(ActorEntity::class); + // Get actors + $actors = $actorRepository->findAll(); + // Activity add form /** @var ActivityAddForm $activityAddForm */ $activityAddForm = $this->createNamedCustomForm('activityAdd', ActivityAddForm::class, [ - 'actors' => $actorRepository->findAll() + 'actors' => $actors, ]); $activityAddForm->handleRequest($request); if ($activityAddForm->isSubmitted() && $activityAddForm->isValid()) { @@ -84,11 +88,17 @@ } } - // Get activities - $activities = $activityRepository->findAll(); + // Filter + /** @var ActivityFilterForm $activityFilterForm */ + $activityFilterForm = $this->createNamedGetCustomForm('activityFilter', ActivityFilterForm::class, [ + 'actors' => $actors, + ]); + $activityFilterForm->handleRequest($request); + $activities = $activityFilterForm->getActivities($activityRepository); return $this->render('activity/activities.html.twig', [ 'activities' => $activities, + 'activityFilterForm' => $activityFilterForm, 'activityDeleteForm' => $activityDeleteForm, 'activityAddForm' => $activityAddForm, ]); diff --git a/src/Controller/ActorController.php b/src/Controller/ActorController.php index a23b023..7fdcaad 100644 --- a/src/Controller/ActorController.php +++ b/src/Controller/ActorController.php @@ -109,12 +109,6 @@ // Get actor $actor = $actorRepository->find($id); - // Get activities - $activities = $activityRepository->findBy([ - 'actor' => $actor, - 'status' => StatusEnum::ACTIVE_STATUS - ]); - // Actor edit form /** @var ActorEditForm $actorEditForm */ $actorEditForm = $this->createNamedCustomForm('edit', ActorEditForm::class); @@ -159,6 +153,12 @@ // Update fields $actorEditForm->updateFields($actor); + + // Get activities + $activities = $activityRepository->findBy([ + 'actor' => $actor, + 'status' => StatusEnum::ACTIVE_STATUS + ]); return $this->render('actor/actor.html.twig', [ 'actor' => $actor, diff --git a/src/Form/AbstractFormManager.php b/src/Form/AbstractFormManager.php index 5ea86d1..6e35703 100644 --- a/src/Form/AbstractFormManager.php +++ b/src/Form/AbstractFormManager.php @@ -6,6 +6,7 @@ use Symfony\Component\Form\FormView; use Symfony\Component\Form\Extension\Core\Type\HiddenType; use Symfony\Component\HttpFoundation\Request; +use phpDocumentor\Reflection\Types\Mixed_; /** * Generic form @@ -19,22 +20,29 @@ /** @var string Unique ID of the form */ protected $id; + /** @var bool If the form uses a token to check validity */ + protected $usesToken = true; + /** * @param FormBuilderInterface $formBuilder * @param array $data Additional data + * @param bool $usesToken If the form uses a token to check validity */ - public function __construct(FormBuilderInterface $formBuilder, array $data = []) + public function __construct(FormBuilderInterface $formBuilder, array $data = [], bool $usesToken = true) { + $this->usesToken = $usesToken; $this->id = md5(json_encode([ 'class' => get_class($this), 'name' => $formBuilder->getName(), ])); $this->addFields($formBuilder, $data); - $formBuilder->add('_ID', HiddenType::class, [ - 'attr' => [ - 'value' => $this->id, - ], - ]); + if ($usesToken) { + $formBuilder->add('_ID', HiddenType::class, [ + 'attr' => [ + 'value' => $this->id, + ], + ]); + } $this->form = $formBuilder->getForm(); } @@ -71,7 +79,7 @@ { if ($this->form->isSubmitted()) { $data = $this->form->getData(); - return $data['_ID'] == $this->id; + return !$this->usesToken || $data['_ID'] == $this->id; } return false; } @@ -120,6 +128,10 @@ return Null; } + public function getNormData(): Mixed_ + { + } + /** * @param FormBuilderInterface $formBuilder * @param array $data Additional data diff --git a/src/Form/Activity/ActivityAddForm.php b/src/Form/Activity/ActivityAddForm.php index 711f018..bf464d1 100644 --- a/src/Form/Activity/ActivityAddForm.php +++ b/src/Form/Activity/ActivityAddForm.php @@ -21,10 +21,10 @@ /** * {@inheritdoc} */ - public function __construct(FormBuilderInterface $formBuilder, array $data = []) + public function __construct(FormBuilderInterface $formBuilder, array $data = [], bool $usesToken = true) { $this->actors = $data['actors']; - parent::__construct($formBuilder, $data); + parent::__construct($formBuilder, $data, $usesToken); } /** diff --git a/src/Form/Activity/ActivityEditForm.php b/src/Form/Activity/ActivityEditForm.php index 494bfbc..c3af5d6 100644 --- a/src/Form/Activity/ActivityEditForm.php +++ b/src/Form/Activity/ActivityEditForm.php @@ -21,10 +21,10 @@ /** * {@inheritdoc} */ - public function __construct(FormBuilderInterface $formBuilder, array $data = []) + public function __construct(FormBuilderInterface $formBuilder, array $data = [], bool $usesToken = true) { $this->actors = $data['actors']; - parent::__construct($formBuilder, $data); + parent::__construct($formBuilder, $data, $usesToken); } /** diff --git a/src/Form/Activity/ActivityFilterForm.php b/src/Form/Activity/ActivityFilterForm.php new file mode 100644 index 0000000..c2f224a --- /dev/null +++ b/src/Form/Activity/ActivityFilterForm.php @@ -0,0 +1,138 @@ +actors = $data['actors']; + $formBuilder->setData([ + 'actor' => null, + 'followed' => false, + + 'status' => null, + 'active' => false, + 'notClosed' => true, + ]); + parent::__construct($formBuilder, $data, $usesToken); + } + + /** + * Create query builder + * + * @param ActivityRepository $activityRepository + * @return array + */ + public function getActivities(ActivityRepository $activityRepository): array + { + $data = $this->getData(); + + // Create filter + $criteria = new Criteria(); + + // Filter actors + if (!is_null($data['actor'])) { + $criteria->andWhere($criteria->expr() + ->eq('activity.actor', $data['actor'])); + } + if ($data['followed']) { + $criteria->andWhere($criteria->expr() + ->eq('actor.followed', true)); + } + + // Filter status + if (!is_null($data['status'])) { + $criteria->andWhere($criteria->expr() + ->eq('activity.status', $data['status'])); + } + if ($data['active']) { + $criteria->andWhere($criteria->expr() + ->in('activity.status', StatusEnum::ACTIVE_STATUS)); + } + if ($data['notClosed']) { + $criteria->andWhere($criteria->expr() + ->neq('activity.status', StatusEnum::CLOSED)); + } + + // Create query + $query = $activityRepository->createQueryBuilder('activity'); + $query->join(ActorEntity::class, 'actor', Join::WITH, 'activity.actor = actor'); + $query->addCriteria($criteria); + + return $query->getQuery()->execute([], Query::HYDRATE_OBJECT); + } + + /** + * {@inheritdoc} + */ + public function getTemplate(): string + { + return '_includes/html/form/activity/filter.html.twig'; + } + + /** + * {@inheritdoc} + */ + protected function addFields($formBuilder, $options): void + { + // Actor filters + $formBuilder->add('actor', EntityType::class, [ + 'class' => ActorEntity::class, + 'choices' => $this->actors, + 'group_by' => function (ActorEntity $choice) { + if ($choice->getFollowed()) { + return 'Suivi'; + } + if ($choice->getActive()) { + return 'Actif'; + } + + return 'Inactif'; + }, + 'choice_label' => 'displayName', + 'required' => false, + ]) + ->add('followed', CheckboxType::class, [ + 'required' => false, + ]); + + // Status filters + $formBuilder->add('status', ChoiceType::class, [ + 'required' => false, + 'choices' => ActivityEntity::VALID_STATUS, + 'choice_label' => function ($choice, $key, $value) { + return StatusEnum::STATUS_NAME[$choice]; + }, + ]) + ->add('active', CheckboxType::class, [ + 'required' => false, + ]) + ->add('notClosed', CheckboxType::class, [ + 'required' => false, + ]); + + // Submit + $formBuilder->add('submit', SubmitType::class); + } +} \ No newline at end of file diff --git a/src/Repository/ActivityRepository.php b/src/Repository/ActivityRepository.php index f9ca693..c3cbd06 100644 --- a/src/Repository/ActivityRepository.php +++ b/src/Repository/ActivityRepository.php @@ -3,9 +3,11 @@ use Doctrine\ORM\EntityRepository; use Doctrine\ORM\Query; +use Doctrine\ORM\QueryBuilder; use Doctrine\ORM\Query\Expr\Join; use App\Entity\ActorEntity; use App\Enum\StatusEnum; +use Doctrine\Common\Collections\Criteria; /** * Repository for workspaces @@ -13,6 +15,32 @@ class ActivityRepository extends EntityRepository { + /** @var array Default sorting */ + public const DEFAULT_ORDER = [ + 'name' => 'asc', + ]; + + /** + * {@inheritdoc} + */ + public function findAll(): array + { + return $this->findBy([], ActivityRepository::DEFAULT_ORDER); + } + + /** + * {@inheritdoc} + */ + public function createQueryBuilder($alias, $indexBy = null): QueryBuilder + { + $queryBuilder = parent::createQueryBuilder($alias, $indexBy); + foreach ($this::DEFAULT_ORDER as $field => $order) { + $queryBuilder->addOrderBy($alias . '.' . $field, $order); + } + + return $queryBuilder; + } + /** * Find active activities of followed actors * @@ -20,11 +48,16 @@ */ public function findActiveFollowed(): array { + // Create criteria + $criteria =new Criteria(); + $criteria->andWhere($criteria->expr() + ->eq('actor.followed', true)); + $criteria->andWhere($criteria->expr() + ->in('activity.status', StatusEnum::ACTIVE_STATUS)); + $query = $this->createQueryBuilder('activity'); $query->join(ActorEntity::class, 'actor', Join::WITH, 'activity.actor = actor'); - $query->andWhere($query->expr() - ->eq('actor.followed', true)); - $query->andWhere($query->expr()->in('activity.status', StatusEnum::ACTIVE_STATUS)); + $query->addCriteria($criteria); return $query->getQuery()->execute([], Query::HYDRATE_OBJECT); } diff --git a/templates/_includes/html/arrays/activity.html.twig b/templates/_includes/html/arrays/activity.html.twig index ca2778e..92ae911 100644 --- a/templates/_includes/html/arrays/activity.html.twig +++ b/templates/_includes/html/arrays/activity.html.twig @@ -10,35 +10,37 @@ {% if not hideActor %} Acteur {% endif %} - Début planifié - Fin planifiée - Début réél - Fin réele - Actions + Début planifié + Fin planifiée + Début réél + Fin réele + Actions {% for activity in activities %} - {{ activity.name }} + {{ activity.name }} {{ statusTools.statusName(activity.status) }} {% if not hideActor %} - {% if activity.actor is not null %} {{ activity.actor.displayName }} - {% endif %} + {% if activity.actor is not null %} {{ activity.actor.displayName }} + + {% endif %} {% endif %} - {% if activity.startDate is not null %} {{ dateTools.euro(activity.startDate) }} + {% if activity.startDate is not null %} {{ dateTools.euro(activity.startDate) }} {% endif %} - {% if activity.endDate is not null %} {{ dateTools.euro(activity.endDate) }} + {% if activity.endDate is not null %} {{ dateTools.euro(activity.endDate) }} {% endif %} - {% if activity.realStartDate is not null %} {{ dateTools.euro(activity.realStartDate) }} + {% if activity.realStartDate is not null %} {{ dateTools.euro(activity.realStartDate) }} {% endif %} - {% if activity.realEndDate is not null %} {{ dateTools.euro(activity.realEndDate) }} + {% if activity.realEndDate is not null %} {{ dateTools.euro(activity.realEndDate) }} {% endif %} - Editer - {% if activityDeleteForm is defined %} {% include '_includes/html/genericForm.html.twig' with {'form': activityDeleteForm, 'data': {activity: activity, variant: 'icon'}} only %} + {% if activityDeleteForm is defined %} {% include '_includes/html/genericForm.html.twig' with {'form': activityDeleteForm, 'data': {activity: activity, variant: 'icon'}} only %} {% endif %} {% endfor %} diff --git a/templates/_includes/html/arrays/actor.html.twig b/templates/_includes/html/arrays/actor.html.twig index a6483b6..1b92283 100644 --- a/templates/_includes/html/arrays/actor.html.twig +++ b/templates/_includes/html/arrays/actor.html.twig @@ -2,27 +2,25 @@ Nom - Prénom Surnom - Suivi - Actif - Actions + Suivi + Actif + Actions {% for actor in actors %} - {{ actor.firstName }} - {{ actor.lastName }} + {{ actor.fullName }} {{ actor.nickname }} - {% if actor.followed %}{% if actor.followed %}Suivi {% endif %} - {% if actor.active %}{% if actor.active %}Actif {% endif %} - Editer - {% if actorDeleteForm is defined %} {% include '_includes/html/genericForm.html.twig' with {'form': actorDeleteForm, 'data': {actor: actor, variant: 'icon'}} only %} + {% if actorDeleteForm is defined %} {% include '_includes/html/genericForm.html.twig' with {'form': actorDeleteForm, 'data': {actor: actor, variant: 'icon'}} only %} {% endif %} {% endfor %} diff --git a/templates/_includes/html/base.html.twig b/templates/_includes/html/base.html.twig index f013ec5..87f70e1 100644 --- a/templates/_includes/html/base.html.twig +++ b/templates/_includes/html/base.html.twig @@ -38,7 +38,7 @@
  • {% include '_includes/html/component/navLink.html.twig' with {route: 'main_home', icon: 'icofont-home', name: 'Accueil'} %}
  • {% include '_includes/html/component/navLink.html.twig' with {route: 'activity_activities', icon: 'icofont-listing-box', name: 'Activités'} %}
  • - +
  • {% include '_includes/html/component/navLink.html.twig' with {route: 'actor_actors', icon: 'icofont-people', name: 'Acteurs'} %}
  • diff --git a/templates/_includes/html/form/activity/add.html.twig b/templates/_includes/html/form/activity/add.html.twig index 79a8993..e160425 100644 --- a/templates/_includes/html/form/activity/add.html.twig +++ b/templates/_includes/html/form/activity/add.html.twig @@ -23,14 +23,14 @@ {{ form_widget(form.startDate, {attr: {class: 'w-100'}}) }}
    - {{ form_label(form.endDate, 'Début réel', {label_attr: {class: 'input-text-label'}}) }} - {{ form_widget(form.endDate, {attr: {class: 'w-100'}}) }} + {{ form_label(form.realStartDate, 'Début réel', {label_attr: {class: 'input-text-label'}}) }} + {{ form_widget(form.realStartDate, {attr: {class: 'w-100'}}) }}
    - {{ form_label(form.realStartDate, 'Fin planifié', {label_attr: {class: 'input-text-label'}}) }} - {{ form_widget(form.realStartDate, {attr: {class: 'w-100'}}) }} + {{ form_label(form.endDate, 'Fin planifié', {label_attr: {class: 'input-text-label'}}) }} + {{ form_widget(form.endDate, {attr: {class: 'w-100'}}) }}
    {{ form_label(form.realEndDate, 'Fin réelle', {label_attr: {class: 'input-text-label'}}) }} diff --git a/templates/_includes/html/form/activity/edit.html.twig b/templates/_includes/html/form/activity/edit.html.twig index 420c365..e47bc5a 100644 --- a/templates/_includes/html/form/activity/edit.html.twig +++ b/templates/_includes/html/form/activity/edit.html.twig @@ -23,14 +23,14 @@ {{ form_widget(form.startDate, {attr: {class: 'w-100'}}) }}
    - {{ form_label(form.endDate, 'Début réel', {label_attr: {class: 'input-text-label'}}) }} - {{ form_widget(form.endDate, {attr: {class: 'w-100'}}) }} + {{ form_label(form.realStartDate, 'Début réel', {label_attr: {class: 'input-text-label'}}) }} + {{ form_widget(form.realStartDate, {attr: {class: 'w-100'}}) }}
    - {{ form_label(form.realStartDate, 'Fin planifié', {label_attr: {class: 'input-text-label'}}) }} - {{ form_widget(form.realStartDate, {attr: {class: 'w-100'}}) }} + {{ form_label(form.endDate, 'Fin planifié', {label_attr: {class: 'input-text-label'}}) }} + {{ form_widget(form.endDate, {attr: {class: 'w-100'}}) }}
    {{ form_label(form.realEndDate, 'Fin réelle', {label_attr: {class: 'input-text-label'}}) }} diff --git a/templates/_includes/html/form/activity/filter.html.twig b/templates/_includes/html/form/activity/filter.html.twig new file mode 100644 index 0000000..7141b35 --- /dev/null +++ b/templates/_includes/html/form/activity/filter.html.twig @@ -0,0 +1,37 @@ +{{ form_start(form)}} +
    +
    +
    + {{ form_label(form.actor, 'Acteur', {label_attr: {class: 'input-text-label'}}) }} + {{ form_widget(form.actor, {attr: {class: 'w-100'}}) }} +
    +
    + {{ form_widget(form.followed) }} + {{ form_label(form.followed, 'Acteurs suivis') }} +
    +
    +
    +
    + {{ form_label(form.status, 'Status', {label_attr: {class: 'input-text-label'}}) }} + {{ form_widget(form.status, {attr: {class: 'w-100'}}) }} +
    +
    + {{ form_widget(form.active) }} + {{ form_label(form.active, 'Actifs') }} +
    +
    + {{ form_widget(form.notClosed) }} + {{ form_label(form.notClosed, 'Non clos') }} +
    +
    +
    +
    +
    +
    + {{ form_widget(form.submit, {attr: {class: 'w-100'}, label: 'Filtrer'}) }} +
    +
    +
    +

    +

    +{{ form_end(form) }} \ No newline at end of file diff --git a/templates/activity/activities.html.twig b/templates/activity/activities.html.twig index d40eadf..e064365 100644 --- a/templates/activity/activities.html.twig +++ b/templates/activity/activities.html.twig @@ -10,6 +10,7 @@

    Activités

    + {% include '_includes/html/genericForm.html.twig' with {form: activityFilterForm} only %} {% include "_includes/html/arrays/activity.html.twig" with {activities: activities, activityDeleteForm: activityDeleteForm} only %}