Improved mobile view #151 (#150)

- fixed group by for mysql mode
- only user can edit own prefs
- updated installation README
- pagerfanta shows less links
- improved manual tab
- moved user profile link to pref tabs
- added menu links to top navbar
- moved page actions to breadcrumb position
- integrated daterangepicker and improved toolbar forms
- bugfix for time rounding
This commit is contained in:
Kevin Papst
2018-06-05 21:28:25 +02:00
committed by GitHub
parent db5b6f8e2e
commit 7206d064a5
41 changed files with 1027 additions and 897 deletions

View File

@@ -32,10 +32,13 @@ class SidebarController extends AbstractController
*/
public function settingsAction()
{
return $this->render('sidebar/settings.html.twig', []);
$user = $this->getUser();
return $this->render('sidebar/settings.html.twig', [
'user' => $user,
]);
/*
$user = $this->getUser();
$form = $this->createForm(UserPreferencesForm::class, $user, [
'action' => $this->generateUrl('user_profile_preferences', ['username' => $user->getUsername()]),

View File

@@ -90,6 +90,8 @@ trait TimesheetControllerTrait
$record->setEnd($end);
}
// TODO validate that end is not before begin
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($entry);
$entityManager->flush();
@@ -132,7 +134,9 @@ trait TimesheetControllerTrait
}
}
$entityManager = $this->getDoctrine()->getManager();
// TODO validate that end is not before begin
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($entry);
$entityManager->flush();

View File

@@ -42,7 +42,11 @@ class TimesheetEditForm extends AbstractType
if ($entry->getEnd() === null || !$options['duration_only']) {
$builder->add('begin', DateTimeType::class, [
'label' => 'label.begin',
'date_widget' => 'single_text',
'widget' => 'single_text',
'html5' => false,
'format' => 'yyyy-MM-dd H:m',
'with_seconds' => false,
'attr' => ['data-datetimepicker' => 'on'],
]);
}
@@ -51,8 +55,12 @@ class TimesheetEditForm extends AbstractType
} else {
$builder->add('end', DateTimeType::class, [
'label' => 'label.end',
'date_widget' => 'single_text',
'widget' => 'single_text',
'required' => false,
'html5' => false,
'format' => 'yyyy-MM-dd H:m',
'with_seconds' => false,
'attr' => ['data-datetimepicker' => 'on'],
]);
}

View File

@@ -108,7 +108,9 @@ abstract class AbstractToolbarForm extends AbstractType
$builder->add('begin', DateType::class, [
'label' => 'label.begin',
'widget' => 'single_text',
'html5' => false,
'required' => false,
'attr' => ['data-datepicker' => 'on'],
]);
}
@@ -120,7 +122,9 @@ abstract class AbstractToolbarForm extends AbstractType
$builder->add('end', DateType::class, [
'label' => 'label.end',
'widget' => 'single_text',
'html5' => false,
'required' => false,
'attr' => ['data-datepicker' => 'on'],
]);
}

View File

@@ -13,7 +13,6 @@ use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\OptionsResolver\OptionsResolver;
use App\Repository\CustomerRepository;
use App\Repository\Query\CustomerQuery;
/**
* Custom form field type to select a customer.

View File

@@ -41,6 +41,7 @@ class ActivityRepository extends AbstractRepository
$qb = $this->getEntityManager()->createQueryBuilder();
$qb->select('t', 'a', 'p', 'c')
->distinct()
->from(Timesheet::class, 't')
->join('t.activity', 'a')
->join('a.project', 'p')
@@ -49,7 +50,7 @@ class ActivityRepository extends AbstractRepository
->andWhere('a.visible = 1')
->andWhere('p.visible = 1')
->andWhere('c.visible = 1')
->groupBy('a.id')
->groupBy('a.id', 't.id')
->orderBy('t.end', 'DESC')
->setMaxResults(10)
;

View File

@@ -36,8 +36,9 @@ class TimesheetRepository extends AbstractRepository
*/
public function stopRecording(Timesheet $entry)
{
// seems to be necessary so Doctrine will recognize a changed timestamp
$entry->setBegin(clone $entry->getBegin());
$entry->setEnd(new DateTime());
$entityManager = $this->getEntityManager();
$entityManager->persist($entry);
$entityManager->flush();

View File

@@ -72,18 +72,30 @@ class UserVoter extends AbstractVoter
return $this->canView($subject, $user, $token);
case self::EDIT:
case self::PASSWORD:
case self::PREFERENCES:
return $this->canEdit($subject, $user, $token);
case self::DELETE:
return $this->canDelete($subject, $user, $token);
case self::CREATE: // create actually passes in the current user as $subject, not the new one
case self::ROLES:
return $this->canAdminUsers($token);
case self::PREFERENCES:
return $this->canEditPreferences($subject, $user, $token);
}
return false;
}
/**
* @param User $profile
* @param User $user
* @param TokenInterface $token
* @return bool
*/
protected function canEditPreferences(User $profile, User $user, TokenInterface $token)
{
return $profile->getId() == $user->getId();
}
/**
* @param User $profile
* @param User $user