Release 2.10 (#4549)
This commit is contained in:
@@ -315,7 +315,7 @@ class TimesheetEditForm extends AbstractType
|
||||
function (FormEvent $event) {
|
||||
/** @var Timesheet|null $timesheet */
|
||||
$timesheet = $event->getData();
|
||||
if (null === $timesheet || null === $timesheet->getEnd()) {
|
||||
if (null === $timesheet || $timesheet->isRunning()) {
|
||||
$event->getForm()->get('duration')->setData(null);
|
||||
}
|
||||
}
|
||||
@@ -340,7 +340,7 @@ class TimesheetEditForm extends AbstractType
|
||||
|
||||
// only apply the duration, if the end is not yet set
|
||||
// without that check, the end would be overwritten and the real end time would be lost
|
||||
if (($forceApply && $duration > 0) || ($duration > 0 && null === $timesheet->getEnd())) {
|
||||
if (($forceApply && $duration > 0) || ($duration > 0 && $timesheet->isRunning())) {
|
||||
$end = clone $timesheet->getBegin();
|
||||
$end->modify('+ ' . $duration . 'seconds');
|
||||
$timesheet->setEnd($end);
|
||||
|
||||
@@ -39,13 +39,16 @@ class DatePickerType extends AbstractType
|
||||
return null;
|
||||
}
|
||||
|
||||
if ($reverseTransform instanceof \DateTimeInterface && $options['force_time']) {
|
||||
if ($reverseTransform instanceof \DateTimeInterface && $options['force_time'] !== null) {
|
||||
if ($options['force_time'] === 'start') {
|
||||
$reverseTransform = \DateTime::createFromInterface($reverseTransform);
|
||||
$reverseTransform->setTime(0, 0, 0);
|
||||
$reverseTransform = $reverseTransform->setTime(0, 0, 0);
|
||||
} elseif ($options['force_time'] === 'end') {
|
||||
$reverseTransform = \DateTime::createFromInterface($reverseTransform);
|
||||
$reverseTransform->setTime(23, 59, 59);
|
||||
$reverseTransform = $reverseTransform->setTime(23, 59, 59);
|
||||
} elseif (\is_string($options['force_time'])) {
|
||||
$reverseTransform = \DateTime::createFromInterface($reverseTransform);
|
||||
$reverseTransform = $reverseTransform->modify($options['force_time']);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -81,7 +84,7 @@ class DatePickerType extends AbstractType
|
||||
'format' => $formFormat,
|
||||
'model_timezone' => date_default_timezone_get(),
|
||||
'view_timezone' => date_default_timezone_get(),
|
||||
'force_time' => null,
|
||||
'force_time' => null, // one of: string (start, end) or a string to as argument for DateTime->modify() or null
|
||||
'min_day' => null,
|
||||
'max_day' => null,
|
||||
]);
|
||||
|
||||
@@ -56,7 +56,7 @@ final class QuickEntryTimesheetType extends AbstractType
|
||||
function (FormEvent $event) use ($durationOptions) {
|
||||
/** @var Timesheet|null $data */
|
||||
$data = $event->getData();
|
||||
if (null === $data || null === $data->getEnd()) {
|
||||
if (null === $data || $data->isRunning()) {
|
||||
$event->getForm()->get('duration')->setData(null);
|
||||
}
|
||||
|
||||
|
||||
@@ -27,6 +27,10 @@ use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||
*/
|
||||
final class UserType extends AbstractType
|
||||
{
|
||||
public function __construct(private readonly UserRepository $userRepository)
|
||||
{
|
||||
}
|
||||
|
||||
public function configureOptions(OptionsResolver $resolver): void
|
||||
{
|
||||
$resolver->setDefaults([
|
||||
@@ -63,31 +67,66 @@ final class UserType extends AbstractType
|
||||
// e.g. when editing a team that has disabled users, these users would be removed silently
|
||||
// see https://github.com/kimai/kimai/pull/1841
|
||||
'include_users' => [],
|
||||
// includes the current user if it is a system-account, which is especially useful for forms pages,
|
||||
// which have a user switcher and display the logged-in user by default
|
||||
'include_current_user_if_system_account' => false,
|
||||
'documentation' => [
|
||||
'type' => 'integer',
|
||||
'description' => 'User ID',
|
||||
],
|
||||
]);
|
||||
|
||||
$resolver->setDefault('query_builder', function (Options $options) {
|
||||
return function (UserRepository $repo) use ($options) {
|
||||
$query = new UserFormTypeQuery();
|
||||
$query->setUser($options['user']);
|
||||
$resolver->setDefault('choices', function (Options $options) {
|
||||
$query = new UserFormTypeQuery();
|
||||
$query->setUser($options['user']);
|
||||
|
||||
if ($options['include_disabled'] === true) {
|
||||
$query->setVisibility(VisibilityInterface::SHOW_BOTH);
|
||||
if ($options['include_disabled'] === true) {
|
||||
$query->setVisibility(VisibilityInterface::SHOW_BOTH);
|
||||
}
|
||||
|
||||
$qb = $this->userRepository->getQueryBuilderForFormType($query);
|
||||
$users = $qb->getQuery()->getResult();
|
||||
|
||||
$ignoreIds = [];
|
||||
/** @var User $user */
|
||||
foreach ($options['ignore_users'] as $user) {
|
||||
$ignoreIds[] = $user->getId();
|
||||
}
|
||||
|
||||
$users = array_filter($users, function (User $user) use ($ignoreIds) {
|
||||
if ($user->getId() === null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
foreach ($options['ignore_users'] as $userToIgnore) {
|
||||
$query->addUserToIgnore($userToIgnore);
|
||||
}
|
||||
return !\in_array($user->getId(), $ignoreIds, true);
|
||||
});
|
||||
|
||||
if (!empty($options['include_users'])) {
|
||||
$query->setUsersAlwaysIncluded($options['include_users']);
|
||||
}
|
||||
/** @var array<int, User> $userById */
|
||||
$userById = [];
|
||||
/** @var User $user */
|
||||
foreach ($users as $user) {
|
||||
$userById[$user->getId()] = $user;
|
||||
}
|
||||
|
||||
return $repo->getQueryBuilderForFormType($query);
|
||||
};
|
||||
$includeUsers = $options['include_users'];
|
||||
if ($options['include_current_user_if_system_account'] === true) {
|
||||
if ($options['user'] instanceof User && $options['user']->isSystemAccount()) {
|
||||
$includeUsers[] = $options['user'];
|
||||
}
|
||||
}
|
||||
|
||||
/** @var User $user */
|
||||
foreach ($includeUsers as $user) {
|
||||
if ($user->getId() !== null && !\array_key_exists($user->getId(), $userById)) {
|
||||
$userById[$user->getId()] = $user;
|
||||
}
|
||||
}
|
||||
|
||||
usort($userById, function (User $a, User $b) {
|
||||
return $a->getDisplayName() <=> $b->getDisplayName();
|
||||
});
|
||||
|
||||
return array_values($userById);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -27,7 +27,10 @@ final class YearByUserForm extends AbstractType
|
||||
]);
|
||||
|
||||
if ($options['include_user']) {
|
||||
$builder->add('user', UserType::class, ['width' => false]);
|
||||
$builder->add('user', UserType::class, [
|
||||
'width' => false,
|
||||
'include_current_user_if_system_account' => true
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user