If you have a Nodebb instance and want World posts to include a certain topic, lets say on electric cars.
If you follow people that are into electric cars then that happens.
(1) I cant seem to search on a topic in nodebb World.
So the way Ive been expanding the World, is by going to mastodon, searching topic, either by tag or by name. Then if I see an interesting profile, I reply to one of their posts with cc'ing in my nodebb account.
Then their post comes up in World on nodebb, and I can follow the author.
Hence this is a lot of moving around to follow people who are into a certain topic.
Is there a faster way? E.g. is there a method to type a topic in nodebb World, and see relevant posts or people there, and follow them immediately?
(2) When I follow someone from a Mastodon site, I seem to be following a clone of their account. I.e. account created 8 Nov 2022, 00:00, 1 post.
Not their mastodon profile with many posts and followers
I am once again astounded by how unreasonably effective FEP 1b12 is at federating content completely.
On NodeBB I have a list of "popular" topics, which is mainly populated based on number of posts within a given time period. For most content from Mastodon-based servers, this supplies a decent signal of a given topic's popularity. The more people you follow, the more effective it is, but overall it's pretty shit at getting you the whole conversation.
Enter 1b12, Lemmy's preferred federation method. Follow a community actor and you start receiving everything that happens in that community. Replies, likes, the whole lot.
It also absolutely dominates my popular feed. It's all Lemmy stuff now because the Mastodon stuff literally can't compare.
Albeit the SNR is a tad lower, so give and take...
Existing implementations of Conversation Containers (#Streams and #Hubzilla) add a context property to top-level posts of conversations. This is also what FEP-171b currently prescribes.However, as I noted in the FEP, this is not consistent with FEP-7888 recommendations.context property is supposed to be used for grouping objects, and in Conversation Containers we have a collection of conversation activities, not posts.A property that links top-level post to its conversation container should be called differently. For example, threadContext or conversationContextNote.threadContext == Add.target.id
context can still be used, but for linking to the collection of posts (although I would prefer to use thread for that purpose).#fep_171b #ConversationContainers
I have a category on my nodebb instance I want to remove.
If I go to Edit, there is no delete in the menu
There is 'Purge', but will highlight with grey bar but does nothing on click, presumably because it needs to be deleted before Purged?
I think this is a bug, unless anyone can say how to Delete a category?
Is is possible to Disable this category, but if its no longer required Delete would be preferable
You may have noticed me testing some rich embeds on this forum, or perhaps you've noticed that on this board, pasted links automatically expand/unfurl into a pretty little box instead of staying as a plain anchor.
This is due to the Link Preview plugin, which I started working on last month!
Link Previews
... wait, why did I just paste a boring ol' anchor like that?
https://github.com/NodeBB/nodebb-plugin-link-preview/
SHAZAM!
You can install this plugin by running npm install nodebb-plugin-link-preview, or via the plugin manager. It should show up on any NodeBB v3 instance.
Found a bug in the:
{browserTitle}
{function.buildMetaTag}
They are not HTML rendering correctly.
Its output is rendering:
<title>Groups | JBrown's Place</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta property="og:site_name" content="JBrown's Place" />
<meta property="og:title" content="JBrown's Place" />
Also why are there 2 \n or <br /> in the rendering.
<title>Groups | JBrown's Place</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="content-type" content="text/html; charset=UTF-8" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="mobile-web-app-capable" content="yes" />
<meta property="og:site_name" content="JBrown's Place" />
<meta name="msapplication-badge" content="frequency=30; polling-uri=https://jbrowns.com/sitemap.xml" />
<meta name="theme-color" content="#ffffff" />
<meta name="msapplication-square150x150logo" content="/assets/uploads/system/site-logo.jpeg" />
<meta property="og:image" content="https://jbrowns.com/assets/uploads/system/site-logo.jpeg" />
<meta property="og:image:url" content="https://jbrowns.com/assets/uploads/system/site-logo.jpeg" />
<meta property="og:image:width" content="512" />
<meta property="og:image:height" content="768" />
<meta property="og:title" content="JBrown's Place" />
<meta property="og:url" content="https://jbrowns.com/groups" />
I am not receiving any errors, but I am also not receiving any data in the tpl. Maybe I am not seeing the picture. Maybe it's the number of hours I have been trying to figure this out.
Here is my plugin.json:
{
"id": "nodebb-theme-codename",
"url": "https://github.com/girls-whocode/nodebb-theme-codename",
"library": "lib/library.js",
"hooks": [
{ "hook": "filter:recent.build", "method": "filterRecentBuild" }
],
"staticDirs": {
"static": "static",
"inter": "node_modules/@fontsource/inter/files",
"poppins": "node_modules/@fontsource/poppins/files"
},
"scss": [
"scss/codename.scss"
],
"scripts": [
"public/codename.js"
],
"templates": "templates"
}
Here is my /lib/library.js
'use strict';
const nconf = require.main.require('nconf');
const meta = require.main.require('./src/meta');
const _ = require.main.require('lodash');
const user = require.main.require('./src/user');
const library = module.exports;
library.init = async function (params) {
const { router, middleware } = params;
const routeHelpers = require.main.require('./src/routes/helpers');
routeHelpers.setupAdminPageRoute(router, '/admin/plugins/harmony', [], controllers.renderAdminPage);
routeHelpers.setupPageRoute(router, '/user/:userslug/theme', [
middleware.exposeUid,
middleware.ensureLoggedIn,
middleware.canViewUsers,
middleware.checkAccountPermissions,
], controllers.renderThemeSettings);
if (nconf.get('isPrimary') && process.env.NODE_ENV === 'production') {
setTimeout(buildSkins, 0);
}
};
async function buildSkins() {
try {
const plugins = require.main.require('./src/plugins');
await plugins.prepareForBuild(['client side styles']);
for (const skin of meta.css.supportedSkins) {
// eslint-disable-next-line no-await-in-loop
await meta.css.buildBundle(`client-${skin}`, true);
}
require.main.require('./src/meta/minifier').killAll();
} catch (err) {
console.error(err.stack);
}
}
library.addAdminNavigation = async function (header) {
header.plugins.push({
route: '/plugins/harmony',
icon: 'fa-paint-brush',
name: '[[themes/harmony:theme-name]]',
});
return header;
};
library.addProfileItem = async (data) => {
data.links.push({
id: 'theme',
route: 'theme',
icon: 'fa-paint-brush',
name: '[[themes/harmony:settings.title]]',
visibility: {
self: true,
other: false,
moderator: false,
globalMod: false,
admin: false,
},
});
return data;
};
library.defineWidgetAreas = async function (areas) {
const locations = ['header', 'sidebar', 'footer'];
const templates = [
'categories.tpl', 'category.tpl', 'topic.tpl', 'users.tpl',
'unread.tpl', 'recent.tpl', 'popular.tpl', 'top.tpl', 'tags.tpl', 'tag.tpl',
'login.tpl', 'register.tpl',
];
function capitalizeFirst(str) {
return str.charAt(0).toUpperCase() + str.slice(1);
}
templates.forEach((template) => {
locations.forEach((location) => {
areas.push({
name: `${capitalizeFirst(template.split('.')[0])} ${capitalizeFirst(location)}`,
template: template,
location: location,
});
});
});
areas = areas.concat([
{
name: 'Main post header',
template: 'topic.tpl',
location: 'mainpost-header',
},
{
name: 'Main post footer',
template: 'topic.tpl',
location: 'mainpost-footer',
},
{
name: 'Sidebar Footer',
template: 'global',
location: 'sidebar-footer',
},
{
name: 'Brand Header',
template: 'global',
location: 'brand-header',
},
{
name: 'About me (before)',
template: 'account/profile.tpl',
location: 'profile-aboutme-before',
},
{
name: 'About me (after)',
template: 'account/profile.tpl',
location: 'profile-aboutme-after',
},
]);
return areas;
};
library.loadThemeConfig = async function (uid) {
const [themeConfig, userConfig] = await Promise.all([
meta.settings.get('harmony'),
user.getSettings(uid),
]);
const config = { ...defaults, ...themeConfig, ...(_.pick(userConfig, Object.keys(defaults))) };
config.enableQuickReply = config.enableQuickReply === 'on';
config.enableBreadcrumbs = config.enableBreadcrumbs === 'on';
config.centerHeaderElements = config.centerHeaderElements === 'on';
config.mobileTopicTeasers = config.mobileTopicTeasers === 'on';
config.stickyToolbar = config.stickyToolbar === 'on';
config.autohideBottombar = config.autohideBottombar === 'on';
config.openSidebars = config.openSidebars === 'on';
config.chatModals = config.chatModals === 'on';
return config;
};
library.getThemeConfig = async function (config) {
config.theme = await library.loadThemeConfig(config.uid);
config.openDraftsOnPageLoad = false;
return config;
};
library.getAdminSettings = async function (hookData) {
if (hookData.plugin === 'harmony') {
hookData.values = {
...defaults,
...hookData.values,
};
}
return hookData;
};
library.saveUserSettings = async function (hookData) {
Object.keys(defaults).forEach((key) => {
if (hookData.data.hasOwnProperty(key)) {
hookData.settings[key] = hookData.data[key] || undefined;
}
});
return hookData;
};
library.filterMiddlewareRenderHeader = async function (hookData) {
hookData.templateData.bootswatchSkinOptions = await meta.css.getSkinSwitcherOptions(hookData.req.uid);
return hookData;
};
library.filterTeasersConfigureStripTags = function (hookData) {
// teasers have a stretched-link to go to last post, the anchors in them are not clickable
hookData.tags.push('a');
return hookData;
};
Here is my public/codename.js
'use strict';
$(document).ready(function() {
setupNProgress();
require(['hooks'], function (hooks) {
hooks.on('filter:recent.build', function (hookData) {
// Ensure topicsList is added to the template context
if (hookData.templateData) {
console.log('Recent Build Hook Triggered: Adding topicsList');
hookData.templateData.topicsList = hookData.templateData.topicsList || [];
}
});
hooks.on('action:skin.change', function (hookData) {
$('[component="skinSwitcher"] i.fa-paintbrush').removeClass('fa-fade');
});
hooks.on('action:notification.updateCount', function (payload) {
$('[component="notification/badge"]')
.text(payload.count)
.toggleClass('hidden', !payload.count);
});
hooks.on('action:chat.updateCount', function (payload) {
$('[component="chat/badge"]')
.text(payload.count)
.toggleClass('hidden', !payload.count);
});
hooks.on('action:unread.updateCount', function (payload) {
const href = $('a[href="' + config.relative_path + payload.url + '"].navigation-link');
const el = href.parent().find('[component="nav/content/badge"]');
if (el.length) {
el.text(payload.count)
.toggleClass('hidden', !payload.count);
$('[component="unread/badge"]')
.text(payload.count)
.toggleClass('hidden', !payload.count);
}
});
});
$(window).on('action:ajaxify.start', function () {
require(['bootstrap'], function (boostrap) {
const offcanvas = boostrap.Offcanvas.getInstance('#offcanvas');
if (offcanvas) {
offcanvas.hide();
}
});
});
function setupNProgress() {
require(['nprogress'], function (NProgress) {
if (NProgress) {
$(window).on('action:ajaxify.start', function () {
NProgress.set(0.7);
});
$(window).on('action:ajaxify.end', function () {
NProgress.done();
});
}
});
}
});
Finally here is my templates/partials/latest.tpl
<div class="nodebbWidget nodebbWidget--horizontal" data-blocktitle="Topic Feed" data-blockid="app_forums_topicFeed_9f557b" data-menustyle="menu" data-blockconfig="1" data-widget-customizable="1" data-controller="core.front.widgets.block">
<header class="nodebbWidget__header">
<h3>Latest Topics</h3>
</header>
<div class="nodebbWidget__content">
<ul class="nodebbData nodebbData--mini-grid nodebbData--carousel nodebbData--topic-feed-widget" id="widget-topic-feed_65456218" tabindex="0">
{{{ each topicsList }}}
<li class="nodebbData__item">
<!-- Topic Title -->
<a href="/topic/{slug}" class="nodebbLinkPanel">
<span>{title}</span>
</a>
<!-- User Avatar or Fallback -->
<figure class="nodebbData__icon">
{{{ if user.picture }}}
<a href="/user/{user.username}" class="nodebbUserPhoto nodebbUserPhoto--fluid">
<img src="{user.picture}" alt="{user.username}" loading="lazy" />
</a>
{{{ else }}}
<div class="nodeBBNavNoPhotoTile nodebbUserPhoto--fluid nodebbUserNav__link"
style="background-color: {user.icon:bgColor || '#555'};
width: 28px;
height: 28px;
font-size: 15px;
line-height: 28px;
border-radius: 50%;">
{user.icon:text}
</div>
{{{ end }}}
</figure>
<!-- Metadata -->
<span>{formattedDate}</span>
<span>Views: {viewcount}</span>
<!-- Category -->
<ul class="nodebbTags nodebbTags--condensed">
<li class="nodebbTags__item">
<a href="/category/{category.slug}"
class="nodebbTags__tag"
rel="tag"
title="{category.name}">
<i class="fa {category.icon}"></i>
<span>{category.name}</span>
</a>
</li>
</ul>
</li>
{{{ end }}}
</ul>
</div>
</div>
Because of the number of spammers, I had another try at implementing email requirement for registration.
(If anyone hasnt seen my posts on this, I never got email sending to work, so had to turn email verification off)
Anyway in AdminPanel, selecting Zoho email, and entering Username and Password... trying to send test email
Invalid login: 535 Authentication Failed
Hi all,
We're finding that the verify email template isn't triggering when approving users via the registration queue, whereas the 'welcome' email template will trigger as normal.
@Matthew-Price has seen that it's because the user doesn't actually exist until approved, so it looks like the email confirmation isn't triggering before being added to the approval queue.
Is this something you're aware of?
I may look at writing a custom plugin that hooks into the approve action to then force a confirmation email to be sent to the user in the interim.
Thanks in advance,
Jordan
I have recently setup a NodeBB forum for my company (https://community.playsignage.com). After adding analysing the site in google search console, I noticed that many pages are missing canonical URL. Version: 3.10.3, Theme: Harmony
The pages are:
/users
/users/:userSlug
/users/:userSlug/:subPage (like followers)
/groups
/groups/:groupSlug
/tags
(possibly not exhaustive list)
Is this by design or an issue with my installation?
-
General Discussion
A place to talk about whatever you want
-
NodeBB Development
Stay tuned here to hear more about new releases and features of NodeBB!
-
Feature Requests
You have a cool idea about NodeBB? Post it here.
-
-
NodeBB Themes
A public listing of community themes created by the NodeBB community. -
Technical Support
Need help with installing or configuring NodeBB? Look here.
Copyright © 2024 NodeBB | Contributors