Release 2.0.18 (#4003)
* prevent too long values for user preferences * add chart value 0 to y-axis if last value > 0, to always display the zero line (project details) * add user-preferences to invoice hydrator * DateTime vs DateTimeInterface * simplify permission config * fix query for teamleads limiting to only selected teams not possible
This commit is contained in:
@@ -24,6 +24,9 @@ use Symfony\Component\Form\Extension\Core\Type\UrlType;
|
||||
use Symfony\Component\Form\FormBuilderInterface;
|
||||
use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||
|
||||
/**
|
||||
* @extends AbstractType<Customer>
|
||||
*/
|
||||
class CustomerEditForm extends AbstractType
|
||||
{
|
||||
use EntityFormTrait;
|
||||
|
||||
@@ -17,6 +17,7 @@ use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||
|
||||
/**
|
||||
* Defines the form used for filtering the activities.
|
||||
* @extends AbstractType<ActivityQuery>
|
||||
*/
|
||||
final class ActivityToolbarForm extends AbstractType
|
||||
{
|
||||
|
||||
@@ -16,6 +16,7 @@ use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||
|
||||
/**
|
||||
* Defines the form used for filtering the customer.
|
||||
* @extends AbstractType<CustomerQuery>
|
||||
*/
|
||||
final class CustomerToolbarForm extends AbstractType
|
||||
{
|
||||
|
||||
@@ -17,6 +17,7 @@ use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||
|
||||
/**
|
||||
* Defines the form used for filtering timesheet entries for exports.
|
||||
* @extends AbstractType<ExportQuery>
|
||||
*/
|
||||
final class ExportToolbarForm extends AbstractType
|
||||
{
|
||||
|
||||
@@ -17,6 +17,7 @@ use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||
|
||||
/**
|
||||
* Defines the form used for filtering timesheet entries for invoices.
|
||||
* @extends AbstractType<InvoiceArchiveQuery>
|
||||
*/
|
||||
final class InvoiceArchiveForm extends AbstractType
|
||||
{
|
||||
|
||||
@@ -18,6 +18,7 @@ use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||
|
||||
/**
|
||||
* Defines the form used for filtering timesheet entries for invoices.
|
||||
* @extends AbstractType<InvoiceQuery>
|
||||
*/
|
||||
final class InvoiceToolbarForm extends AbstractType
|
||||
{
|
||||
|
||||
@@ -16,6 +16,7 @@ use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||
|
||||
/**
|
||||
* Defines the form used for filtering the projects.
|
||||
* @extends AbstractType<ProjectQuery>
|
||||
*/
|
||||
final class ProjectToolbarForm extends AbstractType
|
||||
{
|
||||
|
||||
@@ -14,6 +14,9 @@ use Symfony\Component\Form\AbstractType;
|
||||
use Symfony\Component\Form\FormBuilderInterface;
|
||||
use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||
|
||||
/**
|
||||
* @extends AbstractType<TagQuery>
|
||||
*/
|
||||
final class TagToolbarForm extends AbstractType
|
||||
{
|
||||
use ToolbarFormTrait;
|
||||
|
||||
@@ -14,6 +14,9 @@ use Symfony\Component\Form\AbstractType;
|
||||
use Symfony\Component\Form\FormBuilderInterface;
|
||||
use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||
|
||||
/**
|
||||
* @extends AbstractType<TeamQuery>
|
||||
*/
|
||||
final class TeamToolbarForm extends AbstractType
|
||||
{
|
||||
use ToolbarFormTrait;
|
||||
|
||||
@@ -16,6 +16,7 @@ use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||
|
||||
/**
|
||||
* Defines the form used for filtering the timesheet.
|
||||
* @extends AbstractType<TimesheetQuery>
|
||||
*/
|
||||
final class TimesheetExportToolbarForm extends AbstractType
|
||||
{
|
||||
|
||||
@@ -16,6 +16,7 @@ use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||
|
||||
/**
|
||||
* Defines the form used for filtering the timesheet.
|
||||
* @extends AbstractType<TimesheetQuery>
|
||||
*/
|
||||
final class TimesheetToolbarForm extends AbstractType
|
||||
{
|
||||
|
||||
@@ -16,6 +16,7 @@ use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||
|
||||
/**
|
||||
* Defines the form used for filtering the user.
|
||||
* @extends AbstractType<UserQuery>
|
||||
*/
|
||||
final class UserToolbarForm extends AbstractType
|
||||
{
|
||||
|
||||
@@ -14,6 +14,9 @@ use Symfony\Component\Form\AbstractType;
|
||||
use Symfony\Component\Form\FormBuilderInterface;
|
||||
use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||
|
||||
/**
|
||||
* @extends AbstractType<TeamMember>
|
||||
*/
|
||||
final class TeamMemberType extends AbstractType
|
||||
{
|
||||
public function buildForm(FormBuilderInterface $builder, array $options): void
|
||||
|
||||
@@ -18,6 +18,9 @@ use Symfony\Component\Form\AbstractType;
|
||||
use Symfony\Component\OptionsResolver\Options;
|
||||
use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||
|
||||
/**
|
||||
* @extends AbstractType<Team>
|
||||
*/
|
||||
final class TeamType extends AbstractType
|
||||
{
|
||||
public function configureOptions(OptionsResolver $resolver): void
|
||||
|
||||
@@ -16,6 +16,7 @@ use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||
|
||||
/**
|
||||
* Custom form field type to select if a timesheet is billable.
|
||||
* @extends AbstractType<string>
|
||||
*/
|
||||
final class TimesheetBillableType extends AbstractType
|
||||
{
|
||||
|
||||
@@ -13,6 +13,9 @@ use Symfony\Component\Form\AbstractType;
|
||||
use Symfony\Component\Form\Extension\Core\Type\TimezoneType as BaseTimezoneType;
|
||||
use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||
|
||||
/**
|
||||
* @extends AbstractType<string>
|
||||
*/
|
||||
final class TimezoneType extends AbstractType
|
||||
{
|
||||
public function getBlockPrefix(): string
|
||||
|
||||
@@ -16,6 +16,7 @@ use Symfony\Contracts\Translation\TranslatorInterface;
|
||||
|
||||
/**
|
||||
* Custom form field type to select the user language.
|
||||
* @extends AbstractType<string>
|
||||
*/
|
||||
final class UserLanguageType extends AbstractType
|
||||
{
|
||||
|
||||
@@ -13,15 +13,19 @@ use App\Entity\UserPreference;
|
||||
use Symfony\Component\Form\AbstractType;
|
||||
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
|
||||
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
|
||||
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
|
||||
use Symfony\Component\Form\Extension\Core\Type\TextType;
|
||||
use Symfony\Component\Form\FormBuilderInterface;
|
||||
use Symfony\Component\Form\FormEvent;
|
||||
use Symfony\Component\Form\FormEvents;
|
||||
use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||
use Symfony\Component\Validator\Constraints\Length;
|
||||
use Symfony\Component\Validator\Constraints\NotNull;
|
||||
use Symfony\Contracts\Translation\TranslatorInterface;
|
||||
|
||||
/**
|
||||
* Custom form field type to edit a user preference.
|
||||
* @extends AbstractType<UserPreference>
|
||||
*/
|
||||
final class UserPreferenceType extends AbstractType
|
||||
{
|
||||
@@ -46,6 +50,10 @@ final class UserPreferenceType extends AbstractType
|
||||
unset($options['required']);
|
||||
}
|
||||
|
||||
if (\in_array($preference->getType(), [TextType::class, TextareaType::class])) {
|
||||
$constraints[] = new Length(['max' => 255]);
|
||||
}
|
||||
|
||||
if (\in_array($preference->getType(), [CheckboxType::class, YesNoType::class])) {
|
||||
$required = false;
|
||||
}
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
|
||||
namespace App\Form\Type;
|
||||
|
||||
use App\Entity\User;
|
||||
use App\Entity\UserPreference;
|
||||
use Doctrine\Common\Collections\ArrayCollection;
|
||||
use Symfony\Component\Form\AbstractType;
|
||||
@@ -20,6 +21,7 @@ use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||
|
||||
/**
|
||||
* Custom form field type to edit user preferences.
|
||||
* @extends AbstractType<User>
|
||||
*/
|
||||
final class UserPreferencesCollectionType extends AbstractType
|
||||
{
|
||||
|
||||
@@ -18,6 +18,7 @@ use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||
|
||||
/**
|
||||
* Custom form field type to select a user role.
|
||||
* @extends AbstractType<User>
|
||||
*/
|
||||
final class UserRoleType extends AbstractType
|
||||
{
|
||||
|
||||
@@ -21,6 +21,7 @@ use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||
|
||||
/**
|
||||
* Custom form field type to select a user.
|
||||
* @extends AbstractType<User>
|
||||
*/
|
||||
final class UserType extends AbstractType
|
||||
{
|
||||
|
||||
@@ -16,6 +16,7 @@ use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||
|
||||
/**
|
||||
* Custom form field type to select a visibility.
|
||||
* @extends AbstractType<int>
|
||||
*/
|
||||
final class VisibilityType extends AbstractType
|
||||
{
|
||||
|
||||
@@ -17,6 +17,7 @@ use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||
|
||||
/**
|
||||
* Custom form field type to select weekdays.
|
||||
* @extends AbstractType<string>
|
||||
*/
|
||||
final class WeekDaysType extends AbstractType
|
||||
{
|
||||
|
||||
@@ -17,8 +17,8 @@ use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||
|
||||
/**
|
||||
* Custom form field type to select a week via picker and select previous and next week.
|
||||
*
|
||||
* Always falls back to the current week if none or an invalid date is given.
|
||||
* @extends AbstractType<\DateTimeInterface|null>
|
||||
*/
|
||||
final class WeekPickerType extends AbstractType
|
||||
{
|
||||
@@ -28,19 +28,22 @@ final class WeekPickerType extends AbstractType
|
||||
'widget' => 'single_text',
|
||||
'html5' => false,
|
||||
'format' => DateType::HTML5_FORMAT,
|
||||
'start_date' => new \DateTime(),
|
||||
'start_date' => new \DateTimeImmutable(),
|
||||
]);
|
||||
}
|
||||
|
||||
public function buildView(FormView $view, FormInterface $form, array $options): void
|
||||
{
|
||||
/** @var \DateTime|null $date */
|
||||
/** @var \DateTimeInterface|null $date */
|
||||
$date = $form->getData();
|
||||
|
||||
if (null === $date) {
|
||||
/** @var \DateTimeImmutable $date */
|
||||
$date = $options['start_date'];
|
||||
}
|
||||
|
||||
$date = \DateTime::createFromInterface($date);
|
||||
|
||||
$view->vars['week'] = $date;
|
||||
$view->vars['previousWeek'] = (clone $date)->modify('-1 week');
|
||||
$view->vars['nextWeek'] = (clone $date)->modify('+1 week');
|
||||
|
||||
@@ -17,8 +17,8 @@ use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||
|
||||
/**
|
||||
* Custom form field type to select a year via picker and select previous and next year.
|
||||
*
|
||||
* Always falls back to the current year if none or an invalid date is given.
|
||||
* @extends AbstractType<\DateTimeInterface|null>
|
||||
*/
|
||||
final class YearPickerType extends AbstractType
|
||||
{
|
||||
@@ -28,20 +28,23 @@ final class YearPickerType extends AbstractType
|
||||
'widget' => 'single_text',
|
||||
'html5' => false,
|
||||
'format' => DateType::HTML5_FORMAT,
|
||||
'start_date' => new \DateTime(),
|
||||
'start_date' => new \DateTimeImmutable(),
|
||||
'show_range' => false,
|
||||
]);
|
||||
}
|
||||
|
||||
public function buildView(FormView $view, FormInterface $form, array $options): void
|
||||
{
|
||||
/** @var \DateTime|null $date */
|
||||
/** @var \DateTimeInterface|null $date */
|
||||
$date = $form->getData();
|
||||
|
||||
if (null === $date) {
|
||||
if ($date === null) {
|
||||
/** @var \DateTimeImmutable $date */
|
||||
$date = $options['start_date'];
|
||||
}
|
||||
|
||||
$date = \DateTime::createFromInterface($date);
|
||||
|
||||
$view->vars['year'] = $date;
|
||||
$view->vars['show_range'] = $options['show_range'];
|
||||
$view->vars['previousYear'] = (clone $date)->modify('-1 year');
|
||||
|
||||
@@ -15,6 +15,7 @@ use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||
|
||||
/**
|
||||
* Custom form field type to select between Yes and No.
|
||||
* @extends AbstractType<bool>
|
||||
*/
|
||||
final class YesNoType extends AbstractType
|
||||
{
|
||||
|
||||
@@ -18,6 +18,7 @@ use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||
|
||||
/**
|
||||
* Defines the form used to set the users API token.
|
||||
* @extends AbstractType<User>
|
||||
*/
|
||||
final class UserApiTokenType extends AbstractType
|
||||
{
|
||||
|
||||
@@ -23,6 +23,7 @@ use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||
|
||||
/**
|
||||
* Defines the form used to edit the profile of a User.
|
||||
* @extends AbstractType<User>
|
||||
*/
|
||||
class UserEditType extends AbstractType
|
||||
{
|
||||
|
||||
@@ -17,7 +17,8 @@ use Symfony\Component\Form\FormBuilderInterface;
|
||||
use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||
|
||||
/**
|
||||
* Defines the form used to set the users password.
|
||||
* Defines the form used to set the user password.
|
||||
* @extends AbstractType<User>
|
||||
*/
|
||||
final class UserPasswordType extends AbstractType
|
||||
{
|
||||
|
||||
@@ -17,6 +17,7 @@ use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||
|
||||
/**
|
||||
* Defines the form used to edit the user preferences.
|
||||
* @extends AbstractType<User>
|
||||
*/
|
||||
final class UserPreferencesForm extends AbstractType
|
||||
{
|
||||
|
||||
@@ -17,6 +17,7 @@ use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||
|
||||
/**
|
||||
* Defines the form used to set roles for a User.
|
||||
* @extends AbstractType<User>
|
||||
*/
|
||||
final class UserRolesType extends AbstractType
|
||||
{
|
||||
|
||||
@@ -17,6 +17,7 @@ use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||
|
||||
/**
|
||||
* Defines the form used to assign a User to teams.
|
||||
* @extends AbstractType<User>
|
||||
*/
|
||||
final class UserTeamsType extends AbstractType
|
||||
{
|
||||
|
||||
@@ -20,6 +20,9 @@ use Symfony\Component\Validator\Constraints\Callback;
|
||||
use Symfony\Component\Validator\Constraints\NotBlank;
|
||||
use Symfony\Component\Validator\Context\ExecutionContextInterface;
|
||||
|
||||
/**
|
||||
* @extends AbstractType<TotpActivation>
|
||||
*/
|
||||
final class UserTwoFactorType extends AbstractType
|
||||
{
|
||||
public function __construct(private TotpAuthenticatorInterface $totpAuthenticator)
|
||||
|
||||
Reference in New Issue
Block a user