@firecms/core 3.4.0-canary.0ef7442 → 3.4.0-canary.1faa2a9

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.
Files changed (152) hide show
  1. package/README.md +4 -0
  2. package/dist/components/EntityCollectionView/EntityCollectionView.d.ts +3 -2
  3. package/dist/components/EntityCollectionView/EntityCollectionViewActions.d.ts +3 -1
  4. package/dist/components/EntityCollectionView/EntityCollectionViewStartActions.d.ts +3 -1
  5. package/dist/components/ErrorBoundary.d.ts +1 -3
  6. package/dist/components/LicenseBanner.d.ts +23 -0
  7. package/dist/components/common/useDataSourceTableController.d.ts +4 -2
  8. package/dist/components/common/useTableSearchHelper.d.ts +3 -1
  9. package/dist/components/index.d.ts +1 -0
  10. package/dist/contexts/LicenseStatusContext.d.ts +16 -0
  11. package/dist/core/EntityEditView.d.ts +2 -0
  12. package/dist/core/EntityEditViewFormActions.d.ts +1 -1
  13. package/dist/core/index.d.ts +1 -0
  14. package/dist/core/plugin_translations.d.ts +38 -0
  15. package/dist/core/pro_plugins.d.ts +40 -0
  16. package/dist/de-KtBROUvS.js +700 -0
  17. package/dist/de-KtBROUvS.js.map +1 -0
  18. package/dist/editor/extensions/Image.d.ts +11 -0
  19. package/dist/editor/index.d.ts +2 -1
  20. package/dist/editor/lazy_editor.d.ts +6 -0
  21. package/dist/editor-BSo_aS1I.js +4563 -0
  22. package/dist/editor-BSo_aS1I.js.map +1 -0
  23. package/dist/form/EntityForm.d.ts +2 -0
  24. package/dist/form/EntityFormActions.d.ts +2 -0
  25. package/dist/fr-BRFSBaVh.js +700 -0
  26. package/dist/fr-BRFSBaVh.js.map +1 -0
  27. package/dist/hi-DwCkga5X.js +700 -0
  28. package/dist/hi-DwCkga5X.js.map +1 -0
  29. package/dist/hooks/data/delete.d.ts +1 -1
  30. package/dist/hooks/data/useCollectionFetch.d.ts +1 -1
  31. package/dist/hooks/data/useEntityFetch.d.ts +4 -1
  32. package/dist/hooks/index.d.ts +2 -0
  33. package/dist/hooks/useLicenseStatus.d.ts +16 -0
  34. package/dist/hooks/useProjectLog.d.ts +11 -6
  35. package/dist/hooks/useTranslation.d.ts +1 -1
  36. package/dist/i18n/__tests__/FireCMSi18nProvider.test.d.ts +1 -0
  37. package/dist/i18n/__tests__/nested_provider_lifecycle.test.d.ts +1 -0
  38. package/dist/index.es.js +3503 -11244
  39. package/dist/index.es.js.map +1 -1
  40. package/dist/index.umd.js +8028 -7006
  41. package/dist/index.umd.js.map +1 -1
  42. package/dist/it-B2YGgDsx.js +700 -0
  43. package/dist/it-B2YGgDsx.js.map +1 -0
  44. package/dist/pl-BxHkywK8.js +702 -0
  45. package/dist/pl-BxHkywK8.js.map +1 -0
  46. package/dist/pt-q6UV4diT.js +702 -0
  47. package/dist/pt-q6UV4diT.js.map +1 -0
  48. package/dist/types/analytics.d.ts +1 -1
  49. package/dist/types/collections.d.ts +7 -0
  50. package/dist/types/datasource.d.ts +8 -0
  51. package/dist/types/entity_actions.d.ts +6 -0
  52. package/dist/types/entity_callbacks.d.ts +21 -0
  53. package/dist/types/firecms.d.ts +18 -1
  54. package/dist/types/firecms_context.d.ts +8 -0
  55. package/dist/types/index.d.ts +1 -0
  56. package/dist/types/license.d.ts +54 -0
  57. package/dist/types/navigation.d.ts +34 -5
  58. package/dist/types/plugins.d.ts +22 -1
  59. package/dist/types/side_entity_controller.d.ts +3 -2
  60. package/dist/types/translations.d.ts +31 -2
  61. package/dist/util/date_fns_locales.d.ts +18 -0
  62. package/dist/util/entity_cache.d.ts +11 -0
  63. package/dist/util/index.d.ts +1 -0
  64. package/dist/util/lazy_eager.d.ts +3 -3
  65. package/dist/util/navigation_utils.d.ts +84 -2
  66. package/dist/util/parent_references_from_path.d.ts +15 -0
  67. package/dist/util/paths.d.ts +28 -0
  68. package/dist/util/permissions.d.ts +10 -4
  69. package/package.json +3 -3
  70. package/src/app/Scaffold.tsx +7 -0
  71. package/src/components/DeleteEntityDialog.tsx +2 -0
  72. package/src/components/EntityCollectionTable/EntityCollectionRowActions.tsx +2 -2
  73. package/src/components/EntityCollectionView/EntityCollectionBoardView.tsx +8 -0
  74. package/src/components/EntityCollectionView/EntityCollectionView.tsx +40 -15
  75. package/src/components/EntityCollectionView/EntityCollectionViewActions.tsx +6 -2
  76. package/src/components/EntityCollectionView/EntityCollectionViewStartActions.tsx +4 -0
  77. package/src/components/EntityCollectionView/useBoardDataController.tsx +7 -2
  78. package/src/components/EntityPreview.tsx +4 -1
  79. package/src/components/ErrorBoundary.tsx +12 -18
  80. package/src/components/LicenseBanner.tsx +209 -0
  81. package/src/components/ReferenceTable/ReferenceSelectionTable.tsx +8 -2
  82. package/src/components/common/default_entity_actions.tsx +22 -2
  83. package/src/components/common/useDataSourceTableController.tsx +26 -8
  84. package/src/components/common/useTableSearchHelper.ts +5 -0
  85. package/src/components/index.tsx +1 -0
  86. package/src/contexts/LicenseStatusContext.tsx +50 -0
  87. package/src/core/DefaultAppBar.tsx +28 -16
  88. package/src/core/EntityEditView.tsx +8 -12
  89. package/src/core/EntityEditViewFormActions.tsx +3 -2
  90. package/src/core/EntitySidePanel.tsx +6 -4
  91. package/src/core/FireCMS.tsx +73 -47
  92. package/src/core/SideDialogs.tsx +44 -1
  93. package/src/core/index.tsx +1 -0
  94. package/src/core/plugin_translations.ts +87 -0
  95. package/src/core/pro_plugins.ts +79 -0
  96. package/src/editor/components/SlashCommandMenu.tsx +4 -1
  97. package/src/editor/extensions/Image.ts +17 -1
  98. package/src/editor/hooks/useProseMirror.ts +5 -0
  99. package/src/editor/index.ts +11 -1
  100. package/src/editor/lazy_editor.tsx +33 -0
  101. package/src/form/EntityForm.tsx +22 -7
  102. package/src/form/EntityFormActions.tsx +2 -0
  103. package/src/hooks/data/delete.ts +8 -2
  104. package/src/hooks/data/save.ts +4 -1
  105. package/src/hooks/data/useCollectionFetch.tsx +9 -2
  106. package/src/hooks/data/useEntityFetch.tsx +19 -6
  107. package/src/hooks/index.tsx +2 -0
  108. package/src/hooks/useBuildNavigationController.tsx +70 -15
  109. package/src/hooks/useFireCMSContext.tsx +7 -3
  110. package/src/hooks/useLicenseStatus.tsx +32 -0
  111. package/src/hooks/useProjectLog.tsx +27 -9
  112. package/src/hooks/useResolvedNavigationFrom.tsx +1 -1
  113. package/src/hooks/useTranslation.ts +3 -1
  114. package/src/i18n/FireCMSi18nProvider.tsx +199 -25
  115. package/src/i18n/__tests__/FireCMSi18nProvider.test.tsx +91 -0
  116. package/src/i18n/__tests__/nested_provider_lifecycle.test.tsx +67 -0
  117. package/src/internal/useBuildDataSource.ts +13 -12
  118. package/src/internal/useBuildSideEntityController.tsx +13 -5
  119. package/src/locales/de.ts +16 -2
  120. package/src/locales/en.ts +18 -2
  121. package/src/locales/es.ts +16 -2
  122. package/src/locales/fr.ts +16 -2
  123. package/src/locales/hi.ts +16 -2
  124. package/src/locales/it.ts +16 -2
  125. package/src/locales/pl.ts +16 -2
  126. package/src/locales/pt.ts +16 -2
  127. package/src/preview/components/DatePreview.tsx +2 -4
  128. package/src/preview/components/ReferencePreview.tsx +7 -3
  129. package/src/routes/FireCMSRoute.tsx +9 -4
  130. package/src/types/analytics.ts +3 -0
  131. package/src/types/collections.ts +8 -0
  132. package/src/types/datasource.ts +8 -0
  133. package/src/types/entity_actions.tsx +6 -0
  134. package/src/types/entity_callbacks.ts +24 -0
  135. package/src/types/firecms.tsx +19 -1
  136. package/src/types/firecms_context.tsx +9 -0
  137. package/src/types/index.ts +1 -0
  138. package/src/types/license.ts +62 -0
  139. package/src/types/navigation.ts +35 -5
  140. package/src/types/plugins.tsx +23 -1
  141. package/src/types/side_entity_controller.tsx +3 -2
  142. package/src/types/translations.ts +31 -2
  143. package/src/util/date_fns_locales.ts +168 -0
  144. package/src/util/entity_cache.ts +18 -0
  145. package/src/util/index.ts +1 -0
  146. package/src/util/lazy_eager.tsx +30 -8
  147. package/src/util/navigation_from_path.ts +6 -1
  148. package/src/util/navigation_utils.ts +204 -2
  149. package/src/util/parent_references_from_path.ts +32 -1
  150. package/src/util/paths.ts +40 -3
  151. package/src/util/permissions.ts +22 -10
  152. package/src/util/useStorageUploadController.tsx +6 -1
package/README.md CHANGED
@@ -145,6 +145,10 @@ Keep in mind you need to update the dependencies in that project if you want to
145
145
  use it as it is, without linking it to the library source code. More details in
146
146
  its README
147
147
 
148
+ ## Who builds this
149
+
150
+ Built and maintained by [Camberi](https://camberi.com?utm_source=firecms&utm_medium=referral&utm_campaign=built-by), a product engineering studio in Madrid and Munich that also builds for clients.
151
+
148
152
  ## Contact and support
149
153
 
150
154
  If you need general support, you can open a GitHub issue.
@@ -16,8 +16,9 @@ export type EntityCollectionViewProps<M extends Record<string, any>> = {
16
16
  /**
17
17
  * `fullPath` split at its real segment boundaries, e.g. `["nodes", "node/42", "edges"]`.
18
18
  * Forwarded to the datasource so a parent entity id containing "/" stays unambiguous.
19
- * Defaults to splitting `fullPath`, which is correct for any backend whose ids cannot
20
- * contain "/".
19
+ *
20
+ * Optional, and never derived by splitting `fullPath` — a guess would be wrong in
21
+ * exactly the case the field exists for. Absent means "not known here", not "no slashes".
21
22
  */
22
23
  pathSegments?: string[];
23
24
  /**
@@ -3,6 +3,8 @@ import { EntityCollection, EntityTableController, SelectionController } from "..
3
3
  export type EntityCollectionViewActionsProps<M extends Record<string, any>> = {
4
4
  collection: EntityCollection<M>;
5
5
  path: string;
6
+ /** `path` split at its real segment boundaries, when known. Never derived from `path`. */
7
+ pathSegments?: string[];
6
8
  relativePath: string;
7
9
  parentCollectionIds: string[];
8
10
  selectionEnabled: boolean;
@@ -12,4 +14,4 @@ export type EntityCollectionViewActionsProps<M extends Record<string, any>> = {
12
14
  tableController: EntityTableController<M>;
13
15
  collectionEntitiesCount?: number;
14
16
  };
15
- export declare function EntityCollectionViewActions<M extends Record<string, any>>({ collection, relativePath, parentCollectionIds, onNewClick, onMultipleDeleteClick, selectionEnabled, path, selectionController, tableController, collectionEntitiesCount, }: EntityCollectionViewActionsProps<M>): React.JSX.Element;
17
+ export declare function EntityCollectionViewActions<M extends Record<string, any>>({ collection, relativePath, parentCollectionIds, onNewClick, onMultipleDeleteClick, selectionEnabled, path, pathSegments, selectionController, tableController, collectionEntitiesCount, }: EntityCollectionViewActionsProps<M>): React.JSX.Element;
@@ -3,6 +3,8 @@ import { EntityCollection, EntityTableController, ResolvedProperty, SelectionCon
3
3
  export type EntityCollectionViewStartActionsProps<M extends Record<string, any>> = {
4
4
  collection: EntityCollection<M>;
5
5
  path: string;
6
+ /** `path` split at its real segment boundaries, when known. Never derived from `path`. */
7
+ pathSegments?: string[];
6
8
  relativePath: string;
7
9
  parentCollectionIds: string[];
8
10
  selectionController: SelectionController<M>;
@@ -13,4 +15,4 @@ export type EntityCollectionViewStartActionsProps<M extends Record<string, any>>
13
15
  */
14
16
  resolvedProperties?: Record<string, ResolvedProperty>;
15
17
  };
16
- export declare function EntityCollectionViewStartActions<M extends Record<string, any>>({ collection, relativePath, parentCollectionIds, path, selectionController, tableController, collectionEntitiesCount, resolvedProperties }: EntityCollectionViewStartActionsProps<M>): React.JSX.Element;
18
+ export declare function EntityCollectionViewStartActions<M extends Record<string, any>>({ collection, relativePath, parentCollectionIds, path, pathSegments, selectionController, tableController, collectionEntitiesCount, resolvedProperties }: EntityCollectionViewStartActionsProps<M>): React.JSX.Element;
@@ -1,11 +1,9 @@
1
1
  import React, { ErrorInfo, PropsWithChildren } from "react";
2
2
  export declare class ErrorBoundary extends React.Component<PropsWithChildren<Record<string, unknown>>, {
3
- hasError: boolean;
4
- error?: Error;
3
+ error: Error | null;
5
4
  }> {
6
5
  constructor(props: any);
7
6
  static getDerivedStateFromError(error: Error): {
8
- hasError: boolean;
9
7
  error: Error;
10
8
  };
11
9
  componentDidCatch(error: Error, errorInfo: ErrorInfo): void;
@@ -0,0 +1,23 @@
1
+ import React from "react";
2
+ /**
3
+ * @group Components
4
+ */
5
+ export interface LicenseBannerProps {
6
+ /**
7
+ * Applied to the banner's outer element when there is something to show.
8
+ */
9
+ className?: string;
10
+ style?: React.CSSProperties;
11
+ }
12
+ /**
13
+ * Tells the user where their FireCMS PRO license stands: days left in the
14
+ * trial, a paused state, or a license that covers fewer projects than are
15
+ * linked to it. Renders nothing when licensed, when no license is needed, and
16
+ * while the status is unknown.
17
+ *
18
+ * The default `Scaffold` already renders it above the main content. Place it
19
+ * yourself only in a custom layout.
20
+ *
21
+ * @group Components
22
+ */
23
+ export declare function LicenseBanner({ className, style }: LicenseBannerProps): React.JSX.Element | null;
@@ -7,8 +7,10 @@ export type DataSourceTableControllerProps<M extends Record<string, any> = any>
7
7
  fullPath: string;
8
8
  /**
9
9
  * `fullPath` split at its real segment boundaries. Passed through to the datasource so
10
- * a parent entity id containing "/" stays unambiguous. Defaults to splitting
11
- * `fullPath`, which is correct for any backend whose ids cannot contain "/".
10
+ * a parent entity id containing "/" stays unambiguous.
11
+ *
12
+ * Optional, and never derived by splitting `fullPath` — a guess would be wrong in
13
+ * exactly the case the field exists for. Absent means "not known here", not "no slashes".
12
14
  */
13
15
  pathSegments?: string[];
14
16
  /**
@@ -2,6 +2,8 @@ import { EntityCollection } from "../../types";
2
2
  export interface UseTableSearchHelperParams<M extends Record<string, any>> {
3
3
  collection: EntityCollection<M>;
4
4
  fullPath: string;
5
+ /** `fullPath` split at its real segment boundaries, when known. Never derived from it. */
6
+ pathSegments?: string[];
5
7
  parentCollectionIds?: string[];
6
8
  /**
7
9
  * Search term that is already being applied without the user having gone through the
@@ -10,7 +12,7 @@ export interface UseTableSearchHelperParams<M extends Record<string, any>> {
10
12
  */
11
13
  initialSearchString?: string;
12
14
  }
13
- export declare function useTableSearchHelper<M extends Record<string, any>>({ collection, fullPath, parentCollectionIds, initialSearchString }: UseTableSearchHelperParams<M>): {
15
+ export declare function useTableSearchHelper<M extends Record<string, any>>({ collection, fullPath, pathSegments, parentCollectionIds, initialSearchString }: UseTableSearchHelperParams<M>): {
14
16
  textSearchLoading: boolean;
15
17
  textSearchInitialised: boolean;
16
18
  onTextSearchClick: (() => void) | undefined;
@@ -30,3 +30,4 @@ export * from "./FieldCaption";
30
30
  export * from "./EntityPreview";
31
31
  export * from "./AIIcon";
32
32
  export * from "./LanguageToggle";
33
+ export * from "./LicenseBanner";
@@ -0,0 +1,16 @@
1
+ import React from "react";
2
+ import { AccessResponse } from "../types";
3
+ /**
4
+ * License status of the enclosing `FireCMS`. `undefined` means there is no
5
+ * `FireCMS` above; `null` means the check has not answered (or was skipped).
6
+ * @internal
7
+ */
8
+ export declare const LicenseStatusContext: React.Context<AccessResponse | null | undefined>;
9
+ /** @internal */
10
+ export declare function getLicenseStatusSnapshot(): AccessResponse | null;
11
+ /** @internal */
12
+ export declare function getServerLicenseStatusSnapshot(): AccessResponse | null;
13
+ /** @internal */
14
+ export declare function subscribeLicenseStatus(listener: () => void): () => void;
15
+ /** @internal */
16
+ export declare function publishLicenseStatus(status: AccessResponse | null): void;
@@ -7,6 +7,8 @@ export type OnUpdateParams = {
7
7
  entity: Entity<any>;
8
8
  status: EntityStatus;
9
9
  path: string;
10
+ /** `path` split at its real segment boundaries, when known. Never derived from `path`. */
11
+ pathSegments?: string[];
10
12
  entityId?: string;
11
13
  selectedTab?: string;
12
14
  collection: EntityCollection<any>;
@@ -1,3 +1,3 @@
1
1
  import React from "react";
2
2
  import { EntityFormActionsProps } from "../form/EntityFormActions";
3
- export declare function EntityEditViewFormActions({ collection, path, entity, layout, savingError, formex, disabled, status, pluginActions, openEntityMode, showDefaultActions, navigateBack, formContext }: EntityFormActionsProps): React.JSX.Element;
3
+ export declare function EntityEditViewFormActions({ collection, path, pathSegments, entity, layout, savingError, formex, disabled, status, pluginActions, openEntityMode, showDefaultActions, navigateBack, formContext }: EntityFormActionsProps): React.JSX.Element;
@@ -1,4 +1,5 @@
1
1
  export * from "./FireCMS";
2
+ export * from "./pro_plugins";
2
3
  export * from "./DefaultDrawer";
3
4
  export * from "./DrawerNavigationItem";
4
5
  export * from "./DrawerNavigationGroup";
@@ -0,0 +1,38 @@
1
+ import type { i18n } from "i18next";
2
+ import { FireCMSPlugin } from "../types";
3
+ /**
4
+ * Record of which bundles have already been written to which locale, so the
5
+ * same one is never written twice.
6
+ *
7
+ * Plugin translation objects are module-level constants and a lazily loaded one
8
+ * resolves to the same module object every time, so identity is a sound test.
9
+ */
10
+ export type AppliedBundles = Map<string, Set<object>>;
11
+ export declare function createAppliedBundles(): AppliedBundles;
12
+ /**
13
+ * Write the plugins' strings for one language into a live i18next instance.
14
+ *
15
+ * Only the language in use is resolved, plus English, which every other language
16
+ * falls back to — a locale given as a function is a bundle that has not been
17
+ * downloaded yet, and downloading all of them would undo the point of deferring
18
+ * them. Plain records are applied for every locale, as before: they are already
19
+ * in the bundle, so there is nothing to save by holding them back.
20
+ *
21
+ * `applied` is what stops the injection feeding itself. A write raises a store
22
+ * event; the event repaints everything subscribed to this instance, including
23
+ * the component that owns the `plugins` array — the collection editor and SaaS
24
+ * plugin hooks both call `useTranslation` — and that array is an inline literal,
25
+ * so its fresh identity re-runs the effect that called this. react-i18next
26
+ * happens to stop re-rendering after one pass, but that is a bail-out rather
27
+ * than a guarantee, and the redundant writes are worth avoiding regardless.
28
+ *
29
+ * Returns a function that reports whether the caller is still mounted, so a
30
+ * bundle that arrives after unmount is dropped rather than written.
31
+ */
32
+ export declare function applyPluginTranslations({ i18n, plugins, language, applied, isActive }: {
33
+ i18n: i18n;
34
+ plugins?: FireCMSPlugin<any, any, any>[];
35
+ language: string;
36
+ applied: AppliedBundles;
37
+ isActive?: () => boolean;
38
+ }): void;
@@ -0,0 +1,40 @@
1
+ import { AccessResponse, FireCMSPlugin } from "../types";
2
+ /**
3
+ * Keys of the plugins that need a FireCMS PRO license.
4
+ *
5
+ * Kept in sync by hand with `PRO_PLUGIN_KEYS` in
6
+ * `saas_backend/functions/src/business_rules/licenses.ts`, which decides from
7
+ * the same list whether a project needs a license. Change both together.
8
+ *
9
+ * @group Core
10
+ */
11
+ export declare const PRO_PLUGIN_KEYS: readonly string[];
12
+ /**
13
+ * Whether PRO features are paused for this license status. Any `blocked`
14
+ * response pauses them, whatever its `licenseState` (`expired` and
15
+ * `invalid_project` both come with it). An unknown status pauses nothing.
16
+ *
17
+ * @group Core
18
+ */
19
+ export declare function isProPaused(licenseStatus?: AccessResponse | null): boolean;
20
+ /**
21
+ * Whether this plugin is dropped while PRO is paused.
22
+ *
23
+ * @group Core
24
+ */
25
+ export declare function isPausedPlugin(plugin: Pick<FireCMSPlugin, "key">): boolean;
26
+ /**
27
+ * Where to get or fix the license for this status: the server's
28
+ * `subscribeUrl` when it is an https URL, otherwise the license page on
29
+ * app.firecms.co with the project, when known.
30
+ *
31
+ * @group Core
32
+ */
33
+ export declare function getLicenseSubscribeUrl(licenseStatus?: AccessResponse | null): string;
34
+ /**
35
+ * The plugins that stay active under this license status. Returns the same
36
+ * array when nothing is dropped, so it can feed memo and effect dependencies.
37
+ *
38
+ * @group Core
39
+ */
40
+ export declare function filterPausedPlugins<P extends Pick<FireCMSPlugin, "key">>(plugins: P[] | undefined, licenseStatus?: AccessResponse | null): P[] | undefined;