fix(shot-status): sort shots by shot code, not shotNumber

Imports and the external API assign shotNumber as max+10 (or 0), which
needn't match the number in the shot code, so new shots could sink to
the bottom of the list. Sort by episode then natural shot-code order.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
twotalesanimation
2026-10-18 05:18:18 +02:00
parent 3a7ba689ed
commit a4d5777e1d
+12 -5
View File
@@ -30,14 +30,11 @@ async function getAssignableArtists() {
}); });
} }
const shotCodeCollator = new Intl.Collator(undefined, { numeric: true, sensitivity: "base" });
async function getShotsForProject(projectId: string) { async function getShotsForProject(projectId: string) {
const shots = await db.shot.findMany({ const shots = await db.shot.findMany({
where: { projectId }, where: { projectId },
orderBy: [
{ episode: { sort: "asc", nulls: "last" } },
{ scene: "asc" },
{ shotNumber: "asc" },
],
select: { select: {
id: true, id: true,
shotCode: true, shotCode: true,
@@ -90,6 +87,16 @@ async function getShotsForProject(projectId: string) {
}, },
}); });
// Sorted by shot code rather than scene + shotNumber: imports and the
// external API assign shotNumber as "max + 10" (or 0), which needn't match
// the number in the code, so new shots could sink to the bottom.
shots.sort(
(a, b) =>
(a.episode === null ? 1 : 0) - (b.episode === null ? 1 : 0) ||
shotCodeCollator.compare(a.episode ?? "", b.episode ?? "") ||
shotCodeCollator.compare(a.shotCode, b.shotCode)
);
return shots.map(({ exports, ...shot }) => ({ return shots.map(({ exports, ...shot }) => ({
...shot, ...shot,
delivery: summariseShotDelivery({ delivery: summariseShotDelivery({