fix(custom-fields) : supporte les caracteres accentues dans les placeholders de formule

La regex \w+ ne capturait pas les caracteres accentues (ex. {Diametre}
avec 'è'), le placeholder restait litteral dans la reference auto.
Remplace par [^}]+ avec le flag u/gu cote PHP et JS pour matcher
n'importe quel caractere entre les accolades.
This commit is contained in:
Matthieu
2026-05-11 16:22:52 +02:00
parent 9027917ea2
commit bc32648918
4 changed files with 66 additions and 3 deletions

View File

@@ -204,7 +204,7 @@ const formulaBuilderCustomFields = computed(() => {
const extractFormulaFields = (formula: string | null | undefined): string[] => {
if (!formula) return []
const matches = [...formula.matchAll(/\{(\w+)\}/g)]
const matches = [...formula.matchAll(/\{([^}]+)\}/gu)]
return [...new Set(matches.map(m => m[1]).filter((n): n is string => n !== undefined))]
}

View File

@@ -91,7 +91,7 @@ const preview = computed(() => {
fieldMap.set(f.name, previewExamples[f.type] ?? 'VALEUR')
}
}
return props.modelValue.replace(/\{(\w+)\}/g, (_, name) => fieldMap.get(name) ?? '???')
return props.modelValue.replace(/\{([^}]+)\}/gu, (_, name) => fieldMap.get(name) ?? '???')
})
const insertField = (fieldName: string) => {

View File

@@ -32,7 +32,7 @@ class ReferenceAutoGenerator
}
}
return preg_replace_callback('/\{(\w+)\}/', static function (array $matches) use ($valueMap): string {
return preg_replace_callback('/\{([^}]+)\}/u', static function (array $matches) use ($valueMap): string {
return $valueMap[$matches[1]] ?? '';
}, $modelType->getReferenceFormula());
}

View File

@@ -145,6 +145,69 @@ class ReferenceAutoGeneratorTest extends AbstractApiTestCase
self::assertSame('U507', $result);
}
public function testGenerateWithAccentedFieldName(): void
{
$mt = $this->createModelType('Palier', 'PAL-ACCENT', ModelCategory::PIECE);
$mt->setReferenceFormula('PA-{Diamètre}-33');
$mt->setRequiredFieldsForReference(['Diamètre']);
$em = $this->getEntityManager();
$em->flush();
$cf = $this->createCustomField('Diamètre', 'number', typePiece: $mt);
$piece = $this->createPiece('Palier 70', null, $mt);
$this->createCustomFieldValue($cf, '70', piece: $piece);
$em->refresh($piece);
$generator = self::getContainer()->get('App\Service\ReferenceAutoGenerator');
$result = $generator->generate($piece);
self::assertSame('PA-70-33', $result);
}
public function testGenerateWithNumberTypeField(): void
{
$mt = $this->createModelType('NumberField', 'NUM-001', ModelCategory::PIECE);
$mt->setReferenceFormula('R-{taille}');
$mt->setRequiredFieldsForReference(['taille']);
$em = $this->getEntityManager();
$em->flush();
$cf = $this->createCustomField('taille', 'number', typePiece: $mt);
$piece = $this->createPiece('Piece Number', null, $mt);
$this->createCustomFieldValue($cf, '42', piece: $piece);
$em->refresh($piece);
$generator = self::getContainer()->get('App\Service\ReferenceAutoGenerator');
$result = $generator->generate($piece);
self::assertSame('R-42', $result);
}
public function testGenerateWithDecimalNumberField(): void
{
$mt = $this->createModelType('NumberDec', 'NUM-002', ModelCategory::PIECE);
$mt->setReferenceFormula('R-{taille}');
$mt->setRequiredFieldsForReference(['taille']);
$em = $this->getEntityManager();
$em->flush();
$cf = $this->createCustomField('taille', 'number', typePiece: $mt);
$piece = $this->createPiece('Piece Dec', null, $mt);
$this->createCustomFieldValue($cf, '12.5', piece: $piece);
$em->refresh($piece);
$generator = self::getContainer()->get('App\Service\ReferenceAutoGenerator');
$result = $generator->generate($piece);
self::assertSame('R-12.5', $result);
}
public function testGenerateWithSpaceInFormula(): void
{
$mt = $this->createModelType('Palier2', 'PAL-002', ModelCategory::PIECE);