fix(ui): keep the scene select on the published scene after a local pick

Re-apply the published scene to the select after every option render, as the imperative renderer did. The scene and visual-input QA scripts click a held shot label after disposal and wait a frame for the bloom row.
This commit is contained in:
Sameh Khamis committed 2026-10-30 23:56:20 -07:00
1 parent b870df4199
commit 54b8060f71
5 files changed
+51 -6

No files matched your search

+20
View File
@@ -459,6 +459,26 @@ test('the scene select follows option renders, as before', async () => {
}
});
test('an option render restores the published scene after a local pick', async () => {
const f = fixture();
try {
f.state.scenes.push({ id: 'scene-b', title: 'B', shots: [] });
f.owner.renderSceneSelect();
await nextTick();
assert.equal(f.elements.select.value, 'scene-a');
// The person picks B; the owner re-renders the shot list only.
f.elements.select.value = 'scene-b';
f.owner.renderShotList();
await nextTick();
// Something reloads A and renders the options with the same choice.
f.owner.renderSceneSelect();
await nextTick();
assert.equal(f.elements.select.value, 'scene-a');
} finally {
f.restore();
}
});
test('Scene controls consume current state, preserve rows on progress, and unsubscribe on destruction', async () => {
const f = fixture();
try {
+5
View File
@@ -21,6 +21,9 @@ export const useSceneStore = defineStore('gev-scenes', () => {
const selectedShotId = shallowRef(null);
// The select's choice, updated only when its options are rendered.
const listedSceneId = shallowRef(null);
// Counts option renders: each one re-applies the select's choice, which
// the person may have changed since.
const listedRevision = shallowRef(0);
/** Whether an owner presents the project; until then the list is empty. */
const attached = shallowRef(false);
/** @type {{handlers: SceneRowHandlers}|null} */
@@ -48,6 +51,7 @@ export const useSceneStore = defineStore('gev-scenes', () => {
function publishOptions(state) {
publish(state);
listedSceneId.value = state.selectedSceneId ?? null;
listedRevision.value++;
}
/** @param {string|null} id */
@@ -79,6 +83,7 @@ export const useSceneStore = defineStore('gev-scenes', () => {
selectedSceneId,
selectedShotId,
listedSceneId,
listedRevision,
attached,
attach,
publish,
+15 -1
View File
@@ -1,9 +1,23 @@
<script setup>
import { storeToRefs } from 'pinia';
import { getCurrentInstance, watch } from 'vue';
import { useSceneStore } from '../stores/scenes.js';
// The Scene select's options; selecting one stays with SceneControls.
const { scenes, listedSceneId } = storeToRefs(useSceneStore());
const { scenes, listedSceneId, listedRevision } = storeToRefs(useSceneStore());
// Every option render shows the published scene, as the select did before:
// `selected` alone is written only when it changes, so it would leave a
// person's later pick standing.
const instance = getCurrentInstance();
watch(
listedRevision,
() => {
const select = instance.proxy.$el?.parentNode;
if (select && listedSceneId.value) select.value = listedSceneId.value;
},
{ flush: 'post' },
);
</script>
<template>