diff --git a/client/index.html b/client/index.html
index 73e6ab1..9782c48 100644
--- a/client/index.html
+++ b/client/index.html
@@ -243,6 +243,13 @@
padding: 2px 3px;
white-space: pre;
cursor: default;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ }
+ #membericon {
+ height: 18px;
+ filter: brightness(.75);
}
#createthread {
max-width: fit-content;
diff --git a/client/members.png b/client/members.png
new file mode 100644
index 0000000..d18cd63
Binary files /dev/null and b/client/members.png differ
diff --git a/client/thread.js b/client/thread.js
index b56f1d7..e9146d7 100644
--- a/client/thread.js
+++ b/client/thread.js
@@ -391,9 +391,11 @@ async function loadThreads(instancediv, select) {
else
document.getElementById('thread').classList.remove('hidden');
openThread(this, true);
- }}>${
+ }}>${
thread.name
- }`;
+ }`;
+ if (!thread.permissions.public)
+ node.insertAdjacentHTML('beforeend', `
`);
node.id = 'thread' + thread.id;
node.thread = thread;
thread.div = node;
@@ -480,7 +482,11 @@ async function loadThreads(instancediv, select) {
let el = threadlist.children['thread' + thread.id];
if (el) {
Object.assign(el.thread, thread);
- el.textContent = thread.name;
+ el.children['name'].textContent = thread.name;
+ if (!thread.permissions.everyone.view.value && !el.children['membericon'])
+ el.insertAdjacentHTML('beforeend', `
`);
+ else if (el.children['membericon'] && thread.permissions.everyone.value)
+ el.children['membericon'].remove();
if (window.currentThread?.id === thread.id) {
Object.assign(window.currentThread, thread);
document.getElementById('threadname').textContent = thread.name;
diff --git a/resources/members_export.png b/resources/members_export.png
new file mode 100644
index 0000000..00858c1
Binary files /dev/null and b/resources/members_export.png differ
diff --git a/resources/members_full.png b/resources/members_full.png
new file mode 100644
index 0000000..a7b2b5e
Binary files /dev/null and b/resources/members_full.png differ
diff --git a/resources/members_source.svg b/resources/members_source.svg
new file mode 100644
index 0000000..633ba88
--- /dev/null
+++ b/resources/members_source.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/events/thread.js b/src/events/thread.js
index 390e35d..49fb165 100644
--- a/src/events/thread.js
+++ b/src/events/thread.js
@@ -154,7 +154,6 @@ async function create_thread(msg, respond) {
}
}
}
- // respond
return respond({
success: true,
id: thread_id
@@ -164,24 +163,27 @@ async function create_thread(msg, respond) {
async function list_threads(msg, respond) {
// this can be optimized by merging the permission check into here
let threads = await db.query(
- `select name, id from thread
+ `select name, id, eperm.value from thread
+ left join permission as eperm on thread.id = eperm.thread
+ and eperm.type = 'everyone' and eperm.permission = 'view'
join permission on thread.id = permission.thread
left join member on thread.id = member.thread
where permission.permission = 'view' and permission.value = 'true'
- and ((permission.type = 'everyone') or
+ and (permission.type = 'everyone' or
permission.type = 'members' and member.user = ?)
group by thread.id
order by thread.created desc`,
msg.auth_user.id
);
- threads = await Promise.all(threads.rows.map(async thread => {
- Object.assign(thread, vybe.threads[thread.id]);
- thread.permissions = await check_permission(msg.auth_user.id, thread.id);
- return thread;
- }));
return respond({
success: true,
- threads
+ threads: await Promise.all(threads.rows.map(async row => {
+ let thread = {};
+ Object.assign(thread, vybe.threads[row.id]);
+ thread.permissions = await check_permission(msg.auth_user.id, row.id);
+ thread.permissions.public = row.value === 'true';
+ return thread;
+ }))
});
}
@@ -213,8 +215,7 @@ async function get_thread(msg, respond) {
const permissions = await db.query(
`select type, user, permission, value, mutable
from permission where thread = ?`,
- msg.thread
- );
+ msg.thread);
for (let permission of permissions.rows) {
const member = members[permission.user];
if (member)