- 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:
@@ -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()]),
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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'],
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
@@ -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'],
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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)
|
||||
;
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user