fix(ui): populate preset patterns when definitions are empty
Made-with: Cursor
This commit is contained in:
@@ -637,20 +637,55 @@ document.addEventListener('DOMContentLoaded', () => {
|
|||||||
return payload;
|
return payload;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const normalizePatternMap = (raw) => {
|
||||||
|
if (!raw) return {};
|
||||||
|
if (typeof raw === 'object' && !Array.isArray(raw)) {
|
||||||
|
// Support wrapped payloads like { patterns: {...} }.
|
||||||
|
if (raw.patterns && typeof raw.patterns === 'object' && !Array.isArray(raw.patterns)) {
|
||||||
|
return raw.patterns;
|
||||||
|
}
|
||||||
|
return raw;
|
||||||
|
}
|
||||||
|
if (Array.isArray(raw)) {
|
||||||
|
// Support list payloads like [{name: "blink", ...}, ...].
|
||||||
|
return raw.reduce((acc, item, idx) => {
|
||||||
|
if (item && typeof item === 'object') {
|
||||||
|
const name = item.name || item.id || String(idx);
|
||||||
|
acc[String(name)] = item;
|
||||||
|
}
|
||||||
|
return acc;
|
||||||
|
}, {});
|
||||||
|
}
|
||||||
|
return {};
|
||||||
|
};
|
||||||
|
|
||||||
const loadPatterns = async () => {
|
const loadPatterns = async () => {
|
||||||
if (!presetPatternInput) {
|
if (!presetPatternInput) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
// Load pattern definitions from pattern.json
|
// Load pattern definitions from pattern.json
|
||||||
const response = await fetch('/patterns/definitions', {
|
let patternsPayload = null;
|
||||||
|
let response = await fetch('/patterns/definitions', {
|
||||||
|
headers: { Accept: 'application/json' },
|
||||||
|
});
|
||||||
|
if (response.ok) {
|
||||||
|
patternsPayload = await response.json();
|
||||||
|
}
|
||||||
|
|
||||||
|
let normalized = normalizePatternMap(patternsPayload);
|
||||||
|
if (!Object.keys(normalized).length) {
|
||||||
|
// Fallback when definitions route is unavailable or returns an empty map.
|
||||||
|
response = await fetch('/patterns', {
|
||||||
headers: { Accept: 'application/json' },
|
headers: { Accept: 'application/json' },
|
||||||
});
|
});
|
||||||
if (!response.ok) {
|
if (!response.ok) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const patterns = await response.json();
|
patternsPayload = await response.json();
|
||||||
cachedPatterns = patterns || {};
|
normalized = normalizePatternMap(patternsPayload);
|
||||||
|
}
|
||||||
|
cachedPatterns = normalized;
|
||||||
const entries = Object.keys(cachedPatterns);
|
const entries = Object.keys(cachedPatterns);
|
||||||
const desiredPattern = presetPatternInput.value;
|
const desiredPattern = presetPatternInput.value;
|
||||||
presetPatternInput.innerHTML = '<option value="">Pattern</option>';
|
presetPatternInput.innerHTML = '<option value="">Pattern</option>';
|
||||||
|
|||||||
Reference in New Issue
Block a user