import { Collection, CreateCollectionPayload, getContentTypeRefId, JSONSchemaObject, SecurityLevelLabels } from "@vertesia/common"; import { Badge, Button, ErrorBox, FormItem, Input, Panel, SelectBox, Styles, Textarea, useFetch, useToast, useTheme } from "@vertesia/ui/core"; import { SharedPropsEditor, SyncMemberHeadsToggle, UserInfo } from "@vertesia/ui/features"; import { useUserSession } from "@vertesia/ui/session"; import { MonacoEditor, EditorApi, GeneratedForm, ManagedObject, Node } from "@vertesia/ui/widgets"; import dayjs from "dayjs"; import { useContext, useMemo, useRef, useState } from "react"; import { useUITranslation } from '../../../i18n/index.js'; import { SearchContext } from "../objects/search/DocumentSearchContext"; import { SelectContentType, stringifyTableLayout } from "../types"; interface UpdateData { name: string; description: string; query: string; tags: string[]; type: string; allowed_types: string[]; sensitivity?: number; compartments: string[]; } interface EditCollectionViewProps { collection: Collection; refetch: () => void; } export function EditCollectionView({ refetch, collection }: EditCollectionViewProps) { const { t } = useUITranslation(); const typeId = collection.type ? getContentTypeRefId(collection.type) : undefined; const tableLayoutRef = useRef(undefined); const toast = useToast(); const { theme } = useTheme(); const { client } = useUserSession(); const search = useContext(SearchContext); const [isUpdating, setUpdating] = useState(false); const [metadata, setMetadata] = useState({ name: collection.name, description: collection.description || "", query: collection.query ? JSON.stringify(collection.query, null, 2) : "", tags: collection.tags || [], type: collection.type ? getContentTypeRefId(collection.type) : "", allowed_types: collection.allowed_types || [], sensitivity: collection.sensitivity, compartments: collection.compartments || [], }); const [compartmentInput, setCompartmentInput] = useState(''); const tableLayoutValue = useMemo(() => { return stringifyTableLayout(collection.table_layout); }, [collection.table_layout]); const onSubmit = () => { let query: any; try { query = metadata.query ? JSON.parse(metadata.query) : undefined; } catch (err: any) { toast({ title: t('store.invalidQueryJson'), description: err.message, status: "error", duration: 5000, }); return; } const payload: Partial = { name: metadata.name, description: metadata.description, query: query, tags: metadata.tags, type: metadata.type, allowed_types: metadata.allowed_types, sensitivity: metadata.sensitivity, compartments: metadata.compartments, }; let error: string | undefined; if (!payload.name) { error = t('type.nameRequired'); } if (!payload.type) { (payload as any).type = null; } if (error) { toast({ title: t('store.validationFailed'), description: error, status: "error", duration: 5000, }); return; } if (tableLayoutRef.current) { const layout = tableLayoutRef.current.getValue(); if (layout) { try { payload.table_layout = JSON.parse(layout); } catch (err: any) { toast({ title: t('store.invalidTableLayout'), description: err.message, status: "error", duration: 5000, }); return; } } else { payload.table_layout = null; } } setUpdating(true); client.store.collections .update(collection.id, payload) .then(() => { refetch(); // Update search query on provider if it's a dynamic collection to reflect in UI immediately if (collection.dynamic && search) { search.reset(); void search.search(); } toast({ title: t('store.collectionUpdated'), description: t('store.collectionUpdatedSuccess'), status: "success", duration: 3000, }); }) .catch((err) => { toast({ title: t('store.failedToUpdateCollection'), description: err.message, status: "error", duration: 5000, }); }) .finally(() => { setUpdating(false); }); }; const setField = (name: string, value: any) => { setMetadata({ ...metadata, [name]: value, }); }; return (
{t('modal.save')} }>
{t('store.createdBy')}
at {dayjs(collection.created_at).format("YYYY-MM-DD HH:mm:ss")}
{t('store.updatedBy')}
at {dayjs(collection.updated_at).format("YYYY-MM-DD HH:mm:ss")}
setField("name", v)} />