diff --git a/src/Controller/ProfileController.php b/src/Controller/ProfileController.php
index abb4e231..5540e725 100644
--- a/src/Controller/ProfileController.php
+++ b/src/Controller/ProfileController.php
@@ -261,10 +261,20 @@ class ProfileController extends AbstractController
]);
}
+ $sections = [];
+
+ /** @var UserPreference $pref */
+ foreach ($profile->getPreferences() as $pref) {
+ if ($pref->isEnabled()) {
+ $sections[$pref->getSection()] = $pref->getSection();
+ }
+ }
+
return $this->render('user/form.html.twig', [
'tab' => 'preferences',
'user' => $profile,
'form' => $form->createView(),
+ 'sections' => $sections
]);
}
diff --git a/src/Entity/UserPreference.php b/src/Entity/UserPreference.php
index 97bd767a..84900582 100644
--- a/src/Entity/UserPreference.php
+++ b/src/Entity/UserPreference.php
@@ -83,11 +83,12 @@ class UserPreference
* @var int
*/
private $order = 1000;
-
/**
- * @return int
+ * @var string
*/
- public function getId()
+ private $section = 'default';
+
+ public function getId(): ?int
{
return $this->id;
}
@@ -264,4 +265,16 @@ class UserPreference
return $this;
}
+
+ public function setSection(string $section): UserPreference
+ {
+ $this->section = $section;
+
+ return $this;
+ }
+
+ public function getSection(): string
+ {
+ return $this->section;
+ }
}
diff --git a/src/EventSubscriber/UserPreferenceSubscriber.php b/src/EventSubscriber/UserPreferenceSubscriber.php
index 3198ccbd..89c20ab1 100644
--- a/src/EventSubscriber/UserPreferenceSubscriber.php
+++ b/src/EventSubscriber/UserPreferenceSubscriber.php
@@ -106,6 +106,7 @@ class UserPreferenceSubscriber implements EventSubscriberInterface
->setName(UserPreference::HOURLY_RATE)
->setValue(0)
->setOrder(100)
+ ->setSection('rate')
->setType(MoneyType::class)
->setEnabled($enableHourlyRate)
->setOptions($hourlyRateOptions)
@@ -115,6 +116,7 @@ class UserPreferenceSubscriber implements EventSubscriberInterface
->setName(UserPreference::INTERNAL_RATE)
->setValue(null)
->setOrder(101)
+ ->setSection('rate')
->setType(MoneyType::class)
->setEnabled($enableHourlyRate)
->setOptions(array_merge($hourlyRateOptions, ['label' => 'label.rate_internal', 'required' => false]))
@@ -124,54 +126,63 @@ class UserPreferenceSubscriber implements EventSubscriberInterface
->setName(UserPreference::TIMEZONE)
->setValue($this->getDefaultTimezone())
->setOrder(200)
+ ->setSection('locale')
->setType(TimezoneType::class),
(new UserPreference())
->setName(UserPreference::LOCALE)
->setValue($this->getDefaultLanguage())
->setOrder(300)
+ ->setSection('locale')
->setType(LanguageType::class),
(new UserPreference())
->setName(UserPreference::SKIN)
->setValue($this->getDefaultTheme())
->setOrder(400)
+ ->setSection('theme')
->setType(SkinType::class),
(new UserPreference())
->setName('theme.layout')
->setValue('fixed')
->setOrder(450)
+ ->setSection('theme')
->setType(ThemeLayoutType::class),
(new UserPreference())
->setName('theme.collapsed_sidebar')
->setValue(false)
->setOrder(500)
+ ->setSection('theme')
->setType(CheckboxType::class),
(new UserPreference())
->setName('calendar.initial_view')
->setValue(CalendarViewType::DEFAULT_VIEW)
->setOrder(600)
+ ->setSection('behaviour')
->setType(CalendarViewType::class),
(new UserPreference())
->setName('login.initial_view')
->setValue(InitialViewType::DEFAULT_VIEW)
->setOrder(700)
+ ->setSection('behaviour')
->setType(InitialViewType::class),
(new UserPreference())
->setName('timesheet.daily_stats')
->setValue(false)
->setOrder(800)
+ ->setSection('behaviour')
->setType(CheckboxType::class),
(new UserPreference())
->setName('timesheet.export_decimal')
->setValue(false)
->setOrder(900)
+ ->setSection('behaviour')
->setType(CheckboxType::class),
];
}
@@ -195,6 +206,7 @@ class UserPreferenceSubscriber implements EventSubscriberInterface
->setEnabled($preference->isEnabled())
->setOptions($preference->getOptions())
->setOrder($preference->getOrder())
+ ->setSection($preference->getSection())
;
} else {
$user->addPreference($preference);
diff --git a/src/Form/ProjectEditForm.php b/src/Form/ProjectEditForm.php
index 9410d847..b89fa9d0 100644
--- a/src/Form/ProjectEditForm.php
+++ b/src/Form/ProjectEditForm.php
@@ -78,6 +78,7 @@ class ProjectEditForm extends AbstractType
'required' => false,
]))
->add('customer', CustomerType::class, [
+ 'placeholder' => (null === $id && null === $customer) ? '' : false,
'query_builder' => function (CustomerRepository $repo) use ($builder, $customer) {
$query = new CustomerFormTypeQuery($customer);
$query->setUser($builder->getOption('user'));
diff --git a/templates/activity/details.html.twig b/templates/activity/details.html.twig
index 1db3d693..8889f748 100644
--- a/templates/activity/details.html.twig
+++ b/templates/activity/details.html.twig
@@ -32,11 +32,11 @@
{{ activity.comment|comment2html(true) }}
{% endif %}
-
+
{% if not activity.visible %}
| {{ 'label.visible'|trans }} |
-
+ |
{{ widgets.label_boolean(activity.visible) }}
|
@@ -46,10 +46,11 @@
{{ 'label.customer'|trans }} |
{{ widgets.label_customer(activity.project.customer) }}
- {% if activity.project.customer.teams|length == 0 %}
- {{ widgets.icon('unlocked') }}
- {% endif %}
-
+ |
+
+ {{ widgets.badge_team_access(activity.project.customer.teams) }}
+ |
+
{{ customerActions.customer(activity.project.customer, 'custom') }}
|
@@ -57,10 +58,11 @@
{{ 'label.project'|trans }} |
{{ widgets.label_project(activity.project) }}
- {% if activity.project.teams|length == 0 %}
- {{ widgets.icon('unlocked') }}
- {% endif %}
-
+ |
+
+ {{ widgets.badge_team_access(activity.project.teams) }}
+ |
+
{{ projectActions.project(activity.project, 'custom') }}
|
@@ -68,7 +70,7 @@
{% for metaField in activity.visibleMetaFields %}
| {{ metaField.label|trans }} |
- {{ widgets.form_type_value(metaField.type, metaField.value, activity) }} |
+ {{ widgets.form_type_value(metaField.type, metaField.value, activity) }} |
{% endfor %}
diff --git a/templates/activity/edit.html.twig b/templates/activity/edit.html.twig
index 89f1b197..8ac42476 100644
--- a/templates/activity/edit.html.twig
+++ b/templates/activity/edit.html.twig
@@ -7,7 +7,7 @@
{% block main %}
{% set formEditTemplate = app.request.xmlHttpRequest ? 'default/_form_modal.html.twig' : 'default/_form.html.twig' %}
{% set formOptions = {
- 'title': activity.name|default('create'|trans),
+ 'title': activity.name|default('create-activity'|trans({}, 'actions')),
'form': form,
'back': path('admin_activity')
} %}
diff --git a/templates/customer/actions.html.twig b/templates/customer/actions.html.twig
index edba6500..dd3018f6 100644
--- a/templates/customer/actions.html.twig
+++ b/templates/customer/actions.html.twig
@@ -48,7 +48,7 @@
{% set actions = actions|merge({'timesheet': path('admin_timesheet', {'customers[]': customer.id})}) %}
{% endif %}
{% if customer.visible and is_granted('create_project') %}
- {% set actions = actions|merge({'create-project': path('admin_project_create_with_customer', {'customer': customer.id})}) %}
+ {% set actions = actions|merge({'create-project': {'url': path('admin_project_create_with_customer', {'customer': customer.id}), 'class': 'modal-ajax-form'}}) %}
{% endif %}
{% if view == 'index' and is_granted('delete', customer) %}
{% set actions = actions|merge({'trash': {'url': path('admin_customer_delete', {'id': customer.id}), 'class': 'modal-ajax-form'}}) %}
diff --git a/templates/customer/details.html.twig b/templates/customer/details.html.twig
index f701ba1c..f7b6fce9 100644
--- a/templates/customer/details.html.twig
+++ b/templates/customer/details.html.twig
@@ -27,7 +27,7 @@
{{ customer.comment|comment2html(true) }}
{% endif %}
-
+
{% if not customer.visible %}
| {{ 'label.visible'|trans }} |
diff --git a/templates/embeds/comments.html.twig b/templates/embeds/comments.html.twig
index 9819df29..4d8a030e 100644
--- a/templates/embeds/comments.html.twig
+++ b/templates/embeds/comments.html.twig
@@ -13,7 +13,7 @@
{% endif %}
{% for comment in comments %}