удаления поправлены, сортировка элементов в титре поправлено, обоюдное удаление поправлено

This commit is contained in:
2026-08-20 12:48:11 +03:00
parent 81fd030846
commit 72d89ec02b
8 changed files with 142 additions and 38 deletions

View File

@@ -1338,10 +1338,26 @@
}
function mappingInventoryInputs(profile) {
// Preserve the exact Input sequence received from the vMix API via Agent.
// The array order is presentation-only: stable Mapping identity still uses
// key -> unique title -> number, so changing Input positions does not break links.
return Array.isArray(profile?.inventory?.inputs) ? [...profile.inventory.inputs] : [];
// Mapping picker is operator-facing: show Inputs in vMix numeric order so a
// title can be found by its familiar # quickly. Stable links still use key/title.
const inputs = Array.isArray(profile?.inventory?.inputs) ? [...profile.inventory.inputs] : [];
return inputs.sort((left, right) => {
const leftNumber = Number(left?.number);
const rightNumber = Number(right?.number);
const leftRank = Number.isFinite(leftNumber) ? leftNumber : Number.MAX_SAFE_INTEGER;
const rightRank = Number.isFinite(rightNumber) ? rightNumber : Number.MAX_SAFE_INTEGER;
return leftRank - rightRank
|| String(left?.title || "").localeCompare(String(right?.title || ""), "ru", { numeric: true, sensitivity: "base" });
});
}
function mappingVmixFieldOrder(left, right) {
// Natural sort keeps Player2.Text before Player10.Text and makes long GT
// templates much easier to scan. Type suffix stays part of the comparison.
return String(left?.name || "").localeCompare(String(right?.name || ""), "ru", {
numeric: true,
sensitivity: "base",
});
}
function mappingInputByKey(profile, key, title = "") {
@@ -1939,7 +1955,7 @@
const visibleInputs = filteredInputs.some((item) => mappingInputValue(item) === mappingInputValue(currentInput))
? filteredInputs
: [currentInput, ...filteredInputs];
const allFields = currentInput.fields || [];
const allFields = [...(currentInput.fields || [])].sort(mappingVmixFieldOrder);
const filter = ["text", "image", "color"].includes(state.mappingFieldFilter) ? state.mappingFieldFilter : "text";
const counts = {
text: allFields.filter((field) => mappingFieldFilterMatch(field, "text")).length,