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
|
||||
|
||||
- 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
|
||||
|
||||
|
||||
@@ -30,9 +30,10 @@ function getFontFamilyCandidates(value) {
|
||||
|
||||
function addReference(references, seen, ownerKey, referenceType, value) {
|
||||
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)) {
|
||||
const numericValue = Number(referenceValue);
|
||||
if (!Number.isFinite(numericValue)) return;
|
||||
if (!Number.isFinite(numericValue) || numericValue === 0) return;
|
||||
referenceValue = String(numericValue);
|
||||
}
|
||||
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]), [
|
||||
['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