@firecms/entity_history 3.1.0 → 3.2.0-canary.4c3b8f2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.umd.js","sources":["../src/HistoryControllerProvider.tsx","../src/components/UserChip.tsx","../src/components/EntityHistoryEntry.tsx","../src/components/EntityHistoryView.tsx","../src/entity_history_callbacks.ts","../src/components/LastEditedByIndicator.tsx","../src/components/LastEditedByPluginComponents.tsx","../src/useEntityHistoryPlugin.tsx"],"sourcesContent":["import React, { PropsWithChildren, useContext } from \"react\";\nimport equal from \"react-fast-compare\"\n\nimport { User } from \"@firecms/core\";\n\nexport type HistoryConfigController = {\n /**\n * Function to get a user by uid.\n * @param uid\n */\n getUser?: (uid: string) => User | null;\n}\n\nexport const HistoryControllerContext = React.createContext<HistoryConfigController>({} as any);\nexport const useHistoryController = (): HistoryConfigController => useContext(HistoryControllerContext);\n\n\nexport interface HistoryControllerProviderProps {\n\n getUser?: (uid: string) => User | null;\n\n}\n\nexport const HistoryControllerProvider = React.memo(\n function HistoryControllerProvider({\n children,\n getUser,\n }: PropsWithChildren<HistoryControllerProviderProps>) {\n\n return (\n <HistoryControllerContext.Provider\n value={{\n getUser,\n }}>\n\n {children}\n\n </HistoryControllerContext.Provider>\n );\n }, equal);\n","import { User } from \"@firecms/core\";\nimport { Chip, Tooltip } from \"@firecms/ui\";\n\nexport function UserChip({ user }: { user: User }) {\n return (\n <Tooltip title={user.email ?? user.uid}>\n <Chip size={\"small\"} className={\"flex items-center\"}>\n {user.photoURL && <img\n className={\"rounded-full w-6 h-6 mr-2\"}\n src={user.photoURL} alt={user.displayName ?? \"User picture\"}/>}\n <span>{user.displayName ?? user.email ?? user.uid}</span>\n </Chip>\n </Tooltip>\n );\n}\n","import * as React from \"react\";\n\nimport {\n Chip,\n cls,\n defaultBorderMixin,\n DescriptionIcon,\n IconButton, KeyboardBackspaceIcon,\n KeyboardTabIcon,\n Tooltip,\n Typography\n} from \"@firecms/ui\";\nimport {\n Entity,\n EntityCollection,\n EntityValues,\n getPropertyInPath,\n getValueInPath,\n PreviewSize,\n Property,\n PropertyPreview,\n resolveCollection,\n ResolvedProperty,\n SkeletonPropertyComponent,\n useAuthController,\n useCustomizationController,\n useNavigationController,\n useSideEntityController\n} from \"@firecms/core\";\nimport { useHistoryController } from \"../HistoryControllerProvider\";\nimport { UserChip } from \"./UserChip\";\n\nexport type EntityPreviewProps = {\n size: PreviewSize,\n actions?: React.ReactNode,\n collection?: EntityCollection,\n hover?: boolean;\n previewKeys?: string[],\n entity: Entity<any>,\n previousValues?: EntityValues<any>;\n onClick?: (e: React.SyntheticEvent) => void;\n};\n\nfunction PreviousValueView({\n previousValueInPath,\n childProperty,\n propertyKey\n }: {\n previousValueInPath: any,\n childProperty: Property,\n propertyKey: string\n}) {\n if (typeof previousValueInPath === \"string\" || typeof previousValueInPath === \"number\") {\n return <Typography variant={\"caption\"} color={\"secondary\"} className=\"line-through\">\n {previousValueInPath}\n </Typography>;\n } else if (typeof previousValueInPath === \"boolean\") {\n return <Typography variant={\"caption\"} color={\"secondary\"} className=\"line-through\">\n {previousValueInPath ? \"true\" : \"false\"}\n </Typography>;\n\n } else {\n return <Tooltip\n side={\"left\"}\n title={<div className={\"flex flex-col gap-2\"}>\n <Typography variant={\"caption\"} color={\"secondary\"}>\n Previous value\n </Typography>\n <PropertyPreview\n propertyKey={propertyKey as string}\n value={previousValueInPath}\n property={childProperty as ResolvedProperty}\n size={\"small\"}/>\n </div>}>\n <KeyboardBackspaceIcon size={\"smallest\"} color={\"disabled\"} className={\"mb-1\"}/>\n </Tooltip>\n }\n}\n\n/**\n * This view is used to display a preview of an entity.\n * It is used by default in reference fields and whenever a reference is displayed.\n */\nexport function EntityHistoryEntry({\n actions,\n hover,\n collection: collectionProp,\n previewKeys,\n onClick,\n size,\n entity,\n previousValues\n }: EntityPreviewProps) {\n\n const authController = useAuthController();\n const customizationController = useCustomizationController();\n\n const navigationController = useNavigationController();\n const sideEntityController = useSideEntityController();\n\n const collection = collectionProp ?? navigationController.getCollection(entity.path);\n const updatedOn = entity.values?.[\"__metadata\"]?.[\"updated_on\"];\n if (!collection) {\n throw Error(`Couldn't find the corresponding collection view for the path: ${entity.path}`);\n }\n\n const updatedBy = entity.values?.[\"__metadata\"]?.[\"updated_by\"];\n const { getUser } = useHistoryController();\n const user = getUser?.(updatedBy);\n\n const resolvedCollection = React.useMemo(() => resolveCollection({\n collection,\n path: entity.path,\n values: entity.values,\n propertyConfigs: customizationController.propertyConfigs,\n authController\n }), [collection]);\n\n return <div className={\"w-full flex flex-col gap-2 mt-4\"}>\n <div className={\"ml-4 flex items-center gap-4\"}>\n <Typography variant={\"body2\"} color={\"secondary\"}>{updatedOn.toLocaleString()}</Typography>\n {!user && updatedBy && <Chip size={\"small\"}>{updatedBy}</Chip>}\n {user && <UserChip user={user}/>}\n </div>\n <div\n className={cls(\n \"bg-white dark:bg-surface-900\",\n \"min-h-[44px]\",\n \"w-full\",\n \"items-center\",\n hover ? \"hover:bg-surface-accent-50 dark:hover:bg-surface-800 group-hover:bg-surface-accent-50 dark:group-hover:bg-surface-800\" : \"\",\n size === \"small\" ? \"p-1\" : \"px-2 py-1\",\n \"flex border rounded-lg\",\n onClick ? \"cursor-pointer\" : \"\",\n defaultBorderMixin\n )}>\n\n\n {actions}\n\n {entity &&\n <Tooltip title={\"See details for this revision\"}\n className={\"my-2 grow-0 shrink-0 self-start\"}>\n <IconButton\n color={\"inherit\"}\n className={\"\"}\n onClick={(e) => {\n\n sideEntityController.open({\n entityId: entity.id,\n path: entity.path,\n allowFullScreen: false,\n collection: {\n ...collection,\n subcollections: undefined,\n entityViews: undefined,\n permissions: {\n create: false,\n delete: false,\n edit: false,\n read: true\n }\n },\n updateUrl: true\n });\n }}>\n <KeyboardTabIcon/>\n </IconButton>\n </Tooltip>}\n\n <div className={\"flex flex-col grow w-full m-1 shrink min-w-0\"}>\n\n {previewKeys && previewKeys.map((key) => {\n const childProperty = getPropertyInPath(resolvedCollection.properties, key);\n\n const valueInPath = getValueInPath(entity.values, key);\n const previousValueInPath = previousValues ? getValueInPath(previousValues, key) : undefined;\n\n const element = childProperty ? (entity\n ? <PropertyPreview\n propertyKey={key as string}\n value={valueInPath}\n property={childProperty as ResolvedProperty}\n size={\"small\"}/>\n : <SkeletonPropertyComponent\n property={childProperty as ResolvedProperty}\n size={\"small\"}/>) :\n <Typography variant={\"body2\"}>\n {typeof valueInPath === \"string\" ? valueInPath : JSON.stringify(valueInPath)}\n </Typography>;\n return (\n <div key={\"ref_prev_\" + key}\n className=\"flex w-full my-1 items-center\">\n <Typography variant={\"caption\"}\n color={\"secondary\"}\n className=\"min-w-[140px] md:min-w-[200px] w-1/5 pr-8 overflow-hidden text-ellipsis text-right\">\n {key}\n </Typography>\n <div className=\"w-4/5\">\n {previousValueInPath !== undefined && previousValueInPath !== valueInPath &&\n <PreviousValueView previousValueInPath={previousValueInPath}\n childProperty={childProperty as ResolvedProperty}\n propertyKey={key}/>\n }\n {element}\n </div>\n </div>\n );\n })}\n\n </div>\n\n </div>\n </div>\n}\n\n","import { useEffect, useRef, useState } from \"react\";\nimport {\n ConfirmationDialog,\n Entity,\n EntityCustomViewParams,\n EntityView,\n ErrorBoundary,\n useAuthController,\n useDataSource,\n useSnackbarController\n} from \"@firecms/core\";\nimport { cls, HistoryIcon, IconButton, Label, Tooltip, Typography } from \"@firecms/ui\";\nimport { EntityHistoryEntry } from \"./EntityHistoryEntry\";\n\nexport function EntityHistoryView({\n entity,\n collection,\n formContext\n }: EntityCustomViewParams) {\n\n const authController = useAuthController();\n const snackbarController = useSnackbarController();\n const dirty = formContext?.formex.dirty;\n\n const dataSource = useDataSource();\n const pathAndId = entity ? entity?.path + \"/\" + entity?.id : undefined;\n\n const [revertVersionDialog, setRevertVersionDialog] = useState<Entity | undefined>(undefined);\n const [revisions, setRevisions] = useState<Entity[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [hasMore, setHasMore] = useState(true);\n\n const PAGE_SIZE = 5;\n const [limit, setLimit] = useState(PAGE_SIZE);\n\n const containerRef = useRef<HTMLDivElement>(null);\n const observerRef = useRef<IntersectionObserver | null>(null);\n const loadMoreRef = useRef<HTMLDivElement>(null);\n\n // Load revisions with the current limit\n useEffect(() => {\n if (!pathAndId) return;\n\n setIsLoading(true); // Set loading true when fetching starts\n const listener = dataSource.listenCollection?.({\n path: pathAndId + \"/__history\",\n collection: collection,\n order: \"desc\",\n orderBy: \"__metadata.updated_on\",\n limit: limit,\n startAfter: undefined,\n onUpdate: (entities) => {\n setRevisions(entities);\n setHasMore(entities.length === limit && entities.length >= PAGE_SIZE); // Ensure we fetched a full page to consider hasMore\n setIsLoading(false);\n },\n onError: (error) => {\n console.error(\"Error fetching history:\", error);\n setIsLoading(false);\n setHasMore(false); // Stop trying if there's an error\n }\n });\n return () => {\n if (typeof listener === \"function\") {\n listener();\n }\n };\n }, [pathAndId, limit, dataSource]);\n\n // Setup intersection observer for infinite scroll\n useEffect(() => {\n const currentContainer = containerRef.current;\n const currentLoadMore = loadMoreRef.current;\n\n // Conditions for active observation\n if (!currentContainer || !currentLoadMore || !hasMore || isLoading) {\n // If we shouldn't be observing, ensure any existing observer is disconnected\n if (observerRef.current) {\n observerRef.current.disconnect();\n observerRef.current = null;\n }\n return;\n }\n\n // Options for the IntersectionObserver\n const options = {\n root: currentContainer,\n rootMargin: \"0px 0px 200px 0px\", // Trigger 200px before the sentinel is at the bottom edge\n threshold: 0.01 // Trigger if even a small part is visible within the rootMargin\n };\n\n // The callback for when the sentinel's intersection state changes\n const handleObserver = (entries: IntersectionObserverEntry[]) => {\n const target = entries[0];\n if (target.isIntersecting && hasMore && !isLoading) {\n // No need to setIsLoading(true) here, it's done in the data fetching useEffect\n setLimit(prev => prev + PAGE_SIZE);\n }\n };\n\n const observer = new IntersectionObserver(handleObserver, options);\n observer.observe(currentLoadMore);\n observerRef.current = observer; // Store the new observer\n\n // Cleanup function for this effect instance\n return () => {\n observer.disconnect(); // Disconnect the observer created in *this* effect run\n if (observerRef.current === observer) {\n observerRef.current = null;\n }\n };\n // Re-run if hasMore, isLoading changes, or if revisions.length changes (which might make loadMoreRef available/unavailable)\n }, [hasMore, isLoading, revisions.length]);\n\n if (!entity) {\n return <div className=\"flex items-center justify-center h-full\">\n <Label>History is only available for existing entities</Label>\n </div>\n }\n\n function doRevert(revertVersion: Entity) {\n if (!entity) {\n throw new Error(\"No entity to revert\");\n }\n const revertValues = {\n ...revertVersion.values,\n __metadata: {\n ...revertVersion.values?.[\"__metadata\"],\n reverted: true,\n updated_on: new Date(),\n updated_by: authController.user?.uid ?? null,\n }\n };\n const saveReverted = dataSource.saveEntity({\n path: entity.path,\n entityId: entity.id,\n values: revertValues,\n collection,\n status: \"existing\"\n });\n const saveRevertedHistory = dataSource.saveEntity({\n path: revertVersion.path,\n entityId: revertVersion.id,\n values: revertValues,\n collection,\n status: \"existing\"\n });\n return Promise.all([saveReverted, saveRevertedHistory])\n .then(() => {\n formContext.formex.resetForm({\n values: revertVersion.values\n });\n setRevertVersionDialog(undefined);\n snackbarController.open({\n message: \"Reverted version\",\n type: \"info\"\n });\n }\n ).catch((error) => {\n console.error(\"Error reverting entity:\", error);\n snackbarController.open({\n message: \"Error reverting entity\",\n type: \"error\"\n });\n });\n\n }\n\n return <div\n ref={containerRef}\n className={cls(\"relative flex-1 h-full overflow-auto w-full flex flex-col gap-4 p-8\")}>\n <div className=\"flex flex-col gap-2 max-w-6xl mx-auto w-full\">\n\n <Typography variant={\"h5\"} className={\"mt-24 ml-4\"}>\n History\n </Typography>\n\n {revisions.length === 0 && <>\n <Label className={\"ml-4 mt-8\"}>\n No history available\n </Label>\n <Typography variant={\"caption\"} className={\"ml-4\"}>\n When you save an entity, a new version is created and stored in the history.\n </Typography>\n </>}\n\n {revisions.map((revision, index) => {\n const previewKeys = revision.values?.[\"__metadata\"]?.[\"changed_fields\"];\n const previousValues: object | undefined = revision.values?.[\"__metadata\"]?.[\"previous_values\"];\n return <div key={index} className=\"flex flex-cols gap-2 w-full\">\n <EntityHistoryEntry size={\"large\"}\n entity={revision}\n collection={collection}\n previewKeys={previewKeys}\n previousValues={previousValues}\n actions={\n <Tooltip title={\"Revert to this version\"}\n className={\"m-2 grow-0 self-start\"}>\n <IconButton\n onClick={() => {\n if (dirty) {\n snackbarController.open({\n message: \"Please save or discard your changes before reverting\",\n type: \"warning\"\n });\n } else {\n setRevertVersionDialog(revision);\n }\n }}>\n <HistoryIcon/>\n </IconButton>\n </Tooltip>}\n />\n </div>\n })}\n\n {/* Load more sentinel element */}\n {revisions.length > 0 && (\n <div\n ref={loadMoreRef}\n className=\"py-4 text-center\"\n >\n {isLoading && <Label>Loading more...</Label>}\n {!hasMore && revisions.length > PAGE_SIZE && <Label>No more history available</Label>}\n </div>\n )}\n </div>\n\n <ErrorBoundary>\n <ConfirmationDialog open={Boolean(revertVersionDialog)}\n onAccept={function (): void {\n if (!revertVersionDialog) return;\n doRevert(revertVersionDialog);\n }}\n onCancel={function (): void {\n setRevertVersionDialog(undefined);\n }}\n title={<Typography variant={\"subtitle2\"}>Revert data to this version?</Typography>}\n body={revertVersionDialog ?\n <EntityView entity={revertVersionDialog}\n collection={collection}\n path={entity?.path}/> : null}/>\n </ErrorBoundary>\n </div>\n}\n","import { EntityCallbacks, FireCMSContext, User } from \"@firecms/core\";\nimport equal from \"react-fast-compare\"\nimport { HistoryEntry, NewHistoryEntryParams } from \"./types\";\n\n\n\nexport function createHistoryEntry<T = any>({\n context,\n previousValues,\n values,\n path,\n entityId,\n collection\n}: NewHistoryEntryParams<T>) {\n\n const uid = context.authController.user?.uid;\n const dataSource = context.dataSource;\n const changedFields = previousValues ? findChangedFields(previousValues as object, values as object) : null;\n\n const entry: HistoryEntry<T> = {\n ...values,\n __metadata: {\n previous_values: previousValues,\n changed_fields: changedFields,\n updated_on: new Date(),\n updated_by: uid ?? null,\n }\n };\n dataSource.saveEntity({\n path: path + \"/\" + entityId + \"/__history\",\n values: entry,\n status: \"new\",\n collection\n }).then(() => {\n console.debug(\"History saved for\", path, entityId);\n });\n}\n\nexport const entityHistoryCallbacks: EntityCallbacks = {\n onSaveSuccess: async (props) => {\n\n const values = props.values;\n const previousValues = props.previousValues;\n const path = props.path;\n const entityId = props.entityId;\n const context = props.context;\n const collection = props.collection;\n createHistoryEntry({\n context: context,\n previousValues: previousValues,\n values: values,\n path: path,\n entityId: entityId,\n collection: collection\n });\n }\n}\n\nfunction findChangedFields<M extends object>(oldValues: M, newValues: M, prefix: string = \"\"): string[] {\n const changedFields: string[] = [];\n\n // Handle null/undefined cases\n if (equal(oldValues, newValues)) return changedFields;\n if (!oldValues || !newValues) return [prefix || \".\"];\n\n // Get all unique keys from both objects\n const allKeys = new Set([\n ...Object.keys(oldValues),\n ...Object.keys(newValues)\n ]);\n\n for (const key of allKeys) {\n const oldValue = oldValues[key as keyof M];\n const newValue = newValues[key as keyof M];\n const currentPath = prefix ? `${prefix}.${key}` : key;\n\n // If key exists only in one object\n if ((key in oldValues) !== (key in newValues)) {\n changedFields.push(currentPath);\n continue;\n }\n\n // If values are identical (deep equality)\n if (equal(oldValue, newValue)) continue;\n\n // Handle arrays\n if (Array.isArray(oldValue) && Array.isArray(newValue)) {\n if (oldValue.length !== newValue.length) {\n changedFields.push(currentPath);\n } else {\n // Check if any array element changed\n for (let i = 0; i < oldValue.length; i++) {\n if (\n typeof oldValue[i] === \"object\" && oldValue[i] !== null &&\n typeof newValue[i] === \"object\" && newValue[i] !== null\n ) {\n const nestedChanges = findChangedFields(\n oldValue[i] as object,\n newValue[i] as object,\n `${currentPath}[${i}]`\n );\n if (nestedChanges.length > 0) {\n changedFields.push(currentPath);\n break;\n }\n } else if (!equal(oldValue[i], newValue[i])) {\n changedFields.push(currentPath);\n break;\n }\n }\n }\n }\n // Handle nested objects\n else if (\n typeof oldValue === \"object\" && oldValue !== null &&\n typeof newValue === \"object\" && newValue !== null\n ) {\n const nestedChanges = findChangedFields(\n oldValue as object,\n newValue as object,\n currentPath\n );\n changedFields.push(...nestedChanges);\n }\n // Handle primitives\n else {\n changedFields.push(currentPath);\n }\n }\n\n return changedFields;\n}\n","import React, { useEffect, useState } from \"react\";\nimport { Entity, useDataSource, User } from \"@firecms/core\";\nimport { useHistoryController } from \"../HistoryControllerProvider\";\n\nfunction getRelativeTimeString(date: Date): string {\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffSeconds = Math.floor(diffMs / 1000);\n const diffMinutes = Math.floor(diffSeconds / 60);\n const diffHours = Math.floor(diffMinutes / 60);\n const diffDays = Math.floor(diffHours / 24);\n\n if (diffSeconds < 60) return \"just now\";\n if (diffMinutes < 60) return `${diffMinutes}m ago`;\n if (diffHours < 24) return `${diffHours}h ago`;\n if (diffDays < 30) return `${diffDays}d ago`;\n return date.toLocaleDateString();\n}\n\n/**\n * Fetches the latest history entry from the __history subcollection\n * and displays who last edited the entity and when.\n */\nexport function LastEditedByIndicator({\n path,\n entityId,\n collection\n}: {\n path: string;\n entityId: string;\n collection: any;\n}) {\n const { getUser } = useHistoryController();\n const dataSource = useDataSource();\n const [latestEntry, setLatestEntry] = useState<Entity | undefined>();\n\n useEffect(() => {\n if (!path || !entityId) return;\n\n const historyPath = `${path}/${entityId}/__history`;\n const unsubscribe = dataSource.listenCollection?.({\n path: historyPath,\n collection,\n orderBy: \"__metadata.updated_on\",\n order: \"desc\",\n limit: 1,\n onUpdate: (entities) => {\n setLatestEntry(entities[0]);\n },\n onError: (error) => {\n console.error(\"Error fetching latest history entry:\", error);\n }\n });\n\n return () => {\n if (typeof unsubscribe === \"function\") {\n unsubscribe();\n }\n };\n }, [path, entityId, dataSource]);\n\n const metadata = latestEntry?.values?.__metadata;\n const uid = metadata?.updated_by;\n const editedOn = metadata?.updated_on;\n\n if (!uid && !editedOn) return null;\n\n const user: User | null | undefined = uid ? getUser?.(uid) : undefined;\n const date = editedOn instanceof Date ? editedOn : (editedOn?.toDate ? editedOn.toDate() : null);\n const timeString = date ? getRelativeTimeString(date) : null;\n\n const displayName = user?.displayName ?? user?.email ?? uid;\n const photoURL = user?.photoURL;\n\n return (\n <div className=\"flex items-center gap-2 text-xs text-text-secondary dark:text-text-secondary-dark\">\n {photoURL ? (\n <img\n src={photoURL}\n alt={displayName ?? \"User\"}\n className=\"rounded-full object-cover w-6 h-6\"\n />\n ) : (\n <div className=\"rounded-full bg-primary/10 dark:bg-primary-dark/20 flex items-center justify-center text-primary dark:text-primary-dark font-medium w-6 h-6 text-xs\">\n {(displayName ?? \"?\").charAt(0).toUpperCase()}\n </div>\n )}\n <span>\n {displayName}{timeString ? ` · ${timeString}` : \"\"}\n </span>\n </div>\n );\n}\n","import React from \"react\";\nimport { PluginFormActionProps } from \"@firecms/core\";\nimport { LastEditedByIndicator } from \"./LastEditedByIndicator\";\n\n/**\n * Renders the \"last edited by\" indicator in the entity form top bar.\n * Used as a plugin `form.ActionsTop` component.\n */\nexport function LastEditedByFormAction({\n entityId,\n path,\n status,\n collection,\n}: PluginFormActionProps) {\n if (status === \"new\" || status === \"copy\" || !entityId) return null;\n if (!collection.history) return null;\n\n return <LastEditedByIndicator\n path={path}\n entityId={entityId}\n collection={collection}\n />;\n}\n","import { useCallback, useMemo } from \"react\";\nimport { EntityCollection, FireCMSPlugin, mergeCallbacks, User } from \"@firecms/core\";\nimport { EntityHistoryView } from \"./components/EntityHistoryView\";\nimport { HistoryIcon } from \"@firecms/ui\";\nimport { entityHistoryCallbacks } from \"./entity_history_callbacks\";\nimport { HistoryControllerProvider } from \"./HistoryControllerProvider\";\nimport { LastEditedByFormAction } from \"./components/LastEditedByPluginComponents\";\n\n/**\n * This plugin adds a history view to the entity side panel.\n */\nexport function useEntityHistoryPlugin(props?: EntityHistoryPluginProps): FireCMSPlugin<any, any, any, EntityHistoryPluginProps> {\n\n const { defaultEnabled = false } = props ?? {};\n\n const modifyCollection = useCallback((collection: EntityCollection) => {\n if (collection.history === true || (defaultEnabled && collection.history !== false)) {\n return {\n ...collection,\n history: true,\n entityViews: [\n ...(collection.entityViews ?? []),\n {\n key: \"__history\",\n name: \"History\",\n tabComponent: <HistoryIcon size={\"small\"} />,\n Builder: EntityHistoryView,\n position: \"start\"\n }\n ],\n callbacks: mergeCallbacks(collection.callbacks, entityHistoryCallbacks)\n } satisfies EntityCollection;\n }\n return collection;\n }, []);\n\n return useMemo(() => ({\n key: \"entity_history\",\n provider: {\n Component: HistoryControllerProvider,\n props: {\n getUser: props?.getUser\n }\n },\n form: {\n BeforeTitle: LastEditedByFormAction\n },\n collection: {\n modifyCollection\n }\n } satisfies FireCMSPlugin), [props]);\n}\n\nexport type EntityHistoryPluginProps = {\n /**\n * If true, the history view will be enabled to all collections by default.\n * Each collection can override this value by setting the `history` property.\n */\n defaultEnabled?: boolean;\n\n /**\n * Function to get the user object from the uid.\n * @param uid\n */\n getUser?: (uid: string) => User | null;\n}\n"],"names":["HistoryControllerContext","React","createContext","useHistoryController","useContext","HistoryControllerProvider","memo","t0","$","_c","children","getUser","t1","t2","equal","UserChip","user","email","uid","displayName","photoURL","jsx","t3","t4","t5","Chip","t6","Tooltip","PreviousValueView","previousValueInPath","childProperty","propertyKey","Typography","Symbol","for","jsxs","PropertyPreview","KeyboardBackspaceIcon","EntityHistoryEntry","actions","hover","collection","collectionProp","previewKeys","onClick","size","entity","previousValues","authController","useAuthController","customizationController","useCustomizationController","navigationController","useNavigationController","sideEntityController","useSideEntityController","getCollection","path","updatedOn","values","Error","updatedBy","resolvedCollection","useMemo","resolveCollection","propertyConfigs","toLocaleString","cls","defaultBorderMixin","IconButton","e","open","entityId","id","allowFullScreen","subcollections","undefined","entityViews","permissions","create","delete","edit","read","updateUrl","KeyboardTabIcon","map","key","getPropertyInPath","properties","valueInPath","getValueInPath","element","SkeletonPropertyComponent","JSON","stringify","EntityHistoryView","formContext","snackbarController","useSnackbarController","dirty","formex","dataSource","useDataSource","pathAndId","revertVersionDialog","setRevertVersionDialog","useState","revisions","setRevisions","isLoading","setIsLoading","hasMore","setHasMore","limit","setLimit","containerRef","useRef","observerRef","loadMoreRef","listener","listenCollection","order","orderBy","startAfter","onUpdate","entities","length","onError","error","console","useEffect","currentContainer","current","currentLoadMore","disconnect","options","root","rootMargin","threshold","handleObserver","entries","target","isIntersecting","_temp","observer","IntersectionObserver","observe","Label","doRevert","revertVersion","revertValues","__metadata","reverted","updated_on","Date","updated_by","saveReverted","saveEntity","status","saveRevertedHistory","Promise","all","then","resetForm","message","type","catch","error_0","t7","t8","t9","Fragment","t10","t11","revision","index","changed_fields","previous_values","HistoryIcon","t12","t13","Boolean","t14","t15","t16","t17","EntityView","t18","ErrorBoundary","ConfirmationDialog","t19","prev","createHistoryEntry","context","changedFields","findChangedFields","entry","debug","entityHistoryCallbacks","onSaveSuccess","props","oldValues","newValues","prefix","allKeys","Set","Object","keys","oldValue","newValue","currentPath","push","Array","isArray","i","nestedChanges","getRelativeTimeString","date","now","diffMs","getTime","diffSeconds","Math","floor","diffMinutes","diffHours","diffDays","toLocaleDateString","LastEditedByIndicator","latestEntry","setLatestEntry","historyPath","unsubscribe","metadata","editedOn","toDate","timeString","charAt","toUpperCase","LastEditedByFormAction","history","useEntityHistoryPlugin","defaultEnabled","modifyCollection","useCallback","name","tabComponent","Builder","position","callbacks","mergeCallbacks","provider","Component","form","BeforeTitle"],"mappings":"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"}
1
+ {"version":3,"file":"index.umd.js","sources":["../src/HistoryControllerProvider.tsx","../src/components/UserChip.tsx","../src/components/EntityHistoryEntry.tsx","../src/components/EntityHistoryView.tsx","../src/entity_history_callbacks.ts","../src/components/LastEditedByIndicator.tsx","../src/components/LastEditedByPluginComponents.tsx","../src/locales/en.ts","../src/locales/es.ts","../src/locales/de.ts","../src/locales/fr.ts","../src/locales/it.ts","../src/locales/hi.ts","../src/locales/pt.ts","../src/useEntityHistoryPlugin.tsx"],"sourcesContent":["import React, { PropsWithChildren, useContext } from \"react\";\nimport equal from \"react-fast-compare\"\n\nimport { User } from \"@firecms/core\";\n\nexport type HistoryConfigController = {\n /**\n * Function to get a user by uid.\n * @param uid\n */\n getUser?: (uid: string) => User | null;\n}\n\nexport const HistoryControllerContext = React.createContext<HistoryConfigController>({} as any);\nexport const useHistoryController = (): HistoryConfigController => useContext(HistoryControllerContext);\n\n\nexport interface HistoryControllerProviderProps {\n\n getUser?: (uid: string) => User | null;\n\n}\n\nexport const HistoryControllerProvider = React.memo(\n function HistoryControllerProvider({\n children,\n getUser,\n }: PropsWithChildren<HistoryControllerProviderProps>) {\n\n return (\n <HistoryControllerContext.Provider\n value={{\n getUser,\n }}>\n\n {children}\n\n </HistoryControllerContext.Provider>\n );\n }, equal);\n","import { User, useTranslation } from \"@firecms/core\";\nimport { Chip, Tooltip } from \"@firecms/ui\";\n\nexport function UserChip({ user }: { user: User }) {\n const { t } = useTranslation();\n return (\n <Tooltip title={user.email ?? user.uid}>\n <Chip size={\"small\"} className={\"flex items-center\"}>\n {user.photoURL && <img\n className={\"rounded-full w-6 h-6 mr-2\"}\n src={user.photoURL} alt={user.displayName ?? t(\"user_picture\")}/>}\n <span>{user.displayName ?? user.email ?? user.uid}</span>\n </Chip>\n </Tooltip>\n );\n}\n","import * as React from \"react\";\n\nimport {\n Chip,\n cls,\n defaultBorderMixin,\n DescriptionIcon,\n IconButton, KeyboardBackspaceIcon,\n KeyboardTabIcon,\n Tooltip,\n Typography\n} from \"@firecms/ui\";\nimport {\n Entity,\n EntityCollection,\n EntityValues,\n getPropertyInPath,\n getValueInPath,\n PreviewSize,\n Property,\n PropertyPreview,\n resolveCollection,\n ResolvedProperty,\n SkeletonPropertyComponent,\n useAuthController,\n useCustomizationController,\n useNavigationController,\n useSideEntityController,\n useTranslation\n} from \"@firecms/core\";\nimport { useHistoryController } from \"../HistoryControllerProvider\";\nimport { UserChip } from \"./UserChip\";\n\nexport type EntityPreviewProps = {\n size: PreviewSize,\n actions?: React.ReactNode,\n collection?: EntityCollection,\n hover?: boolean;\n previewKeys?: string[],\n entity: Entity<any>,\n previousValues?: EntityValues<any>;\n onClick?: (e: React.SyntheticEvent) => void;\n};\n\nfunction PreviousValueView({\n previousValueInPath,\n childProperty,\n propertyKey\n }: {\n previousValueInPath: any,\n childProperty: Property,\n propertyKey: string\n}) {\n const { t } = useTranslation();\n if (typeof previousValueInPath === \"string\" || typeof previousValueInPath === \"number\") {\n return <Typography variant={\"caption\"} color={\"secondary\"} className=\"line-through\">\n {previousValueInPath}\n </Typography>;\n } else if (typeof previousValueInPath === \"boolean\") {\n return <Typography variant={\"caption\"} color={\"secondary\"} className=\"line-through\">\n {previousValueInPath ? \"true\" : \"false\"}\n </Typography>;\n\n } else {\n return <Tooltip\n side={\"left\"}\n title={<div className={\"flex flex-col gap-2\"}>\n <Typography variant={\"caption\"} color={\"secondary\"}>\n {t(\"entity_history_previous_value\")}\n </Typography>\n <PropertyPreview\n propertyKey={propertyKey as string}\n value={previousValueInPath}\n property={childProperty as ResolvedProperty}\n size={\"small\"}/>\n </div>}>\n <KeyboardBackspaceIcon size={\"smallest\"} color={\"disabled\"} className={\"mb-1\"}/>\n </Tooltip>\n }\n}\n\n/**\n * This view is used to display a preview of an entity.\n * It is used by default in reference fields and whenever a reference is displayed.\n */\nexport function EntityHistoryEntry({\n actions,\n hover,\n collection: collectionProp,\n previewKeys,\n onClick,\n size,\n entity,\n previousValues\n }: EntityPreviewProps) {\n\n const authController = useAuthController();\n const customizationController = useCustomizationController();\n\n const navigationController = useNavigationController();\n const sideEntityController = useSideEntityController();\n const { t } = useTranslation();\n\n const collection = collectionProp ?? navigationController.getCollection(entity.path);\n const updatedOn = entity.values?.[\"__metadata\"]?.[\"updated_on\"];\n if (!collection) {\n throw Error(`Couldn't find the corresponding collection view for the path: ${entity.path}`);\n }\n\n const updatedBy = entity.values?.[\"__metadata\"]?.[\"updated_by\"];\n const { getUser } = useHistoryController();\n const user = getUser?.(updatedBy);\n\n const resolvedCollection = React.useMemo(() => resolveCollection({\n collection,\n path: entity.path,\n values: entity.values,\n propertyConfigs: customizationController.propertyConfigs,\n authController\n }), [collection]);\n\n return <div className={\"w-full flex flex-col gap-2 mt-4\"}>\n <div className={\"ml-4 flex items-center gap-4\"}>\n <Typography variant={\"body2\"} color={\"secondary\"}>{updatedOn.toLocaleString()}</Typography>\n {!user && updatedBy && <Chip size={\"small\"}>{updatedBy}</Chip>}\n {user && <UserChip user={user}/>}\n </div>\n <div\n className={cls(\n \"bg-white dark:bg-surface-900\",\n \"min-h-[44px]\",\n \"w-full\",\n \"items-center\",\n hover ? \"hover:bg-surface-accent-50 dark:hover:bg-surface-800 group-hover:bg-surface-accent-50 dark:group-hover:bg-surface-800\" : \"\",\n size === \"small\" ? \"p-1\" : \"px-2 py-1\",\n \"flex border rounded-lg\",\n onClick ? \"cursor-pointer\" : \"\",\n defaultBorderMixin\n )}>\n\n\n {actions}\n\n {entity &&\n <Tooltip title={t(\"entity_history_see_details\")}\n className={\"my-2 grow-0 shrink-0 self-start\"}>\n <IconButton\n color={\"inherit\"}\n className={\"\"}\n onClick={(e) => {\n\n sideEntityController.open({\n entityId: entity.id,\n path: entity.path,\n allowFullScreen: false,\n collection: {\n ...collection,\n subcollections: undefined,\n entityViews: undefined,\n permissions: {\n create: false,\n delete: false,\n edit: false,\n read: true\n }\n },\n updateUrl: true\n });\n }}>\n <KeyboardTabIcon/>\n </IconButton>\n </Tooltip>}\n\n <div className={\"flex flex-col grow w-full m-1 shrink min-w-0\"}>\n\n {previewKeys && previewKeys.map((key) => {\n const childProperty = getPropertyInPath(resolvedCollection.properties, key);\n\n const valueInPath = getValueInPath(entity.values, key);\n const previousValueInPath = previousValues ? getValueInPath(previousValues, key) : undefined;\n\n const element = childProperty ? (entity\n ? <PropertyPreview\n propertyKey={key as string}\n value={valueInPath}\n property={childProperty as ResolvedProperty}\n size={\"small\"}/>\n : <SkeletonPropertyComponent\n property={childProperty as ResolvedProperty}\n size={\"small\"}/>) :\n <Typography variant={\"body2\"}>\n {typeof valueInPath === \"string\" ? valueInPath : JSON.stringify(valueInPath)}\n </Typography>;\n return (\n <div key={\"ref_prev_\" + key}\n className=\"flex w-full my-1 items-center\">\n <Typography variant={\"caption\"}\n color={\"secondary\"}\n className=\"min-w-[140px] md:min-w-[200px] w-1/5 pr-8 overflow-hidden text-ellipsis text-right\">\n {key}\n </Typography>\n <div className=\"w-4/5\">\n {previousValueInPath !== undefined && previousValueInPath !== valueInPath &&\n <PreviousValueView previousValueInPath={previousValueInPath}\n childProperty={childProperty as ResolvedProperty}\n propertyKey={key}/>\n }\n {element}\n </div>\n </div>\n );\n })}\n\n </div>\n\n </div>\n </div>\n}\n\n","import { useEffect, useRef, useState } from \"react\";\nimport {\n ConfirmationDialog,\n Entity,\n EntityCustomViewParams,\n EntityView,\n ErrorBoundary,\n useAuthController,\n useDataSource,\n useSnackbarController,\n useTranslation\n} from \"@firecms/core\";\nimport { cls, HistoryIcon, IconButton, Label, Tooltip, Typography } from \"@firecms/ui\";\nimport { EntityHistoryEntry } from \"./EntityHistoryEntry\";\n\nexport function EntityHistoryView({\n entity,\n collection,\n formContext\n }: EntityCustomViewParams) {\n\n const authController = useAuthController();\n const snackbarController = useSnackbarController();\n const { t } = useTranslation();\n const dirty = formContext?.formex.dirty;\n\n const dataSource = useDataSource();\n const pathAndId = entity ? entity?.path + \"/\" + entity?.id : undefined;\n\n const [revertVersionDialog, setRevertVersionDialog] = useState<Entity | undefined>(undefined);\n const [revisions, setRevisions] = useState<Entity[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [hasMore, setHasMore] = useState(true);\n\n const PAGE_SIZE = 5;\n const [limit, setLimit] = useState(PAGE_SIZE);\n\n const containerRef = useRef<HTMLDivElement>(null);\n const observerRef = useRef<IntersectionObserver | null>(null);\n const loadMoreRef = useRef<HTMLDivElement>(null);\n\n // Load revisions with the current limit\n useEffect(() => {\n if (!pathAndId) return;\n\n setIsLoading(true); // Set loading true when fetching starts\n const listener = dataSource.listenCollection?.({\n path: pathAndId + \"/__history\",\n collection: collection,\n order: \"desc\",\n orderBy: \"__metadata.updated_on\",\n limit: limit,\n startAfter: undefined,\n onUpdate: (entities) => {\n setRevisions(entities);\n setHasMore(entities.length === limit && entities.length >= PAGE_SIZE); // Ensure we fetched a full page to consider hasMore\n setIsLoading(false);\n },\n onError: (error) => {\n console.error(\"Error fetching history:\", error);\n setIsLoading(false);\n setHasMore(false); // Stop trying if there's an error\n }\n });\n return () => {\n if (typeof listener === \"function\") {\n listener();\n }\n };\n }, [pathAndId, limit, dataSource]);\n\n // Setup intersection observer for infinite scroll\n useEffect(() => {\n const currentContainer = containerRef.current;\n const currentLoadMore = loadMoreRef.current;\n\n // Conditions for active observation\n if (!currentContainer || !currentLoadMore || !hasMore || isLoading) {\n // If we shouldn't be observing, ensure any existing observer is disconnected\n if (observerRef.current) {\n observerRef.current.disconnect();\n observerRef.current = null;\n }\n return;\n }\n\n // Options for the IntersectionObserver\n const options = {\n root: currentContainer,\n rootMargin: \"0px 0px 200px 0px\", // Trigger 200px before the sentinel is at the bottom edge\n threshold: 0.01 // Trigger if even a small part is visible within the rootMargin\n };\n\n // The callback for when the sentinel's intersection state changes\n const handleObserver = (entries: IntersectionObserverEntry[]) => {\n const target = entries[0];\n if (target.isIntersecting && hasMore && !isLoading) {\n // No need to setIsLoading(true) here, it's done in the data fetching useEffect\n setLimit(prev => prev + PAGE_SIZE);\n }\n };\n\n const observer = new IntersectionObserver(handleObserver, options);\n observer.observe(currentLoadMore);\n observerRef.current = observer; // Store the new observer\n\n // Cleanup function for this effect instance\n return () => {\n observer.disconnect(); // Disconnect the observer created in *this* effect run\n if (observerRef.current === observer) {\n observerRef.current = null;\n }\n };\n // Re-run if hasMore, isLoading changes, or if revisions.length changes (which might make loadMoreRef available/unavailable)\n }, [hasMore, isLoading, revisions.length]);\n\n if (!entity) {\n return <div className=\"flex items-center justify-center h-full\">\n <Label>{t(\"entity_history_only_existing\")}</Label>\n </div>\n }\n\n function doRevert(revertVersion: Entity) {\n if (!entity) {\n throw new Error(\"No entity to revert\");\n }\n const revertValues = {\n ...revertVersion.values,\n __metadata: {\n ...revertVersion.values?.[\"__metadata\"],\n reverted: true,\n updated_on: new Date(),\n updated_by: authController.user?.uid ?? null,\n }\n };\n const saveReverted = dataSource.saveEntity({\n path: entity.path,\n entityId: entity.id,\n values: revertValues,\n collection,\n status: \"existing\"\n });\n const saveRevertedHistory = dataSource.saveEntity({\n path: revertVersion.path,\n entityId: revertVersion.id,\n values: revertValues,\n collection,\n status: \"existing\"\n });\n return Promise.all([saveReverted, saveRevertedHistory])\n .then(() => {\n formContext.formex.resetForm({\n values: revertVersion.values\n });\n setRevertVersionDialog(undefined);\n snackbarController.open({\n message: t(\"entity_history_reverted\"),\n type: \"info\"\n });\n }\n ).catch((error) => {\n console.error(\"Error reverting entity:\", error);\n snackbarController.open({\n message: t(\"entity_history_error_reverting\"),\n type: \"error\"\n });\n });\n\n }\n\n return <div\n ref={containerRef}\n className={cls(\"relative flex-1 h-full overflow-auto w-full flex flex-col gap-4 p-8\")}>\n <div className=\"flex flex-col gap-2 max-w-6xl mx-auto w-full\">\n\n <Typography variant={\"h5\"} className={\"mt-24 ml-4\"}>\n {t(\"history\")}\n </Typography>\n\n {revisions.length === 0 && <>\n <Label className={\"ml-4 mt-8\"}>\n {t(\"entity_history_no_history\")}\n </Label>\n <Typography variant={\"caption\"} className={\"ml-4\"}>\n {t(\"entity_history_when_save\")}\n </Typography>\n </>}\n\n {revisions.map((revision, index) => {\n const previewKeys = revision.values?.[\"__metadata\"]?.[\"changed_fields\"];\n const previousValues: object | undefined = revision.values?.[\"__metadata\"]?.[\"previous_values\"];\n return <div key={index} className=\"flex flex-cols gap-2 w-full\">\n <EntityHistoryEntry size={\"large\"}\n entity={revision}\n collection={collection}\n previewKeys={previewKeys}\n previousValues={previousValues}\n actions={\n <Tooltip title={t(\"entity_history_revert_tooltip\")}\n className={\"m-2 grow-0 self-start\"}>\n <IconButton\n onClick={() => {\n if (dirty) {\n snackbarController.open({\n message: t(\"entity_history_please_save\"),\n type: \"warning\"\n });\n } else {\n setRevertVersionDialog(revision);\n }\n }}>\n <HistoryIcon/>\n </IconButton>\n </Tooltip>}\n />\n </div>\n })}\n\n {/* Load more sentinel element */}\n {revisions.length > 0 && (\n <div\n ref={loadMoreRef}\n className=\"py-4 text-center\"\n >\n {isLoading && <Label>{t(\"loading_more\")}</Label>}\n {!hasMore && revisions.length > PAGE_SIZE && <Label>{t(\"entity_history_no_more\")}</Label>}\n </div>\n )}\n </div>\n\n <ErrorBoundary>\n <ConfirmationDialog open={Boolean(revertVersionDialog)}\n onAccept={function (): void {\n if (!revertVersionDialog) return;\n doRevert(revertVersionDialog);\n }}\n onCancel={function (): void {\n setRevertVersionDialog(undefined);\n }}\n title={<Typography variant={\"subtitle2\"}>{t(\"entity_history_revert_dialog_title\")}</Typography>}\n body={revertVersionDialog ?\n <EntityView entity={revertVersionDialog}\n collection={collection}\n path={entity?.path}/> : null}/>\n </ErrorBoundary>\n </div>\n}\n","import { EntityCallbacks, FireCMSContext, User } from \"@firecms/core\";\nimport equal from \"react-fast-compare\"\nimport { HistoryEntry, NewHistoryEntryParams } from \"./types\";\n\n\n\nexport function createHistoryEntry<T = any>({\n context,\n previousValues,\n values,\n path,\n entityId,\n collection\n}: NewHistoryEntryParams<T>) {\n\n const uid = context.authController.user?.uid;\n const dataSource = context.dataSource;\n const changedFields = previousValues ? findChangedFields(previousValues as object, values as object) : null;\n\n const entry: HistoryEntry<T> = {\n ...values,\n __metadata: {\n previous_values: previousValues,\n changed_fields: changedFields,\n updated_on: new Date(),\n updated_by: uid ?? null,\n }\n };\n dataSource.saveEntity({\n path: path + \"/\" + entityId + \"/__history\",\n values: entry,\n status: \"new\",\n collection\n }).then(() => {\n console.debug(\"History saved for\", path, entityId);\n });\n}\n\nexport const entityHistoryCallbacks: EntityCallbacks = {\n onSaveSuccess: async (props) => {\n\n const values = props.values;\n const previousValues = props.previousValues;\n const path = props.path;\n const entityId = props.entityId;\n const context = props.context;\n const collection = props.collection;\n createHistoryEntry({\n context: context,\n previousValues: previousValues,\n values: values,\n path: path,\n entityId: entityId,\n collection: collection\n });\n }\n}\n\nfunction findChangedFields<M extends object>(oldValues: M, newValues: M, prefix: string = \"\"): string[] {\n const changedFields: string[] = [];\n\n // Handle null/undefined cases\n if (equal(oldValues, newValues)) return changedFields;\n if (!oldValues || !newValues) return [prefix || \".\"];\n\n // Get all unique keys from both objects\n const allKeys = new Set([\n ...Object.keys(oldValues),\n ...Object.keys(newValues)\n ]);\n\n for (const key of allKeys) {\n const oldValue = oldValues[key as keyof M];\n const newValue = newValues[key as keyof M];\n const currentPath = prefix ? `${prefix}.${key}` : key;\n\n // If key exists only in one object\n if ((key in oldValues) !== (key in newValues)) {\n changedFields.push(currentPath);\n continue;\n }\n\n // If values are identical (deep equality)\n if (equal(oldValue, newValue)) continue;\n\n // Handle arrays\n if (Array.isArray(oldValue) && Array.isArray(newValue)) {\n if (oldValue.length !== newValue.length) {\n changedFields.push(currentPath);\n } else {\n // Check if any array element changed\n for (let i = 0; i < oldValue.length; i++) {\n if (\n typeof oldValue[i] === \"object\" && oldValue[i] !== null &&\n typeof newValue[i] === \"object\" && newValue[i] !== null\n ) {\n const nestedChanges = findChangedFields(\n oldValue[i] as object,\n newValue[i] as object,\n `${currentPath}[${i}]`\n );\n if (nestedChanges.length > 0) {\n changedFields.push(currentPath);\n break;\n }\n } else if (!equal(oldValue[i], newValue[i])) {\n changedFields.push(currentPath);\n break;\n }\n }\n }\n }\n // Handle nested objects\n else if (\n typeof oldValue === \"object\" && oldValue !== null &&\n typeof newValue === \"object\" && newValue !== null\n ) {\n const nestedChanges = findChangedFields(\n oldValue as object,\n newValue as object,\n currentPath\n );\n changedFields.push(...nestedChanges);\n }\n // Handle primitives\n else {\n changedFields.push(currentPath);\n }\n }\n\n return changedFields;\n}\n","import React, { useEffect, useState } from \"react\";\nimport { Entity, useDataSource, User, useTranslation } from \"@firecms/core\";\nimport { useHistoryController } from \"../HistoryControllerProvider\";\n\nfunction getRelativeTimeString(date: Date, t: any): string {\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffSeconds = Math.floor(diffMs / 1000);\n const diffMinutes = Math.floor(diffSeconds / 60);\n const diffHours = Math.floor(diffMinutes / 60);\n const diffDays = Math.floor(diffHours / 24);\n\n if (diffSeconds < 60) return t(\"entity_history_just_now\");\n if (diffMinutes < 60) return t(\"entity_history_minutes_ago\", { minutes: diffMinutes });\n if (diffHours < 24) return t(\"entity_history_hours_ago\", { hours: diffHours });\n if (diffDays < 30) return t(\"entity_history_days_ago\", { days: diffDays });\n return date.toLocaleDateString();\n}\n\n/**\n * Fetches the latest history entry from the __history subcollection\n * and displays who last edited the entity and when.\n */\nexport function LastEditedByIndicator({\n path,\n entityId,\n collection\n}: {\n path: string;\n entityId: string;\n collection: any;\n}) {\n const { t } = useTranslation();\n const { getUser } = useHistoryController();\n const dataSource = useDataSource();\n const [latestEntry, setLatestEntry] = useState<Entity | undefined>();\n\n useEffect(() => {\n if (!path || !entityId) return;\n\n const historyPath = `${path}/${entityId}/__history`;\n const unsubscribe = dataSource.listenCollection?.({\n path: historyPath,\n collection,\n orderBy: \"__metadata.updated_on\",\n order: \"desc\",\n limit: 1,\n onUpdate: (entities) => {\n setLatestEntry(entities[0]);\n },\n onError: (error) => {\n console.error(\"Error fetching latest history entry:\", error);\n }\n });\n\n return () => {\n if (typeof unsubscribe === \"function\") {\n unsubscribe();\n }\n };\n }, [path, entityId, dataSource]);\n\n const metadata = latestEntry?.values?.__metadata;\n const uid = metadata?.updated_by;\n const editedOn = metadata?.updated_on;\n\n if (!uid && !editedOn) return null;\n\n const user: User | null | undefined = uid ? getUser?.(uid) : undefined;\n const date = editedOn instanceof Date ? editedOn : (editedOn?.toDate ? editedOn.toDate() : null);\n const timeString = date ? getRelativeTimeString(date, t) : null;\n\n const displayName = user?.displayName ?? user?.email ?? uid;\n const photoURL = user?.photoURL;\n\n return (\n <div className=\"flex items-center gap-2 text-xs text-text-secondary dark:text-text-secondary-dark\">\n {photoURL ? (\n <img\n src={photoURL}\n alt={displayName ?? \"User\"}\n className=\"rounded-full object-cover w-6 h-6\"\n />\n ) : (\n <div className=\"rounded-full bg-primary/10 dark:bg-primary-dark/20 flex items-center justify-center text-primary dark:text-primary-dark font-medium w-6 h-6 text-xs\">\n {(displayName ?? \"?\").charAt(0).toUpperCase()}\n </div>\n )}\n <span>\n {displayName}{timeString ? ` · ${timeString}` : \"\"}\n </span>\n </div>\n );\n}\n","import React from \"react\";\nimport { PluginFormActionProps } from \"@firecms/core\";\nimport { LastEditedByIndicator } from \"./LastEditedByIndicator\";\n\n/**\n * Renders the \"last edited by\" indicator in the entity form top bar.\n * Used as a plugin `form.ActionsTop` component.\n */\nexport function LastEditedByFormAction({\n entityId,\n path,\n status,\n collection,\n}: PluginFormActionProps) {\n if (status === \"new\" || status === \"copy\" || !entityId) return null;\n if (!collection.history) return null;\n\n return <LastEditedByIndicator\n path={path}\n entityId={entityId}\n collection={collection}\n />;\n}\n","export const entityHistoryTranslationsEn = {\n history: \"History\",\n entity_history_only_existing: \"History is only available for existing entities\",\n entity_history_reverted: \"Reverted version\",\n entity_history_error_reverting: \"Error reverting entity\",\n entity_history_no_history: \"No history available\",\n entity_history_when_save: \"When you save an entity, a new version is created and stored in the history.\",\n entity_history_revert_tooltip: \"Revert to this version\",\n entity_history_please_save: \"Please save or discard your changes before reverting\",\n loading_more: \"Loading more...\",\n entity_history_no_more: \"No more history available\",\n entity_history_revert_dialog_title: \"Revert data to this version?\",\n entity_history_previous_value: \"Previous value\",\n entity_history_see_details: \"See details for this revision\",\n entity_history_just_now: \"just now\",\n entity_history_minutes_ago: \"{{minutes}}m ago\",\n entity_history_hours_ago: \"{{hours}}h ago\",\n entity_history_days_ago: \"{{days}}d ago\",\n user_picture: \"User picture\"\n};\n","export const entityHistoryTranslationsEs = {\n history: \"Historial\",\n entity_history_only_existing: \"El historial solo está disponible para entidades existentes\",\n entity_history_reverted: \"Versión revertida\",\n entity_history_error_reverting: \"Error al revertir la entidad\",\n entity_history_no_history: \"No hay historial disponible\",\n entity_history_when_save: \"Cuando guardas una entidad, se crea una nueva versión y se almacena en el historial.\",\n entity_history_revert_tooltip: \"Revertir a esta versión\",\n entity_history_please_save: \"Por favor, guarda o descarta tus cambios antes de revertir\",\n loading_more: \"Cargando más...\",\n entity_history_no_more: \"No hay más historial disponible\",\n entity_history_revert_dialog_title: \"¿Revertir datos a esta versión?\",\n entity_history_previous_value: \"Valor anterior\",\n entity_history_see_details: \"Ver detalles de esta revisión\",\n entity_history_just_now: \"justo ahora\",\n entity_history_minutes_ago: \"hace {{minutes}}m\",\n entity_history_hours_ago: \"hace {{hours}}h\",\n entity_history_days_ago: \"hace {{days}}d\",\n user_picture: \"Foto de usuario\"\n};\n","export const entityHistoryTranslationsDe = {\n history: \"Verlauf\",\n entity_history_only_existing: \"Verlauf ist nur für vorhandene Entitäten verfügbar\",\n entity_history_reverted: \"Wiederhergestellte Version\",\n entity_history_error_reverting: \"Fehler beim Wiederherstellen der Entität\",\n entity_history_no_history: \"Kein Verlauf verfügbar\",\n entity_history_when_save: \"Wenn Sie eine Entität speichern, wird eine neue Version erstellt und im Verlauf gespeichert.\",\n entity_history_revert_tooltip: \"Zu dieser Version zurückkehren\",\n entity_history_please_save: \"Bitte speichern oder verwerfen Sie Ihre Änderungen vor der Wiederherstellung\",\n loading_more: \"Mehr laden...\",\n entity_history_no_more: \"Kein weiterer Verlauf verfügbar\",\n entity_history_revert_dialog_title: \"Daten auf diese Version zurücksetzen?\",\n entity_history_previous_value: \"Vorheriger Wert\",\n entity_history_see_details: \"Details zu dieser Überarbeitung anzeigen\",\n entity_history_just_now: \"gerade eben\",\n entity_history_minutes_ago: \"vor {{minutes}}m\",\n entity_history_hours_ago: \"vor {{hours}}h\",\n entity_history_days_ago: \"vor {{days}}d\",\n user_picture: \"Benutzerbild\"\n};\n","export const entityHistoryTranslationsFr = {\n history: \"Historique\",\n entity_history_only_existing: \"L'historique n'est disponible que pour les entités existantes\",\n entity_history_reverted: \"Version restaurée\",\n entity_history_error_reverting: \"Erreur lors de la restauration de l'entité\",\n entity_history_no_history: \"Aucun historique disponible\",\n entity_history_when_save: \"Lorsque vous enregistrez une entité, une nouvelle version est créée et stockée dans l'historique.\",\n entity_history_revert_tooltip: \"Revenir à cette version\",\n entity_history_please_save: \"Veuillez enregistrer ou annuler vos modifications avant de restaurer\",\n loading_more: \"Chargement en cours...\",\n entity_history_no_more: \"Aucun autre historique disponible\",\n entity_history_revert_dialog_title: \"Restaurer les données à cette version ?\",\n entity_history_previous_value: \"Valeur précédente\",\n entity_history_see_details: \"Voir les détails de cette révision\",\n entity_history_just_now: \"à l'instant\",\n entity_history_minutes_ago: \"il y a {{minutes}}m\",\n entity_history_hours_ago: \"il y a {{hours}}h\",\n entity_history_days_ago: \"il y a {{days}}j\",\n user_picture: \"Photo de l'utilisateur\"\n};\n","export const entityHistoryTranslationsIt = {\n history: \"Cronologia\",\n entity_history_only_existing: \"La cronologia è disponibile solo per le entità esistenti\",\n entity_history_reverted: \"Versione ripristinata\",\n entity_history_error_reverting: \"Errore durante il ripristino dell'entità\",\n entity_history_no_history: \"Nessuna cronologia disponibile\",\n entity_history_when_save: \"Quando salvi un'entità, viene creata una nuova versione e memorizzata nella cronologia.\",\n entity_history_revert_tooltip: \"Ripristina a questa versione\",\n entity_history_please_save: \"Salva o annulla le modifiche prima del ripristino\",\n loading_more: \"Caricamento in corso...\",\n entity_history_no_more: \"Nessuna ulteriore cronologia disponibile\",\n entity_history_revert_dialog_title: \"Vuoi ripristinare i dati a questa versione?\",\n entity_history_previous_value: \"Valore precedente\",\n entity_history_see_details: \"Vedi i dettagli per questa revisione\",\n entity_history_just_now: \"proprio adesso\",\n entity_history_minutes_ago: \"{{minutes}} min fa\",\n entity_history_hours_ago: \"{{hours}} h fa\",\n entity_history_days_ago: \"{{days}} g fa\",\n user_picture: \"Immagine utente\"\n};\n","export const entityHistoryTranslationsHi = {\n history: \"इतिहास\",\n entity_history_only_existing: \"इतिहास केवल मौजूद संस्थाओं के लिए उपलब्ध है\",\n entity_history_reverted: \"परिवर्तित संस्करण\",\n entity_history_error_reverting: \"संस्था को वापस लाने में त्रुटि\",\n entity_history_no_history: \"कोई इतिहास उपलब्ध नहीं\",\n entity_history_when_save: \"जब आप किसी संस्था को सहेजते हैं, तो एक नया संस्करण बनाया जाता है और इतिहास में संग्रहीत किया जाता है।\",\n entity_history_revert_tooltip: \"इस संस्करण पर वापस जाएं\",\n entity_history_please_save: \"कृपया वापस जाने से पहले अपने परिवर्तनों को सहेजें या हटा दें\",\n loading_more: \"और लोड हो रहा है...\",\n entity_history_no_more: \"कोई और इतिहास उपलब्ध नहीं\",\n entity_history_revert_dialog_title: \"डेटा को इस संस्करण में वापस लाएँ?\",\n entity_history_previous_value: \"पिछला मान\",\n entity_history_see_details: \"इस संशोधन के लिए विवरण यहाँ देखें\",\n entity_history_just_now: \"अभी-अभी\",\n entity_history_minutes_ago: \"{{minutes}}m पहले\",\n entity_history_hours_ago: \"{{hours}}h पहले\",\n entity_history_days_ago: \"{{days}}d पहले\",\n user_picture: \"उपयोगकर्ता चित्र\"\n};\n","export const entityHistoryTranslationsPt = {\n history: \"Histórico\",\n entity_history_only_existing: \"O histórico está disponível apenas para entidades existentes\",\n entity_history_reverted: \"Versão revertida\",\n entity_history_error_reverting: \"Erro ao reverter entidade\",\n entity_history_no_history: \"Sem histórico disponível\",\n entity_history_when_save: \"Quando guarda uma entidade, é criada uma nova versão e armazenada no histórico.\",\n entity_history_revert_tooltip: \"Reverter para esta versão\",\n entity_history_please_save: \"Por favor guarde ou descarte as suas alterações antes de reverter\",\n loading_more: \"A carregar mais...\",\n entity_history_no_more: \"Sem mais histórico disponível\",\n entity_history_revert_dialog_title: \"Reverter dados para esta versão?\",\n entity_history_previous_value: \"Valor anterior\",\n entity_history_see_details: \"Ver detalhes desta revisão\",\n entity_history_just_now: \"agora mesmo\",\n entity_history_minutes_ago: \"há {{minutes}}m\",\n entity_history_hours_ago: \"há {{hours}}h\",\n entity_history_days_ago: \"há {{days}}d\",\n user_picture: \"Foto do utilizador\"\n};\n","import { useCallback, useMemo } from \"react\";\nimport { EntityCollection, FireCMSPlugin, mergeCallbacks, User, useTranslation } from \"@firecms/core\";\nimport { EntityHistoryView } from \"./components/EntityHistoryView\";\nimport { HistoryIcon } from \"@firecms/ui\";\nimport { entityHistoryCallbacks } from \"./entity_history_callbacks\";\nimport { HistoryControllerProvider } from \"./HistoryControllerProvider\";\nimport { LastEditedByFormAction } from \"./components/LastEditedByPluginComponents\";\nimport { entityHistoryTranslationsEn } from \"./locales/en\";\nimport { entityHistoryTranslationsEs } from \"./locales/es\";\nimport { entityHistoryTranslationsDe } from \"./locales/de\";\nimport { entityHistoryTranslationsFr } from \"./locales/fr\";\nimport { entityHistoryTranslationsIt } from \"./locales/it\";\nimport { entityHistoryTranslationsHi } from \"./locales/hi\";\nimport { entityHistoryTranslationsPt } from \"./locales/pt\";\n\n/**\n * This plugin adds a history view to the entity side panel.\n */\nexport function useEntityHistoryPlugin(props?: EntityHistoryPluginProps): FireCMSPlugin<any, any, any, EntityHistoryPluginProps> {\n const { defaultEnabled = false } = props ?? {};\n\n const modifyCollection = useCallback((collection: EntityCollection) => {\n if (collection.history === true || (defaultEnabled && collection.history !== false)) {\n return {\n ...collection,\n history: true,\n entityViews: [\n ...(collection.entityViews ?? []),\n {\n key: \"__history\",\n name: \"History\",\n tabComponent: <HistoryIcon size={\"small\"} />,\n Builder: EntityHistoryView,\n position: \"start\"\n }\n ],\n callbacks: mergeCallbacks(collection.callbacks, entityHistoryCallbacks)\n } satisfies EntityCollection;\n }\n return collection;\n }, []);\n\n return useMemo(() => ({\n key: \"entity_history\",\n provider: {\n Component: HistoryControllerProvider,\n props: {\n getUser: props?.getUser\n }\n },\n form: {\n BeforeTitle: LastEditedByFormAction\n },\n collection: {\n modifyCollection\n },\n i18n: {\n en: entityHistoryTranslationsEn,\n es: entityHistoryTranslationsEs,\n de: entityHistoryTranslationsDe,\n fr: entityHistoryTranslationsFr,\n it: entityHistoryTranslationsIt,\n hi: entityHistoryTranslationsHi,\n pt: entityHistoryTranslationsPt\n }\n } satisfies FireCMSPlugin), [props]);\n}\n\nexport type EntityHistoryPluginProps = {\n /**\n * If true, the history view will be enabled to all collections by default.\n * Each collection can override this value by setting the `history` property.\n */\n defaultEnabled?: boolean;\n\n /**\n * Function to get the user object from the uid.\n * @param uid\n */\n getUser?: (uid: string) => User | null;\n}\n"],"names":["HistoryControllerContext","React","createContext","useHistoryController","useContext","HistoryControllerProvider","memo","t0","$","_c","children","getUser","t1","t2","equal","UserChip","user","t","useTranslation","email","uid","displayName","photoURL","jsx","t3","t4","t5","Chip","t6","Tooltip","PreviousValueView","previousValueInPath","childProperty","propertyKey","Typography","PropertyPreview","jsxs","t7","Symbol","for","KeyboardBackspaceIcon","t8","EntityHistoryEntry","actions","hover","collection","collectionProp","previewKeys","onClick","size","entity","previousValues","authController","useAuthController","customizationController","useCustomizationController","navigationController","useNavigationController","sideEntityController","useSideEntityController","getCollection","path","updatedOn","values","Error","updatedBy","resolvedCollection","useMemo","resolveCollection","propertyConfigs","toLocaleString","cls","defaultBorderMixin","IconButton","e","open","entityId","id","allowFullScreen","subcollections","undefined","entityViews","permissions","create","delete","edit","read","updateUrl","KeyboardTabIcon","map","key","getPropertyInPath","properties","valueInPath","getValueInPath","element","SkeletonPropertyComponent","JSON","stringify","EntityHistoryView","formContext","snackbarController","useSnackbarController","dirty","formex","dataSource","useDataSource","pathAndId","revertVersionDialog","setRevertVersionDialog","useState","revisions","setRevisions","isLoading","setIsLoading","hasMore","setHasMore","limit","setLimit","containerRef","useRef","observerRef","loadMoreRef","listener","listenCollection","order","orderBy","startAfter","onUpdate","entities","length","onError","error","console","useEffect","currentContainer","current","currentLoadMore","disconnect","options","root","rootMargin","threshold","handleObserver","entries","target","isIntersecting","_temp","observer","IntersectionObserver","observe","Label","doRevert","revertVersion","revertValues","__metadata","reverted","updated_on","Date","updated_by","saveReverted","saveEntity","status","saveRevertedHistory","Promise","all","then","resetForm","message","type","catch","error_0","t9","t10","Fragment","t11","t12","revision","index","changed_fields","previous_values","HistoryIcon","t13","t14","Boolean","t15","t16","t17","t18","t19","EntityView","t20","ErrorBoundary","ConfirmationDialog","t21","prev","createHistoryEntry","context","changedFields","findChangedFields","entry","debug","entityHistoryCallbacks","onSaveSuccess","props","oldValues","newValues","prefix","allKeys","Set","Object","keys","oldValue","newValue","currentPath","push","Array","isArray","i","nestedChanges","getRelativeTimeString","date","now","diffMs","getTime","diffSeconds","Math","floor","diffMinutes","diffHours","diffDays","minutes","hours","days","toLocaleDateString","LastEditedByIndicator","latestEntry","setLatestEntry","historyPath","unsubscribe","metadata","editedOn","toDate","timeString","charAt","toUpperCase","LastEditedByFormAction","history","entityHistoryTranslationsEn","entity_history_only_existing","entity_history_reverted","entity_history_error_reverting","entity_history_no_history","entity_history_when_save","entity_history_revert_tooltip","entity_history_please_save","loading_more","entity_history_no_more","entity_history_revert_dialog_title","entity_history_previous_value","entity_history_see_details","entity_history_just_now","entity_history_minutes_ago","entity_history_hours_ago","entity_history_days_ago","user_picture","entityHistoryTranslationsEs","entityHistoryTranslationsDe","entityHistoryTranslationsFr","entityHistoryTranslationsIt","entityHistoryTranslationsHi","entityHistoryTranslationsPt","useEntityHistoryPlugin","defaultEnabled","modifyCollection","useCallback","name","tabComponent","Builder","position","callbacks","mergeCallbacks","provider","Component","form","BeforeTitle","i18n","en","es","de","fr","it","hi","pt"],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ export declare const entityHistoryTranslationsDe: {
2
+ history: string;
3
+ entity_history_only_existing: string;
4
+ entity_history_reverted: string;
5
+ entity_history_error_reverting: string;
6
+ entity_history_no_history: string;
7
+ entity_history_when_save: string;
8
+ entity_history_revert_tooltip: string;
9
+ entity_history_please_save: string;
10
+ loading_more: string;
11
+ entity_history_no_more: string;
12
+ entity_history_revert_dialog_title: string;
13
+ entity_history_previous_value: string;
14
+ entity_history_see_details: string;
15
+ entity_history_just_now: string;
16
+ entity_history_minutes_ago: string;
17
+ entity_history_hours_ago: string;
18
+ entity_history_days_ago: string;
19
+ user_picture: string;
20
+ };
@@ -0,0 +1,20 @@
1
+ export declare const entityHistoryTranslationsEn: {
2
+ history: string;
3
+ entity_history_only_existing: string;
4
+ entity_history_reverted: string;
5
+ entity_history_error_reverting: string;
6
+ entity_history_no_history: string;
7
+ entity_history_when_save: string;
8
+ entity_history_revert_tooltip: string;
9
+ entity_history_please_save: string;
10
+ loading_more: string;
11
+ entity_history_no_more: string;
12
+ entity_history_revert_dialog_title: string;
13
+ entity_history_previous_value: string;
14
+ entity_history_see_details: string;
15
+ entity_history_just_now: string;
16
+ entity_history_minutes_ago: string;
17
+ entity_history_hours_ago: string;
18
+ entity_history_days_ago: string;
19
+ user_picture: string;
20
+ };
@@ -0,0 +1,20 @@
1
+ export declare const entityHistoryTranslationsEs: {
2
+ history: string;
3
+ entity_history_only_existing: string;
4
+ entity_history_reverted: string;
5
+ entity_history_error_reverting: string;
6
+ entity_history_no_history: string;
7
+ entity_history_when_save: string;
8
+ entity_history_revert_tooltip: string;
9
+ entity_history_please_save: string;
10
+ loading_more: string;
11
+ entity_history_no_more: string;
12
+ entity_history_revert_dialog_title: string;
13
+ entity_history_previous_value: string;
14
+ entity_history_see_details: string;
15
+ entity_history_just_now: string;
16
+ entity_history_minutes_ago: string;
17
+ entity_history_hours_ago: string;
18
+ entity_history_days_ago: string;
19
+ user_picture: string;
20
+ };
@@ -0,0 +1,20 @@
1
+ export declare const entityHistoryTranslationsFr: {
2
+ history: string;
3
+ entity_history_only_existing: string;
4
+ entity_history_reverted: string;
5
+ entity_history_error_reverting: string;
6
+ entity_history_no_history: string;
7
+ entity_history_when_save: string;
8
+ entity_history_revert_tooltip: string;
9
+ entity_history_please_save: string;
10
+ loading_more: string;
11
+ entity_history_no_more: string;
12
+ entity_history_revert_dialog_title: string;
13
+ entity_history_previous_value: string;
14
+ entity_history_see_details: string;
15
+ entity_history_just_now: string;
16
+ entity_history_minutes_ago: string;
17
+ entity_history_hours_ago: string;
18
+ entity_history_days_ago: string;
19
+ user_picture: string;
20
+ };
@@ -0,0 +1,20 @@
1
+ export declare const entityHistoryTranslationsHi: {
2
+ history: string;
3
+ entity_history_only_existing: string;
4
+ entity_history_reverted: string;
5
+ entity_history_error_reverting: string;
6
+ entity_history_no_history: string;
7
+ entity_history_when_save: string;
8
+ entity_history_revert_tooltip: string;
9
+ entity_history_please_save: string;
10
+ loading_more: string;
11
+ entity_history_no_more: string;
12
+ entity_history_revert_dialog_title: string;
13
+ entity_history_previous_value: string;
14
+ entity_history_see_details: string;
15
+ entity_history_just_now: string;
16
+ entity_history_minutes_ago: string;
17
+ entity_history_hours_ago: string;
18
+ entity_history_days_ago: string;
19
+ user_picture: string;
20
+ };
@@ -0,0 +1,20 @@
1
+ export declare const entityHistoryTranslationsIt: {
2
+ history: string;
3
+ entity_history_only_existing: string;
4
+ entity_history_reverted: string;
5
+ entity_history_error_reverting: string;
6
+ entity_history_no_history: string;
7
+ entity_history_when_save: string;
8
+ entity_history_revert_tooltip: string;
9
+ entity_history_please_save: string;
10
+ loading_more: string;
11
+ entity_history_no_more: string;
12
+ entity_history_revert_dialog_title: string;
13
+ entity_history_previous_value: string;
14
+ entity_history_see_details: string;
15
+ entity_history_just_now: string;
16
+ entity_history_minutes_ago: string;
17
+ entity_history_hours_ago: string;
18
+ entity_history_days_ago: string;
19
+ user_picture: string;
20
+ };
@@ -0,0 +1,20 @@
1
+ export declare const entityHistoryTranslationsPt: {
2
+ history: string;
3
+ entity_history_only_existing: string;
4
+ entity_history_reverted: string;
5
+ entity_history_error_reverting: string;
6
+ entity_history_no_history: string;
7
+ entity_history_when_save: string;
8
+ entity_history_revert_tooltip: string;
9
+ entity_history_please_save: string;
10
+ loading_more: string;
11
+ entity_history_no_more: string;
12
+ entity_history_revert_dialog_title: string;
13
+ entity_history_previous_value: string;
14
+ entity_history_see_details: string;
15
+ entity_history_just_now: string;
16
+ entity_history_minutes_ago: string;
17
+ entity_history_hours_ago: string;
18
+ entity_history_days_ago: string;
19
+ user_picture: string;
20
+ };
package/package.json CHANGED
@@ -1,16 +1,16 @@
1
1
  {
2
2
  "name": "@firecms/entity_history",
3
3
  "type": "module",
4
- "version": "3.1.0",
4
+ "version": "3.2.0-canary.4c3b8f2",
5
5
  "access": "public",
6
6
  "main": "./dist/index.umd.js",
7
7
  "module": "./dist/index.es.js",
8
8
  "types": "./dist/index.d.ts",
9
9
  "source": "src/index.ts",
10
10
  "dependencies": {
11
- "@firecms/core": "^3.1.0",
12
- "@firecms/formex": "^3.1.0",
13
- "@firecms/ui": "^3.1.0"
11
+ "@firecms/core": "3.2.0-canary.4c3b8f2",
12
+ "@firecms/formex": "3.2.0-canary.4c3b8f2",
13
+ "@firecms/ui": "3.2.0-canary.4c3b8f2"
14
14
  },
15
15
  "peerDependencies": {
16
16
  "react": ">=18.3.1 || >=19.0.0",
@@ -82,5 +82,5 @@
82
82
  "publishConfig": {
83
83
  "access": "public"
84
84
  },
85
- "gitHead": "40f8d9860cb2649c0a195ecebd1a92ccb37f33a6"
85
+ "gitHead": "b86dabf4d939a8db1d84f4581c8cc3cfcccf0891"
86
86
  }
@@ -25,7 +25,8 @@ import {
25
25
  useAuthController,
26
26
  useCustomizationController,
27
27
  useNavigationController,
28
- useSideEntityController
28
+ useSideEntityController,
29
+ useTranslation
29
30
  } from "@firecms/core";
30
31
  import { useHistoryController } from "../HistoryControllerProvider";
31
32
  import { UserChip } from "./UserChip";
@@ -50,6 +51,7 @@ function PreviousValueView({
50
51
  childProperty: Property,
51
52
  propertyKey: string
52
53
  }) {
54
+ const { t } = useTranslation();
53
55
  if (typeof previousValueInPath === "string" || typeof previousValueInPath === "number") {
54
56
  return <Typography variant={"caption"} color={"secondary"} className="line-through">
55
57
  {previousValueInPath}
@@ -64,7 +66,7 @@ function PreviousValueView({
64
66
  side={"left"}
65
67
  title={<div className={"flex flex-col gap-2"}>
66
68
  <Typography variant={"caption"} color={"secondary"}>
67
- Previous value
69
+ {t("entity_history_previous_value")}
68
70
  </Typography>
69
71
  <PropertyPreview
70
72
  propertyKey={propertyKey as string}
@@ -97,6 +99,7 @@ export function EntityHistoryEntry({
97
99
 
98
100
  const navigationController = useNavigationController();
99
101
  const sideEntityController = useSideEntityController();
102
+ const { t } = useTranslation();
100
103
 
101
104
  const collection = collectionProp ?? navigationController.getCollection(entity.path);
102
105
  const updatedOn = entity.values?.["__metadata"]?.["updated_on"];
@@ -139,7 +142,7 @@ export function EntityHistoryEntry({
139
142
  {actions}
140
143
 
141
144
  {entity &&
142
- <Tooltip title={"See details for this revision"}
145
+ <Tooltip title={t("entity_history_see_details")}
143
146
  className={"my-2 grow-0 shrink-0 self-start"}>
144
147
  <IconButton
145
148
  color={"inherit"}