// Collections management page (US-032) - Updated for RBAC field permissions import { useState, useEffect, useCallback } from 'react' import { useNavigate } from 'react-router-dom' import apiClient from '@/api/client' import { useWorkspace } from '@/contexts/WorkspaceContext' import { useAuth } from '@/contexts/AuthContext' import Button from '@/components/Button' import Input from '@/components/Input' import FieldPermissionEditor from '@/components/FieldPermissionEditor' import type { Collection, Group, FieldPermission } from '@/types' interface CollectionFormData { name: string schema: string field_permissions: FieldPermission[] } function CollectionModal({ collection, workspaceId, availableGroups, onClose, onSave, }: { collection: Collection | null workspaceId: string availableGroups: Group[] onClose: () => void onSave: () => void }) { const [formData, setFormData] = useState({ name: collection?.name || '', schema: collection?.settings?.schema ? typeof collection.settings.schema === 'string' ? collection.settings.schema : JSON.stringify(collection.settings.schema, null, 2) : '{}', field_permissions: collection?.settings?.field_permissions || [], }) const [isLoading, setIsLoading] = useState(false) const [error, setError] = useState(null) const [schemaError, setSchemaError] = useState(null) const [activeTab, setActiveTab] = useState<'schema' | 'permissions'>('schema') // Extract field names from schema for the field permission editor const schemaFields = (() => { try { const parsed = JSON.parse(formData.schema) if (parsed.properties && typeof parsed.properties === 'object') { return Object.keys(parsed.properties) } return [] } catch { return [] } })() const validateSchema = (schemaStr: string): boolean => { try { JSON.parse(schemaStr) setSchemaError(null) return true } catch { setSchemaError('Invalid JSON schema') return false } } const handleSchemaChange = (value: string) => { setFormData({ ...formData, schema: value }) validateSchema(value) } const handleSubmit = async (e: React.FormEvent) => { e.preventDefault() if (!validateSchema(formData.schema)) { return } setIsLoading(true) setError(null) try { const payload = { name: formData.name, settings: { schema: JSON.parse(formData.schema), field_permissions: formData.field_permissions, }, } if (collection) { await apiClient.request(`/workspaces/${workspaceId}/collections/${collection.name}`, { method: 'PUT', body: payload, }) } else { await apiClient.post(`/workspaces/${workspaceId}/collections`, payload) } onSave() } catch (err) { setError(err instanceof Error ? err.message : 'Failed to save collection') } finally { setIsLoading(false) } } return (

{collection ? 'Edit Collection' : 'Create Collection'}

{error && (
{error}
)} setFormData({ ...formData, name: e.target.value })} placeholder="my_collection" required disabled={!!collection} autoFocus={!collection} /> {/* Tabs */}
{/* Tab Content */} {activeTab === 'schema' && (