Add command palette entity selector for all editor dropdowns
Replace plain <select> dropdowns with a searchable command palette modal for 16 entity selectors across 6 editors (targets, streams, CSS sources, value sources, audio sources, pattern templates). Unified EntityPalette singleton + EntitySelect wrapper in core/entity-palette.js. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -49,6 +49,7 @@ import {
|
||||
} from '../core/icons.js';
|
||||
import { wrapCard } from '../core/card-colors.js';
|
||||
import { IconSelect } from '../core/icon-select.js';
|
||||
import { EntitySelect } from '../core/entity-palette.js';
|
||||
|
||||
// ── Card section instances ──
|
||||
const csRawStreams = new CardSection('raw-streams', { titleKey: 'streams.section.streams', gridClass: 'templates-grid', addCardOnclick: "showAddStreamModal('raw')", keyAttr: 'data-stream-id' });
|
||||
@@ -1617,6 +1618,11 @@ export async function editStream(streamId) {
|
||||
/** Track which engine type the stream-modal displays were loaded for. */
|
||||
let _streamModalDisplaysEngine = null;
|
||||
|
||||
// ── EntitySelect instances for stream modal ──
|
||||
let _captureTemplateEntitySelect = null;
|
||||
let _sourceEntitySelect = null;
|
||||
let _ppTemplateEntitySelect = null;
|
||||
|
||||
async function populateStreamModalDropdowns() {
|
||||
const [captureTemplates, streams, ppTemplates] = await Promise.all([
|
||||
captureTemplatesCache.fetch().catch(() => []),
|
||||
@@ -1672,6 +1678,44 @@ async function populateStreamModalDropdowns() {
|
||||
ppSelect.appendChild(opt);
|
||||
});
|
||||
|
||||
// Entity palette selectors
|
||||
if (_captureTemplateEntitySelect) _captureTemplateEntitySelect.destroy();
|
||||
_captureTemplateEntitySelect = new EntitySelect({
|
||||
target: templateSelect,
|
||||
getItems: () => captureTemplates.map(tmpl => ({
|
||||
value: tmpl.id,
|
||||
label: tmpl.name,
|
||||
icon: getEngineIcon(tmpl.engine_type),
|
||||
desc: tmpl.engine_type,
|
||||
})),
|
||||
placeholder: t('palette.search'),
|
||||
});
|
||||
|
||||
if (_sourceEntitySelect) _sourceEntitySelect.destroy();
|
||||
_sourceEntitySelect = new EntitySelect({
|
||||
target: sourceSelect,
|
||||
getItems: () => {
|
||||
const editingId = document.getElementById('stream-id').value;
|
||||
return streams.filter(s => s.id !== editingId).map(s => ({
|
||||
value: s.id,
|
||||
label: s.name,
|
||||
icon: getPictureSourceIcon(s.stream_type),
|
||||
}));
|
||||
},
|
||||
placeholder: t('palette.search'),
|
||||
});
|
||||
|
||||
if (_ppTemplateEntitySelect) _ppTemplateEntitySelect.destroy();
|
||||
_ppTemplateEntitySelect = new EntitySelect({
|
||||
target: ppSelect,
|
||||
getItems: () => ppTemplates.map(tmpl => ({
|
||||
value: tmpl.id,
|
||||
label: tmpl.name,
|
||||
icon: ICON_PP_TEMPLATE,
|
||||
})),
|
||||
placeholder: t('palette.search'),
|
||||
});
|
||||
|
||||
_autoGenerateStreamName();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user