frontera con upstream: lo del movil sale de los ficheros del dev

docs/FRONTERA_UPSTREAM.md mide como cambia upstream (39 releases de la 1.0.1 a
la 1.3.3; backend.js en 34, main_views en 31, OasisMobile.css en 21) y fija que
se toca: backend, middleware, modelos, server y traducciones de upstream, no;
vistas de upstream, solo una linea de gancho; hojas, vistas, router y modelos
propios, si.

Fase A, lo del 19/10:
- backend.js, workflows_model.js y modules_view.js vuelven a como estaban
- seccion apagada, /modules/enable y ?saved=1: en el router propio, que envuelve
  las redirecciones de upstream en vez de cambiar checkMod
- Modulos del movil en views/mobile_modules_view.js, servida por el router propio
- workflow propio "acampada" registrado desde models/fork_workflows.js en vez de
  redefinir "activists"
- votaciones, tribus, ajustes, borrar, pie y bienvenida: la logica en
  views/mobile_ui.js; en cada vista de upstream queda la llamada
This commit is contained in:
SITO 2026-10-19 13:04:38 +02:00
parent 9b391cfc3d
commit d04d99ece2
14 changed files with 571 additions and 267 deletions

View file

@ -6,6 +6,7 @@ const { template, selectedLanguage, i18n, setLanguage, INBOX_BOT_ORDER, inboxBot
const i18nBase = require("../client/assets/translations/i18n");
const moment = require("../server/node_modules/moment");
const { WORKFLOWS, currentWorkflow } = require('../models/workflows_model');
const mobileUi = require('./mobile_ui');
const html = require("../server/node_modules/hyperaxe");
// selector de identidades: la implementacion vive en ./identities_view.js
const { renderIdentities } = require('./identities_view')({ i18n, html });
@ -139,15 +140,6 @@ const settingsView = (params) => {
);
}
// movil: primero lo que se toca (idioma, aspecto, tipo de uso, portada) y despues
// lo tecnico (identidades, red, indices...). Se reordena por id, sin tocar las secciones
const MOBILE_FIRST = ['update', 'language', 'theme', 'workflows', 'home-page'];
const mobileOrder = (parts) => {
const list = parts.filter(Boolean);
const rank = (el) => { const i = MOBILE_FIRST.indexOf(el && el.id); return i === -1 ? MOBILE_FIRST.length : i; };
return list.map((el, i) => ({ el, i })).sort((x, y) => rank(x.el) - rank(y.el) || x.i - y.i).map(x => x.el);
};
const filter = params.filter === 'multiverse' && modOn('fediverse') ? 'multiverse' : params.filter === 'content' ? 'content' : 'oasis';
const oasisParts = [
updatePanel,
@ -156,13 +148,7 @@ const settingsView = (params) => {
div({ class: "tags-header" },
h2(i18n.language),
p(i18n.languageDescription),
// movil: cada idioma es un boton que se aplica al tocarlo (antes desplegable,
// elegir y otro boton mas abajo)
isMobile ? form({ action: "/language", method: "post", class: "lang-pick" },
...[["Español", "es"], ["Català", "ca"], ["Euskara", "eu"], ["Galego", "gl"], ["English", "en"], ["Français", "fr"],
["Português", "pt"], ["Italiano", "it"], ["Deutsch", "de"], ["Русский", "ru"], ["العربية", "ar"], ["हिन्दी", "hi"], ["中文", "zh"]]
.map(([name, code]) => button({ type: "submit", name: "language", value: code, class: code === selectedLanguage ? "lang-chip is-current" : "lang-chip", lang: code }, name))
) : form(
isMobile ? mobileUi.languagePick(selectedLanguage) : form(
{ action: "/language", method: "post" },
select({ name: "language" }, [
languageOption("English", "en"),
@ -689,7 +675,7 @@ const settingsView = (params) => {
modOn('fediverse') ? a({ class: filter === 'multiverse' ? 'filter-btn active' : 'filter-btn', href: '/settings?filter=multiverse' }, String(i18n.multiverse).toUpperCase()) : null
)
),
...(filter === 'multiverse' ? multiverseParts : filter === 'content' ? contentParts : (isMobile ? mobileOrder(oasisParts) : oasisParts))
...(filter === 'multiverse' ? multiverseParts : filter === 'content' ? contentParts : (isMobile ? mobileUi.settingsOrder(oasisParts) : oasisParts))
);
};