Release 2.0.5 (#3888)

- Fixed: mandatory fields / form validation for invoice template
- Added: Duration as calendar title replacer (open: running records)
- Fixed: HTML injection in Calendar
- Fixed: Doctrine Proxies are not initialized (leads to empty customer/project)
- Fixed: tag creation
- Fixed: validation errors do not need to be logged in prod
- Removed: Customer VCard download, as used library is outdated and not maintained
- Added: supporting translations domains in many new places (menu, help_text, page_setup, report, exporter, calendar)
This commit is contained in:
Kevin Papst
2023-03-05 03:08:43 +01:00
committed by GitHub
parent 3b93afabc8
commit 0cbf0053d2
77 changed files with 1306 additions and 874 deletions

View File

@@ -14,7 +14,7 @@ final class Expose
{
public string $type = 'string';
public function __construct(public ?string $name = null, public ?string $label = null, string $type = 'string', public ?string $exp = null)
public function __construct(public ?string $name = null, public ?string $label = null, string $type = 'string', public ?string $exp = null, public ?string $translationDomain = null)
{
if (!\in_array($type, ['string', 'datetime', 'date', 'time', 'integer', 'float', 'duration', 'boolean', 'array'])) {
throw new \InvalidArgumentException(sprintf('Unknown type "%s" on annotation "%s".', $type, self::class));

View File

@@ -135,7 +135,7 @@ trait RendererTrait
}
$rate = $exportItem->getRate();
$internalRate = $exportItem->getInternalRate();
$internalRate = $exportItem->getInternalRate() ?? 0;
// rate
$summary[$id]['rate'] += $rate;

View File

@@ -13,6 +13,8 @@ final class ColumnDefinition
{
private $accessor;
private string $translationDomain = 'messages';
public function __construct(private string $label, private string $type, callable $accessor)
{
$this->accessor = $accessor;
@@ -32,4 +34,14 @@ final class ColumnDefinition
{
return $this->accessor;
}
public function getTranslationDomain(): string
{
return $this->translationDomain;
}
public function setTranslationDomain(string $translationDomain): void
{
$this->translationDomain = $translationDomain;
}
}

View File

@@ -67,13 +67,19 @@ final class AnnotationExtractor implements ExtractorInterface
$parsed = $this->expressionLanguage->parse($arguments['exp'], ['object']);
$columns[$arguments['name']] = new ColumnDefinition(
$name = $arguments['name'];
$columns[$name] = new ColumnDefinition(
$arguments['label'],
$arguments['type'] ?? 'string',
function ($obj) use ($parsed) {
return $parsed->getNodes()->evaluate([], ['object' => $obj]);
}
);
if (\array_key_exists('translationDomain', $arguments) && \is_string($arguments['translationDomain'])) {
$columns[$name]->setTranslationDomain($arguments['translationDomain']);
}
}
foreach ($reflectionClass->getProperties() as $property) {
@@ -103,6 +109,10 @@ final class AnnotationExtractor implements ExtractorInterface
return $property->getValue($obj);
}
);
if (\array_key_exists('translationDomain', $arguments) && \is_string($arguments['translationDomain'])) {
$columns[$name]->setTranslationDomain($arguments['translationDomain']);
}
}
}
@@ -137,6 +147,10 @@ final class AnnotationExtractor implements ExtractorInterface
return $method->invoke($obj);
}
);
if (\array_key_exists('translationDomain', $arguments) && \is_string($arguments['translationDomain'])) {
$columns[$name]->setTranslationDomain($arguments['translationDomain']);
}
}
}

View File

@@ -66,7 +66,7 @@ class SpreadsheetExporter
$recordsHeaderRow = 1;
foreach ($columns as $settings) {
$sheet->setCellValue(CellAddress::fromColumnAndRow($recordsHeaderColumn++, $recordsHeaderRow), $this->translator->trans($settings->getLabel()));
$sheet->setCellValue(CellAddress::fromColumnAndRow($recordsHeaderColumn++, $recordsHeaderRow), $this->translator->trans($settings->getLabel(), [], $settings->getTranslationDomain()));
}
$entryHeaderRow = $recordsHeaderRow + 1;