Exclude empty and zero content references
This commit is contained in:
1 parent
0044cbc1fc
commit
f7d29ac326
3 files changed
+42
-2
No files matched your search
+1
-1
@@ -6,7 +6,7 @@ All notable changes to this project will be documented in this file.
|
|||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|
||||||
- Font reference indexing handles HTML-encoded quotes and excludes built-in fonts and generic fallbacks. A one-time migration rebuilds font references for all slides and template defaults without changing content or other reference types.
|
- Font reference indexing handles HTML-encoded quotes and excludes built-in fonts and generic fallbacks. Empty and zero item selections are excluded from reference indexing. A one-time migration rebuilds font references for all slides and template defaults without changing content or other reference types.
|
||||||
|
|
||||||
## 2.19.0 - 2026-10-24
|
## 2.19.0 - 2026-10-24
|
||||||
|
|
||||||
|
|||||||
@@ -30,9 +30,10 @@ function getFontFamilyCandidates(value) {
|
|||||||
|
|
||||||
function addReference(references, seen, ownerKey, referenceType, value) {
|
function addReference(references, seen, ownerKey, referenceType, value) {
|
||||||
let referenceValue = String(value === undefined || value === null ? '' : value).trim();
|
let referenceValue = String(value === undefined || value === null ? '' : value).trim();
|
||||||
|
if (!referenceValue || referenceValue === '0') return;
|
||||||
if (['api-request', 'rss-feed', 'timetable-group', 'weather-location'].includes(referenceType)) {
|
if (['api-request', 'rss-feed', 'timetable-group', 'weather-location'].includes(referenceType)) {
|
||||||
const numericValue = Number(referenceValue);
|
const numericValue = Number(referenceValue);
|
||||||
if (!Number.isFinite(numericValue)) return;
|
if (!Number.isFinite(numericValue) || numericValue === 0) return;
|
||||||
referenceValue = String(numericValue);
|
referenceValue = String(numericValue);
|
||||||
}
|
}
|
||||||
if (referenceType === 'font-family') {
|
if (referenceType === 'font-family') {
|
||||||
|
|||||||
@@ -120,4 +120,43 @@ test('content references omit built-in font stacks but retain managed font famil
|
|||||||
assert.deepEqual(references.map(reference => [reference.owner_key, reference.reference_value]), [
|
assert.deepEqual(references.map(reference => [reference.owner_key, reference.reference_value]), [
|
||||||
['managed', 'ubuntu regular']
|
['managed', 'ubuntu regular']
|
||||||
]);
|
]);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('content references omit zero and empty item selections for every typed reference field', () => {
|
||||||
|
const fields = ['source_id', 'feed_id', 'timetable_group_id', 'weather_location_id', 'weather_icon_set_id'];
|
||||||
|
for (const field of fields) {
|
||||||
|
for (const value of [0, '0', ' 0 ', '', ' ', null, undefined]) {
|
||||||
|
assert.deepEqual(collectContentReferences('slide', 117, { empty: { [field]: value } }), [], field + ': ' + String(value));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (const field of fields.slice(0, -1)) {
|
||||||
|
for (const value of ['00', '0.0', '-0']) {
|
||||||
|
assert.deepEqual(collectContentReferences('template', 42, { empty: { [field]: value } }), [], field + ': ' + value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
test('content reference replacement removes stored zero selections while preserving valid references', async () => {
|
||||||
|
const calls = [];
|
||||||
|
const connection = {
|
||||||
|
async query(sql, params) {
|
||||||
|
calls.push([sql, params]);
|
||||||
|
if (sql.startsWith('SELECT id, owner_key')) {
|
||||||
|
return [[
|
||||||
|
{ id: 101, owner_key: 'api', reference_type: 'api-request', reference_value: '0' },
|
||||||
|
{ id: 102, owner_key: 'feed', reference_type: 'rss-feed', reference_value: '8' }
|
||||||
|
]];
|
||||||
|
}
|
||||||
|
return [{}];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
await replaceContentReferences(connection, 'slide', 117, {
|
||||||
|
api: { source_id: 0 },
|
||||||
|
feed: { feed_id: 8 }
|
||||||
|
});
|
||||||
|
|
||||||
|
const deletion = calls.find(([sql]) => sql.startsWith('DELETE FROM c_content_references'));
|
||||||
|
assert.deepEqual(deletion[1], ['slide', 117, [101]]);
|
||||||
|
assert.ok(!calls.some(([sql]) => sql.startsWith('INSERT')));
|
||||||
});
|
});
|
||||||
Reference in new issue
Block a user