Platform polish: bulk invite, file requirements, filtering redesign, UX fixes

- F1: Set seed jury/mentors/observers to NONE status (not invited), remove passwords
- F2: Add bulk invite UI with checkbox selection and floating toolbar
- F3: Add getProjectRequirements backend query + requirement slots on project detail
- F4: Redesign filtering section: AI criteria textarea, "What AI sees" card,
  field-aware eligibility rules with human-readable previews
- F5: Auto-redirect to pipeline detail when only one pipeline exists
- F6: Make project names clickable in pipeline intake panel
- F7: Fix pipeline creation error: edition context fallback + .min(1) validation
- Pipeline wizard sections: add isActive locking, info tooltips, UX improvements

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-13 23:45:21 +01:00
parent 451b483880
commit 70cfad7d46
28 changed files with 1312 additions and 200 deletions

View File

@@ -186,7 +186,6 @@ async function main() {
const juryUserIds: string[] = []
for (const j of juryMembers) {
const passwordHash = await bcrypt.hash('Jury2026!', 12)
const user = await prisma.user.upsert({
where: { email: j.email },
update: {},
@@ -194,11 +193,9 @@ async function main() {
email: j.email,
name: j.name,
role: UserRole.JURY_MEMBER,
status: UserStatus.ACTIVE,
status: UserStatus.NONE,
country: j.country,
expertiseTags: j.tags,
passwordHash,
mustSetPassword: true,
bio: `Expert in ${j.tags.join(', ')}`,
},
})
@@ -218,7 +215,6 @@ async function main() {
]
for (const m of mentors) {
const passwordHash = await bcrypt.hash('Mentor2026!', 12)
await prisma.user.upsert({
where: { email: m.email },
update: {},
@@ -226,11 +222,9 @@ async function main() {
email: m.email,
name: m.name,
role: UserRole.MENTOR,
status: UserStatus.ACTIVE,
status: UserStatus.NONE,
country: m.country,
expertiseTags: m.tags,
passwordHash,
mustSetPassword: true,
},
})
console.log(` ✓ Mentor: ${m.name}`)
@@ -247,7 +241,6 @@ async function main() {
]
for (const o of observers) {
const passwordHash = await bcrypt.hash('Observer2026!', 12)
await prisma.user.upsert({
where: { email: o.email },
update: {},
@@ -255,10 +248,8 @@ async function main() {
email: o.email,
name: o.name,
role: UserRole.OBSERVER,
status: UserStatus.ACTIVE,
status: UserStatus.NONE,
country: o.country,
passwordHash,
mustSetPassword: true,
},
})
console.log(` ✓ Observer: ${o.name}`)