@firecms/core 3.0.0-canary.54 → 3.0.0-canary.56

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 (52) hide show
  1. package/dist/components/EntityCollectionTable/fields/TableReferenceField.d.ts +2 -0
  2. package/dist/components/EntityCollectionTable/internal/EntityTableCell.d.ts +2 -2
  3. package/dist/components/EntityPreview.d.ts +3 -2
  4. package/dist/components/FireCMSAppBar.d.ts +2 -1
  5. package/dist/components/ReferenceWidget.d.ts +3 -1
  6. package/dist/components/SelectableTable/filters/ReferenceFilterField.d.ts +2 -1
  7. package/dist/components/VirtualTable/VirtualTableProps.d.ts +1 -6
  8. package/dist/components/VirtualTable/types.d.ts +3 -3
  9. package/dist/components/common/table_height.d.ts +5 -0
  10. package/dist/index.es.js +2990 -2947
  11. package/dist/index.es.js.map +1 -1
  12. package/dist/index.umd.js +5 -5
  13. package/dist/index.umd.js.map +1 -1
  14. package/dist/preview/components/ReferencePreview.d.ts +2 -1
  15. package/dist/types/collections.d.ts +1 -1
  16. package/dist/types/properties.d.ts +8 -0
  17. package/dist/util/objects.d.ts +1 -1
  18. package/package.json +4 -4
  19. package/src/components/EntityCollectionTable/EntityCollectionTable.tsx +1 -1
  20. package/src/components/EntityCollectionTable/PropertyTableCell.tsx +5 -2
  21. package/src/components/EntityCollectionTable/fields/TableReferenceField.tsx +9 -1
  22. package/src/components/EntityCollectionTable/internal/EntityTableCell.tsx +2 -3
  23. package/src/components/EntityPreview.tsx +6 -4
  24. package/src/components/FireCMSAppBar.tsx +5 -2
  25. package/src/components/ReferenceWidget.tsx +19 -9
  26. package/src/components/SearchIconsView.tsx +1 -1
  27. package/src/components/SelectableTable/SelectableTable.tsx +4 -2
  28. package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +4 -1
  29. package/src/components/VirtualTable/VirtualTable.tsx +7 -8
  30. package/src/components/VirtualTable/VirtualTableProps.tsx +1 -6
  31. package/src/components/VirtualTable/VirtualTableRow.tsx +2 -3
  32. package/src/components/VirtualTable/types.tsx +2 -3
  33. package/src/components/{VirtualTable/common.tsx → common/table_height.tsx} +5 -2
  34. package/src/core/EntityEditView.tsx +3 -2
  35. package/src/core/FireCMS.tsx +33 -36
  36. package/src/core/field_configs.tsx +1 -1
  37. package/src/form/EntityForm.tsx +7 -10
  38. package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +2 -0
  39. package/src/form/field_bindings/ReferenceFieldBinding.tsx +15 -13
  40. package/src/form/field_bindings/SelectFieldBinding.tsx +0 -3
  41. package/src/hooks/data/save.ts +2 -0
  42. package/src/hooks/useBuildLocalConfigurationPersistence.tsx +2 -3
  43. package/src/hooks/useBuildNavigationController.tsx +1 -1
  44. package/src/hooks/useValidateAuthenticator.tsx +15 -15
  45. package/src/preview/PropertyPreview.tsx +2 -1
  46. package/src/preview/components/ReferencePreview.tsx +21 -22
  47. package/src/preview/property_previews/ArrayOfReferencesPreview.tsx +2 -0
  48. package/src/preview/property_previews/NumberPropertyPreview.tsx +0 -1
  49. package/src/types/collections.ts +5 -2
  50. package/src/types/properties.ts +10 -0
  51. package/src/util/objects.ts +8 -7
  52. package/dist/components/VirtualTable/common.d.ts +0 -2
@@ -1,9 +1,9 @@
1
1
  import React, { useMemo } from "react";
2
2
 
3
3
  import { CustomizationController, EntityCollection, FireCMSContext, FireCMSPlugin, FireCMSProps, User } from "../types";
4
- import { AuthControllerContext, ModeControllerContext } from "../contexts";
4
+ import { AuthControllerContext } from "../contexts";
5
5
  import { useBuildSideEntityController } from "../internal/useBuildSideEntityController";
6
- import { useCustomizationController, useFireCMSContext, useModeController } from "../hooks";
6
+ import { useCustomizationController, useFireCMSContext } from "../hooks";
7
7
  import { useBuildSideDialogsController } from "../internal/useBuildSideDialogsController";
8
8
  import { ErrorView } from "../components";
9
9
  import { StorageSourceContext } from "../contexts/StorageSourceContext";
@@ -33,7 +33,6 @@ import { useProjectLog } from "../hooks/useProjectLog";
33
33
  */
34
34
  export function FireCMS<UserType extends User, EC extends EntityCollection>(props: FireCMSProps<UserType, EC>) {
35
35
 
36
- const modeController = useModeController();
37
36
  const {
38
37
  children,
39
38
  entityLinkBuilder,
@@ -122,39 +121,37 @@ export function FireCMS<UserType extends User, EC extends EntityCollection>(prop
122
121
  }
123
122
 
124
123
  return (
125
- <ModeControllerContext.Provider value={modeController}>
126
- <AnalyticsContext.Provider value={analyticsController}>
127
- <CustomizationControllerContext.Provider value={customizationController}>
128
- <UserConfigurationPersistenceContext.Provider
129
- value={userConfigPersistence}>
130
- <StorageSourceContext.Provider
131
- value={storageSource}>
132
- <DataSourceContext.Provider
133
- value={dataSource}>
134
- <AuthControllerContext.Provider
135
- value={authController}>
136
- <SideDialogsControllerContext.Provider
137
- value={sideDialogsController}>
138
- <SideEntityControllerContext.Provider
139
- value={sideEntityController}>
140
- <NavigationContext.Provider
141
- value={navigationController}>
142
- <DialogsProvider>
143
- <FireCMSInternal
144
- loading={loading}>
145
- {children}
146
- </FireCMSInternal>
147
- </DialogsProvider>
148
- </NavigationContext.Provider>
149
- </SideEntityControllerContext.Provider>
150
- </SideDialogsControllerContext.Provider>
151
- </AuthControllerContext.Provider>
152
- </DataSourceContext.Provider>
153
- </StorageSourceContext.Provider>
154
- </UserConfigurationPersistenceContext.Provider>
155
- </CustomizationControllerContext.Provider>
156
- </AnalyticsContext.Provider>
157
- </ModeControllerContext.Provider>
124
+ <AnalyticsContext.Provider value={analyticsController}>
125
+ <CustomizationControllerContext.Provider value={customizationController}>
126
+ <UserConfigurationPersistenceContext.Provider
127
+ value={userConfigPersistence}>
128
+ <StorageSourceContext.Provider
129
+ value={storageSource}>
130
+ <DataSourceContext.Provider
131
+ value={dataSource}>
132
+ <AuthControllerContext.Provider
133
+ value={authController}>
134
+ <SideDialogsControllerContext.Provider
135
+ value={sideDialogsController}>
136
+ <SideEntityControllerContext.Provider
137
+ value={sideEntityController}>
138
+ <NavigationContext.Provider
139
+ value={navigationController}>
140
+ <DialogsProvider>
141
+ <FireCMSInternal
142
+ loading={loading}>
143
+ {children}
144
+ </FireCMSInternal>
145
+ </DialogsProvider>
146
+ </NavigationContext.Provider>
147
+ </SideEntityControllerContext.Provider>
148
+ </SideDialogsControllerContext.Provider>
149
+ </AuthControllerContext.Provider>
150
+ </DataSourceContext.Provider>
151
+ </StorageSourceContext.Provider>
152
+ </UserConfigurationPersistenceContext.Provider>
153
+ </CustomizationControllerContext.Provider>
154
+ </AnalyticsContext.Provider>
158
155
  );
159
156
 
160
157
  }
@@ -331,7 +331,7 @@ export function getFieldConfig(property: Property | ResolvedProperty, propertyCo
331
331
  }
332
332
  const defaultFieldConfig = DEFAULT_FIELD_CONFIGS[defaultFieldId];
333
333
  const customField = fieldId ? propertyConfigs[fieldId] : undefined;
334
- return mergeDeep(defaultFieldConfig ?? {}, customField ?? {});
334
+ return mergeDeep(defaultFieldConfig ?? {}, customField ?? {} as PropertyConfig);
335
335
  }
336
336
 
337
337
  export function getDefaultFieldId(property: Property | ResolvedProperty) {
@@ -35,12 +35,9 @@ import {
35
35
  } from "../hooks";
36
36
  import { ErrorFocus } from "./components/ErrorFocus";
37
37
  import { CustomIdField } from "./components/CustomIdField";
38
- import { Alert, Button, cn, DialogActions, IconButton, Tooltip, Typography } from "@firecms/ui";
39
- import { ErrorBoundary } from "../components";
40
- import {
41
- copyEntityAction,
42
- deleteEntityAction
43
- } from "../components/common/default_entity_actions";
38
+ import { Alert, Button, CircularProgress, cn, DialogActions, IconButton, Tooltip, Typography } from "@firecms/ui";
39
+ import { CircularProgressCenter, ErrorBoundary } from "../components";
40
+ import { copyEntityAction, deleteEntityAction } from "../components/common/default_entity_actions";
44
41
  import { useAnalyticsController } from "../hooks/useAnalyticsController";
45
42
  import { ValidationError } from "yup";
46
43
  import { PropertyIdCopyTooltipContent } from "../components/PropertyIdCopyTooltipContent";
@@ -674,10 +671,10 @@ function InnerForm<M extends Record<string, any>>(props: FormexController<M> & {
674
671
  </IconButton>
675
672
  ))}
676
673
  </div>}
677
-
674
+ {isSubmitting && <CircularProgress size={"small"}/>}
678
675
  <Button
679
676
  variant="text"
680
- disabled={disabled}
677
+ disabled={disabled || isSubmitting}
681
678
  type="reset"
682
679
  >
683
680
  {status === "existing" ? "Discard" : "Clear"}
@@ -687,7 +684,7 @@ function InnerForm<M extends Record<string, any>>(props: FormexController<M> & {
687
684
  variant="text"
688
685
  color="primary"
689
686
  type="submit"
690
- disabled={disabled}
687
+ disabled={disabled || isSubmitting}
691
688
  onClick={() => {
692
689
  closeAfterSaveRef.current = false;
693
690
  }}
@@ -701,7 +698,7 @@ function InnerForm<M extends Record<string, any>>(props: FormexController<M> & {
701
698
  variant="filled"
702
699
  color="primary"
703
700
  type="submit"
704
- disabled={disabled}
701
+ disabled={disabled || isSubmitting}
705
702
  onClick={() => {
706
703
  closeAfterSaveRef.current = true;
707
704
  }}
@@ -88,6 +88,8 @@ export function ArrayOfReferencesFieldBinding({
88
88
  onClick={onEntryClick}
89
89
  hover={!disabled}
90
90
  reference={entryValue}
91
+ includeId={ofProperty.includeId}
92
+ includeEntityLink={ofProperty.includeEntityLink}
91
93
  />
92
94
  );
93
95
  }, [ofProperty.path, ofProperty.previewProperties, value]);
@@ -27,19 +27,19 @@ export function ReferenceFieldBinding<M extends Record<string, any>>(props: Fiel
27
27
 
28
28
  }
29
29
 
30
- function ReferenceFieldBindingInternal<M extends Record<string, any>>({
31
- value,
32
- setValue,
33
- error,
34
- showError,
35
- isSubmitting,
36
- disabled,
37
- touched,
38
- autoFocus,
39
- property,
40
- includeDescription,
41
- context
42
- }: FieldProps<EntityReference>) {
30
+ function ReferenceFieldBindingInternal({
31
+ value,
32
+ setValue,
33
+ error,
34
+ showError,
35
+ isSubmitting,
36
+ disabled,
37
+ touched,
38
+ autoFocus,
39
+ property,
40
+ includeDescription,
41
+ context
42
+ }: FieldProps<EntityReference>) {
43
43
  if (!property.path) {
44
44
  throw new Error("Property path is required for ReferenceFieldBinding");
45
45
  }
@@ -99,6 +99,8 @@ function ReferenceFieldBindingInternal<M extends Record<string, any>>({
99
99
  size={"medium"}
100
100
  onClick={disabled || isSubmitting ? undefined : onEntryClick}
101
101
  reference={value}
102
+ includeEntityLink={property.includeEntityLink}
103
+ includeId={property.includeId}
102
104
  />}
103
105
 
104
106
  {!value && <div className="justify-center text-left">
@@ -30,8 +30,6 @@ export function SelectFieldBinding<T extends EnumType>({
30
30
  includeDescription
31
31
  }: SelectProps<T>) {
32
32
 
33
- console.log("SelectFieldBinding", propertyKey, value,)
34
-
35
33
  const enumValues = property.enumValues;
36
34
 
37
35
  useClearRestoreValue({
@@ -72,7 +70,6 @@ export function SelectFieldBinding<T extends EnumType>({
72
70
  return setValue(newValue as T);
73
71
  }}
74
72
  renderValue={(enumKey: any) => {
75
- console.log("renderValue", enumKey)
76
73
  return <EnumValuesChip
77
74
  enumKey={enumKey}
78
75
  enumValues={enumValues}
@@ -108,6 +108,7 @@ export async function saveEntityWithCallbacks<M extends Record<string, any>, Use
108
108
  updatedValues = values;
109
109
  }
110
110
 
111
+ console.log("Saving entity", entityId, updatedValues);
111
112
  return dataSource.saveEntity({
112
113
  collection,
113
114
  path: resolvedPath,
@@ -116,6 +117,7 @@ export async function saveEntityWithCallbacks<M extends Record<string, any>, Use
116
117
  previousValues,
117
118
  status
118
119
  }).then((entity) => {
120
+ console.log("Entity saved");
119
121
  try {
120
122
  if (callbacks?.onSaveSuccess) {
121
123
  const resolvedCollection = resolveCollection<M>({
@@ -22,10 +22,9 @@ export function useBuildLocalConfigurationPersistence(): UserConfigurationPersis
22
22
  const onCollectionModified = useCallback(<M extends Record<string, any>>(path: string, data: PartialEntityCollection<M>) => {
23
23
  const storageKey = `collection_config::${stripCollectionPath(path)}`;
24
24
  localStorage.setItem(storageKey, JSON.stringify(data));
25
- const currentCache = configCache.current;
26
- const cachedConfig = currentCache[storageKey];
25
+ const cachedConfig = configCache.current[storageKey];
27
26
  const newConfig = mergeDeep(cachedConfig ?? getCollectionFromStorage(path), data);
28
- configCache.current = mergeDeep(currentCache, newConfig);
27
+ configCache.current[storageKey] = mergeDeep(configCache.current[storageKey], newConfig);
29
28
  }, [getCollectionFromStorage]);
30
29
 
31
30
  const [recentlyVisitedPaths, _setRecentlyVisitedPaths] = useState<string[]>([]);
@@ -250,7 +250,7 @@ export function useBuildNavigationController<EC extends EntityCollection, UserTy
250
250
  const baseCollection = getCollectionByPathOrId(removeInitialAndTrailingSlashes(idOrPath), collections);
251
251
 
252
252
  const userOverride = includeUserOverride ? userConfigPersistence?.getCollectionConfig(idOrPath) : undefined;
253
- const overriddenCollection = baseCollection ? mergeDeep(baseCollection, userOverride) : undefined;
253
+ const overriddenCollection = baseCollection ? mergeDeep(baseCollection, userOverride ?? {}) : undefined;
254
254
 
255
255
  let result: Partial<EntityCollection> | undefined = overriddenCollection;
256
256
 
@@ -11,20 +11,21 @@ import { AuthController, Authenticator, DataSourceDelegate, StorageSource, User
11
11
  * @param storageSource
12
12
  * @param dataSourceDelegate
13
13
  */
14
- export function useValidateAuthenticator<UserType extends User = User, Controller extends AuthController<UserType> = AuthController<UserType>>({
15
- disabled,
16
- authController,
17
- authenticator,
18
- storageSource,
19
- dataSourceDelegate
20
- }:
21
- {
22
- disabled?: boolean,
23
- authController: Controller,
24
- authenticator?: boolean | Authenticator<UserType, Controller>,
25
- dataSourceDelegate: DataSourceDelegate;
26
- storageSource: StorageSource;
27
- }): {
14
+ export function useValidateAuthenticator<UserType extends User = User, Controller extends AuthController<UserType> = AuthController<UserType>>
15
+ ({
16
+ disabled,
17
+ authController,
18
+ authenticator,
19
+ storageSource,
20
+ dataSourceDelegate
21
+ }:
22
+ {
23
+ disabled?: boolean,
24
+ authController: Controller,
25
+ authenticator?: boolean | Authenticator<UserType, Controller>,
26
+ dataSourceDelegate: DataSourceDelegate;
27
+ storageSource: StorageSource;
28
+ }): {
28
29
  canAccessMainView: boolean,
29
30
  authLoading: boolean,
30
31
  notAllowedError: any,
@@ -70,7 +71,6 @@ export function useValidateAuthenticator<UserType extends User = User, Controlle
70
71
  }
71
72
 
72
73
  const delegateUser = authController.user;
73
- console.debug("Checking authentication for user", delegateUser);
74
74
 
75
75
  if (authenticator instanceof Function && delegateUser && !equal(checkedUserRef.current?.uid, delegateUser.uid)) {
76
76
  setAuthLoading(true);
@@ -171,8 +171,9 @@ export const PropertyPreview = React.memo(function PropertyPreview<T extends CMS
171
171
  content = <ReferencePreview
172
172
  disabled={!property.path}
173
173
  previewProperties={property.previewProperties}
174
+ includeId={property.includeId}
175
+ includeEntityLink={property.includeEntityLink}
174
176
  size={props.size}
175
- // onClick={props.onClick}
176
177
  reference={value as EntityReference}
177
178
  />;
178
179
  } else {
@@ -1,16 +1,10 @@
1
1
  import * as React from "react";
2
2
 
3
3
  import { Entity, EntityCollection, EntityReference } from "../../types";
4
- import {
5
- useCustomizationController,
6
- useEntityFetch,
7
- useNavigationController,
8
- useSideEntityController
9
- } from "../../hooks";
4
+ import { useCustomizationController, useEntityFetch, useNavigationController } from "../../hooks";
10
5
  import { PreviewSize } from "../PropertyPreviewProps";
11
- import { IconButton, KeyboardTabIcon, Skeleton, Tooltip } from "@firecms/ui";
6
+ import { Skeleton } from "@firecms/ui";
12
7
  import { ErrorView } from "../../components";
13
- import { useAnalyticsController } from "../../hooks/useAnalyticsController";
14
8
  import { EntityPreview, EntityPreviewContainer } from "../../components/EntityPreview";
15
9
 
16
10
  export type ReferencePreviewProps = {
@@ -20,7 +14,8 @@ export type ReferencePreviewProps = {
20
14
  previewProperties?: string[];
21
15
  onClick?: (e: React.SyntheticEvent) => void;
22
16
  hover?: boolean;
23
- allowEntityNavigation?: boolean;
17
+ includeEntityLink?: boolean;
18
+ includeId?: boolean;
24
19
  };
25
20
 
26
21
  /**
@@ -46,19 +41,20 @@ function areEqual(prevProps: ReferencePreviewProps, nextProps: ReferencePreviewP
46
41
  prevProps.hover === nextProps.hover &&
47
42
  prevProps.reference?.id === nextProps.reference?.id &&
48
43
  prevProps.reference?.path === nextProps.reference?.path &&
49
- prevProps.allowEntityNavigation === nextProps.allowEntityNavigation
44
+ prevProps.includeEntityLink === nextProps.includeEntityLink
50
45
  ;
51
46
  }
52
47
 
53
- function ReferencePreviewInternal<M extends Record<string, any>>({
54
- disabled,
55
- reference,
56
- previewProperties,
57
- size,
58
- hover,
59
- onClick,
60
- allowEntityNavigation = true
61
- }: ReferencePreviewProps) {
48
+ function ReferencePreviewInternal({
49
+ disabled,
50
+ reference,
51
+ previewProperties,
52
+ size,
53
+ hover,
54
+ onClick,
55
+ includeEntityLink = true,
56
+ includeId = true
57
+ }: ReferencePreviewProps) {
62
58
 
63
59
  const customizationController = useCustomizationController();
64
60
 
@@ -79,7 +75,8 @@ function ReferencePreviewInternal<M extends Record<string, any>>({
79
75
  previewProperties={previewProperties}
80
76
  size={size}
81
77
  disabled={disabled}
82
- allowEntityNavigation={allowEntityNavigation}
78
+ includeEntityLink={includeEntityLink}
79
+ includeId={includeId}
83
80
  onClick={onClick}
84
81
  hover={hover}/>
85
82
  }
@@ -90,7 +87,8 @@ function ReferencePreviewExisting<M extends Record<string, any> = any>({
90
87
  previewProperties,
91
88
  size,
92
89
  disabled,
93
- allowEntityNavigation,
90
+ includeEntityLink,
91
+ includeId,
94
92
  onClick,
95
93
  hover
96
94
  }: ReferencePreviewProps & {
@@ -158,7 +156,8 @@ function ReferencePreviewExisting<M extends Record<string, any> = any>({
158
156
  entity={usedEntity}
159
157
  collection={collection}
160
158
  onClick={onClick}
161
- includeEntityNavigation={allowEntityNavigation}
159
+ includeEntityLink={includeEntityLink}
160
+ includeId={includeId}
162
161
  hover={hover}/>;
163
162
 
164
163
  }
@@ -42,6 +42,8 @@ export function ArrayOfReferencesPreview({
42
42
  previewProperties={ofProperty.previewProperties}
43
43
  size={childSize}
44
44
  reference={reference}
45
+ includeId={ofProperty.includeId}
46
+ includeEntityLink={ofProperty.includeEntityLink}
45
47
  />
46
48
  </div>;
47
49
  }
@@ -15,7 +15,6 @@ export function NumberPropertyPreview({
15
15
  if (property.enumValues) {
16
16
  const enumKey = value;
17
17
  const enumValues = enumToObjectEntries(property.enumValues);
18
- console.log("NumberPropertyPreview", enumValues)
19
18
  if (!enumValues)
20
19
  return <>{value}</>;
21
20
  return <EnumValuesChip
@@ -112,7 +112,7 @@ export interface EntityCollection<M extends Record<string, any> = any, UserType
112
112
  * `hidden` in the property definition,will be ignored.
113
113
  * `propertiesOrder` has precedence over `hidden`.
114
114
  */
115
- propertiesOrder?: Extract<keyof M, string>[];
115
+ propertiesOrder?: (Extract<keyof M, string> | `subcollection:${string}`)[];
116
116
 
117
117
  /**
118
118
  * If enabled, content is loaded in batches. If `false` all entities in the
@@ -464,7 +464,10 @@ export interface AdditionalFieldDelegate<M extends Record<string, any> = any,
464
464
  * view.
465
465
  * @param entity
466
466
  */
467
- value?: (props: { entity: Entity<M>, context: FireCMSContext<any> }) => string | number | Promise<string | number> | undefined;
467
+ value?: (props: {
468
+ entity: Entity<M>,
469
+ context: FireCMSContext<any>
470
+ }) => string | number | Promise<string | number> | undefined;
468
471
  }
469
472
 
470
473
  /**
@@ -609,6 +609,16 @@ export interface ReferenceProperty extends BaseProperty<EntityReference> {
609
609
  */
610
610
  previewProperties?: string[];
611
611
 
612
+ /**
613
+ * Should the reference include the ID of the entity. Defaults to `true`
614
+ */
615
+ includeId?: boolean;
616
+
617
+ /**
618
+ * Should the reference include a link to the entity (open the entity details). Defaults to `true`
619
+ */
620
+ includeEntityLink?: boolean;
621
+
612
622
  }
613
623
 
614
624
  /**
@@ -12,22 +12,23 @@ export function isObject(item: any) {
12
12
  return item && typeof item === "object" && !Array.isArray(item);
13
13
  }
14
14
 
15
- export function mergeDeep<T extends object>(target: T, source: any): T {
15
+ export function mergeDeep<T extends Record<any, any>, U extends Record<any, any>>(target: T, source: U): T & U {
16
16
  const targetIsObject = isObject(target);
17
- const output: T = targetIsObject ? { ...target } : target;
17
+ const output = targetIsObject ? { ...target } : target;
18
18
  if (targetIsObject && isObject(source)) {
19
19
  Object.keys(source).forEach(key => {
20
- if (isObject(source[key])) {
20
+ const sourceElement = source[key];
21
+ if (isObject(sourceElement)) {
21
22
  if (!(key in target))
22
- Object.assign(output, { [key]: source[key] });
23
+ Object.assign(output, { [key]: sourceElement });
23
24
  else
24
- (output as any)[key] = mergeDeep((target as any)[key], source[key]);
25
+ (output as any)[key] = mergeDeep((target as any)[key], sourceElement);
25
26
  } else {
26
- Object.assign(output, { [key]: source[key] });
27
+ Object.assign(output, { [key]: sourceElement });
27
28
  }
28
29
  });
29
30
  }
30
- return output;
31
+ return output as T;
31
32
  }
32
33
 
33
34
  export function getValueInPath(o: object | undefined, path: string): any {
@@ -1,2 +0,0 @@
1
- import { VirtualTableSize } from "./VirtualTableProps";
2
- export declare function getRowHeight(size: VirtualTableSize): number;