Replace native selects with NovaSelect

This commit is contained in:
2026-05-01 07:45:37 +02:00
parent 67be537c86
commit 35011001ba
55 changed files with 3136 additions and 1662 deletions

View File

@@ -1,6 +1,8 @@
import React from 'react'
import { Head, Link, usePage } from '@inertiajs/react'
import NovaCardCanvasPreview from '../../components/nova-cards/NovaCardCanvasPreview'
import Checkbox from '../../components/ui/Checkbox'
import NovaSelect from '../../components/ui/NovaSelect'
function requestJson(url, { method = 'GET', body } = {}) {
return fetch(url, {
@@ -396,16 +398,15 @@ export default function NovaCardsAdminIndex() {
</div>
) : null}
<div className="mt-3 max-w-xs">
<label className="text-sm text-amber-50">
<div className="text-sm text-amber-50">
<span className="mb-2 block text-[11px] font-semibold uppercase tracking-[0.16em] text-amber-100/75">Disposition</span>
<select
<NovaSelect
value={preferredDisposition(report.target.moderation_target.moderation_status, reportDispositions[report.id])}
onChange={(event) => setReportDispositions((current) => ({ ...current, [report.id]: event.target.value }))}
className="w-full rounded-2xl border border-amber-200/20 bg-[#0d1726] px-4 py-3 text-white"
>
{dispositionOptionsForStatus(report.target.moderation_target.moderation_status).map((option) => <option key={`${report.id}-disp-${option.value}`} value={option.value}>{option.label}</option>)}
</select>
</label>
onChange={(value) => setReportDispositions((current) => ({ ...current, [report.id]: value }))}
options={dispositionOptionsForStatus(report.target.moderation_target.moderation_status).map((option) => ({ value: option.value, label: option.label }))}
searchable={false}
/>
</div>
</div>
<div className="mt-3 flex flex-wrap gap-2">
{(report.target.moderation_target.available_actions || []).map((actionItem) => (
@@ -497,40 +498,34 @@ export default function NovaCardsAdminIndex() {
</div>
<p className="mt-3 line-clamp-3 text-sm leading-7 text-slate-300">{card.quote_text}</p>
<div className="mt-4 grid gap-3 md:grid-cols-3">
<label className="text-sm text-slate-300">
<div className="text-sm text-slate-300">
<span className="mb-2 block">Status</span>
<select value={card.status} onChange={(event) => updateCard(card.id, { status: event.target.value })} className="w-full rounded-2xl border border-white/10 bg-[#0d1726] px-4 py-3 text-white">
{['draft', 'processing', 'published', 'hidden', 'rejected'].map((item) => <option key={`${card.id}-${item}`} value={item}>{item}</option>)}
</select>
</label>
<label className="text-sm text-slate-300">
<NovaSelect value={card.status} onChange={(val) => updateCard(card.id, { status: val })} searchable={false} options={['draft', 'processing', 'published', 'hidden', 'rejected'].map((s) => ({ value: s, label: s }))} />
</div>
<div className="text-sm text-slate-300">
<span className="mb-2 block">Moderation</span>
<select value={card.moderation_status} onChange={(event) => updateCard(card.id, { moderation_status: event.target.value, disposition: preferredDisposition(event.target.value, cardDispositions[card.id]) })} className="w-full rounded-2xl border border-white/10 bg-[#0d1726] px-4 py-3 text-white">
{['pending', 'approved', 'flagged', 'rejected'].map((item) => <option key={`${card.id}-mod-${item}`} value={item}>{item}</option>)}
</select>
</label>
<label className="text-sm text-slate-300">
<NovaSelect value={card.moderation_status} onChange={(val) => updateCard(card.id, { moderation_status: val, disposition: preferredDisposition(val, cardDispositions[card.id]) })} searchable={false} options={['pending', 'approved', 'flagged', 'rejected'].map((s) => ({ value: s, label: s }))} />
</div>
<div className="text-sm text-slate-300">
<span className="mb-2 block">Disposition</span>
<select
<NovaSelect
value={preferredDisposition(card.moderation_status, cardDispositions[card.id])}
onChange={(event) => {
const disposition = event.target.value
setCardDispositions((current) => ({ ...current, [card.id]: disposition }))
updateCard(card.id, { moderation_status: card.moderation_status, disposition })
onChange={(val) => {
setCardDispositions((current) => ({ ...current, [card.id]: val }))
updateCard(card.id, { moderation_status: card.moderation_status, disposition: val })
}}
className="w-full rounded-2xl border border-white/10 bg-[#0d1726] px-4 py-3 text-white"
>
{dispositionOptionsForStatus(card.moderation_status).map((option) => <option key={`${card.id}-disp-${option.value}`} value={option.value}>{option.label}</option>)}
</select>
</label>
<label className="flex items-center justify-between rounded-2xl border border-white/10 bg-white/[0.03] px-4 py-3 text-sm text-slate-200">
searchable={false}
options={dispositionOptionsForStatus(card.moderation_status)}
/>
</div>
<div className="flex items-center justify-between rounded-2xl border border-white/10 bg-white/[0.03] px-4 py-3 text-sm text-slate-200">
<span>Featured</span>
<input type="checkbox" checked={Boolean(card.featured)} onChange={(event) => updateCard(card.id, { featured: event.target.checked })} className="h-4 w-4" />
</label>
<label className="flex items-center justify-between rounded-2xl border border-white/10 bg-white/[0.03] px-4 py-3 text-sm text-slate-200">
<Checkbox checked={Boolean(card.featured)} onChange={(event) => updateCard(card.id, { featured: event.target.checked })} />
</div>
<div className="flex items-center justify-between rounded-2xl border border-white/10 bg-white/[0.03] px-4 py-3 text-sm text-slate-200">
<span>Allow remix</span>
<input type="checkbox" checked={Boolean(card.allow_remix)} onChange={(event) => updateCard(card.id, { allow_remix: event.target.checked })} className="h-4 w-4" />
</label>
<Checkbox checked={Boolean(card.allow_remix)} onChange={(event) => updateCard(card.id, { allow_remix: event.target.checked })} />
</div>
</div>
<div className="mt-4 grid gap-3 md:grid-cols-4 text-xs text-slate-400">
<div className="rounded-2xl border border-white/10 bg-white/[0.03] px-4 py-3">{card.likes_count || 0} likes</div>
@@ -596,10 +591,10 @@ export default function NovaCardsAdminIndex() {
<div className="rounded-2xl border border-white/10 bg-[#08111f]/70 px-3 py-3">{creator.featured_cards_count || 0} featured</div>
<div className="rounded-2xl border border-white/10 bg-[#08111f]/70 px-3 py-3">{creator.total_views_count || 0} views</div>
</div>
<label className="mt-3 flex items-center justify-between rounded-2xl border border-white/10 bg-white/[0.03] px-4 py-3 text-sm text-slate-200">
<div className="mt-3 flex items-center justify-between rounded-2xl border border-white/10 bg-white/[0.03] px-4 py-3 text-sm text-slate-200">
<span>Feature on editorial page</span>
<input type="checkbox" checked={Boolean(creator.nova_featured_creator)} onChange={(event) => updateCreator(creator.id, { nova_featured_creator: event.target.checked })} className="h-4 w-4" />
</label>
<Checkbox checked={Boolean(creator.nova_featured_creator)} onChange={(event) => updateCreator(creator.id, { nova_featured_creator: event.target.checked })} />
</div>
</div>
))}
</div>