upstream: integrar Oasis 1.3.1
Base del merge a tres bandas: git 0.9.5 de epsylon, esta rama y el src de la
APK oficial 1.3.1 (la variante movil: OASIS_MOBILE, regex sin \p{}, audio y
video de Android). Corre en el mismo nodejs-mobile 18.20.4 que ya usabamos.
Se conserva de la rama: Karvan, identidades y multicuenta, topbar y barra
inferior, borrado de EXIF sin sharp, filtro hot del foro, RTC sin STUN y los
modulos apagados en movil (wallet, banking, torrents).
Se toma de upstream lo que ya hace de serie: respuesta citada en chats, ssb-lan
en movil, configuracion en ~/.ssb/oasis (sobrevive a reinstalar el backend).
El asistente de bienvenida deja elegir workflow tambien en movil.
This commit is contained in:
parent
8d838dd8b1
commit
c332afd6ea
265 changed files with 80970 additions and 29167 deletions
|
|
@ -1,15 +1,17 @@
|
|||
const { form, button, div, h2, p, section, input, a, span, img } = require("../server/node_modules/hyperaxe");
|
||||
|
||||
const { template, i18n, userLink, renderContentActions } = require("./main_views");
|
||||
const { template, i18n, userLink, renderContentActions, renderModuleStats, CONTENT_FAV_KIND, CONTENT_TORRENTABLE, paged } = require("./main_views");
|
||||
const moment = require("../server/node_modules/moment");
|
||||
const { config } = require("../server/SSB_server.js");
|
||||
const { renderUrl } = require("../backend/renderUrl");
|
||||
const { renderStyledText, safeExternalHref } = require("../backend/renderStyledText");
|
||||
|
||||
const userId = config.keys.id;
|
||||
|
||||
const safeArr = (v) => (Array.isArray(v) ? v : []);
|
||||
const safeText = (v) => String(v || "").trim();
|
||||
|
||||
const TORRENTABLE_KINDS = new Set(Object.keys(CONTENT_FAV_KIND).filter((t) => CONTENT_TORRENTABLE.has(t)).map((t) => CONTENT_FAV_KIND[t]));
|
||||
|
||||
const FILTER_KINDS = [
|
||||
{ value: "audios", label: () => i18n.favoritesFilterAudios },
|
||||
{ value: "bookmarks", label: () => i18n.favoritesFilterBookmarks },
|
||||
|
|
@ -17,6 +19,7 @@ const FILTER_KINDS = [
|
|||
{ value: "chats", label: () => i18n.favoritesFilterChats },
|
||||
{ value: "documents", label: () => i18n.favoritesFilterDocuments },
|
||||
{ value: "events", label: () => i18n.favoritesFilterEvents },
|
||||
{ value: "files", label: () => i18n.favoritesFilterFiles },
|
||||
{ value: "forum", label: () => i18n.favoritesFilterForum },
|
||||
{ value: "housing", label: () => i18n.favoritesFilterHousing },
|
||||
{ value: "images", label: () => i18n.favoritesFilterImages },
|
||||
|
|
@ -26,6 +29,7 @@ const FILTER_KINDS = [
|
|||
{ value: "pads", label: () => i18n.favoritesFilterPads },
|
||||
{ value: "projects", label: () => i18n.favoritesFilterProjects },
|
||||
{ value: "reports", label: () => i18n.favoritesFilterReports },
|
||||
{ value: "rooms", label: () => i18n.favoritesFilterRooms },
|
||||
{ value: "shopProducts", label: () => i18n.favoritesFilterShopProducts },
|
||||
{ value: "tasks", label: () => i18n.favoritesFilterTasks },
|
||||
{ value: "torrents", label: () => i18n.favoritesFilterTorrents },
|
||||
|
|
@ -95,7 +99,7 @@ const renderBookmarkUrl = (item) => {
|
|||
if (!item.url) return null;
|
||||
return p(
|
||||
a(
|
||||
{ href: item.url, target: "_blank", rel: "noreferrer noopener", class: "bookmark-url" },
|
||||
{ href: safeExternalHref(item.url), target: "_blank", rel: "noreferrer noopener", class: "bookmark-url" },
|
||||
item.url
|
||||
)
|
||||
);
|
||||
|
|
@ -119,7 +123,7 @@ const renderImagePreview = (item) => {
|
|||
);
|
||||
};
|
||||
|
||||
const renderFavoriteCard = (item, filter) => {
|
||||
const renderFavoriteCard = (item, filter, spreadMap = null) => {
|
||||
const returnTo = buildReturnTo(filter);
|
||||
|
||||
const title = safeText(item.title) || safeText(item.name) || safeText(item.category) || safeText(item.url) || "";
|
||||
|
|
@ -137,49 +141,48 @@ const renderFavoriteCard = (item, filter) => {
|
|||
span({ class: 'pm-exposition-text' }, String(item.kind || '').toUpperCase())
|
||||
)
|
||||
),
|
||||
renderContentActions(item.favId, item.viewHref)
|
||||
renderContentActions(item.favId, item.viewHref, {
|
||||
author: item.author,
|
||||
spread: (spreadMap && spreadMap.get(item.favId)) || null,
|
||||
reportTitle: title,
|
||||
...(TORRENTABLE_KINDS.has(item.kind) && typeof item.url === "string" && item.url.startsWith("&") ? { torrentFrom: { blobId: item.url, name: item.title } } : {})
|
||||
})
|
||||
),
|
||||
div(
|
||||
{ class: "card-section favorites-card-body" },
|
||||
div(
|
||||
{ class: "bookmark-topbar" },
|
||||
div(
|
||||
{ class: "bookmark-topbar-left" },
|
||||
form(
|
||||
{
|
||||
method: "POST",
|
||||
action: `/favorites/remove/${encodeURIComponent(item.kind)}/${encodeURIComponent(item.favId)}`,
|
||||
class: "bookmark-favorite-form"
|
||||
},
|
||||
input({ type: "hidden", name: "returnTo", value: returnTo }),
|
||||
button({ type: "submit", class: "filter-btn" }, i18n.favoritesRemoveButton)
|
||||
)
|
||||
)
|
||||
),
|
||||
title ? h2(title) : null,
|
||||
title ? div({ class: "shop-title-row" }, h2({ class: "tribe-card-title" }, item.viewHref ? a({ href: item.viewHref }, title) : title)) : null,
|
||||
renderImagePreview(item),
|
||||
renderBookmarkUrl(item),
|
||||
safeText(item.description) ? p(...renderUrl(item.description)) : null,
|
||||
safeText(item.description) ? p(...renderStyledText(item.description)) : null,
|
||||
renderDetailFields(item),
|
||||
renderTags(item.tags),
|
||||
p(
|
||||
{ class: "card-footer" },
|
||||
absDate ? span({ class: "date-link" }, `${absDate} ${i18n.performed} `) : "",
|
||||
{ class: "card-footer favorites-meta" },
|
||||
absDate ? span({ class: "date-link" }, `${absDate}`) : "",
|
||||
item.author ? userLink(item.author) : ""
|
||||
),
|
||||
p(
|
||||
{ class: "card-footer" },
|
||||
form(
|
||||
{ method: "POST", action: `/favorites/remove/${encodeURIComponent(item.kind)}/${encodeURIComponent(item.favId)}`, class: "phone-action-form" },
|
||||
input({ type: "hidden", name: "returnTo", value: returnTo }),
|
||||
button({ type: "submit", class: "tribe-action-btn" }, String(i18n.agendaDiscardButton).toUpperCase())
|
||||
)
|
||||
)
|
||||
)
|
||||
);
|
||||
};
|
||||
|
||||
exports.favoritesView = async (items, filter = "all", counts = {}, q = "") => {
|
||||
exports.favoritesView = async (items, filter = "all", counts = {}, q = "", params = {}) => {
|
||||
const c = counts || {};
|
||||
const total = typeof c.all === "number" ? c.all : safeArr(items).length;
|
||||
const emptyFav = total === 0 && !String(q || "").trim();
|
||||
|
||||
return template(
|
||||
i18n.favoritesTitle,
|
||||
section(
|
||||
div({ class: "tags-header" }, h2(i18n.favoritesTitle), p(i18n.favoritesDescription)),
|
||||
div(
|
||||
div({ class: "tags-header module-header-line" }, h2(i18n.favoritesTitle), p(i18n.favoritesDescription)),
|
||||
emptyFav ? null : div(
|
||||
{ class: "filters" },
|
||||
form(
|
||||
{ method: "GET", action: "/favorites", class: "ui-toolbar ui-toolbar--filters" },
|
||||
|
|
@ -187,11 +190,13 @@ exports.favoritesView = async (items, filter = "all", counts = {}, q = "") => {
|
|||
{ type: "submit", name: "filter", value: "all", class: filter === "all" ? "filter-btn active" : "filter-btn" },
|
||||
`${i18n.favoritesFilterAll} (${total})`
|
||||
),
|
||||
button(
|
||||
{ type: "submit", name: "filter", value: "recent", class: filter === "recent" ? "filter-btn active" : "filter-btn" },
|
||||
`${i18n.favoritesFilterRecent} (${total})`
|
||||
),
|
||||
...FILTER_KINDS.map((k) =>
|
||||
(c.recent || 0) > 0 || filter === "recent"
|
||||
? button(
|
||||
{ type: "submit", name: "filter", value: "recent", class: filter === "recent" ? "filter-btn active" : "filter-btn" },
|
||||
`${i18n.favoritesFilterRecent} (${c.recent || 0})`
|
||||
)
|
||||
: null,
|
||||
...FILTER_KINDS.filter((k) => (c[k.value] || 0) > 0).map((k) =>
|
||||
button(
|
||||
{ type: "submit", name: "filter", value: k.value, class: filter === k.value ? "filter-btn active" : "filter-btn" },
|
||||
`${k.label()} (${c[k.value] || 0})`
|
||||
|
|
@ -199,8 +204,9 @@ exports.favoritesView = async (items, filter = "all", counts = {}, q = "") => {
|
|||
)
|
||||
)
|
||||
),
|
||||
div(
|
||||
{ class: "filters" },
|
||||
emptyFav ? null : div(
|
||||
{ class: "filters activity-filter-chips activity-toolbar-row" },
|
||||
renderModuleStats(items.length),
|
||||
form(
|
||||
{ method: "GET", action: "/favorites", class: "filter-box" },
|
||||
input({ type: "hidden", name: "filter", value: filter }),
|
||||
|
|
@ -210,7 +216,7 @@ exports.favoritesView = async (items, filter = "all", counts = {}, q = "") => {
|
|||
)
|
||||
)
|
||||
),
|
||||
div({ class: "bookmark-list" }, safeArr(items).length ? safeArr(items).map((it) => renderFavoriteCard(it, filter)) : p(i18n.favoritesNoItems))
|
||||
div({ class: "bookmark-list" }, safeArr(items).length ? paged(safeArr(items)).map((it) => renderFavoriteCard(it, filter, params.spreadMap)) : p(i18n.favoritesNoItems))
|
||||
)
|
||||
);
|
||||
};
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue