Projekte: zur Vorlage gemachtes Projekt verschwindet nicht mehr

Vorlagen stehen absichtlich nur in der Ansicht "Vorlagen" (Admins). Nach
dem Speichern als Vorlage fiel das Projekt deshalb kommentarlos aus
"Aktive Projekte" (SHK-vorlage, 04.10.2026).

- nach dem Bearbeiten in die Ansicht wechseln, in der das Projekt jetzt
  steht, mit Hinweis ("steht jetzt unter Vorlagen")
- Suche zeigt Treffer in ausgeblendeten Ansichten (Vorlagen, Archiv) mit
  Klick zum Wechseln
- Hilfen viewShowing / matchesSearch / hiddenMatches in lib/projectList.js

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
ClaudeandClaude Opus 5.5 committed 2026-10-04 20:01:38 +00:00
1 parent c262268015
commit 603d08c9c2
3 files changed
+140 -34

No files matched your search

+43 -1
View File
@@ -2,7 +2,7 @@ import test from 'node:test'
import assert from 'node:assert/strict'
import { loadModule } from './load.mjs'
const { projectCounts, projectsInView } = await loadModule('src/lib/projectList.js')
const { projectCounts, projectsInView, viewShowing, matchesSearch, hiddenMatches } = await loadModule('src/lib/projectList.js')
const P = [
{ $id: 'a' },
@@ -34,3 +34,45 @@ test('Zaehler passen zu den Ansichten', () => {
assert.deepEqual(projectCounts(P), { all: 2, unassigned: 1, assigned: 1, archived: 1, templates: 1, everything: 3 })
assert.deepEqual(projectCounts(P, { isAdmin: true }).everything, 5)
})
// 04.10.2026: SHK-vorlage zur Vorlage gemacht -> verschwand kommentarlos aus "Aktive Projekte"
test('viewShowing: bleibt in der aktuellen Ansicht, wenn das Projekt dort steht', () => {
assert.equal(viewShowing(P[0], 'all', { isAdmin: true }), 'all')
assert.equal(viewShowing(P[1], 'assigned'), 'assigned')
assert.equal(viewShowing(P[3], 'everything', { isAdmin: true }), 'everything')
})
test('viewShowing: zur Vorlage gemacht -> Vorlagen, zurueck -> Aktive Projekte', () => {
assert.equal(viewShowing({ $id: 'x', isTemplate: true }, 'all', { isAdmin: true }), 'templates')
assert.equal(viewShowing({ $id: 'x', isTemplate: true }, 'unassigned', { isAdmin: true }), 'templates')
assert.equal(viewShowing({ $id: 'x' }, 'templates', { isAdmin: true }), 'all')
assert.equal(viewShowing({ $id: 'x', archived: true }, 'all'), 'archived')
})
test('viewShowing: ohne Admin keine Vorlagen-Ansicht, dann bleibt die Ansicht', () => {
assert.equal(viewShowing({ $id: 'x', isTemplate: true }, 'all'), 'all')
assert.equal(viewShowing(null, 'assigned'), 'assigned')
})
test('matchesSearch: Titel, Subdomain, Repo; leer passt immer', () => {
const p = { projectName: 'SHK-vorlage', subdomain: 'shk-vorlage', repoFullName: 'knso/SHK-vorlage', giteaRepoName: 'SHK-vorlage' }
assert.equal(matchesSearch(p, ''), true)
assert.equal(matchesSearch(p, ' shk '), true)
assert.equal(matchesSearch(p, 'knso/'), true)
assert.equal(matchesSearch(p, 'olzinger'), false)
})
test('hiddenMatches: Treffer, die die aktuelle Ansicht ausblendet', () => {
const list = [
{ $id: 'a', projectName: 'SHK Kunde' },
{ $id: 't', projectName: 'SHK-vorlage', isTemplate: true },
{ $id: 'r', projectName: 'SHK alt', archived: true },
{ $id: 'o', projectName: 'Olzinger' },
]
const shk = (p) => matchesSearch(p, 'shk')
assert.deepEqual(hiddenMatches(list, 'all', shk, { isAdmin: true }), [{ view: 'templates', count: 1 }, { view: 'archived', count: 1 }])
assert.deepEqual(hiddenMatches(list, 'all', shk), [{ view: 'archived', count: 1 }], 'Vorlagen nur fuer Admins')
assert.deepEqual(hiddenMatches(list, 'templates', shk, { isAdmin: true }), [{ view: 'archived', count: 1 }])
assert.deepEqual(hiddenMatches(list, 'everything', shk, { isAdmin: true }), [], 'zeigt schon alles')
assert.deepEqual(hiddenMatches(list, 'all', (p) => matchesSearch(p, 'olz'), { isAdmin: true }), [])
})