@firecms/entity_history 3.2.0 → 3.3.0-canary.451aa49
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.
- package/dist/components/LastEditedByIndicator.d.ts +1 -1
- package/dist/index.es.js +40 -34
- package/dist/index.es.js.map +1 -1
- package/dist/index.umd.js +39 -33
- package/dist/index.umd.js.map +1 -1
- package/package.json +5 -5
- package/src/components/EntityHistoryEntry.tsx +3 -2
- package/src/components/LastEditedByIndicator.tsx +18 -16
package/dist/index.es.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsx, jsxs, Fragment } from "react/jsx-runtime";
|
|
2
2
|
import * as React from "react";
|
|
3
3
|
import React__default, { useContext, useState, useRef, useEffect, useCallback, useMemo } from "react";
|
|
4
|
-
import { useTranslation, useAuthController, useCustomizationController, useNavigationController, useSideEntityController, resolveCollection, getPropertyInPath, getValueInPath, PropertyPreview, SkeletonPropertyComponent, useSnackbarController, useDataSource, EntityView, ErrorBoundary, ConfirmationDialog, mergeCallbacks } from "@firecms/core";
|
|
4
|
+
import { useTranslation, useAuthController, useCustomizationController, useNavigationController, useSideEntityController, resolveCollection, getPropertyInPath, getValueInPath, PropertyPreview, SkeletonPropertyComponent, jsonStringifyReplacer, useSnackbarController, useDataSource, EntityView, ErrorBoundary, ConfirmationDialog, mergeCallbacks } from "@firecms/core";
|
|
5
5
|
import { c } from "react-compiler-runtime";
|
|
6
6
|
import { Chip, Tooltip, Typography, IconButton, KeyboardTabIcon, cls, defaultBorderMixin, KeyboardBackspaceIcon, Label, HistoryIcon } from "@firecms/ui";
|
|
7
7
|
import equal from "react-fast-compare";
|
|
@@ -244,7 +244,7 @@ function EntityHistoryEntry({
|
|
|
244
244
|
const childProperty = getPropertyInPath(resolvedCollection.properties, key);
|
|
245
245
|
const valueInPath = getValueInPath(entity.values, key);
|
|
246
246
|
const previousValueInPath = previousValues ? getValueInPath(previousValues, key) : void 0;
|
|
247
|
-
const element = childProperty ? entity ? /* @__PURE__ */ jsx(PropertyPreview, { propertyKey: key, value: valueInPath, property: childProperty, size: "small" }) : /* @__PURE__ */ jsx(SkeletonPropertyComponent, { property: childProperty, size: "small" }) : /* @__PURE__ */ jsx(Typography, { variant: "body2", children: typeof valueInPath === "string" ? valueInPath : JSON.stringify(valueInPath) });
|
|
247
|
+
const element = childProperty ? entity ? /* @__PURE__ */ jsx(PropertyPreview, { propertyKey: key, value: valueInPath, property: childProperty, size: "small" }) : /* @__PURE__ */ jsx(SkeletonPropertyComponent, { property: childProperty, size: "small" }) : /* @__PURE__ */ jsx(Typography, { variant: "body2", children: typeof valueInPath === "string" ? valueInPath : JSON.stringify(valueInPath, jsonStringifyReplacer) });
|
|
248
248
|
return /* @__PURE__ */ jsxs("div", { className: "flex w-full my-1 items-center", children: [
|
|
249
249
|
/* @__PURE__ */ jsx(Typography, { variant: "caption", color: "secondary", className: "min-w-[140px] md:min-w-[200px] w-1/5 pr-8 overflow-hidden text-ellipsis text-right", children: key }),
|
|
250
250
|
/* @__PURE__ */ jsxs("div", { className: "w-4/5", children: [
|
|
@@ -749,7 +749,7 @@ function getRelativeTimeString(date, t) {
|
|
|
749
749
|
return date.toLocaleDateString();
|
|
750
750
|
}
|
|
751
751
|
function LastEditedByIndicator(t0) {
|
|
752
|
-
const $ = c(
|
|
752
|
+
const $ = c(24);
|
|
753
753
|
const {
|
|
754
754
|
path,
|
|
755
755
|
entityId,
|
|
@@ -809,9 +809,7 @@ function LastEditedByIndicator(t0) {
|
|
|
809
809
|
const metadata = latestEntry?.values?.__metadata;
|
|
810
810
|
const uid = metadata?.updated_by;
|
|
811
811
|
const editedOn = metadata?.updated_on;
|
|
812
|
-
|
|
813
|
-
return null;
|
|
814
|
-
}
|
|
812
|
+
const hasData = Boolean(uid || editedOn);
|
|
815
813
|
let t3;
|
|
816
814
|
if ($[9] !== getUser || $[10] !== uid) {
|
|
817
815
|
t3 = uid ? getUser?.(uid) : void 0;
|
|
@@ -822,43 +820,51 @@ function LastEditedByIndicator(t0) {
|
|
|
822
820
|
t3 = $[11];
|
|
823
821
|
}
|
|
824
822
|
const user = t3;
|
|
825
|
-
const date = editedOn instanceof Date ? editedOn : editedOn?.toDate ? editedOn.toDate() : null;
|
|
826
|
-
const timeString = date ? getRelativeTimeString(date, t) : null;
|
|
827
|
-
const displayName = user?.displayName ?? user?.email ?? uid;
|
|
828
|
-
const photoURL = user?.photoURL;
|
|
829
823
|
let t4;
|
|
830
|
-
if ($[12] !==
|
|
831
|
-
t4 =
|
|
832
|
-
$[12] =
|
|
833
|
-
$[13] =
|
|
834
|
-
$[14] = t4;
|
|
824
|
+
if ($[12] !== editedOn) {
|
|
825
|
+
t4 = editedOn instanceof Date ? editedOn : editedOn?.toDate ? editedOn.toDate() : null;
|
|
826
|
+
$[12] = editedOn;
|
|
827
|
+
$[13] = t4;
|
|
835
828
|
} else {
|
|
836
|
-
t4 = $[
|
|
829
|
+
t4 = $[13];
|
|
837
830
|
}
|
|
838
|
-
const
|
|
831
|
+
const date = t4;
|
|
832
|
+
let t5;
|
|
833
|
+
if ($[14] !== date || $[15] !== t) {
|
|
834
|
+
t5 = date ? getRelativeTimeString(date, t) : null;
|
|
835
|
+
$[14] = date;
|
|
836
|
+
$[15] = t;
|
|
837
|
+
$[16] = t5;
|
|
838
|
+
} else {
|
|
839
|
+
t5 = $[16];
|
|
840
|
+
}
|
|
841
|
+
const timeString = t5;
|
|
842
|
+
const displayName = user?.displayName ?? user?.email ?? uid;
|
|
843
|
+
const photoURL = user?.photoURL;
|
|
839
844
|
let t6;
|
|
840
|
-
if ($[
|
|
841
|
-
t6 = /* @__PURE__ */ jsxs(
|
|
842
|
-
displayName,
|
|
843
|
-
|
|
845
|
+
if ($[17] !== displayName || $[18] !== hasData || $[19] !== photoURL || $[20] !== timeString) {
|
|
846
|
+
t6 = hasData && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
847
|
+
photoURL ? /* @__PURE__ */ jsx("img", { src: photoURL, alt: displayName ?? "User", className: "rounded-full object-cover w-6 h-6" }) : /* @__PURE__ */ jsx("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", children: (displayName ?? "?").charAt(0).toUpperCase() }),
|
|
848
|
+
/* @__PURE__ */ jsxs("span", { children: [
|
|
849
|
+
displayName,
|
|
850
|
+
timeString ? ` · ${timeString}` : ""
|
|
851
|
+
] })
|
|
844
852
|
] });
|
|
845
|
-
$[
|
|
846
|
-
$[
|
|
847
|
-
$[
|
|
853
|
+
$[17] = displayName;
|
|
854
|
+
$[18] = hasData;
|
|
855
|
+
$[19] = photoURL;
|
|
856
|
+
$[20] = timeString;
|
|
857
|
+
$[21] = t6;
|
|
848
858
|
} else {
|
|
849
|
-
t6 = $[
|
|
859
|
+
t6 = $[21];
|
|
850
860
|
}
|
|
851
861
|
let t7;
|
|
852
|
-
if ($[
|
|
853
|
-
t7 = /* @__PURE__ */
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
] });
|
|
857
|
-
$[18] = t4;
|
|
858
|
-
$[19] = t6;
|
|
859
|
-
$[20] = t7;
|
|
862
|
+
if ($[22] !== t6) {
|
|
863
|
+
t7 = /* @__PURE__ */ jsx("div", { className: "flex items-center gap-2 text-xs text-text-secondary dark:text-text-secondary-dark min-h-6", children: t6 });
|
|
864
|
+
$[22] = t6;
|
|
865
|
+
$[23] = t7;
|
|
860
866
|
} else {
|
|
861
|
-
t7 = $[
|
|
867
|
+
t7 = $[23];
|
|
862
868
|
}
|
|
863
869
|
return t7;
|
|
864
870
|
}
|
package/dist/index.es.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.es.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","t3","t4","t5","t6","PreviousValueView","previousValueInPath","childProperty","propertyKey","t7","Symbol","for","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","e","open","entityId","id","allowFullScreen","subcollections","undefined","entityViews","permissions","create","delete","edit","read","updateUrl","map","key","getPropertyInPath","properties","valueInPath","getValueInPath","element","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","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","t11","t12","revision","index","changed_fields","previous_values","t13","t14","Boolean","t15","t16","t17","t18","t19","t20","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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"}
|
|
1
|
+
{"version":3,"file":"index.es.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 jsonStringifyReplacer\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, jsonStringifyReplacer)}\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 const hasData = Boolean(uid || editedOn);\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 min-h-6\">\n {hasData && <>\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 </>}\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","t3","t4","t5","t6","PreviousValueView","previousValueInPath","childProperty","propertyKey","t7","Symbol","for","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","e","open","entityId","id","allowFullScreen","subcollections","undefined","entityViews","permissions","create","delete","edit","read","updateUrl","map","key","getPropertyInPath","properties","valueInPath","getValueInPath","element","JSON","stringify","jsonStringifyReplacer","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","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","t11","t12","revision","index","changed_fields","previous_values","t13","t14","Boolean","t15","t16","t17","t18","t19","t20","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","hasData","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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"}
|
package/dist/index.umd.js
CHANGED
|
@@ -258,7 +258,7 @@
|
|
|
258
258
|
const childProperty = core.getPropertyInPath(resolvedCollection.properties, key);
|
|
259
259
|
const valueInPath = core.getValueInPath(entity.values, key);
|
|
260
260
|
const previousValueInPath = previousValues ? core.getValueInPath(previousValues, key) : void 0;
|
|
261
|
-
const element = childProperty ? entity ? /* @__PURE__ */ jsxRuntime.jsx(core.PropertyPreview, { propertyKey: key, value: valueInPath, property: childProperty, size: "small" }) : /* @__PURE__ */ jsxRuntime.jsx(core.SkeletonPropertyComponent, { property: childProperty, size: "small" }) : /* @__PURE__ */ jsxRuntime.jsx(ui.Typography, { variant: "body2", children: typeof valueInPath === "string" ? valueInPath : JSON.stringify(valueInPath) });
|
|
261
|
+
const element = childProperty ? entity ? /* @__PURE__ */ jsxRuntime.jsx(core.PropertyPreview, { propertyKey: key, value: valueInPath, property: childProperty, size: "small" }) : /* @__PURE__ */ jsxRuntime.jsx(core.SkeletonPropertyComponent, { property: childProperty, size: "small" }) : /* @__PURE__ */ jsxRuntime.jsx(ui.Typography, { variant: "body2", children: typeof valueInPath === "string" ? valueInPath : JSON.stringify(valueInPath, core.jsonStringifyReplacer) });
|
|
262
262
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex w-full my-1 items-center", children: [
|
|
263
263
|
/* @__PURE__ */ jsxRuntime.jsx(ui.Typography, { variant: "caption", color: "secondary", className: "min-w-[140px] md:min-w-[200px] w-1/5 pr-8 overflow-hidden text-ellipsis text-right", children: key }),
|
|
264
264
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "w-4/5", children: [
|
|
@@ -763,7 +763,7 @@
|
|
|
763
763
|
return date.toLocaleDateString();
|
|
764
764
|
}
|
|
765
765
|
function LastEditedByIndicator(t0) {
|
|
766
|
-
const $ = reactCompilerRuntime.c(
|
|
766
|
+
const $ = reactCompilerRuntime.c(24);
|
|
767
767
|
const {
|
|
768
768
|
path,
|
|
769
769
|
entityId,
|
|
@@ -823,9 +823,7 @@
|
|
|
823
823
|
const metadata = latestEntry?.values?.__metadata;
|
|
824
824
|
const uid = metadata?.updated_by;
|
|
825
825
|
const editedOn = metadata?.updated_on;
|
|
826
|
-
|
|
827
|
-
return null;
|
|
828
|
-
}
|
|
826
|
+
const hasData = Boolean(uid || editedOn);
|
|
829
827
|
let t3;
|
|
830
828
|
if ($[9] !== getUser || $[10] !== uid) {
|
|
831
829
|
t3 = uid ? getUser?.(uid) : void 0;
|
|
@@ -836,43 +834,51 @@
|
|
|
836
834
|
t3 = $[11];
|
|
837
835
|
}
|
|
838
836
|
const user = t3;
|
|
839
|
-
const date = editedOn instanceof Date ? editedOn : editedOn?.toDate ? editedOn.toDate() : null;
|
|
840
|
-
const timeString = date ? getRelativeTimeString(date, t) : null;
|
|
841
|
-
const displayName = user?.displayName ?? user?.email ?? uid;
|
|
842
|
-
const photoURL = user?.photoURL;
|
|
843
837
|
let t4;
|
|
844
|
-
if ($[12] !==
|
|
845
|
-
t4 =
|
|
846
|
-
$[12] =
|
|
847
|
-
$[13] =
|
|
848
|
-
$[14] = t4;
|
|
838
|
+
if ($[12] !== editedOn) {
|
|
839
|
+
t4 = editedOn instanceof Date ? editedOn : editedOn?.toDate ? editedOn.toDate() : null;
|
|
840
|
+
$[12] = editedOn;
|
|
841
|
+
$[13] = t4;
|
|
849
842
|
} else {
|
|
850
|
-
t4 = $[
|
|
843
|
+
t4 = $[13];
|
|
851
844
|
}
|
|
852
|
-
const
|
|
845
|
+
const date = t4;
|
|
846
|
+
let t5;
|
|
847
|
+
if ($[14] !== date || $[15] !== t) {
|
|
848
|
+
t5 = date ? getRelativeTimeString(date, t) : null;
|
|
849
|
+
$[14] = date;
|
|
850
|
+
$[15] = t;
|
|
851
|
+
$[16] = t5;
|
|
852
|
+
} else {
|
|
853
|
+
t5 = $[16];
|
|
854
|
+
}
|
|
855
|
+
const timeString = t5;
|
|
856
|
+
const displayName = user?.displayName ?? user?.email ?? uid;
|
|
857
|
+
const photoURL = user?.photoURL;
|
|
853
858
|
let t6;
|
|
854
|
-
if ($[
|
|
855
|
-
t6 = /* @__PURE__ */ jsxRuntime.jsxs(
|
|
856
|
-
displayName,
|
|
857
|
-
|
|
859
|
+
if ($[17] !== displayName || $[18] !== hasData || $[19] !== photoURL || $[20] !== timeString) {
|
|
860
|
+
t6 = hasData && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
861
|
+
photoURL ? /* @__PURE__ */ jsxRuntime.jsx("img", { src: photoURL, alt: displayName ?? "User", className: "rounded-full object-cover w-6 h-6" }) : /* @__PURE__ */ jsxRuntime.jsx("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", children: (displayName ?? "?").charAt(0).toUpperCase() }),
|
|
862
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
|
|
863
|
+
displayName,
|
|
864
|
+
timeString ? ` · ${timeString}` : ""
|
|
865
|
+
] })
|
|
858
866
|
] });
|
|
859
|
-
$[
|
|
860
|
-
$[
|
|
861
|
-
$[
|
|
867
|
+
$[17] = displayName;
|
|
868
|
+
$[18] = hasData;
|
|
869
|
+
$[19] = photoURL;
|
|
870
|
+
$[20] = timeString;
|
|
871
|
+
$[21] = t6;
|
|
862
872
|
} else {
|
|
863
|
-
t6 = $[
|
|
873
|
+
t6 = $[21];
|
|
864
874
|
}
|
|
865
875
|
let t7;
|
|
866
|
-
if ($[
|
|
867
|
-
t7 = /* @__PURE__ */ jsxRuntime.
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
] });
|
|
871
|
-
$[18] = t4;
|
|
872
|
-
$[19] = t6;
|
|
873
|
-
$[20] = t7;
|
|
876
|
+
if ($[22] !== t6) {
|
|
877
|
+
t7 = /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-2 text-xs text-text-secondary dark:text-text-secondary-dark min-h-6", children: t6 });
|
|
878
|
+
$[22] = t6;
|
|
879
|
+
$[23] = t7;
|
|
874
880
|
} else {
|
|
875
|
-
t7 = $[
|
|
881
|
+
t7 = $[23];
|
|
876
882
|
}
|
|
877
883
|
return t7;
|
|
878
884
|
}
|
package/dist/index.umd.js.map
CHANGED
|
@@ -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/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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"}
|
|
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 jsonStringifyReplacer\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, jsonStringifyReplacer)}\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 const hasData = Boolean(uid || editedOn);\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 min-h-6\">\n {hasData && <>\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 </>}\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","jsonStringifyReplacer","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","hasData","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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"}
|
package/package.json
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@firecms/entity_history",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "3.
|
|
4
|
+
"version": "3.3.0-canary.451aa49",
|
|
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.
|
|
12
|
-
"@firecms/formex": "3.
|
|
13
|
-
"@firecms/ui": "3.
|
|
11
|
+
"@firecms/core": "^3.3.0-canary.451aa49",
|
|
12
|
+
"@firecms/formex": "^3.3.0-canary.451aa49",
|
|
13
|
+
"@firecms/ui": "^3.3.0-canary.451aa49"
|
|
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": "
|
|
85
|
+
"gitHead": "772b4a7f64893038f0cc13669d6bc66ec858fc49"
|
|
86
86
|
}
|
|
@@ -26,7 +26,8 @@ import {
|
|
|
26
26
|
useCustomizationController,
|
|
27
27
|
useNavigationController,
|
|
28
28
|
useSideEntityController,
|
|
29
|
-
useTranslation
|
|
29
|
+
useTranslation,
|
|
30
|
+
jsonStringifyReplacer
|
|
30
31
|
} from "@firecms/core";
|
|
31
32
|
import { useHistoryController } from "../HistoryControllerProvider";
|
|
32
33
|
import { UserChip } from "./UserChip";
|
|
@@ -189,7 +190,7 @@ export function EntityHistoryEntry({
|
|
|
189
190
|
property={childProperty as ResolvedProperty}
|
|
190
191
|
size={"small"}/>) :
|
|
191
192
|
<Typography variant={"body2"}>
|
|
192
|
-
{typeof valueInPath === "string" ? valueInPath : JSON.stringify(valueInPath)}
|
|
193
|
+
{typeof valueInPath === "string" ? valueInPath : JSON.stringify(valueInPath, jsonStringifyReplacer)}
|
|
193
194
|
</Typography>;
|
|
194
195
|
return (
|
|
195
196
|
<div key={"ref_prev_" + key}
|
|
@@ -64,7 +64,7 @@ export function LastEditedByIndicator({
|
|
|
64
64
|
const uid = metadata?.updated_by;
|
|
65
65
|
const editedOn = metadata?.updated_on;
|
|
66
66
|
|
|
67
|
-
|
|
67
|
+
const hasData = Boolean(uid || editedOn);
|
|
68
68
|
|
|
69
69
|
const user: User | null | undefined = uid ? getUser?.(uid) : undefined;
|
|
70
70
|
const date = editedOn instanceof Date ? editedOn : (editedOn?.toDate ? editedOn.toDate() : null);
|
|
@@ -74,21 +74,23 @@ export function LastEditedByIndicator({
|
|
|
74
74
|
const photoURL = user?.photoURL;
|
|
75
75
|
|
|
76
76
|
return (
|
|
77
|
-
<div className="flex items-center gap-2 text-xs text-text-secondary dark:text-text-secondary-dark">
|
|
78
|
-
{
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
77
|
+
<div className="flex items-center gap-2 text-xs text-text-secondary dark:text-text-secondary-dark min-h-6">
|
|
78
|
+
{hasData && <>
|
|
79
|
+
{photoURL ? (
|
|
80
|
+
<img
|
|
81
|
+
src={photoURL}
|
|
82
|
+
alt={displayName ?? "User"}
|
|
83
|
+
className="rounded-full object-cover w-6 h-6"
|
|
84
|
+
/>
|
|
85
|
+
) : (
|
|
86
|
+
<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">
|
|
87
|
+
{(displayName ?? "?").charAt(0).toUpperCase()}
|
|
88
|
+
</div>
|
|
89
|
+
)}
|
|
90
|
+
<span>
|
|
91
|
+
{displayName}{timeString ? ` · ${timeString}` : ""}
|
|
92
|
+
</span>
|
|
93
|
+
</>}
|
|
92
94
|
</div>
|
|
93
95
|
);
|
|
94
96
|
}
|