Skip to content

Commit 27adc6e

Browse files
Merge pull request #117 from ipnet-mesh/feat/node-list-tag-improvements
Improve node list tag display with name, description, members, and emoji extraction
2 parents 3176278 + 835fb1c commit 27adc6e

File tree

2 files changed

+34
-16
lines changed

2 files changed

+34
-16
lines changed

src/meshcore_hub/web/static/js/spa/pages/advertisements.js

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ export async function render(container, params, router) {
1616
const offset = (page - 1) * limit;
1717

1818
const config = getConfig();
19+
const features = config.features || {};
20+
const showMembers = features.members !== false;
1921
const tz = config.timezone || '';
2022
const tzBadge = tz && tz !== 'UTC' ? html`<span class="text-sm opacity-60">${tz}</span>` : nothing;
2123
const navigate = (url) => router.navigate(url);
@@ -36,17 +38,24 @@ ${content}`, container);
3638
renderPage(nothing);
3739

3840
try {
39-
const [data, nodesData, membersData] = await Promise.all([
41+
const requests = [
4042
apiGet('/api/v1/advertisements', { limit, offset, search, public_key, member_id }),
4143
apiGet('/api/v1/nodes', { limit: 500 }),
42-
apiGet('/api/v1/members', { limit: 100 }),
43-
]);
44+
];
45+
if (showMembers) {
46+
requests.push(apiGet('/api/v1/members', { limit: 100 }));
47+
}
48+
49+
const results = await Promise.all(requests);
50+
const data = results[0];
51+
const nodesData = results[1];
52+
const membersData = showMembers ? results[2] : null;
4453

4554
const advertisements = data.items || [];
4655
const total = data.total || 0;
4756
const totalPages = Math.ceil(total / limit);
4857
const allNodes = nodesData.items || [];
49-
const members = membersData.items || [];
58+
const members = membersData?.items || [];
5059

5160
const sortedNodes = allNodes.map(n => {
5261
const tagName = n.tags?.find(t => t.key === 'name')?.value;
@@ -66,7 +75,7 @@ ${content}`, container);
6675
</div>`
6776
: nothing;
6877

69-
const membersFilter = members.length > 0
78+
const membersFilter = (showMembers && members.length > 0)
7079
? html`
7180
<div class="form-control">
7281
<label class="label py-1">

src/meshcore_hub/web/static/js/spa/pages/nodes.js

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ export async function render(container, params, router) {
1717
const offset = (page - 1) * limit;
1818

1919
const config = getConfig();
20+
const features = config.features || {};
21+
const showMembers = features.members !== false;
2022
const tz = config.timezone || '';
2123
const tzBadge = tz && tz !== 'UTC' ? html`<span class="text-sm opacity-60">${tz}</span>` : nothing;
2224
const navigate = (url) => router.navigate(url);
@@ -37,17 +39,23 @@ ${content}`, container);
3739
renderPage(nothing);
3840

3941
try {
40-
const [data, membersData] = await Promise.all([
42+
const requests = [
4143
apiGet('/api/v1/nodes', { limit, offset, search, adv_type, member_id }),
42-
apiGet('/api/v1/members', { limit: 100 }),
43-
]);
44+
];
45+
if (showMembers) {
46+
requests.push(apiGet('/api/v1/members', { limit: 100 }));
47+
}
48+
49+
const results = await Promise.all(requests);
50+
const data = results[0];
51+
const membersData = showMembers ? results[1] : null;
4452

4553
const nodes = data.items || [];
4654
const total = data.total || 0;
4755
const totalPages = Math.ceil(total / limit);
48-
const members = membersData.items || [];
56+
const members = membersData?.items || [];
4957

50-
const membersFilter = members.length > 0
58+
const membersFilter = (showMembers && members.length > 0)
5159
? html`
5260
<div class="form-control">
5361
<label class="label py-1">
@@ -67,9 +75,9 @@ ${content}`, container);
6775
const tagDescription = node.tags?.find(tag => tag.key === 'description')?.value;
6876
const displayName = tagName || node.name;
6977
const lastSeen = node.last_seen ? formatDateTimeShort(node.last_seen) : '-';
70-
const memberIdTag = node.tags?.find(tag => tag.key === 'member_id')?.value;
78+
const memberIdTag = showMembers ? node.tags?.find(tag => tag.key === 'member_id')?.value : null;
7179
const member = memberIdTag ? members.find(m => m.member_id === memberIdTag) : null;
72-
const memberBlock = member
80+
const memberBlock = (showMembers && member)
7381
? html`<div class="text-xs opacity-60">${member.name}</div>`
7482
: nothing;
7583
return html`<a href="/nodes/${node.public_key}" class="card bg-base-100 shadow-sm block">
@@ -91,14 +99,15 @@ ${content}`, container);
9199
</a>`;
92100
});
93101

102+
const tableColspan = showMembers ? 4 : 3;
94103
const tableRows = nodes.length === 0
95-
? html`<tr><td colspan="4" class="text-center py-8 opacity-70">${t('common.no_entity_found', { entity: t('entities.nodes').toLowerCase() })}</td></tr>`
104+
? html`<tr><td colspan="${tableColspan}" class="text-center py-8 opacity-70">${t('common.no_entity_found', { entity: t('entities.nodes').toLowerCase() })}</td></tr>`
96105
: nodes.map(node => {
97106
const tagName = node.tags?.find(tag => tag.key === 'name')?.value;
98107
const tagDescription = node.tags?.find(tag => tag.key === 'description')?.value;
99108
const displayName = tagName || node.name;
100109
const lastSeen = node.last_seen ? formatDateTime(node.last_seen) : '-';
101-
const memberIdTag = node.tags?.find(tag => tag.key === 'member_id')?.value;
110+
const memberIdTag = showMembers ? node.tags?.find(tag => tag.key === 'member_id')?.value : null;
102111
const member = memberIdTag ? members.find(m => m.member_id === memberIdTag) : null;
103112
const memberBlock = member
104113
? html`${member.name}${member.callsign ? html` <span class="opacity-60">(${member.callsign})</span>` : nothing}`
@@ -121,7 +130,7 @@ ${content}`, container);
121130
title="Click to copy">${node.public_key}</code>
122131
</td>
123132
<td class="text-sm whitespace-nowrap">${lastSeen}</td>
124-
<td class="text-sm">${memberBlock}</td>
133+
${showMembers ? html`<td class="text-sm">${memberBlock}</td>` : nothing}
125134
</tr>`;
126135
});
127136

@@ -170,7 +179,7 @@ ${content}`, container);
170179
<th>${t('entities.node')}</th>
171180
<th>${t('common.public_key')}</th>
172181
<th>${t('common.last_seen')}</th>
173-
<th>${t('entities.member')}</th>
182+
${showMembers ? html`<th>${t('entities.member')}</th>` : nothing}
174183
</tr>
175184
</thead>
176185
<tbody>

0 commit comments

Comments
 (0)