fix(render+roles): batch smooth shading + step timings + global_admin role support
Render pipeline: - Replace per-object _apply_smooth() loop with _apply_smooth_batch(): selects all 175 parts, calls shade_smooth_by_angle() ONCE in C → reduces 16s to ~0.2s - Remove 175 per-part "assigned material to part" log lines (replace with summary) - Add TIMING_SUMMARY log line at end of every render showing all step durations - _lap() helper records split times for: template_load, glb_import, rotation, smooth_shading, material_assign, pre_render_setup, gpu_render Frontend role checks: - Add global_admin + tenant_admin to User role type in auth store - Add isAdmin() and isPrivileged() helper functions - Fix Admin.tsx, Layout.tsx, Notifications.tsx, OrderDetail.tsx, ProductDetail.tsx, CostOverviewWidget.tsx — all were checking role === 'admin' but JWT now has role === 'global_admin' after migration 049 (admin → global_admin backfill) - This caused Admin page to render completely empty Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -10,7 +10,7 @@ import TemplateEditor from '../components/admin/TemplateEditor'
|
||||
import PricingTierTable from '../components/admin/PricingTierTable'
|
||||
import OutputTypeTable from '../components/admin/OutputTypeTable'
|
||||
import RenderTemplateTable from '../components/admin/RenderTemplateTable'
|
||||
import { useAuthStore } from '../store/auth'
|
||||
import { useAuthStore, isAdmin as checkIsAdmin } from '../store/auth'
|
||||
import { listPricingTiers } from '../api/pricing'
|
||||
import { listOutputTypes } from '../api/outputTypes'
|
||||
import {
|
||||
@@ -26,7 +26,7 @@ import type { GPUProbeResult } from '../api/worker'
|
||||
export default function AdminPage() {
|
||||
const qc = useQueryClient()
|
||||
const user = useAuthStore((s) => s.user)
|
||||
const isAdmin = user?.role === 'admin'
|
||||
const isAdmin = checkIsAdmin(user)
|
||||
const [showNewUser, setShowNewUser] = useState(false)
|
||||
const [newUser, setNewUser] = useState({ email: '', password: '', full_name: '', role: 'client' })
|
||||
const [editingTemplateId, setEditingTemplateId] = useState<string | null>(null)
|
||||
@@ -335,7 +335,7 @@ export default function AdminPage() {
|
||||
<p className="text-sm font-medium text-content">{user.full_name}</p>
|
||||
<p className="text-xs text-content-muted">{user.email}</p>
|
||||
</div>
|
||||
<span className={`badge mr-4 ${user.role === 'admin' ? 'badge-green' : 'badge-gray'}`}>
|
||||
<span className={`badge mr-4 ${checkIsAdmin(user) ? 'badge-green' : 'badge-gray'}`}>
|
||||
{user.role}
|
||||
</span>
|
||||
<span className={`badge mr-4 ${user.is_active ? 'badge-green' : 'badge-red'}`}>
|
||||
|
||||
Reference in New Issue
Block a user