The sanitize function escaped all @, {, } characters to prevent Angular
from interpreting markdown content as template syntax. With Angular 17+
control flow (@if, @for, @switch, @let, @defer), users need these
constructs to be preserved and compiled.
Extract sanitization logic into markdown-sanitize.helper.ts with a
config-driven pipeline:
- Protect <pre> code blocks from processing
- Extract and preserve control flow blocks (@if/@else, @for/@empty,
@switch/@case/@default, @defer/@placeholder/@loading/@error, @let)
- Decode HTML entities (', ", <, >, &) introduced
by markdown parser inside control flow expressions
- Escape @, {, } only in remaining non-Angular text
- Validate @let to avoid false matches in prose (e.g. headings)
- Handle chain keywords with proper whitespace skipping
- Handle optional parenthesized params (@loading (minimum 300ms))
Add OpenFreeMap as a new built-in map provider with Bright, Positron, and
Liberty styles. It becomes the default roadmap layer for new geo map widgets.
No API key required.
Extend the Custom provider with a "Vector tiles" toggle that allows using
MapLibre GL style URLs from providers like OpenFreeMap or MapTiler, alongside
the existing raster tile URL support. Add optional attribution field for
custom providers. Fully backward compatible with existing widget configurations.
Field-level @JsonIgnoreProperties is a serialization concern that should
not pollute global OpenAPI schemas. Strip it in mapAwareConverter before
ModelResolver sees it. Remove CalculatedField pre-registration as it
loses descriptions on $ref properties.
Pre-registering abstract intermediate types pulls in their full
inheritance chain (UUIDBased, HasUUID) as broken $ref entries.
Leave *Object schemas for these types as-is.
- Remove *Object duplicate schemas when base schema exists
- Pre-register CalculatedField, ContactBased, HasId to prevent
resolution-order issues with @JsonIgnoreProperties
- Deduplicate identical inline allOf entries
- Replace oneOf in additionalProperties.items with base type $ref
Springdoc creates duplicate schemas with an "Object" suffix when a
discriminated type is resolved through multiple paths. Remove identical
duplicates and replace inline oneOf in additionalProperties.items with
base type $ref for Map<K, List<PolymorphicType>> fields.
- Restore private on TEST_SCRIPT_EXPRESSION in CalculatedFieldController
- Restore @Valid on deprecated alarms field in DeviceProfileData
- Remove broken type guard in getTestScriptDialog (AlarmRuleDefinition
DTO has no type field, causing the dialog to never open)