migrateMenuOrderAlphabetic implemented. see #680

This commit is contained in:
Mic 2026-04-16 22:18:24 +02:00
parent 8522a28a7d
commit a98e2edafe
2 changed files with 49 additions and 1 deletions

View file

@ -674,6 +674,52 @@ export function getHiddenSpecialPromptIds() {
return specialPrompts.filter(p => p.show_in === "none").map(p => p.id);
}
// Migration: if dynamic_menu_order_alphabet was true (or unset), assign initial positions
// so that prompts appear alphabetically with special prompts first, then disable the flag
// to switch to position-based ordering permanently.
export async function migrateMenuOrderAlphabetic() {
const prefs = await browser.storage.sync.get({ dynamic_menu_order_alphabet: true });
if (!prefs.dynamic_menu_order_alphabet) {
return;
}
const allPrompts = await getPrompts(false, [], true);
const hiddenSpecialIds = getHiddenSpecialPromptIds();
const visiblePrompts = allPrompts.filter(p => !hiddenSpecialIds.includes(p.id));
const resolveName = (p) => {
const n = p.name || '';
if (n.startsWith('__MSG_') && n.endsWith('__')) {
return browser.i18n.getMessage(n.substring(6, n.length - 2));
}
return n;
};
const specials = visiblePrompts.filter(p => String(p.is_special) === '1')
.sort((a, b) => resolveName(a).localeCompare(resolveName(b)));
const others = visiblePrompts.filter(p => String(p.is_special) !== '1')
.sort((a, b) => resolveName(a).localeCompare(resolveName(b)));
const ordered = specials.concat(others);
ordered.forEach((prompt, idx) => {
const pos = idx + 1;
prompt.position_display = pos;
prompt.position_compose = pos;
prompt.position_context = pos;
});
const defaultPromptsToSave = ordered.filter(p => String(p.is_default) === '1' && String(p.is_special) !== '1');
const customPromptsToSave = ordered.filter(p => String(p.is_default) === '0' && String(p.is_special) !== '1');
const visibleSpecialsToSave = ordered.filter(p => String(p.is_special) === '1');
const hiddenSpecialsToPreserve = allPrompts.filter(p => hiddenSpecialIds.includes(p.id));
await setDefaultPromptsProperties(defaultPromptsToSave);
await setCustomPrompts(customPromptsToSave);
await setSpecialPrompts(visibleSpecialsToSave.concat(hiddenSpecialsToPreserve));
await browser.storage.sync.set({ dynamic_menu_order_alphabet: false });
}
export async function getSpamFilterPrompt(){
return (await getSpecialPrompts()).find(prompt => prompt.id == 'prompt_spamfilter');
}

View file

@ -53,7 +53,8 @@ import {
import { taPromptUtils } from './js/mzta-utils-prompt.js';
import { mzta_specialCommand } from './js/mzta-special-commands.js';
import {
getSpamFilterPrompt
getSpamFilterPrompt,
migrateMenuOrderAlphabetic
} from './js/mzta-prompts.js';
import { taSpamReport } from './js/mzta-spamreport.js';
import { taSummaryStore } from './js/mzta-summarystore.js';
@ -1571,6 +1572,7 @@ function setupPermissionsRemovedListener() {
setupPermissionsRemovedListener();
// Menus handling
await migrateMenuOrderAlphabetic();
const menus = new mzta_Menus(openChatGPT, prefs_init.do_debug);
menus.loadMenus(special_prompts_ids);