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
161 lines
9.5 KiB
JavaScript
161 lines
9.5 KiB
JavaScript
const { form, button, div, h2, p, section, table, tr, td, input, a, br, ul, li, span, strong } = require("../server/node_modules/hyperaxe");
|
|
const { template, i18n } = require('./main_views');
|
|
const { getConfig } = require('../configs/config-manager.js');
|
|
const { PRESETS: PRESET_LIST } = require('../models/workflows_model');
|
|
|
|
const modulesView = () => {
|
|
const config = getConfig().modules;
|
|
const modules = [
|
|
{ name: 'agenda', label: i18n.modulesAgendaLabel, description: i18n.modulesAgendaDescription },
|
|
{ name: 'ai', label: i18n.modulesAILabel, description: i18n.modulesAIDescription },
|
|
{ name: 'aiNav', label: i18n.modulesAINavLabel, description: i18n.modulesAINavDescription },
|
|
{ name: 'emergencies', label: i18n.modulesEmergenciesLabel, description: i18n.modulesEmergenciesDescription },
|
|
{ name: 'mailing', label: i18n.modulesMailingLabel, description: i18n.modulesMailingDescription },
|
|
{ name: 'rooms', label: i18n.modulesRoomsLabel, description: i18n.modulesRoomsDescription },
|
|
{ name: 'phone', label: i18n.modulesPhoneLabel, description: i18n.modulesPhoneDescription },
|
|
{ name: 'logistics', label: i18n.modulesLogisticsLabel, description: i18n.modulesLogisticsDescription },
|
|
{ name: 'podcasts', label: i18n.modulesPodcastsLabel, description: i18n.modulesPodcastsDescription },
|
|
{ name: 'campaigns', label: i18n.modulesCampaignsLabel, description: i18n.modulesCampaignsDescription },
|
|
{ name: 'audios', label: i18n.modulesAudiosLabel, description: i18n.modulesAudiosDescription },
|
|
{ name: 'banking', label: i18n.modulesBankingLabel, description: i18n.modulesBankingDescription },
|
|
{ name: 'bookmarks', label: i18n.modulesBookmarksLabel, description: i18n.modulesBookmarksDescription },
|
|
{ name: 'calendars', label: i18n.modulesCalendarsLabel, description: i18n.modulesCalendarsDescription },
|
|
{ name: 'chats', label: i18n.modulesChatsLabel, description: i18n.modulesChatsDescription },
|
|
{ name: 'cipher', label: i18n.modulesCipherLabel, description: i18n.modulesCipherDescription },
|
|
{ name: 'courts', label: i18n.modulesCourtsLabel, description: i18n.modulesCourtsDescription },
|
|
{ name: 'dev', label: i18n.modulesDevLabel, description: i18n.modulesDevDescription },
|
|
{ name: 'docs', label: i18n.modulesDocsLabel, description: i18n.modulesDocsDescription },
|
|
{ name: 'events', label: i18n.modulesEventsLabel, description: i18n.modulesEventsDescription },
|
|
{ name: 'favorites', label: i18n.modulesFavoritesLabel, description: i18n.modulesFavoritesDescription },
|
|
{ name: 'blogs', label: i18n.modulesBlogsLabel, description: i18n.modulesBlogsDescription },
|
|
{ name: 'fediverse', label: i18n.modulesFediverseLabel, description: i18n.modulesFediverseDescription },
|
|
{ name: 'feed', label: i18n.modulesFeedLabel, description: i18n.modulesFeedDescription },
|
|
{ name: 'files', label: i18n.modulesFilesLabel, description: i18n.modulesFilesDescription },
|
|
{ name: 'forum', label: i18n.modulesForumLabel, description: i18n.modulesForumDescription },
|
|
{ name: 'games', label: i18n.modulesGamesLabel, description: i18n.modulesGamesDescription },
|
|
{ name: 'graphos', label: i18n.modulesGraphosLabel, description: i18n.modulesGraphosDescription },
|
|
{ name: 'housing', label: i18n.modulesHousingLabel, description: i18n.modulesHousingDescription },
|
|
{ name: 'images', label: i18n.modulesImagesLabel, description: i18n.modulesImagesDescription },
|
|
{ name: 'industry', label: i18n.modulesIndustryLabel, description: i18n.modulesIndustryDescription },
|
|
{ name: 'invites', label: i18n.modulesInvitesLabel, description: i18n.modulesInvitesDescription },
|
|
{ name: 'jobs', label: i18n.modulesJobsLabel, description: i18n.modulesJobsDescription },
|
|
{ name: 'karvan', label: i18n.modulesKarvanLabel, description: i18n.modulesKarvanDescription },
|
|
{ name: 'larp', label: i18n.modulesLarpLabel, description: i18n.modulesLarpDescription },
|
|
{ name: 'backup', label: i18n.modulesBackupLabel, description: i18n.modulesBackupDescription },
|
|
{ name: 'logs', label: i18n.modulesLogsLabel, description: i18n.modulesLogsDescription },
|
|
{ name: 'maps', label: i18n.modulesMapLabel, description: i18n.modulesMapDescription },
|
|
{ name: 'market', label: i18n.modulesMarketLabel, description: i18n.modulesMarketDescription },
|
|
{ name: 'melody', label: i18n.modulesMelodyLabel, description: i18n.modulesMelodyDescription },
|
|
{ name: 'opinions', label: i18n.modulesOpinionsLabel, description: i18n.modulesOpinionsDescription },
|
|
{ name: 'pads', label: i18n.modulesPadsLabel, description: i18n.modulesPadsDescription },
|
|
{ name: 'parliament', label: i18n.modulesParliamentLabel, description: i18n.modulesParliamentDescription },
|
|
{ name: 'pixelia', label: i18n.modulesPixeliaLabel, description: i18n.modulesPixeliaDescription },
|
|
{ name: 'polls', label: i18n.modulesPollsLabel, description: i18n.modulesPollsDescription },
|
|
{ name: 'projects', label: i18n.modulesProjectsLabel, description: i18n.modulesProjectsDescription },
|
|
{ name: 'reports', label: i18n.modulesReportsLabel, description: i18n.modulesReportsDescription },
|
|
{ name: 'school', label: i18n.modulesSchoolLabel, description: i18n.modulesSchoolDescription },
|
|
{ name: 'shops', label: i18n.modulesShopsLabel, description: i18n.modulesShopsDescription },
|
|
{ name: 'tags', label: i18n.modulesTagsLabel, description: i18n.modulesTagsDescription },
|
|
{ name: 'tasks', label: i18n.modulesTasksLabel, description: i18n.modulesTasksDescription },
|
|
{ name: 'torrents', label: i18n.modulesTorrentsLabel, description: i18n.modulesTorrentsDescription },
|
|
{ name: 'transfers', label: i18n.modulesTransfersLabel, description: i18n.modulesTransfersDescription },
|
|
{ name: 'trending', label: i18n.modulesTrendingLabel, description: i18n.modulesTrendingDescription },
|
|
{ name: 'tribes', label: i18n.modulesTribesLabel, description: i18n.modulesTribesDescription },
|
|
{ name: 'videos', label: i18n.modulesVideosLabel, description: i18n.modulesVideosDescription },
|
|
{ name: 'votes', label: i18n.modulesVotationsLabel, description: i18n.modulesVotationsDescription },
|
|
{ name: 'wallet', label: i18n.modulesWalletLabel, description: i18n.modulesWalletDescription },
|
|
{ name: 'wiki', label: i18n.modulesWikiLabel, description: i18n.modulesWikiDescription }
|
|
].sort((x, y) => String(x.label || x.name).localeCompare(String(y.label || y.name), undefined, { sensitivity: 'base' }));
|
|
|
|
const MOBILE_UNAVAILABLE = ['ai', 'aiNav', 'dev', 'games', 'logs', 'maps', 'pixelia'];
|
|
const isMobile = process.env.OASIS_MOBILE === '1';
|
|
const visibleModules = isMobile ? modules.filter(mod => !MOBILE_UNAVAILABLE.includes(mod.name)) : modules;
|
|
|
|
const moduleStates = visibleModules.reduce((acc, mod) => {
|
|
acc[`${mod.name}Mod`] = config[`${mod.name}Mod`] === 'on' ? 'on' : 'off';
|
|
return acc;
|
|
}, {});
|
|
|
|
const activeModulesCount = visibleModules.filter(mod => moduleStates[`${mod.name}Mod`] === 'on').length;
|
|
const totalModulesCount = visibleModules.length;
|
|
const disabledModulesCount = totalModulesCount - activeModulesCount;
|
|
|
|
const header = [div({ class: 'tags-header module-header-line' },
|
|
h2(i18n.modulesViewTitle),
|
|
p(i18n.modulesViewDescription)
|
|
)];
|
|
|
|
const counts = div({ class: 'modules-counts' },
|
|
span({ class: 'modules-count-item' },
|
|
`${i18n.modulesTotalModulesLabel}: `,
|
|
strong({ class: 'modules-count-value' }, totalModulesCount)
|
|
),
|
|
span({ class: 'modules-count-item' },
|
|
`${i18n.modulesEnabledModulesLabel}: `,
|
|
strong({ class: 'modules-count-value' }, activeModulesCount)
|
|
),
|
|
span({ class: 'modules-count-item' },
|
|
`${i18n.modulesDisabledModulesLabel}: `,
|
|
strong({ class: 'modules-count-value' }, disabledModulesCount)
|
|
)
|
|
);
|
|
|
|
const PRESETS = PRESET_LIST;
|
|
|
|
const presetButtons = div({ class: 'preset-group' },
|
|
Object.entries(PRESETS).map(([key, mods]) => {
|
|
const presetLabel = (i18n[`modulesPreset_${key}`] || key).toUpperCase();
|
|
const isActive = visibleModules.every(m => mods.includes(m.name) === (moduleStates[`${m.name}Mod`] === 'on'));
|
|
return form({ action: "/modules/preset", method: "post", class: "modules-preset-form" },
|
|
input({ type: "hidden", name: "preset", value: key }),
|
|
button({
|
|
type: 'submit',
|
|
class: isActive ? 'filter-btn active' : 'filter-btn',
|
|
}, presetLabel)
|
|
);
|
|
})
|
|
);
|
|
|
|
return template(
|
|
i18n.modules,
|
|
section(header),
|
|
section(
|
|
...(isMobile ? [] : [h2(i18n.modulesPresetTitle || "Common Configurations"), presetButtons]),
|
|
counts,
|
|
form(
|
|
{ action: "/save-modules", method: "post" },
|
|
table(
|
|
{ class: "module-table" },
|
|
tr(
|
|
td(i18n.modulesModuleName),
|
|
td(i18n.modulesModuleDescription),
|
|
td({ class: 'module-status-cell' }, i18n.modulesModuleStatus)
|
|
),
|
|
visibleModules.map(mod =>
|
|
tr(
|
|
td(a({ href: `/${mod.name}` }, mod.label)),
|
|
td(p(mod.description)),
|
|
td(
|
|
input({
|
|
type: "checkbox",
|
|
id: `${mod.name}Mod`,
|
|
name: `${mod.name}Form`,
|
|
class: "input-checkbox",
|
|
value: 'on',
|
|
checked: moduleStates[`${mod.name}Mod`] === 'on' ? true : undefined
|
|
})
|
|
)
|
|
)
|
|
)
|
|
),
|
|
div(
|
|
{ class: "save-button-container" },
|
|
button({ type: "submit", class: "submit-button" }, i18n.saveSettings)
|
|
)
|
|
)
|
|
)
|
|
);
|
|
};
|
|
|
|
exports.modulesView = modulesView;
|
|
|