mirror of
https://gitlab.com/Chill-Projet/chill-bundles.git
synced 2025-10-07 22:09:46 +00:00
Compare commits
12 Commits
v4.5.0
...
423-enviro
Author | SHA1 | Date | |
---|---|---|---|
2cac6b78db | |||
49fc02a7da | |||
52344cda3b | |||
822a297e36 | |||
bc2fbee5c6 | |||
ebd10ca522 | |||
d3a31be412
|
|||
d159a82f88
|
|||
c2d9c73fd4
|
|||
0d6d15fcf7 | |||
f9ad96c78b
|
|||
fcc9529a20
|
6
.changes/unreleased/Feature-20251007-101949.yaml
Normal file
6
.changes/unreleased/Feature-20251007-101949.yaml
Normal file
@@ -0,0 +1,6 @@
|
||||
kind: Feature
|
||||
body: Create environment banner that can be activated and configured depending on the image deployed
|
||||
time: 2025-10-07T10:19:49.784462956+02:00
|
||||
custom:
|
||||
Issue: "423"
|
||||
SchemaChange: No schema change
|
6
.changes/unreleased/Fixed-20251003-224044.yaml
Normal file
6
.changes/unreleased/Fixed-20251003-224044.yaml
Normal file
@@ -0,0 +1,6 @@
|
||||
kind: Fixed
|
||||
body: Fix the rendering of list of StoredObjectVersions, where there are kept version (before converting to pdf) and intermediate versions deleted
|
||||
time: 2025-10-03T22:40:44.685474863+02:00
|
||||
custom:
|
||||
Issue: ""
|
||||
SchemaChange: No schema change
|
6
.changes/unreleased/Fixed-20251006-121315.yaml
Normal file
6
.changes/unreleased/Fixed-20251006-121315.yaml
Normal file
@@ -0,0 +1,6 @@
|
||||
kind: Fixed
|
||||
body: 'Notification: fix editing of sent notification by removing form.addressesEmails, a field that no longer exists'
|
||||
time: 2025-10-06T12:13:15.45905994+02:00
|
||||
custom:
|
||||
Issue: "434"
|
||||
SchemaChange: No schema change
|
4
.changes/v4.5.1.md
Normal file
4
.changes/v4.5.1.md
Normal file
@@ -0,0 +1,4 @@
|
||||
## v4.5.1 - 2025-10-03
|
||||
### Fixed
|
||||
* Add missing javascript dependency
|
||||
* Add exception handling for conversion of attachment on sending external, when documens are already in pdf
|
@@ -6,6 +6,11 @@ adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html),
|
||||
and is generated by [Changie](https://github.com/miniscruff/changie).
|
||||
|
||||
|
||||
## v4.5.1 - 2025-10-03
|
||||
### Fixed
|
||||
* Add missing javascript dependency
|
||||
* Add exception handling for conversion of attachment on sending external, when documens are already in pdf
|
||||
|
||||
## v4.5.0 - 2025-10-03
|
||||
### Feature
|
||||
* Only allow delete of attachment on workflows that are not final
|
||||
|
@@ -1,6 +1,13 @@
|
||||
chill_main:
|
||||
available_languages: [ '%env(resolve:LOCALE)%', 'en' ]
|
||||
available_countries: ['BE', 'FR']
|
||||
top_banner:
|
||||
visible: true
|
||||
text:
|
||||
fr: 'Vous travaillez actuellement avec la version de PRÉ-PRODUCTION.'
|
||||
nl: 'Je werkt momenteel in de PRE-PRODUCTIE versie'
|
||||
color: '#353535'
|
||||
background_color: '#d8bb48'
|
||||
notifications:
|
||||
from_email: '%env(resolve:NOTIFICATION_FROM_EMAIL)%'
|
||||
from_name: '%env(resolve:NOTIFICATION_FROM_NAME)%'
|
||||
|
@@ -55,6 +55,7 @@
|
||||
"@tsconfig/node20": "^20.1.4",
|
||||
"@types/dompurify": "^3.0.5",
|
||||
"@types/leaflet": "^1.9.3",
|
||||
"@vueuse/core": "^13.9.0",
|
||||
"bootstrap-icons": "^1.11.3",
|
||||
"dropzone": "^5.7.6",
|
||||
"es6-promise": "^4.2.8",
|
||||
|
@@ -59,7 +59,7 @@ final readonly class StoredObjectVersionApiController
|
||||
|
||||
return new JsonResponse(
|
||||
$this->serializer->serialize(
|
||||
new Collection($items, $paginator),
|
||||
new Collection(array_values($items->toArray()), $paginator),
|
||||
'json',
|
||||
[AbstractNormalizer::GROUPS => ['read', StoredObjectVersionNormalizer::WITH_POINT_IN_TIMES_CONTEXT, StoredObjectVersionNormalizer::WITH_RESTORED_CONTEXT]]
|
||||
),
|
||||
|
@@ -0,0 +1,20 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
/*
|
||||
* Chill is a software for social workers
|
||||
*
|
||||
* For the full copyright and license information, please view
|
||||
* the LICENSE file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Chill\DocStoreBundle\Exception;
|
||||
|
||||
class ConversionWithSameMimeTypeException extends \RuntimeException
|
||||
{
|
||||
public function __construct(string $mimeType, ?\Throwable $previous = null)
|
||||
{
|
||||
parent::__construct("Conversion to same MIME type '{$mimeType}' is not allowed: already at the same MIME type", 0, $previous);
|
||||
}
|
||||
}
|
@@ -3,9 +3,9 @@ import {
|
||||
StoredObject,
|
||||
StoredObjectPointInTime,
|
||||
StoredObjectVersionWithPointInTime,
|
||||
} from "./../../../types";
|
||||
} from "ChillDocStoreAssets/types";
|
||||
import UserRenderBoxBadge from "ChillMainAssets/vuejs/_components/Entity/UserRenderBoxBadge.vue";
|
||||
import { ISOToDatetime } from "./../../../../../../ChillMainBundle/Resources/public/chill/js/date";
|
||||
import { ISOToDatetime } from "ChillMainAssets/chill/js/date";
|
||||
import FileIcon from "ChillDocStoreAssets/vuejs/FileIcon.vue";
|
||||
import RestoreVersionButton from "ChillDocStoreAssets/vuejs/StoredObjectButton/HistoryButton/RestoreVersionButton.vue";
|
||||
import DownloadButton from "ChillDocStoreAssets/vuejs/StoredObjectButton/DownloadButton.vue";
|
||||
|
@@ -15,6 +15,7 @@ use Chill\DocStoreBundle\Entity\StoredObject;
|
||||
use Chill\DocStoreBundle\Entity\StoredObjectPointInTime;
|
||||
use Chill\DocStoreBundle\Entity\StoredObjectPointInTimeReasonEnum;
|
||||
use Chill\DocStoreBundle\Entity\StoredObjectVersion;
|
||||
use Chill\DocStoreBundle\Exception\ConversionWithSameMimeTypeException;
|
||||
use Chill\DocStoreBundle\Exception\StoredObjectManagerException;
|
||||
use Chill\WopiBundle\Service\WopiConverter;
|
||||
use Symfony\Component\Mime\MimeTypesInterface;
|
||||
@@ -41,9 +42,10 @@ class StoredObjectToPdfConverter
|
||||
*
|
||||
* @return array{0: StoredObjectPointInTime, 1: StoredObjectVersion, 2?: string} contains the point in time before conversion and the new version of the stored object. The converted content is included in the response if $includeConvertedContent is true
|
||||
*
|
||||
* @throws \UnexpectedValueException if the preferred mime type for the conversion is not found
|
||||
* @throws \RuntimeException if the conversion or storage of the new version fails
|
||||
* @throws \UnexpectedValueException if the preferred mime type for the conversion is not found
|
||||
* @throws \RuntimeException if the conversion or storage of the new version fails
|
||||
* @throws StoredObjectManagerException
|
||||
* @throws ConversionWithSameMimeTypeException if the document has already the same mime type79*
|
||||
*/
|
||||
public function addConvertedVersion(StoredObject $storedObject, string $lang, $convertTo = 'pdf', bool $includeConvertedContent = false): array
|
||||
{
|
||||
@@ -56,7 +58,7 @@ class StoredObjectToPdfConverter
|
||||
$currentVersion = $storedObject->getCurrentVersion();
|
||||
|
||||
if ($currentVersion->getType() === $newMimeType) {
|
||||
throw new \UnexpectedValueException('Already at the same mime type');
|
||||
throw new ConversionWithSameMimeTypeException($newMimeType);
|
||||
}
|
||||
|
||||
$content = $this->storedObjectManager->read($currentVersion);
|
||||
|
@@ -40,6 +40,10 @@ class StoredObjectVersionApiControllerTest extends \PHPUnit\Framework\TestCase
|
||||
$storedObject->registerVersion();
|
||||
}
|
||||
|
||||
// remove one version in the history
|
||||
$v5 = $storedObject->getVersions()->get(5);
|
||||
$storedObject->removeVersion($v5);
|
||||
|
||||
$security = $this->prophesize(Security::class);
|
||||
$security->isGranted(StoredObjectRoleEnum::SEE->value, $storedObject)
|
||||
->willReturn(true)
|
||||
@@ -53,6 +57,7 @@ class StoredObjectVersionApiControllerTest extends \PHPUnit\Framework\TestCase
|
||||
self::assertEquals($response->getStatusCode(), 200);
|
||||
self::assertIsArray($body);
|
||||
self::assertArrayHasKey('results', $body);
|
||||
self::assertIsList($body['results']);
|
||||
self::assertCount(10, $body['results']);
|
||||
}
|
||||
|
||||
|
@@ -205,6 +205,11 @@ class ChillMainExtension extends Extension implements
|
||||
[]
|
||||
);
|
||||
|
||||
$container->setParameter(
|
||||
'chill_main.top_banner',
|
||||
$config['top_banner'] ?? []
|
||||
);
|
||||
|
||||
$loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../config'));
|
||||
$loader->load('services.yaml');
|
||||
$loader->load('services/doctrine.yaml');
|
||||
@@ -250,6 +255,7 @@ class ChillMainExtension extends Extension implements
|
||||
'name' => $config['installation_name'], ],
|
||||
'available_languages' => $config['available_languages'],
|
||||
'add_address' => $config['add_address'],
|
||||
'chill_main_config' => $config,
|
||||
],
|
||||
'form_themes' => ['@ChillMain/Form/fields.html.twig'],
|
||||
];
|
||||
|
@@ -168,6 +168,20 @@ class Configuration implements ConfigurationInterface
|
||||
->end()
|
||||
->end()
|
||||
->end()
|
||||
->arrayNode('top_banner')
|
||||
->canBeUnset()
|
||||
->children()
|
||||
->booleanNode('visible')
|
||||
->defaultFalse()
|
||||
->end()
|
||||
->arrayNode('text')
|
||||
->useAttributeAsKey('lang')
|
||||
->scalarPrototype()->end()
|
||||
->end() // end of text
|
||||
->scalarNode('color')->defaultNull()->end()
|
||||
->scalarNode('background_color')->defaultNull()->end()
|
||||
->end() // end of top_banner children
|
||||
->end() // end of top_banner
|
||||
->arrayNode('widgets')
|
||||
->canBeEnabled()
|
||||
->canBeUnset()
|
||||
|
@@ -0,0 +1,17 @@
|
||||
{% if chill_main_config.top_banner is defined and chill_main_config.top_banner.text is defined %}
|
||||
{% set banner_text = '' %}
|
||||
{% set current_locale = app.request.locale %}
|
||||
|
||||
{% if chill_main_config.top_banner.text[current_locale] is defined %}
|
||||
{% set banner_text = chill_main_config.top_banner.text[current_locale] %}
|
||||
{% else %}
|
||||
{% set banner_text = chill_main_config.top_banner.text|first %}
|
||||
{% endif %}
|
||||
|
||||
{% if banner_text %}
|
||||
<div class="top-banner w-100 text-center py-2"
|
||||
style="{% if chill_main_config.top_banner.color is defined %}color: {{ chill_main_config.top_banner.color }};{% endif %}{% if chill_main_config.top_banner.background_color is defined %}background-color: {{ chill_main_config.top_banner.background_color }};{% endif %}">
|
||||
{{ banner_text }}
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endif %}
|
@@ -21,8 +21,6 @@
|
||||
{{ form_row(form.title, { 'label': 'notification.subject'|trans }) }}
|
||||
{{ form_row(form.addressees, { 'label': 'notification.sent_to'|trans }) }}
|
||||
|
||||
{{ form_row(form.addressesEmails) }}
|
||||
|
||||
{% include handler.template(notification) with handler.templateData(notification) %}
|
||||
|
||||
<div class="mb-3 row">
|
||||
|
@@ -26,6 +26,10 @@
|
||||
</head>
|
||||
|
||||
<body>
|
||||
{% if chill_main_config.top_banner is defined and chill_main_config.top_banner.visible is true %}
|
||||
{{ include('@ChillMain/Layout/_top_banner.html.twig') }}
|
||||
{% endif %}
|
||||
|
||||
{% if responsive_debug is defined and responsive_debug == 1 %}
|
||||
{{ include('@ChillMain/Layout/_debug.html.twig') }}
|
||||
{% endif %}
|
||||
|
@@ -0,0 +1,98 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
/*
|
||||
* Chill is a software for social workers
|
||||
*
|
||||
* For the full copyright and license information, please view
|
||||
* the LICENSE file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Chill\MainBundle\Tests\DependencyInjection;
|
||||
|
||||
use Chill\MainBundle\DependencyInjection\Configuration;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
use Symfony\Component\Config\Definition\Processor;
|
||||
use Symfony\Component\DependencyInjection\ContainerBuilder;
|
||||
|
||||
/**
|
||||
* @internal
|
||||
*
|
||||
* @coversNothing
|
||||
*/
|
||||
class ConfigurationTest extends TestCase
|
||||
{
|
||||
public function testTopBannerConfiguration(): void
|
||||
{
|
||||
$containerBuilder = new ContainerBuilder();
|
||||
$configuration = new Configuration([], $containerBuilder);
|
||||
$processor = new Processor();
|
||||
|
||||
// Test with top_banner configuration
|
||||
$config = [
|
||||
'chill_main' => [
|
||||
'top_banner' => [
|
||||
'text' => [
|
||||
'fr' => 'Vous travaillez actuellement avec la version de pré-production de Chill.',
|
||||
'nl' => 'Je werkte momenteel in de pré-productie versie van Chill.',
|
||||
],
|
||||
'color' => 'white',
|
||||
'background-color' => 'red',
|
||||
],
|
||||
],
|
||||
];
|
||||
|
||||
$processedConfig = $processor->processConfiguration($configuration, $config);
|
||||
|
||||
self::assertArrayHasKey('top_banner', $processedConfig);
|
||||
self::assertArrayHasKey('text', $processedConfig['top_banner']);
|
||||
self::assertArrayHasKey('fr', $processedConfig['top_banner']['text']);
|
||||
self::assertArrayHasKey('nl', $processedConfig['top_banner']['text']);
|
||||
self::assertSame('white', $processedConfig['top_banner']['color']);
|
||||
self::assertSame('red', $processedConfig['top_banner']['background_color']);
|
||||
}
|
||||
|
||||
public function testTopBannerConfigurationOptional(): void
|
||||
{
|
||||
$containerBuilder = new ContainerBuilder();
|
||||
$configuration = new Configuration([], $containerBuilder);
|
||||
$processor = new Processor();
|
||||
|
||||
// Test without top_banner configuration
|
||||
$config = [
|
||||
'chill_main' => [],
|
||||
];
|
||||
|
||||
$processedConfig = $processor->processConfiguration($configuration, $config);
|
||||
|
||||
// top_banner should not be present when not configured
|
||||
self::assertArrayNotHasKey('top_banner', $processedConfig);
|
||||
}
|
||||
|
||||
public function testTopBannerWithMinimalConfiguration(): void
|
||||
{
|
||||
$containerBuilder = new ContainerBuilder();
|
||||
$configuration = new Configuration([], $containerBuilder);
|
||||
$processor = new Processor();
|
||||
|
||||
// Test with minimal top_banner configuration (only text)
|
||||
$config = [
|
||||
'chill_main' => [
|
||||
'top_banner' => [
|
||||
'text' => [
|
||||
'fr' => 'Test message',
|
||||
],
|
||||
],
|
||||
],
|
||||
];
|
||||
|
||||
$processedConfig = $processor->processConfiguration($configuration, $config);
|
||||
|
||||
self::assertArrayHasKey('top_banner', $processedConfig);
|
||||
self::assertArrayHasKey('text', $processedConfig['top_banner']);
|
||||
self::assertSame('Test message', $processedConfig['top_banner']['text']['fr']);
|
||||
self::assertNull($processedConfig['top_banner']['color']);
|
||||
self::assertNull($processedConfig['top_banner']['background_color']);
|
||||
}
|
||||
}
|
@@ -11,6 +11,7 @@ declare(strict_types=1);
|
||||
|
||||
namespace Chill\MainBundle\Workflow\Messenger;
|
||||
|
||||
use Chill\DocStoreBundle\Exception\ConversionWithSameMimeTypeException;
|
||||
use Chill\DocStoreBundle\Exception\StoredObjectManagerException;
|
||||
use Chill\DocStoreBundle\Service\StoredObjectToPdfConverter;
|
||||
use Chill\MainBundle\Entity\Workflow\EntityWorkflow;
|
||||
@@ -55,6 +56,8 @@ final readonly class PostSendExternalMessageHandler implements MessageHandlerInt
|
||||
$this->storedObjectToPdfConverter->addConvertedVersion($attachment->getProxyStoredObject(), $locale);
|
||||
} catch (StoredObjectManagerException $e) {
|
||||
$this->logger->error('Error converting attachment to PDF', ['backtrace' => $e->getTraceAsString(), 'attachment_id' => $attachment->getId()]);
|
||||
} catch (ConversionWithSameMimeTypeException $e) {
|
||||
$this->logger->error('Error converting attachment to PDF: already at the same MIME type', ['backtrace' => $e->getTraceAsString(), 'attachment_id' => $attachment->getId()]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -65,6 +68,8 @@ final readonly class PostSendExternalMessageHandler implements MessageHandlerInt
|
||||
$this->storedObjectToPdfConverter->addConvertedVersion($storedObject, $locale);
|
||||
} catch (StoredObjectManagerException $e) {
|
||||
$this->logger->error('Error converting stored object to PDF', ['backtrace' => $e->getTraceAsString(), 'stored_object_id' => $storedObject->getId(), 'workflow_id' => $entityWorkflow->getId()]);
|
||||
} catch (ConversionWithSameMimeTypeException $e) {
|
||||
$this->logger->error('Error converting stored object to PDF: already at the same MIME type', ['backtrace' => $e->getTraceAsString(), 'stored_object_id' => $storedObject->getId(), 'workflow_id' => $entityWorkflow->getId()]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user