OASIS_MOBILE/src/views/mentions_view.js
SITO 82b6c3ae05 upstream: integrar 0.9.5 en 34 ficheros mas y portar los modulos nuevos
Segunda tanda. Resueltas por merge de tres vias 15 divergencias que no solapaban,
y aplicada la version de 0.9.5 en 19 vistas y modelos donde la rama solo arrastraba
codigo antiguo (firmas viejas de renderProductForm, renderJobForm, listTags sin
search, y el import sin renderSpreadEditWarning). Se preserva la eliminacion de
housing donde la rama lo habia descartado: modules_view, blockchain_view,
search_model y tags_model.

Modulos nuevos del dev portados: blog, data, gallery, mentions, polls, workflows,
comments, recurrence y media_gallery, mas contentPdf, pdfDocument y content_favorites.

main_views recupera renderEngagement, spreadsFor y renderSpreadEditWarning, que la
rama habia eliminado y que las vistas de 0.9.5 necesitan. Sin ellas polls_view
lanzaba TypeError al editar.

El overlay de i18n pasa de 15 a 41 claves (46 en castellano): incorpora las 9 que
upstream tenia en 0.9.1 y elimino en 0.9.5 mientras nuestro codigo las sigue usando
(menuBlogs, spreadHint, chatShareUrl, forumFilterHot, publishBlog...) y las 17 de
Karvan, que nunca existieron y tiraban de texto de reserva en ingles; ahora estan
traducidas al castellano.

Verificado con la app arrancada: declara 0.9.5, 0 claves i18n sin resolver (antes
26), 26 rutas responden 200/302, y la interfaz de la rama sale intacta: 10
categorias y 47 modulos en los hexagonos, topbar con Personal/Community y avatar,
7 accesos rapidos en la barra inferior y 0 etiquetas vacias (antes 1, la de Blogs).
2026-08-18 22:03:41 +02:00

81 lines
3.3 KiB
JavaScript

const { div, h2, p, section, button, form, input, span } = require("../server/node_modules/hyperaxe");
const { template, i18n, userLink, renderContentActions } = require("./main_views");
const { getViewDetailsAction } = require("./activity_view");
const moment = require("../server/node_modules/moment");
const { config } = require("../server/SSB_server.js");
const { renderUrl } = require("../backend/renderUrl");
const userId = config.keys.id;
const excerpt = (text, max = 320) => {
const s = String(text == null ? "" : text).trim();
return s.length > max ? s.slice(0, max) + "…" : s;
};
const typeLabel = (type) => i18n['type' + String(type || '').charAt(0).toUpperCase() + String(type || '').slice(1)] || String(type || '').toUpperCase();
const renderMentionCard = (item) => {
const href = getViewDetailsAction(item.type, { id: item.id, key: item.id, author: item.author, content: item.content });
const isOwn = String(item.author) === String(userId);
return div({ class: "trending-card mention-card" + (isOwn ? " own-content" : "") },
div({ class: "card-header activity-card-header" },
div({ class: 'card-chips-row' },
span({ class: 'pm-exposition-chip pm-exposition-whole' },
span({ class: 'pm-exposition-text' }, typeLabel(item.type))
)
),
renderContentActions(item.id, href, { author: item.author, reportTitle: item.title || item.text })
),
div({ class: "card-section mention-card-body" },
item.title
? div({ class: "shop-title-row" }, h2({ class: "tribe-card-title" }, item.title))
: null,
item.text ? p({ class: "mention-text" }, ...renderUrl(excerpt(item.text))) : null,
p({ class: "card-footer" },
span({ class: "date-link" }, moment(item.createdAt).format("YYYY/MM/DD HH:mm")),
span(" · "),
userLink(item.author)
)
)
);
};
exports.mentionsView = async (items = [], filter = 'ALL', params = {}) => {
const counts = params.counts || {};
const types = Object.keys(counts).sort((a, b) => (counts[b] - counts[a]) || a.localeCompare(b));
const q = params.q || '';
return template(
i18n.mentions,
section(
div({ class: "tags-header" },
h2(i18n.mentions),
p(i18n.mentionsDescription)
),
types.length
? div({ class: "filters" },
form({ method: "GET", action: "/mentions", class: "ui-toolbar ui-toolbar--filters" },
...types.map(t =>
button({ type: "submit", name: "filter", value: t, class: filter === t ? "filter-btn active" : "filter-btn" },
`${typeLabel(t)} (${counts[t]})`)
)
)
)
: null,
div({ class: "filters" },
form({ method: "GET", action: "/mentions", class: "filter-box" },
input({ type: "hidden", name: "filter", value: filter }),
input({ type: "text", name: "q", value: q, placeholder: i18n.mentionsSearchPlaceholder, class: "filter-box__input" }),
div({ class: "filter-box__controls" },
button({ type: "submit", class: "filter-box__button" }, i18n.searchButton)
)
)
)
),
section(
items.length
? div({ class: "mentions-list" }, ...items.map(renderMentionCard))
: p({ class: "empty" }, i18n.noMentions)
)
);
};