working on wiki module: adding users+permissions, adding notes, adding tags

adding tag currently does not work due to the tag module not allowing for strings as entity ids
This commit is contained in:
2025-09-11 20:21:34 +02:00
parent aad9a7d9b8
commit a81eb4cb1b
5 changed files with 160 additions and 30 deletions

View File

@@ -170,7 +170,7 @@
<ul>
{#each Object.values(tasks) as task}
<li>
<a href="/task/{task.id}/view" {onclick} >{task.name}</a>
<a href="/task/{task.id}/view" {onclick} class={task.status.name}>{task.name}</a>
</li>
{/each}
</ul>

View File

@@ -3,23 +3,63 @@
import { useTinyRouter } from 'svelte-tiny-router';
import { api } from '../../urls.svelte';
import { t } from '../../translations.svelte';
import { user } from '../../user.svelte';
import Editor from '../../Components/MarkdownEditor.svelte';
import Notes from '../notes/RelatedNotes.svelte';
import PermissionEditor from '../../Components/PermissionEditor.svelte';
import TagList from '../tags/TagList.svelte';
let error = $state(null);
let { id, version } = $props();
let page = $state(null);
let router = useTinyRouter();
let members = $state({});
async function addMember(entry){
let newMembers = JSON.parse(JSON.stringify(page.members));
for (var id of Object.keys(entry)){
if (!newMembers[id]) newMembers[id] = { permission : {name:'READ_ONLY'} };
}
return patch({members:newMembers});
}
async function dropMember(member){
var id = member.user.id;
let newMembers = JSON.parse(JSON.stringify(page.members));
newMembers[id].permission = null;
return patch({members:newMembers});
}
function nonMember(json){
return !page.members[json.id];
}
async function getCandidates(text){
const url = api('user/search');
const resp = await fetch(url,{
credentials : 'include',
method : 'POST',
body : text
});
if (resp.ok){
var json = await resp.json();
return Object.fromEntries(Object.values(json).filter(nonMember).map(user => [user.id,user.name]));
} else {
return [];
}
}
async function loadContent(res){
if (res.ok){
page = null;
page = await res.json();
page.versions.sort((a,b)=>b-a);
version = page.version;
error = null;
return true;
} else {
error = await res.text();
return false;
}
}
@@ -45,7 +85,13 @@
method:'PATCH',
body:JSON.stringify(data)
});
loadContent(res);
return loadContent(res);
}
async function updatePermission(uid, newPerm){
let newMembers = JSON.parse(JSON.stringify(page.members));
newMembers[uid] = {permission:newPerm};
return patch({members:newMembers});
}
$effect(loadPage);
@@ -57,15 +103,38 @@
<span class="version">{t('version')}</span>
{#each page.versions as v}
<span class="version">
<a href={`/wiki/${id}/version/${v}`} {onclick} class={page.version == v?'selected':''}>{v}</a>
&nbsp;
<a href={`/wiki/${id}/version/${v}`} {onclick} class={page.version == v?'selected':''}>{v}</a> &nbsp;
</span>
{/each}
{/if}
<h2>{id}</h2>
{#if page}
{#if page.version != page.versions[0]}
<span class="warn">{t('not_recent_version')}</span>
{/if}
{#if page.members[user.id].permission.code<4}
<Editor editable={true} value={page.content} onSet={s => patch({content:s})}></Editor>
{/if}
<PermissionEditor members={page.members} {addMember} {dropMember} {getCandidates} {updatePermission} />
{:else}
<div class="markdown">{@html page.content.rendered}</div>
<table>
<thead>
<tr>
<th>{t('user')}</th>
<th>{t('permissions')}</th>
</tr>
</thead>
<tbody>
{#each Object.values(page.members) as member,id}
<tr>
<td>{member.user.name}</td>
<td>{t('permission_'+member.permission.name.toLowerCase())}</td>
</tr>
{/each}
</tbody>
</table>
{/if}
<TagList module="wiki" {id} user_list={Object.keys(page.members).map(id => +id)} />
<div class="notes">
<h3>{t('notes')}</h3>
<Notes module="wiki" entity_id={id} />
</div>
{/if}