diff --git a/.github_changelog_generator b/.github_changelog_generator
index ffa810ff..96623608 100644
--- a/.github_changelog_generator
+++ b/.github_changelog_generator
@@ -1,5 +1,5 @@
unreleased=true
-future-release=1.15.6
+future-release=1.16
exclude-labels=duplicate,support,question,invalid,wontfix,release,waiting for feedback,documentation
enhancement_labels=>enhancement,Enhancement,feature request,translation i18n,technical debt,documentation
issues-wo-labels=false
diff --git a/SECURITY.md b/SECURITY.md
index 68157057..1f1921d3 100644
--- a/SECURITY.md
+++ b/SECURITY.md
@@ -7,8 +7,8 @@ As announced in the [README](README.md) I only support the latest available rele
| Version | Supported |
| ------- | ------------------ |
| master | :white_check_mark: |
-| 1.15 | :white_check_mark: |
-| < 1.15 | :x: |
+| 1.16 | :white_check_mark: |
+| < 1.16 | :x: |
## Reporting a Vulnerability
diff --git a/src/Constants.php b/src/Constants.php
index d3034e05..1deece0d 100644
--- a/src/Constants.php
+++ b/src/Constants.php
@@ -25,7 +25,7 @@ class Constants
/**
* The current release status, either "stable" or "dev"
*/
- public const STATUS = 'dev';
+ public const STATUS = 'prod';
/**
* The software name
*/
diff --git a/src/DependencyInjection/Compiler/ExportServiceCompilerPass.php b/src/DependencyInjection/Compiler/ExportServiceCompilerPass.php
index 2b2d98e3..de4cbcc1 100644
--- a/src/DependencyInjection/Compiler/ExportServiceCompilerPass.php
+++ b/src/DependencyInjection/Compiler/ExportServiceCompilerPass.php
@@ -56,6 +56,9 @@ class ExportServiceCompilerPass implements CompilerPassInterface
foreach (glob($path . $exportPath . '/*.html.twig') as $htmlTpl) {
$tplName = basename($htmlTpl);
+ if (stripos($tplName, '-bundle') !== false) {
+ continue;
+ }
$serviceId = 'exporter_renderer.' . str_replace('.', '_', $tplName);
@@ -70,6 +73,9 @@ class ExportServiceCompilerPass implements CompilerPassInterface
foreach (glob($path . $exportPath . '/*.pdf.twig') as $pdfHtml) {
$tplName = basename($pdfHtml);
+ if (stripos($tplName, '-bundle') !== false) {
+ continue;
+ }
$serviceId = 'exporter_renderer.' . str_replace('.', '_', $tplName);
diff --git a/src/Kernel.php b/src/Kernel.php
index b0e90cf9..6e5988ab 100644
--- a/src/Kernel.php
+++ b/src/Kernel.php
@@ -120,33 +120,26 @@ class Kernel extends BaseKernel
}
} else {
// ... or we load them dynamically from the plugins directory
- foreach ($this->getBundleDirectories() as $bundleDir) {
- $bundleName = $bundleDir->getRelativePathname();
- $pluginClass = 'KimaiPlugin\\' . $bundleName . '\\' . $bundleName;
+ foreach ($this->getBundleClasses() as $pluginClass) {
yield new $pluginClass();
}
}
}
- private function getBundleDirectories(): array
+ private function getBundleClasses(): array
{
$pluginsDir = $this->getProjectDir() . '/var/plugins';
if (!file_exists($pluginsDir)) {
return [];
}
- $directories = [];
+ $plugins = [];
$finder = new Finder();
$finder->ignoreUnreadableDirs()->directories()->name('*Bundle');
/** @var SplFileInfo $bundleDir */
foreach ($finder->in($pluginsDir) as $bundleDir) {
$bundleName = $bundleDir->getRelativePathname();
- $bundleFilename = $bundleDir->getRealPath() . '/' . $bundleName . '.php';
- if (!file_exists($bundleFilename)) {
- continue;
- }
-
if (file_exists($bundleDir->getRealPath() . '/.disabled')) {
continue;
}
@@ -156,10 +149,10 @@ class Kernel extends BaseKernel
continue;
}
- $directories[] = $bundleDir;
+ $plugins[] = $pluginClass;
}
- return $directories;
+ return $plugins;
}
protected function configureContainer(ContainerBuilder $container, LoaderInterface $loader)
@@ -223,7 +216,11 @@ class Kernel extends BaseKernel
foreach ($this->bundles as $bundle) {
if (strpos(\get_class($bundle), 'KimaiPlugin\\') !== false) {
- $routes->import($bundle->getPath() . '/Resources/config/routes' . self::CONFIG_EXTS, '/', 'glob');
+ if (is_dir($bundle->getPath() . '/Resources/config/')) {
+ $routes->import($bundle->getPath() . '/Resources/config/routes' . self::CONFIG_EXTS, '/', 'glob');
+ } elseif (is_dir($bundle->getPath() . '/config/')) {
+ $routes->import($bundle->getPath() . '/config/routes' . self::CONFIG_EXTS, '/', 'glob');
+ }
}
}
}
diff --git a/src/Twig/LocaleFormatExtensions.php b/src/Twig/LocaleFormatExtensions.php
index 2387dbb7..c0c8d6dc 100644
--- a/src/Twig/LocaleFormatExtensions.php
+++ b/src/Twig/LocaleFormatExtensions.php
@@ -205,7 +205,7 @@ final class LocaleFormatExtensions extends AbstractExtension
public function dateWeekday(DateTime $date): string
{
- return $this->dayName($date, true) . ', ' . $this->getFormatter()->dateFormat($date, 'd');
+ return $this->dayName($date, true) . ' ' . $this->getFormatter()->dateFormat($date, 'd');
}
/**
diff --git a/translations/actions.de.xlf b/translations/actions.de.xlf
index 386cdbf2..5c063084 100644
--- a/translations/actions.de.xlf
+++ b/translations/actions.de.xlf
@@ -94,7 +94,7 @@
invoice.paid
Rechnung bezahlt
-
+
invoice.cancel
Rechnung stornieren
diff --git a/translations/actions.el.xlf b/translations/actions.el.xlf
index 790633d7..94f35c54 100644
--- a/translations/actions.el.xlf
+++ b/translations/actions.el.xlf
@@ -98,7 +98,7 @@
filter
Φιλτράρισμα δεδομένων
-
+
invoice.cancel
Ακύρωση τιμολογίου
diff --git a/translations/actions.en.xlf b/translations/actions.en.xlf
index 6ad1e50d..51687e0d 100644
--- a/translations/actions.en.xlf
+++ b/translations/actions.en.xlf
@@ -94,7 +94,7 @@
invoice.paid
Invoice paid
-
+
invoice.cancel
Cancel invoice
diff --git a/translations/actions.fr.xlf b/translations/actions.fr.xlf
index ca222b0b..c153d76e 100644
--- a/translations/actions.fr.xlf
+++ b/translations/actions.fr.xlf
@@ -98,7 +98,7 @@
filter
Filtrer les données
-
+
invoice.cancel
Annuler la facture
diff --git a/translations/actions.he.xlf b/translations/actions.he.xlf
index dc1ff7d1..a987ffb6 100644
--- a/translations/actions.he.xlf
+++ b/translations/actions.he.xlf
@@ -98,7 +98,7 @@
filter
סינון נתונים
-
+
invoice.cancel
ביטול חשבונית
diff --git a/translations/actions.hr.xlf b/translations/actions.hr.xlf
index fb5da646..8ca826f9 100644
--- a/translations/actions.hr.xlf
+++ b/translations/actions.hr.xlf
@@ -1,4 +1,4 @@
-
+
@@ -98,6 +98,10 @@
filter
Filtriraj podatke
+
+ invoice.cancel
+ Prekini račun
+
diff --git a/translations/actions.it.xlf b/translations/actions.it.xlf
index f84b55b1..137e9281 100644
--- a/translations/actions.it.xlf
+++ b/translations/actions.it.xlf
@@ -98,7 +98,7 @@
filter
Filtra i dati
-
+
invoice.cancel
Annulla la fattura
diff --git a/translations/actions.pt.xlf b/translations/actions.pt.xlf
index aa148d63..a4db200f 100644
--- a/translations/actions.pt.xlf
+++ b/translations/actions.pt.xlf
@@ -98,7 +98,7 @@
filter
Filtrar por data
-
+
invoice.cancel
Cancelar fatura
diff --git a/translations/actions.pt_BR.xlf b/translations/actions.pt_BR.xlf
index 2b5f8e83..8304f8d8 100644
--- a/translations/actions.pt_BR.xlf
+++ b/translations/actions.pt_BR.xlf
@@ -98,7 +98,7 @@
filter
Filtre por data
-
+
invoice.cancel
Cancelar fatura
diff --git a/translations/actions.tr.xlf b/translations/actions.tr.xlf
index fb32e913..cd4ff959 100644
--- a/translations/actions.tr.xlf
+++ b/translations/actions.tr.xlf
@@ -98,7 +98,7 @@
filter
Verileri filtrele
-
+
invoice.cancel
Faturayı iptal et
diff --git a/translations/messages.de.xlf b/translations/messages.de.xlf
index 57831229..e1949532 100644
--- a/translations/messages.de.xlf
+++ b/translations/messages.de.xlf
@@ -1083,7 +1083,7 @@
status.paid
Bezahlt
-
+
status.canceled
Storniert
diff --git a/translations/messages.de_CH.xlf b/translations/messages.de_CH.xlf
index 1abb99de..b79ceeea 100644
--- a/translations/messages.de_CH.xlf
+++ b/translations/messages.de_CH.xlf
@@ -1206,7 +1206,7 @@
label.budgetType_full
Lebenszyklus
-
+
status.canceled
Storniert
diff --git a/translations/messages.el.xlf b/translations/messages.el.xlf
index 209e953d..4fd901cb 100644
--- a/translations/messages.el.xlf
+++ b/translations/messages.el.xlf
@@ -1268,10 +1268,14 @@
quick_entry.title
Εβδομαδιαίες ώρες εργασίας
-
+
status.canceled
Ακυρώθηκε
+
+ label.hours_24
+ 24 ώρες
+