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)