From a98e2edafea4c201027c81b684ce7b7f235617b3 Mon Sep 17 00:00:00 2001 From: Mic Date: Thu, 16 Apr 2026 22:18:24 +0200 Subject: [PATCH] migrateMenuOrderAlphabetic implemented. see #680 --- js/mzta-prompts.js | 46 ++++++++++++++++++++++++++++++++++++++++++++++ mzta-background.js | 4 +++- 2 files changed, 49 insertions(+), 1 deletion(-) diff --git a/js/mzta-prompts.js b/js/mzta-prompts.js index 3c924af3..13c76b83 100644 --- a/js/mzta-prompts.js +++ b/js/mzta-prompts.js @@ -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'); } diff --git a/mzta-background.js b/mzta-background.js index 4c0832a3..646a0e1c 100644 --- a/mzta-background.js +++ b/mzta-background.js @@ -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);