Add owner dropdown to admin for linking posts to registered users

Allows reassigning posts to registered users via submittedBy field.
Shows validated badge and bold author name for linked posts.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-08 13:32:48 +02:00
parent 03f8663520
commit 8eee5ee0ca

View File

@@ -281,6 +281,13 @@
<input type="text" id="postAuthor" placeholder="esim. Anna K." /> <input type="text" id="postAuthor" placeholder="esim. Anna K." />
</div> </div>
<div class="form-group">
<label>Omistaja <small style="color:#7a5c3e;font-weight:normal;text-transform:none">(linkitä rekisteröityneeseen käyttäjään)</small></label>
<select id="postOwner">
<option value="">— Ei linkitetty —</option>
</select>
</div>
<div class="form-group"> <div class="form-group">
<label id="lbl_desc">Kuvaus</label> <label id="lbl_desc">Kuvaus</label>
<textarea id="postDesc" rows="2" placeholder="Lyhyt houkutteleva kuvaus..."></textarea> <textarea id="postDesc" rows="2" placeholder="Lyhyt houkutteleva kuvaus..."></textarea>
@@ -492,6 +499,7 @@
document.getElementById('backLink').textContent = at('back'); document.getElementById('backLink').textContent = at('back');
document.getElementById('saveBtn').textContent = at('save'); document.getElementById('saveBtn').textContent = at('save');
populateCategorySelect(); populateCategorySelect();
populateOwnerSelect();
renderCatList(); renderCatList();
renderPostList(); renderPostList();
renderUserList(); renderUserList();
@@ -676,6 +684,13 @@
updateAdminSubcategories(); updateAdminSubcategories();
} }
function populateOwnerSelect(currentUserId = '') {
const sel = document.getElementById('postOwner');
sel.innerHTML = `<option value="">— Ei linkitetty —</option>` +
(ADMIN.users || []).map(u => `<option value="${u.id}">${u.nickname}${u.email ? ' (' + u.email + ')' : ''}</option>`).join('');
if (currentUserId) sel.value = currentUserId;
}
function updateAdminSubcategories(checked = []) { function updateAdminSubcategories(checked = []) {
const catId = document.getElementById('postCategory').value; const catId = document.getElementById('postCategory').value;
const cat = ADMIN.categories.find(c => c.id === catId); const cat = ADMIN.categories.find(c => c.id === catId);
@@ -755,6 +770,20 @@
].filter(Boolean); ].filter(Boolean);
const post = { title, emoji, category, subcategory, author, desc, images, type: currentType }; const post = { title, emoji, category, subcategory, author, desc, images, type: currentType };
// Omistaja / submittedBy
const ownerId = document.getElementById('postOwner').value;
if (ownerId) {
const owner = (ADMIN.users || []).find(u => u.id === ownerId);
post.submittedBy = { userId: ownerId, nickname: owner?.nickname || author, validated: true };
if (!author && owner) post.author = owner.nickname;
} else {
// Keep existing submittedBy if editing unless explicitly cleared
if (editingId) {
const existing = ADMIN.posts.find(p => p.id === editingId);
if (existing?.submittedBy && !ownerId) post.submittedBy = null;
}
}
if (currentType === 'recipe') { if (currentType === 'recipe') {
post.time = document.getElementById('postTime').value.trim(); post.time = document.getElementById('postTime').value.trim();
post.servings = document.getElementById('postServings').value.trim(); post.servings = document.getElementById('postServings').value.trim();
@@ -795,6 +824,7 @@
document.getElementById('postTitle').value = p.title; document.getElementById('postTitle').value = p.title;
document.getElementById('postCategory').value = p.category; document.getElementById('postCategory').value = p.category;
document.getElementById('postAuthor').value = p.author || ''; document.getElementById('postAuthor').value = p.author || '';
populateOwnerSelect(p.submittedBy?.userId || '');
// Load subcategory checkboxes with existing values // Load subcategory checkboxes with existing values
const existingSubs = Array.isArray(p.subcategory) ? p.subcategory : (p.subcategory ? [p.subcategory] : []); const existingSubs = Array.isArray(p.subcategory) ? p.subcategory : (p.subcategory ? [p.subcategory] : []);
updateAdminSubcategories(existingSubs); updateAdminSubcategories(existingSubs);
@@ -833,6 +863,7 @@
editingId = null; editingId = null;
document.getElementById('postTitle').value = ''; document.getElementById('postTitle').value = '';
document.getElementById('postAuthor').value = ''; document.getElementById('postAuthor').value = '';
populateOwnerSelect('');
updateAdminSubcategories([]); updateAdminSubcategories([]);
document.getElementById('postDesc').value = ''; document.getElementById('postDesc').value = '';
document.getElementById('postTime').value = ''; document.getElementById('postTime').value = '';