diff --git a/meshchatx/src/frontend/components/blocked/BlockedPage.vue b/meshchatx/src/frontend/components/blocked/BlockedPage.vue index 8777fa5..f8d9ac9 100644 --- a/meshchatx/src/frontend/components/blocked/BlockedPage.vue +++ b/meshchatx/src/frontend/components/blocked/BlockedPage.vue @@ -43,7 +43,10 @@
-
+

{{ $t("banishment.loading_items") }}

@@ -126,14 +129,20 @@ class="flex items-center justify-between text-xs text-gray-500 dark:text-gray-400 font-mono bg-gray-50 dark:bg-zinc-800 px-2 py-1 rounded" > {{ dest.destination_hash }} - + {{ formatTimeAgo(dest.created_at) }}
-
+
"{{ identity.rns_reason }}"
{ if (identity.identity_hash.toLowerCase().includes(query)) return true; if ((identity.display_name || "").toLowerCase().includes(query)) return true; - return identity.blocked_destinations.some((d) => - d.destination_hash.toLowerCase().includes(query) - ); + return identity.blocked_destinations.some((d) => d.destination_hash.toLowerCase().includes(query)); }); }, }, @@ -313,7 +320,9 @@ export default { async onUnblock(identity) { if ( !(await DialogUtils.confirm( - this.$t("banishment.lift_banishment_confirm", { name: identity.display_name || identity.identity_hash }) + this.$t("banishment.lift_banishment_confirm", { + name: identity.display_name || identity.identity_hash, + }) )) ) { return; @@ -321,9 +330,10 @@ export default { try { // Use the first blocked destination hash, or fall back to identity hash - const targetHash = identity.blocked_destinations.length > 0 - ? identity.blocked_destinations[0].destination_hash - : identity.identity_hash; + const targetHash = + identity.blocked_destinations.length > 0 + ? identity.blocked_destinations[0].destination_hash + : identity.identity_hash; await window.api.delete(`/api/v1/blocked-destinations/${targetHash}`); await this.loadBlockedDestinations(); diff --git a/meshchatx/src/frontend/components/nomadnetwork/NomadNetworkPage.vue b/meshchatx/src/frontend/components/nomadnetwork/NomadNetworkPage.vue index 39c42c2..9cb185b 100644 --- a/meshchatx/src/frontend/components/nomadnetwork/NomadNetworkPage.vue +++ b/meshchatx/src/frontend/components/nomadnetwork/NomadNetworkPage.vue @@ -1962,6 +1962,16 @@ export default { } } + // parse relative page/file urls (e.g. /file/artifact`g=reticulum|r=lxmf) + if (url.startsWith("/page/") || url.startsWith("/file/")) { + const queryIndex = url.indexOf("?"); + return { + destination_hash: null, + path: queryIndex >= 0 ? url.substring(0, queryIndex) : url, + query: queryIndex >= 0 ? url.substring(queryIndex + 1) : null, + }; + } + // parse node id only if (url.length === 32) { return { diff --git a/meshchatx/src/frontend/js/NomadPageRenderer.js b/meshchatx/src/frontend/js/NomadPageRenderer.js index 11d8f36..5493eb9 100644 --- a/meshchatx/src/frontend/js/NomadPageRenderer.js +++ b/meshchatx/src/frontend/js/NomadPageRenderer.js @@ -160,6 +160,15 @@ export function isolateNomadLinksInHtml(html, destinationHash) { a.classList.add("nomadnet-link", "text-blue-600", "dark:text-blue-400", "hover:underline"); } else { a.setAttribute("href", "#"); + // For micron parser links with data-destination, update title so hover shows the full URL + const dataDest = a.getAttribute("data-destination"); + if (dataDest) { + let titleUrl = dataDest.trim(); + if (!/^[a-f0-9]{32}:/i.test(titleUrl)) { + titleUrl = `${dh}:${titleUrl.startsWith(":") ? titleUrl.slice(1) : titleUrl}`; + } + a.setAttribute("title", titleUrl); + } } a.removeAttribute("target"); a.removeAttribute("rel");