@firecms/core 3.0.0-3.0.0-beta.4.pre.1.0
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/LICENSE +21 -0
- package/README.md +174 -0
- package/dist/components/ArrayContainer.d.ts +40 -0
- package/dist/components/CircularProgressCenter.d.ts +11 -0
- package/dist/components/DeleteConfirmationDialog.d.ts +9 -0
- package/dist/components/DeleteEntityDialog.d.ts +12 -0
- package/dist/components/EntityCollectionTable/EntityCollectionRowActions.d.ts +31 -0
- package/dist/components/EntityCollectionTable/EntityCollectionTable.d.ts +27 -0
- package/dist/components/EntityCollectionTable/EntityCollectionTableProps.d.ts +99 -0
- package/dist/components/EntityCollectionTable/PropertyTableCell.d.ts +18 -0
- package/dist/components/EntityCollectionTable/column_utils.d.ts +16 -0
- package/dist/components/EntityCollectionTable/fields/TableReferenceField.d.ts +19 -0
- package/dist/components/EntityCollectionTable/fields/TableStorageUpload.d.ts +33 -0
- package/dist/components/EntityCollectionTable/index.d.ts +6 -0
- package/dist/components/EntityCollectionTable/internal/CollectionTableToolbar.d.ts +18 -0
- package/dist/components/EntityCollectionTable/internal/EntityTableCell.d.ts +26 -0
- package/dist/components/EntityCollectionTable/internal/EntityTableCellActions.d.ts +9 -0
- package/dist/components/EntityCollectionTable/internal/common.d.ts +4 -0
- package/dist/components/EntityCollectionTable/internal/default_entity_actions.d.ts +6 -0
- package/dist/components/EntityCollectionTable/internal/popup_field/ElementResizeListener.d.ts +5 -0
- package/dist/components/EntityCollectionTable/internal/popup_field/PopupFormField.d.ts +23 -0
- package/dist/components/EntityCollectionTable/internal/popup_field/useDraggable.d.ts +13 -0
- package/dist/components/EntityCollectionTable/internal/popup_field/useWindowSize.d.ts +6 -0
- package/dist/components/EntityCollectionView/EntityCollectionView.d.ts +36 -0
- package/dist/components/EntityCollectionView/EntityCollectionViewActions.d.ts +14 -0
- package/dist/components/EntityCollectionView/useSelectionController.d.ts +2 -0
- package/dist/components/EntityPreview.d.ts +29 -0
- package/dist/components/EntityView.d.ts +11 -0
- package/dist/components/ErrorBoundary.d.ts +11 -0
- package/dist/components/ErrorTooltip.d.ts +2 -0
- package/dist/components/ErrorView.d.ts +19 -0
- package/dist/components/FieldCaption.d.ts +4 -0
- package/dist/components/FireCMSAppBar.d.ts +26 -0
- package/dist/components/FireCMSLogo.d.ts +7 -0
- package/dist/components/HomePage/DefaultHomePage.d.ts +21 -0
- package/dist/components/HomePage/FavouritesView.d.ts +3 -0
- package/dist/components/HomePage/NavigationCard.d.ts +8 -0
- package/dist/components/HomePage/NavigationCardBinding.d.ts +17 -0
- package/dist/components/HomePage/NavigationGroup.d.ts +4 -0
- package/dist/components/HomePage/SmallNavigationCard.d.ts +6 -0
- package/dist/components/HomePage/index.d.ts +5 -0
- package/dist/components/NotFoundPage.d.ts +1 -0
- package/dist/components/PropertyConfigBadge.d.ts +4 -0
- package/dist/components/PropertyIdCopyTooltipContent.d.ts +3 -0
- package/dist/components/ReferenceTable/ReferenceSelectionTable.d.ts +58 -0
- package/dist/components/ReferenceWidget.d.ts +28 -0
- package/dist/components/SearchIconsView.d.ts +5 -0
- package/dist/components/SelectableTable/SelectableTable.d.ts +75 -0
- package/dist/components/SelectableTable/SelectableTableContext.d.ts +4 -0
- package/dist/components/SelectableTable/filters/BooleanFilterField.d.ts +9 -0
- package/dist/components/SelectableTable/filters/DateTimeFilterField.d.ts +11 -0
- package/dist/components/SelectableTable/filters/ReferenceFilterField.d.ts +14 -0
- package/dist/components/SelectableTable/filters/StringNumberFilterField.d.ts +13 -0
- package/dist/components/VirtualTable/VirtualTable.d.ts +11 -0
- package/dist/components/VirtualTable/VirtualTableCell.d.ts +14 -0
- package/dist/components/VirtualTable/VirtualTableHeader.d.ts +27 -0
- package/dist/components/VirtualTable/VirtualTableHeaderRow.d.ts +2 -0
- package/dist/components/VirtualTable/VirtualTableProps.d.ts +214 -0
- package/dist/components/VirtualTable/VirtualTableRow.d.ts +3 -0
- package/dist/components/VirtualTable/common.d.ts +2 -0
- package/dist/components/VirtualTable/fields/VirtualTableDateField.d.ts +11 -0
- package/dist/components/VirtualTable/fields/VirtualTableInput.d.ts +8 -0
- package/dist/components/VirtualTable/fields/VirtualTableNumberInput.d.ts +8 -0
- package/dist/components/VirtualTable/fields/VirtualTableSelect.d.ts +15 -0
- package/dist/components/VirtualTable/fields/VirtualTableSwitch.d.ts +7 -0
- package/dist/components/VirtualTable/index.d.ts +2 -0
- package/dist/components/VirtualTable/types.d.ts +34 -0
- package/dist/components/common/index.d.ts +5 -0
- package/dist/components/common/types.d.ts +60 -0
- package/dist/components/common/useColumnsIds.d.ts +4 -0
- package/dist/components/common/useDataSourceEntityCollectionTableController.d.ts +32 -0
- package/dist/components/common/useDebouncedData.d.ts +9 -0
- package/dist/components/common/useTableSearchHelper.d.ts +12 -0
- package/dist/components/index.d.ts +25 -0
- package/dist/contexts/AnalyticsContext.d.ts +3 -0
- package/dist/contexts/AuthControllerContext.d.ts +3 -0
- package/dist/contexts/CustomizationControllerContext.d.ts +3 -0
- package/dist/contexts/DataSourceContext.d.ts +3 -0
- package/dist/contexts/DialogsProvider.d.ts +4 -0
- package/dist/contexts/ModeController.d.ts +4 -0
- package/dist/contexts/NavigationContext.d.ts +3 -0
- package/dist/contexts/SideDialogsControllerContext.d.ts +3 -0
- package/dist/contexts/SideEntityControllerContext.d.ts +3 -0
- package/dist/contexts/SnackbarProvider.d.ts +2 -0
- package/dist/contexts/StorageSourceContext.d.ts +3 -0
- package/dist/contexts/UserConfigurationPersistenceContext.d.ts +3 -0
- package/dist/contexts/index.d.ts +3 -0
- package/dist/core/Drawer.d.ts +23 -0
- package/dist/core/EntityEditView.d.ts +22 -0
- package/dist/core/EntitySidePanel.d.ts +10 -0
- package/dist/core/FireCMS.d.ts +14 -0
- package/dist/core/NavigationRoutes.d.ts +21 -0
- package/dist/core/Scaffold.d.ts +55 -0
- package/dist/core/SideDialogs.d.ts +23 -0
- package/dist/core/SideEntityView.d.ts +7 -0
- package/dist/core/field_configs.d.ts +7 -0
- package/dist/core/index.d.ts +8 -0
- package/dist/form/EntityForm.d.ts +77 -0
- package/dist/form/PropertyFieldBinding.d.ts +30 -0
- package/dist/form/components/CustomIdField.d.ts +10 -0
- package/dist/form/components/ErrorFocus.d.ts +4 -0
- package/dist/form/components/FieldHelperText.d.ts +12 -0
- package/dist/form/components/FormikArrayContainer.d.ts +18 -0
- package/dist/form/components/LabelWithIcon.d.ts +14 -0
- package/dist/form/components/StorageItemPreview.d.ts +14 -0
- package/dist/form/components/StorageUploadProgress.d.ts +10 -0
- package/dist/form/components/index.d.ts +3 -0
- package/dist/form/field_bindings/ArrayCustomShapedFieldBinding.d.ts +9 -0
- package/dist/form/field_bindings/ArrayOfReferencesFieldBinding.d.ts +11 -0
- package/dist/form/field_bindings/BlockFieldBinding.d.ts +10 -0
- package/dist/form/field_bindings/DateTimeFieldBinding.d.ts +11 -0
- package/dist/form/field_bindings/KeyValueFieldBinding.d.ts +7 -0
- package/dist/form/field_bindings/MapFieldBinding.d.ts +9 -0
- package/dist/form/field_bindings/MarkdownFieldBinding.d.ts +9 -0
- package/dist/form/field_bindings/MultiSelectBinding.d.ts +9 -0
- package/dist/form/field_bindings/ReadOnlyFieldBinding.d.ts +10 -0
- package/dist/form/field_bindings/ReferenceFieldBinding.d.ts +9 -0
- package/dist/form/field_bindings/RepeatFieldBinding.d.ts +10 -0
- package/dist/form/field_bindings/SelectFieldBinding.d.ts +12 -0
- package/dist/form/field_bindings/StorageUploadFieldBinding.d.ts +29 -0
- package/dist/form/field_bindings/SwitchFieldBinding.d.ts +12 -0
- package/dist/form/field_bindings/TextFieldBinding.d.ts +12 -0
- package/dist/form/index.d.ts +21 -0
- package/dist/form/useClearRestoreValue.d.ts +13 -0
- package/dist/form/validation.d.ts +25 -0
- package/dist/hooks/data/delete.d.ts +37 -0
- package/dist/hooks/data/save.d.ts +42 -0
- package/dist/hooks/data/useCollectionFetch.d.ts +50 -0
- package/dist/hooks/data/useDataOrder.d.ts +12 -0
- package/dist/hooks/data/useDataSource.d.ts +6 -0
- package/dist/hooks/data/useEntityFetch.d.ts +28 -0
- package/dist/hooks/index.d.ts +22 -0
- package/dist/hooks/useAnalyticsController.d.ts +5 -0
- package/dist/hooks/useAuthController.d.ts +11 -0
- package/dist/hooks/useBrowserTitleAndIcon.d.ts +6 -0
- package/dist/hooks/useBuildLocalConfigurationPersistence.d.ts +2 -0
- package/dist/hooks/useBuildModeController.d.ts +6 -0
- package/dist/hooks/useBuildNavigationController.d.ts +24 -0
- package/dist/hooks/useClipboard.d.ts +57 -0
- package/dist/hooks/useCustomizationController.d.ts +11 -0
- package/dist/hooks/useDialogsController.d.ts +11 -0
- package/dist/hooks/useFireCMSContext.d.ts +11 -0
- package/dist/hooks/useLargeLayout.d.ts +1 -0
- package/dist/hooks/useModeController.d.ts +20 -0
- package/dist/hooks/useNavigationController.d.ts +9 -0
- package/dist/hooks/useProjectLog.d.ts +8 -0
- package/dist/hooks/useReferenceDialog.d.ts +18 -0
- package/dist/hooks/useResolvedNavigationFrom.d.ts +72 -0
- package/dist/hooks/useSideDialogsController.d.ts +18 -0
- package/dist/hooks/useSideEntityController.d.ts +12 -0
- package/dist/hooks/useSnackbarController.d.ts +42 -0
- package/dist/hooks/useStorageSource.d.ts +6 -0
- package/dist/hooks/useUserConfigurationPersistence.d.ts +8 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.es.js +16602 -0
- package/dist/index.es.js.map +1 -0
- package/dist/index.umd.js +589 -0
- package/dist/index.umd.js.map +1 -0
- package/dist/internal/common.d.ts +3 -0
- package/dist/internal/useBuildCustomizationController.d.ts +2 -0
- package/dist/internal/useBuildDataSource.d.ts +26 -0
- package/dist/internal/useBuildSideDialogsController.d.ts +2 -0
- package/dist/internal/useBuildSideEntityController.d.ts +4 -0
- package/dist/internal/useLocaleConfig.d.ts +1 -0
- package/dist/internal/useRestoreScroll.d.ts +6 -0
- package/dist/internal/useUnsavedChangesDialog.d.ts +14 -0
- package/dist/preview/PropertyPreview.d.ts +7 -0
- package/dist/preview/PropertyPreviewProps.d.ts +43 -0
- package/dist/preview/components/ArrayEnumPreview.d.ts +11 -0
- package/dist/preview/components/AsyncPreviewComponent.d.ts +11 -0
- package/dist/preview/components/BooleanPreview.d.ts +11 -0
- package/dist/preview/components/DatePreview.d.ts +7 -0
- package/dist/preview/components/EmptyValue.d.ts +4 -0
- package/dist/preview/components/EnumValuesChip.d.ts +13 -0
- package/dist/preview/components/ImagePreview.d.ts +12 -0
- package/dist/preview/components/ReferencePreview.d.ts +16 -0
- package/dist/preview/components/StorageThumbnail.d.ts +13 -0
- package/dist/preview/components/UrlComponentPreview.d.ts +12 -0
- package/dist/preview/index.d.ts +23 -0
- package/dist/preview/property_previews/ArrayOfMapsPreview.d.ts +5 -0
- package/dist/preview/property_previews/ArrayOfReferencesPreview.d.ts +5 -0
- package/dist/preview/property_previews/ArrayOfStorageComponentsPreview.d.ts +5 -0
- package/dist/preview/property_previews/ArrayOfStringsPreview.d.ts +5 -0
- package/dist/preview/property_previews/ArrayOneOfPreview.d.ts +5 -0
- package/dist/preview/property_previews/ArrayPropertyEnumPreview.d.ts +5 -0
- package/dist/preview/property_previews/ArrayPropertyPreview.d.ts +5 -0
- package/dist/preview/property_previews/MapPropertyPreview.d.ts +8 -0
- package/dist/preview/property_previews/NumberPropertyPreview.d.ts +6 -0
- package/dist/preview/property_previews/SkeletonPropertyComponent.d.ts +14 -0
- package/dist/preview/property_previews/StringPropertyPreview.d.ts +6 -0
- package/dist/preview/util.d.ts +7 -0
- package/dist/types/analytics.d.ts +1 -0
- package/dist/types/analytics_controller.d.ts +7 -0
- package/dist/types/appcheck.d.ts +26 -0
- package/dist/types/auth.d.ts +47 -0
- package/dist/types/collections.d.ts +467 -0
- package/dist/types/customization_controller.d.ts +47 -0
- package/dist/types/datasource.d.ts +262 -0
- package/dist/types/dialogs_controller.d.ts +32 -0
- package/dist/types/entities.d.ts +58 -0
- package/dist/types/entity_actions.d.ts +35 -0
- package/dist/types/entity_callbacks.d.ts +185 -0
- package/dist/types/entity_link_builder.d.ts +7 -0
- package/dist/types/entity_overrides.d.ts +6 -0
- package/dist/types/export_import.d.ts +21 -0
- package/dist/types/fields.d.ts +180 -0
- package/dist/types/firecms.d.ts +132 -0
- package/dist/types/firecms_context.d.ts +70 -0
- package/dist/types/index.d.ts +29 -0
- package/dist/types/local_config_persistence.d.ts +21 -0
- package/dist/types/locales.d.ts +4 -0
- package/dist/types/modify_collections.d.ts +5 -0
- package/dist/types/navigation.d.ts +179 -0
- package/dist/types/permissions.d.ts +67 -0
- package/dist/types/plugins.d.ts +171 -0
- package/dist/types/properties.d.ts +681 -0
- package/dist/types/property_config.d.ts +42 -0
- package/dist/types/resolved_entities.d.ts +98 -0
- package/dist/types/side_dialogs_controller.d.ts +57 -0
- package/dist/types/side_entity_controller.d.ts +83 -0
- package/dist/types/storage.d.ts +82 -0
- package/dist/types/user.d.ts +36 -0
- package/dist/util/arrays.d.ts +1 -0
- package/dist/util/builders.d.ts +64 -0
- package/dist/util/collections.d.ts +11 -0
- package/dist/util/common.d.ts +2 -0
- package/dist/util/dates.d.ts +1 -0
- package/dist/util/entities.d.ts +28 -0
- package/dist/util/enums.d.ts +7 -0
- package/dist/util/flatten_object.d.ts +3 -0
- package/dist/util/hash.d.ts +1 -0
- package/dist/util/icon_list.d.ts +1 -0
- package/dist/util/icon_synonyms.d.ts +1950 -0
- package/dist/util/icons.d.ts +13 -0
- package/dist/util/index.d.ts +23 -0
- package/dist/util/join_collections.d.ts +9 -0
- package/dist/util/make_properties_editable.d.ts +3 -0
- package/dist/util/navigation_from_path.d.ts +24 -0
- package/dist/util/navigation_utils.d.ts +20 -0
- package/dist/util/objects.d.ts +10 -0
- package/dist/util/os.d.ts +2 -0
- package/dist/util/parent_references_from_path.d.ts +6 -0
- package/dist/util/paths.d.ts +14 -0
- package/dist/util/permissions.d.ts +5 -0
- package/dist/util/plurals.d.ts +18 -0
- package/dist/util/property_utils.d.ts +23 -0
- package/dist/util/references.d.ts +4 -0
- package/dist/util/regexp.d.ts +7 -0
- package/dist/util/resolutions.d.ts +64 -0
- package/dist/util/storage.d.ts +3 -0
- package/dist/util/strings.d.ts +6 -0
- package/dist/util/useDebouncedCallback.d.ts +1 -0
- package/dist/util/useStorageUploadController.d.ts +36 -0
- package/dist/util/useTraceUpdate.d.ts +1 -0
- package/package.json +122 -0
- package/src/components/ArrayContainer.tsx +334 -0
- package/src/components/CircularProgressCenter.tsx +26 -0
- package/src/components/DeleteConfirmationDialog.tsx +47 -0
- package/src/components/DeleteEntityDialog.tsx +213 -0
- package/src/components/EntityCollectionTable/EntityCollectionRowActions.tsx +170 -0
- package/src/components/EntityCollectionTable/EntityCollectionTable.tsx +325 -0
- package/src/components/EntityCollectionTable/EntityCollectionTableProps.tsx +145 -0
- package/src/components/EntityCollectionTable/PropertyTableCell.tsx +461 -0
- package/src/components/EntityCollectionTable/column_utils.tsx +74 -0
- package/src/components/EntityCollectionTable/fields/TableReferenceField.tsx +155 -0
- package/src/components/EntityCollectionTable/fields/TableStorageUpload.tsx +313 -0
- package/src/components/EntityCollectionTable/index.tsx +12 -0
- package/src/components/EntityCollectionTable/internal/CollectionTableToolbar.tsx +116 -0
- package/src/components/EntityCollectionTable/internal/EntityTableCell.tsx +257 -0
- package/src/components/EntityCollectionTable/internal/EntityTableCellActions.tsx +70 -0
- package/src/components/EntityCollectionTable/internal/common.tsx +70 -0
- package/src/components/EntityCollectionTable/internal/default_entity_actions.tsx +126 -0
- package/src/components/EntityCollectionTable/internal/popup_field/ElementResizeListener.tsx +59 -0
- package/src/components/EntityCollectionTable/internal/popup_field/PopupFormField.tsx +408 -0
- package/src/components/EntityCollectionTable/internal/popup_field/useDraggable.tsx +97 -0
- package/src/components/EntityCollectionTable/internal/popup_field/useWindowSize.tsx +20 -0
- package/src/components/EntityCollectionView/EntityCollectionView.tsx +804 -0
- package/src/components/EntityCollectionView/EntityCollectionViewActions.tsx +132 -0
- package/src/components/EntityCollectionView/useSelectionController.tsx +30 -0
- package/src/components/EntityPreview.tsx +218 -0
- package/src/components/EntityView.tsx +84 -0
- package/src/components/ErrorBoundary.tsx +40 -0
- package/src/components/ErrorTooltip.tsx +11 -0
- package/src/components/ErrorView.tsx +52 -0
- package/src/components/FieldCaption.tsx +13 -0
- package/src/components/FireCMSAppBar.tsx +165 -0
- package/src/components/FireCMSLogo.tsx +73 -0
- package/src/components/HomePage/DefaultHomePage.tsx +214 -0
- package/src/components/HomePage/FavouritesView.tsx +64 -0
- package/src/components/HomePage/NavigationCard.tsx +69 -0
- package/src/components/HomePage/NavigationCardBinding.tsx +116 -0
- package/src/components/HomePage/NavigationGroup.tsx +39 -0
- package/src/components/HomePage/SmallNavigationCard.tsx +45 -0
- package/src/components/HomePage/index.tsx +5 -0
- package/src/components/NotFoundPage.tsx +25 -0
- package/src/components/PropertyConfigBadge.tsx +17 -0
- package/src/components/PropertyIdCopyTooltipContent.tsx +28 -0
- package/src/components/ReferenceTable/ReferenceSelectionTable.tsx +379 -0
- package/src/components/ReferenceWidget.tsx +145 -0
- package/src/components/SearchIconsView.tsx +75 -0
- package/src/components/SelectableTable/SelectableTable.tsx +329 -0
- package/src/components/SelectableTable/SelectableTableContext.tsx +6 -0
- package/src/components/SelectableTable/filters/BooleanFilterField.tsx +49 -0
- package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +109 -0
- package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +179 -0
- package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +158 -0
- package/src/components/VirtualTable/VirtualTable.tsx +405 -0
- package/src/components/VirtualTable/VirtualTableCell.tsx +50 -0
- package/src/components/VirtualTable/VirtualTableHeader.tsx +266 -0
- package/src/components/VirtualTable/VirtualTableHeaderRow.tsx +131 -0
- package/src/components/VirtualTable/VirtualTableProps.tsx +269 -0
- package/src/components/VirtualTable/VirtualTableRow.tsx +53 -0
- package/src/components/VirtualTable/common.tsx +18 -0
- package/src/components/VirtualTable/fields/VirtualTableDateField.tsx +37 -0
- package/src/components/VirtualTable/fields/VirtualTableInput.tsx +91 -0
- package/src/components/VirtualTable/fields/VirtualTableNumberInput.tsx +82 -0
- package/src/components/VirtualTable/fields/VirtualTableSelect.tsx +130 -0
- package/src/components/VirtualTable/fields/VirtualTableSwitch.tsx +32 -0
- package/src/components/VirtualTable/index.tsx +2 -0
- package/src/components/VirtualTable/types.tsx +44 -0
- package/src/components/common/index.ts +5 -0
- package/src/components/common/types.tsx +63 -0
- package/src/components/common/useColumnsIds.tsx +100 -0
- package/src/components/common/useDataSourceEntityCollectionTableController.tsx +225 -0
- package/src/components/common/useDebouncedData.ts +49 -0
- package/src/components/common/useTableSearchHelper.ts +47 -0
- package/src/components/index.tsx +36 -0
- package/src/contexts/AnalyticsContext.tsx +4 -0
- package/src/contexts/AuthControllerContext.tsx +4 -0
- package/src/contexts/CustomizationControllerContext.tsx +4 -0
- package/src/contexts/DataSourceContext.tsx +4 -0
- package/src/contexts/DialogsProvider.tsx +52 -0
- package/src/contexts/ModeController.tsx +13 -0
- package/src/contexts/NavigationContext.tsx +4 -0
- package/src/contexts/SideDialogsControllerContext.tsx +4 -0
- package/src/contexts/SideEntityControllerContext.tsx +4 -0
- package/src/contexts/SnackbarProvider.tsx +12 -0
- package/src/contexts/StorageSourceContext.tsx +4 -0
- package/src/contexts/UserConfigurationPersistenceContext.tsx +4 -0
- package/src/contexts/index.ts +3 -0
- package/src/core/Drawer.tsx +191 -0
- package/src/core/EntityEditView.tsx +561 -0
- package/src/core/EntitySidePanel.tsx +91 -0
- package/src/core/FireCMS.tsx +198 -0
- package/src/core/NavigationRoutes.tsx +127 -0
- package/src/core/Scaffold.tsx +281 -0
- package/src/core/SideDialogs.tsx +156 -0
- package/src/core/SideEntityView.tsx +38 -0
- package/src/core/field_configs.tsx +400 -0
- package/src/core/index.tsx +12 -0
- package/src/form/EntityForm.tsx +728 -0
- package/src/form/PropertyFieldBinding.tsx +306 -0
- package/src/form/components/CustomIdField.tsx +139 -0
- package/src/form/components/ErrorFocus.tsx +51 -0
- package/src/form/components/FieldHelperText.tsx +58 -0
- package/src/form/components/FormikArrayContainer.tsx +44 -0
- package/src/form/components/LabelWithIcon.tsx +33 -0
- package/src/form/components/StorageItemPreview.tsx +68 -0
- package/src/form/components/StorageUploadProgress.tsx +105 -0
- package/src/form/components/index.tsx +3 -0
- package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +86 -0
- package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +149 -0
- package/src/form/field_bindings/BlockFieldBinding.tsx +245 -0
- package/src/form/field_bindings/DateTimeFieldBinding.tsx +67 -0
- package/src/form/field_bindings/KeyValueFieldBinding.tsx +558 -0
- package/src/form/field_bindings/MapFieldBinding.tsx +138 -0
- package/src/form/field_bindings/MarkdownFieldBinding.tsx +695 -0
- package/src/form/field_bindings/MultiSelectBinding.tsx +114 -0
- package/src/form/field_bindings/ReadOnlyFieldBinding.tsx +69 -0
- package/src/form/field_bindings/ReferenceFieldBinding.tsx +123 -0
- package/src/form/field_bindings/RepeatFieldBinding.tsx +105 -0
- package/src/form/field_bindings/SelectFieldBinding.tsx +99 -0
- package/src/form/field_bindings/StorageUploadFieldBinding.tsx +447 -0
- package/src/form/field_bindings/SwitchFieldBinding.tsx +60 -0
- package/src/form/field_bindings/TextFieldBinding.tsx +109 -0
- package/src/form/index.tsx +43 -0
- package/src/form/useClearRestoreValue.tsx +35 -0
- package/src/form/validation.ts +412 -0
- package/src/hooks/data/delete.ts +101 -0
- package/src/hooks/data/save.ts +170 -0
- package/src/hooks/data/useCollectionFetch.tsx +162 -0
- package/src/hooks/data/useDataOrder.ts +26 -0
- package/src/hooks/data/useDataSource.tsx +14 -0
- package/src/hooks/data/useEntityFetch.tsx +129 -0
- package/src/hooks/index.tsx +27 -0
- package/src/hooks/useAnalyticsController.tsx +8 -0
- package/src/hooks/useAuthController.tsx +14 -0
- package/src/hooks/useBrowserTitleAndIcon.tsx +25 -0
- package/src/hooks/useBuildLocalConfigurationPersistence.tsx +67 -0
- package/src/hooks/useBuildModeController.tsx +60 -0
- package/src/hooks/useBuildNavigationController.tsx +433 -0
- package/src/hooks/useClipboard.tsx +158 -0
- package/src/hooks/useCustomizationController.tsx +14 -0
- package/src/hooks/useDialogsController.tsx +14 -0
- package/src/hooks/useFireCMSContext.tsx +99 -0
- package/src/hooks/useLargeLayout.tsx +100 -0
- package/src/hooks/useModeController.tsx +24 -0
- package/src/hooks/useNavigationController.tsx +12 -0
- package/src/hooks/useProjectLog.tsx +39 -0
- package/src/hooks/useReferenceDialog.tsx +56 -0
- package/src/hooks/useResolvedNavigationFrom.tsx +160 -0
- package/src/hooks/useSideDialogsController.tsx +21 -0
- package/src/hooks/useSideEntityController.tsx +15 -0
- package/src/hooks/useSnackbarController.tsx +75 -0
- package/src/hooks/useStorageSource.tsx +14 -0
- package/src/hooks/useUserConfigurationPersistence.tsx +11 -0
- package/src/index.ts +8 -0
- package/src/internal/common.tsx +5 -0
- package/src/internal/useBuildCustomizationController.tsx +5 -0
- package/src/internal/useBuildDataSource.ts +363 -0
- package/src/internal/useBuildSideDialogsController.tsx +125 -0
- package/src/internal/useBuildSideEntityController.tsx +172 -0
- package/src/internal/useLocaleConfig.tsx +18 -0
- package/src/internal/useRestoreScroll.tsx +48 -0
- package/src/internal/useUnsavedChangesDialog.tsx +106 -0
- package/src/preview/PropertyPreview.tsx +225 -0
- package/src/preview/PropertyPreviewProps.tsx +59 -0
- package/src/preview/components/ArrayEnumPreview.tsx +39 -0
- package/src/preview/components/AsyncPreviewComponent.tsx +47 -0
- package/src/preview/components/BooleanPreview.tsx +24 -0
- package/src/preview/components/DatePreview.tsx +26 -0
- package/src/preview/components/EmptyValue.tsx +10 -0
- package/src/preview/components/EnumValuesChip.tsx +38 -0
- package/src/preview/components/ImagePreview.tsx +106 -0
- package/src/preview/components/ReferencePreview.tsx +166 -0
- package/src/preview/components/StorageThumbnail.tsx +84 -0
- package/src/preview/components/UrlComponentPreview.tsx +79 -0
- package/src/preview/index.ts +27 -0
- package/src/preview/property_previews/ArrayOfMapsPreview.tsx +82 -0
- package/src/preview/property_previews/ArrayOfReferencesPreview.tsx +52 -0
- package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +54 -0
- package/src/preview/property_previews/ArrayOfStringsPreview.tsx +55 -0
- package/src/preview/property_previews/ArrayOneOfPreview.tsx +67 -0
- package/src/preview/property_previews/ArrayPropertyEnumPreview.tsx +28 -0
- package/src/preview/property_previews/ArrayPropertyPreview.tsx +68 -0
- package/src/preview/property_previews/MapPropertyPreview.tsx +146 -0
- package/src/preview/property_previews/NumberPropertyPreview.tsx +27 -0
- package/src/preview/property_previews/SkeletonPropertyComponent.tsx +283 -0
- package/src/preview/property_previews/StringPropertyPreview.tsx +60 -0
- package/src/preview/util.ts +31 -0
- package/src/types/analytics.ts +35 -0
- package/src/types/analytics_controller.tsx +10 -0
- package/src/types/appcheck.ts +29 -0
- package/src/types/auth.tsx +59 -0
- package/src/types/collections.ts +548 -0
- package/src/types/customization_controller.tsx +58 -0
- package/src/types/datasource.ts +389 -0
- package/src/types/dialogs_controller.tsx +33 -0
- package/src/types/entities.ts +80 -0
- package/src/types/entity_actions.tsx +43 -0
- package/src/types/entity_callbacks.ts +229 -0
- package/src/types/entity_link_builder.ts +8 -0
- package/src/types/entity_overrides.tsx +7 -0
- package/src/types/export_import.ts +26 -0
- package/src/types/fields.tsx +220 -0
- package/src/types/firecms.tsx +153 -0
- package/src/types/firecms_context.tsx +83 -0
- package/src/types/index.ts +29 -0
- package/src/types/local_config_persistence.tsx +23 -0
- package/src/types/locales.ts +81 -0
- package/src/types/modify_collections.tsx +6 -0
- package/src/types/navigation.ts +215 -0
- package/src/types/permissions.ts +81 -0
- package/src/types/plugins.tsx +207 -0
- package/src/types/properties.ts +851 -0
- package/src/types/property_config.tsx +72 -0
- package/src/types/resolved_entities.ts +148 -0
- package/src/types/side_dialogs_controller.tsx +68 -0
- package/src/types/side_entity_controller.tsx +97 -0
- package/src/types/storage.ts +96 -0
- package/src/types/user.ts +37 -0
- package/src/util/arrays.ts +3 -0
- package/src/util/builders.ts +139 -0
- package/src/util/collections.ts +72 -0
- package/src/util/common.tsx +2 -0
- package/src/util/dates.ts +1 -0
- package/src/util/entities.ts +196 -0
- package/src/util/enums.ts +56 -0
- package/src/util/flatten_object.ts +45 -0
- package/src/util/hash.ts +11 -0
- package/src/util/icon_list.ts +17 -0
- package/src/util/icon_synonyms.ts +1950 -0
- package/src/util/icons.tsx +56 -0
- package/src/util/index.ts +23 -0
- package/src/util/join_collections.ts +172 -0
- package/src/util/make_properties_editable.ts +29 -0
- package/src/util/navigation_from_path.ts +107 -0
- package/src/util/navigation_utils.ts +111 -0
- package/src/util/objects.ts +168 -0
- package/src/util/os.ts +13 -0
- package/src/util/parent_references_from_path.ts +56 -0
- package/src/util/paths.ts +27 -0
- package/src/util/permissions.ts +83 -0
- package/src/util/plurals.ts +190 -0
- package/src/util/property_utils.tsx +130 -0
- package/src/util/references.ts +51 -0
- package/src/util/regexp.ts +32 -0
- package/src/util/resolutions.ts +399 -0
- package/src/util/storage.ts +92 -0
- package/src/util/strings.ts +63 -0
- package/src/util/useDebouncedCallback.ts +25 -0
- package/src/util/useStorageUploadController.tsx +243 -0
- package/src/util/useTraceUpdate.tsx +23 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.umd.js","sources":["../src/contexts/SnackbarProvider.tsx","../src/contexts/ModeController.tsx","../src/contexts/AuthControllerContext.tsx","../src/util/navigation_utils.ts","../src/types/entities.ts","../src/util/objects.ts","../src/util/common.tsx","../src/util/entities.ts","../src/util/enums.ts","../src/util/resolutions.ts","../src/util/navigation_from_path.ts","../src/util/collections.ts","../src/util/strings.ts","../src/util/dates.ts","../src/util/paths.ts","../src/util/regexp.ts","../src/util/useDebouncedCallback.ts","../src/util/property_utils.tsx","../src/util/permissions.ts","../src/util/icon_synonyms.ts","../src/util/icon_list.ts","../src/util/hash.ts","../src/util/icons.tsx","../src/util/plurals.ts","../src/util/references.ts","../src/util/flatten_object.ts","../src/util/make_properties_editable.ts","../src/util/join_collections.ts","../src/util/builders.ts","../src/util/useTraceUpdate.tsx","../src/internal/common.tsx","../src/contexts/DataSourceContext.tsx","../src/hooks/data/useDataSource.tsx","../src/contexts/NavigationContext.tsx","../src/hooks/useNavigationController.tsx","../src/hooks/useAuthController.tsx","../src/contexts/SideDialogsControllerContext.tsx","../src/hooks/useSideDialogsController.tsx","../src/contexts/SideEntityControllerContext.tsx","../src/hooks/useSideEntityController.tsx","../src/contexts/StorageSourceContext.tsx","../src/hooks/useStorageSource.tsx","../src/hooks/useSnackbarController.tsx","../src/contexts/UserConfigurationPersistenceContext.tsx","../src/hooks/useUserConfigurationPersistence.tsx","../src/contexts/DialogsProvider.tsx","../src/hooks/useDialogsController.tsx","../src/contexts/CustomizationControllerContext.tsx","../src/hooks/useCustomizationController.tsx","../src/contexts/AnalyticsContext.tsx","../src/hooks/useAnalyticsController.tsx","../src/hooks/useFireCMSContext.tsx","../src/hooks/data/useCollectionFetch.tsx","../src/hooks/data/useEntityFetch.tsx","../src/hooks/data/save.ts","../src/hooks/data/delete.ts","../src/hooks/useResolvedNavigationFrom.tsx","../src/hooks/useModeController.tsx","../src/hooks/useClipboard.tsx","../src/hooks/useLargeLayout.tsx","../src/components/ErrorTooltip.tsx","../src/components/ErrorView.tsx","../src/preview/components/EmptyValue.tsx","../src/preview/util.ts","../src/preview/components/ImagePreview.tsx","../src/preview/components/UrlComponentPreview.tsx","../src/preview/property_previews/SkeletonPropertyComponent.tsx","../src/preview/components/StorageThumbnail.tsx","../src/preview/components/EnumValuesChip.tsx","../src/preview/property_previews/StringPropertyPreview.tsx","../src/preview/property_previews/ArrayPropertyPreview.tsx","../src/components/EntityPreview.tsx","../src/preview/components/ReferencePreview.tsx","../src/preview/property_previews/ArrayOfReferencesPreview.tsx","../src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx","../src/preview/components/ArrayEnumPreview.tsx","../src/preview/property_previews/ArrayPropertyEnumPreview.tsx","../src/preview/property_previews/ArrayOfStringsPreview.tsx","../src/preview/property_previews/ArrayOneOfPreview.tsx","../src/preview/property_previews/MapPropertyPreview.tsx","../src/preview/components/DatePreview.tsx","../src/preview/components/BooleanPreview.tsx","../src/preview/property_previews/NumberPropertyPreview.tsx","../src/preview/PropertyPreview.tsx","../src/preview/property_previews/ArrayOfMapsPreview.tsx","../src/preview/components/AsyncPreviewComponent.tsx","../src/components/EntityView.tsx","../src/components/VirtualTable/fields/VirtualTableInput.tsx","../src/components/VirtualTable/fields/VirtualTableSelect.tsx","../src/components/VirtualTable/fields/VirtualTableNumberInput.tsx","../src/components/VirtualTable/fields/VirtualTableSwitch.tsx","../src/components/VirtualTable/fields/VirtualTableDateField.tsx","../src/components/ErrorBoundary.tsx","../src/util/storage.ts","../src/util/useStorageUploadController.tsx","../src/form/components/StorageUploadProgress.tsx","../src/components/EntityCollectionTable/internal/EntityTableCellActions.tsx","../src/components/EntityCollectionTable/fields/TableStorageUpload.tsx","../src/components/EntityCollectionTable/fields/TableReferenceField.tsx","../src/form/validation.ts","../src/components/VirtualTable/common.tsx","../src/components/EntityCollectionTable/internal/EntityTableCell.tsx","../src/components/SelectableTable/SelectableTableContext.tsx","../src/form/useClearRestoreValue.tsx","../src/components/EntityCollectionTable/PropertyTableCell.tsx","../src/components/EntityCollectionTable/EntityCollectionRowActions.tsx","../src/components/EntityCollectionTable/internal/CollectionTableToolbar.tsx","../src/components/EntityCollectionTable/internal/common.tsx","../src/components/common/useColumnsIds.tsx","../src/components/EntityCollectionTable/column_utils.tsx","../src/components/CircularProgressCenter.tsx","../src/components/VirtualTable/VirtualTableHeader.tsx","../src/components/VirtualTable/VirtualTableHeaderRow.tsx","../src/components/VirtualTable/VirtualTableRow.tsx","../src/components/VirtualTable/VirtualTableCell.tsx","../src/components/VirtualTable/VirtualTable.tsx","../src/components/SelectableTable/filters/ReferenceFilterField.tsx","../src/components/SelectableTable/filters/StringNumberFilterField.tsx","../src/components/SelectableTable/filters/BooleanFilterField.tsx","../src/components/SelectableTable/filters/DateTimeFilterField.tsx","../src/components/SelectableTable/SelectableTable.tsx","../src/components/EntityCollectionTable/EntityCollectionTable.tsx","../src/hooks/data/useDataOrder.ts","../src/components/common/useDebouncedData.ts","../src/components/common/useDataSourceEntityCollectionTableController.tsx","../src/components/EntityCollectionView/useSelectionController.tsx","../src/components/common/useTableSearchHelper.ts","../src/components/ReferenceTable/ReferenceSelectionTable.tsx","../src/util/arrays.ts","../src/components/HomePage/NavigationGroup.tsx","../src/components/HomePage/NavigationCard.tsx","../src/components/HomePage/SmallNavigationCard.tsx","../src/components/HomePage/NavigationCardBinding.tsx","../src/components/HomePage/FavouritesView.tsx","../src/internal/useRestoreScroll.tsx","../src/components/HomePage/DefaultHomePage.tsx","../src/components/EntityCollectionView/EntityCollectionViewActions.tsx","../src/components/EntityCollectionTable/internal/popup_field/useDraggable.tsx","../src/components/EntityCollectionTable/internal/popup_field/useWindowSize.tsx","../src/components/EntityCollectionTable/internal/popup_field/ElementResizeListener.tsx","../src/form/components/FormikArrayContainer.tsx","../src/form/components/FieldHelperText.tsx","../src/form/components/LabelWithIcon.tsx","../src/form/field_bindings/SelectFieldBinding.tsx","../src/form/field_bindings/MultiSelectBinding.tsx","../src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx","../src/form/components/StorageItemPreview.tsx","../src/form/field_bindings/StorageUploadFieldBinding.tsx","../src/form/field_bindings/TextFieldBinding.tsx","../src/form/field_bindings/SwitchFieldBinding.tsx","../src/form/field_bindings/DateTimeFieldBinding.tsx","../src/form/field_bindings/ReadOnlyFieldBinding.tsx","../src/form/field_bindings/ReferenceFieldBinding.tsx","../src/form/PropertyFieldBinding.tsx","../src/form/field_bindings/MapFieldBinding.tsx","../src/form/field_bindings/KeyValueFieldBinding.tsx","../src/form/field_bindings/RepeatFieldBinding.tsx","../src/form/field_bindings/BlockFieldBinding.tsx","../src/form/field_bindings/MarkdownFieldBinding.tsx","../src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx","../src/form/components/ErrorFocus.tsx","../src/form/components/CustomIdField.tsx","../src/components/DeleteEntityDialog.tsx","../src/components/EntityCollectionTable/internal/default_entity_actions.tsx","../src/components/PropertyIdCopyTooltipContent.tsx","../src/form/EntityForm.tsx","../src/components/EntityCollectionTable/internal/popup_field/PopupFormField.tsx","../src/components/EntityCollectionView/EntityCollectionView.tsx","../src/components/PropertyConfigBadge.tsx","../src/components/NotFoundPage.tsx","../src/components/DeleteConfirmationDialog.tsx","../src/components/FireCMSLogo.tsx","../src/components/FireCMSAppBar.tsx","../src/components/ArrayContainer.tsx","../src/components/ReferenceWidget.tsx","../src/components/SearchIconsView.tsx","../src/components/FieldCaption.tsx","../src/hooks/useReferenceDialog.tsx","../src/hooks/useBrowserTitleAndIcon.tsx","../src/util/parent_references_from_path.ts","../src/hooks/useBuildNavigationController.tsx","../src/hooks/useBuildLocalConfigurationPersistence.tsx","../src/hooks/useBuildModeController.tsx","../src/core/EntityEditView.tsx","../src/internal/useUnsavedChangesDialog.tsx","../src/core/SideDialogs.tsx","../src/core/EntitySidePanel.tsx","../src/internal/useBuildSideEntityController.tsx","../src/internal/useBuildSideDialogsController.tsx","../src/internal/useLocaleConfig.tsx","../src/internal/useBuildDataSource.ts","../src/internal/useBuildCustomizationController.tsx","../src/hooks/useProjectLog.tsx","../src/core/FireCMS.tsx","../src/core/Drawer.tsx","../src/core/Scaffold.tsx","../src/core/field_configs.tsx","../src/core/NavigationRoutes.tsx"],"sourcesContent":["import React, { PropsWithChildren } from \"react\";\nimport { SnackbarProvider as NotistackSnackbarProvider } from \"notistack\";\n\nexport const SnackbarProvider: React.FC<PropsWithChildren<{}>> = ({ children }) => {\n\n return (\n <NotistackSnackbarProvider maxSnack={3}\n autoHideDuration={3500}>\n {children}\n </NotistackSnackbarProvider>\n );\n};\n","import React from \"react\";\nimport { ModeController } from \"../hooks\";\n\nconst DEFAULT_MODE_STATE: ModeController = {\n mode: \"light\",\n setMode: (mode: \"light\" | \"dark\") => {\n },\n toggleMode: () => {\n }\n};\nexport const ModeControllerContext = React.createContext<ModeController>(DEFAULT_MODE_STATE);\n\nexport const ModeControllerProvider = ModeControllerContext.Provider;\n","import React from \"react\";\nimport { AuthController } from \"../types\";\n\nexport const AuthControllerContext = React.createContext<AuthController>({} as AuthController);\n","import { EntityCollection } from \"../types\";\n\nexport function removeInitialAndTrailingSlashes(s: string): string {\n return removeInitialSlash(removeTrailingSlash(s));\n}\n\nexport function removeInitialSlash(s: string) {\n if (s.startsWith(\"/\"))\n return s.slice(1);\n else return s;\n}\n\nexport function removeTrailingSlash(s: string) {\n if (s.endsWith(\"/\"))\n return s.slice(0, -1);\n else return s;\n}\n\nexport function addInitialSlash(s: string) {\n if (s.startsWith(\"/\"))\n return s;\n else return `/${s}`;\n}\n\nexport function getLastSegment(path: string) {\n const cleanPath = removeInitialAndTrailingSlashes(path);\n if (cleanPath.includes(\"/\")) {\n const segments = cleanPath.split(\"/\");\n return segments[segments.length - 1];\n }\n return cleanPath;\n}\n\nexport function resolveCollectionPathIds(path: string, allCollections: EntityCollection[]): string {\n\n const cleanPath = removeInitialAndTrailingSlashes(path);\n const subpaths = cleanPath.split(\"/\");\n if (subpaths.length % 2 === 0) {\n throw Error(`resolveCollectionPathAliases: Collection paths must have an odd number of segments: ${path}`);\n }\n\n const aliasedCollection = allCollections.find((col) => col.id === subpaths[0]);\n let resolvedAliased;\n if (aliasedCollection) {\n resolvedAliased = aliasedCollection.path;\n }\n\n if (subpaths.length > 1) {\n const segmentCollection = getCollectionByPathOrId(resolvedAliased ?? subpaths[0], allCollections);\n if (!segmentCollection?.subcollections) {\n return cleanPath;\n }\n const restOfThePath = cleanPath.split(\"/\").slice(2).join(\"/\");\n return (resolvedAliased ?? subpaths[0]) + \"/\" + subpaths[1] + \"/\" + resolveCollectionPathIds(restOfThePath, segmentCollection.subcollections);\n } else {\n return resolvedAliased ?? cleanPath;\n }\n}\n\n/**\n * Find the corresponding view at any depth for a given path.\n * Note that path or segments of the paths can be collection aliases.\n * @param pathOrAlias\n * @param collections\n */\nexport function getCollectionByPathOrId(pathOrAlias: string, collections: EntityCollection[]): EntityCollection | undefined {\n\n const subpaths = removeInitialAndTrailingSlashes(pathOrAlias).split(\"/\");\n if (subpaths.length % 2 === 0) {\n throw Error(`getCollectionByPathOrAlias: Collection paths must have an odd number of segments: ${pathOrAlias}`);\n }\n\n const subpathCombinations = getCollectionPathsCombinations(subpaths);\n let result: EntityCollection | undefined;\n for (let i = 0; i < subpathCombinations.length; i++) {\n const subpathCombination = subpathCombinations[i];\n const navigationEntry = collections && collections\n .sort((a, b) => (a.id ?? \"\").localeCompare(b.id ?? \"\"))\n .find((entry) => entry.id === subpathCombination || entry.path === subpathCombination);\n\n if (navigationEntry) {\n\n if (subpathCombination === pathOrAlias) {\n result = navigationEntry;\n } else if (navigationEntry.subcollections) {\n const newPath = pathOrAlias.replace(subpathCombination, \"\").split(\"/\").slice(2).join(\"/\");\n if (newPath.length > 0)\n result = getCollectionByPathOrId(newPath, navigationEntry.subcollections);\n }\n }\n if (result) break;\n }\n return result;\n}\n\n/**\n * Get the subcollection combinations from a path:\n * \"sites/es/locales\" => [\"sites/es/locales\", \"sites\"]\n * @param subpaths\n */\nexport function getCollectionPathsCombinations(subpaths: string[]): string[] {\n const entries = subpaths.length > 0 && subpaths.length % 2 === 0 ? subpaths.splice(0, subpaths.length - 1) : subpaths;\n\n const length = entries.length;\n const result: string[] = [];\n for (let i = length; i > 0; i = i - 2) {\n result.push(entries.slice(0, i).join(\"/\"));\n }\n return result;\n\n}\n","/**\n * New or existing status\n * @group Models\n */\nexport type EntityStatus = \"new\" | \"existing\" | \"copy\";\n\n/**\n * Representation of an entity fetched from the datasource\n * @group Models\n */\nexport interface Entity<M extends object> {\n\n /**\n * ID of the entity\n */\n id: string;\n\n /**\n * A string representing the path of the referenced document (relative\n * to the root of the database).\n */\n path: string;\n\n /**\n * Current values\n */\n values: EntityValues<M>;\n}\n\n/**\n * This type represents a record of key value pairs as described in an\n * entity collection.\n * @group Models\n */\nexport type EntityValues<M extends object> = M;\n\n/**\n * Class used to create a reference to an entity in a different path\n */\nexport class EntityReference<M extends Record<string, any> = any> {\n /**\n * ID of the entity\n */\n readonly id: string;\n /**\n * A string representing the path of the referenced document (relative\n * to the root of the database).\n */\n readonly path: string;\n\n constructor(id: string, path: string) {\n this.id = id;\n this.path = path;\n }\n\n get pathWithId() {\n return `${this.path}/${this.id}`;\n }\n\n isEntityReference() {\n return true;\n }\n}\n\nexport class GeoPoint {\n\n /**\n * The latitude of this GeoPoint instance.\n */\n readonly latitude: number;\n /**\n * The longitude of this GeoPoint instance.\n */\n readonly longitude: number;\n\n constructor(latitude: number, longitude: number) {\n this.latitude = latitude;\n this.longitude = longitude;\n }\n}\n","import hash from \"object-hash\";\nimport { GeoPoint } from \"../types\";\n\nexport const pick: <T>(obj: T, ...args: any[]) => T = (obj: any, ...args: any[]) => ({\n ...args.reduce((res, key) => ({\n ...res,\n [key]: obj[key]\n }), {})\n});\n\nexport function isObject(item: any) {\n return item && typeof item === \"object\" && !Array.isArray(item);\n}\n\nexport function mergeDeep<T extends object>(target: T, source: any): T {\n const targetIsObject = isObject(target);\n const output: T = targetIsObject ? { ...target } : target;\n if (targetIsObject && isObject(source)) {\n Object.keys(source).forEach(key => {\n if (isObject(source[key])) {\n if (!(key in target))\n Object.assign(output, { [key]: source[key] });\n else\n (output as any)[key] = mergeDeep((target as any)[key], source[key]);\n } else {\n Object.assign(output, { [key]: source[key] });\n }\n });\n }\n return output;\n}\n\n// export function getValueInPath(o: object | undefined, path: string): any {\n// if (!o) return undefined;\n// if (typeof o === \"object\") {\n// if (path in o) {\n// return (o as any)[path];\n// }\n// if (path.includes(\".\")) {\n// const pathSegments = path.split(\".\");\n// return getValueInPath((o as any)[pathSegments[0]], pathSegments.slice(1).join(\".\"))\n// }\n// }\n// return undefined;\n// }\n\nexport function getValueInPath(o: object | undefined, path: string): any {\n if (!o) return undefined;\n if (typeof o === \"object\") {\n if (path in o) {\n return (o as any)[path];\n }\n if (path.includes(\".\") || path.includes(\"[\")) {\n let pathSegments = path.split(/[.[]/);\n if (path.includes(\"[\")) {\n pathSegments = pathSegments.map(segment => segment.replace(\"]\", \"\"));\n }\n const firstSegment = pathSegments[0];\n const isArrayAndIndexExists = Array.isArray((o as any)[firstSegment]) && !isNaN(parseInt(pathSegments[1]));\n const nextObject = isArrayAndIndexExists\n ? (o as any)[firstSegment][parseInt(pathSegments[1])]\n : (o as any)[firstSegment];\n\n const nextPath = pathSegments.slice(isArrayAndIndexExists ? 2 : 1).join(\".\");\n if (nextPath === \"\")\n return nextObject;\n return getValueInPath(nextObject, nextPath)\n }\n }\n return undefined;\n}\n\nexport function removeInPath(o: object, path: string): object | undefined {\n let currentObject = { ...o };\n const parts = path.split(\".\");\n const last = parts.pop();\n for (const part of parts) {\n currentObject = (currentObject as any)[part]\n }\n if (last)\n delete (currentObject as any)[last];\n return currentObject;\n}\n\nexport function removeFunctions(o: object | undefined): any {\n if (o === undefined) return undefined;\n if (o === null) return null;\n if (typeof o === \"object\") {\n return Object.entries(o)\n .filter(([_, value]) => typeof value !== \"function\")\n .map(([key, value]) => {\n if (Array.isArray(value)) {\n return { [key]: value.map(v => removeFunctions(v)) };\n } else if (typeof value === \"object\") {\n return { [key]: removeFunctions(value) };\n } else return { [key]: value };\n })\n .reduce((a, b) => ({ ...a, ...b }), {});\n }\n return o;\n}\n\nexport function getHashValue<T>(v: T) {\n if (!v) return null;\n if (typeof v === \"object\") {\n if (\"id\" in v)\n return (v as any).id;\n else if (v instanceof Date)\n return v.toLocaleString();\n else if (v instanceof GeoPoint)\n return hash(v as Record<string, unknown>);\n }\n return hash(v, { ignoreUnknown: true });\n}\n\nexport function removeUndefined(value: any, removeEmptyStrings?: boolean): any {\n if (typeof value === \"function\") {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map((v: any) => removeUndefined(v, removeEmptyStrings));\n }\n if (typeof value === \"object\") {\n const res: object = {};\n if (value === null)\n return value;\n Object.keys(value).forEach((key) => {\n if (!isEmptyObject(value)) {\n const childRes = removeUndefined(value[key], removeEmptyStrings);\n const isString = typeof childRes === \"string\";\n const shouldKeepIfString = !removeEmptyStrings || (removeEmptyStrings && !isString) || (removeEmptyStrings && isString && childRes !== \"\");\n if (childRes !== undefined && !isEmptyObject(childRes) && shouldKeepIfString)\n (res as any)[key] = childRes;\n }\n });\n return res;\n }\n return value;\n}\n\nexport function isEmptyObject(obj: object) {\n return obj &&\n Object.getPrototypeOf(obj) === Object.prototype &&\n Object.keys(obj).length === 0\n}\n\nexport function removePropsIfExisting(source: any, comparison: any) {\n const isObject = (val: any) => typeof val === \"object\" && val !== null;\n const isArray = (val: any) => Array.isArray(val);\n\n if (!isObject(source) || !isObject(comparison)) {\n return source;\n }\n\n const res = isArray(source) ? [...source] : { ...source };\n\n Object.keys(comparison).forEach(key => {\n if (key in res) {\n if (isObject(res[key]) && isObject(comparison[key])) {\n res[key] = removePropsIfExisting(res[key], comparison[key]);\n } else if (res[key] === comparison[key]) {\n isArray(res) ? res.splice(key, 1) : delete res[key];\n }\n }\n });\n\n return res;\n}\n","export const DEFAULT_ONE_OF_TYPE = \"type\"\nexport const DEFAULT_ONE_OF_VALUE = \"value\"\n","import {\n CMSType,\n DataType,\n Entity,\n EntityReference,\n EntityStatus,\n EntityValues,\n Properties,\n PropertiesOrBuilders,\n Property,\n PropertyBuilder,\n PropertyOrBuilder,\n ResolvedProperties,\n ResolvedProperty\n} from \"../types\";\nimport { DEFAULT_ONE_OF_TYPE, DEFAULT_ONE_OF_VALUE } from \"./common\";\n\nexport function isReadOnly(property: Property | ResolvedProperty): boolean {\n if (property.readOnly)\n return true;\n if (property.dataType === \"date\") {\n if (property.autoValue)\n return true;\n }\n if (property.dataType === \"reference\") {\n return !property.path;\n }\n return false;\n}\n\nexport function isHidden(property: Property | ResolvedProperty): boolean {\n return typeof property.disabled === \"object\" && Boolean(property.disabled.hidden);\n}\n\nexport function isPropertyBuilder<T extends CMSType, M extends Record<string, any>>(propertyOrBuilder?: PropertyOrBuilder<T, M> | Property<T> | ResolvedProperty<T>): propertyOrBuilder is PropertyBuilder<T, M> {\n return typeof propertyOrBuilder === \"function\";\n}\n\nexport function getDefaultValuesFor<M extends Record<string, any>>(properties: PropertiesOrBuilders<M> | ResolvedProperties<M>): Partial<EntityValues<M>> {\n if (!properties) return {};\n return Object.entries(properties)\n .map(([key, property]) => {\n const value = getDefaultValueFor(property as PropertyOrBuilder);\n return value === undefined ? {} : { [key]: value };\n })\n .reduce((a, b) => ({ ...a, ...b }), {}) as EntityValues<M>;\n}\n\nexport function getDefaultValueFor(property: PropertyOrBuilder) {\n if (isPropertyBuilder(property)) return undefined;\n if (property.dataType === \"map\" && property.properties) {\n const defaultValuesFor = getDefaultValuesFor(property.properties as Properties);\n if (Object.keys(defaultValuesFor).length === 0) return undefined;\n return defaultValuesFor;\n } else if (property.defaultValue) {\n return property.defaultValue;\n } else {\n return getDefaultValueForDataType(property.dataType);\n }\n}\n\nexport function getDefaultValueForDataType(dataType: DataType) {\n if (dataType === \"string\") {\n return null;\n } else if (dataType === \"number\") {\n return null;\n } else if (dataType === \"boolean\") {\n return false;\n } else if (dataType === \"date\") {\n return null;\n } else if (dataType === \"array\") {\n return [];\n } else if (dataType === \"map\") {\n return {};\n } else {\n return null;\n }\n}\n\n/**\n * Update the automatic values in an entity before save\n * @group Datasource\n */\nexport function updateDateAutoValues<M extends Record<string, any>>({\n inputValues,\n properties,\n status,\n timestampNowValue,\n setDateToMidnight\n }:\n {\n inputValues: Partial<EntityValues<M>>,\n properties: ResolvedProperties<M>,\n status: EntityStatus,\n timestampNowValue: any,\n setDateToMidnight: (input?: any) => any | undefined\n }): EntityValues<M> {\n return traverseValuesProperties(\n inputValues,\n properties,\n (inputValue, property) => {\n if (property.dataType === \"date\") {\n let resultDate;\n if (status === \"existing\" && property.autoValue === \"on_update\") {\n resultDate = timestampNowValue;\n } else if ((status === \"new\" || status === \"copy\") &&\n (property.autoValue === \"on_update\" || property.autoValue === \"on_create\")) {\n resultDate = timestampNowValue;\n } else {\n resultDate = inputValue;\n }\n if (property.mode === \"date\")\n resultDate = setDateToMidnight(resultDate);\n return resultDate;\n } else {\n return inputValue;\n }\n }\n ) ?? {} as M;\n}\n\n/**\n * Add missing required fields, expected in the collection, to the values of an entity\n * @param values\n * @param properties\n * @group Datasource\n */\nexport function sanitizeData<M extends Record<string, any>>\n(\n values: EntityValues<M>,\n properties: ResolvedProperties<M>\n) {\n const result: any = values;\n Object.entries(properties)\n .forEach(([key, property]) => {\n if (values && values[key] !== undefined) result[key] = values[key];\n else if ((property as Property).validation?.required) result[key] = null;\n });\n return result;\n}\n\nexport function getReferenceFrom<M extends Record<string, any>>(entity: Entity<M>): EntityReference<M> {\n return new EntityReference(entity.id, entity.path);\n}\n\nexport function traverseValuesProperties<M extends Record<string, any>>(\n inputValues: Partial<EntityValues<M>>,\n properties: ResolvedProperties<M>,\n operation: (value: any, property: Property) => any\n): EntityValues<M> | undefined {\n const updatedValues = Object.entries(properties)\n .map(([key, property]) => {\n const inputValue = inputValues && (inputValues)[key];\n const updatedValue = traverseValueProperty(inputValue, property as Property, operation);\n if (updatedValue === undefined) return undefined;\n return ({ [key]: updatedValue });\n })\n .reduce((a, b) => ({ ...a, ...b }), {}) as EntityValues<M>;\n const result = { ...inputValues, ...updatedValues };\n if (Object.keys(result).length === 0) return undefined;\n return result;\n}\n\nexport function traverseValueProperty(inputValue: any,\n property: Property,\n operation: (value: any, property: Property) => any): any {\n\n let value;\n if (property.dataType === \"map\" && property.properties) {\n value = traverseValuesProperties(inputValue, property.properties as ResolvedProperties, operation);\n } else if (property.dataType === \"array\") {\n if (property.of && Array.isArray(inputValue)) {\n value = inputValue.map((e) => traverseValueProperty(e, property.of as Property, operation));\n } else if (property.oneOf && Array.isArray(inputValue)) {\n const typeField = property.oneOf?.typeField ?? DEFAULT_ONE_OF_TYPE;\n const valueField = property.oneOf?.valueField ?? DEFAULT_ONE_OF_VALUE;\n value = inputValue.map((e) => {\n if (e === null) return null;\n if (typeof e !== \"object\") return e;\n const type = e[typeField];\n const childProperty = property.oneOf?.properties[type];\n if (!type || !childProperty) return e;\n return {\n [typeField]: type,\n [valueField]: traverseValueProperty(e[valueField], childProperty, operation)\n };\n });\n } else {\n value = inputValue;\n }\n } else {\n value = operation(inputValue, property);\n }\n\n return value;\n}\n","import { EnumValueConfig, EnumValues } from \"../types\";\nimport { CHIP_COLORS, ChipColorScheme, getColorSchemeForSeed } from \"@firecms/ui\";\n\nexport function enumToObjectEntries(enumValues: EnumValues): EnumValueConfig[] {\n if (Array.isArray(enumValues)) {\n return enumValues;\n } else {\n return Object.entries(enumValues).map(([id, value]) => {\n if (typeof value === \"string\") {\n return {\n id,\n label: value\n }\n } else {\n return {\n ...value,\n id\n }\n }\n });\n }\n}\n\nexport function getLabelOrConfigFrom(enumValues: EnumValueConfig[], key?: string | number): EnumValueConfig | undefined {\n if (!key) return undefined;\n return enumValues.find((entry) => String(entry.id) === String(key));\n}\n\nexport function getColorScheme(enumValues: EnumValueConfig[], key: string | number): ChipColorScheme | undefined {\n const labelOrConfig = getLabelOrConfigFrom(enumValues, key);\n if (!labelOrConfig?.color)\n return getColorSchemeForSeed(key.toString());\n if (typeof labelOrConfig === \"object\" && \"color\" in labelOrConfig) {\n if (typeof labelOrConfig.color === \"string\")\n return CHIP_COLORS[labelOrConfig.color];\n if (typeof labelOrConfig.color === \"object\")\n return labelOrConfig.color;\n }\n return undefined;\n}\n\nexport function isEnumValueDisabled(labelOrConfig?: string | EnumValueConfig) {\n return typeof labelOrConfig === \"object\" && (labelOrConfig as EnumValueConfig).disabled;\n}\n\nexport function buildEnumLabel(\n labelOrConfig?: string | EnumValueConfig\n): string | undefined {\n if (labelOrConfig === undefined)\n return undefined;\n if (typeof labelOrConfig === \"object\") {\n return labelOrConfig.label;\n } else {\n return labelOrConfig;\n }\n}\n","import {\n ArrayProperty,\n CMSType,\n EntityCollection,\n EntityCustomView,\n EntityValues,\n EnumValueConfig,\n EnumValues,\n NumberProperty,\n Properties,\n PropertiesOrBuilders,\n Property,\n PropertyConfig,\n PropertyOrBuilder,\n ResolvedArrayProperty,\n ResolvedEntityCollection,\n ResolvedNumberProperty,\n ResolvedProperties,\n ResolvedProperty,\n ResolvedStringProperty,\n StringProperty,\n UserConfigurationPersistence\n} from \"../types\";\nimport { getValueInPath, mergeDeep } from \"./objects\";\nimport { getDefaultValuesFor, isPropertyBuilder } from \"./entities\";\nimport { DEFAULT_ONE_OF_TYPE } from \"./common\";\nimport { getIn } from \"@firecms/formex\";\nimport { enumToObjectEntries } from \"./enums\";\nimport { isDefaultFieldConfigId } from \"../core\";\n\n// import util from \"util\";\n\nexport const resolveCollection = <M extends Record<string, any>, >\n({\n collection,\n path,\n entityId,\n values,\n previousValues,\n userConfigPersistence,\n fields\n }: {\n collection: EntityCollection<M> | ResolvedEntityCollection<M>;\n path: string,\n entityId?: string,\n values?: Partial<EntityValues<M>>,\n previousValues?: Partial<EntityValues<M>>,\n userConfigPersistence?: UserConfigurationPersistence;\n fields?: Record<string, PropertyConfig>;\n}): ResolvedEntityCollection<M> => {\n\n const collectionOverride = userConfigPersistence?.getCollectionConfig<M>(path);\n const storedProperties = getValueInPath(collectionOverride, \"properties\");\n\n const defaultValues = getDefaultValuesFor(collection.properties);\n const usedValues = values ?? defaultValues;\n const usedPreviousValues = previousValues ?? values ?? defaultValues;\n\n const resolvedProperties = Object.entries(collection.properties)\n .map(([key, propertyOrBuilder]) => {\n const propertyValue = usedValues ? getIn(usedValues, key) : undefined;\n const childResolvedProperty = resolveProperty({\n propertyKey: key,\n propertyOrBuilder: propertyOrBuilder as PropertyOrBuilder | ResolvedProperty,\n values: usedValues,\n previousValues: usedPreviousValues,\n path,\n propertyValue,\n entityId,\n fields\n });\n if (!childResolvedProperty) return {};\n return ({\n [key]: childResolvedProperty\n });\n })\n .filter((a) => a !== null)\n .reduce((a, b) => ({ ...a, ...b }), {}) as ResolvedProperties<M>;\n\n const properties: Properties = mergeDeep(resolvedProperties, storedProperties);\n const cleanedProperties = Object.entries(properties)\n .filter(([_, property]) => Boolean(property?.dataType))\n .map(([id, property]) => ({ [id]: property }))\n .reduce((a, b) => ({ ...a, ...b }), {});\n\n return {\n ...collection,\n properties: cleanedProperties,\n originalCollection: collection\n } as ResolvedEntityCollection<M>;\n\n};\n\n/**\n * Resolve property builders, enums and arrays.\n * @param propertyOrBuilder\n * @param propertyValue\n * @param values\n */\nexport function resolveProperty<T extends CMSType = CMSType, M extends Record<string, any> = any>({\n propertyOrBuilder,\n propertyValue,\n fromBuilder = false,\n ...props\n }: {\n propertyKey?: string,\n propertyOrBuilder: PropertyOrBuilder<T, M> | ResolvedProperty<T>,\n propertyValue?: unknown,\n values?: Partial<M>,\n previousValues?: Partial<M>,\n path?: string,\n entityId?: string,\n index?: number,\n fromBuilder?: boolean;\n fields?: Record<string, PropertyConfig<any>>;\n}): ResolvedProperty<T> | null {\n\n if (typeof propertyOrBuilder === \"object\" && \"resolved\" in propertyOrBuilder) {\n return propertyOrBuilder as ResolvedProperty<T>;\n }\n\n let resolvedProperty: ResolvedProperty<T> | null = null;\n\n if (!propertyOrBuilder) {\n return null;\n } else if (isPropertyBuilder(propertyOrBuilder)) {\n const path = props.path;\n if (!path)\n throw Error(\"Trying to resolve a property builder without specifying the entity path\");\n\n const result: Property<T> | null = propertyOrBuilder({\n ...props,\n path,\n propertyValue,\n values: props.values ?? {},\n previousValues: props.previousValues ?? props.values ?? {}\n });\n\n if (!result) {\n return null;\n }\n\n resolvedProperty = resolveProperty({\n ...props,\n propertyValue,\n propertyOrBuilder: result,\n fromBuilder: true\n });\n } else {\n const property = propertyOrBuilder as Property<T>;\n if (property.dataType === \"map\" && property.properties) {\n const properties = resolveProperties({\n ...props,\n properties: property.properties,\n propertyValue\n });\n resolvedProperty = {\n ...property,\n resolved: true,\n fromBuilder,\n properties\n } as ResolvedProperty<T>;\n } else if (property.dataType === \"array\") {\n resolvedProperty = resolveArrayProperty({\n property,\n propertyValue,\n fromBuilder,\n ...props\n }) as ResolvedProperty<any>;\n } else if ((property.dataType === \"string\" || property.dataType === \"number\") && property.enumValues) {\n resolvedProperty = resolvePropertyEnum(property, fromBuilder) as ResolvedProperty<any>;\n }\n }\n\n if (!resolvedProperty) {\n resolvedProperty = {\n ...propertyOrBuilder,\n resolved: true,\n fromBuilder\n } as ResolvedProperty<T>;\n }\n\n if (resolvedProperty.propertyConfig && !isDefaultFieldConfigId(resolvedProperty.propertyConfig)) {\n const cmsFields = props.fields;\n if (!cmsFields) {\n throw Error(`Trying to resolve a property with key ${resolvedProperty.propertyConfig} that inherits from a custom property config but no custom property configs were provided. Use the property \\`propertyConfigs\\` in your app config to provide them`);\n }\n const customField: PropertyConfig<any> = cmsFields[resolvedProperty.propertyConfig];\n if (!customField) {\n console.warn(`Trying to resolve a property with key ${resolvedProperty.propertyConfig} that inherits from a custom property config but no custom property config with that key was found. Check the \\`propertyConfigs\\` in your app config`)\n console.warn(\"Available property configs\", cmsFields);\n return null;\n }\n if (customField.property) {\n const configPropertyOrBuilder = customField.property;\n if (\"propertyConfig\" in configPropertyOrBuilder) {\n delete configPropertyOrBuilder.propertyConfig;\n }\n const customFieldProperty = resolveProperty<any>({\n propertyOrBuilder: configPropertyOrBuilder,\n propertyValue,\n ...props\n });\n if (customFieldProperty) {\n resolvedProperty = mergeDeep(customFieldProperty, resolvedProperty);\n }\n }\n\n }\n\n return resolvedProperty\n ? {\n ...resolvedProperty,\n resolved: true\n }\n : null;\n}\n\nexport function resolveArrayProperty<T extends any[], M>({\n propertyKey,\n property,\n propertyValue,\n ...props\n }: {\n propertyKey?: string,\n property: ArrayProperty<T> | ResolvedArrayProperty<T>,\n propertyValue: any,\n values?: Partial<M>,\n previousValues?: Partial<M>,\n path?: string,\n entityId?: string,\n index?: number,\n fromBuilder?: boolean;\n fields?: Record<string, PropertyConfig>;\n}): ResolvedArrayProperty {\n\n if (property.of) {\n if (Array.isArray(property.of)) {\n return {\n ...property,\n resolved: true,\n fromBuilder: props.fromBuilder,\n resolvedProperties: property.of.map((p, index) => {\n return resolveProperty({\n propertyKey: `${propertyKey}.${index}`,\n propertyOrBuilder: p as Property<any>,\n propertyValue: Array.isArray(propertyValue) ? propertyValue[index] : undefined,\n ...props,\n index\n });\n })\n } as ResolvedArrayProperty;\n } else {\n const of = property.of;\n const resolvedProperties: ResolvedProperty[] = Array.isArray(propertyValue)\n ? propertyValue.map((v: any, index: number) => resolveProperty({\n propertyKey: `${propertyKey}.${index}`,\n propertyOrBuilder: of,\n propertyValue: v,\n ...props,\n index\n })).filter(e => Boolean(e)) as ResolvedProperty[]\n : [];\n const ofProperty = resolveProperty({\n propertyKey: `${propertyKey}`,\n propertyOrBuilder: of,\n propertyValue: undefined,\n ...props\n });\n if (!ofProperty)\n throw Error(\"When using a property builder as the 'of' prop of an ArrayProperty, you must return a valid child property\")\n return {\n ...property,\n resolved: true,\n fromBuilder: props.fromBuilder,\n of: ofProperty,\n resolvedProperties\n } as ResolvedArrayProperty;\n }\n } else if (property.oneOf) {\n const typeField = property.oneOf?.typeField ?? DEFAULT_ONE_OF_TYPE;\n const resolvedProperties: ResolvedProperty[] = Array.isArray(propertyValue)\n ? propertyValue.map((v, index) => {\n const type = v && v[typeField];\n const childProperty = property.oneOf?.properties[type];\n if (!type || !childProperty) return null;\n return resolveProperty({\n propertyKey: `${propertyKey}.${index}`,\n propertyOrBuilder: childProperty,\n propertyValue,\n ...props\n });\n }).filter(e => Boolean(e)) as ResolvedProperty[]\n : [];\n const properties = resolveProperties<any>({\n properties: property.oneOf.properties,\n propertyValue: undefined,\n ...props\n });\n return {\n ...property,\n resolved: true,\n oneOf: {\n ...property.oneOf,\n properties\n },\n fromBuilder: props.fromBuilder,\n resolvedProperties\n } as ResolvedArrayProperty;\n } else if (!property.Field) {\n throw Error(\"The array property needs to declare an 'of' or a 'oneOf' property, or provide a custom `Field`\")\n } else {\n return {\n ...property,\n resolved: true,\n fromBuilder: props.fromBuilder\n } as ResolvedArrayProperty;\n }\n\n}\n\n/**\n * Resolve enums and arrays for properties\n * @param properties\n * @param value\n */\nexport function resolveProperties<M extends Record<string, any>>({\n properties,\n propertyValue,\n ...props\n }: {\n properties: PropertiesOrBuilders<M>,\n propertyValue: unknown,\n values?: Partial<M>,\n previousValues?: Partial<M>,\n path?: string,\n entityId?: string,\n index?: number,\n fromBuilder?: boolean;\n fields?: Record<string, PropertyConfig>;\n}): ResolvedProperties<M> {\n return Object.entries<PropertyOrBuilder>(properties as Record<string, PropertyOrBuilder>)\n .map(([key, property]) => {\n const thisPropertyValue = propertyValue && typeof propertyValue === \"object\" ? getValueInPath(propertyValue, key) : undefined;\n const childResolvedProperty = resolveProperty({\n propertyKey: key,\n propertyOrBuilder: property,\n propertyValue: thisPropertyValue,\n ...props\n });\n if (!childResolvedProperty) return {};\n return {\n [key]: childResolvedProperty\n };\n })\n .filter((a) => a !== null)\n .reduce((a, b) => ({ ...a, ...b }), {}) as ResolvedProperties<M>;\n}\n\n/**\n * Resolve enum aliases for a string or number property\n * @param property\n * @param fromBuilder\n */\nexport function resolvePropertyEnum(property: StringProperty | NumberProperty, fromBuilder?: boolean): ResolvedStringProperty | ResolvedNumberProperty {\n if (typeof property.enumValues === \"object\") {\n return {\n ...property,\n resolved: true,\n enumValues: enumToObjectEntries(property.enumValues)?.filter((value) => value && value.id && value.label) ?? [],\n fromBuilder: fromBuilder ?? false\n }\n }\n return property as ResolvedStringProperty | ResolvedNumberProperty;\n}\n\nexport function resolveEnumValues(input: EnumValues): EnumValueConfig[] | undefined {\n if (typeof input === \"object\") {\n return Object.entries(input).map(([id, value]) =>\n (typeof value === \"string\"\n ? {\n id,\n label: value\n }\n : value));\n } else if (Array.isArray(input)) {\n return input as EnumValueConfig[];\n } else {\n return undefined;\n }\n}\n\nexport function resolveEntityView(entityView: string | EntityCustomView<any>, contextEntityViews?: EntityCustomView<any>[]): EntityCustomView<any> | undefined {\n if (typeof entityView === \"string\") {\n return contextEntityViews?.find((entry) => entry.key === entityView);\n } else {\n return entityView;\n }\n}\n","import { EntityCollection, EntityCustomView } from \"../types\";\nimport { getCollectionPathsCombinations, removeInitialAndTrailingSlashes } from \"./navigation_utils\";\nimport { resolveEntityView } from \"./resolutions\";\n\nexport type NavigationViewInternal<M extends Record<string, any> = any> =\n | NavigationViewEntityInternal<M>\n | NavigationViewCollectionInternal<M>\n | NavigationViewEntityCustomInternal<M>;\n\nexport interface NavigationViewEntityInternal<M extends Record<string, any>> {\n type: \"entity\";\n entityId: string;\n path: string;\n parentCollection: EntityCollection<M>;\n}\n\nexport interface NavigationViewCollectionInternal<M extends Record<string, any>> {\n type: \"collection\";\n path: string;\n collection: EntityCollection<M>;\n}\n\nexport interface NavigationViewEntityCustomInternal<M extends Record<string, any>> {\n type: \"custom_view\";\n path: string;\n view: EntityCustomView<M>;\n}\n\nexport function getNavigationEntriesFromPathInternal(props: {\n path: string,\n collections: EntityCollection[] | undefined,\n currentFullPath?: string,\n contextEntityViews?: EntityCustomView<any>[]\n}): NavigationViewInternal [] {\n\n const {\n path,\n collections = [],\n currentFullPath\n } = props;\n\n const subpaths = removeInitialAndTrailingSlashes(path).split(\"/\");\n const subpathCombinations = getCollectionPathsCombinations(subpaths);\n\n const result: NavigationViewInternal[] = [];\n for (let i = 0; i < subpathCombinations.length; i++) {\n const subpathCombination = subpathCombinations[i];\n\n const collection: EntityCollection<any> | undefined = collections && collections.find((entry) => entry.id === subpathCombination || entry.path === subpathCombination);\n\n if (collection) {\n const pathOrAlias = collection.id ?? collection.path;\n const collectionPath = currentFullPath && currentFullPath.length > 0\n ? (currentFullPath + \"/\" + pathOrAlias)\n : pathOrAlias;\n\n result.push({\n type: \"collection\",\n path: collectionPath,\n collection\n });\n const restOfThePath = removeInitialAndTrailingSlashes(removeInitialAndTrailingSlashes(path).replace(subpathCombination, \"\"));\n const nextSegments = restOfThePath.length > 0 ? restOfThePath.split(\"/\") : [];\n if (nextSegments.length > 0) {\n const entityId = nextSegments[0];\n const fullPath = collectionPath + \"/\" + entityId;\n result.push({\n type: \"entity\",\n entityId,\n path: collectionPath,\n parentCollection: collection\n });\n if (nextSegments.length > 1) {\n const newPath = nextSegments.slice(1).join(\"/\");\n if (!collection) {\n throw Error(\"collection not found resolving path: \" + collection);\n }\n const entityViews = collection.entityViews;\n const customView = entityViews && entityViews\n .map((entry) => resolveEntityView(entry, props.contextEntityViews))\n .filter(Boolean)\n .find((entry) => entry!.key === newPath);\n if (customView) {\n const path = currentFullPath && currentFullPath.length > 0\n ? (currentFullPath + \"/\" + customView.key)\n : customView.key;\n result.push({\n type: \"custom_view\",\n path,\n view: customView\n });\n } else if (collection.subcollections) {\n result.push(...getNavigationEntriesFromPathInternal({\n path: newPath,\n collections: collection.subcollections,\n currentFullPath: fullPath,\n contextEntityViews: props.contextEntityViews\n }));\n }\n }\n }\n break;\n }\n\n }\n return result;\n}\n","import {\n DefaultSelectedViewBuilder,\n DefaultSelectedViewParams,\n EntityCollection,\n PermissionsBuilder,\n PropertiesOrBuilders,\n PropertyOrBuilder\n} from \"../types\";\nimport { isPropertyBuilder } from \"./entities\";\n\nexport function sortProperties<M extends Record<string, any>>(properties: PropertiesOrBuilders<M>, propertiesOrder?: (keyof M)[]): PropertiesOrBuilders<M> {\n try {\n const propertiesKeys = Object.keys(properties);\n const allPropertiesOrder = propertiesOrder ?? propertiesKeys;\n return allPropertiesOrder\n .map((key) => {\n if (properties[key as keyof M]) {\n const property = properties[key] as PropertyOrBuilder;\n if (!isPropertyBuilder(property) && property?.dataType === \"map\" && property.properties) {\n return ({\n [key]: {\n ...property,\n properties: sortProperties(property.properties, property.propertiesOrder)\n }\n });\n } else {\n return ({ [key]: property });\n }\n } else {\n return undefined;\n }\n })\n .filter((a) => a !== undefined)\n .reduce((a: any, b: any) => ({ ...a, ...b }), {}) as PropertiesOrBuilders<M>;\n } catch (e) {\n console.error(\"Error sorting properties\", e);\n return properties;\n }\n}\n\nexport function resolveDefaultSelectedView(\n defaultSelectedView: string | DefaultSelectedViewBuilder | undefined,\n params: DefaultSelectedViewParams\n) {\n if (!defaultSelectedView) {\n return undefined;\n } else if (typeof defaultSelectedView === \"string\") {\n return defaultSelectedView;\n } else {\n return defaultSelectedView(params);\n }\n}\n\n/**\n * If a collection is not applying permissions, we apply the given permissionsBuilder.\n * This is used to apply the role permissions to the collections, unless they are already\n * applying permissions.\n * @param collections\n * @param permissionsBuilder\n */\nexport const applyPermissionsFunctionIfEmpty = (collections: EntityCollection[], permissionsBuilder?: PermissionsBuilder): EntityCollection[] => {\n\n return collections.map(collection => {\n if (collection.permissions) {\n return collection;\n }\n return ({\n ...collection,\n permissions: permissionsBuilder\n });\n });\n}\n","const kebabCaseRegex = /[A-Z]{2,}(?=[A-Z][a-z]+[0-9]*|\\b)|[A-Z]?[a-z]+[0-9]*|[A-Z]|[0-9]+/g;\n\nexport const toKebabCase = (str: string) => {\n const regExpMatchArray = str.match(kebabCaseRegex);\n if (!regExpMatchArray) return \"\";\n return regExpMatchArray\n .map(x => x.toLowerCase())\n .join(\"-\");\n};\n\nconst snakeCaseRegex = /[A-Z]{2,}(?=[A-Z][a-z]+[0-9]*|\\b)|[A-Z]?[a-z]+[0-9]*|[A-Z]|[0-9]+/g;\n\nexport const toSnakeCase = (str: string) => {\n const regExpMatchArray = str.match(snakeCaseRegex);\n if (!regExpMatchArray) return \"\";\n return regExpMatchArray\n .map(x => x.toLowerCase())\n .join(\"_\");\n};\n\nexport function randomString(strLength = 5) {\n return Math.random().toString(36).slice(2, 2 + strLength);\n}\n\nexport function randomColor() {\n return Math.floor(Math.random() * 16777215).toString(16);\n}\n\nexport function slugify(text?: string, separator = \"_\", lowercase = true) {\n if (!text) return \"\";\n const from = \"ãàáäâẽèéëêìíïîõòóöôùúüûñç·/_,:;-\"\n const to = `aaaaaeeeeeiiiiooooouuuunc${separator}${separator}${separator}${separator}${separator}${separator}${separator}`;\n\n for (let i = 0, l = from.length; i < l; i++) {\n text = text.replace(new RegExp(from.charAt(i), \"g\"), to.charAt(i));\n }\n\n text = text\n .toString() // Cast to string\n .replace(/\\s+/g, separator) // Replace spaces with separator\n .replace(/&/g, separator) // Replace & with separator\n .replace(/[^\\w\\\\-]+/g, \"\") // Remove all non-word chars\n .replace(new RegExp(\"\\\\\" + separator + \"\\\\\" + separator + \"+\", \"g\"),\n separator) // Replace multiple separators with single one\n .trim() // Remove whitespace from both sides of a string\n .replace(/^\\s+|\\s+$/g, \"\");\n\n return lowercase\n ? text.toLowerCase() // Convert the string to lowercase letters\n : text;\n}\n\nexport function unslugify(slug?: string): string {\n if (!slug) return \"\";\n if (slug.includes(\"-\") || slug.includes(\"_\") || !slug.includes(\" \")) {\n const result = slug.replace(/[-_]/g, \" \");\n return result.replace(/\\w\\S*/g, function (txt) {\n return txt.charAt(0).toUpperCase() + txt.substr(1);\n });\n } else {\n return slug;\n }\n}\n","export const defaultDateFormat = \"MMMM dd, yyyy, HH:mm:ss\";\n","export const COLLECTION_PATH_SEPARATOR = \"::\";\n\n/**\n * Remove the entity ids from a given path\n * `products/B44RG6APH/locales` => `products::locales`\n * @param path\n */\nexport function stripCollectionPath(path: string): string {\n return segmentsToStrippedPath(fullPathToCollectionSegments(path));\n}\n\nexport function segmentsToStrippedPath(paths: string[]) {\n if (paths.length === 1)\n return paths[0];\n return paths.reduce((a, b) => `${a}${COLLECTION_PATH_SEPARATOR}${b}`);\n}\n\n/**\n * Extract the collection path routes\n * `products/B44RG6APH/locales` => [`products`, `locales`]\n * @param path\n */\nexport function fullPathToCollectionSegments(path: string): string[] {\n return path\n .split(\"/\")\n .filter((e, i) => i % 2 === 0);\n}\n","export function serializeRegExp(input: RegExp): string {\n if (!input) return \"\";\n // const fragments = input.toString().match(/\\/(.*?)\\/([a-z]*)?$/i);\n // if (fragments) {\n // if (fragments[2])\n // return input.toString();\n // return fragments[1];\n // }\n return input.toString();\n}\n\n/**\n * Get a RegExp out of a serialized string\n * @param input\n */\nexport function hydrateRegExp(input?: string): RegExp | undefined {\n if (!input) return undefined;\n const fragments = input.match(/\\/(.*?)\\/([a-z]*)?$/i);\n if (fragments) {\n return new RegExp(fragments[1], fragments[2] || \"\");\n } else {\n return new RegExp(input, \"\");\n }\n}\n\nexport function isValidRegExp(input: string): boolean {\n const fullRegexp = input.match(/\\/((?![*+?])(?:[^\\r\\n[/\\\\]|\\\\.|\\[(?:[^\\r\\n\\]\\\\]|\\\\.)*])+)\\/((?:g(?:im?|mi?)?|i(?:gm?|mg?)?|m(?:gi?|ig?)?)?)/);\n if (fullRegexp)\n return true;\n const simpleRegexp = input.match(/((?![*+?])(?:[^\\r\\n[/\\\\]|\\\\.|\\[(?:[^\\r\\n\\]\\\\]|\\\\.)*])+)/);\n return !!simpleRegexp;\n}\n","import React from \"react\";\n\nexport function useDebouncedCallback<T>(value: T, callback: () => void, immediate: boolean, timeoutMs = 300) {\n\n const pendingUpdate = React.useRef(false);\n const performUpdate = () => {\n callback();\n pendingUpdate.current = false;\n };\n\n const handlerRef = React.useRef<number | undefined>(undefined);\n\n React.useEffect(\n () => {\n pendingUpdate.current = true;\n clearTimeout(handlerRef.current);\n handlerRef.current = setTimeout(performUpdate, timeoutMs) as any;\n return () => {\n if (immediate)\n performUpdate();\n };\n },\n [immediate, value]\n );\n}\n","import React from \"react\";\n\nimport { EntityCollection, PropertiesOrBuilders, PropertyConfig, PropertyOrBuilder, ResolvedProperty } from \"../types\";\nimport { isPropertyBuilder } from \"./entities\";\nimport { resolveProperty } from \"./resolutions\";\nimport { CircleIcon, FunctionsIcon } from \"@firecms/ui\";\nimport { getFieldConfig } from \"../core\";\n\nexport function isReferenceProperty(propertyOrBuilder: PropertyOrBuilder,\n fields: Record<string, PropertyConfig>) {\n const resolvedProperty = resolveProperty({\n propertyKey: \"ignore\", // TODO\n propertyOrBuilder,\n fields\n });\n if (!resolvedProperty) return null;\n if (resolvedProperty.dataType === \"reference\") {\n return true;\n }\n if (resolvedProperty.dataType === \"array\") {\n if (Array.isArray(resolvedProperty.of)) return false;\n else return resolvedProperty.of?.dataType === \"reference\"\n }\n return false;\n}\n\nexport function getIdIcon(size: \"small\" | \"medium\" | \"large\"): React.ReactNode {\n return <CircleIcon size={size}/>;\n}\n\nexport function getIconForWidget(widget: PropertyConfig | undefined,\n size: \"small\" | \"medium\" | \"large\") {\n const Icon = widget?.Icon ?? CircleIcon;\n return <Icon size={size}/>;\n}\n\nexport function getIconForProperty(\n property: PropertyOrBuilder | ResolvedProperty,\n size: \"small\" | \"medium\" | \"large\" = \"small\",\n fields: Record<string, PropertyConfig> = {}\n): React.ReactNode {\n\n if (isPropertyBuilder(property)) {\n return <FunctionsIcon size={size}/>;\n } else {\n const widget = getFieldConfig(property, fields);\n return getIconForWidget(widget, size);\n }\n}\n\nexport function getColorForProperty(property: PropertyOrBuilder, fields: Record<string, PropertyConfig>): string {\n if (isPropertyBuilder(property)) {\n return \"#888\";\n } else {\n const widget = getFieldConfig(property, fields);\n return widget?.color ?? \"#666\";\n }\n}\n\n/**\n * Get a property in a property tree from a path like\n * `address.street`\n * @param properties\n * @param path\n */\nexport function getPropertyInPath<M extends Record<string, any>>(properties: PropertiesOrBuilders<M>, path: string): PropertyOrBuilder<any, M> | undefined {\n if (typeof properties === \"object\") {\n if (path in properties) {\n return properties[path];\n }\n if (path.includes(\".\")) {\n const pathSegments = path.split(\".\");\n const childProperty = properties[pathSegments[0]];\n if (typeof childProperty === \"object\" && childProperty.dataType === \"map\" && childProperty.properties) {\n return getPropertyInPath(childProperty.properties, pathSegments.slice(1).join(\".\"))\n }\n }\n }\n return undefined;\n}\n\nexport function getResolvedPropertyInPath(properties: Record<string, ResolvedProperty>, path: string): ResolvedProperty | undefined {\n if (typeof properties === \"object\") {\n if (path in properties) {\n return properties[path];\n }\n if (path.includes(\".\")) {\n const pathSegments = path.split(\".\");\n const childProperty = properties[pathSegments[0]];\n if (childProperty.dataType === \"map\" && childProperty.properties) {\n return getResolvedPropertyInPath(childProperty.properties, pathSegments.slice(1).join(\".\"))\n }\n }\n }\n return undefined;\n}\n\n// replace the dot notation with brackets\n// address.street => address[street]\nexport function getBracketNotation(path: string): string {\n return path.replace(/\\.([^.]*)/g, \"[$1]\");\n}\n\n/**\n * Get properties exclusively indexed by their order\n * @param properties\n * @param propertiesOrder\n */\nexport function getPropertiesWithPropertiesOrder<M extends Record<string, any>>(properties: PropertiesOrBuilders<M>, propertiesOrder?: Extract<keyof M, string>[]): PropertiesOrBuilders<M> {\n if (!propertiesOrder) return properties;\n const result: PropertiesOrBuilders<any> = {};\n propertiesOrder.filter(Boolean).forEach(path => {\n const property = getPropertyInPath(properties, path);\n if (typeof property === \"object\" && property.dataType === \"map\" && property.properties) {\n result[path] = {\n ...property,\n properties: getPropertiesWithPropertiesOrder(property.properties, property.propertiesOrder ?? [])\n }\n }\n if (property) {\n result[path] = property;\n }\n });\n return result;\n}\n\nexport function getDefaultPropertiesOrder(collection: EntityCollection<any>): string[] {\n if (collection.propertiesOrder) return collection.propertiesOrder;\n return [...Object.keys(collection.properties), ...(collection.additionalFields ?? []).map(field => field.key)];\n}\n","import { AuthController, Entity, EntityCollection, Permissions, User } from \"../types\";\nimport { fullPathToCollectionSegments } from \"./paths\";\n\nconst DEFAULT_PERMISSIONS = {\n read: true,\n edit: true,\n create: true,\n delete: true\n};\n\nexport function resolvePermissions<M extends Record<string, any>, UserType extends User>\n(collection: EntityCollection<M>,\n authController: AuthController<UserType>,\n path: string,\n entity: Entity<M> | null): Permissions | undefined {\n\n const permission = collection.permissions;\n if (permission === undefined) {\n return DEFAULT_PERMISSIONS;\n } else if (typeof permission === \"object\") {\n return permission as Permissions;\n } else if (typeof permission === \"function\") {\n const pathSegments = fullPathToCollectionSegments(path);\n return permission({\n entity,\n path,\n user: authController.user,\n authController,\n collection,\n pathSegments\n });\n }\n console.error(\"Permissions:\", permission);\n throw Error(\"New type of permission added and not mapped\");\n}\n\nexport function canEditEntity<M extends Record<string, any>, UserType extends User>\n(\n collection: EntityCollection<M>,\n authController: AuthController<UserType>,\n path: string,\n entity: Entity<M> | null): boolean {\n return resolvePermissions(collection, authController, path, entity)?.edit ?? DEFAULT_PERMISSIONS.edit;\n}\n\nexport function canCreateEntity<M extends Record<string, any>, UserType extends User>\n(\n collection: EntityCollection<M>,\n authController: AuthController<UserType>,\n path: string,\n entity: Entity<M> | null): boolean {\n return resolvePermissions(collection, authController, path, entity)?.create ?? DEFAULT_PERMISSIONS.create;\n}\n\nexport function canDeleteEntity<M extends Record<string, any>, UserType extends User>\n(\n collection: EntityCollection<M>,\n authController: AuthController<UserType>,\n path: string,\n entity: Entity<M> | null): boolean {\n return resolvePermissions(collection, authController, path, entity)?.delete ?? DEFAULT_PERMISSIONS.delete;\n}\n\n// export function resolveCollectionsPermissions(roles: Role[]): Record<string, Permissions> {\n// const collectionIds = Array.from(new Set(roles.flatMap(role => Object.keys(role.collections))));\n// return collectionIds\n// .map((colId) => {\n// const rolesWithCollection = roles.filter((role) => colId in Object.keys(role.collections));\n// return {\n// [colId]: rolesWithCollection\n// .map(role => role.collections[colId])\n// .reduce((permA, permB) => {\n// return {\n// read: permA.read ?? permB.read ?? false,\n// create: permA.create ?? permB.create ?? false,\n// edit: permA.edit ?? permB.edit ?? false,\n// delete: permA.delete ?? permB.delete ?? false\n// };\n// })\n// };\n// })\n// .reduce((a, b) => ({ ...a, ...b }), {});\n// }\n","export const icon_synonyms = {\n abc: \"alphabet character font letter symbol text type\",\n access_alarm: \"clock time\",\n access_alarms: \"clock time\",\n accessibility: \"accessible body handicap help human people person user\",\n accessibility_new: \"accessible arms body handicap help human people person user\",\n accessible: \"accessibility body handicap help human people person user wheelchair\",\n accessible_forward: \"accessibility body handicap help human people person wheelchair\",\n access_time: \"clock time\",\n account_balance: \"bank bill building card cash coin commerce court credit currency dollars finance money online payment structure temple transaction\",\n account_balance_wallet: \"bank bill card cash coin commerce credit currency dollars finance money online payment transaction\",\n account_box: \"avatar face human people person profile square thumbnail user\",\n account_circle: \"avatar face human people person profile thumbnail user\",\n account_tree: \"analytics chart connect data diagram flow infographic measure metrics process project sitemap square statistics structure tracking\",\n ac_unit: \"air cold conditioner freeze snowflake temperature weather winter\",\n adb: \"android bridge debug\",\n add: \"+ create item new plus symbol\",\n add_alarm: \"clock plus time\",\n add_alert: \"+ active alarm announcement bell callout chime information new notifications notify plus reminder ring sound symbol\",\n add_a_photo: \"+ camera lens new photography picture plus symbol\",\n add_box: \"create new plus square symbol\",\n add_business: \"+ bill building card cash coin commerce company credit currency dollars market money new online payment plus retail shopping storefront symbol\",\n add_card: \"+ bill cash coin commerce cost credit currency dollars finance money new online payment plus price shopping symbol\",\n add_chart: \"+ analytics bars data diagram infographic measure metrics new plus statistics symbol tracking\",\n add_circle: \"+ create new plus\",\n add_circle_outline: \"+ create new plus\",\n add_comment: \"+ bubble chat communicate feedback message new plus speech symbol\",\n add_ic_call: \"+ cell contact device hardware mobile new plus symbol telephone\",\n add_link: \"attach clip new plus symbol\",\n add_location: \"+ destination direction gps maps new pin place plus stop symbol\",\n add_location_alt: \"+ destination direction maps new pin place plus stop symbol\",\n add_moderator: \"+ certified new plus privacy private protection security shield symbol verified\",\n add_photo_alternate: \"+ image landscape mountains new photography picture plus symbol\",\n add_road: \"+ destination direction highway maps new plus stop street symbol traffic\",\n add_shopping_cart: \"card cash checkout coin commerce credit currency dollars money online payment plus\",\n add_task: \"+ approve check circle completed increase mark ok plus select tick yes\",\n add_to_drive: \"+ app backup cloud data files folders gdrive google plus recovery storage\",\n add_to_home_screen: \"Android add arrow cell device hardware iOS mobile phone tablet to up\",\n add_to_photos: \"collection image landscape mountains photography picture plus\",\n add_to_queue: \"+ Android backlog chrome desktop device display hardware iOS lineup mac monitor new plus screen symbol television watch web window\",\n adf_scanner: \"document feeder machine office\",\n adjust: \"alter center circles control dot edit filter fix image mix move setting slider sort switch target tune\",\n admin_panel_settings: \"account avatar certified face human people person privacy private profile protection security shield user verified\",\n ad_units: \"Android banner cell device hardware iOS mobile notifications phone tablet top\",\n agriculture: \"automobile cars cultivation farm harvest maps tractor transport travel truck vehicle\",\n air: \"blowing breeze flow wave weather wind\",\n airlines: \"airplane airport flight transportation travel trip\",\n airline_seat_flat: \"bed body business class first human people person rest sleep travel\",\n airline_seat_flat_angled: \"bed body business class first human people person rest sleep travel\",\n airline_seat_individual_suite: \"bed body business class first human people person rest sleep travel\",\n airline_seat_legroom_extra: \"body feet human people person sitting space travel\",\n airline_seat_legroom_normal: \"body feet human people person sitting space travel\",\n airline_seat_legroom_reduced: \"body feet human people person sitting space travel\",\n airline_seat_recline_extra: \"body feet human legroom people person sitting space travel\",\n airline_seat_recline_normal: \"body extra feet human legroom people person sitting space travel\",\n airline_stops: \"arrow destination direction layover location maps place transportation travel trip\",\n airplanemode_active: \"flight flying on signal\",\n airplanemode_inactive: \"airport disabled enabled flight flying maps offline slash transportation travel\",\n airplane_ticket: \"airport boarding flight fly maps pass transportation travel\",\n airplay: \"apple arrow cast connect control desktop device display monitor screen signal television tv\",\n airport_shuttle: \"automobile bus cars commercial delivery direction maps mini public transportation travel truck van vehicle\",\n alarm: \"alart bell clock countdown date notification schedule time\",\n alarm_add: \"+ alart bell clock countdown date new notification plus schedule symbol time\",\n alarm_off: \"alart bell clock disabled duration enabled notification slash stop timer watch\",\n alarm_on: \"alart bell checkmark clock disabled duration enabled notification off ready slash start timer watch\",\n album: \"artist audio bvb cd computer data disk file music play record sound storage track vinyl\",\n align_horizontal_center: \"alignment format layout lines paragraph rules style text\",\n align_horizontal_left: \"alignment format layout lines paragraph rules style text\",\n align_horizontal_right: \"alignment format layout lines paragraph rules style text\",\n align_vertical_bottom: \"alignment format layout lines paragraph rules style text\",\n align_vertical_center: \"alignment format layout lines paragraph rules style text\",\n align_vertical_top: \"alignment format layout lines paragraph rules style text\",\n all_inbox: \"Inbox delivered delivery email letter message post send\",\n all_inclusive: \"endless forever infinite infinity loop mobius neverending strip sustainability sustainable\",\n all_out: \"arrows circle directional expand shape\",\n alternate_email: \"@ address contact tag\",\n alt_route: \"alternate alternative arrows direction maps navigation options other routes split symbol\",\n analytics: \"assessment bar chart data diagram infographic measure metrics statistics tracking\",\n anchor: \"google logo\",\n android: \"brand character logo mascot operating system toy\",\n animation: \"circles film motion movement movie moving sequence video\",\n announcement: \"! alert attention balloon bubble caution chat comment communicate danger error exclamation feedback important mark message news notification speech symbol warning\",\n aod: \"Android always device display hardware homescreen iOS mobile phone tablet\",\n apartment: \"accommodation architecture building city company estate flat home house office places real residence residential shelter units workplace\",\n api: \"developer development enterprise software\",\n app_blocking: \"Android applications cancel cell device hardware iOS mobile phone stopped tablet\",\n apple: \"brand logo\",\n app_registration: \"apps edit pencil register\",\n approval: \"apply approvals approve certificate certification disapproval drive file impression ink mark postage stamp\",\n apps: \"all applications circles collection components dots grid homescreen icons interface squares ui ux\",\n app_settings_alt: \"Android applications cell device gear hardware iOS mobile phone tablet\",\n app_shortcut: \"bookmarked favorite highlight important mobile saved software special star\",\n apps_outage: \"all applications circles collection components dots grid interface squares ui ux\",\n architecture: \"art compass design drawing engineering geometric tool\",\n archive: \"inbox mail store\",\n arrow_back: \"application components direction interface left navigation previous screen ui ux website\",\n arrow_back_ios: \"application chevron components direction interface left navigation previous screen ui ux website\",\n arrow_back_ios_new: \"application chevron components direction interface left navigation previous screen ui ux website\",\n arrow_circle_down: \"direction navigation\",\n arrow_circle_up: \"direction navigation\",\n arrow_downward: \"application components direction interface navigation screen ui ux website\",\n arrow_drop_down: \"application components direction interface navigation screen ui ux website\",\n arrow_drop_down_circle: \"application components direction interface navigation screen ui ux website\",\n arrow_drop_up: \"application components direction interface navigation screen ui ux website\",\n arrow_forward: \"application arrows components direction interface navigation right screen ui ux website\",\n arrow_forward_ios: \"application chevron components direction interface navigation next right screen ui ux website\",\n arrow_left: \"application backstack backward components direction interface navigation previous screen ui ux website\",\n arrow_right: \"application components continue direction forward interface navigation screen ui ux website\",\n arrow_right_alt: \"arrows direction east navigation pointing shape\",\n arrow_upward: \"application components direction interface navigation screen submit ui ux website\",\n article: \"clarify document file news page paper text writing\",\n art_track: \"album artist audio display format image insert music photography picture sound tracks\",\n aspect_ratio: \"expand image monitor resize resolution scale screen square\",\n assessment: \"analytics bars chart data diagram infographic measure metrics report statistics tracking\",\n assignment: \"article clipboard document task text writing\",\n assignment_ind: \"account clipboard document face people person profile task user\",\n assignment_late: \"! alert announcement attention caution clipboard danger document error exclamation important mark notification symbol task warning\",\n assignment_return: \"arrow back clipboard document left point retun task\",\n assignment_returned: \"arrow clipboard document down point task\",\n assignment_turned_in: \"approve checkmark clipboard complete document done finished ok select task tick validate verified yes\",\n assistant: \"bubble chat comment communicate feedback message recommendation speech star suggestion twinkle\",\n assistant_direction: \"destination location maps navigate navigation pin place right stop\",\n assistant_photo: \"flag recommendation smart star suggestion\",\n assured_workload: \"compliance confidential federal government regulatory secure sensitive\",\n atm: \"alphabet automated bill card cart cash character coin commerce credit currency dollars font letter machine money online payment shopping symbol teller text type\",\n attach_email: \"attachment clip compose envelop letter link message send\",\n attach_file: \"add item link mail media paperclip\",\n attachment: \"compose file image item link paperclip\",\n attach_money: \"bill card cash coin commerce cost credit currency dollars finance online payment price profit sale symbol\",\n attractions: \"amusement entertainment ferris fun maps park places wheel\",\n attribution: \"attribute body copyright copywriter human people person\",\n audio_file: \"document key music note sound track\",\n audiotrack: \"key music note sound\",\n auto_awesome: \"adjust editing enhance filter image photography photos setting stars\",\n auto_awesome_mosaic: \"adjust collage editing enhance filter grid image layout photographs photography photos pictures setting\",\n auto_awesome_motion: \"adjust animation collage editing enhance filter image live photographs photography photos pictures setting video\",\n auto_delete: \"bin can clock date garbage remove schedule time trash\",\n auto_fix_high: \"adjust editing enhance erase magic modify pen stars tool wand\",\n auto_fix_normal: \"edit erase magic modify stars wand\",\n auto_fix_off: \"disabled edit enabled erase magic modify on slash stars wand\",\n autofps_select: \"A alphabet character font frame frequency letter per rate seconds symbol text type\",\n auto_graph: \"analytics chart data diagram infographic line measure metrics stars statistics tracking\",\n auto_mode: \"around arrows direction inprogress loading navigation nest refresh renew rotate turn\",\n autorenew: \"around arrows cached direction inprogress loader loading navigation pending refresh rotate status turn\",\n auto_stories: \"audiobook flipping pages reading story\",\n av_timer: \"clock countdown duration minutes seconds stopwatch\",\n baby_changing_station: \"babies bathroom body children father human infant kids mother newborn people person toddler wc young\",\n backpack: \"bookbag knapsack storage travel\",\n backspace: \"arrow cancel clear correct delete erase remove\",\n backup: \"arrow cloud data drive files folders point storage submit upload\",\n backup_table: \"drive files folders format layout stack storage\",\n badge: \"account avatar card certified employee face human identification name people person profile security user work\",\n bakery_dining: \"bread breakfast brunch croissant food\",\n balance: \"equal equilibrium equity impartiality justice parity stability. steadiness symmetry\",\n balcony: \"architecture doors estate home house maps outside place real residence residential stay terrace window\",\n ballot: \"bullet bulllet election list point poll vote\",\n bar_chart: \"analytics anlytics data diagram infographic measure metrics statistics tracking\",\n batch_prediction: \"bulb idea light\",\n bathroom: \"closet home house place plumbing shower sprinkler wash water wc\",\n bathtub: \"bathing bathroom clean home hotel human person shower travel\",\n battery_alert: \"! attention caution cell charge danger error exclamation important mark mobile notification power symbol warning\",\n battery_charging_full: \"cell charge lightening lightning mobile power thunderbolt\",\n battery_full: \"cell charge mobile power\",\n battery_saver: \"+ add charge charging new plus power symbol\",\n battery_std: \"cell charge mobile plus power standard\",\n battery_unknown: \"? assistance cell charge help information mark mobile power punctuation question support symbol\",\n beach_access: \"parasol places summer sunny umbrella\",\n bed: \"bedroom double full furniture home hotel house king night pillows queen rest size sleep\",\n bedroom_baby: \"babies children home horse house infant kid newborn rocking toddler young\",\n bedroom_child: \"children furniture home hotel house kid night pillows rest size sleep twin young\",\n bedroom_parent: \"double full furniture home hotel house king master night pillows queen rest sizem sleep\",\n bedtime: \"nightime sleep\",\n bedtime_off: \"nightime sleep\",\n beenhere: \"approve archive bookmark checkmark complete done favorite label library reading remember ribbon save select tag tick validate verified yes\",\n bento: \"box dinner food lunch meal restaurant takeout\",\n bike_scooter: \"automobile cars maps transportation vehicle vespa\",\n biotech: \"chemistry laboratory microscope research science technology test\",\n blender: \"appliance cooking electric juicer kitchen machine vitamix\",\n blinds_closed: \"cover curtains nest shutter sunshade\",\n block: \"allowed avoid banned cancel close disable entry exit not prohibited quit remove stop\",\n bloodtype: \"donate droplet emergency hospital medicine negative positive water\",\n bluetooth: \"cast connection device network paring streaming symbol wireless\",\n bluetooth_audio: \"connection device music signal sound symbol\",\n bluetooth_connected: \"cast connection device network paring streaming symbol wireless\",\n bluetooth_disabled: \"cast connection device enabled network offline paring slash streaming symbol wireless\",\n bluetooth_drive: \"automobile cars cast connection device maps paring streaming symbol transportation travel vehicle wireless\",\n bluetooth_searching: \"connection device network paring symbol wireless\",\n blur_circular: \"circle dots editing effect enhance filter\",\n blur_linear: \"dots editing effect enhance filter\",\n blur_off: \"disabled dots editing effect enabled enhance on slash\",\n blur_on: \"disabled dots editing effect enabled enhance filter off slash\",\n bolt: \"electric energy fast flash lightning power thunderbolt\",\n book: \"blog bookmark favorite label library reading remember ribbon save tag\",\n bookmark: \"archive favorite follow label library reading remember ribbon save tag\",\n bookmark_add: \"+ favorite plus remember ribbon save symbol\",\n bookmark_added: \"approve check complete done favorite remember save select tick validate verified yes\",\n bookmark_border: \"archive favorite label library outline reading remember ribbon save tag\",\n bookmark_remove: \"delete favorite minus remember ribbon save subtract\",\n bookmarks: \"favorite label layers library multiple reading remember ribbon save stack tag\",\n book_online: \"Android admission appointment cell device event hardware iOS mobile pass phone reservation tablet ticket\",\n border_all: \"doc editing editor spreadsheet stroke text type writing\",\n border_bottom: \"doc editing editor spreadsheet stroke text type writing\",\n border_clear: \"doc editing editor spreadsheet stroke text type writing\",\n border_color: \"all create doc editing editor marker pencil spreadsheet stroke text type writing\",\n border_horizontal: \"doc editing editor spreadsheet stroke text type writing\",\n border_inner: \"doc editing editor spreadsheet stroke text type writing\",\n border_left: \"doc editing editor spreadsheet stroke text type writing\",\n border_outer: \"doc editing editor spreadsheet stroke text type writing\",\n border_right: \"doc editing editor spreadsheet stroke text type writing\",\n border_style: \"color doc editing editor spreadsheet stroke text type writing\",\n border_top: \"doc editing editor spreadsheet stroke text type writing\",\n border_vertical: \"doc editing editor spreadsheet stroke text type writing\",\n boy: \"body gender human male people person social symbol\",\n branding_watermark: \"components copyright design emblem format identity interface layout logo screen stamp ui ux website window\",\n breakfast_dining: \"bakery bread butter food toast\",\n brightness_1: \"circle control crescent cresent level moon screen\",\n brightness_2: \"circle control crescent cresent level moon night screen\",\n brightness_3: \"circle control crescent cresent level moon night screen\",\n brightness_4: \"circle control crescent cresent dark level moon night screen sun\",\n brightness_5: \"circle control crescent cresent level moon screen sun\",\n brightness_6: \"circle control crescent cresent level moon screen sun\",\n brightness_7: \"circle control crescent cresent level light moon screen sun\",\n brightness_auto: \"A control display level mobile monitor phone screen\",\n brightness_high: \"auto control mobile monitor phone\",\n brightness_low: \"auto control mobile monitor phone\",\n brightness_medium: \"auto control mobile monitor phone\",\n broken_image: \"corrupt error landscape mountains photography picture torn\",\n browser_not_supported: \"disabled enabled internet off on page screen slash website www\",\n browser_updated: \"Android arrow chrome desktop device display download hardware iOS mac monitor screen web window\",\n brunch_dining: \"breakfast champagne champaign drink food lunch meal\",\n brush: \"art design draw editing painting tool\",\n bubble_chart: \"analytics bars data diagram infographic measure metrics statistics tracking\",\n bug_report: \"animal file fix insect issue problem testing ticket virus warning\",\n build: \"adjust fix repair spanner tool wrench\",\n build_circle: \"adjust fix repair tool wrench\",\n bungalow: \"architecture cottage estate home house maps place real residence residential stay traveling\",\n burst_mode: \"image landscape mountains multiple photography picture\",\n bus_alert: \"! attention automobile cars caution danger error exclamation important maps mark notification symbol transportation vehicle warning\",\n business: \"address apartment architecture building company estate flat home office place real residence residential shelter structure\",\n business_center: \"baggage briefcase places purse suitcase work\",\n cabin: \"architecture camping cottage estate home house log maps place real residence residential stay traveling wood\",\n cable: \"connection device electronics usb wire\",\n cached: \"around arrows inprogress loader loading refresh reload renew rotate\",\n cake: \"baked birthday candles celebration dessert food frosting party pastries pastry pie social sweet\",\n calculate: \"+ - = calculator count finance math\",\n calendar_today: \"date event month remember reminder schedule week\",\n calendar_view_day: \"date event format grid layout month remember reminder schedule today week\",\n calendar_view_month: \"date event format grid layout schedule today\",\n calendar_view_week: \"date event format grid layout month schedule today\",\n call: \"cell contact device hardware mobile talk telephone\",\n call_end: \"cell contact device hardware mobile talk telephone\",\n call_made: \"arrow device mobile\",\n call_merge: \"arrow device mobile\",\n call_missed: \"arrow device mobile\",\n call_missed_outgoing: \"arrow device mobile\",\n call_received: \"arrow device mobile\",\n call_split: \"arrow device mobile\",\n call_to_action: \"alert bar components cta design information interface layout message notification screen ui ux website window\",\n camera: \"album aperture lens photography picture record screenshot shutter\",\n camera_alt: \"image photography picture\",\n camera_enhance: \"important lens photography picture quality special star\",\n camera_front: \"body human lens mobile person phone photography portrait selfie\",\n camera_indoor: \"architecture building estate filming home house image inside motion nest picture place real residence residential shelter videography\",\n camera_outdoor: \"architecture building estate filming home house image motion nest outside picture place real residence residential shelter videography\",\n camera_rear: \"front lens mobile phone photography picture portrait selfie\",\n camera_roll: \"film image library photography\",\n cameraswitch: \"arrows flip rotate swap view\",\n campaign: \"alert announcement loud megaphone microphone notification speaker\",\n cancel: \"circle close cross disable exit status stop\",\n cancel_presentation: \"close device exit no quit remove screen share slide stop website window\",\n cancel_schedule_send: \"email no quit remove share stop x\",\n candlestick_chart: \"analytics data diagram finance infographic measure metrics statistics tracking\",\n card_giftcard: \"account balance bill cart cash certificate coin commerce creditcard currency dollars money online payment present shopping\",\n card_membership: \"bill bookmark cash certificate coin commerce cost creditcard currency dollars finance loyalty money online payment shopping subscription\",\n card_travel: \"bill cash coin commerce cost creditcard currency dollars finance membership miles money online payment trip\",\n carpenter: \"building construction cutting handyman repair saw tool\",\n car_rental: \"automobile cars key maps transportation vehicle\",\n car_repair: \"automobile cars maps transportation vehicle\",\n cases: \"baggage briefcase business purse suitcase\",\n casino: \"dice dots entertainment gamble gambling games luck places\",\n cast: \"Android airplay chromecast connect desktop device display hardware iOS mac monitor screencast streaming television tv web window wireless\",\n cast_connected: \"Android airplay chromecast desktop device display hardware iOS mac monitor screencast streaming television tv web window wireless\",\n cast_for_education: \"Android airplay chrome connect desktop device display hardware iOS learning lessons mac monitor screencast streaming teaching television tv web window wireless\",\n catching_pokemon: \"go pokestop travel\",\n category: \"categories circle collection items product sort square triangle\",\n celebration: \"activity birthday event fun party\",\n cell_tower: \"broadcast casting network signal transmitting wireless\",\n cell_wifi: \"connection data internet mobile network phone service signal wireless\",\n center_focus_strong: \"camera image lens photography zoom\",\n center_focus_weak: \"camera image lens photography zoom\",\n chair: \"comfort couch decoration furniture home house living lounging loveseat room seating sofa\",\n chair_alt: \"cahir furniture home house kitchen lounging seating table\",\n chalet: \"architecture cottage estate home house maps place real residence residential stay traveling\",\n change_circle: \"around arrows direction navigation rotate\",\n change_history: \"shape triangle\",\n charging_station: \"Android battery cell device electric hardware iOS lightning mobile phone tablet thunderbolt\",\n chat: \"bubble comment communicate feedback message speech talk text\",\n chat_bubble: \"comment communicate feedback message speech talk text\",\n chat_bubble_outline: \"comment communicate feedback message speech talk text\",\n check: \"checkmark complete confirm correct done enter okay purchased select success tick yes\",\n check_box: \"approved button checkmark component control form ok selected selection square success tick toggle ui yes\",\n check_box_outline_blank: \"button checkmark component control deselected empty form selection square tick toggle ui\",\n check_circle: \"approve checkmark complete done download finished ok select success tick upload validate verified yes\",\n check_circle_outline: \"approve checkmark complete done finished ok select success tick validate verified yes\",\n checkroom: \"check closet clothes coat hanger\",\n chevron_left: \"arrows back direction triangle\",\n chevron_right: \"arrows direction forward triangle\",\n child_care: \"babies baby children face infant kids newborn toddler young\",\n child_friendly: \"baby care carriage children infant kid newborn stroller toddler young\",\n chrome_reader_mode: \"text\",\n circle: \"bullet button dot full geometry moon period radio\",\n circle_notifications: \"active alarm alert bell chime notify reminder ring sound\",\n class: \"archive bookmark category favorite item label library reading remember ribbon save tag\",\n clean_hands: \"bacteria disinfect germs gesture sanitizer\",\n cleaning_services: \"dust sweep\",\n clear: \"allowed back cancel correct cross delete disable erase exit not times\",\n clear_all: \"delete document erase format lines list notifications wipe\",\n close: \"allowed cancel cross disable exit not status stop times\",\n closed_caption: \"accessible alphabet character decoder font language letter media movies subtitles symbol text tv type\",\n closed_caption_disabled: \"accessible alphabet character decoder enabled font language letter media movies off slash subtitles symbol text tv type\",\n closed_caption_off: \"accessible alphabet character decoder font language letter media movies outline subtitles symbol text tv type\",\n close_fullscreen: \"action arrows collapse direction minimize\",\n cloud: \"connection internet network sky upload weather\",\n cloud_circle: \"application backup connection drive files folders internet network sky storage upload\",\n cloud_done: \"application approve backup checkmark complete connection drive files folders internet network ok select sky storage tick upload validate verified yes\",\n cloud_download: \"application arrow backup connection drive files folders internet network sky storage upload\",\n cloud_off: \"application backup connection disabled drive enabled files folders internet network offline sky slash storage upload\",\n cloud_queue: \"connection internet network sky upload\",\n cloud_sync: \"application around backup connection drive files folders inprogress internet loading network refresh renew rotate sky storage turn upload\",\n cloud_upload: \"application arrow backup connection download drive files folders internet network sky storage\",\n co2: \"carbon dioxide gas\",\n code: \"brackets css developer engineering html parenthesis platform\",\n code_off: \"brackets css developer disabled enabled engineering html on platform slash\",\n coffee: \"beverage cup drink mug plate set tea\",\n coffee_maker: \"appliances beverage cup drink machine mug\",\n collections: \"album gallery image landscape library mountains photography picture stack\",\n collections_bookmark: \"album archive favorite gallery label library reading remember ribbon save stack tag\",\n colorize: \"color dropper extract eye picker pipette tool\",\n color_lens: \"art paint pallet\",\n comment: \"bubble chat communicate document feedback message note outline speech\",\n comment_bank: \"archive bookmark bubble cchat communicate favorite label library message remember ribbon save speech tag\",\n comments_disabled: \"bubble chat communicate enabled feedback message offline on slash speech\",\n commit: \"accomplish bind circle dedicate execute line perform pledge\",\n commute: \"automobile car direction maps public train transportation trip vehicle\",\n compare: \"adjustment editing edits enhance fix images photography photos scan settings\",\n compare_arrows: \"collide directional facing left pointing pressure push right together\",\n compass_calibration: \"connection internet location maps network refresh service signal wifi wireless\",\n compress: \"arrows collide pressure push together\",\n computer: \"Android chrome desktop device hardware iOS laptop mac monitor pc web window\",\n confirmation_number: \"admission entertainment event ticket\",\n connected_tv: \"Android airplay chrome desktop device display hardware iOS mac monitor screencast streaming television web window wireless\",\n connecting_airports: \"airplanes flight transportation travel trip\",\n connect_without_contact: \"communicating distance people signal socialize\",\n construction: \"build carpenter equipment fix hammer improvement industrial industry repair tools wrench\",\n contactless: \"applepay bluetooth cash connection connectivity credit device finance payment signal tap transaction wifi wireless\",\n contact_mail: \"account address avatar communicate email face human information message people person profile user\",\n contact_page: \"account avatar data document drive face folders human people person profile sheet slide storage user writing\",\n contact_phone: \"account avatar call communicate face human information message mobile number people person profile user\",\n contacts: \"account address avatar call cell face human information mobile number people person phone profile user\",\n contact_support: \"? alert announcement bubble chat comment communicate help information mark message punctuation speech symbol vquestion\",\n content_copy: \"cut document duplicate file multiple past\",\n content_cut: \"copy document file past scissors trim\",\n content_paste: \"clipboard copy cut document file multiple\",\n content_paste_go: \"clipboard disabled document enabled file slash\",\n content_paste_off: \"clipboard disabled document enabled file slash\",\n content_paste_search: \"clipboard document file find trace track\",\n contrast: \"black editing effect filter grayscale images photography pictures settings white\",\n control_camera: \"adjust arrows center direction left move right\",\n control_point: \"+ add circle plus\",\n control_point_duplicate: \"+ add circle multiple new plus symbol\",\n co_present: \"arrow co-present presentation screen share slides togather website\",\n copy_all: \"content cut document file multiple page paper past\",\n copyright: \"alphabet character circle emblem font legal letter owner symbol text\",\n coronavirus: \"19 bacteria covid disease germs illness sick social\",\n corporate_fare: \"architecture building business estate organization place real residence residential shelter\",\n cottage: \"architecture beach estate home house lake lodge maps place real residence residential stay traveling\",\n countertops: \"home house kitchen sink table\",\n create: \"compose editing input item new pencil write writing\",\n create_new_folder: \"+ add data directory document drive file plus sheet slide storage symbol\",\n credit_card: \"bill cash charge coin commerce cost creditcard currency dollars finance information money online payment price shopping symbol\",\n credit_card_off: \"charge commerce cost disabled enabled finance money online payment slash\",\n credit_score: \"approve bill card cash check coin commerce complete cost currency dollars done finance loan mark money ok online payment select symbol tick validate verified yes\",\n crib: \"babies baby bassinet bed children cradle infant kid newborn sleeping toddler\",\n crop: \"adjustments area editing frame images photos rectangle settings size square\",\n crop_169: \"adjustments area by editing frame images photos picture rectangle settings size square\",\n crop_32: \"adjustments area by editing frame images photos picture rectangle settings size square\",\n crop_54: \"adjustments area by editing frame images photos picture rectangle settings size square\",\n crop_75: \"adjustments area by editing frame images photos picture rectangle settings size square\",\n crop_din: \"adjustments area editing frame images photos picture rectangle settings size square\",\n crop_free: \"adjustments barcode editing focus frame image photos qrcode settings size square zoom\",\n crop_landscape: \"adjustments area editing frame images photos picture settings size square\",\n crop_original: \"adjustments area editing frame images photos picture settings size square\",\n crop_portrait: \"adjustments area editing frame images photos picture rectangle settings size square\",\n crop_rotate: \"adjustments area arrows editing frame images photos settings size turn\",\n crop_square: \"adjustments area editing frame images photos rectangle settings size\",\n css: \"alphabet brackets character code developer engineering font html letter platform symbol text type\",\n currency_exchange: \"360 around arrows cash coin commerce direction dollars inprogress money pay renew rotate sync turn universal\",\n currency_franc: \"bill card cash coin commerce cost credit dollars finance money online payment price shopping symbol\",\n currency_lira: \"bill card cash coin commerce cost credit dollars finance money online payment price shopping symbol\",\n currency_pound: \"bill card cash coin commerce cost credit dollars finance money online payment price shopping symbol\",\n currency_ruble: \"bill card cash coin commerce cost credit dollars finance money online payment price shopping symbol\",\n currency_rupee: \"bill card cash coin commerce cost credit dollars finance money online payment price shopping symbol\",\n currency_yen: \"bill card cash coin commerce cost credit dollars finance money online payment price shopping symbol\",\n currency_yuan: \"bill card cash coin commerce cost credit dollars finance money online payment price shopping symbol\",\n curtains: \"blinds cover nest open shutter sunshade\",\n curtains_closed: \"blinds cover nest shutter sunshade\",\n dangerous: \"broken fix no sign stop update warning wrong\",\n dark_mode: \"application device interface moon night silent theme ui ux website\",\n dashboard: \"cards format layout rectangle shapes square website\",\n dashboard_customize: \"cards format layout rectangle shapes square website\",\n data_saver_off: \"analytics bars chart diagram donut infographic measure metrics ring statistics tracking\",\n data_saver_on: \"+ add analytics chart diagram infographic measure metrics new plus ring statistics symbol tracking\",\n data_thresholding: \"hidden privacy thresold\",\n data_usage: \"analytics chart circle diagram infographic measure metrics statistics tracking\",\n date_range: \"agenda calendar event month remember reminder schedule time today week\",\n deblur: \"adjust editing enhance face image lines photography sharpen\",\n deck: \"chairs furniture garden home house outdoors outside patio social terrace umbrella yard\",\n dehaze: \"adjust editing enhance image lines photography remove\",\n delete: \"bin garbage junk recycle remove trashcan\",\n delete_forever: \"bin cancel exit garbage junk recycle remove trashcan\",\n delete_outline: \"bin can garbage remove trash\",\n delete_sweep: \"bin garbage junk recycle remove trashcan\",\n delivery_dining: \"food meal restaurant scooter takeout transportation vehicle vespa\",\n density_large: \"horizontal lines rules\",\n density_medium: \"horizontal lines rules\",\n density_small: \"horizontal lines rules\",\n departure_board: \"automobile bus cars clock maps public schedule time transportation travel vehicle\",\n description: \"article bill data document drive file folders invoice item notes page paper sheet slide text writing\",\n desktop_access_disabled: \"Android apple chrome device display enabled hardware iOS mac monitor offline pc screen slash web window\",\n desktop_mac: \"Android apple chrome device display hardware iOS monitor pc screen web window\",\n desktop_windows: \"Android chrome device display hardware iOS mac monitor pc screen television tv web\",\n details: \"editing enhance image photography sharpen triangle\",\n developer_board: \"computer development devkit hardware microchip processor\",\n developer_board_off: \"computer development disabled enabled hardware microchip on processor slash\",\n developer_mode: \"Android bracket cell code development device engineer hardware iOS mobile phone tablet\",\n device_hub: \"Android circle computer desktop hardware iOS laptop mobile monitor phone square tablet triangle watch wearable web\",\n devices: \"Android computer desktop hardware iOS laptop mobile monitor phone tablet watch wearable web\",\n devices_other: \"Android cell chrome desktop gadget hardware iOS ipad mac mobile monitor phone smartwatch tablet vr wearables window\",\n device_thermostat: \"celsius fahrenheit temperature thermometer\",\n device_unknown: \"? Android assistance cell hardware help iOS information mark mobile phone punctuation question support symbol tablet\",\n dialer_sip: \"alphabet call cell character contact device font hardware initiation internet letter mobile over protocol routing session symbol telephone text type voice\",\n dialpad: \"buttons call contact device dots mobile numbers phone\",\n diamond: \"fashion gems jewelry logo retail valuables\",\n difference: \"compare content copy cut document duplicate file multiple past\",\n dining: \"cafeteria cutlery diner eating fork room spoon\",\n dinner_dining: \"breakfast food fork lunch meal restaurant spaghetti utensils\",\n directions: \"arrow maps naviate right route sign traffic\",\n directions_bike: \"bicycle human maps person public route transportation\",\n directions_boat: \"automobile cars ferry maps public transportation vehicle\",\n directions_boat_filled: \"automobile cars ferry maps public transportation vehicle\",\n directions_bus: \"automobile cars maps public transportation vehicle\",\n directions_bus_filled: \"automobile cars maps public transportation vehicle\",\n directions_car: \"automobile cars maps public transportation vehicle\",\n directions_car_filled: \"automobile cars maps public transportation vehicle\",\n directions_off: \"arrow disabled enabled maps right route sign slash traffic\",\n directions_railway: \"automobile cars maps public train transportation vehicle\",\n directions_railway_filled: \"automobile cars maps public train transportation vehicle\",\n directions_run: \"body health human jogging maps people person route running walk\",\n directions_subway: \"automobile cars maps public rail train transportation vehicle\",\n directions_subway_filled: \"automobile cars maps public rail train transportation vehicle\",\n directions_transit: \"automobile cars maps metro public rail subway train transportation vehicle\",\n directions_transit_filled: \"automobile cars maps public rail subway train transportation vehicle\",\n directions_walk: \"body human jogging maps people person route run\",\n dirty_lens: \"camera photography picture splat\",\n disabled_by_default: \"box cancel close exit no quit remove square stop\",\n disc_full: \"! alert attention caution cd danger error exclamation important mark music notification storage symbol vinyl warning\",\n display_settings: \"Android application change chrome desktop details device gear hardware iOS information mac monitor options personal screen service web window\",\n dns: \"address bars domain information ip list lookup name network server system\",\n dock: \"Android cell charger charging connector device hardware iOS mobile phone power station tablet\",\n document_scanner: \"article data drive file folders notes page paper sheet slide text writing\",\n do_disturb: \"cancel close denied deny remove silence stop\",\n do_disturb_alt: \"cancel close denied deny remove silence stop\",\n do_disturb_off: \"cancel close denied deny disabled enabled on remove silence slash stop\",\n do_disturb_on: \"cancel close denied deny disabled enabled off remove silence slash stop\",\n domain: \"apartment architecture building business estate home place real residence residential shelter web www\",\n domain_add: \"+ apartment architecture building business estate home new place plus real residence residential shelter symbol web www\",\n domain_disabled: \"apartment architecture building business company enabled estate home internet maps office offline on place real residence residential slash website\",\n domain_verification: \"application approve check complete design desktop done interface internet layout mark ok screen select tick ui ux validate verified website window www yes\",\n done: \"approve checkmark complete finished ok select success tick validate verified yes\",\n done_all: \"approve checkmark complete finished layers multiple ok select stack success tick validate verified yes\",\n done_outline: \"all approve checkmark complete finished ok select success tick validate verified yes\",\n do_not_disturb: \"cancel close denied deny remove silence stop\",\n do_not_disturb_alt: \"cancel close denied deny remove silence stop\",\n do_not_disturb_off: \"cancel close denied deny disabled enabled on remove silence slash stop\",\n do_not_disturb_on: \"cancel close denied deny disabled enabled off remove silence slash stop\",\n do_not_disturb_on_total_silence: \"busy mute on quiet total\",\n do_not_step: \"boot disabled enabled feet foot off on shoe slash sneaker\",\n do_not_touch: \"disabled enabled fingers gesture hand off on slash\",\n donut_large: \"analytics chart circle complete data diagram infographic inprogress, measure metrics pie statistics tracking\",\n donut_small: \"analytics chart circle data diagram infographic inprogress measure metrics pie statistics tracking\",\n door_back: \"closed doorway entrance exit home house\",\n doorbell: \"alarm home house ringing\",\n door_front: \"closed doorway entrance exit home house\",\n door_sliding: \"automatic doorway double entrance exit glass home house two\",\n double_arrow: \"arrows chevron direction multiple navigation right\",\n downhill_skiing: \"athlete athletic body entertainment exercise hobby human people person ski snow social sports travel winter\",\n download: \"arrow downloads drive install upload\",\n download_done: \"arrows check downloads drive installed ok tick upload\",\n download_for_offline: \"arrow circle for install offline upload\",\n downloading: \"arrow circle downloads install pending progress upload\",\n drafts: \"document email envelope file letter message read\",\n drag_handle: \"application components design interface layout lines menu move screen ui ux website window\",\n drag_indicator: \"application circles components design dots drop interface layout mobile monitor move phone screen shape shift tablet ui ux website window\",\n drive_eta: \"automobile cars destination direction estimate maps public transportation travel trip vehicle\",\n drive_file_move: \"arrows data direction document folders right sheet side slide storage\",\n drive_file_rename_outline: \"compose create draft editing input pencil write writing\",\n drive_folder_upload: \"arrow data document file sheet slide storage\",\n dry: \"air bathroom dryer fingers gesture hand wc\",\n dry_cleaning: \"hanger hotel laundry places service towel\",\n duo: \"call chat conference device video\",\n dvr: \"Android audio chrome computer desktop device display electronic hardware iOS laptop list mac monitor recorder screen tv video web window\",\n dynamic_feed: \"layer live multiple post refresh update\",\n dynamic_form: \"code electric fast lightning lists questionnaire thunderbolt\",\n earbuds: \"accessory audio earphone headphone listen music sound\",\n earbuds_battery: \"accessory audio charging earphone headphone listen music sound\",\n east: \"arrow directional maps navigation right\",\n edgesensor_high: \"Android cell device hardware iOS mobile move phone sensitivity tablet vibrate\",\n edgesensor_low: \"Android cell device hardware iOS mobile move phone sensitivity tablet vibrate\",\n edit: \"compose create editing input new pencil write writing\",\n edit_attributes: \"approve attribution check complete done mark ok select tick validate verified yes\",\n edit_location: \"destination direction gps maps pencil pin place stop write\",\n edit_location_alt: \"pencil pin\",\n edit_notifications: \"active alarm alert bell chime compose create draft editing input new notify pencil reminder ring sound write writing\",\n edit_off: \"compose create disabled draft editing enabled input new offline on pencil slash write writing\",\n edit_road: \"destination direction highway maps pencil street traffic\",\n egg: \"breakfast brunch food\",\n egg_alt: \"breakfast brunch food\",\n eighteen_mp: \"camera digits font image letters megapixels numbers quality resolution symbol text type\",\n eight_k: \"8000 8K alphabet character digit display font letter number pixels resolution symbol text type video\",\n eight_k_plus: \"+ 7000 8K alphabet character digit display font letter number pixels resolution symbol text type video\",\n eight_mp: \"camera digit font image letters megapixels number quality resolution symbol text type\",\n eightteen_mp: \"camera digits font image letters megapixels numbers quality resolution symbol text type\",\n eject: \"arrow disc drive dvd player remove triangle up usb\",\n elderly: \"body cane human old people person senior\",\n elderly_woman: \"body cane female gender girl human lady old people person senior social symbol women\",\n electrical_services: \"charge cord plug power wire\",\n electric_bike: \"automobile cars electricity maps scooter transportation travel vehicle vespa\",\n electric_bolt: \"energy fast lightning nest thunderbolt\",\n electric_car: \"automobile cars electricity maps transportation travel vehicle\",\n electric_meter: \"energy fast lightning measure nest thunderbolt usage voltage volts\",\n electric_moped: \"automobile bike cars maps scooter transportation travel vehicle vespa\",\n electric_rickshaw: \"automobile cars india maps transportation truck vehicle\",\n electric_scooter: \"automobile bike cars maps transportation vehicle vespa\",\n elevator: \"body down human people person up\",\n eleven_mp: \"camera digits font image letters megapixels numbers quality resolution symbol text type\",\n email: \"envelope letter message note post receive send write\",\n e_mobiledata: \"alphabet font letter text type\",\n emoji_emotions: \"emoticon expressions face feelings glad happiness happy like mood person pleased smiley smiling social survey\",\n emoji_events: \"achievement award chalice champion cup first prize reward sport trophy winner\",\n emoji_food_beverage: \"coffee cup dring drink mug plate set tea\",\n emoji_nature: \"animal bee daisy flower honey insect ladybug petals spring summer\",\n emoji_objects: \"creative idea lamp lightbulb solution thinking\",\n emoji_people: \"arm body greeting human person social wave waving\",\n emoji_symbols: \"ampersand character hieroglyph music note percent sign\",\n emoji_transportation: \"architecture automobile building cars commute company direction estate maps office place public real residence residential shelter travel vehicle\",\n energy_savings_leaf: \"eco leaves nest usage\",\n engineering: \"body cogs cogwheel construction fixing gears hat helmet human maintenance people person setting worker\",\n enhanced_encryption: \"+ add locked new password plus privacy private protection safety secure security symbol\",\n equalizer: \"adjustment analytics chart data graph measure metrics music noise sound static statistics tracking volume\",\n error: \"! alert announcement attention caution circle danger exclamation feedback important mark notification problem symbol warning\",\n error_outline: \"! alert announcement attention caution circle danger exclamation feedback important mark notification problem symbol warning\",\n escalator: \"down staircase up\",\n escalator_warning: \"body child human kid parent people person\",\n euro: \"bill card cash coin commerce cost credit currency dollars euros finance money online payment price profit shopping symbol\",\n euro_symbol: \"bill card cash coin commerce cost credit currency dollars finance money online payment price profit\",\n event: \"agenda calendar date item mark month range remember reminder today week\",\n event_available: \"agenda approve calendar check complete done item mark ok schedule select tick time validate verified yes\",\n event_busy: \"agenda calendar cancel close date exit item no remove schedule stop time unavailable\",\n event_note: \"agenda calendar date item schedule text time writing\",\n event_repeat: \"around calendar date day inprogress loading month refresh renew rotate schedule turn\",\n event_seat: \"assigned bench chair furniture reservation row section sit\",\n ev_station: \"automobile cars charge charging electricity filling fuel gasoline maps places power station transportation vehicle\",\n exit_to_app: \"application arrow back components design export interface layout leave login logout mobile monitor move output phone pointing quit register right screen signin signout signup tablet ux website window\",\n expand: \"arrows compress enlarge grow move push together\",\n expand_circle_down: \"arrows chevron collapse direction expandable list more\",\n expand_less: \"arrows chevron collapse direction expandable list up\",\n expand_more: \"arrows chevron collapse direction down expandable list\",\n explicit: \"adult alphabet character content font language letter media movies music parent rating supervision symbol text type\",\n explore: \"compass destination direction east location maps needle north south travel west\",\n explore_off: \"compass destination direction disabled east enabled location maps needle north slash south travel west\",\n exposure: \"add brightness contrast editing effect image minus photography picture plus settings subtract\",\n extension: \"add-ons app extended game item jigsaw piece plugin puzzle shape\",\n extension_off: \"disabled enabled extended jigsaw piece puzzle shape slash\",\n face: \"account avatar emoji eyes human login logout people person profile recognition security social thumbnail unlock user\",\n facebook: \"brand logo social\",\n face_retouching_natural: \"editing effect emoji emotion faces image photography settings star tag\",\n face_retouching_off: \"disabled editing effect emoji emotion enabled faces image natural photography settings slash tag\",\n fact_check: \"approve complete done list mark ok select tick validate verified yes\",\n factory: \"industry manufacturing warehouse\",\n family_restroom: \"bathroom children father kids mother parents wc\",\n fastfood: \"drink hamburger maps meal places\",\n fast_forward: \"control ff media music play speed time tv video\",\n fast_rewind: \"back control media music play speed time tv video\",\n favorite: \"appreciate health heart like love remember save shape success\",\n favorite_border: \"health heart like love outline remember save shape success\",\n fax: \"machine office phone send\",\n featured_play_list: \"audio collection highlighted item music playlist recommended\",\n featured_video: \"advertisement advertisment highlighted item play recommended watch,advertised\",\n feed: \"article headline information newspaper public social timeline\",\n feedback: \"! alert announcement attention bubble caution chat comment communicate danger error exclamation important mark message notification speech symbol warning\",\n female: \"gender girl lady social symbol woman women\",\n fence: \"backyard barrier boundaries boundary home house protection\",\n festival: \"circus event local maps places tent tour travel\",\n fiber_dvr: \"alphabet character digital electronics font letter network recorder symbol text tv type video\",\n fiber_manual_record: \"circle dot play watch\",\n fiber_new: \"alphabet character font letter network symbol text type\",\n fiber_pin: \"alphabet character font letter network symbol text type\",\n fiber_smart_record: \"circle dot play watch\",\n fifteen_mp: \"camera digits font image letters megapixels numbers quality resolution symbol text type\",\n file_copy: \"bill clone content cut document duplicate invoice item multiple page past\",\n file_download: \"arrows downloads drive export install upload\",\n file_download_done: \"arrows check downloads drive installed tick upload\",\n file_download_off: \"arrow disabled drive enabled export install on save slash upload\",\n file_open: \"arrow document drive left page paper\",\n file_present: \"clip data document drive folders note paper reminder sheet slide storage writing\",\n file_upload: \"arrows download drive export\",\n filter: \"editing effect image landscape mountains photography picture settings\",\n filter_1: \"digit editing effect images multiple number photography pictures settings stack symbol\",\n filter_2: \"digit editing effect images multiple number photography pictures settings stack symbol\",\n filter_3: \"digit editing effect images multiple number photography pictures settings stack symbol\",\n filter_4: \"digit editing effect images multiple number photography pictures settings stack symbol\",\n filter_5: \"digit editing effect images multiple number photography pictures settings stack symbol\",\n filter_6: \"digit editing effect images multiple number photography pictures settings stack symbol\",\n filter_7: \"digit editing effect images multiple number photography pictures settings stack symbol\",\n filter_8: \"digit editing effect images multiple number photography pictures settings stack symbol\",\n filter_9: \"digit editing effect images multiple number photography pictures settings stack symbol\",\n filter_9_plus: \"+ digit editing effect images multiple number photography pictures settings stack symbol\",\n filter_alt: \"edit funnel options refine sift\",\n filter_alt_off: \"[offline] disabled edit funnel options refine sift slash\",\n filter_b_and_w: \"black contrast editing effect grayscale images photography pictures settings white\",\n filter_center_focus: \"camera dot edit image photography picture\",\n filter_drama: \"camera cloud editing effect image photography picture sky\",\n filter_frames: \"boarders border camera center editing effect filters focus image options photography picture\",\n filter_hdr: \"camera editing effect image mountains photography picture\",\n filter_list: \"lines organize sort\",\n filter_list_off: \"[offline] alt disabled edit options refine sift slash\",\n filter_none: \"multiple stack\",\n filter_tilt_shift: \"blur center editing effect focus images photography pictures\",\n filter_vintage: \"editing effect flower images photography pictures\",\n find_in_page: \"data document drive file folders glass look magnifying paper search see sheet slide writing\",\n find_replace: \"around arrows glass inprogress loading look magnifying refresh renew rotate search see\",\n fingerprint: \"biometrics identification identity reader thumbprint touchid verification\",\n fire_extinguisher: \"emergency water\",\n fireplace: \"chimney flame home house living pit room warm winter\",\n first_page: \"arrow back chevron left rewind\",\n fitbit: \"athlete athletic exercise fitness hobby\",\n fitness_center: \"athlete dumbbell exercise gym health hobby places sport weights workout\",\n fit_screen: \"enlarge format layout reduce scale size\",\n five_g: \"5g alphabet cellular character data digit font letter mobile network number phone signal speed symbol text type wifi\",\n five_k: \"5000 5K alphabet character digit display font letter number pixels resolution symbol text type video\",\n five_k_plus: \"+ 5000 5K alphabet character digit display font letter number pixels resolution symbol text type video\",\n five_mp: \"camera digit font image letters megapixels number quality resolution symbol text type\",\n fivteen_mp: \"camera digits font image letters megapixels numbers quality resolution symbol text type\",\n flag: \"country goal mark nation report start\",\n flag_circle: \"country goal mark nation report round start\",\n flaky: \"approve check close complete contrast done exit mark no ok options select stop tick verified yes\",\n flare: \"bright editing effect images lensflare light photography pictures shine sparkle star sun\",\n flash_auto: \"camera electric fast lightning thunderbolt\",\n flashlight_off: \"disabled enabled on slash\",\n flashlight_on: \"disabled enabled off slash\",\n flash_off: \"camera disabled electric enabled fast lightning on slash thunderbolt\",\n flash_on: \"camera disabled electric enabled fast lightning off slash thunderbolt\",\n flatware: \"cafeteria cutlery diner dining eating fork room spoon\",\n flight: \"airplane airport flying transportation travel trip\",\n flight_class: \"airplane business first seat transportation travel trip window\",\n flight_land: \"airplane airport arrival arriving flying landing transportation travel\",\n flight_takeoff: \"airplane airport departed departing flying landing transportation travel\",\n flip: \"editing image orientation scanning\",\n flip_camera_android: \"center editing front image mobile orientation rear reverse rotate turn\",\n flip_camera_ios: \"android editing front image mobile orientation rear reverse rotate turn\",\n flip_to_back: \"arrangement format front layout move order sort\",\n flip_to_front: \"arrangement back format layout move order sort\",\n flutter_dash: \"bird mascot\",\n fmd_bad: \"! alert attention caution danger destination direction error exclamation important location maps mark notification pin place symbol warning\",\n fmd_good: \"destination direction location maps pin place stop\",\n folder: \"data directory document drive file folders sheet slide storage\",\n folder_delete: \"bin can data document drive file folders garbage remove sheet slide storage trash\",\n folder_off: \"[online] data disabled document drive enabled file folders sheet slash slide storage\",\n folder_open: \"data directory document drive file folders sheet slide storage\",\n folder_shared: \"account collaboration data directory document drive face human people person profile sheet slide storage team user\",\n folder_special: \"bookmark data directory document drive favorite file highlight important marked saved shape sheet slide star storage\",\n folder_zip: \"compress data document drive file folders open sheet slide storage\",\n follow_the_signs: \"arrow body directional human people person right social\",\n font_download: \"A alphabet character letter square symbol text type\",\n font_download_off: \"alphabet character disabled enabled letter slash square symbol text type\",\n food_bank: \"architecture building charity eat estate fork house knife meal place real residence residential shelter utensils\",\n forest: \"jungle nature plantation plants trees woodland\",\n fork_left: \"arrows directions maps navigation path route sign traffic\",\n fork_right: \"arrows directions maps navigation path route sign traffic\",\n format_align_center: \"alignment doc editing editor lines spreadsheet text type writing\",\n format_align_justify: \"alignment density doc editing editor extra lines small spreadsheet text type writing\",\n format_align_left: \"alignment doc editing editor lines spreadsheet text type writing\",\n format_align_right: \"alignment doc editing editor lines spreadsheet text type writing\",\n format_bold: \"B alphabet character doc editing editor font letter spreadsheet styles symbol text type writing\",\n format_clear: \"T alphabet character disabled doc editing editor enabled font letter off slash spreadsheet style symbol text type writing\",\n format_color_fill: \"bucket doc editing editor paint spreadsheet style text type writing\",\n format_color_reset: \"clear disabled doc droplet editing editor enabled fill liquid off on paint slash spreadsheet style text type water writing\",\n format_color_text: \"doc editing editor fill paint spreadsheet style type writing\",\n format_indent_decrease: \"alignment doc editing editor indentation paragraph spreadsheet text type writing\",\n format_indent_increase: \"alignment doc editing editor indentation paragraph spreadsheet text type writing\",\n format_italic: \"alphabet character doc editing editor font letter spreadsheet style symbol text type writing\",\n format_line_spacing: \"alignment doc editing editor spreadsheet text type writing\",\n format_list_bulleted: \"alignment doc editing editor notes spreadsheet task text todo type writing\",\n format_list_numbered: \"alignment digit doc editing editor notes spreadsheet symbol task text todo type writing\",\n format_list_numbered_rtl: \"alignment digit doc editing editor notes spreadsheet symbol task text todo type writing\",\n format_overline: \"alphabet character doc editing editor font letter spreadsheet style symbol text type under writing\",\n format_paint: \"brush color doc editing editor fill paintroller spreadsheet style text type writing\",\n format_quote: \"doc editing editor quotation spreadsheet text type writing\",\n format_shapes: \"alphabet character color doc editing editor fill font letter paint spreadsheet style symbol text type writing\",\n format_size: \"alphabet character color doc editing editor fill font letter paint spreadsheet style symbol text type writing\",\n format_strikethrough: \"alphabet character doc editing editor font letter spreadsheet style symbol text type writing\",\n format_textdirection_l_to_r: \"alignment doc editing editor ltr paragraph spreadsheet type writing\",\n format_textdirection_r_to_l: \"alignment doc editing editor paragraph rtl spreadsheet type writing\",\n format_underlined: \"alphabet character doc editing editor font letter spreadsheet style symbol text type writing\",\n forum: \"bubble chat comment communicate community conversation feedback hub messages speech talk\",\n forward: \"arrow mail message playback right sent\",\n forward_10: \"arrow circle controls digit fast music number play rotate seconds speed symbol time video\",\n forward_30: \"arrow circle controls digit fast music number rotate seconds speed symbol time video\",\n forward_5: \"10 arrow circle controls digit fast music number rotate seconds speed symbol time video\",\n forward_to_inbox: \"arrow email envelop letter message send\",\n foundation: \"architecture base basis building construction estate home house real residential\",\n four_g_mobiledata: \"alphabet cellular character digit font letter network number phone signal speed symbol text type wifi\",\n four_g_plus_mobiledata: \"alphabet cellular character digit font letter network number phone signal speed symbol text type wifi\",\n four_k: \"4000 4K alphabet character digit display font letter number pixels resolution symbol text type video\",\n four_k_plus: \"+ 4000 4K alphabet character digit display font letter number pixels resolution symbol text type video\",\n four_mp: \"camera digit font image letters megapixels number quality resolution symbol text type\",\n fourteen_mp: \"camera digits font image letters megapixels numbers quality resolution symbol text type\",\n free_breakfast: \"beverage cafe coffee cup drink mug tea\",\n fullscreen: \"adjust application components interface size ui ux view website\",\n fullscreen_exit: \"adjust application components interface size ui ux view website\",\n functions: \"average calculate count doc editing editor math sigma spreadsheet style sum text type writing\",\n gamepad: \"buttons console controller device gaming playstation video\",\n games: \"adjust arrows controller direction dpad gaming left move nintendo playstation right xbox\",\n garage: \"automobile automotive cars direction maps transportation travel vehicle\",\n gas_meter: \"droplet energy measure nest usage water\",\n gavel: \"agreement contract court document government hammer judge law mallet official police rules terms\",\n gesture: \"drawing finger gestures hand line motion\",\n get_app: \"arrows downloads export install play pointing retrieve upload\",\n gif: \"alphabet animated animation bitmap character font format graphics interchange letter symbol text type\",\n gif_box: \"alphabet animated animation bitmap character font format graphics interchange letter symbol text type\",\n girl: \"body female gender human lady people person social symbol woman women\",\n gite: \"architecture estate home hostel house maps place real residence residential stay traveling\",\n git_hub: \"brand code\",\n g_mobiledata: \"alphabet character font letter network service symbol text type\",\n golf_course: \"athlete athletic ball club entertainment flag golfer golfing hobby hole places putt sports\",\n google: \"brand logo\",\n gpp_bad: \"cancel certified close error exit no privacy private protection remove security shield sim stop verified\",\n gpp_good: \"certified check ok pass security shield sim tick\",\n gpp_maybe: \"! alert attention caution certified danger error exclamation important mark notification privacy private protection security shield sim symbol verified warning\",\n gps_fixed: \"destination direction location maps pin place pointer stop tracking\",\n gps_not_fixed: \"destination direction disabled enabled fixed location maps not off online place pointer slash tracking\",\n gps_off: \"destination direction disabled enabled fixed location maps not offline place pointer slash tracking\",\n grade: \"achievement important likes marked rated rating reward saved shape special star\",\n gradient: \"color editing effect filter images photography pictures\",\n grading: \"approve check complete document done feedback grade mark ok reviewed select tick validate verified writing yes\",\n grain: \"dots editing effect filter images photography pictures\",\n graphic_eq: \"audio equalizer music recording sound voice\",\n grass: \"backyard fodder ground home lawn plant turf\",\n grid3x3: \"layout line space\",\n grid4x4: \"by layout lines space\",\n grid_goldenratio: \"layout lines space\",\n grid_off: \"collage disabled enabled image layout on slash view\",\n grid_on: \"collage disabled enabled image layout off sheet slash view\",\n grid_view: \"application blocks components dashboard design interface layout screen square tiles ui ux website window\",\n group: \"accounts committee face family friends humans network people persons profiles social team users\",\n group_add: \"accounts committee face family friends humans increase more network people persons plus profiles social team users\",\n group_remove: \"accounts committee face family friends humans network people persons profiles social team users\",\n groups: \"body club collaboration crowd gathering human meeting people person social teams\",\n group_work: \"alliance circle collaboration film partnership reel teamwork together\",\n g_translate: \"emblem google language logo mark speaking speech translator words\",\n hail: \"body human people person pick public stop taxi transportation\",\n handyman: \"build construction fix hammer repair screwdriver tools\",\n hardware: \"break construction hammer nail repair tool\",\n hd: \"alphabet character definition display font high letter movies quality resolution screen symbol text tv type video\",\n hdr_auto: \"A alphabet camera character circle dynamic font high letter photo range symbol text type\",\n hdr_auto_select: \"+ A alphabet camera character circle dynamic font high letter photo range symbol text type\",\n hdr_enhanced_select: \"add alphabet character dynamic font high letter plus range symbol text type\",\n hdr_off: \"alphabet character disabled dynamic enabled enhance font high letter range select slash symbol text type\",\n hdr_off_select: \"alphabet camera character circle disabled dynamic enabled font high letter photo range slash symbol text type\",\n hdr_on: \"add alphabet character dynamic enhance font high letter plus range select symbol text type\",\n hdr_on_select: \"+ alphabet camera character circle dynamic font high letter photo range symbol text type\",\n hdr_plus: \"+ add alphabet character circle dynamic enhance font high letter range select symbol text type\",\n hdr_strong: \"circles dots dynamic enhance high range\",\n hdr_weak: \"circles dots dynamic enhance high range\",\n headphones: \"accessory audio device earphone headset listen music sound\",\n headphones_battery: \"accessory audio charging device earphone headset listen music sound\",\n headset: \"accessory audio device earbuds earmuffs earphone headphones listen music sound\",\n headset_mic: \"accessory audio chat device earphone headphones listen music sound talk\",\n headset_off: \"accessory audio chat device disabled earphone enabled headphones listen mic music slash sound talk\",\n healing: \"bandage bandaid editing emergency fix health hospital image medicine\",\n health_and_safety: \"+ add certified plus privacy private protection security shield symbol verified\",\n hearing: \"accessibility accessible aid handicap help impaired listen sound volume\",\n hearing_disabled: \"accessibility accessible aid enabled handicap help impaired listen off on slash sound volume\",\n heart_broken: \"break core crush health nucleus split\",\n heat_pump: \"air conditioner cool energy furnance nest usage\",\n height: \"arrows color doc down editing editor fill format paint resize spreadsheet stretch style text type up writing\",\n help: \"? alert announcement assistance circle information mark punctuation question shape support symbol\",\n help_center: \"? assistance information mark punctuation question support symbol\",\n help_outline: \"? alert announcement assistance circle information mark punctuation question shape support symbol\",\n hevc: \"alphabet character coding efficiency font high letter symbol text type video\",\n hexagon: \"shape sides six\",\n hide_image: \"disabled enabled landscape mountains off on photography picture slash\",\n hide_source: \"circle disabled enabled offline on shape slash\",\n highlight: \"color doc editing editor emphasize fill flashlight format marker paint spreadsheet style text type writing\",\n highlight_alt: \"arrow box click cursor draw focus pointer selection target\",\n highlight_off: \"cancel circle clear click close delete disable exit focus no quit remove stop target times\",\n high_quality: \"alphabet character definition display font hq letter movies resolution screen symbol text tv type\",\n hiking: \"backpacking bag climbing duffle mountain social sports stick trail travel walking\",\n history: \"arrow backwards clock date refresh renew reverse revert rotate schedule time turn undo\",\n history_edu: \"document education feather letter paper pen quill school tools write writing\",\n history_toggle_off: \"clock date schedule time\",\n hls: \"alphabet character developer engineering font letter platform symbol text type\",\n hls_off: \"[offline] alphabet character developer disabled enabled engineering font letter platform slash symbol text type\",\n h_mobiledata: \"alphabet character font letter network service symbol text type\",\n holiday_village: \"architecture beach camping cottage estate home house lake lodge maps place real residence residential stay traveling vacation\",\n home: \"address application--house architecture building components design estate homepage interface layout place real residence residential screen shelter structure unit ux website window\",\n home_max: \"device gadget hardware internet iot nest smart things\",\n home_mini: \"Internet device gadget hardware iot nest smart things\",\n home_repair_service: \"equipment fix kit mechanic repairing toolbox tools workshop\",\n home_work: \"architecture building estate house office place real residence residential shelter\",\n horizontal_rule: \"gmail line novitas\",\n horizontal_split: \"bars format layout lines stacked\",\n hotel: \"bed body human people person sleep stay travel trip\",\n hot_tub: \"bathing bathroom bathtub hotel human jacuzzi person shower spa steam travel water\",\n hourglass_bottom: \"countdown half loading minutes time waiting\",\n hourglass_disabled: \"clock countdown empty enabled loading minutes off on slash time waiting\",\n hourglass_empty: \"countdown loading minutes start time waiting\",\n hourglass_full: \"countdown loading minutes time waiting\",\n hourglass_top: \"countdown half loading minutes time waiting\",\n house: \"architecture building estate family homepage places real residence residential shelter\",\n houseboat: \"architecture beach estate floating home maps place real residence residential sea stay traveling vacation\",\n house_siding: \"architecture building construction estate exterior facade home real residential\",\n how_to_reg: \"approve ballot check complete done election mark ok poll register registration select tick to validate verified vote yes\",\n how_to_vote: \"ballot election poll\",\n h_plus_mobiledata: \"+ alphabet character font letter network service symbol text type\",\n html: \"alphabet brackets character code css developer engineering font letter platform symbol text type\",\n http: \"alphabet character font internet letter network symbol text transfer type url website\",\n https: \"connection encrypt internet key locked network password privacy private protection safety secure security ssl web\",\n hub: \"center connection core focal network nucleus point topology\",\n hvac: \"air conditioning heating ventilation\",\n icecream: \"dessert food snack\",\n ice_skating: \"athlete athletic entertainment exercise hobby shoe skates social sports travel\",\n image: \"disabled enabled frame hide landscape mountains off on photography picture slash\",\n image_aspect_ratio: \"photography picture rectangle square\",\n image_not_supported: \"disabled enabled landscape mountains off on photography picture slash\",\n image_search: \"find glass landscape look magnifying mountains photography picture see\",\n imagesearch_roller: \"art paint\",\n important_devices: \"Android cell computer desktop hardware iOS mobile monitor phone star tablet web\",\n import_contacts: \"address book friends information magazine open\",\n import_export: \"arrows direction down explort up\",\n inbox: \"archive email incoming message\",\n indeterminate_check_box: \"application button components control design form interface minus screen selected selection square toggle ui undetermined ux website\",\n info: \"about alert announcement announcment assistance bubble circle details help information service support\",\n input: \"arrow box download login move right\",\n insert_chart: \"analytics barchart bars data diagram infographic measure metrics statistics tracking\",\n insert_chart_outlined: \"analytics bars data diagram infographic measure metrics statistics tracking\",\n insert_comment: \"add bubble chat feedback message\",\n insert_drive_file: \"bill document format invoice item sheet slide\",\n insert_emoticon: \"account emoji face happy human like people person profile sentiment smiley user\",\n insert_invitation: \"agenda calendar date event mark month range remember reminder today week\",\n insert_link: \"add anchor attach clip file mail media\",\n insert_page_break: \"document file paper\",\n insert_photo: \"image landscape mountains photography picture wallpaper\",\n insights: \"analytics bars chart data diagram infographic measure metrics stars statistics tracking\",\n instagram: \"brand logo social\",\n install_desktop: \"Android chrome device display fix hardware iOS mac monitor place pwa screen web window\",\n install_mobile: \"Android cell device hardware iOS phone pwa tablet\",\n integration_instructions: \"brackets clipboard code css developer document engineering html platform\",\n interests: \"circle heart shapes social square triangle\",\n interpreter_mode: \"language microphone person speaking symbol\",\n inventory: \"archive box buy check clipboard document e-commerce file list organize packages product purchase shop stock store supply\",\n inventory2: \"archive box file organize packages product stock storage supply\",\n invert_colors: \"droplet editing hue inverted liquid palette tone water\",\n invert_colors_off: \"disabled droplet enabled hue inverted liquid offline opacity palette slash tone water\",\n ios_share: \"arrows button direction export internet link send sharing social up website\",\n iron: \"appliance clothes electric ironing machine object\",\n iso: \"add editing effect image minus photography picture plus sensor shutter speed subtract\",\n javascript: \"alphabet brackets character code css developer engineering font html letter platform symbol text type\",\n join_full: \"circle combine command left outter right sql\",\n join_inner: \"circle command matching sql values\",\n join_left: \"circle command matching sql values\",\n join_right: \"circle command matching sql values\",\n kayaking: \"athlete athletic body canoe entertainment exercise hobby human lake paddle paddling people person rafting river row social sports summer travel water\",\n key: \"blackout password restricted secret unlock\",\n keyboard: \"computer device hardware input keypad letter office text type\",\n keyboard_alt: \"computer device hardware input keypad letter office text type\",\n keyboard_arrow_down: \"arrows chevron open\",\n keyboard_arrow_left: \"arrows chevron\",\n keyboard_arrow_right: \"arrows chevron open start\",\n keyboard_arrow_up: \"arrows chevron submit\",\n keyboard_backspace: \"arrow left\",\n keyboard_capslock: \"arrow up\",\n keyboard_command_key: \"button command control key\",\n keyboard_control_key: \"control key\",\n keyboard_double_arrow_down: \"arrows direction multiple navigation\",\n keyboard_double_arrow_left: \"arrows direction multiple navigation\",\n keyboard_double_arrow_right: \"arrows direction multiple navigation\",\n keyboard_double_arrow_up: \"arrows direction multiple navigation\",\n keyboard_hide: \"arrow computer device down hardware input keypad text\",\n keyboard_option_key: \"alt key modifier\",\n keyboard_return: \"arrow back left\",\n keyboard_tab: \"arrow next right\",\n keyboard_voice: \"microphone noise recorder speaker\",\n key_off: \"[offline] disabled enabled on password slash unlock\",\n king_bed: \"bedroom double furniture home hotel house night pillows queen rest sleep\",\n kitchen: \"appliance cabinet cold food freezer fridge home house ice places refrigerator storage\",\n kitesurfing: \"athlete athletic beach body entertainment exercise hobby human people person social sports travel water\",\n label: \"badge favorite indent item library mail remember save stamp sticker tag\",\n label_important: \"badge favorite important. indent item library mail remember save stamp sticker tag wing\",\n label_off: \"disabled enabled favorite indent library mail on remember save slash stamp sticker tag wing\",\n lan: \"computer connection data internet network service\",\n landscape: \"image mountains nature photography picture\",\n language: \"country earth globe i18n internet l10n planet website world www\",\n laptop: \"Android chrome computer connect desktop device display hardware iOS link mac monitor smart tv web windows\",\n laptop_chromebook: \"Android chromebook device display hardware iOS mac monitor screen web window\",\n laptop_mac: \"Android apple chrome device display hardware iOS monitor screen web window\",\n laptop_windows: \"Android chrome device display hardware iOS mac monitor screen web\",\n last_page: \"application arrow chevron components end forward interface right screen ui ux website\",\n launch: \"application arrow box components core interface internal new open screen ui ux website window\",\n layers: \"arrange disabled enabled interaction maps off overlay pages slash stack\",\n layers_clear: \"arrange delete disabled enabled interaction maps off overlay pages slash\",\n leaderboard: \"analytics bars chart data diagram infographic measure metrics statistics tracking\",\n leak_add: \"connection data link network service signals synce wireless\",\n leak_remove: \"connection data disabled enabled link network offline service signals slash synce wireless\",\n legend_toggle: \"analytics chart data diagram infographic measure metrics monitoring stackdriver statistics tracking\",\n lens: \"circle full geometry moon\",\n lens_blur: \"camera dim dot effect foggy fuzzy image photo soften\",\n library_add: \"+ collection layers multiple music new plus save stacked symbol video\",\n library_add_check: \"approve collection complete done layers mark multiple music ok select stacked tick validate verified video yes\",\n library_books: \"add album audio collection reading\",\n library_music: \"add album audio collection song sounds\",\n light: \"bulb ceiling hanging inside interior lamp lighting pendent room\",\n lightbulb: \"alert announcement idea information learning mode\",\n lightbulb_circle: \"alert announcement idea information\",\n light_mode: \"brightness day device lighting morning mornng sky sunny\",\n linear_scale: \"application components design interface layout measure menu screen slider ui ux website window\",\n line_axis: \"dash horizontal stroke vertical\",\n line_style: \"dash dotted editor rule spacing\",\n line_weight: \"editor height size spacing style thickness\",\n link: \"anchor chain clip connection external hyperlink linked links multimedia unlisted url\",\n linked_camera: \"connection lens network photography picture signals sync wireless\",\n linked_in: \"brand logo social\",\n link_off: \"anchor attached chain clip connection disabled enabled linked links multimedia slash unlink url\",\n liquor: \"alcohol bar bottle club cocktail drink food party store wine\",\n list: \"editor file format index menu options playlist task todo\",\n list_alt: \"box contained editor format lines reorder sheet stacked task title todo\",\n live_help: \"? alert announcement assistance bubble chat comment communicate faq information mark message punctuation question speech support symbol\",\n live_tv: \"Android antennas chrome desktop device hardware iOS mac monitor movie play stream television web window\",\n living: \"chair comfort couch decoration furniture home house lounging loveseat room seating sofa\",\n local_activity: \"event star things ticket\",\n local_airport: \"airplane flight flying transportation travel trip\",\n local_atm: \"bill card cart cash coin commerce credit currency dollars financial money online payment price profit shopping symbol\",\n local_bar: \"alcohol bottle club cocktail drink food liquor martini wine\",\n local_cafe: \"bottle coffee cup drink food mug restaurant tea\",\n local_car_wash: \"automobile cars maps transportation travel vehicle\",\n local_convenience_store: \"-- 24 bill building business card cash coin commerce company credit currency dollars maps market money new online payment plus shopping storefront symbol\",\n local_dining: \"cutlery eat food fork knife meal restaurant spoon\",\n local_drink: \"cup droplet glass liquid park water\",\n local_fire_department: \"911 firefighter flame hot\",\n local_florist: \"flower shop\",\n local_gas_station: \"auto car filling fuel gasoline oil station vehicle\",\n local_grocery_store: \"market shop\",\n local_hospital: \"911 aid cross doctor emergency first health medical medicine plus\",\n local_hotel: \"bed body human people person sleep stay travel trip\",\n local_laundry_service: \"cleaning clothing dryer hotel washer\",\n local_library: \"book community learning person read\",\n local_mall: \"bill building business buy card cart cash coin commerce credit currency dollars handbag money online payment shopping storefront\",\n local_offer: \"deal discount price shopping store tag\",\n local_parking: \"alphabet auto car character font garage letter symbol text type vehicle\",\n local_pharmacy: \"911 aid cross emergency first food hospital medicine places\",\n local_phone: \"booth call telecommunication\",\n local_pizza: \"drink fastfood meal\",\n local_police: \"911 badge law officer protection security shield\",\n local_post_office: \"delivery email envelop letter message package parcel postal send stamp\",\n local_printshop: \"draft fax ink machine office paper printer send\",\n local_see: \"camera lens photography picture\",\n local_shipping: \"automobile cars delivery letter mail maps office package parcel postal semi send shopping stamp transportation truck vehicle\",\n local_taxi: \"automobile cab call cars direction lyft maps public transportation uber vehicle yellow\",\n location_city: \"apartments architecture buildings business company estate home landscape place real residence residential shelter town urban\",\n location_disabled: \"destination direction enabled maps off pin place pointer slash stop tracking\",\n location_off: \"destination direction disabled enabled gps maps pin place room slash stop\",\n location_on: \"destination direction disabled enabled gps maps off pin place room slash stop\",\n location_searching: \"destination direction maps pin place pointer stop tracking\",\n lock: \"connection key locked logout padlock password privacy private protection safety secure security signout\",\n lock_clock: \"date locked password privacy private protection safety schedule secure security time\",\n lock_open: \"connection key login padlock password privacy private protection register safety secure security signin signup unlocked\",\n lock_reset: \"around inprogress loading locked password privacy private protection refresh renew rotate safety secure security turn\",\n login: \"access application arrow components design enter interface left screen ui ux website\",\n logo_dev: \"dev.to\",\n logout: \"application arrow components design exit interface leave login right screen ui ux website\",\n looks: \"circle half rainbow\",\n looks_3: \"digit numbers square symbol\",\n looks_4: \"digit numbers square symbol\",\n looks_5: \"digit numbers square symbol\",\n looks_6: \"digit numbers square symbol\",\n looks_one: \"1 digit numbers square symbol\",\n looks_two: \"2 digit numbers square symbol\",\n loop: \"around arrows direction inprogress loader loading music navigation refresh renew repeat rotate turn\",\n loupe: \"+ add details focus glass magnifying new plus symbol\",\n low_priority: \"arrange arrow backward bottom list move order task todo\",\n loyalty: \"badge card credit heart love membership miles points program sale subscription tag travel trip\",\n lte_mobiledata: \"alphabet character font internet letter network speed symbol text type wifi wireless\",\n lte_plus_mobiledata: \"+ alphabet character font internet letter network speed symbol text type wifi wireless\",\n luggage: \"airport baggage carry flight hotel on suitcase travel trip\",\n lunch_dining: \"breakfast dinner drink fastfood hamburger meal\",\n lyrics: \"audio bubble chat comment communicate feedback key message music note song sound speech track\",\n mail: \"email envelope inbox letter message send\",\n mail_lock: \"email envelop letter locked message password privacy private protection safety secure security send\",\n mail_outline: \"email envelope letter message note post receive send write\",\n male: \"boy gender man social symbol\",\n man: \"boy gender male social symbol\",\n manage_accounts: \"change details face gear options people person profile service-human settings user\",\n manage_search: \"glass history magnifying text\",\n map: \"destination direction location maps pin place route stop travel\",\n maps_home_work: \"building house office\",\n maps_ugc: \"+ add bubble comment communicate feedback message new plus speech symbol\",\n margin: \"design layout padding size square\",\n mark_as_unread: \"envelop letter mail postal receive send\",\n mark_chat_read: \"approve bubble check comment communicate complete done message ok select sent speech tick verified yes\",\n mark_chat_unread: \"bubble circle comment communicate message notification speech\",\n mark_email_read: \"approve check complete done envelop letter message note ok select send sent tick yes\",\n mark_email_unread: \"check circle envelop letter message note notification send\",\n markunread: \"email envelope letter message send\",\n markunread_mailbox: \"deliver envelop letter postal postbox receive send\",\n masks: \"air cover covid face hospital medical pollution protection respirator sick social\",\n maximize: \"application components design interface line screen shape ui ux website\",\n media_bluetooth_off: \"connection connectivity device disabled enabled music note offline paring signal slash symbol wireless\",\n media_bluetooth_on: \"connection connectivity device disabled enabled music note off online paring signal slash symbol wireless\",\n mediation: \"alternative arrows compromise direction dots negotiation party right structure\",\n medical_services: \"aid bag briefcase emergency first kit medicine\",\n medication: \"doctor drug emergency hospital medicine pharmacy pills prescription\",\n meeting_room: \"building doorway entrance home house interior logout office open places signout\",\n memory: \"card chip digital micro processor sd storage\",\n menu: \"application components hamburger interface lines playlist screen ui ux website\",\n menu_book: \"dining food meal page restaurant\",\n menu_open: \"application arrow chevron components hamburger interface left lines screen ui ux website\",\n merge: \"arrows directions maps navigation path route sign traffic\",\n merge_type: \"arrow combine direction format text\",\n message: \"bubble chat comment communicate feedback speech talk text\",\n mic: \"hearing microphone noise record search sound speech voice\",\n mic_external_off: \"audio disabled enabled microphone slash sound voice\",\n mic_external_on: \"audio disabled enabled microphone off slash sound voice\",\n mic_none: \"hearing microphone noise record sound voice\",\n mic_off: \"audio disabled enabled hearing microphone noise recording slash sound voice\",\n microwave: \"appliance cooking electric heat home house kitchen machine\",\n military_tech: \"army award badge honor medal merit order privilege prize rank reward ribbon soldier star status trophy winner\",\n minimize: \"application components design interface line screen shape ui ux website\",\n missed_video_call: \"arrow camera filming hardware image motion picture record videography\",\n mms: \"bubble chat comment communicate feedback image landscape message mountains multimedia photography picture speech\",\n mobiledata_off: \"arrow disabled down enabled internet network on slash speed up wifi wireless\",\n mobile_friendly: \"Android approve cell check complete device done hardware iOS mark ok phone select tablet tick validate verified yes\",\n mobile_off: \"Android cell device disabled enabled hardware iOS phone silence slash tablet\",\n mobile_screen_share: \"Android arrow cell device hardware iOS mirror monitor phone screencast streaming tablet tv wireless\",\n mode: \"compose create draft draw edit pencil write\",\n mode_comment: \"bubble chat comment communicate feedback message mode speech\",\n mode_edit: \"compose create draft draw pencil write\",\n mode_edit_outline: \"compose create draft draw pencil write\",\n model_training: \"arrow bulb idea inprogress light loading refresh renew restore reverse rotate\",\n mode_night: \"dark disturb moon sleep weather\",\n mode_of_travel: \"arrow destination direction location maps pin place stop transportation trip\",\n mode_standby: \"disturb power sleep target\",\n monetization_on: \"bill card cash circle coin commerce cost credit currency dollars finance money online payment price profit sale shopping symbol\",\n money: \"100 bill card cash coin commerce cost credit currency digit dollars finance number online payment price profit shopping symbol\",\n money_off: \"bill card cart cash coin commerce credit currency disabled dollars enabled finance money online payment price profit shopping slash symbol\",\n money_off_csred: \"bill card cart cash coin commerce credit currency disabled dollars enabled online payment shopping slash symbol\",\n monitor: \"Android chrome device display hardware iOS mac screen web window\",\n monitor_weight: \"body device diet health scale smart\",\n monochrome_photos: \"black camera image photography picture white\",\n mood: \"emoji emoticon emotions expressions face feelings glad happiness happy like person pleased smiley smiling social survey\",\n mood_bad: \"disappointment dislike emoji emoticon emotions expressions face feelings person rating smiley social survey unhappiness unhappy unpleased unsmile unsmiling\",\n moped: \"automobile bike cars direction maps motorized public scooter transportation vehicle vespa\",\n more: \"3 archive badge bookmark dots etc favorite indent label remember save stamp sticker tab tag three\",\n more_horiz: \"3 application components dots etc horizontal interface ios pending screen status three ui ux website\",\n more_time: \"+ add clock date new plus schedule symbol\",\n more_vert: \"3 android application components dots etc interface screen three ui ux vertical website\",\n motion_photos_auto: \"A alphabet animation automatic character circle font gif letter live symbol text type video\",\n motion_photos_off: \"animation circle disabled enabled slash video\",\n mouse: \"click computer cursor device hardware wireless\",\n move_down: \"arrow direction jump navigation transfer\",\n move_to_inbox: \"archive arrow down email envelop incoming letter message move send to\",\n move_up: \"arrow direction jump navigation transfer\",\n movie: \"cinema film media screen show slate tv video watch\",\n movie_creation: \"clapperboard film movies slate video\",\n movie_filter: \"clapperboard creation film movies slate stars video\",\n moving: \"arrow direction navigation travel up\",\n mp: \"alphabet character font image letter megapixel photography pixels quality resolution symbol text type\",\n multiline_chart: \"analytics bars data diagram infographic line measure metrics multiple statistics tracking\",\n multiple_stop: \"arrows directions dots left maps navigation right\",\n museum: \"architecture attraction building estate event exhibition explore local palces places real see shop store tour\",\n music_note: \"audiotrack key sound\",\n music_off: \"audiotrack disabled enabled key note on slash sound\",\n music_video: \"band mv recording screen tv watch\",\n my_location: \"destination direction maps navigation pin place point stop\",\n nat: \"communication\",\n nature: \"forest outdoor outside park tree wilderness\",\n nature_people: \"activity body forest human outdoor outside park person tree wilderness\",\n navigate_before: \"arrows direction left\",\n navigate_next: \"arrows direction right\",\n navigation: \"arrow destination direction location maps pin place point stop\",\n nearby_error: \"! alert attention caution danger exclamation important mark notification symbol warning\",\n nearby_off: \"disabled enabled on slash\",\n near_me: \"arrow destination direction location maps navigation pin place point stop\",\n near_me_disabled: \"destination direction enabled location maps navigation off pin place point slash\",\n nest_cam_wired_stand: \"camera filming hardware image motion picture videography\",\n network_cell: \"cellular data internet mobile phone speed wifi wireless\",\n network_check: \"connection internet meter signal speed tick wifi wireless\",\n network_locked: \"alert available cellular connection data error internet mobile not privacy private protection restricted safety secure security service signal warning wifi wireless\",\n network_wifi: \"cellular data internet mobile phone speed wireless\",\n new_releases: \"! alert announcement attention burst caution danger error exclamation important mark notification star symbol warning\",\n newspaper: \"article data document drive file folders magazine media notes page sheet slide text writing\",\n next_plan: \"arrow circle right\",\n next_week: \"arrow baggage briefcase business suitcase\",\n nfc: \"communication data field mobile near wireless\",\n nightlife: \"alcohol bar bottle club cocktail dance drink food glass liquor music note wine\",\n nightlight: \"dark disturb mode moon sleep weather\",\n nightlight_round: \"dark half mode moon\",\n night_shelter: \"architecture bed building estate homeless house place real sleep\",\n nights_stay: \"cloud crescent dark mode moon phases silence silent sky time weather\",\n nine_k: \"9000 9K alphabet character digit display font letter number pixels resolution symbol text type video\",\n nine_k_plus: \"+ 9000 9K alphabet character digit display font letter number pixels resolution symbol text type video\",\n nine_mp: \"camera digit font image letters megapixels number quality resolution symbol text type\",\n nineteen_mp: \"camera digits font image letters megapixels numbers quality resolution symbol text type\",\n no_accounts: \"avatar disabled enabled face human offline people person profile slash thumbnail unavailable unidentifiable unknown user\",\n no_backpack: \"accessory bookbag knapsack travel\",\n no_cell: \"Android device disabled enabled hardware iOS mobile off phone slash tablet\",\n no_drinks: \"alcohol beverage bottle cocktail food liquor wine\",\n no_encryption: \"disabled enabled lock off password safety security slash\",\n no_encryption_gmailerrorred: \"disabled enabled locked off slash\",\n no_flash: \"camera disabled enabled image lightning off on photography picture slash thunderbolt\",\n no_food: \"disabled drink enabled fastfood hamburger meal off on slash\",\n no_luggage: \"baggage carry disabled enabled off on slash suitcase travel\",\n no_meals: \"dining disabled eat enabled food fork knife off restaurant slash spoon utensils\",\n no_meeting_room: \"building disabled doorway enabled entrance home house interior office on open places slash\",\n no_photography: \"camera disabled enabled image off on picture slash\",\n nordic_walking: \"athlete athletic body entertainment exercise hiking hobby human people person social sports travel walker\",\n north: \"arrow directional maps navigation up\",\n north_east: \"arrow maps navigation noth right up\",\n north_west: \"arrow directional left maps navigation up\",\n no_sim: \"camera card device eject insert memory phone storage\",\n no_stroller: \"baby care carriage children disabled enabled infant kid newborn off on parents slash toddler young\",\n not_accessible: \"accessibility body handicap help human person wheelchair\",\n note: \"bookmark message paper\",\n note_add: \"+ -doc create data document drive file folders new page paper plus sheet slide symbol writing\",\n note_alt: \"clipboard document file memo page paper writing\",\n notes: \"comment document text write writing\",\n notification_add: \"+ active alarm alert bell chime notifications notify plus reminder ring sound symbol\",\n notification_important: \"! active alarm alert announcement attention bell caution chime danger error exclamation feedback mark notifications notify problem reminder ring sound symbol warning\",\n notifications: \"active alarm alert bell chime notify reminder ring sound\",\n notifications_active: \"alarm alert bell chime notify reminder ringing sound\",\n notifications_none: \"alarm alert bell notify reminder ring sound\",\n notifications_off: \"active alarm alert bell chime disabled enabled notify offline reminder ring slash sound\",\n notifications_paused: \"--- active alarm aleet alert bell chime ignore notify pause quiet reminder ring sleep snooze sound zzz\",\n not_interested: \"allowed banned cancel circle close disabled dislike exit interested not off prohibited quit remove stop\",\n not_listed_location: \"? assistance destination direction help information maps pin place punctuation questionmark stop support symbol\",\n no_transfer: \"automobile bus cars direction disabled enabled maps off public slash transportation vehicle\",\n not_started: \"circle media pause play video\",\n offline_bolt: \"circle electric fast flash lightning spark thunderbolt\",\n offline_pin: \"approve checkmark circle complete done ok select tick validate verified yes\",\n offline_share: \"Android arrow cell connect device direction hardware iOS link mobile multiple phone right tablet\",\n oil_barrel: \"droplet gasoline nest water\",\n ondemand_video: \"Android chrome desktop device hardware iOS mac monitor play television tv web window\",\n on_device_training: \"arrow bulb call cell contact hardware idea inprogress light loading mobile model refresh renew restore reverse rotate telephone\",\n one_k: \"1000 1K alphabet character digit display font letter number pixels resolution symbol text type video\",\n one_kk: \"10000 10K alphabet character digit display font letter number pixels resolution symbol text type video\",\n one_k_plus: \"+ 1000 1K alphabet character digit display font letter number pixels resolution symbol text type video\",\n online_prediction: \"bulb connection idea light network signal wireless\",\n opacity: \"color droplet hue inverted liquid palette tone water\",\n open_in_browser: \"arrow box new up website window\",\n open_in_full: \"action arrows expand grow move\",\n open_in_new: \"application arrow box components interface screen ui ux website window\",\n open_in_new_off: \"arrow box disabled enabled export on slash window\",\n open_with: \"arrows directional expand move\",\n other_houses: \"architecture cottage estate home maps place real residence residential stay traveling\",\n outbound: \"arrow circle directional right up\",\n outbox: \"mail send sent\",\n outdoor_grill: \"barbecue barbeque bbq charcoal cooking home house outside\",\n outlet: \"connecter electricity plug power\",\n outlined_flag: \"country goal mark nation report start\",\n padding: \"design layout margin size square\",\n pages: \"article gplus paper post star\",\n pageview: \"document find glass magnifying paper search\",\n paid: \"circle currency money payment transaction\",\n palette: \"art colors filters paint\",\n panorama: \"angle image mountains photography picture view wide\",\n panorama_fish_eye: \"angle circle image photography picture wide\",\n panorama_horizontal: \"angle image photography picture wide\",\n panorama_horizontal_select: \"angle image photography picture wide\",\n panorama_photosphere: \"angle horizontal image photography picture wide\",\n panorama_photosphere_select: \"angle horizontal image photography picture wide\",\n panorama_vertical: \"angle image photography picture wide\",\n panorama_vertical_select: \"angle image photography picture wide\",\n panorama_wide_angle: \"image photography picture\",\n panorama_wide_angle_select: \"image photography picture\",\n pan_tool: \"drag fingers gesture hands human move scan stop touch wait\",\n paragliding: \"athlete athletic body entertainment exercise fly hobby human parachute people person skydiving social sports travel\",\n park: \"attraction fresh local nature outside plant tree\",\n party_mode: \"camera lens photography picture\",\n password: \"key login pin security star unlock\",\n pattern: \"key login password pin security star unlock\",\n pause: \"controls media music pending player status video wait\",\n pause_circle: \"controls media music video\",\n pause_circle_filled: \"controls media music pending status video wait\",\n pause_circle_outline: \"controls media music pending status video wait\",\n pause_presentation: \"application desktop device pending screen share slides status wait website window www\",\n payment: \"bill cash charge coin commerce cost creditcard currency dollars finance financial information money online price shopping symbol\",\n payments: \"bill card cash coin commerce cost credit currency dollars finance layer money multiple online price shopping symbol\",\n pedal_bike: \"automobile bicycle cars direction human maps public route scooter transportation vehicle vespa\",\n pending: \"circle dots loading progress waiting\",\n pending_actions: \"clipboard clock date document remember schedule time\",\n pentagon: \"five shape sides\",\n people: \"accounts committee community face family friends group humans network persons profiles social team users\",\n people_alt: \"accounts committee face family friends group humans network persons profiles social team users\",\n people_outline: \"accounts committee face family friends group humans network persons profiles social team users\",\n percent: \"math number symbol\",\n perm_camera_mic: \"image microphone min photography picture speaker\",\n perm_contact_calendar: \"account agenda date face human information people person profile schedule time user\",\n perm_data_setting: \"cellular configure gear information network settings wifi wireless\",\n perm_device_information: \"Android alert announcement cell hardware iOS important mobile phone tablet\",\n perm_identity: \"account avatar face human information people person profile save, thumbnail user\",\n perm_media: \"collection data directories document file folders images landscape mountains photography picture save storage\",\n perm_phone_msg: \"bubble call cell chat comment communicate contact device message mobile recording save speech telephone voice\",\n perm_scan_wifi: \"alert announcement connection information internet network service signal wireless\",\n person: \"account avatar face human people profile user\",\n person_add: \"+ account avatar face friend human new people plus profile symbol user\",\n person_add_alt: \"+ account face human people plus profile user\",\n person_add_disabled: \"+ account enabled face human new offline people plus profile slash symbol user\",\n personal_video: \"Android cam chrome desktop device hardware iOS mac monitor television tv web window\",\n person_off: \"account avatar disabled enabled face human people profile slash user\",\n person_outline: \"account avatar face human people profile user\",\n person_pin: \"account avatar destination direction face gps human location maps people place profile stop user\",\n person_pin_circle: \"account destination direction face gps human location maps people place profile stop user\",\n person_remove: \"account avatar delete face human minus people profile unfriend user\",\n person_search: \"account avatar face find glass human look magnifying people profile user\",\n pest_control: \"bug exterminator insects\",\n pest_control_rodent: \"exterminator mice\",\n pets: \"animal cat claw dog hand paw\",\n phishing: \"fishing fraud hook scam\",\n phone: \"call cell chat contact device hardware mobile telephone text\",\n phone_android: \"cell device hardware iOS mobile tablet\",\n phone_bluetooth_speaker: \"call cell connection connectivity contact device hardware mobile signal symbol telephone wireless\",\n phone_callback: \"arrow cell contact device down hardware mobile telephone\",\n phone_disabled: \"call cell contact device enabled hardware mobile offline slash telephone\",\n phone_enabled: \"call cell contact device hardware mobile telephone\",\n phone_forwarded: \"arrow call cell contact device direction hardware mobile right telephone\",\n phone_iphone: \"Android apple cell device hardware iOS mobile tablet\",\n phonelink: \"Android chrome computer connect desktop device hardware iOS mac mobile sync tablet web windows\",\n phonelink_erase: \"Android cancel cell close connection device exit hardware iOS mobile no remove stop tablet\",\n phonelink_lock: \"Android cell connection device erase hardware iOS locked mobile password privacy private protection safety secure security tablet\",\n phonelink_off: \"Android chrome computer connect desktop device disabled enabled hardware iOS mac mobile slash sync tablet web windows\",\n phonelink_ring: \"Android cell connection data device hardware iOS mobile network service signal tablet wireless\",\n phonelink_setup: \"Android call chat device hardware iOS information mobile settings tablet text\",\n phone_locked: \"call cell contact device hardware mobile password privacy private protection safety secure security telephone\",\n phone_missed: \"arrow call cell contact device hardware mobile telephone\",\n phone_paused: \"call cell contact device hardware mobile telephone wait\",\n photo: \"image mountains photography picture\",\n photo_album: \"archive bookmark image label library mountains photography picture ribbon save tag\",\n photo_camera: \"image photography picture\",\n photo_camera_back: \"image landscape mountains photography picture rear\",\n photo_camera_front: \"account face human image people person photography picture portrait profile user\",\n photo_filter: \"filters image photography picture stars\",\n photo_library: \"album image mountains photography picture\",\n photo_size_select_actual: \"image mountains photography picture\",\n photo_size_select_large: \"adjust album editing image library mountains photography picture\",\n photo_size_select_small: \"adjust album editing image large library mountains photography picture\",\n php: \"alphabet brackets character code css developer engineering font html letter platform symbol text type\",\n piano: \"instrument keyboard keys musical social\",\n piano_off: \"disabled enabled instrument keyboard keys musical on slash social\",\n picture_as_pdf: \"alphabet character document file font image letter multiple photography symbol text type\",\n picture_in_picture: \"cropped overlap photo position shape\",\n picture_in_picture_alt: \"cropped overlap photo position shape\",\n pie_chart: \"analytics bars data diagram infographic measure metrics statistics tracking\",\n pie_chart_outline: \"analytics bars data diagram infographic measure metrics statistics tracking\",\n pie_chart_outlined: \"graph\",\n pin: \"1 2 3 digit key login logout number password pattern security star symbol unlock\",\n pinch: \"arrows compress direction finger grasp hand navigation nip squeeze tweak\",\n pin_drop: \"destination direction gps location maps navigation place stop\",\n pinterest: \"brand logo social\",\n pivot_table_chart: \"analytics arrows bars data diagram direction drive editing grid infographic measure metrics rotate sheet statistics tracking\",\n pix: \"bill brazil card cash commerce credit currency finance money payment\",\n place: \"destination direction location maps navigation pin point stop\",\n plagiarism: \"document find glass look magnifying page paper search see\",\n play_arrow: \"controls media music player start video\",\n play_circle: \"arrow controls media music video\",\n play_circle_filled: \"arrow controls media music start video\",\n play_circle_filled_white: \"start\",\n play_circle_outline: \"arrow controls media music start video\",\n play_disabled: \"controls enabled media music off slash video\",\n play_for_work: \"arrow circle down google half\",\n play_lesson: \"audio bookmark digital ebook lesson multimedia play reading ribbon\",\n playlist_add: \"+ collection music new plus symbol task todo\",\n playlist_add_check: \"approve checkmark collection complete done music ok select task tick todo validate verified yes\",\n playlist_add_check_circle: \"album artist audio cd collection mark music record sound track\",\n playlist_add_circle: \"album artist audio cd check collection mark music record sound track\",\n playlist_play: \"arow arrow collection music\",\n playlist_remove: \"- collection minus music\",\n plumbing: \"build construction fix handyman repair tools wrench\",\n plus_one: \"1 add digit increase number symbol\",\n podcasts: \"broadcast casting network signal transmitting wireless\",\n point_of_sale: \"checkout cost machine merchant money payment pos retail system transaction\",\n policy: \"certified find glass legal look magnifying privacy private protection search security see shield verified\",\n poll: \"analytics barchart bars data diagram infographic measure metrics statistics survey tracking vote\",\n pool: \"athlete athletic beach body entertainment exercise hobby human ocean people person places sea sports swimming water\",\n portable_wifi_off: \"connected connection data device disabled enabled internet network offline service signal slash usage wireless\",\n portrait: \"account face human people person photo picture profile user\",\n post_add: \"+ data document drive file folders item page paper plus sheet slide text writing\",\n power: \"charge cord electrical online outlet plug socket\",\n power_input: \"dc lines supply\",\n power_off: \"charge cord disabled electrical enabled on outlet plug slash\",\n power_settings_new: \"information off save shutdown\",\n precision_manufacturing: \"arm automatic chain conveyor crane factory industry machinery mechanical production repairing robot supply warehouse\",\n pregnant_woman: \"baby birth body female human lady maternity mom mother people person user women\",\n present_to_all: \"arrow presentation screen share slides website\",\n preview: \"design eye layout reveal screen see show website window www\",\n price_change: \"arrows bill card cash coin commerce cost credit currency dollars down finance money online payment shopping symbol up\",\n price_check: \"approve bill card cash coin commerce complete cost credit currency dollars done finance mark money ok online payment select shopping symbol tick validate verified yes\",\n print: \"draft fax ink machine office paper printer send\",\n print_disabled: \"enabled off on paper printer slash\",\n priority_high: \"! alert attention caution danger error exclamation important mark notification symbol warning\",\n privacy_tip: \"alert announcement announcment assistance certified details help information private protection security service shield support verified\",\n production_quantity_limits: \"! alert attention bill card cart cash caution coin commerce credit currency danger dollars error exclamation important mark money notification online payment shopping symbol warning\",\n propane: \"gas nest\",\n propane_tank: \"bbq gas grill nest\",\n psychology: \"behavior body brain cognitive function gear head human intellectual mental mind people person preferences psychiatric science settings social therapy thinking thoughts\",\n public: \"country earth global globe language map network planet social space web world\",\n public_off: \"disabled earth enabled global globe map network on planet slash social space web world\",\n publish: \"arrow cloud file import submit upload\",\n published_with_changes: \"approve arrows check complete done inprogress loading mark ok refresh renew replace rotate select tick validate verified yes\",\n push_pin: \"location marker place remember save\",\n qr_code: \"barcode camera media product quick response smartphone urls\",\n qr_code_2: \"barcode camera media product quick response smartphone urls\",\n qr_code_scanner: \"barcode camera media product quick response smartphone urls\",\n query_builder: \"clock date hour minute save schedule time\",\n query_stats: \"analytics chart data diagram find glass infographic line look magnifying measure metrics search see statistics tracking\",\n question_answer: \"bubble chat comment communicate conversation converse feedback message speech talk\",\n question_mark: \"? assistance help information mark punctuation question support symbol\",\n queue: \"add collection layers multiple music playlist stack stream video\",\n queue_music: \"add collection playlist stream\",\n queue_play_next: \"+ add arrow collection desktop device display hardware monitor music new playlist plus screen steam symbol tv video\",\n quickreply: \"bubble chat comment communicate fast lightning message speech thunderbolt\",\n quiz: \"? assistance faq help information mark punctuation question support symbol test\",\n radar: \"detect military near network position scan\",\n radio: \"antenna audio device frequency hardware listen media music player signal tune\",\n radio_button_checked: \"application bullet circle components design form interface off point record screen selected toggle ui ux website\",\n radio_button_unchecked: \"bullet circle deselected form off point record toggle\",\n railway_alert: \"! attention automobile bike cars caution danger direction error exclamation important maps mark notification public scooter subway symbol train transportation vehicle vespa warning\",\n ramen_dining: \"breakfast dinner drink fastfood lunch meal noodles restaurant\",\n ramp_left: \"arrows directions maps navigation path route sign traffic\",\n ramp_right: \"arrows directions maps navigation path route sign traffic\",\n rate_review: \"chat comment feedback message pencil stars write\",\n raw_off: \"alphabet character disabled enabled font image letter original photography slash symbol text type\",\n raw_on: \"alphabet character disabled enabled font image letter off original photography slash symbol text type\",\n read_more: \"arrow text\",\n receipt: \"bill credit invoice paper payment sale transaction\",\n receipt_long: \"bill check document list paperwork record store transaction\",\n recent_actors: \"account avatar cards carousel contacts face human layers list people person profile thumbnail user\",\n recommend: \"approved circle confirm favorite gesture hand like reaction social support thumbs well\",\n record_voice_over: \"account face human people person profile recording sound speaking speech transcript user\",\n rectangle: \"four parallelograms polygons quadrilaterals recangle shape sides\",\n reddit: \"brand logo social\",\n redeem: \"bill cart cash certificate coin commerce credit currency dollars giftcard money online payment present shopping\",\n redo: \"arrow backward forward next repeat rotate undo\",\n reduce_capacity: \"arrow body covid decrease down human people person social\",\n refresh: \"around arrows direction inprogress loading navigation refresh renew right rotate turn\",\n remember_me: \"Android avatar device hardware human iOS identity mobile people person phone profile tablet user\",\n remove: \"can delete line minus negative substract subtract trash\",\n remove_circle: \"allowed banned block can delete disable minus negative not substract trash\",\n remove_circle_outline: \"allowed banned block can delete disable minus negative not substract trash\",\n remove_done: \"approve check complete disabled enabled finished mark multiple off ok select slash tick yes\",\n remove_from_queue: \"collection desktop device display hardware list monitor screen steam television\",\n remove_moderator: \"certified disabled enabled off privacy private protection security shield slash verified\",\n remove_red_eye: \"iris looking preview see sight vision\",\n remove_road: \"- cancel close destination direction exit highway maps minus new no stop street symbol traffic\",\n remove_shopping_cart: \"card cash checkout coin commerce credit currency disabled dollars enabled off online payment slash tick\",\n reorder: \"format lines list stacked\",\n repeat: \"arrows controls media music video\",\n repeat_on: \"arrows controls media music video\",\n repeat_one: \"1 arrows controls digit media music number symbol video\",\n repeat_one_on: \"arrows controls digit media music number symbol video\",\n replay: \"arrows controls music refresh reload renew repeat retry rewind undo video\",\n replay_10: \"arrows controls digit music number refresh renew repeat rewind symbol ten video\",\n replay_30: \"arrows controls digit music number refresh renew repeat rewind symbol thirty video\",\n replay_5: \"arrows controls digit five music number refresh renew repeat rewind symbol video\",\n replay_circle_filled: \"arrows controls music refresh renew repeat video\",\n reply: \"arrow backward left mail message send share\",\n reply_all: \"arrows backward group left mail message multiple send share\",\n report: \"! alert attention caution danger error exclamation important mark notification octagon symbol warning\",\n report_gmailerrorred: \"! alert attention caution danger exclamation important mark notification octagon symbol warning\",\n report_off: \"! alert attention caution danger disabled enabled error exclamation important mark notification octagon offline slash symbol warning\",\n report_problem: \"! alert announcement attention caution danger error exclamation feedback important mark notification symbol triangle warning\",\n request_quote: \"bill card cash coin commerce cost credit currency dollars finance money online payment price shopping symbol\",\n reset_tv: \"arrow device hardware monitor television\",\n restart_alt: \"around arrow inprogress loading reboot refresh renew repeat reset\",\n restaurant: \"breakfast cutlery dining dinner eat food fork knife local lunch meal places spoon utensils\",\n restaurant_menu: \"book dining eat food fork knife local meal spoon\",\n restore: \"arrow backwards clock date history refresh renew reverse rotate schedule time turn undo\",\n restore_from_trash: \"arrow backwards can clock date delete garbage history refresh remove renew reverse rotate schedule time turn up\",\n restore_page: \"arrow data doc file history paper refresh rotate sheet storage undo web\",\n reviews: \"bubble chat comment communicate feedback message rate rating recommendation speech\",\n rice_bowl: \"dinner food lunch meal restaurant\",\n ring_volume: \"calling cell contact device hardware incoming mobile ringer sound telephone\",\n r_mobiledata: \"alphabet character font letter symbol text type\",\n rocket: \"spaceship\",\n rocket_launch: \"spaceship takeoff\",\n roller_shades: \"blinds cover curtains nest open shutter sunshade\",\n roller_shades_closed: \"blinds cover curtains nest shutter sunshade\",\n roofing: \"architecture building chimney construction estate home house real residence residential service shelter\",\n room: \"destination direction gps location maps marker pin place spot stop\",\n room_preferences: \"building doorway entrance gear home house interior office open settings\",\n room_service: \"alert bell concierge delivery hotel notify\",\n rotate_90_degrees_ccw: \"arrows direction editing image photo turn\",\n rotate_90_degrees_cw: \"arrows ccw direction editing image photo turn\",\n rotate_left: \"around arrow circle direction inprogress loading refresh reload renew reset turn\",\n rotate_right: \"around arrow circle direction inprogress loading refresh renew turn\",\n roundabout_left: \"arrows directions maps navigation path route sign traffic\",\n roundabout_right: \"arrows directions maps navigation path route sign traffic\",\n rounded_corner: \"adjust edit shape square transform\",\n route: \"directions maps path sign traffic\",\n router: \"box cable connection device hardware internet network signal wifi\",\n rowing: \"activity boat body canoe human people person sports water\",\n rss_feed: \"application blog connection data internet network service signal website wifi wireless\",\n rsvp: \"alphabet character font invitation invite letter plaît respond répondez sil symbol text type vous\",\n rtt: \"call real rrt text time\",\n rule: \"approve check done incomplete line mark missing no ok select tick validate verified wrong x yes\",\n rule_folder: \"approve cancel check close complete data document done drive exit file mark no ok remove select sheet slide storage tick validate verified yes\",\n run_circle: \"body exercise human people person running\",\n running_with_errors: \"! alert attention caution danger duration exclamation important mark notification processing symbol time warning\",\n rv_hookup: \"arrow attach automobile automotive back cars connect direction left maps public right trailer transportation travel truck van vehicle\",\n safety_divider: \"apart distance separate social space\",\n sailing: \"entertainment fishing hobby ocean sailboat sea social sports travel water\",\n sanitizer: \"bacteria bottle clean covid disinfect germs pump\",\n satellite: \"bluetooth connection connectivity data device image internet landscape location maps mountains network photography picture scan service signal symbol wifi wireless--\",\n satellite_alt: \"alternative artificial communication space station television\",\n save: \"data diskette document drive file floppy multimedia storage write\",\n save_alt: \"arrow diskette document down file floppy multimedia write\",\n save_as: \"compose create data disk document draft drive editing file floppy input multimedia pencil storage write writing\",\n saved_search: \"find glass important look magnifying marked see star\",\n savings: \"bank bill card cash coin commerce cost credit currency dollars finance money online payment piggy symbol\",\n scale: \"measure monitor weight\",\n scanner: \"copy device hardware machine\",\n scatter_plot: \"analytics bars chart circles data diagram dot infographic measure metrics statistics tracking\",\n schedule: \"calendar clock date mark save time\",\n schedule_send: \"calendar clock date email letter remember share time\",\n schema: \"analytics chart data diagram flow infographic measure metrics statistics tracking\",\n school: \"academy achievement cap class college education graduation hat knowledge learning university\",\n science: \"beaker chemical chemistry experiment flask glass laboratory research tube\",\n score: \"2k alphabet analytics bars character chart data diagram digit font infographic letter measure metrics number statistics symbol text tracking type\",\n screen_lock_landscape: \"Android device hardware iOS mobile phone rotate security tablet\",\n screen_lock_portrait: \"Android device hardware iOS mobile phone rotate security tablet\",\n screen_lock_rotation: \"Android arrow device hardware iOS mobile phone rotate tablet turn\",\n screen_rotation: \"Android arrow device hardware iOS mobile phone rotate tablet turn\",\n screen_search_desktop: \"Android arrow device hardware iOS lock monitor rotate web\",\n screen_share: \"Android arrow cast chrome device display hardware iOS laptop mac mirror monitor steam streaming web window\",\n screenshot: \"Android cell crop device hardware iOS mobile phone tablet\",\n screenshot_monitor: \"Android chrome desktop device display hardware iOS mac screengrab web window\",\n sd: \"alphabet camera card character data device digital drive flash font image letter memory photo secure symbol text type\",\n sd_card: \"camera digital memory photos secure storage\",\n sd_card_alert: \"! attention camera caution danger digital error exclamation important mark memory notification photos secure storage symbol warning\",\n sd_storage: \"camera card data digital memory microsd secure\",\n search: \"filter find glass look magnifying see up\",\n search_off: \"cancel close disabled enabled find glass look magnifying on see slash stop x\",\n security: \"certified privacy private protection shield verified\",\n security_update: \"Android arrow device download hardware iOS mobile phone tablet\",\n security_update_good: \"Android checkmark device hardware iOS mobile ok phone tablet tick\",\n security_update_warning: \"! Android alert attention caution danger device download error exclamation hardware iOS important mark mobile notification phone symbol tablet\",\n segment: \"alignment fonts format lines list paragraph part piece rules style text\",\n select_all: \"selection square tool\",\n self_improvement: \"body calm care chi human meditate meditation people person relax sitting wellbeing yoga zen\",\n sell: \"bill card cart cash coin commerce credit currency dollars money online payment price shopping tag\",\n send: \"chat email message paper plane reply right share telegram\",\n send_and_archive: \"arrow download email letter save share\",\n send_time_extension: \"deliver dispatch envelop mail message schedule\",\n send_to_mobile: \"Android arrow device export forward hardware iOS phone right share tablet\",\n sensors: \"connection network scan signal wireless\",\n sensors_off: \"connection disabled enabled network scan signal slash wireless\",\n sentiment_dissatisfied: \"angry disappointed dislike emoji emoticon emotions expressions face feelings frown mood person sad smiley survey unhappy unsatisfied upset\",\n sentiment_neutral: \"emotionless emotions expressions face feelings indifference mood okay person survey\",\n sentiment_satisfied: \"emoji emoticon emotions expressions face feelings glad happiness happy like mood person pleased smiley smiling survey\",\n sentiment_satisfied_alt: \"account emoji face happy human people person profile smile user\",\n sentiment_very_dissatisfied: \"angry disappointed dislike emoji emoticon emotions expressions face feelings mood person sad smiley sorrow survey unhappy unsatisfied upset\",\n sentiment_very_satisfied: \"emoji emoticon emotions expressions face feelings glad happiness happy like mood person pleased smiley smiling survey\",\n set_meal: \"chopsticks dinner fish food lunch restaurant teishoku\",\n settings: \"application change details gear information options personal service\",\n settings_accessibility: \"body details human information people personal preferences profile user\",\n settings_applications: \"change details gear information options personal save service\",\n settings_backup_restore: \"arrow backwards history refresh reverse rotate time undo\",\n settings_bluetooth: \"connection connectivity device network signal symbol wifi\",\n settings_brightness: \"dark filter light mode sun\",\n settings_cell: \"Android cellphone device hardware iOS mobile tablet\",\n settings_ethernet: \"arrows brackets computer connection connectivity dots internet network parenthesis wifi\",\n settings_input_antenna: \"airplay arrows computer connection connectivity dots internet network screencast stream wifi wireless\",\n settings_input_component: \"audio av cables connection connectivity internet plugs points video wifi\",\n settings_input_composite: \"cable component connection connectivity plugs points\",\n settings_input_hdmi: \"cable connection connectivity definition high plugin points video wire\",\n settings_input_svideo: \"cable connection connectivity definition plugin plugs points standard svideo,\",\n settings_overscan: \"arrows expand image photo picture\",\n settings_phone: \"call cell contact device hardware mobile telephone\",\n settings_power: \"information off save shutdown\",\n settings_remote: \"bluetooth connection connectivity control device signal wifi wireless\",\n settings_suggest: \"change details gear options recommendation service suggestion system\",\n settings_system_daydream: \"backup cloud drive storage\",\n settings_voice: \"microphone recorder speaker\",\n seven_k: \"7000 7K alphabet character digit display font letter number pixels resolution symbol text type video\",\n seven_k_plus: \"+ 7000 7K alphabet character digit display font letter number pixels resolution symbol text type video\",\n seven_mp: \"camera digit font image letters megapixels number quality resolution symbol text type\",\n seventeen_mp: \"camera digits font image letters megapixels numbers quality resolution symbol text type\",\n share: \"android connect contect link multimedia multiple network options send shared sharing social\",\n share_location: \"destination direction gps maps pin place stop tracking\",\n shield: \"certified privacy private protection secure security verified\",\n shop: \"arrow bag bill briefcase buy card cart cash coin commerce credit currency dollars google money online payment play purchase shopping store\",\n shop_2: \"add arrow buy cart google play purchase shopping\",\n shopping_bag: \"bill business buy card cart cash coin commerce credit currency dollars money online payment storefront\",\n shopping_basket: \"add bill buy card cart cash checkout coin commerce credit currency dollars money online payment purchase\",\n shopping_cart: \"add bill buy card cash checkout coin commerce credit currency dollars money online payment purchase\",\n shopping_cart_checkout: \"arrow cash coin commerce currency dollars money online payment right\",\n shop_two: \"add arrow briefcase buy cart google play purchase shopping\",\n shortcut: \"arrow direction forward right\",\n short_text: \"brief comment document lines note write writing\",\n show_chart: \"analytics bars chart data diagram infographic line measure metrics presentation show statistics stock tracking\",\n shower: \"bathroom closet home house place plumbing sprinkler wash water wc\",\n shuffle: \"arrows controls music random video\",\n shuffle_on: \"arrows controls music random video\",\n shutter_speed: \"aperture camera duration image lens photography photos picture setting stop timer watch\",\n sick: \"covid discomfort emotions expressions face feelings fever flu ill mood pain person survey upset\",\n signal_cellular_0_bar: \"data internet mobile network phone speed wifi wireless\",\n signal_cellular_4_bar: \"data internet mobile network phone speed wifi wireless\",\n signal_cellular_alt: \"analytics bar chart data diagram infographic internet measure metrics mobile network phone statistics tracking wifi wireless\",\n signal_cellular_connected_no_internet_0_bar: \"! alert attention caution danger data error exclamation important mark mobile network notification phone symbol warning wifi wireless\",\n signal_cellular_connected_no_internet_1_bar: \"network\",\n signal_cellular_connected_no_internet_2_bar: \"network\",\n signal_cellular_connected_no_internet_3_bar: \"network\",\n signal_cellular_connected_no_internet_4_bar: \"! alert attention caution danger data error exclamation important mark mobile network notification phone symbol warning wifi wireless\",\n signal_cellular_nodata: \"internet mobile network offline phone quit wifi wireless x\",\n signal_cellular_no_sim: \"camera card chip device disabled enabled memory network offline phone slash storage\",\n signal_cellular_null: \"data internet mobile network phone wifi wireless\",\n signal_cellular_off: \"data disabled enabled internet mobile network offline phone slash wifi wireless\",\n signal_wifi_bad: \"bar cancel cellular close data exit internet mobile network no phone quit remove stop wireless\",\n signal_wifi_connected_no_internet4: \"cellular data mobile network offline phone wireless x\",\n signal_wifi_off: \"cellular data disabled enabled internet mobile network phone slash speed wireless\",\n signal_wifi_statusbar4_bar: \"cellular data internet mobile network phone speed wireless\",\n signal_wifi_statusbar_connected_no_internet4: \"! alert attention caution cellular danger data error exclamation important mark mobile network notification phone speed symbol warning wireless\",\n signal_wifi_statusbar_null: \"cellular data internet mobile network phone speed wireless\",\n signpost: \"arrow direction left maps right signal signs street traffic\",\n sim_card: \"camera chip device memory network phone storage\",\n sim_card_alert: \"! attention camera caution danger digital error exclamation important mark memory notification photos sd secure storage symbol warning\",\n sim_card_download: \"arrow camera chip device memory phone storage\",\n single_bed: \"bedroom double furniture home hotel house king night pillows queen rest sleep twin\",\n sip: \"alphabet call character dialer font initiation internet letter over phone protocol routing session symbol text type voice\",\n six_k: \"6000 6K alphabet character digit display font letter number pixels resolution symbol text type video\",\n six_k_plus: \"+ 6000 6K alphabet character digit display font letter number pixels resolution symbol text type video\",\n six_mp: \"camera digit font image letters megapixels number quality resolution symbol text type\",\n sixteen_mp: \"camera digits font image letters megapixels numbers quality resolution symbol text type\",\n sixty_fps: \"camera digit frames number symbol video\",\n sixty_fps_select: \"camera digits frame frequency numbers per rate seconds video\",\n skateboarding: \"athlete athletic body entertainment exercise hobby human people person skateboarder social sports\",\n skip_next: \"arrow back controls forward music play previous transport video\",\n skip_previous: \"arrow backward controls forward music next play transport video\",\n sledding: \"athlete athletic body entertainment exercise hobby human people person sledge snow social sports travel winter\",\n slideshow: \"movie photos play presentation square video view\",\n slow_motion_video: \"arrow circle controls music play speed time\",\n smart_button: \"action auto components composer function interface special stars ui ux website\",\n smart_display: \"airplay chrome connect device screencast stream television tv video wireless\",\n smartphone: \"Android call cell chat device hardware iOS mobile tablet text\",\n smart_screen: \"Android airplay cell connect device hardware iOS mobile phone screencast stream tablet video\",\n smart_toy: \"games robot\",\n smoke_free: \"cigarette disabled enabled never no off places prohibited slash smoking tobacco warning zone\",\n smoking_rooms: \"allowed cigarette places smoke tobacco zone\",\n sms: \"3 bubble chat comment communication conversation dots message more service speech three\",\n sms_failed: \"! alert attention bubbles caution chat comment communication conversation danger error exclamation important mark message notification service speech symbol warning\",\n snippet_folder: \"data document drive file sheet slide storage\",\n snooze: \"alarm bell clock duration notification set timer watch\",\n snowboarding: \"athlete athletic body entertainment exercise hobby human people person social sports travel winter\",\n snowmobile: \"automobile car direction skimobile social sports transportation travel vehicle winter\",\n snowshoeing: \"body human people person sports travel walking winter\",\n soap: \"bathroom clean fingers gesture hand wash wc\",\n social_distance: \"6 apart body ft human people person space\",\n solar_power: \"eco energy heat nest sunny\",\n sort: \"filter find lines list organize\",\n sort_by_alpha: \"alphabetize az by character font letters list order organize symbol text type\",\n soup_kitchen: \"breakfast brunch dining food lunch meal\",\n source: \"code composer content creation data document file folder mode storage view\",\n south: \"arrow directional down maps navigation\",\n south_america: \"america continent landscape place region south\",\n south_east: \"arrow directional down maps navigation right\",\n south_west: \"arrow directional down left maps navigation\",\n spa: \"aromatherapy flower healthcare leaf massage meditation nature petals places relax wellbeing wellness\",\n space_bar: \"keyboard line\",\n speaker: \"audio box electronic loud music sound stereo system video\",\n speaker_group: \"audio box electronic loud multiple music sound stereo system video\",\n speaker_notes: \"bubble cards chat comment communicate format list message speech text\",\n speaker_notes_off: \"bubble cards chat comment communicate disabled enabled format list message on slash speech text\",\n speaker_phone: \"Android cell device hardware iOS mobile sound tablet volume\",\n speed: \"arrow clock controls dial fast gauge measure motion music slow speedometer test velocity video\",\n spellcheck: \"alphabet approve character checkmark edit font letter ok processor select symbol text tick type word write yes\",\n splitscreen: \"grid layout multitasking two\",\n spoke: \"connection network radius\",\n sports: \"athlete athletic basketball blowing coach entertainment exercise game hobby instrument live referee soccer social sound trophy warning whistle\",\n sports_bar: \"alcohol beer drink liquor pint places pub\",\n sports_baseball: \"athlete athletic entertainment exercise game hobby social\",\n sports_basketball: \"athlete athletic entertainment exercise game hobby social\",\n sports_cricket: \"athlete athletic ball bat entertainment exercise game hobby social\",\n sports_esports: \"controller entertainment gamepad gaming hobby online playstation social video xbox\",\n sports_football: \"american athlete athletic entertainment exercise game hobby social\",\n sports_golf: \"athlete athletic ball club entertainment exercise game golfer golfing hobby social\",\n sports_handball: \"athlete athletic body entertainment exercise game hobby human people person social\",\n sports_hockey: \"athlete athletic entertainment exercise game hobby ice social sticks\",\n sports_kabaddi: \"athlete athletic body combat entertainment exercise fighting game hobby human judo martial people person social wrestle wrestling\",\n sports_martial_arts: \"athlete athletic entertainment exercise hobby human karate people person social\",\n sports_mma: \"arts athlete athletic boxing combat entertainment exercise fighting game glove hobby martial mixed social\",\n sports_motorsports: \"athlete athletic automobile bike drive driving entertainment helmet hobby motorcycle protect social vehicle\",\n sports_rugby: \"athlete athletic ball entertainment exercise game hobby social\",\n sports_score: \"destination flag goal\",\n sports_soccer: \"athlete athletic entertainment exercise football game hobby social\",\n sports_tennis: \"athlete athletic ball bat entertainment exercise game hobby racket social\",\n sports_volleyball: \"athlete athletic entertainment exercise game hobby social\",\n square: \"draw four quadrangle shape sides\",\n square_foot: \"construction feet inches length measurement ruler school set tools\",\n ssid_chart: \"graph lines network wifi\",\n stacked_bar_chart: \"analytics chart-chart data diagram infographic measure metrics statistics tracking\",\n stacked_line_chart: \"analytics data diagram infographic measure metrics statistics tracking\",\n stadium: \"activity amphitheater arena coliseum event local star things ticket\",\n stairs: \"down staircase up\",\n star: \"best bookmark favorite highlight ranking rate rating save toggle\",\n star_border: \"best bookmark favorite highlight outline ranking rate rating save toggle\",\n star_border_purple_500: \"best bookmark favorite highlight outline ranking rate rating save toggle\",\n star_half: \"0.5 1/2 achievement bookmark favorite highlight important marked ranking rate rating reward saved shape special toggle\",\n star_outline: \"bookmark favorite half highlight ranking rate rating save toggle\",\n star_purple_500: \"best bookmark favorite highlight ranking rate rating save toggle\",\n star_rate: \"achievement bookmark favorite highlight important marked ranking rating reward saved shape special\",\n stars: \"achievement bookmark circle favorite highlight important like love marked ranking rate rating reward saved shape special\",\n start: \"arrow keyboard next right\",\n stay_current_landscape: \"Android device hardware iOS mobile phone tablet\",\n stay_current_portrait: \"Android device hardware iOS mobile phone tablet\",\n stay_primary_landscape: \"Android current device hardware iOS mobile phone tablet\",\n stay_primary_portrait: \"Android current device hardware iOS mobile phone tablet\",\n sticky_note_2: \"bookmark message paper text writing\",\n stop: \"arrow controls music pause player square video\",\n stop_circle: \"controls music pause play square video\",\n stop_screen_share: \"Android arrow cast chrome device disabled display enabled hardware iOS laptop mac mirror monitor offline slash steam streaming web window\",\n storage: \"computer database drive memory network server\",\n store: \"bill building business buy card cash coin company credit currency dollars e-commerce market money online payment purchase shopping storefront\",\n storefront: \"business buy cafe commerce market merchant places restaurant retail sell shopping stall\",\n store_mall_directory: \"building\",\n storm: \"forecast hurricane temperature twister weather wind\",\n straight: \"arrows directions maps navigation path route sign traffic up\",\n straighten: \"length measurement piano ruler size\",\n stream: \"cast connected feed live network signal wireless\",\n streetview: \"gps location maps\",\n strikethrough_s: \"alphabet character cross doc editing editor font letter out spreadsheet styles symbol text type writing\",\n stroller: \"baby care carriage children infant kid newborn toddler young\",\n style: \"booklet cards filters options tags\",\n subdirectory_arrow_left: \"arrow down navigation\",\n subdirectory_arrow_right: \"arrow down navigation\",\n subject: \"alignment document email full justify lines list note text writing\",\n subscript: \"2 doc editing editor gmail novitas spreadsheet style symbol text writing\",\n subscriptions: \"enroll media order playlist queue signup subscribe youtube\",\n subtitles: \"accessibility accessible captions character closed decoder language media movies translate tv\",\n subtitles_off: \"accessibility accessible caption closed disabled enabled language slash translate video\",\n subway: \"automobile bike cars maps metro rail scooter train transportation travel tunnel underground vehicle vespa\",\n summarize: \"document list menu note report summary\",\n superscript: \"2 doc editing editor gmail novitas spreadsheet style symbol text writing\",\n supervised_user_circle: \"account avatar control face human parental parents people person profile supervisor\",\n supervisor_account: \"administrator avatar control face human parental parents people person profile supervised user\",\n support: \"assist help lifebuoy rescue safety\",\n support_agent: \"care customer face headphone person representative service\",\n surfing: \"athlete athletic beach body entertainment exercise hobby human people person sea social sports summer water\",\n surround_sound: \"audio circle signal speaker system volume volumn wireless\",\n swap_calls: \"arrows device direction mobile share\",\n swap_horiz: \"arrows back direction forward horizontal\",\n swap_horizontal_circle: \"arrows back direction forward\",\n swap_vert: \"arrows back direction down navigation up vertical\",\n swap_vertical_circle: \"arrows back direction down horizontal up\",\n swipe: \"arrows fingers gesture hands touch\",\n swipe_down: \"arrows direction disable enable finger hands hit navigation strike swing swpie take\",\n swipe_down_alt: \"arrows direction disable enable finger hands hit navigation strike swing swpie take\",\n swipe_left: \"arrows finger hand hit navigation reject strike swing take\",\n swipe_left_alt: \"arrows finger hand hit navigation reject strike swing take\",\n swipe_right: \"accept arrows direction finger hands hit navigation strike swing swpie take\",\n swipe_right_alt: \"accept arrows direction finger hands hit navigation strike swing swpie take\",\n swipe_up: \"arrows direction disable enable finger hands hit navigation strike swing swpie take\",\n swipe_up_alt: \"arrows direction disable enable finger hands hit navigation strike swing swpie take\",\n swipe_vertical: \"arrows direction finger hands hit navigation strike swing swpie take verticle\",\n switch_access_shortcut: \"arrows direction navigation new north star symbol up\",\n switch_access_shortcut_add: \"+ arrows direction navigation new north plus star symbol up\",\n switch_account: \"choices face human multiple options people person profile social user\",\n switch_camera: \"arrows photography picture\",\n switch_left: \"arrows directional navigation toggle\",\n switch_right: \"arrows directional navigation toggle\",\n switch_video: \"arrows camera photography videos\",\n sync: \"360 around arrows direction inprogress loading refresh renew rotate turn\",\n sync_alt: \"arrows horizontal internet technology update wifi\",\n sync_disabled: \"360 around arrows direction enabled inprogress loading off refresh renew rotate slash turn\",\n sync_lock: \"around arrows locked password privacy private protection renew rotate safety secure security turn\",\n sync_problem: \"! 360 alert around arrows attention caution danger direction error exclamation important inprogress loading mark notification refresh renew rotate symbol turn warning\",\n system_security_update: \"Android arrow cell device down hardware iOS mobile phone tablet\",\n system_security_update_good: \"Android approve cell check complete device done hardware iOS mark mobile ok phone select tablet tick validate verified yes\",\n system_security_update_warning: \"! Android alert attention caution cell danger device error exclamation hardware iOS important mark mobile notification phone symbol tablet\",\n system_update: \"Android arrows cell device direction download hardware iOS install mobile phone tablet\",\n system_update_alt: \"arrow download export\",\n tab: \"browser computer documents folder internet tabs website windows\",\n table_chart: \"analytics bars data diagram grid infographic measure metrics statistics tracking\",\n table_rows: \"grid layout lines stacked\",\n tablet: \"Android device hardware iOS ipad mobile web\",\n tablet_android: \"device hardware iOS ipad mobile web\",\n tablet_mac: \"Android apple device hardware iOS ipad mac mobile tablet web\",\n table_view: \"format grid group layout multiple\",\n tab_unselected: \"browser computer documents folder internet tabs website windows\",\n tag: \"hashtag key media number pound social trend\",\n tag_faces: \"emoji emotion happy satisfied smile\",\n takeout_dining: \"box container delivery food meal restaurant\",\n tap_and_play: \"Android cell connection device hardware iOS internet mobile network nfc phone signal tablet to wifi wireless\",\n tapas: \"appetizer brunch dinner food lunch restaurant snack\",\n task: \"approve check complete data document done drive file folders mark ok page paper select sheet slide tick validate verified writing yes\",\n task_alt: \"approve check circle complete done mark ok select tick validate verified yes\",\n taxi_alert: \"! attention automobile cab cars caution danger direction error exclamation important lyft maps mark notification public symbol transportation uber vehicle warning yellow\",\n telegram: \"brand call chat logo messaging voice\",\n ten_mp: \"camera digits font image letters megapixels numbers quality resolution symbol text type\",\n terminal: \"application code emulator program software\",\n terrain: \"geography landscape mountain\",\n text_decrease: \"- alphabet character font letter minus remove resize subtract symbol type\",\n text_fields: \"T add alphabet character font input letter symbol type\",\n text_format: \"A alphabet character font letter square style symbol type\",\n text_increase: \"+ add alphabet character font letter new plus resize symbol type\",\n text_rotate_up: \"A alphabet arrow character field font letter move symbol type\",\n text_rotate_vertical: \"A alphabet arrow character down field font letter move symbol type verticle\",\n text_rotation_angledown: \"A alphabet arrow character field font letter move rotate symbol type\",\n text_rotation_angleup: \"A alphabet arrow character field font letter move rotate symbol type\",\n text_rotation_down: \"A alphabet arrow character field font letter move rotate symbol type\",\n text_rotation_none: \"A alphabet arrow character field font letter move rotate symbol type\",\n textsms: \"bubble chat comment communicate dots feedback message speech\",\n text_snippet: \"data document file notes storage writing\",\n texture: \"diagonal lines pattern stripes\",\n theater_comedy: \"broadway event movie musical places show standup tour watch\",\n theaters: \"film media movies photography showtimes video watch\",\n thermostat: \"forecast temperature weather\",\n thermostat_auto: \"A celsius fahrenheit temperature thermometer\",\n thirteen_mp: \"camera digits font image letters megapixels numbers quality resolution symbol text type\",\n thirty_fps: \"alphabet camera character digit font frames letter number symbol text type video\",\n thirty_fps_select: \"camera digits frame frequency image numbers per rate seconds video\",\n three_d_rotation: \"3d D alphabet arrows av camera character digit font letter number symbol text type vr\",\n three_g_mobiledata: \"alphabet cellular character digit font letter network number phone signal speed symbol text type wifi\",\n three_k: \"3000 3K alphabet character digit display font letter number pixels resolution symbol text type video\",\n three_k_plus: \"+ 3000 3K alphabet character digit display font letter number pixels resolution symbol text type video\",\n three_mp: \"camera digit font image letters megapixels number quality resolution symbol text type\",\n three_p: \"account avatar bubble chat comment communicate face human message party people person profile speech user\",\n three_sixty: \"arrow av camera direction rotate rotation vr\",\n thumb_down: \"dislike downvote favorite fingers gesture hands ranking rate rating reject up\",\n thumb_down_alt: \"bad decline disapprove dislike feedback hand hate negative no reject social veto vote\",\n thumb_down_off_alt: \"bad decline disapprove dislike favorite feedback filled fingers gesture hands hate negative no ranking rate rating reject sad social veto vote\",\n thumbs_up_down: \"dislike favorite fingers gesture hands rate rating vote\",\n thumb_up: \"approve dislike down favorite fingers gesture hands ranking rate rating success upvote\",\n thumb_up_alt: \"agreed approved confirm correct favorite feedback good hand happy like okay positive satisfaction social success vote yes\",\n thumb_up_off_alt: \"agreed approved confirm correct favorite feedback fingers gesture good hands happy like okay positive ranking rate rating satisfaction social vote yes\",\n timelapse: \"duration motion photo timer video\",\n timeline: \"analytics chart data graph history line movement points tracking trending zigzag zigzap\",\n timer: \"alarm alart bell clock disabled duration enabled notification off slash stopwatch wait\",\n timer_10: \"digits duration numbers seconds\",\n timer_10_select: \"alphabet camera character digit font letter number seconds symbol text type\",\n timer_3: \"digits duration numbers seconds\",\n timer_3_select: \"alphabet camera character digit font letter number seconds symbol text type\",\n timer_off: \"alarm alart bell clock disabled duration enabled notification slash stopwatch\",\n times_one_mobiledata: \"alphabet cellular character digit font letter network number phone signal speed symbol text type wifi\",\n time_to_leave: \"automobile cars destination direction drive estimate eta maps public transportation travel trip vehicle\",\n tips_and_updates: \"alert announcement electricity idea information lamp lightbulb stars\",\n title: \"T alphabet character font header letter subject symbol text type\",\n toc: \"content format lines list reorder stacked table text titles\",\n today: \"agenda calendar date event mark month range remember reminder schedule time week\",\n toggle_off: \"application components configuration control design disable inable inactive interface selection settings slider switch ui ux website\",\n toggle_on: \"application components configuration control design disable inable inactive interface off selection settings slider switch ui ux website\",\n token: \"badge hexagon mark shield sign symbol\",\n toll: \"bill booth card cash circles coin commerce credit currency dollars highway money online payment ticket\",\n tonality: \"circle editing filter image photography picture\",\n topic: \"data document drive file folder sheet slide storage\",\n tornado: \"crisis disaster natural rain storm weather wind\",\n touch_app: \"arrow command fingers gesture hand press swipe tap\",\n tour: \"destination flag places travel visit\",\n toys: \"car fan games kids windmill\",\n track_changes: \"bullseye circle evolve lines movement radar rotate shift target\",\n traffic: \"direction light maps signal street\",\n train: \"automobile cars direction maps public rail subway transportation vehicle\",\n tram: \"automobile cars direction maps public rail subway train transportation vehicle\",\n transfer_within_a_station: \"arrows body direction human left maps people person public right route stop transit transportation vehicle walk\",\n transform: \"adjust crop editing image photo picture\",\n transgender: \"female lgbt neutral neutrual social symbol\",\n transit_enterexit: \"arrow direction maps navigation route transportation\",\n translate: \"alphabet language letter speaking speech text translator words\",\n travel_explore: \"earth find glass global globe look magnifying map network planet search see social space web world\",\n trending_down: \"analytics arrow change chart data diagram infographic measure metrics movement rate rating sale statistics tracking\",\n trending_flat: \"arrow change chart data graph metric movement rate right tracking\",\n trending_up: \"analytics arrow change chart data diagram infographic measure metrics movement rate rating statistics tracking\",\n trip_origin: \"circle departure\",\n try: \"bookmark bubble chat comment communicate favorite feedback highlight important marked message saved shape special speech star\",\n tty: \"call cell contact deaf device hardware impaired mobile speech talk telephone text\",\n tune: \"adjust editing options settings sliders\",\n tungsten: \"electricity indoor lamp lightbulb setting\",\n turned_in: \"archive bookmark favorite item label library reading remember ribbon save submit tag\",\n turned_in_not: \"archive bookmark favorite item label library outline reading remember ribbon save submit tag\",\n turn_left: \"arrows directions maps navigation path route sign traffic\",\n turn_right: \"arrows directions maps navigation path route sign traffic\",\n turn_sharp_left: \"arrows directions maps navigation path route sign traffic\",\n turn_sharp_right: \"arrows directions maps navigation path route sign traffic\",\n turn_slight_left: \"arrows directions maps navigation path right route sign traffic\",\n turn_slight_right: \"arrows directions maps navigation path route sharp sign traffic\",\n tv: \"device display linear living monitor room screencast stream television video wireless\",\n tv_off: \"Android chrome desktop device disabled enabled hardware iOS mac monitor slash television web window\",\n twelve_mp: \"camera digits font image letters megapixels numbers quality resolution symbol text type\",\n twenty_four_mp: \"camera digits font image letters megapixels numbers quality resolution symbol text type\",\n twenty_one_mp: \"camera digits font image letters megapixels numbers quality resolution symbol text type\",\n twenty_three_mp: \"camera digits font image letters megapixels numbers quality resolution symbol text type\",\n twenty_two_mp: \"camera digits font image letters megapixels numbers quality resolution symbol text type\",\n twenty_zero_mp: \"camera digits font image letters megapixels numbers quality resolution symbol text type\",\n twitter: \"brand logo social\",\n two_k: \"2000 2K alphabet character digit display font letter number pixels resolution symbol text type video\",\n two_k_plus: \"+ alphabet character digit font letter number symbol text type\",\n two_mp: \"camera digit font image letters megapixels number quality resolution symbol text type\",\n two_wheeler: \"automobile bicycle cars direction maps moped motorbike motorcycle public ride riding scooter transportation travel twom vehicle wheeler wheels\",\n umbrella: \"beach protection rain sunny\",\n unarchive: \"arrow inbox mail store undo up\",\n undo: \"arrow backward mail previous redo repeat rotate\",\n unfold_less: \"arrows chevron collapse direction expandable inward list navigation up\",\n unfold_more: \"arrows chevron collapse direction down expandable list navigation\",\n unpublished: \"approve check circle complete disabled done enabled mark off ok select slash tick validate verified yes\",\n unsubscribe: \"cancel close email envelop esubscribe message newsletter off remove send\",\n upcoming: \"alarm calendar mail message notification\",\n update: \"arrow backwards clock forward future history load refresh reverse rotate schedule time\",\n update_disabled: \"arrow backwards clock enabled forward history load off on refresh reverse rotate schedule slash time\",\n upgrade: \"arrow export instal line replace update\",\n upload: \"arrows download drive\",\n upload_file: \"arrow data document download drive folders page paper sheet slide writing\",\n usb: \"cable connection device wire\",\n usb_off: \"cable connection device wire\",\n u_turn_left: \"arrows directions maps navigation path route sign traffic u-turn\",\n u_turn_right: \"arrows directions maps navigation path route sign traffic u-turn\",\n vaccines: \"aid covid doctor drug emergency hospital immunity injection medical medication medicine needle pharmacy sick syringe vaccination vial\",\n verified: \"approve badge burst check complete done mark ok select star tick validate yes\",\n verified_user: \"approve audit certified checkmark complete done ok privacy private protection security select shield tick validate yes\",\n vertical_align_bottom: \"alignment arrow doc down editing editor spreadsheet text type writing\",\n vertical_align_center: \"alignment arrow doc down editing editor spreadsheet text type up writing\",\n vertical_align_top: \"alignment arrow doc editing editor spreadsheet text type up writing\",\n vertical_shades: \"blinds cover curtains nest open shutter sunshade\",\n vertical_shades_closed: \"blinds cover curtains nest roller shutter sunshade\",\n vertical_split: \"design format grid layout paragraph text website writing\",\n vibration: \"Android alert cell device hardware iOS mobile mode motion notification phone silence silent tablet vibrate\",\n video_call: \"+ add camera chat conference filming hardware image motion new picture plus screen symbol videography\",\n videocam: \"camera chat conference filming hardware image motion picture screen videography\",\n video_camera_back: \"image landscape mountains photography picture rear\",\n video_camera_front: \"account face human image people person photography picture profile user\",\n videocam_off: \"camera chat conference disabled enabled filming hardware image motion offline picture screen slash videography\",\n video_file: \"camera document filming hardware image motion picture videography\",\n videogame_asset: \"console controller device gamepad gaming nintendo playstation xbox\",\n videogame_asset_off: \"console controller device disabled enabled gamepad gaming playstation slash\",\n video_label: \"device item screen window\",\n video_library: \"arrow collection play\",\n video_settings: \"change details gear information options play screen service window\",\n video_stable: \"filming recording setting stability taping\",\n view_agenda: \"blocks cards design format grid layout website,stacked\",\n view_array: \"blocks design format grid layout website\",\n view_carousel: \"banner blocks cards design format grid images layout website\",\n view_column: \"blocks design format grid layout vertical website\",\n view_comfy: \"grid layout pattern squares\",\n view_comfy_alt: \"cozy design format layout web\",\n view_compact: \"grid layout pattern squares\",\n view_compact_alt: \"dense design format layout web\",\n view_cozy: \"comfy design format layout web\",\n view_day: \"blocks calendar cards carousel design format grid layout website week\",\n view_headline: \"blocks design format grid layout paragraph text website\",\n view_in_ar: \"3d augmented cube daydream headset reality square vr\",\n view_kanban: \"grid layout pattern squares\",\n view_list: \"blocks design format grid layout lines reorder stacked title website\",\n view_module: \"blocks design format grid layout reorder squares stacked title website\",\n view_quilt: \"blocks design format grid layout reorder squares stacked title website\",\n view_sidebar: \"design format grid layout web\",\n view_stream: \"blocks design format grid layout lines list reorder stacked title website\",\n view_timeline: \"grid layout pattern squares\",\n view_week: \"bars blocks columns day design format grid layout website\",\n vignette: \"border editing effect filter gradient image photography setting\",\n villa: \"architecture beach estate home house maps place real residence residential stay traveling vacation\",\n visibility: \"eye on password preview reveal see shown visability\",\n visibility_off: \"disabled enabled eye hidden invisible on password reveal see show slash view visability\",\n voice_chat: \"bubble camera comment communicate facetime feedback message speech video\",\n voicemail: \"call device message missed mobile phone recording\",\n voice_over_off: \"account disabled enabled face human people person profile recording slash speaking speech transcript user\",\n volume_down: \"audio av control music quieter shh soft sound speaker tv\",\n volume_mute: \"audio control music sound speaker tv\",\n volume_off: \"audio av control disabled enabled low music mute slash sound speaker tv\",\n volume_up: \"audio control music sound speaker tv\",\n volunteer_activism: \"donation fingers gesture giving hands heart love sharing\",\n vpn_key: \"login network passcode password register security signin signup unlock\",\n vpn_key_off: \"[offline] disabled enabled network on passcode password slash unlock\",\n vpn_lock: \"earth globe locked network password privacy private protection safety secure security virtual world\",\n vrpano: \"angle image landscape mountains panorama photography picture view wide\",\n wallpaper: \"background image landscape photography picture\",\n warehouse: \"garage industry manufacturing storage\",\n warning: \"! alert announcement attention caution danger error exclamation feedback important mark notification problem symbol triangle\",\n warning_amber: \"! alert attention caution danger error exclamation important mark notification symbol triangle\",\n wash: \"bathroom clean fingers gesture hand wc\",\n watch: \"Android clock gadget iOS smartwatch time vr wearables web wristwatch\",\n watch_later: \"clock date hour minute schedule time\",\n watch_off: \"Android clock close gadget iOS shut time vr wearables web wristwatch\",\n water: \"aqua beach lake ocean river waves weather\",\n water_damage: \"architecture building droplet estate house leak plumbing real residence residential shelter\",\n waterfall_chart: \"analytics bar data diagram infographic measure metrics statistics tracking\",\n waves: \"beach lake ocean pool river sea swim water\",\n wb_auto: \"A W alphabet automatic balance character editing font image letter photography symbol text type white wp\",\n wb_cloudy: \"balance editing white wp\",\n wb_incandescent: \"balance bright editing lamp lightbulb lighting settings white wp\",\n wb_iridescent: \"balance bright editing lighting settings white wp\",\n wb_shade: \"balance house lighting white\",\n wb_sunny: \"balance bright lighting weather white\",\n wc: \"bathroom closet female gender man person restroom toilet unisex wash water women\",\n web: \"blocks browser internet page screen website www\",\n web_asset: \"-website application browser design desktop download image interface internet layout screen ui ux video window www\",\n web_asset_off: \"browser disabled enabled internet on screen slash webpage website windows www\",\n webhook: \"api developer development enterprise software\",\n weekend: \"chair couch furniture home living lounge relax room seat\",\n west: \"arrow directional left maps navigation\",\n whatshot: \"arrow circle direction fire frames round trending\",\n wheelchair_pickup: \"accessibility accessible body handicap help human person\",\n where_to_vote: \"approve ballot check complete destination direction done election location maps mark ok pin place poll select stop tick validate verified yes\",\n widgets: \"app blocks box menu setting squares ui\",\n wifi: \"connection data internet network scan service signal wireless\",\n wifi_calling: \"cell connection connectivity contact device hardware mobile signal telephone wireless\",\n wifi_calling_3: \"cellular data internet mobile network phone speed wireless\",\n wifi_channel: \"(scan) [cellular connection data internet mobile] network service signal wireless\",\n wifi_find: \"(scan) [cellular connection data detect discover glass internet look magnifying mobile] network notice search service signal wireless\",\n wifi_lock: \"cellular connection data internet locked mobile network password privacy private protection safety secure security service signal wireless\",\n wifi_off: \"connection data disabled enabled internet network offline scan service signal slash wireless\",\n wifi_password: \"(scan) [cellular connection data internet lock mobile] network secure service signal wireless\",\n wifi_protected_setup: \"around arrows rotate\",\n wifi_tethering: \"cellular connection data internet mobile network phone scan service signal speed wireless\",\n wifi_tethering_off: \"cellular connection data disabled enabled internet mobile network offline phone scan service signal slash speed wireless\",\n window: \"close glass grid home house interior layout outside\",\n wind_power: \"eco energy nest windy\",\n wine_bar: \"alcohol cocktail cup drink glass liquor\",\n work: \"-briefcase baggage business job suitcase\",\n work_history: \"arrow backwards baggage briefcase business clock date job refresh renew reverse rotate schedule suitcase time turn\",\n work_off: \"baggage briefcase business disabled enabled job on slash suitcase\",\n work_outline: \"baggage briefcase business job suitcase\",\n workspace_premium: \"certification degree ecommerce guarantee medal permit ribbon verification\",\n workspaces: \"circles collaboration dot filled group team\",\n wrap_text: \"arrow doc editing editor spreadsheet type write writing\",\n wrong_location: \"cancel close destination direction exit maps no pin place quit remove stop\",\n wysiwyg: \"composer mode screen software system text view visibility website window\",\n yard: \"backyard flower garden home house nature pettle plants\",\n you_tube: \"brand logo social video\",\n youtube_searched_for: \"arrow backwards find glass history inprogress loading look magnifying refresh renew restore reverse rotate see yt\",\n zoom_in: \"bigger find glass grow look magnifier magnifying plus scale search see size\",\n zoom_in_map: \"arrows destination location maps move place stop\",\n zoom_out: \"find glass look magnifier magnifying minus negative scale search see size smaller\",\n zoom_out_map: \"arrows destination location maps move place stop\"\n};\n","import { icon_synonyms } from \"./icon_synonyms\";\nimport { iconKeys } from \"@firecms/ui\";\n\n// @ts-ignore\nimport * as JsSearch from \"js-search\";\n\nexport const iconsSearch = new JsSearch.Search(\"key\");\niconsSearch.addIndex(\"synonyms\");\n\niconsSearch.addDocuments(iconKeys\n .map((importName) => {\n return {\n key: importName,\n // @ts-ignore\n synonyms: icon_synonyms[importName] ?? [],\n }\n }));\n","export function hashString(str: string): number {\n let hash = 0;\n let i;\n let chr;\n for (i = 0; i < str.length; i++) {\n chr = str.charCodeAt(i);\n hash = ((hash << 5) - hash) + chr;\n hash |= 0; // Convert to 32bit integer\n }\n return Math.abs(hash);\n}\n","import React from \"react\";\nimport { hashString } from \"./hash\";\nimport { coolIconKeys, Icon, iconKeys } from \"@firecms/ui\";\nimport { slugify } from \"./strings\";\nimport equal from \"react-fast-compare\"\n\nexport function getIcon(iconKey?: string, className?: string): React.ReactElement | undefined {\n if (!iconKey) return undefined;\n iconKey = slugify(iconKey);\n if (!(iconKey in iconKeysMap)) {\n return undefined;\n }\n return iconKey in iconKeysMap ? <Icon iconKey={iconKey} size={\"medium\"} className={className}/> : undefined;\n}\n\nexport type IconViewProps = {\n path: string;\n name: string;\n singularName?: string;\n group?: string;\n icon?: string;\n}\n\nexport const IconForView = React.memo(\n function IconForView({ collectionOrView, className }: { collectionOrView?: IconViewProps, className?: string }): React.ReactElement {\n if (!collectionOrView) return <></>;\n const icon = getIcon(collectionOrView.icon, className);\n if (collectionOrView?.icon && icon)\n return icon;\n\n let slugName = slugify((\"singularName\" in collectionOrView ? collectionOrView.singularName : undefined) ?? collectionOrView.name);\n\n let key: string | undefined;\n if (slugName in iconKeysMap)\n key = slugName;\n\n if (!key) {\n slugName = slugify(collectionOrView.path);\n if (slugName in iconKeysMap)\n key = slugName;\n }\n\n const iconsCount = coolIconKeys.length;\n\n if (!key)\n key = coolIconKeys[hashString(collectionOrView.path) % iconsCount];\n\n return <Icon iconKey={key} size={\"medium\"} className={className}/>;\n }, (prevProps, nextProps) => {\n return equal(prevProps.collectionOrView?.icon, nextProps.collectionOrView?.icon);\n });\n\nconst iconKeysMap: Record<string, string> = iconKeys.reduce((acc: Record<string, string>, key) => {\n acc[key] = key;\n return acc;\n}, {});\n","/**\n * Returns the plural of an English word.\n *\n * @export\n * @param {string} word\n * @param {number} [amount]\n * @returns {string}\n */\nexport function plural(word: string, amount?: number): string {\n if (amount !== undefined && amount === 1) {\n return word\n }\n const plurals: { [key: string]: string } = {\n \"(quiz)$\": \"$1zes\",\n \"^(ox)$\": \"$1en\",\n \"([m|l])ouse$\": \"$1ice\",\n \"(matr|vert|ind)ix|ex$\": \"$1ices\",\n \"(x|ch|ss|sh)$\": \"$1es\",\n \"([^aeiouy]|qu)y$\": \"$1ies\",\n \"(hive)$\": \"$1s\",\n \"(?:([^f])fe|([lr])f)$\": \"$1$2ves\",\n \"(shea|lea|loa|thie)f$\": \"$1ves\",\n sis$: \"ses\",\n \"([ti])um$\": \"$1a\",\n \"(tomat|potat|ech|her|vet)o$\": \"$1oes\",\n \"(bu)s$\": \"$1ses\",\n \"(alias)$\": \"$1es\",\n \"(octop)us$\": \"$1i\",\n \"(ax|test)is$\": \"$1es\",\n \"(us)$\": \"$1es\",\n \"([^s]+)$\": \"$1s\"\n }\n const irregular: { [key: string]: string } = {\n move: \"moves\",\n foot: \"feet\",\n goose: \"geese\",\n sex: \"sexes\",\n child: \"children\",\n man: \"men\",\n tooth: \"teeth\",\n person: \"people\"\n }\n const uncountable: string[] = [\n \"sheep\",\n \"fish\",\n \"deer\",\n \"moose\",\n \"series\",\n \"species\",\n \"money\",\n \"rice\",\n \"information\",\n \"equipment\",\n \"bison\",\n \"cod\",\n \"offspring\",\n \"pike\",\n \"salmon\",\n \"shrimp\",\n \"swine\",\n \"trout\",\n \"aircraft\",\n \"hovercraft\",\n \"spacecraft\",\n \"sugar\",\n \"tuna\",\n \"you\",\n \"wood\"\n ]\n // save some time in the case that singular and plural are the same\n if (uncountable.indexOf(word.toLowerCase()) >= 0) {\n return word;\n }\n // check for irregular forms\n for (const w in irregular) {\n const pattern = new RegExp(`${w}$`, \"i\")\n const replace = irregular[w]\n if (pattern.test(word)) {\n return word.replace(pattern, replace);\n }\n }\n // check for matches using regular expressions\n for (const reg in plurals) {\n const pattern = new RegExp(reg, \"i\")\n if (pattern.test(word)) {\n return word.replace(pattern, plurals[reg])\n }\n }\n return word;\n}\n\n/**\n * Returns the singular of an English word.\n *\n * @export\n * @param {string} word\n * @param {number} [amount]\n * @returns {string}\n */\nexport function singular(word: string, amount?: number): string {\n if (amount !== undefined && amount !== 1) {\n return word;\n }\n const singulars: { [key: string]: string } = {\n \"(quiz)zes$\": \"$1\",\n \"(matr)ices$\": \"$1ix\",\n \"(vert|ind)ices$\": \"$1ex\",\n \"^(ox)en$\": \"$1\",\n \"(alias)es$\": \"$1\",\n \"(octop|vir)i$\": \"$1us\",\n \"(cris|ax|test)es$\": \"$1is\",\n \"(shoe)s$\": \"$1\",\n \"(o)es$\": \"$1\",\n \"(bus)es$\": \"$1\",\n \"([m|l])ice$\": \"$1ouse\",\n \"(x|ch|ss|sh)es$\": \"$1\",\n \"(m)ovies$\": \"$1ovie\",\n \"(s)eries$\": \"$1eries\",\n \"([^aeiouy]|qu)ies$\": \"$1y\",\n \"([lr])ves$\": \"$1f\",\n \"(tive)s$\": \"$1\",\n \"(hive)s$\": \"$1\",\n \"(li|wi|kni)ves$\": \"$1fe\",\n \"(shea|loa|lea|thie)ves$\": \"$1f\",\n \"(^analy)ses$\": \"$1sis\",\n \"((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$\": \"$1$2sis\",\n \"([ti])a$\": \"$1um\",\n \"(n)ews$\": \"$1ews\",\n \"(h|bl)ouses$\": \"$1ouse\",\n \"(corpse)s$\": \"$1\",\n \"(us)es$\": \"$1\",\n s$: \"\"\n }\n const irregular: { [key: string]: string } = {\n move: \"moves\",\n foot: \"feet\",\n goose: \"geese\",\n sex: \"sexes\",\n child: \"children\",\n man: \"men\",\n tooth: \"teeth\",\n person: \"people\"\n }\n const uncountable: string[] = [\n \"sheep\",\n \"fish\",\n \"deer\",\n \"moose\",\n \"series\",\n \"species\",\n \"money\",\n \"rice\",\n \"information\",\n \"equipment\",\n \"bison\",\n \"cod\",\n \"offspring\",\n \"pike\",\n \"salmon\",\n \"shrimp\",\n \"swine\",\n \"trout\",\n \"aircraft\",\n \"hovercraft\",\n \"spacecraft\",\n \"sugar\",\n \"tuna\",\n \"you\",\n \"wood\"\n ]\n // save some time in the case that singular and plural are the same\n if (uncountable.indexOf(word.toLowerCase()) >= 0) {\n return word;\n }\n // check for irregular forms\n for (const w in irregular) {\n const pattern = new RegExp(`${irregular[w]}$`, \"i\");\n if (pattern.test(word)) {\n return word.replace(pattern, w);\n }\n }\n // check for matches using regular expressions\n for (const reg in singulars) {\n const pattern = new RegExp(reg, \"i\");\n if (pattern.test(word)) {\n return word.replace(pattern, singulars[reg]);\n }\n }\n return word;\n}\n","import { EntityCollection, PropertyConfig, ResolvedEntityCollection } from \"../types\";\nimport { isReferenceProperty } from \"./property_utils\";\nimport { isPropertyBuilder } from \"./entities\";\nimport { getFieldConfig } from \"../core\";\n\nexport function getEntityPreviewKeys(targetCollection: EntityCollection<any>,\n fields: Record<string, PropertyConfig>,\n previewProperties?: string[],\n limit = 3) {\n const allProperties = Object.keys(targetCollection.properties);\n let listProperties = previewProperties?.filter(p => allProperties.includes(p as string));\n if (listProperties && listProperties.length > 0) {\n return listProperties;\n } else {\n listProperties = allProperties;\n return listProperties.filter(key => {\n const propertyOrBuilder = targetCollection.properties[key];\n return propertyOrBuilder && !isPropertyBuilder(propertyOrBuilder) && !isReferenceProperty(propertyOrBuilder, fields);\n }).slice(0, limit);\n }\n}\n\nexport function getEntityTitlePropertyKey<M extends Record<string, any>>(collection: EntityCollection<M>, propertyConfigs: Record<string, PropertyConfig<any>>): string | undefined {\n if (collection.titleProperty) {\n return collection.titleProperty as string;\n }\n // find first text field property\n for (const key in collection.properties) {\n const property = collection.properties[key];\n if (!isPropertyBuilder(property)) {\n const field = getFieldConfig(property, propertyConfigs);\n if (field?.key === \"text_field\") {\n return key;\n }\n }\n }\n return undefined;\n}\n\nexport function getEntityImagePreviewPropertyKey<M extends object>(collection: ResolvedEntityCollection<M>): string | undefined {\n\n // find first text field property\n for (const key in collection.properties) {\n const property = collection.properties[key];\n if (property.dataType === \"string\" && property.storage?.acceptedFiles?.includes(\"image/*\")) {\n return key;\n }\n\n }\n return undefined;\n}\n","export function flattenObject(obj: any, parentKey = \"\") {\n if (!obj) return obj;\n return Object.keys(obj).reduce((flatObj, key) => {\n const newKey = parentKey ? `${parentKey}.${key}` : key;\n\n if (typeof obj[key] === \"object\" && obj[key] !== null) {\n if (Array.isArray(obj[key])) {\n obj[key].forEach((item: any, index: number) => {\n Object.assign(flatObj, flattenObject(item, `${newKey}[${index}]`));\n });\n } else {\n Object.assign(flatObj, flattenObject(obj[key], newKey));\n }\n } else {\n flatObj[newKey] = obj[key];\n }\n\n return flatObj;\n }, {} as { [key: string]: any });\n}\n\n\n// map from nested property key like \"a.b.c\" to the maximum array count found in a list of objects for that array\nexport type ArrayValuesCount = Record<string, number>;\n\nexport function getArrayValuesCount(array: any[]): ArrayValuesCount {\n return array.reduce((acc: ArrayValuesCount, obj: any) => {\n Object.entries(obj).forEach(([key, value]) => {\n // proceed only if value is an array\n if (Array.isArray(value)) {\n acc[key] = Math.max(acc[key] || 0, value.length);\n }\n\n // handle nested object\n if (typeof value === \"object\" && value !== null) {\n const nested = getArrayValuesCount([value]);\n Object.entries(nested).forEach(([nestedKey, nestedCount]) => {\n const compoundKey = `${key}.${nestedKey}`;\n acc[compoundKey] = Math.max(acc[compoundKey] || 0, nestedCount);\n });\n }\n });\n return acc;\n }, {});\n}\n","import { Properties, PropertiesOrBuilders } from \"../types\";\nimport { isPropertyBuilder } from \"./entities\";\n\nexport function makePropertiesEditable(properties: Properties) {\n Object.keys(properties).forEach((key) => {\n const property = properties[key];\n property.editable = true;\n if (property.dataType === \"map\" && property.properties) {\n makePropertiesEditable(property.properties as Properties);\n }\n });\n return properties;\n}\n\nexport function makePropertiesNonEditable(properties: PropertiesOrBuilders): PropertiesOrBuilders {\n return Object.entries(properties).reduce((acc, [key, property]) => {\n if (!isPropertyBuilder(property) && property.dataType === \"map\" && property.properties) {\n const updated = { ...property, properties: makePropertiesNonEditable(property.properties as PropertiesOrBuilders) };\n acc[key] = updated;\n }\n if (isPropertyBuilder(property)) {\n acc[key] = property;\n } else {\n acc[key] = { ...property, editable: false };\n }\n return acc;\n }, {} as PropertiesOrBuilders);\n\n}\n","import {\n EntityCollection,\n MapProperty,\n ModifyCollectionProps,\n PropertiesOrBuilders,\n Property,\n PropertyOrBuilder\n} from \"../types\";\nimport { mergeDeep } from \"./objects\";\nimport { sortProperties } from \"./collections\";\nimport { isPropertyBuilder } from \"./entities\";\n\nfunction applyModifyFunction(modifyCollection: ((props: ModifyCollectionProps) => (EntityCollection | void)) | undefined,\n collection: EntityCollection,\n parentPaths: string[]) {\n if (modifyCollection) {\n const modified = modifyCollection({\n collection,\n parentPaths\n });\n const resCollection = modified ?? collection;\n if (resCollection.subcollections) {\n resCollection.subcollections = resCollection.subcollections.map((subcollection) => {\n return applyModifyFunction(modifyCollection, subcollection, [...parentPaths, collection.path]);\n });\n }\n return resCollection;\n } else {\n return collection;\n }\n}\n\n/**\n *\n */\nexport function joinCollectionLists(targetCollections: EntityCollection[],\n sourceCollections: EntityCollection[] | undefined,\n parentPaths: string[] = [],\n modifyCollection?: (props: ModifyCollectionProps) => EntityCollection | void): EntityCollection[] {\n\n // merge collections that are in both lists\n const updatedCollections = (sourceCollections ?? [])\n .map((sourceCol) => {\n const targetCol = targetCollections?.find((collection) => {\n return collection.id === sourceCol.id;\n // return collection.path === codedCollection.path || collection.id && codedCollection.id;\n });\n if (!targetCol) {\n return applyModifyFunction(modifyCollection, sourceCol, parentPaths);\n } else {\n return mergeCollection(targetCol, sourceCol, parentPaths, modifyCollection);\n }\n });\n\n const sourceCollectionIds = updatedCollections.map(c => c.id);\n // fetched collections that are not in the source collections\n const resultStoredCollections = targetCollections\n .filter((col) => {\n return !sourceCollectionIds.includes(col.id);\n })\n .map((col) => {\n if (modifyCollection) {\n return applyModifyFunction(modifyCollection, col, parentPaths);\n } else {\n return col;\n }\n });\n\n return [...updatedCollections, ...resultStoredCollections];\n}\n\n/**\n *\n */\nexport function mergeCollection(target: EntityCollection,\n source: EntityCollection,\n parentPaths: string[] = [],\n modifyCollection?: (props: ModifyCollectionProps) => EntityCollection | void\n): EntityCollection {\n\n const subcollectionsMerged = joinCollectionLists(\n target?.subcollections ?? [],\n source?.subcollections ?? [],\n [...parentPaths, target.path],\n modifyCollection\n );\n\n const propertiesMerged: PropertiesOrBuilders = { ...target.properties } as PropertiesOrBuilders;\n Object.keys(source.properties).forEach((key) => {\n const property = target.properties[key] as Property;\n if (property)\n propertiesMerged[key] = mergePropertyOrBuilder(property, source.properties[key] as PropertyOrBuilder);\n else\n propertiesMerged[key] = source.properties[key] as PropertyOrBuilder;\n });\n\n const mergedCollection = mergeDeep(target, source);\n const targetPropertiesOrder = getCollectionKeys(target);\n const sourcePropertiesOrder = getCollectionKeys(source);\n const mergedPropertiesOrder = [...new Set([...sourcePropertiesOrder, ...targetPropertiesOrder])];\n const mergedEntityViews = [...new Set([...(target.entityViews ?? []), ...(source.entityViews ?? [])])];\n\n let resultCollection: EntityCollection = {\n ...mergedCollection,\n subcollections: subcollectionsMerged,\n properties: sortProperties(propertiesMerged, mergedPropertiesOrder),\n propertiesOrder: mergedPropertiesOrder,\n entityViews: mergedEntityViews\n };\n if (modifyCollection) {\n const modifiedCollection = modifyCollection({\n collection: resultCollection,\n parentPaths\n });\n if (modifiedCollection)\n resultCollection = modifiedCollection;\n }\n return resultCollection\n}\n\nfunction mergePropertyOrBuilder(target: PropertyOrBuilder, source: PropertyOrBuilder): PropertyOrBuilder {\n if (isPropertyBuilder(source)) {\n return source;\n } else if (isPropertyBuilder(target)) {\n return target;\n } else {\n const mergedProperty = mergeDeep(target, source);\n const targetEditable = Boolean(target.editable);\n const sourceEditable = Boolean(source.editable);\n if (source.dataType === \"map\" && source.properties) {\n const targetProperties = (\"properties\" in target ? target.properties : {}) as PropertiesOrBuilders;\n const sourceProperties = (\"properties\" in source ? source.properties : {}) as PropertiesOrBuilders;\n const targetPropertiesOrder = \"propertiesOrder\" in target && target.propertiesOrder ? target.propertiesOrder : Object.keys(targetProperties);\n const sourcePropertiesOrder = \"propertiesOrder\" in source && source.propertiesOrder ? source.propertiesOrder : (\"properties\" in source ? Object.keys(source.properties) : []);\n const mergedPropertiesOrder = [...new Set([...targetPropertiesOrder, ...sourcePropertiesOrder])];\n const mergedProperties: PropertiesOrBuilders = { ...targetProperties } as PropertiesOrBuilders;\n Object.keys(source.properties).forEach((key) => {\n const property = targetProperties[key] as Property;\n if (property)\n mergedProperties[key] = mergePropertyOrBuilder(property, sourceProperties[key] as PropertyOrBuilder);\n });\n return {\n ...mergedProperty,\n editable: targetEditable && sourceEditable,\n properties: mergedProperties,\n propertiesOrder: mergedPropertiesOrder\n } as MapProperty;\n }\n return {\n ...mergedProperty,\n editable: targetEditable && sourceEditable\n };\n }\n}\n\nfunction getCollectionKeys(collection: EntityCollection) {\n if (collection.propertiesOrder && collection.propertiesOrder.length > 0) {\n const propertiesOrder = collection.propertiesOrder;\n if (collection.additionalFields) {\n collection.additionalFields.forEach((field) => {\n if (!propertiesOrder.includes(field.key)) {\n propertiesOrder.push(field.key);\n }\n });\n }\n return propertiesOrder;\n }\n return [\n ...Object.keys(collection.properties),\n ...(collection.additionalFields ?? [])?.map(f => f.key)\n ];\n}\n","import {\n AdditionalFieldDelegate,\n ArrayProperty,\n BooleanProperty,\n CMSType,\n DateProperty,\n EntityCallbacks,\n EntityCollection,\n EnumValueConfig,\n EnumValues,\n GeopointProperty,\n MapProperty,\n NumberProperty,\n PropertiesOrBuilders,\n PropertyBuilder,\n PropertyConfig,\n PropertyOrBuilder,\n ReferenceProperty,\n StringProperty,\n User\n} from \"../types\";\n\n/**\n * Identity function we use to defeat the type system of Typescript and build\n * collection views with all its properties\n * @param collection\n * @group Builder\n */\nexport function buildCollection<M extends Record<string, any> = any,\n UserType extends User = User>(\n collection: EntityCollection<M, UserType>\n): EntityCollection<M, UserType> {\n return collection;\n}\n\n/**\n * Identity function we use to defeat the type system of Typescript and preserve\n * the property keys.\n * @param property\n * @group Builder\n */\nexport function buildProperty<T extends CMSType = CMSType, P extends PropertyOrBuilder<T> = PropertyOrBuilder<T>, M extends Record<string, any> = Record<string, any>>(\n property: P\n):\n P extends StringProperty ? StringProperty :\n P extends NumberProperty ? NumberProperty :\n P extends BooleanProperty ? BooleanProperty :\n P extends DateProperty ? DateProperty :\n P extends GeopointProperty ? GeopointProperty :\n P extends ReferenceProperty ? ReferenceProperty :\n P extends ArrayProperty ? ArrayProperty :\n P extends MapProperty ? MapProperty :\n P extends PropertyBuilder<T, M> ? PropertyBuilder<T, M> : never {\n return property as any;\n}\n\n/**\n * Identity function we use to defeat the type system of Typescript and preserve\n * the properties keys.\n * @param properties\n * @group Builder\n */\nexport function buildProperties<M extends Record<string, any>>(\n properties: PropertiesOrBuilders<M>\n): PropertiesOrBuilders<M> {\n return properties;\n}\n\n/**\n * Identity function we use to defeat the type system of Typescript and preserve\n * the properties keys.\n * @param propertiesOrBuilder\n * @group Builder\n */\nexport function buildPropertiesOrBuilder<M extends Record<string, any>>(\n propertiesOrBuilder: PropertiesOrBuilders<M>\n): PropertiesOrBuilders<M> {\n return propertiesOrBuilder;\n}\n\n/**\n * Identity function we use to defeat the type system of Typescript and preserve\n * the properties keys.\n * @param enumValues\n * @group Builder\n */\nexport function buildEnumValues(\n enumValues: EnumValues\n): EnumValues {\n return enumValues;\n}\n\n/**\n * Identity function we use to defeat the type system of Typescript and preserve\n * the properties keys.\n * @param enumValueConfig\n * @group Builder\n */\nexport function buildEnumValueConfig(\n enumValueConfig: EnumValueConfig\n): EnumValueConfig {\n return enumValueConfig;\n}\n\n/**\n * Identity function we use to defeat the type system of Typescript and preserve\n * the properties keys.\n * @param callbacks\n * @group Builder\n */\nexport function buildEntityCallbacks<M extends Record<string, any> = any>(\n callbacks: EntityCallbacks<M>\n): EntityCallbacks<M> {\n return callbacks;\n}\n\n/**\n * Identity function we use to defeat the type system of Typescript and build\n * additional field delegates views with all its properties\n * @param additionalFieldDelegate\n * @group Builder\n */\nexport function buildAdditionalFieldDelegate<M extends Record<string, any>, UserType extends User = User>(\n additionalFieldDelegate: AdditionalFieldDelegate<M, UserType>\n): AdditionalFieldDelegate<M, UserType> {\n return additionalFieldDelegate;\n}\n\n/**\n * Identity function we use to defeat the type system of Typescript and build\n * additional field delegates views with all its properties\n * @param propertyConfig\n * @group Builder\n */\nexport function buildFieldConfig<T extends CMSType = CMSType>(\n propertyConfig: PropertyConfig<T>\n): PropertyConfig<T> {\n return propertyConfig;\n}\n","import { useEffect, useRef } from \"react\";\n\nfunction printChanged(props: any, prev: any, path = \"\", depth = 0, maxDepth: number) {\n if (depth > maxDepth) {\n return;\n }\n if (props && prev && typeof props === \"object\" && typeof prev === \"object\") {\n Object.keys(props).forEach((key) => {\n printChanged(props[key], prev[key], path + \".\" + key, depth + 1, maxDepth);\n });\n } else if (props !== prev) {\n console.log(\"Changed props:\", path);\n }\n\n}\n\nexport function useTraceUpdate(props: any, maxDepth = 3) {\n const prev = useRef(props);\n useEffect(() => {\n printChanged(props, prev.current, \"\", 0, maxDepth);\n prev.current = props;\n });\n}\n","export const CONTAINER_FULL_WIDTH = \"100vw\";\n\nexport const ADDITIONAL_TAB_WIDTH = \"55vw\";\n\nexport const FORM_CONTAINER_WIDTH = \"768px\";\n","import React from \"react\";\nimport { DataSource } from \"../types\";\n\nexport const DataSourceContext = React.createContext<DataSource>({} as DataSource);\n","import { useContext, useMemo } from \"react\";\nimport { DataSource, EntityCollection } from \"../../types\";\nimport { DataSourceContext } from \"../../contexts/DataSourceContext\";\n\n/**\n * Use this hook to get the datasource being used\n * @group Hooks and utilities\n */\nexport const useDataSource = (collection?: EntityCollection): DataSource => {\n const defaultDataSource = useContext(DataSourceContext);\n if (collection?.overrides?.dataSource)\n return collection?.overrides.dataSource;\n return defaultDataSource;\n};\n","import React from \"react\";\nimport { NavigationController } from \"../types\";\n\nexport const NavigationContext = React.createContext<NavigationController>({} as NavigationController);\n","import { useContext } from \"react\";\nimport { NavigationController } from \"../types\";\nimport { NavigationContext } from \"../contexts/NavigationContext\";\n\n/**\n * Use this hook to get the navigation of the app.\n * This controller provides the resolved collections for the CMS as well\n * as utility methods.\n *\n * @group Hooks and utilities\n */\nexport const useNavigationController = (): NavigationController => useContext(NavigationContext);\n","import { AuthController, User } from \"../types\";\nimport { useContext } from \"react\";\nimport { AuthControllerContext } from \"../contexts/AuthControllerContext\";\n\n/**\n * Hook to retrieve the AuthContext.\n *\n * Consider that in order to use this hook you need to have a parent\n * `FireCMS`\n *\n * @see AuthController\n * @group Hooks and utilities\n */\nexport const useAuthController = <UserType extends User = User, AuthControllerType extends AuthController<UserType> = AuthController<UserType>>(): AuthControllerType => useContext(AuthControllerContext) as AuthControllerType;\n","import React from \"react\";\nimport { SideDialogsController } from \"../types\";\n\nexport const SideDialogsControllerContext = React.createContext<SideDialogsController>({} as SideDialogsController);\n","import { SideDialogsController } from \"../types\";\nimport { SideDialogsControllerContext } from \"../contexts/SideDialogsControllerContext\";\nimport { useContext } from \"react\";\n\n/**\n * Hook to retrieve the side dialogs' controller.\n *\n * This hook allows you to open and close side dialogs. This is the mechanism\n * used when open a side entity dialog, or when selecting a reference.\n *\n * If you want to open a side entity dialog, you can use the {@link useSideEntityController}\n * hook.\n *\n * If you want to select a reference, you can use the {@link useReferenceDialog}\n *\n * Consider that in order to use this hook you need to have a parent\n * `FireCMS`\n *\n * @group Hooks and utilities\n */\nexport const useSideDialogsController = (): SideDialogsController => useContext(SideDialogsControllerContext);\n","import React from \"react\";\nimport { SideEntityController } from \"../types\";\n\nexport const SideEntityControllerContext = React.createContext<SideEntityController>({} as SideEntityController);\n","import { SideEntityController } from \"../types\";\nimport { useContext } from \"react\";\nimport { SideEntityControllerContext } from \"../contexts/SideEntityControllerContext\";\n\n/**\n * Use this hook to retrieve an entity controller that allows you to open\n * a side dialog to edit an entity.\n *\n * Consider that in order to use this hook you need to have a parent\n * `FireCMS`\n *\n * @see SideEntityController\n * @group Hooks and utilities\n */\nexport const useSideEntityController = (): SideEntityController => useContext(SideEntityControllerContext);\n","import React from \"react\";\nimport { StorageSource } from \"../types\";\n\nexport const StorageSourceContext = React.createContext<StorageSource>({} as StorageSource);\n","import { EntityCollection, StorageSource } from \"../types\";\nimport { StorageSourceContext } from \"../contexts/StorageSourceContext\";\nimport { useContext } from \"react\";\n\n/**\n * Use this hook to get the storage source being used\n * @group Hooks and utilities\n */\nexport const useStorageSource = (collection?: EntityCollection): StorageSource => {\n const defaultStorageSource = useContext(StorageSourceContext);\n if (collection?.overrides?.storageSource)\n return collection.overrides.storageSource;\n return defaultStorageSource;\n};\n","import React, { useCallback, useMemo } from \"react\";\nimport { useSnackbar } from \"notistack\";\n\n/**\n * Possible snackbar types\n * @group Hooks and utilities\n */\nexport type SnackbarMessageType = \"success\" | \"info\" | \"warning\" | \"error\";\n\n/**\n * Controller to display snackbars\n * @group Hooks and utilities\n */\nexport interface SnackbarController {\n\n /**\n * Close the currently open snackbar\n */\n close: () => void;\n\n /**\n * Display a new snackbar. You need to specify the type and message.\n * You can optionally specify a title\n */\n open: (props: {\n type: SnackbarMessageType;\n message: React.ReactNode;\n autoHideDuration?: number;\n }) => void;\n\n}\n\n/**\n * Hook to retrieve the SnackbarContext.\n *\n * Consider that in order to use this hook you need to have a parent\n * `FireCMS`\n *\n * @see SnackbarController\n * @group Hooks and utilities\n */\nexport const useSnackbarController = () => {\n\n const {\n enqueueSnackbar,\n closeSnackbar\n } = useSnackbar();\n\n const open = useCallback((props: {\n type: SnackbarMessageType;\n message: React.ReactNode;\n autoHideDuration?: number;\n }) => {\n const {\n type,\n message,\n autoHideDuration\n } = props;\n enqueueSnackbar({\n message,\n variant: type,\n autoHideDuration\n })\n }, []);\n\n const close = useCallback(() => {\n closeSnackbar();\n }, []);\n\n return useMemo(() => ({\n open,\n close\n }), [open, close]);\n\n};\n","import React from \"react\";\nimport { UserConfigurationPersistence } from \"../types\";\n\nexport const UserConfigurationPersistenceContext = React.createContext<UserConfigurationPersistence | undefined>(undefined);\n","import { UserConfigurationPersistence } from \"../types\";\nimport { useContext } from \"react\";\nimport { UserConfigurationPersistenceContext } from \"../contexts/UserConfigurationPersistenceContext\";\n\n/**\n * Use this controller to access the configuration that is stored externally,\n * and not defined in code\n *\n * @group Hooks and utilities\n */\nexport const useUserConfigurationPersistence = (): UserConfigurationPersistence | undefined => useContext(UserConfigurationPersistenceContext);\n","import React, { PropsWithChildren, useCallback, useRef, useState } from \"react\";\nimport { DialogControllerEntryProps, DialogsController } from \"../types/dialogs_controller\";\n\nexport const DialogsControllerContext = React.createContext<DialogsController>({} as DialogsController);\n\nexport const DialogsProvider: React.FC<PropsWithChildren<{}>> = ({ children }) => {\n\n const [dialogEntries, setDialogEntries] = useState<DialogControllerEntryProps[]>([]);\n const dialogEntriesRef = useRef<DialogControllerEntryProps[]>(dialogEntries);\n\n const updateDialogEntries = (newPanels: DialogControllerEntryProps[]) => {\n dialogEntriesRef.current = newPanels;\n setDialogEntries(newPanels);\n };\n\n const close = useCallback(() => {\n\n if (dialogEntries.length === 0)\n return;\n\n const updatedPanels = [...dialogEntries.slice(0, -1)];\n updateDialogEntries(updatedPanels);\n\n }, [dialogEntries]);\n\n const open = useCallback((dialogEntry: DialogControllerEntryProps) => {\n\n const updatedPanels = [...dialogEntries, dialogEntry];\n updateDialogEntries(updatedPanels);\n\n return {\n closeDialog: () => {\n const updatedPanels = dialogEntriesRef.current.filter(e => e.key !== dialogEntry.key);\n updateDialogEntries(updatedPanels);\n }\n }\n }, [dialogEntries]);\n\n return (\n <DialogsControllerContext.Provider value={{\n open,\n close\n }}>\n {children}\n {dialogEntries.map((entry, i) => <entry.Component\n key={`dialog_${i}`}\n open={true}\n closeDialog={close}\n />)}\n </DialogsControllerContext.Provider>\n );\n};\n","import { useContext } from \"react\";\nimport { DialogsController } from \"../types/dialogs_controller\";\nimport { DialogsControllerContext } from \"../contexts/DialogsProvider\";\n\n/**\n * Use this hook to open a dialog imperatively.\n * Alternatively, you can use dialogs declaratively using the `Dialog` component.\n *\n * Consider that in order to use this hook you need to have a parent\n * `FireCMS`\n *\n * @group Hooks and utilities\n */\nexport const useDialogsController = (): DialogsController => useContext(DialogsControllerContext);\n","import React from \"react\";\nimport { CustomizationController } from \"../types/customization_controller\";\n\nexport const CustomizationControllerContext = React.createContext<CustomizationController>({} as CustomizationController);\n","import { useContext } from \"react\";\nimport { CustomizationController } from \"../types/customization_controller\";\nimport { CustomizationControllerContext } from \"../contexts/CustomizationControllerContext\";\n\n/**\n * Use this hook to retrieve the customization controller.\n * This hook includes all the customization options that can be used\n * to customize the CMS.\n *\n * You will likely not need to use this hook directly.\n *\n * @group Hooks and utilities\n */\nexport const useCustomizationController = (): CustomizationController => useContext(CustomizationControllerContext);\n","import React from \"react\";\nimport { AnalyticsController } from \"../types\";\n\nexport const AnalyticsContext = React.createContext<AnalyticsController>({} as AnalyticsController);\n","import { useContext } from \"react\";\nimport { AnalyticsController } from \"../types\";\nimport { AnalyticsContext } from \"../contexts/AnalyticsContext\";\n\n/**\n * @group Hooks and utilities\n */\nexport const useAnalyticsController = (): AnalyticsController => useContext(AnalyticsContext);\n","import { AuthController, FireCMSContext, User } from \"../types\";\nimport { useAuthController } from \"./useAuthController\";\nimport { useSideDialogsController } from \"./useSideDialogsController\";\nimport { useNavigationController } from \"./useNavigationController\";\nimport { useSideEntityController } from \"./useSideEntityController\";\nimport { useDataSource } from \"./data/useDataSource\";\nimport { useStorageSource } from \"./useStorageSource\";\nimport { useSnackbarController } from \"./useSnackbarController\";\nimport { useUserConfigurationPersistence } from \"./useUserConfigurationPersistence\";\nimport { useDialogsController } from \"./useDialogsController\";\nimport { useCustomizationController } from \"./useCustomizationController\";\nimport { useAnalyticsController } from \"./useAnalyticsController\";\nimport React, { useEffect } from \"react\";\n\n/**\n * Hook to retrieve the {@link FireCMSContext}.\n *\n * Consider that in order to use this hook you need to have a parent\n * `FireCMS` component.\n *\n * @see FireCMSContext\n * @group Hooks and utilities\n */\nexport const useFireCMSContext = <UserType extends User = User, AuthControllerType extends AuthController<UserType> = AuthController<UserType>>(): FireCMSContext<UserType, AuthControllerType> => {\n\n const authController = useAuthController<UserType, AuthControllerType>();\n const sideDialogsController = useSideDialogsController();\n const sideEntityController = useSideEntityController();\n const navigation = useNavigationController();\n const dataSource = useDataSource();\n const storageSource = useStorageSource();\n const snackbarController = useSnackbarController();\n const userConfigPersistence = useUserConfigurationPersistence();\n const dialogsController = useDialogsController();\n const customizationController = useCustomizationController();\n const analyticsController = useAnalyticsController();\n\n const fireCMSContextRef = React.useRef<FireCMSContext<UserType, AuthControllerType>>({\n authController,\n sideDialogsController,\n sideEntityController,\n navigation,\n dataSource,\n storageSource,\n snackbarController,\n userConfigPersistence,\n dialogsController,\n customizationController,\n analyticsController\n });\n\n useEffect(() => {\n fireCMSContextRef.current = {\n authController,\n sideDialogsController,\n sideEntityController,\n navigation,\n dataSource,\n storageSource,\n snackbarController,\n userConfigPersistence,\n dialogsController,\n customizationController,\n analyticsController\n };\n }, [authController, dialogsController, navigation, sideDialogsController]);\n\n return fireCMSContextRef.current;\n}\n\n// export const useFireCMSContext = <UserType extends User = User, AuthControllerType extends AuthController<UserType> = AuthController<UserType>>(): FireCMSContext<UserType, AuthControllerType> => {\n//\n// const authController = useAuthController<UserType, AuthControllerType>();\n// const sideDialogsController = useSideDialogsController();\n// const sideEntityController = useSideEntityController();\n// const navigation = useNavigationController();\n// const dataSource = useDataSource();\n// const storageSource = useStorageSource();\n// const snackbarController = useSnackbarController();\n// const userConfigPersistence = useUserConfigurationPersistence();\n// const dialogsController = useDialogsController();\n// const customizationController = useCustomizationController();\n// const analyticsController = useAnalyticsController();\n//\n// return {\n// authController,\n// sideDialogsController,\n// sideEntityController,\n// navigation,\n// dataSource,\n// storageSource,\n// snackbarController,\n// userConfigPersistence,\n// dialogsController,\n// customizationController,\n// analyticsController\n// };\n//\n// };\n","import { useEffect, useState } from \"react\";\nimport { Entity, EntityCollection, FilterValues, FireCMSContext, User } from \"../../types\";\nimport { useDataSource } from \"./useDataSource\";\nimport { useNavigationController } from \"../useNavigationController\";\nimport { useFireCMSContext } from \"../useFireCMSContext\";\n\n/**\n * @group Hooks and utilities\n */\nexport interface CollectionFetchProps<M extends Record<string, any>> {\n\n /**\n * Absolute collection path\n */\n path: string;\n\n /**\n * collection of the entity displayed by this collection\n */\n collection: EntityCollection<M>\n\n /**\n * Number of entities to fetch\n */\n itemCount?: number;\n\n /**\n * Filter the fetched data by the property\n */\n filterValues?: FilterValues<Extract<keyof M, string>>;\n\n /**\n * Sort the results by\n */\n sortBy?: [Extract<keyof M, string>, \"asc\" | \"desc\"];\n\n /**\n * Search string\n */\n searchString?: string;\n}\n\n/**\n * @group Hooks and utilities\n */\nexport interface CollectionFetchResult<M extends Record<string, any>> {\n data: Entity<M>[];\n dataLoading: boolean;\n noMoreToLoad: boolean;\n dataLoadingError?: Error;\n}\n\n/**\n * This hook is used to fetch collections using a given collection\n * @param path\n * @param collection\n * @param filterValues\n * @param sortBy\n * @param itemCount\n * @param searchString\n * @group Hooks and utilities\n */\nexport function useCollectionFetch<M extends Record<string, any>, UserType extends User>(\n {\n path: inputPath,\n collection,\n filterValues,\n sortBy,\n itemCount,\n searchString\n }: CollectionFetchProps<M>): CollectionFetchResult<M> {\n\n const dataSource = useDataSource(collection);\n const navigationController = useNavigationController();\n\n const path = navigationController.resolveAliasesFrom(inputPath);\n\n const sortByProperty = sortBy ? sortBy[0] : undefined;\n const currentSort = sortBy ? sortBy[1] : undefined;\n\n const context: FireCMSContext<UserType> = useFireCMSContext();\n\n const [data, setData] = useState<Entity<M>[]>([]);\n\n const [dataLoading, setDataLoading] = useState<boolean>(false);\n const [dataLoadingError, setDataLoadingError] = useState<Error | undefined>();\n const [noMoreToLoad, setNoMoreToLoad] = useState<boolean>(false);\n\n useEffect(() => {\n\n setDataLoading(true);\n\n const onEntitiesUpdate = async (entities: Entity<M>[]) => {\n if (collection.callbacks?.onFetch) {\n try {\n entities = await Promise.all(\n entities.map((entity) =>\n collection.callbacks!.onFetch!({\n collection,\n path,\n entity,\n context\n })));\n } catch (e: any) {\n console.error(e);\n }\n }\n setDataLoading(false);\n setDataLoadingError(undefined);\n setData(entities.map(e => ({\n ...e,\n // values: sanitizeData(e.values, resolvedCollection.properties)\n })));\n setNoMoreToLoad(!itemCount || entities.length < itemCount);\n };\n\n const onError = (error: Error) => {\n console.error(\"ERROR\", error);\n setDataLoading(false);\n setData([]);\n setDataLoadingError(error);\n };\n\n if (dataSource.listenCollection) {\n return dataSource.listenCollection<M>({\n path,\n collection,\n onUpdate: onEntitiesUpdate,\n onError,\n searchString,\n filter: filterValues,\n limit: itemCount,\n startAfter: undefined,\n orderBy: sortByProperty,\n order: currentSort\n });\n } else {\n dataSource.fetchCollection<M>({\n path,\n collection,\n searchString,\n filter: filterValues,\n limit: itemCount,\n startAfter: undefined,\n orderBy: sortByProperty,\n order: currentSort\n })\n .then(onEntitiesUpdate)\n .catch(onError);\n return () => {\n };\n }\n }, [path, itemCount, currentSort, sortByProperty, filterValues, searchString]);\n\n return {\n data,\n dataLoading,\n dataLoadingError,\n noMoreToLoad\n };\n\n}\n","import { useEffect, useState } from \"react\";\nimport { Entity, EntityCollection, FireCMSContext, User } from \"../../types\";\nimport { useDataSource } from \"./useDataSource\";\nimport { useNavigationController } from \"../useNavigationController\";\nimport { useFireCMSContext } from \"../useFireCMSContext\";\n\n/**\n * @group Hooks and utilities\n */\nexport interface EntityFetchProps<M extends Record<string, any>> {\n path: string;\n entityId?: string;\n collection: EntityCollection<M>;\n useCache?: boolean;\n}\n\n/**\n * @group Hooks and utilities\n */\nexport interface EntityFetchResult<M extends Record<string, any>> {\n entity?: Entity<M>,\n dataLoading: boolean,\n dataLoadingError?: Error\n}\n\nconst CACHE: Record<string, Entity<any> | undefined> = {};\n\n/**\n * This hook is used to fetch an entity.\n * It gives real time updates if the datasource supports it.\n * @param path\n * @param collection\n * @param entityId\n * @param useCache\n * @group Hooks and utilities\n */\n\nexport function useEntityFetch<M extends Record<string, any>, UserType extends User>(\n {\n path: inputPath,\n entityId,\n collection,\n useCache = false\n }: EntityFetchProps<M>): EntityFetchResult<M> {\n\n const dataSource = useDataSource(collection);\n const navigationController = useNavigationController();\n\n const path = navigationController.resolveAliasesFrom(inputPath);\n\n const context: FireCMSContext<UserType> = useFireCMSContext();\n\n const [entity, setEntity] = useState<Entity<M> | undefined>();\n const [dataLoading, setDataLoading] = useState<boolean>(true);\n const [dataLoadingError, setDataLoadingError] = useState<Error | undefined>();\n\n useEffect(() => {\n\n setDataLoading(true);\n\n const onEntityUpdate = async (updatedEntity: Entity<M> | undefined) => {\n if (collection.callbacks?.onFetch && updatedEntity) {\n try {\n updatedEntity = await collection.callbacks.onFetch({\n collection,\n path,\n entity: updatedEntity,\n context\n });\n } catch (e: any) {\n console.error(e);\n }\n }\n CACHE[`${path}/${entityId}`] = updatedEntity;\n setEntity(updatedEntity);\n setDataLoading(false);\n setDataLoadingError(undefined);\n };\n\n const onError = (error: Error) => {\n console.error(\"ERROR fetching entity\", error);\n setDataLoading(false);\n setEntity(undefined);\n setDataLoadingError(error);\n };\n\n if (entityId && useCache && CACHE[`${path}/${entityId}`]) {\n setEntity(CACHE[`${path}/${entityId}`]);\n setDataLoading(false);\n setDataLoadingError(undefined);\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n return () => {\n };\n } else if (entityId && path && collection) {\n if (dataSource.listenEntity) {\n return dataSource.listenEntity<M>({\n path,\n entityId,\n collection,\n onUpdate: onEntityUpdate,\n onError\n });\n } else {\n dataSource.fetchEntity<M>({\n path,\n entityId,\n collection\n })\n .then(onEntityUpdate)\n .catch(onError);\n return () => {\n };\n }\n }\n // if no entityId is provided we do nothing\n else {\n onEntityUpdate(undefined);\n return () => {\n };\n }\n }, [entityId, path]);\n\n return {\n entity,\n dataLoading,\n dataLoadingError\n };\n\n}\n","import {\n DataSource,\n Entity,\n EntityCallbacks,\n EntityCollection,\n EntityValues,\n FireCMSContext,\n SaveEntityProps,\n User\n} from \"../../types\";\nimport { useDataSource } from \"./useDataSource\";\nimport { resolveCollection } from \"../../util\";\n\n/**\n * @group Hooks and utilities\n */\nexport type SaveEntityWithCallbacksProps<M extends Record<string, any>> =\n SaveEntityProps<M> &\n {\n callbacks?: EntityCallbacks<M>;\n onSaveSuccess?: (updatedEntity: Entity<M>) => void,\n onSaveFailure?: (e: Error) => void,\n onPreSaveHookError?: (e: Error) => void,\n onSaveSuccessHookError?: (e: Error) => void\n }\n\n/**\n * This function is in charge of saving an entity to the datasource.\n * It will run all the save callbacks specified in the collection.\n * It is also possible to attach callbacks on save success or error, and callback\n * errors.\n *\n * If you just want to save the data without running the `onSaveSuccess`,\n * `onSaveFailure` and `onPreSave` callbacks, you can use the `saveEntity` method\n * in the datasource ({@link useDataSource}).\n *\n * @param collection\n * @param path\n * @param entityId\n * @param callbacks\n * @param values\n * @param previousValues\n * @param status\n * @param dataSource\n * @param context\n * @param onSaveSuccess\n * @param onSaveFailure\n * @param onPreSaveHookError\n * @param onSaveSuccessHookError\n * @see useDataSource\n * @group Hooks and utilities\n */\nexport async function saveEntityWithCallbacks<M extends Record<string, any>, UserType extends User>({\n collection,\n path,\n entityId,\n values,\n previousValues,\n status,\n dataSource,\n context,\n onSaveSuccess,\n onSaveFailure,\n onPreSaveHookError,\n onSaveSuccessHookError\n }: SaveEntityWithCallbacksProps<M> & {\n collection: EntityCollection<M>,\n dataSource: DataSource,\n context: FireCMSContext<UserType>,\n }\n): Promise<void> {\n\n if (status !== \"new\" && !entityId) {\n throw new Error(\"Entity id must be specified when updating an existing entity\");\n }\n let updatedValues: Partial<EntityValues<M>>;\n\n const customizationController = context.customizationController;\n\n const resolvedPath = context.navigation.resolveAliasesFrom(path);\n\n const callbacks = collection.callbacks;\n if (callbacks?.onPreSave) {\n try {\n const resolvedCollection = resolveCollection<M>({\n collection,\n path,\n values: previousValues as EntityValues<M>,\n entityId,\n fields: customizationController.propertyConfigs\n });\n updatedValues = await callbacks.onPreSave({\n collection: resolvedCollection,\n path,\n resolvedPath,\n entityId,\n values,\n previousValues,\n status,\n context\n });\n } catch (e: any) {\n console.error(e);\n if (onPreSaveHookError)\n onPreSaveHookError(e);\n return;\n }\n } else {\n updatedValues = values;\n }\n\n return dataSource.saveEntity({\n collection,\n path: resolvedPath,\n entityId,\n values: updatedValues,\n previousValues,\n status\n }).then((entity) => {\n try {\n if (callbacks?.onSaveSuccess) {\n const resolvedCollection = resolveCollection<M>({\n collection,\n path,\n values: updatedValues as EntityValues<M>,\n entityId,\n fields: customizationController.propertyConfigs\n });\n callbacks.onSaveSuccess({\n collection: resolvedCollection,\n path,\n resolvedPath,\n entityId: entity.id,\n values: updatedValues,\n previousValues,\n status,\n context\n });\n }\n } catch (e: any) {\n if (onSaveSuccessHookError)\n onSaveSuccessHookError(e);\n }\n if (onSaveSuccess)\n onSaveSuccess(entity);\n })\n .catch((e) => {\n if (callbacks?.onSaveFailure) {\n\n const resolvedCollection = resolveCollection<M>({\n collection,\n path,\n values: updatedValues as EntityValues<M>,\n entityId,\n fields: customizationController.propertyConfigs\n });\n callbacks.onSaveFailure({\n collection: resolvedCollection,\n path,\n resolvedPath,\n entityId,\n values: updatedValues,\n previousValues,\n status,\n context\n });\n }\n if (onSaveFailure) onSaveFailure(e);\n });\n}\n","import {\n DataSource,\n DeleteEntityProps,\n Entity,\n EntityCallbacks,\n EntityOnDeleteProps,\n FireCMSContext,\n ResolvedEntityCollection,\n User\n} from \"../../types\";\n\n/**\n * @group Hooks and utilities\n */\nexport type DeleteEntityWithCallbacksProps<M extends Record<string, any>> =\n DeleteEntityProps<M>\n & {\n callbacks?: EntityCallbacks<M>;\n onDeleteSuccess?: (entity: Entity<M>) => void;\n onDeleteFailure?: (entity: Entity<M>, e: Error) => void;\n onPreDeleteHookError?: (entity: Entity<M>, e: Error) => void;\n onDeleteSuccessHookError?: (entity: Entity<M>, e: Error) => void;\n}\n\n/**\n * This function is in charge of deleting an entity in the datasource.\n * It will run all the delete callbacks specified in the collection.\n * It is also possible to attach callbacks on save success or error, and callback\n * errors.\n *\n * If you just want to delete any data without running the `onPreDelete`,\n * and `onDelete` callbacks, you can use the `deleteEntity` method\n * in the datasource ({@link useDataSource}).\n *\n * @param dataSource\n * @param entity\n * @param collection\n * @param callbacks\n * @param onDeleteSuccess\n * @param onDeleteFailure\n * @param onPreDeleteHookError\n * @param onDeleteSuccessHookError\n * @param context\n * @group Hooks and utilities\n */\nexport async function deleteEntityWithCallbacks<M extends Record<string, any>, UserType extends User>({\n dataSource,\n entity,\n collection,\n callbacks,\n onDeleteSuccess,\n onDeleteFailure,\n onPreDeleteHookError,\n onDeleteSuccessHookError,\n context\n }: DeleteEntityWithCallbacksProps<M> & {\n collection: ResolvedEntityCollection<M>,\n dataSource: DataSource,\n context: FireCMSContext<UserType>\n }\n): Promise<boolean> {\n\n console.debug(\"Deleting entity\", entity.path, entity.id);\n\n const entityDeleteProps: EntityOnDeleteProps<M, UserType> = {\n entity,\n collection,\n entityId: entity.id,\n path: entity.path,\n context\n };\n\n if (callbacks?.onPreDelete) {\n try {\n await callbacks.onPreDelete(entityDeleteProps);\n } catch (e: any) {\n console.error(e);\n if (onPreDeleteHookError)\n onPreDeleteHookError(entity, e);\n return false;\n }\n }\n return dataSource.deleteEntity({\n entity\n }).then(() => {\n onDeleteSuccess && onDeleteSuccess(entity);\n try {\n if (callbacks?.onDelete) {\n callbacks.onDelete(entityDeleteProps);\n }\n return true;\n } catch (e: any) {\n if (onDeleteSuccessHookError)\n onDeleteSuccessHookError(entity, e);\n return false;\n }\n }).catch((e) => {\n if (onDeleteFailure) onDeleteFailure(entity, e);\n return false;\n });\n}\n","import { Entity, EntityCollection, EntityCustomView, FireCMSContext, User } from \"../types\";\nimport { useEffect, useState } from \"react\";\nimport { getNavigationEntriesFromPathInternal } from \"../util/navigation_from_path\";\nimport { useFireCMSContext } from \"./useFireCMSContext\";\n\n/**\n * @see resolveNavigationFrom\n * @group Hooks and utilities\n */\nexport type ResolvedNavigationEntry<M extends Record<string, any>> =\n | ResolvedNavigationEntity<M>\n | ResolvedNavigationCollection<M>\n | ResolvedNavigationEntityCustom<M>;\n\n/**\n * @see resolveNavigationFrom\n * @group Hooks and utilities\n */\nexport interface ResolvedNavigationEntity<M extends Record<string, any>> {\n type: \"entity\";\n entity: Entity<M>;\n entityId: string;\n path: string;\n parentCollection: EntityCollection<M>;\n}\n\n/**\n * @see resolveNavigationFrom\n * @group Hooks and utilities\n */\nexport interface ResolvedNavigationCollection<M extends Record<string, any>> {\n type: \"collection\";\n path: string;\n collection: EntityCollection<M>;\n}\n\n/**\n * @see resolveNavigationFrom\n * @group Hooks and utilities\n */\ninterface ResolvedNavigationEntityCustom<M extends Record<string, any>> {\n type: \"custom_view\";\n path: string;\n view: EntityCustomView<M>;\n}\n\n/**\n * Use this function to retrieve an array of navigation entries (resolved\n * collection, entity or entity custom_view) for the given path. You need to pass the app context\n * that you receive in different callbacks, such as the save hooks.\n *\n * It will take into account the `navigation` provided at the `FireCMS` level.\n *\n * @param path\n * @param context\n * @group Hooks and utilities\n */\nexport function resolveNavigationFrom<M extends Record<string, any>, UserType extends User>({\n path,\n context\n }: {\n path: string,\n context: FireCMSContext<UserType>\n}): Promise<ResolvedNavigationEntry<M>[]> {\n\n const dataSource = context.dataSource;\n const navigation = context.navigation;\n\n if (!navigation) {\n throw Error(\"Calling getNavigationFrom, but main navigation has not yet been initialised\");\n }\n\n const navigationEntries = getNavigationEntriesFromPathInternal({\n path,\n collections: navigation.collections ?? []\n });\n\n const resultPromises: Promise<ResolvedNavigationEntry<any>>[] = navigationEntries\n .map((entry) => {\n if (entry.type === \"collection\") {\n return Promise.resolve(entry);\n } else if (entry.type === \"entity\") {\n const collection = navigation.getCollection(entry.path, entry.entityId);\n if (!collection) {\n throw Error(`No collection defined in the navigation for the entity with path ${entry.path}`);\n }\n return dataSource.fetchEntity({\n path: entry.path,\n entityId: entry.entityId,\n collection\n })\n .then((entity) => {\n if (!entity) return undefined;\n return { ...entry, entity };\n });\n } else if (entry.type === \"custom_view\") {\n return Promise.resolve(entry);\n } else {\n throw Error(\"Unmapped element in useEntitiesFromPath\");\n }\n })\n .filter(v => Boolean(v)) as Promise<ResolvedNavigationEntry<any>>[];\n\n return Promise.all(resultPromises);\n}\n\n/**\n * @group Hooks and utilities\n */\nexport interface NavigationFromProps {\n path: string;\n}\n\n/**\n * @group Hooks and utilities\n */\nexport interface NavigationFrom<M extends Record<string, any>> {\n data?: ResolvedNavigationEntry<M>[]\n dataLoading: boolean,\n dataLoadingError?: Error\n}\n\n/**\n * Use this hook to retrieve an array of navigation entries (resolved\n * collection or entity) for the given path. You can use this hook\n * in any React component that lives under `FireCMS`\n * @group Hooks and utilities\n */\nexport function useResolvedNavigationFrom<M extends Record<string, any>, UserType extends User>(\n {\n path\n }: NavigationFromProps): NavigationFrom<M> {\n\n const context: FireCMSContext<UserType> = useFireCMSContext();\n\n const [data, setData] = useState<ResolvedNavigationEntry<M>[] | undefined>();\n const [dataLoading, setDataLoading] = useState<boolean>(false);\n const [dataLoadingError, setDataLoadingError] = useState<Error | undefined>();\n\n useEffect(() => {\n const navigation = context.navigation;\n if (navigation) {\n setDataLoading(true);\n setDataLoadingError(undefined);\n resolveNavigationFrom<M, UserType>({ path, context })\n .then((res) => {\n setData(res);\n })\n .catch((e) => setDataLoadingError(e))\n .finally(() => setDataLoading(false));\n }\n\n }, [path, context]);\n\n if (!context.navigation) {\n return { dataLoading: true };\n }\n\n return { data, dataLoading, dataLoadingError };\n}\n","import { ModeControllerContext } from \"../contexts/ModeController\";\nimport { useContext } from \"react\";\n\n/**\n * Use this controller to change color mode\n * @group Hooks and utilities\n */\nexport interface ModeController {\n mode: \"light\" | \"dark\";\n setMode: (mode: \"light\" | \"dark\") => void;\n toggleMode: () => void;\n}\n\n/**\n * Hook to retrieve the current mode (\"light\" | \"dark\"), and `setMode`\n * or `toggle` functions to change it.\n *\n * Consider that in order to use this hook you need to have a parent\n * `FireCMS`\n *\n * @see ModeController\n * @group Hooks and utilities\n */\nexport const useModeController = () => useContext(ModeControllerContext);\n","// FORKED FROM https://github.com/fayeed/use-clipboard\n\nimport { MutableRefObject, useCallback, useEffect, useRef, useState } from \"react\";\n\nexport interface UseClipboardProps {\n /**\n * It's callback function that is called after the `copy` command\n * is executed.\n *\n * @param text: The selected clipboard text.\n */\n onSuccess?: (text: string) => void;\n\n /**\n * Triggers when the hook encounters an error.\n * If passed hook won't throw an error.\n *\n * @param error: cause of the error\n */\n onError?: (error: string) => void;\n\n /**\n * Disables the new clipboard API `navigator.clipboard` even if\n * it is supported.\n */\n disableClipboardAPI?: boolean;\n\n /**\n * revert back the isCopied flag to false again if a value is set.\n */\n copiedDuration?: number;\n}\n\nexport interface useClipboardReturnType {\n /**\n * Use ref to pull the text content from.\n */\n ref: MutableRefObject<any>;\n\n /**\n * Use it to perform the copy operation\n */\n copy: (text?: string) => void;\n\n /**\n * Use it to perform the cut operation\n */\n cut: () => void;\n\n /**\n * Indicates wheater the content was successfully copied or not.\n */\n isCoppied: boolean;\n\n /**\n * Current selected clipboard content.\n */\n clipboard: string;\n\n /**\n * Clears the user clipboard.\n */\n clearClipboard: () => void;\n\n /**\n * Check to see if the browser supports the new `navigator.clipboard` API.\n */\n isSupported: () => boolean;\n}\n\nexport const useClipboard = (\n options?: UseClipboardProps\n): useClipboardReturnType => {\n const { onSuccess, onError, disableClipboardAPI = false, copiedDuration } =\n options || {};\n const ref = useRef<any>(null);\n const [isCoppied, setIsCoppied] = useState(false);\n const [clipboard, setClipbaord] = useState(\"\");\n\n useEffect(() => {\n if (copiedDuration) setTimeout(() => setIsCoppied(false), copiedDuration);\n }, [isCoppied]);\n\n const isSupported = () => navigator.clipboard !== undefined;\n\n const handleError = useCallback((error: string) => {\n if (onError) onError(error);\n else throw new Error(error);\n }, [onError]);\n\n const handleSuccess = useCallback((text: string) => {\n if (onSuccess) onSuccess(text);\n setIsCoppied(true);\n setClipbaord(text);\n }, [onSuccess]);\n\n const copyToClipboard = useCallback((text: string) => {\n navigator.clipboard\n .writeText(text)\n .then(() => handleSuccess(text))\n .catch((err) => {\n handleError(err);\n setIsCoppied(false);\n });\n }, [handleError, handleSuccess]);\n\n const clearClipboard = () => {\n if (isSupported()) {\n navigator.clipboard.writeText(\"\");\n }\n };\n\n const copy = (text?: string) =>\n action(\"copy\", typeof text === \"object\" ? undefined : text);\n\n const cut = () => action(\"cut\");\n\n const action = useCallback(\n (operation = \"copy\", text?: string) => {\n const element = ref.current as HTMLElement;\n\n const isInput =\n element &&\n (element.tagName === \"INPUT\" || element.tagName === \"TEXTAREA\");\n\n const input = ref.current as HTMLInputElement;\n\n if (isSupported() && !disableClipboardAPI) {\n if (text) {\n copyToClipboard(text);\n } else if (element) {\n if (isInput) {\n copyToClipboard(input.value);\n\n if (operation === \"cut\") {\n input.value = \"\";\n }\n } else {\n copyToClipboard(element.innerText);\n }\n } else {\n handleError(\"Both the ref & text were undefined\");\n }\n }\n },\n [disableClipboardAPI, copyToClipboard, handleError]\n );\n\n return {\n ref,\n isCoppied,\n clipboard,\n clearClipboard,\n isSupported,\n copy,\n cut\n };\n};\n","import { useEffect, useState } from \"react\";\n\ntype LayoutListener = (isLargeLayout: boolean) => void;\n\nconst breakpoints = {\n xs: 0,\n sm: 640,\n md: 768,\n lg: 1024,\n xl: 1280,\n \"2xl\": 1536,\n \"3xl\": 1920\n}\n\n// Global state and listeners array\nlet isLargeLayoutGlobal = checkLargeLayout(\"lg\"); // Default value\nconst listeners: LayoutListener[] = [];\n\n// Utility to notify all listeners\nconst notifyListeners = () => {\n listeners.forEach(listener => listener(isLargeLayoutGlobal));\n};\n\n// Listen to resize events once, at a global level\nif (typeof window !== \"undefined\")\n window.addEventListener(\"resize\", () => {\n const newIsLargeLayout = checkLargeLayout(\"lg\");\n if (newIsLargeLayout !== isLargeLayoutGlobal) {\n isLargeLayoutGlobal = newIsLargeLayout;\n notifyListeners();\n }\n });\n\nexport const useLargeLayout = () => {\n const [isLargeLayout, setIsLargeLayout] = useState(isLargeLayoutGlobal);\n\n useEffect(() => {\n // Listener function to update component state\n const listener: LayoutListener = (newIsLargeLayout) => {\n setIsLargeLayout(newIsLargeLayout);\n };\n\n // Register listener\n listeners.push(listener);\n\n // Initial state\n setIsLargeLayout(isLargeLayoutGlobal);\n\n // Clean up by removing the listener\n return () => {\n const index = listeners.indexOf(listener);\n if (index > -1) {\n listeners.splice(index, 1);\n }\n };\n }, []);\n\n return isLargeLayout;\n};\n\nfunction checkLargeLayout(breakpoint: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\" | \"3xl\" = \"lg\"): boolean {\n if (typeof window === \"undefined\")\n return false;\n return window.matchMedia(`(min-width: ${breakpoints[breakpoint] + 1}px)`).matches;\n}\n\n// import { useEffect, useState } from \"react\";\n//\n// const breakpoints = {\n// xs: 0,\n// sm: 640,\n// md: 768,\n// lg: 1024,\n// xl: 1280,\n// \"2xl\": 1536,\n// \"3xl\": 1920\n// }\n// export const useLargeLayout = (breakpoint: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\" | \"3xl\" = \"lg\"): boolean => {\n// const [isLargeLayout, setIsLargeLayout] = useState<boolean>(false);\n//\n// useEffect(() => {\n// const handleResize = () => {\n// const matched = window.matchMedia(`(min-width: ${breakpoints[breakpoint] + 1}px)`).matches;\n// setIsLargeLayout(matched);\n// };\n//\n// // Set initial state\n// handleResize();\n//\n// // Set up event listener for resize events\n// window.addEventListener(\"resize\", handleResize);\n//\n// // Clean up event listener when component unmounts\n// return () => {\n// window.removeEventListener(\"resize\", handleResize);\n// };\n// }, []);\n//\n// return isLargeLayout;\n// };\n","import React from \"react\";\nimport { Tooltip, TooltipProps } from \"@firecms/ui\";\n\nexport function ErrorTooltip(props: TooltipProps) {\n return (\n <Tooltip {...props}\n tooltipClassName={\"!text-red-500 bg-red-50\"}>\n {props.children}\n </Tooltip>\n );\n}\n","import React from \"react\";\nimport { ErrorTooltip } from \"./ErrorTooltip\";\nimport { ErrorIcon, Typography } from \"@firecms/ui\";\n\n/**\n * @group Components\n */\nexport interface ErrorViewProps {\n title?: string;\n error: Error | React.ReactElement | string,\n tooltip?: string\n}\n\n/**\n * Generic error view. Displayed for example when an unexpected value comes\n * from the datasource in a collection view.\n * @param title\n * @param error\n * @param tooltip\n * @constructor\n * @group Components\n */\nexport function ErrorView({\n title,\n error,\n tooltip\n }: ErrorViewProps): React.ReactElement {\n const component = error instanceof Error ? error.message : error;\n console.error(\"ErrorView\", error)\n\n const body = (\n <div\n className=\"flex items-center m-2\">\n <ErrorIcon size={\"small\"} color={\"error\"}/>\n <div className=\"pl-2\">\n {title && <Typography\n variant={\"body2\"}\n className=\"font-medium\">{title}</Typography>}\n <Typography variant={\"body2\"}>{component}</Typography>\n </div>\n </div>\n );\n\n if (tooltip) {\n return (\n <ErrorTooltip title={tooltip}>\n {body}\n </ErrorTooltip>\n );\n }\n return body;\n}\n","import React from \"react\";\n\n/**\n * @group Preview components\n */\nexport function EmptyValue() {\n\n return <div\n className=\"rounded-full bg-gray-200 bg-opacity-30 dark:bg-opacity-20 w-5 h-2 inline-block\"/>;\n}\n","import { CollectionSize } from \"../types\";\nimport { PreviewSize } from \"./PropertyPreviewProps\";\n\nexport const TINY_THUMBNAIL = 40;\nexport const SMALL_THUMBNAIL = 100;\nexport const REGULAR_THUMBNAIL = 200;\n\nexport function getThumbnailMeasure(size: PreviewSize): number {\n if (size === \"tiny\")\n return TINY_THUMBNAIL;\n else if (size === \"small\")\n return SMALL_THUMBNAIL;\n else if (size === \"medium\")\n return REGULAR_THUMBNAIL;\n else throw Error(\"Thumbnail size not mapped\");\n}\n\nexport function getPreviewSizeFrom(size: CollectionSize): PreviewSize {\n switch (size) {\n case \"xs\":\n case \"s\":\n return \"tiny\";\n case \"m\":\n return \"small\";\n case \"l\":\n case \"xl\":\n return \"medium\";\n default:\n throw Error(\"Missing mapping value in getPreviewSizeFrom: \" + size);\n }\n}\n","import React, { CSSProperties, useMemo, useState } from \"react\";\n\nimport { getThumbnailMeasure } from \"../util\";\nimport { PreviewSize } from \"../PropertyPreviewProps\";\nimport { ContentCopyIcon, IconButton, OpenInNewIcon, Tooltip } from \"@firecms/ui\";\n\n/**\n * @group Preview components\n */\nexport interface ImagePreviewProps {\n size: PreviewSize,\n url: string\n}\n\n/**\n * @group Preview components\n */\nexport function ImagePreview({\n size,\n url\n }: ImagePreviewProps) {\n\n const [onHover, setOnHover] = useState(false);\n\n const imageSize = useMemo(() => getThumbnailMeasure(size), [size]);\n\n if (size === \"tiny\") {\n return (\n <img src={url}\n className={\"rounded-md\"}\n key={\"tiny_image_preview_\" + url}\n style={{\n position: \"relative\",\n objectFit: \"cover\",\n width: imageSize,\n height: imageSize,\n maxHeight: \"100%\"\n }}/>\n );\n }\n\n const imageStyle: CSSProperties =\n {\n maxWidth: \"100%\",\n maxHeight: \"100%\"\n };\n\n return (\n <div\n className=\"relative flex items-center justify-center max-w-full max-h-full\"\n style={{\n width: imageSize,\n height: imageSize\n }}\n key={\"image_preview_\" + url}\n onMouseEnter={() => setOnHover(true)}\n onMouseMove={() => setOnHover(true)}\n onMouseLeave={() => setOnHover(false)}>\n\n <img src={url}\n className={\"rounded-md\"}\n style={imageStyle}/>\n\n {onHover && <>\n\n {navigator && <Tooltip title=\"Copy url to clipboard\">\n <div\n className=\"rounded-full absolute bottom-[-4px] right-8\">\n <IconButton\n variant={\"filled\"}\n size={\"small\"}\n onClick={(e) => {\n e.stopPropagation();\n e.preventDefault();\n return navigator.clipboard.writeText(url);\n }}>\n <ContentCopyIcon className={\"text-gray-500\"}\n size={\"small\"}/>\n </IconButton>\n </div>\n </Tooltip>}\n\n <Tooltip title=\"Open image in new tab\">\n <IconButton\n variant={\"filled\"}\n component={\"a\" as React.ElementType}\n style={{\n position: \"absolute\",\n bottom: -4,\n right: -4\n }}\n href={url}\n rel=\"noopener noreferrer\"\n target=\"_blank\"\n size={\"small\"}\n onClick={(e: any) => e.stopPropagation()}\n >\n <OpenInNewIcon className={\"text-gray-500\"}\n size={\"small\"}/>\n </IconButton>\n </Tooltip>\n </>\n }\n </div>\n );\n}\n","import React from \"react\";\n\nimport { ImagePreview } from \"./ImagePreview\";\nimport { getThumbnailMeasure } from \"../util\";\nimport { PreviewType } from \"../../types\";\nimport { PreviewSize } from \"../PropertyPreviewProps\";\nimport { DescriptionIcon, OpenInNewIcon, Tooltip, Typography } from \"@firecms/ui\";\nimport { EmptyValue } from \"./EmptyValue\";\n\n/**\n * @group Preview components\n */\nexport function UrlComponentPreview({\n url,\n previewType,\n size,\n hint\n }: {\n url: string,\n previewType?: PreviewType,\n size: PreviewSize,\n hint?: string\n}): React.ReactElement {\n\n if (!previewType) {\n if (!url || !url.trim()) return <EmptyValue/>;\n return (\n <a className=\"flex gap-4 break-words items-center font-medium text-primary visited:text-primary dark:visited:text-primary dark:text-primary\"\n href={url}\n rel=\"noopener noreferrer\"\n onMouseDown={(e: React.MouseEvent) => {\n e.preventDefault();\n }}\n target=\"_blank\">\n <OpenInNewIcon size={\"small\"}/>\n {url}\n </a>\n );\n }\n\n if (previewType === \"image\") {\n return <ImagePreview url={url}\n size={size}/>;\n } else if (previewType === \"audio\") {\n return <audio controls\n src={url}>\n Your browser does not support the\n <code>audio</code> element.\n </audio>;\n } else if (previewType === \"video\") {\n return <video\n className={`max-w-${size === \"small\" ? \"sm\" : \"md\"}`}\n controls\n >\n <source src={url}/>\n </video>;\n } else {\n return (\n <a\n href={url}\n rel=\"noopener noreferrer\"\n target=\"_blank\"\n onClick={(e) => e.stopPropagation()}\n className=\"flex flex-col items-center justify-center\"\n style={{\n width: getThumbnailMeasure(size),\n height: getThumbnailMeasure(size)\n }}>\n <DescriptionIcon className=\"flex-grow\"/>\n {hint &&\n <Tooltip title={hint}>\n <Typography\n className=\"max-w-full truncate rtl text-left\"\n variant={\"caption\"}>{hint}</Typography>\n </Tooltip>}\n </a>\n );\n }\n}\n","import {\n ResolvedArrayProperty,\n ResolvedMapProperty,\n ResolvedProperties,\n ResolvedProperty,\n ResolvedStringProperty\n} from \"../../types\";\nimport React from \"react\";\nimport { getThumbnailMeasure } from \"../util\";\nimport { PreviewSize } from \"../PropertyPreviewProps\";\nimport { Skeleton } from \"@firecms/ui\";\n\nexport interface SkeletonPropertyComponentProps {\n property: ResolvedProperty,\n size: PreviewSize\n}\n\n/**\n * @group Preview components\n */\nexport function SkeletonPropertyComponent({\n property,\n size\n }: SkeletonPropertyComponentProps\n) {\n\n if (!property) {\n console.error(\"No property assigned for skeleton component\", property, size);\n }\n\n let content: React.ReactNode | any;\n if (property.dataType === \"string\") {\n const stringProperty = property as ResolvedStringProperty;\n if (stringProperty.url) {\n content = renderUrlComponent(stringProperty, size);\n } else if (stringProperty.storage) {\n content = renderSkeletonImageThumbnail(size);\n } else {\n content = renderSkeletonText();\n }\n } else if (property.dataType === \"array\") {\n const arrayProperty = property as ResolvedArrayProperty;\n\n if (arrayProperty.of) {\n if (Array.isArray(arrayProperty.of)) {\n content = <>{arrayProperty.of.map((p, i) => renderGenericArrayCell(p, i))} </>;\n } else {\n if (arrayProperty.of.dataType === \"map\" && arrayProperty.of.properties) {\n content = renderArrayOfMaps(arrayProperty.of.properties, size, arrayProperty.of.previewProperties);\n } else if (arrayProperty.of.dataType === \"string\") {\n if (arrayProperty.of.enumValues) {\n content = renderArrayEnumTableCell();\n } else if (arrayProperty.of.storage) {\n content = renderGenericArrayCell(arrayProperty.of);\n } else {\n content = renderArrayOfStrings();\n }\n } else {\n content = renderGenericArrayCell(arrayProperty.of);\n }\n }\n }\n\n } else if (property.dataType === \"map\") {\n content = renderMap(property as ResolvedMapProperty, size);\n } else if (property.dataType === \"date\") {\n content = renderSkeletonText();\n } else if (property.dataType === \"reference\") {\n content = renderReference();\n } else if (property.dataType === \"boolean\") {\n content = renderSkeletonText();\n } else {\n content = renderSkeletonText();\n }\n return (content || null);\n}\n\nfunction renderMap<T extends Record<string, any>>(property: ResolvedMapProperty<T>, size: PreviewSize) {\n\n if (!property.properties)\n return <></>;\n\n let mapPropertyKeys: string[];\n if (size === \"medium\") {\n mapPropertyKeys = Object.keys(property.properties);\n } else {\n mapPropertyKeys = (property.previewProperties || Object.keys(property.properties)) as string[];\n if (size === \"small\")\n mapPropertyKeys = mapPropertyKeys.slice(0, 3);\n else if (size === \"tiny\")\n mapPropertyKeys = mapPropertyKeys.slice(0, 1);\n }\n\n if (size !== \"medium\")\n return (\n <div\n className=\"w-full flex flex-col space-y-4\"\n >\n {mapPropertyKeys.map((key, index) => (\n <div key={`map_${key}`}>\n {property.properties && property.properties[key] &&\n <SkeletonPropertyComponent\n property={property.properties[key]}\n size={\"small\"}/>}\n </div>\n ))}\n </div>\n );\n\n return (\n <table className=\"table-auto\">\n <tbody>\n {mapPropertyKeys &&\n mapPropertyKeys.map((key, index) => {\n return (\n <tr\n key={`map_preview_table__${index}`}\n className=\"border-b last:border-b-0\">\n <th key={`table-cell-title--${key}`}\n className=\"align-top\"\n style={{ width: \"30%\" }}>\n <p className=\"text-xs text-secondary\">\n {property.properties![key].name}\n </p>\n </th>\n <th key={`table-cell-${key}`}\n style={{ width: \"70%\" }}>\n {property.properties && property.properties[key] &&\n <SkeletonPropertyComponent\n property={property.properties[key]}\n size={\"small\"}/>}\n </th>\n </tr>\n );\n })}\n </tbody>\n </table>\n );\n}\n\nfunction renderArrayOfMaps<M extends Record<string, any>>(properties: ResolvedProperties<M>, size: PreviewSize, previewProperties?: string[]) {\n let tableProperties = previewProperties;\n if (!tableProperties || !tableProperties.length) {\n tableProperties = Object.keys(properties) as string[];\n if (size)\n tableProperties = tableProperties.slice(0, 3);\n }\n\n return (\n <table className=\"table-auto\">\n <tbody>\n {\n [0, 1, 2].map((value, index) => {\n return (\n <tr key={`table_${value}_${index}`}>\n {tableProperties && tableProperties.map(\n (key) => (\n <th\n key={`table-cell-${key}`}\n >\n <SkeletonPropertyComponent\n property={(properties)[key]}\n size={\"small\"}/>\n </th>\n )\n )}\n </tr>\n );\n })}\n </tbody>\n </table>\n );\n}\n\nfunction renderArrayOfStrings() {\n return (\n <div className={\"flex flex-col gap-2\"}>\n {\n [0, 1].map((value, index) => (\n renderSkeletonText(index)\n ))}\n </div>\n );\n}\n\nfunction renderArrayEnumTableCell() {\n return (\n <div className={\"flex flex-col gap-2\"}>\n {\n [0, 1].map((value, index) =>\n <>\n {renderSkeletonText(index)}\n </>\n )}\n </div>\n );\n}\n\nfunction renderGenericArrayCell(\n property: ResolvedProperty,\n index = 0\n) {\n return (\n\n <div key={\"array_index_\" + index}\n className={\"flex flex-col gap-2\"}>\n\n {\n [0, 1].map((value, index) =>\n <>\n <SkeletonPropertyComponent key={`i_${index}`}\n property={property}\n size={\"small\"}/>\n </>\n )}\n </div>\n );\n}\n\nfunction renderUrlAudioComponent() {\n return (\n <Skeleton width={300}\n height={100}/>\n );\n}\n\nexport function renderSkeletonImageThumbnail(size: PreviewSize) {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const imageSize = size === \"tiny\" ? 40 : size === \"small\" ? 100 : 200;\n return (\n <Skeleton width={imageSize}\n height={imageSize}/>\n );\n}\n\nfunction renderUrlVideo(size: PreviewSize) {\n\n return (\n <Skeleton width={size !== \"medium\" ? 300 : 500}\n height={size !== \"medium\" ? 200 : 250}/>\n );\n}\n\nfunction renderReference() {\n return <Skeleton width={200} height={100}/>;\n}\n\nfunction renderUrlComponent(property: ResolvedStringProperty, size: PreviewSize = \"medium\") {\n\n if (typeof property.url === \"boolean\") {\n return <div style={{\n display: \"flex\"\n }}>\n {renderSkeletonIcon()}\n {renderSkeletonText()}\n </div>;\n }\n\n return renderUrlFile(size);\n}\n\nfunction renderUrlFile(size: PreviewSize) {\n\n return (\n <div\n className={`w-${getThumbnailMeasure(size)} h-${getThumbnailMeasure(size)}`}>\n {renderSkeletonIcon()}\n </div>\n );\n}\n\nexport function renderSkeletonText(index?: number, width = 120) {\n return <Skeleton width={width} key={`skeleton_${index}`}/>;\n}\n\nexport function renderSkeletonCaptionText(index?: number) {\n return <Skeleton\n height={20}/>;\n}\n\nexport function renderSkeletonIcon() {\n return <Skeleton width={24} height={24}/>;\n}\n","import React, { useEffect } from \"react\";\n\nimport { renderSkeletonImageThumbnail } from \"../property_previews/SkeletonPropertyComponent\";\nimport { UrlComponentPreview } from \"./UrlComponentPreview\";\nimport { useStorageSource } from \"../../hooks\";\nimport { DownloadConfig, FileType } from \"../../types\";\nimport { PreviewSize } from \"../PropertyPreviewProps\";\nimport { ErrorView } from \"../../components\";\n\ntype StorageThumbnailProps = {\n storagePathOrDownloadUrl: string;\n storeUrl: boolean;\n size: PreviewSize;\n};\n\n/**\n * @group Preview components\n */\nexport const StorageThumbnail = React.memo<StorageThumbnailProps>(StorageThumbnailInternal, areEqual) as React.FunctionComponent<StorageThumbnailProps>;\n\nfunction areEqual(prevProps: StorageThumbnailProps, nextProps: StorageThumbnailProps) {\n return prevProps.size === nextProps.size &&\n prevProps.storagePathOrDownloadUrl === nextProps.storagePathOrDownloadUrl &&\n prevProps.storeUrl === nextProps.storeUrl;\n}\n\nconst URL_CACHE: Record<string, DownloadConfig> = {};\n\nexport function StorageThumbnailInternal({\n storeUrl,\n storagePathOrDownloadUrl,\n size\n }: StorageThumbnailProps) {\n\n const [error, setError] = React.useState<Error | undefined>(undefined);\n const storage = useStorageSource();\n\n const [downloadConfig, setDownloadConfig] = React.useState<DownloadConfig>(URL_CACHE[storagePathOrDownloadUrl]);\n\n useEffect(() => {\n if (!storagePathOrDownloadUrl)\n return;\n let unmounted = false;\n storage.getDownloadURL(storagePathOrDownloadUrl)\n .then(function (downloadConfig) {\n if (!unmounted) {\n setDownloadConfig(downloadConfig);\n URL_CACHE[storagePathOrDownloadUrl] = downloadConfig;\n }\n }).catch(setError);\n return () => {\n unmounted = true;\n };\n }, [storagePathOrDownloadUrl]);\n\n if (!storagePathOrDownloadUrl) return null;\n\n const filetype = downloadConfig?.metadata ? getFiletype(downloadConfig?.metadata.contentType) : undefined;\n const previewType = filetype?.startsWith(\"image\")\n ? \"image\"\n : (filetype?.startsWith(\"video\")\n ? \"video\"\n : (filetype?.startsWith(\"audio\") ? \"audio\" : \"file\"));\n\n if (downloadConfig?.fileNotFound)\n return <ErrorView error={\"File not found\"}></ErrorView>\n\n return downloadConfig?.url\n ? <UrlComponentPreview previewType={previewType}\n url={downloadConfig.url}\n size={size}\n hint={storagePathOrDownloadUrl}/>\n : renderSkeletonImageThumbnail(size);\n}\n\nfunction getFiletype(input: string): FileType {\n if (input.startsWith(\"image\")) return \"image/*\";\n else if (input.startsWith(\"video\")) return \"video/*\";\n else if (input.startsWith(\"audio\")) return \"audio/*\";\n else if (input.startsWith(\"application\")) return \"application/*\";\n else if (input.startsWith(\"text\")) return \"text/*\";\n else if (input.startsWith(\"font\")) return \"font/*\";\n else return input;\n}\n","import React from \"react\";\nimport { EnumValues } from \"../../types\";\nimport { buildEnumLabel, enumToObjectEntries, getColorScheme, getLabelOrConfigFrom } from \"../../util/enums\";\nimport { Chip } from \"@firecms/ui\";\n\nexport interface EnumValuesChipProps {\n enumValues?: EnumValues;\n enumKey: string | number;\n size: \"tiny\" | \"small\" | \"medium\";\n className?: string;\n children?: React.ReactNode;\n}\n\n/**\n * @group Preview components\n */\nexport function EnumValuesChip({\n enumValues,\n enumKey,\n size,\n className,\n children\n }: EnumValuesChipProps) {\n if (!enumValues) return null;\n const enumValuesConfig = enumToObjectEntries(enumValues);\n const enumValue = enumKey !== undefined ? getLabelOrConfigFrom(enumValuesConfig, enumKey) : undefined;\n const label = buildEnumLabel(enumValue);\n const colorScheme = getColorScheme(enumValuesConfig, enumKey);\n return <Chip\n className={className}\n colorScheme={colorScheme}\n error={!label}\n outlined={false}\n size={size}>\n {children}\n {!children && (label !== undefined ? label : String(enumKey))}\n </Chip>;\n}\n","import React from \"react\";\n\nimport { resolvePropertyEnum } from \"../../util\";\nimport { EnumValuesChip } from \"../components/EnumValuesChip\";\nimport { PreviewType } from \"../../types\";\nimport { UrlComponentPreview } from \"../components/UrlComponentPreview\";\nimport { PropertyPreviewProps } from \"../PropertyPreviewProps\";\nimport { ErrorBoundary } from \"../../components\";\nimport { Chip, cn, getColorSchemeForSeed } from \"@firecms/ui\";\n\n/**\n * @group Preview components\n */\nexport function StringPropertyPreview({\n propertyKey,\n value,\n property,\n size\n }: PropertyPreviewProps<string>): React.ReactElement {\n\n if (property.enumValues) {\n const enumKey = value;\n const resolvedProperty = resolvePropertyEnum(property);\n return <EnumValuesChip\n enumKey={enumKey}\n enumValues={resolvedProperty.enumValues}\n size={size}/>;\n } else if (property.previewAsTag) {\n const colorScheme = getColorSchemeForSeed(propertyKey ?? \"\");\n return (\n <ErrorBoundary>\n <Chip\n colorScheme={colorScheme}\n size={size}>\n {value}\n </Chip>\n </ErrorBoundary>);\n } else if (property.url) {\n return (\n <UrlComponentPreview size={size}\n url={value}\n previewType={typeof property.url === \"string\" ? property.url as PreviewType : undefined}/>\n );\n } else {\n if (!value) return <></>;\n const lines = value.split(\"\\n\");\n return value && value.includes(\"\\n\")\n ? <div className={cn(\"overflow-x-scroll\", size === \"tiny\" ? \"text-sm\" : \"\")}>\n {lines.map((str, index) =>\n <React.Fragment key={`string_preview_${index}`}>\n <span>{str}</span>\n {index !== lines.length - 1 && <br/>}\n </React.Fragment>)}\n </div>\n : (size === \"tiny\"\n ? <span className={\"text-sm\"}>{value}</span>\n : <>{value}</>\n );\n }\n}\n","import React from \"react\";\n\nimport { resolveArrayProperty } from \"../../util\";\nimport { ResolvedProperty } from \"../../types\";\nimport { useCustomizationController } from \"../../hooks\";\nimport { PreviewSize, PropertyPreviewProps } from \"../PropertyPreviewProps\";\nimport { PropertyPreview } from \"../PropertyPreview\";\nimport { cn, defaultBorderMixin } from \"@firecms/ui\";\nimport { ErrorBoundary } from \"../../components\";\n\n/**\n * @group Preview components\n */\nexport function ArrayPropertyPreview({\n propertyKey,\n value,\n property: inputProperty,\n // entity,\n size\n }: PropertyPreviewProps<any[]>) {\n\n const customizationController = useCustomizationController();\n const property = resolveArrayProperty({\n propertyKey,\n property: inputProperty,\n propertyValue: value,\n fields: customizationController.propertyConfigs\n });\n\n if (!property.of) {\n throw Error(`You need to specify an 'of' prop (or specify a custom field) in your array property ${propertyKey}`);\n }\n\n if (property.dataType !== \"array\")\n throw Error(\"Picked wrong preview component ArrayPreview\");\n\n const values = value;\n\n if (!values) return null;\n\n const childSize: PreviewSize = size === \"medium\" ? \"small\" : \"tiny\";\n\n return (\n <div className=\"flex flex-col gap-2\">\n {values &&\n values.map((value, index) => {\n const of: ResolvedProperty = property.resolvedProperties[index] ??\n (property.resolvedProperties[index] ?? (Array.isArray(property.of) ? property.of[index] : property.of));\n return of\n ? <React.Fragment\n key={\"preview_array_\" + index}>\n <div className={cn(defaultBorderMixin, \"m-1 border-b last:border-b-0\")}>\n <ErrorBoundary>\n <PropertyPreview\n propertyKey={propertyKey}\n // entity={entity}\n value={value}\n property={of}\n size={childSize}/>\n </ErrorBoundary>\n </div>\n </React.Fragment>\n : null;\n }\n )}\n </div>\n );\n}\n","import * as React from \"react\";\nimport { useMemo } from \"react\";\n\nimport { Entity, EntityCollection, ResolvedProperty } from \"../types\";\n\nimport {\n getEntityImagePreviewPropertyKey,\n getEntityPreviewKeys,\n getEntityTitlePropertyKey,\n getValueInPath,\n resolveCollection\n} from \"../util\";\nimport { cn, defaultBorderMixin, IconButton, KeyboardTabIcon, Skeleton, Tooltip, Typography } from \"@firecms/ui\";\nimport { PreviewSize, PropertyPreview, SkeletonPropertyComponent } from \"../preview\";\nimport { useCustomizationController, useNavigationController, useSideEntityController } from \"../hooks\";\nimport { useAnalyticsController } from \"../hooks/useAnalyticsController\";\n\nexport type EntityPreviewProps = {\n size: PreviewSize,\n actions?: React.ReactNode,\n collection?: EntityCollection,\n hover?: boolean;\n previewProperties?: string[],\n disabled: undefined | boolean,\n entity: Entity<any>,\n includeEntityNavigation?: boolean,\n onClick?: (e: React.SyntheticEvent) => void;\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 EntityPreview({\n actions,\n disabled,\n hover,\n collection: collectionProp,\n previewProperties,\n onClick,\n size,\n includeEntityNavigation,\n entity\n }: EntityPreviewProps) {\n\n const analyticsController = useAnalyticsController();\n const sideEntityController = useSideEntityController();\n const customizationController = useCustomizationController();\n\n const navigationController = useNavigationController();\n\n const collection = collectionProp ?? navigationController.getCollection<EntityCollection>(entity.path);\n\n if (!collection) {\n throw Error(`Couldn't find the corresponding collection view for the path: ${entity.path}`);\n }\n\n const resolvedCollection = React.useMemo(() => resolveCollection({\n collection,\n path: entity.path,\n values: entity.values,\n fields: customizationController.propertyConfigs\n }), [collection]);\n\n const listProperties = useMemo(() => getEntityPreviewKeys(resolvedCollection, customizationController.propertyConfigs, previewProperties, size === \"small\" || size === \"medium\" ? 3 : 1),\n [previewProperties, resolvedCollection, size]);\n\n const titleProperty = getEntityTitlePropertyKey(resolvedCollection, customizationController.propertyConfigs);\n const imagePropertyKey = getEntityImagePreviewPropertyKey(resolvedCollection);\n const imageProperty = imagePropertyKey ? resolvedCollection.properties[imagePropertyKey] : undefined;\n\n const restProperties = listProperties.filter(p => p !== titleProperty && p !== imagePropertyKey);\n\n return <EntityPreviewContainer onClick={disabled ? undefined : onClick}\n hover={disabled ? undefined : hover}\n size={size}>\n {imageProperty && (\n <div className={cn(\"w-10 h-10 mr-2 shrink-0 grow-0\", size === \"tiny\" ? \"my-0.5\" : \"m-2 self-start\")}>\n <PropertyPreview property={imageProperty}\n propertyKey={imagePropertyKey as string}\n size={\"tiny\"}\n value={getValueInPath(entity.values, imagePropertyKey as string)}/>\n </div>\n )}\n\n <div className={\"flex flex-col flex-grow w-full m-1\"}>\n\n {size !== \"tiny\" && (\n entity\n ? <div className={`${\n size !== \"medium\"\n ? \"block whitespace-nowrap overflow-hidden truncate\"\n : \"\"\n }`}>\n <Typography variant={\"caption\"}\n color={\"disabled\"}\n className={\"font-mono\"}>\n {entity.id}\n </Typography>\n </div>\n : <Skeleton/>)}\n\n {titleProperty && (\n <div className={\"my-0.5 text-sm font-medium\"}>\n {\n entity\n ? <PropertyPreview\n propertyKey={titleProperty as string}\n value={getValueInPath(entity.values, titleProperty)}\n property={resolvedCollection.properties[titleProperty as string] as ResolvedProperty}\n size={\"medium\"}/>\n : <SkeletonPropertyComponent\n property={resolvedCollection.properties[titleProperty as string] as ResolvedProperty}\n size={\"medium\"}/>\n }\n </div>\n )}\n\n {restProperties && restProperties.map((key) => {\n const childProperty = resolvedCollection.properties[key as string];\n if (!childProperty) return null;\n\n return (\n <div key={\"ref_prev_\" + key}\n className={restProperties.length > 1 ? \"my-0.5\" : \"my-0\"}>\n {\n entity\n ? <PropertyPreview\n propertyKey={key as string}\n value={getValueInPath(entity.values, key)}\n property={childProperty as ResolvedProperty}\n size={\"tiny\"}/>\n : <SkeletonPropertyComponent\n property={childProperty as ResolvedProperty}\n size={\"tiny\"}/>\n }\n </div>\n );\n })}\n\n </div>\n\n {entity && includeEntityNavigation &&\n <Tooltip title={`See details for ${entity.id}`}\n className={size !== \"tiny\" ? \"self-start\" : \"\"}>\n <IconButton\n color={\"inherit\"}\n size={\"small\"}\n onClick={(e) => {\n e.stopPropagation();\n analyticsController.onAnalyticsEvent?.(\"entity_click_from_reference\", {\n path: entity.path,\n entityId: entity.id\n });\n sideEntityController.open({\n entityId: entity.id,\n path: entity.path,\n collection,\n updateUrl: true\n });\n }}>\n <KeyboardTabIcon size={\"small\"}/>\n </IconButton>\n </Tooltip>}\n\n {actions}\n\n </EntityPreviewContainer>;\n}\n\ntype EntityPreviewContainerProps = {\n children: React.ReactNode;\n hover?: boolean;\n size: PreviewSize;\n className?: string;\n style?: React.CSSProperties;\n onClick?: (e: React.SyntheticEvent) => void;\n};\n\nconst EntityPreviewContainerInner = React.forwardRef<HTMLDivElement, EntityPreviewContainerProps>(({\n children,\n hover,\n onClick,\n size,\n style,\n className,\n ...props\n }, ref) => {\n return <div\n ref={ref}\n style={{\n ...style,\n // @ts-ignore\n tabindex: 0\n }}\n className={cn(\n \"bg-white dark:bg-gray-900\",\n \"items-center\",\n hover ? \"hover:bg-slate-50 dark:hover:bg-gray-800 group-hover:bg-slate-50 dark:group-hover:bg-gray-800\" : \"\",\n size === \"tiny\" ? \"p-1\" : \"p-2\",\n \"flex border rounded-lg\",\n onClick ? \"cursor-pointer\" : \"\",\n defaultBorderMixin,\n className)}\n onClick={(event) => {\n if (onClick) {\n event.preventDefault();\n onClick(event);\n }\n }}\n {...props}>\n {children}\n </div>;\n});\n\nEntityPreviewContainerInner.displayName = \"EntityPreviewContainer\";\n\nexport const EntityPreviewContainer = React.memo(EntityPreviewContainerInner) as React.FC<EntityPreviewContainerProps>;\n","import * as React from \"react\";\n\nimport { Entity, EntityCollection, EntityReference } from \"../../types\";\nimport {\n useCustomizationController,\n useEntityFetch,\n useNavigationController,\n useSideEntityController\n} from \"../../hooks\";\nimport { PreviewSize } from \"../PropertyPreviewProps\";\nimport { IconButton, KeyboardTabIcon, Skeleton, Tooltip } from \"@firecms/ui\";\nimport { ErrorView } from \"../../components\";\nimport { useAnalyticsController } from \"../../hooks/useAnalyticsController\";\nimport { EntityPreview, EntityPreviewContainer } from \"../../components/EntityPreview\";\n\nexport type ReferencePreviewProps = {\n disabled?: boolean;\n reference: EntityReference,\n size: PreviewSize;\n previewProperties?: string[];\n onClick?: (e: React.SyntheticEvent) => void;\n hover?: boolean;\n allowEntityNavigation?: boolean;\n};\n\n/**\n * @group Preview components\n */\nexport const ReferencePreview = React.memo<ReferencePreviewProps>(function ReferencePreview(props: ReferencePreviewProps) {\n const reference = props.reference;\n if (!(typeof reference === \"object\" && \"isEntityReference\" in reference && reference.isEntityReference())) {\n console.warn(\"Reference preview received value of type\", typeof reference);\n return <EntityPreviewContainer\n onClick={props.onClick}\n size={props.size}>\n <ErrorView error={\"Unexpected value. Click to edit\"}\n tooltip={JSON.stringify(reference)}/>\n </EntityPreviewContainer>;\n }\n return <ReferencePreviewInternal {...props} />;\n}, areEqual) as React.FunctionComponent<ReferencePreviewProps>;\n\nfunction areEqual(prevProps: ReferencePreviewProps, nextProps: ReferencePreviewProps) {\n return prevProps.disabled === nextProps.disabled &&\n prevProps.size === nextProps.size &&\n prevProps.hover === nextProps.hover &&\n prevProps.reference?.id === nextProps.reference?.id &&\n prevProps.reference?.path === nextProps.reference?.path &&\n prevProps.allowEntityNavigation === nextProps.allowEntityNavigation\n ;\n}\n\nfunction ReferencePreviewInternal<M extends Record<string, any>>({\n disabled,\n reference,\n previewProperties,\n size,\n hover,\n onClick,\n allowEntityNavigation = true\n }: ReferencePreviewProps) {\n\n const customizationController = useCustomizationController();\n\n const navigationController = useNavigationController();\n\n const collection = navigationController.getCollection<EntityCollection<M>>(reference.path);\n if (!collection) {\n if (customizationController.components?.missingReference) {\n return <customizationController.components.missingReference path={reference.path}/>;\n } else {\n throw Error(`Couldn't find the corresponding collection view for the path: ${reference.path}`);\n }\n }\n\n return <ReferencePreviewExisting\n reference={reference}\n collection={collection}\n previewProperties={previewProperties}\n size={size}\n disabled={disabled}\n allowEntityNavigation={allowEntityNavigation}\n onClick={onClick}\n hover={hover}/>\n}\n\nfunction ReferencePreviewExisting<M extends Record<string, any> = any>({\n reference,\n collection,\n previewProperties,\n size,\n disabled,\n allowEntityNavigation,\n onClick,\n hover\n }: ReferencePreviewProps & {\n collection: EntityCollection<M>\n}) {\n\n const {\n entity,\n dataLoading,\n dataLoadingError\n } = useEntityFetch({\n path: reference.path,\n entityId: reference.id,\n collection,\n useCache: true\n });\n\n if (entity) {\n referencesCache.set(reference.pathWithId, entity);\n }\n\n const usedEntity = entity ?? referencesCache.get(reference.pathWithId);\n\n let body: React.ReactNode;\n\n if (!reference) {\n body = <ErrorView error={\"Reference not set\"}/>;\n } else if (usedEntity && !usedEntity.values) {\n body = <ErrorView error={\"Reference does not exist\"}\n tooltip={reference.path}/>;\n }\n if (body) {\n\n return (\n <EntityPreviewContainer onClick={disabled ? undefined : onClick}\n hover={disabled ? undefined : hover}\n size={size}>\n {body}\n </EntityPreviewContainer>\n );\n }\n\n if (dataLoading && !usedEntity) {\n return (\n <EntityPreviewContainer onClick={disabled ? undefined : onClick}\n hover={disabled ? undefined : hover}\n size={size}>\n <Skeleton/>\n </EntityPreviewContainer>\n );\n }\n\n if (!usedEntity) {\n return (\n <EntityPreviewContainer onClick={disabled ? undefined : onClick}\n hover={disabled ? undefined : hover}\n size={size}>\n <ErrorView error={\"Entity not found\"}/>\n </EntityPreviewContainer>\n );\n }\n return <EntityPreview size={size}\n previewProperties={previewProperties}\n disabled={disabled}\n entity={usedEntity}\n collection={collection}\n onClick={onClick}\n includeEntityNavigation={allowEntityNavigation}\n hover={hover}/>;\n\n}\n\nconst referencesCache = new Map<string, Entity<any>>();\n","import { ResolvedReferenceProperty } from \"../../types\";\nimport { resolveArrayProperty } from \"../../util\";\nimport { useCustomizationController } from \"../../hooks\";\nimport { PreviewSize, PropertyPreviewProps } from \"../PropertyPreviewProps\";\nimport { ReferencePreview } from \"../components/ReferencePreview\";\n\n/**\n * @group Preview components\n */\nexport function ArrayOfReferencesPreview({\n propertyKey,\n value,\n property: inputProperty,\n size\n }: PropertyPreviewProps<any[]>) {\n\n const customizationController = useCustomizationController();\n const property = resolveArrayProperty({\n propertyKey,\n property: inputProperty,\n propertyValue: value,\n fields: customizationController.propertyConfigs\n });\n\n if (Array.isArray(property?.of)) {\n throw Error(\"Using array properties instead of single one in `of` in ArrayProperty\");\n }\n\n if (property?.dataType !== \"array\" || !property.of || property.of.dataType !== \"reference\")\n throw Error(\"Picked wrong preview component ArrayOfReferencesPreview\");\n\n const childSize: PreviewSize = size === \"medium\" ? \"small\" : \"tiny\";\n\n return (\n <div className=\"flex flex-col w-full\">\n {value &&\n value.map((reference, index) => {\n const ofProperty = property.of as ResolvedReferenceProperty;\n return <div className=\"mt-1 mb-1 w-full\"\n key={`preview_array_ref_${propertyKey}_${index}`}>\n <ReferencePreview\n disabled={!ofProperty.path}\n previewProperties={ofProperty.previewProperties}\n size={childSize}\n reference={reference}\n />\n </div>;\n }\n )}\n </div>\n );\n}\n","import React from \"react\";\n\nimport { resolveArrayProperty } from \"../../util\";\nimport { ResolvedProperty } from \"../../types\";\n\nimport { useCustomizationController } from \"../../hooks\";\nimport { PreviewSize, PropertyPreviewProps } from \"../PropertyPreviewProps\";\nimport { PropertyPreview } from \"../PropertyPreview\";\nimport { ErrorBoundary } from \"../../components\";\n\n/**\n * @group Preview components\n */\nexport function ArrayOfStorageComponentsPreview({\n propertyKey,\n // entity,\n value,\n property: inputProperty,\n size\n }: PropertyPreviewProps<any[]>) {\n\n const customizationController = useCustomizationController();\n const property = resolveArrayProperty({\n propertyKey,\n property: inputProperty,\n propertyValue: value,\n fields: customizationController.propertyConfigs\n });\n\n if (Array.isArray(property.of)) {\n throw Error(\"Using array properties instead of single one in `of` in ArrayProperty\");\n }\n\n if (property.dataType !== \"array\" || !property.of || property.of.dataType !== \"string\")\n throw Error(\"Picked wrong preview component ArrayOfStorageComponentsPreview\");\n\n const childSize: PreviewSize = size === \"medium\" ? \"small\" : \"tiny\";\n\n return (\n <div className={\"flex flex-wrap gap-2\"}>\n {value &&\n value.map((v, index) =>\n <ErrorBoundary key={`preview_array_storage_${propertyKey}_${index}`}>\n <PropertyPreview\n propertyKey={propertyKey}\n value={v}\n // entity={entity}\n property={property.of as ResolvedProperty<string>}\n size={childSize}/>\n </ErrorBoundary>\n )}\n </div>\n );\n}\n","import React from \"react\";\n\nimport { EnumValueConfig } from \"../../types\";\nimport { EnumValuesChip } from \"./EnumValuesChip\";\nimport { PreviewSize } from \"../PropertyPreviewProps\";\nimport { ErrorBoundary } from \"../../components\";\n\n/**\n * @group Preview components\n */\nexport function ArrayEnumPreview({\n name,\n value,\n enumValues,\n size\n }: {\n value: string[] | number[],\n name: string | undefined,\n enumValues: EnumValueConfig[],\n size: PreviewSize\n}) {\n\n return (\n <div className=\"flex flex-wrap gap-1.5\">\n {value && value.map((enumKey, index) => {\n return (\n <ErrorBoundary\n key={`preview_array_ref_${name}_${index}`}>\n <EnumValuesChip\n enumKey={enumKey}\n enumValues={enumValues}\n size={size !== \"medium\" ? \"small\" : \"medium\"}/>\n </ErrorBoundary>\n );\n }\n )}\n </div>\n );\n}\n","import { ResolvedNumberProperty, ResolvedStringProperty } from \"../../types\";\nimport { ArrayEnumPreview } from \"../components/ArrayEnumPreview\";\nimport { PropertyPreviewProps } from \"../PropertyPreviewProps\";\n\n/**\n * @group Preview components\n */\nexport function ArrayPropertyEnumPreview({\n propertyKey,\n value,\n property,\n size\n }: PropertyPreviewProps<string[] | number[]>) {\n\n if (property.dataType !== \"array\")\n throw Error(\"Picked wrong preview component ArrayEnumPreview\");\n\n const ofProperty = property.of as ResolvedStringProperty | ResolvedNumberProperty;\n if (!ofProperty.enumValues)\n throw Error(\"Picked wrong preview component ArrayEnumPreview\");\n\n if (!value) return null;\n\n return <ArrayEnumPreview name={propertyKey}\n value={value}\n enumValues={ofProperty.enumValues}\n size={size}/>;\n}\n","import React from \"react\";\nimport { ResolvedStringProperty } from \"../../types\";\n\nimport { resolveArrayProperty } from \"../../util\";\nimport { PropertyPreviewProps, StringPropertyPreview } from \"../../preview\";\nimport { useCustomizationController } from \"../../hooks\";\nimport { ErrorBoundary } from \"../../components\";\n\n/**\n * @group Preview components\n */\nexport function ArrayOfStringsPreview({\n propertyKey,\n value,\n property: inputProperty,\n // entity,\n size\n }: PropertyPreviewProps<string[]>) {\n\n const customizationController = useCustomizationController();\n const property = resolveArrayProperty({\n propertyKey,\n property: inputProperty,\n propertyValue: value,\n fields: customizationController.propertyConfigs\n });\n\n if (Array.isArray(property.of)) {\n throw Error(\"Using array properties instead of single one in `of` in ArrayProperty\");\n }\n if (!property.of || property.dataType !== \"array\" || property.of.dataType !== \"string\")\n throw Error(\"Picked wrong preview component ArrayOfStringsPreview\");\n\n if (value && !Array.isArray(value)) {\n return <div>{`Unexpected value: ${value}`}</div>;\n }\n const stringProperty = property.of as ResolvedStringProperty;\n\n return (\n <div className=\"flex flex-col gap-2\">\n {value &&\n value.map((v, index) =>\n <div key={`preview_array_strings_${propertyKey}_${index}`}>\n <ErrorBoundary>\n <StringPropertyPreview propertyKey={propertyKey}\n property={stringProperty}\n value={v}\n // entity={entity}\n size={size}/>\n </ErrorBoundary>\n </div>\n )}\n </div>\n );\n}\n","import React from \"react\";\nimport { resolveArrayProperty } from \"../../util\";\nimport { ResolvedProperty } from \"../../types\";\nimport { useCustomizationController } from \"../../hooks\";\nimport { PreviewSize, PropertyPreviewProps } from \"../PropertyPreviewProps\";\nimport { PropertyPreview } from \"../PropertyPreview\";\nimport { cn, defaultBorderMixin } from \"@firecms/ui\";\nimport { DEFAULT_ONE_OF_TYPE, DEFAULT_ONE_OF_VALUE } from \"../../util/common\";\nimport { ErrorBoundary } from \"../../components\";\n\n/**\n * @group Preview components\n */\nexport function ArrayOneOfPreview({\n propertyKey,\n value,\n property: inputProperty,\n size,\n // entity\n }: PropertyPreviewProps<any[]>) {\n\n const customizationController = useCustomizationController();\n const property = resolveArrayProperty({\n propertyKey,\n property: inputProperty,\n propertyValue: value,\n fields: customizationController.propertyConfigs\n });\n\n if (property?.dataType !== \"array\")\n throw Error(\"Picked wrong preview component ArrayPreview\");\n\n if (!property?.oneOf) {\n throw Error(`You need to specify an 'of' or 'oneOf' prop (or specify a custom field) in your array property ${propertyKey}`);\n }\n\n const values = value;\n\n if (!values) return null;\n\n const childSize: PreviewSize = size === \"medium\" ? \"small\" : \"tiny\";\n\n const typeField = property.oneOf.typeField ?? DEFAULT_ONE_OF_TYPE;\n const valueField = property.oneOf.valueField ?? DEFAULT_ONE_OF_VALUE;\n const properties = property.oneOf.properties;\n\n return (\n <div className={\"flex flex-col\"}>\n {values &&\n values.map((value, index) =>\n <React.Fragment\n key={\"preview_array_\" + value + \"_\" + index}>\n <div className={cn(defaultBorderMixin, \"m-1 border-b last:border-b-0\")}>\n <ErrorBoundary>\n {value && <PropertyPreview\n propertyKey={propertyKey}\n value={value[valueField]}\n // entity={entity}\n property={(property.resolvedProperties[index] ?? properties[value[typeField]]) as ResolvedProperty<any>}\n size={childSize}/>}\n </ErrorBoundary>\n </div>\n </React.Fragment>\n )}\n </div>\n );\n}\n","import React from \"react\";\n\nimport { ResolvedMapProperty } from \"../../types\";\nimport { PropertyPreviewProps } from \"../PropertyPreviewProps\";\nimport { PropertyPreview } from \"../PropertyPreview\";\nimport { cn, defaultBorderMixin, Typography } from \"@firecms/ui\";\nimport { ErrorBoundary } from \"../../components\";\nimport { EmptyValue } from \"../components/EmptyValue\";\n\n/**\n * @group Preview components\n */\nexport function MapPropertyPreview<T extends Record<string, any> = Record<string, any>>({\n propertyKey,\n value,\n property,\n // entity,\n size\n }: PropertyPreviewProps<T>) {\n\n if (property.dataType !== \"map\") {\n throw Error(\"Picked wrong preview component MapPropertyPreview\");\n }\n\n const mapProperty = property as ResolvedMapProperty;\n\n if (!mapProperty.properties || Object.keys(mapProperty.properties ?? {}).length === 0) {\n return (\n <KeyValuePreview value={value}/>\n );\n }\n\n if (!value) return null;\n\n const mapPropertyKeys: string[] = Object.keys(mapProperty.properties)\n\n if (size === \"tiny\")\n return (\n <div className=\"w-full flex flex-col space-y-1 md:space-y-2\">\n {mapPropertyKeys.map((key, index) => (\n <div key={`map_${key}`}>\n <ErrorBoundary\n key={\"map_preview_\" + mapProperty.name + key + index}>\n <PropertyPreview propertyKey={key}\n value={(value)[key]}\n property={mapProperty.properties![key]}\n // entity={entity}\n size={size}/>\n </ErrorBoundary>\n </div>\n ))}\n </div>\n );\n\n return (\n <div\n className=\"flex flex-col gap-1 w-full\">\n {mapPropertyKeys &&\n mapPropertyKeys.map((key, index) => {\n const childProperty = mapProperty.properties![key];\n return (\n <div\n key={`map_preview_table_${key}}`}\n className={cn(defaultBorderMixin, \"last:border-b-0 border-b\")}>\n <div\n className={\"flex flex-row pt-0.5 pb-0.5 gap-2\"}>\n <div\n className=\"min-w-[140px] w-[25%] py-1\">\n <Typography variant={\"caption\"}\n className={\"font-mono break-words\"}\n color={\"secondary\"}>\n {childProperty.name}\n </Typography>\n </div>\n <div\n className=\"flex-grow max-w-[75%]\">\n <ErrorBoundary>\n {!(childProperty.dataType === \"map\" || childProperty === \"array\") &&\n <PropertyPreview\n propertyKey={key}\n value={(value)[key]}\n property={childProperty}\n // entity={entity}\n size={size}/>}\n </ErrorBoundary>\n </div>\n </div>\n\n {(childProperty.dataType === \"map\" || childProperty === \"array\") &&\n <div className={cn(defaultBorderMixin, \"border-l pl-4 ml-2 my-2\")}>\n <PropertyPreview\n propertyKey={key}\n value={(value)[key]}\n property={childProperty}\n // entity={entity}\n size={size}/>\n </div>\n }\n </div>\n );\n })}\n </div>\n );\n\n}\n\nexport function KeyValuePreview({ value }: { value: any }) {\n if (typeof value !== \"object\") return null;\n if (!value) return <EmptyValue/>;\n return <div\n className=\"flex flex-col gap-1 w-full\">\n {\n Object.entries(value).map(([key, childValue]) => (\n <div\n key={`map_preview_table_${key}}`}\n className={cn(defaultBorderMixin, \"last:border-b-0 border-b\")}>\n <div\n className={\"flex flex-row pt-0.5 pb-0.5 gap-2\"}>\n <div\n key={`table-cell-title-${key}-${key}`}\n className=\"min-w-[140px] w-[25%] py-1\">\n <Typography variant={\"caption\"}\n className={\"font-mono break-words\"}\n color={\"secondary\"}>\n {key}\n </Typography>\n </div>\n <div\n className=\"flex-grow max-w-[75%]\">\n {typeof childValue !== \"object\" && <Typography>\n <ErrorBoundary>\n {childValue && childValue.toString()}\n </ErrorBoundary>\n </Typography>}\n </div>\n </div>\n {typeof childValue === \"object\" &&\n <div className={cn(defaultBorderMixin, \"border-l pl-4\")}>\n <KeyValuePreview value={childValue}/>\n </div>\n }\n </div>\n ))\n }\n </div>;\n}\n","import React from \"react\";\n\nimport { format } from \"date-fns\";\nimport * as locales from \"date-fns/locale\";\nimport { useCustomizationController } from \"../../hooks\";\nimport { defaultDateFormat } from \"../../util\";\n\n/**\n * @group Preview components\n */\nexport function DatePreview({\n date\n }: { date: Date }): React.ReactElement {\n\n const customizationController = useCustomizationController();\n // @ts-ignore\n const dateUtilsLocale = customizationController?.locale ? locales[customizationController?.locale] : undefined;\n const dateFormat: string = customizationController?.dateTimeFormat ?? defaultDateFormat;\n const formattedDate = date ? format(date, dateFormat, { locale: dateUtilsLocale }) : \"\";\n\n return (\n <>\n {formattedDate}\n </>\n );\n}\n","import React from \"react\";\nimport { Checkbox } from \"@firecms/ui\";\nimport { PreviewSize } from \"../PropertyPreviewProps\";\nimport { Property } from \"../../types\";\n\n/**\n * @group Preview components\n */\nexport function BooleanPreview({\n value,\n size,\n property\n }: {\n value: boolean,\n size: PreviewSize,\n property: Property,\n}): React.ReactElement {\n return <div className={\"flex flex-row gap-2 items-center\"}>\n <Checkbox checked={value}\n size={size}\n color={\"secondary\"}/>\n {property.name && <span className={size === \"tiny\" ? \"text-sm\" : \"\"}>{property.name}</span>}\n </div>;\n}\n","import React from \"react\";\n\nimport { EnumValuesChip, PropertyPreviewProps } from \"../../preview\";\nimport { enumToObjectEntries } from \"../../util\";\n\n/**\n * @group Preview components\n */\nexport function NumberPropertyPreview({\n value,\n property,\n size\n }: PropertyPreviewProps<number>): React.ReactElement {\n\n if (property.enumValues) {\n const enumKey = value;\n const enumValues = enumToObjectEntries(property.enumValues);\n if (!enumValues)\n return <>{value}</>;\n return <EnumValuesChip\n enumKey={enumKey}\n enumValues={enumValues}\n size={size !== \"medium\" ? \"small\" : \"medium\"}/>;\n } else {\n return <>{value}</>;\n }\n}\n","import React, { createElement } from \"react\";\nimport equal from \"react-fast-compare\"\n\nimport {\n CMSType,\n EntityReference,\n ResolvedArrayProperty,\n ResolvedMapProperty,\n ResolvedNumberProperty,\n ResolvedStringProperty\n} from \"../types\";\n\nimport { resolveProperty } from \"../util\";\n\nimport { PropertyPreviewProps } from \"./PropertyPreviewProps\";\nimport { useCustomizationController } from \"../hooks\";\nimport { EmptyValue } from \"./components/EmptyValue\";\nimport { UrlComponentPreview } from \"./components/UrlComponentPreview\";\nimport { StorageThumbnail } from \"./components/StorageThumbnail\";\nimport { Markdown } from \"@firecms/ui\";\nimport { StringPropertyPreview } from \"./property_previews/StringPropertyPreview\";\nimport { ArrayPropertyPreview } from \"./property_previews/ArrayPropertyPreview\";\nimport { ArrayOfReferencesPreview } from \"./property_previews/ArrayOfReferencesPreview\";\nimport { ArrayOfStorageComponentsPreview } from \"./property_previews/ArrayOfStorageComponentsPreview\";\nimport { ArrayPropertyEnumPreview } from \"./property_previews/ArrayPropertyEnumPreview\";\nimport { ArrayOfStringsPreview } from \"./property_previews/ArrayOfStringsPreview\";\nimport { ArrayOneOfPreview } from \"./property_previews/ArrayOneOfPreview\";\nimport { MapPropertyPreview } from \"./property_previews/MapPropertyPreview\";\nimport { ReferencePreview } from \"./components/ReferencePreview\";\nimport { DatePreview } from \"./components/DatePreview\";\nimport { BooleanPreview } from \"./components/BooleanPreview\";\nimport { NumberPropertyPreview } from \"./property_previews/NumberPropertyPreview\";\nimport { ErrorView } from \"../components\";\n\n/**\n * @group Preview components\n */\nexport const PropertyPreview = React.memo(function PropertyPreview<T extends CMSType>(props: PropertyPreviewProps<T>) {\n\n const customizationController = useCustomizationController();\n\n let content: React.ReactNode | any;\n const {\n property: inputProperty,\n propertyKey,\n value,\n size,\n height,\n width,\n // entity\n } = props;\n\n const property = resolveProperty({\n propertyKey,\n propertyOrBuilder: inputProperty,\n propertyValue: value,\n fields: customizationController.propertyConfigs\n });\n\n if (value === undefined || property === null) {\n content = <EmptyValue/>;\n } else if (property.Preview) {\n content = createElement(property.Preview as React.ComponentType<PropertyPreviewProps>,\n {\n propertyKey,\n value,\n property,\n size,\n height,\n width,\n // entity,\n customProps: property.customProps\n });\n } else if (value === null) {\n content = <EmptyValue/>;\n } else if (property.dataType === \"string\") {\n const stringProperty = property as ResolvedStringProperty;\n if (typeof value === \"string\") {\n if (stringProperty.url) {\n if (typeof stringProperty.url === \"boolean\")\n content =\n <UrlComponentPreview size={props.size}\n url={value}/>;\n else if (typeof stringProperty.url === \"string\")\n content =\n <UrlComponentPreview size={props.size}\n url={value}\n previewType={stringProperty.url}/>;\n } else if (stringProperty.storage) {\n content = <StorageThumbnail\n storeUrl={property.storage?.storeUrl ?? false}\n size={props.size}\n storagePathOrDownloadUrl={value}/>;\n } else if (stringProperty.markdown) {\n content = <Markdown source={value}/>;\n } else {\n content = <StringPropertyPreview {...props}\n property={stringProperty}\n value={value}/>;\n }\n } else {\n content = buildWrongValueType(propertyKey, property.dataType, value);\n }\n } else if (property.dataType === \"array\") {\n if (value instanceof Array) {\n const arrayProperty = property as ResolvedArrayProperty;\n if (!arrayProperty.of && !arrayProperty.oneOf) {\n throw Error(`You need to specify an 'of' or 'oneOf' prop (or specify a custom field) in your array property ${propertyKey}`);\n }\n\n if (arrayProperty.of) {\n if (Array.isArray(arrayProperty.of)) {\n content = <ArrayPropertyPreview {...props}\n value={value}\n property={property as ResolvedArrayProperty}/>;\n }\n // else if (arrayProperty.of.dataType === \"map\") {\n // content =\n // <ArrayOfMapsPreview propertyKey={propertyKey}\n // property={property as ResolvedArrayProperty}\n // value={value as Record<string, any>[]} // This might be wrong\n // entity={entity}\n // size={size}\n // />;\n // }\n else if (arrayProperty.of.dataType === \"reference\") {\n content = <ArrayOfReferencesPreview {...props}\n value={value}\n property={property as ResolvedArrayProperty}/>;\n } else if (arrayProperty.of.dataType === \"string\") {\n if (arrayProperty.of.enumValues) {\n content = <ArrayPropertyEnumPreview\n {...props}\n value={value as string[]}\n property={property as ResolvedArrayProperty}/>;\n } else if (arrayProperty.of.storage) {\n content = <ArrayOfStorageComponentsPreview\n {...props}\n value={value}\n property={property as ResolvedArrayProperty}/>;\n } else {\n content = <ArrayOfStringsPreview\n {...props}\n value={value as string[]}\n property={property as ResolvedArrayProperty}/>;\n }\n } else if (arrayProperty.of.dataType === \"number\" && arrayProperty.of.enumValues) {\n content = <ArrayPropertyEnumPreview\n {...props}\n value={value as string[]}\n property={property as ResolvedArrayProperty}/>;\n } else {\n content = <ArrayPropertyPreview {...props}\n value={value}\n property={property as ResolvedArrayProperty}/>;\n }\n } else if (arrayProperty.oneOf) {\n content = <ArrayOneOfPreview {...props}\n value={value}\n property={property as ResolvedArrayProperty}/>;\n }\n } else {\n content = buildWrongValueType(propertyKey, property.dataType, value);\n }\n } else if (property.dataType === \"map\") {\n if (typeof value === \"object\") {\n content =\n <MapPropertyPreview {...props}\n property={property as ResolvedMapProperty}/>;\n } else {\n content = buildWrongValueType(propertyKey, property.dataType, value);\n }\n } else if (property.dataType === \"date\") {\n if (value instanceof Date) {\n content = <DatePreview date={value}/>;\n } else {\n content = buildWrongValueType(propertyKey, property.dataType, value);\n }\n } else if (property.dataType === \"reference\") {\n if (typeof property.path === \"string\") {\n if (typeof value === \"object\" && \"isEntityReference\" in value && value.isEntityReference()) {\n content = <ReferencePreview\n disabled={!property.path}\n previewProperties={property.previewProperties}\n size={props.size}\n // onClick={props.onClick}\n reference={value as EntityReference}\n />;\n } else {\n content = buildWrongValueType(propertyKey, property.dataType, value);\n }\n } else {\n content = <EmptyValue/>;\n }\n\n } else if (property.dataType === \"boolean\") {\n if (typeof value === \"boolean\") {\n content = <BooleanPreview value={value} size={size} property={property}/>;\n } else {\n content = buildWrongValueType(propertyKey, property.dataType, value);\n }\n } else if (property.dataType === \"number\") {\n if (typeof value === \"number\") {\n content = <NumberPropertyPreview {...props}\n value={value}\n property={property as ResolvedNumberProperty}/>;\n } else {\n content = buildWrongValueType(propertyKey, property.dataType, value);\n }\n } else {\n content = JSON.stringify(value);\n }\n\n return content === undefined || content === null || (Array.isArray(content) && content.length === 0)\n ? <EmptyValue/>\n : content;\n}, equal);\n\nfunction buildWrongValueType(name: string | undefined, dataType: string, value: any) {\n console.warn(`Unexpected value for property ${name}, of type ${dataType}`, value);\n return (\n <ErrorView title={\"Unexpected value\"}\n error={`${JSON.stringify(value)}`}/>\n );\n}\n","import React from \"react\";\nimport { ErrorBoundary } from \"../../components\";\nimport { useCustomizationController } from \"../../hooks\";\nimport { PropertyPreviewProps } from \"../PropertyPreviewProps\";\nimport { PropertyPreview } from \"../PropertyPreview\";\nimport { resolveArrayProperty } from \"../../util\";\n\n/**\n * @group Preview components\n */\nexport function ArrayOfMapsPreview({\n propertyKey,\n value,\n property: inputProperty,\n size,\n // entity\n }: PropertyPreviewProps<Record<string, any>[]>) {\n\n const customizationController = useCustomizationController();\n const property = resolveArrayProperty({\n propertyKey,\n property: inputProperty,\n propertyValue: value,\n fields: customizationController.propertyConfigs\n });\n\n if (Array.isArray(property?.of)) {\n throw Error(\"Using array properties instead of single one in `of` in ArrayProperty\");\n }\n\n if (property?.dataType !== \"array\" || !property.of || property.of.dataType !== \"map\")\n throw Error(\"Picked wrong preview component ArrayOfMapsPreview\");\n\n const mapProperty = property.of;\n const properties = mapProperty.properties;\n if (!properties) {\n throw Error(`You need to specify a 'properties' prop (or specify a custom field) in your map property ${propertyKey}`);\n }\n const values = value;\n const previewProperties: string[] | undefined = mapProperty.previewProperties;\n\n if (!values) return null;\n\n let mapProperties = previewProperties;\n if (!mapProperties || !mapProperties.length) {\n mapProperties = Object.keys(properties);\n if (size)\n mapProperties = mapProperties.slice(0, 3);\n }\n\n return (\n <div className=\"table-auto text-xs\">\n <div>\n {values &&\n values.map((v, index) => {\n return (\n <div key={`table_${v}_${index}`}\n className=\"border-b last:border-b-0\">\n {mapProperties && mapProperties.map(\n (key) => (\n <div\n key={`table-cell-${key as string}`}\n className=\"table-cell\"\n >\n <ErrorBoundary>\n <PropertyPreview\n propertyKey={key as string}\n value={(v)[key]}\n property={properties[key as string]}\n // entity={entity}\n size={\"small\"}/>\n </ErrorBoundary>\n </div>\n )\n )}\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n","import * as React from \"react\";\nimport { useEffect, useState } from \"react\";\nimport { Skeleton } from \"@firecms/ui\";\n\nexport interface AsyncPreviewComponentProps {\n builder: Promise<React.ReactNode>;\n}\n\n/**\n * Utility component used to render the result of an async execution.\n * It shows a loading indicator while at it.\n *\n * @group Preview components\n */\nexport const AsyncPreviewComponent = React.memo(function AsyncPreviewComponentInternal<M extends Record<string, any>>(\n {\n builder\n }: AsyncPreviewComponentProps) {\n\n const [loading, setLoading] = useState<boolean>(true);\n const [result, setResult] = useState<React.ReactNode>(null);\n\n useEffect(() => {\n let unmounted = false;\n builder\n .then((res) => {\n if (!unmounted) {\n setLoading(false);\n setResult(res);\n }\n })\n .catch(error => {\n setLoading(false);\n console.error(error);\n });\n return () => {\n unmounted = true;\n };\n }, [builder]);\n\n if (loading)\n return <Skeleton/>;\n\n return <React.Fragment>{result}</React.Fragment>;\n\n }\n);\n","import React, { useMemo } from \"react\";\nimport { PropertyPreview } from \"../preview\";\nimport { Entity, EntityCollection, ResolvedEntityCollection, ResolvedProperties } from \"../types\";\nimport { resolveCollection } from \"../util\";\nimport { cn, defaultBorderMixin, IconButton, OpenInNewIcon } from \"@firecms/ui\";\nimport { CustomizationController } from \"../types/customization_controller\";\nimport { useCustomizationController } from \"../hooks/useCustomizationController\";\n\n/**\n * @group Components\n */\nexport interface EntityViewProps<M extends Record<string, any>> {\n entity: Entity<M>;\n collection: EntityCollection<M>;\n path: string;\n className?: string;\n}\n\nexport function EntityView<M extends Record<string, any>>(\n {\n entity,\n collection,\n path,\n className\n }: EntityViewProps<M>) {\n\n const customizationController: CustomizationController = useCustomizationController();\n const resolvedCollection: ResolvedEntityCollection<M> = useMemo(() => resolveCollection<M>({\n collection,\n path,\n entityId: entity.id,\n values: entity.values,\n fields: customizationController.propertyConfigs\n }), [collection, path, entity]);\n\n const properties: ResolvedProperties = resolvedCollection.properties;\n\n return (\n <div className={\"w-full \" + className}>\n <div className={\"w-full mb-4\"}>\n <div className={cn(defaultBorderMixin, \"flex justify-between py-2 border-b last:border-b-0\")}>\n <div className=\"flex items-center w-1/4\">\n <span className=\"pl-2 text-sm text-gray-600\">Id</span>\n </div>\n <div\n className=\"flex-grow p-2 ml-2 w-3/4 text-gray-900 dark:text-white min-h-[56px] flex items-center\">\n <span className=\"flex-grow mr-2\">{entity.id}</span>\n {customizationController?.entityLinkBuilder &&\n <a href={customizationController.entityLinkBuilder({ entity })}\n rel=\"noopener noreferrer\"\n target=\"_blank\">\n <IconButton>\n <OpenInNewIcon\n size={\"small\"}/>\n </IconButton>\n </a>}\n </div>\n </div>\n {Object.entries(properties)\n .map(([key, property]) => {\n const value = (entity.values)[key];\n return (\n <div\n key={`reference_previews_${key}`}\n className={cn(defaultBorderMixin, \"flex justify-between py-2 border-b last:border-b-0\")}>\n <div className=\"flex items-center w-1/4\">\n <span className=\"pl-2 text-sm text-gray-600\">{property.name}</span>\n </div>\n <div\n className=\"flex-grow p-2 ml-2 w-3/4 text-gray-900 dark:text-white min-h-[56px] flex items-center\">\n <PropertyPreview\n propertyKey={key}\n value={value}\n // entity={entity}\n property={property}\n size={\"medium\"}/>\n </div>\n </div>\n )\n })}\n </div>\n </div>\n );\n}\n","import React, { useEffect, useRef, useState } from \"react\";\n\nimport { useDebouncedCallback } from \"../../../util\";\nimport { TextareaAutosize } from \"@firecms/ui\";\n\nexport function VirtualTableInput(props: {\n error: Error | undefined;\n value: string;\n multiline: boolean;\n focused: boolean;\n disabled: boolean;\n updateValue: (newValue: (string | null)) => void;\n}) {\n\n const ref = React.useRef<HTMLTextAreaElement>(null);\n\n const {\n disabled,\n value,\n multiline,\n updateValue,\n focused\n } = props;\n\n const prevValue = useRef<string | null>(value);\n\n const [internalValue, setInternalValue] = useState<typeof value>(value);\n const focusedState = useRef<boolean>(false);\n\n useEffect(() => {\n if (prevValue.current !== value && value !== internalValue)\n setInternalValue(value);\n prevValue.current = value;\n }, [value]);\n\n const doUpdate = React.useCallback(() => {\n const emptyInitialValue = !value;\n if (emptyInitialValue && !internalValue)\n return;\n if (internalValue !== value) {\n prevValue.current = internalValue;\n updateValue(internalValue);\n }\n }, [internalValue, updateValue, value]);\n\n useDebouncedCallback(internalValue, doUpdate, !focused, 2000);\n\n useEffect(() => {\n if (ref.current && focused && !focusedState.current) {\n focusedState.current = true;\n ref.current.focus({ preventScroll: true });\n ref.current.selectionStart = ref.current.value.length;\n ref.current.selectionEnd = ref.current.value.length;\n } else {\n focusedState.current = focused;\n }\n }, [focused, ref]);\n\n return (\n <TextareaAutosize\n ref={ref}\n style={{\n padding: 0,\n margin: 0,\n width: \"100%\",\n color: \"unset\",\n fontWeight: \"unset\",\n lineHeight: \"unset\",\n fontSize: \"unset\",\n fontFamily: \"unset\",\n background: \"unset\",\n border: \"unset\",\n resize: \"none\",\n outline: \"none\"\n }}\n value={internalValue ?? \"\"}\n onChange={(evt) => {\n const newValue = evt.target.value as string;\n if (multiline || !newValue.endsWith(\"\\n\"))\n setInternalValue(newValue);\n }}\n onFocus={() => {\n focusedState.current = true;\n }}\n onBlur={() => {\n focusedState.current = false;\n doUpdate();\n }}\n />\n );\n}\n","import { EnumValueConfig } from \"../../../types\";\nimport { ArrayEnumPreview, EnumValuesChip } from \"../../../preview\";\nimport React, { useCallback, useEffect } from \"react\";\nimport { MultiSelect, MultiSelectItem, Select, SelectItem } from \"@firecms/ui\";\n\nexport function VirtualTableSelect(props: {\n name: string;\n enumValues: EnumValueConfig[];\n error: Error | undefined;\n multiple: boolean;\n disabled: boolean;\n small: boolean;\n internalValue: string | number | string[] | number[] | undefined;\n valueType: \"string\" | \"number\";\n updateValue: (newValue: (string | number | string[] | number[] | null)) => void;\n focused: boolean;\n onBlur?: React.FocusEventHandler<HTMLInputElement | HTMLTextAreaElement>;\n}) {\n\n const {\n name,\n enumValues,\n error,\n internalValue,\n disabled,\n small,\n focused,\n updateValue,\n multiple,\n valueType\n } = props;\n\n const validValue = (Array.isArray(internalValue) && multiple) ||\n (!Array.isArray(internalValue) && !multiple);\n\n const ref = React.useRef<HTMLButtonElement>(null);\n useEffect(() => {\n if (ref.current && focused) {\n ref.current?.focus({ preventScroll: true });\n }\n }, [focused, ref]);\n\n const onChange = useCallback((updatedValue: string | string[]) => {\n if (valueType === \"number\") {\n if (multiple) {\n const newValue = (updatedValue as string[]).map((v) => parseFloat(v));\n updateValue(newValue);\n } else {\n updateValue(parseFloat(updatedValue as string));\n }\n } else if (valueType === \"string\") {\n if (!updatedValue)\n updateValue(null)\n else\n updateValue(updatedValue);\n } else {\n throw Error(\"Missing mapping in TableSelect\");\n }\n }, [multiple, updateValue, valueType]);\n\n const renderValue = (enumKey: string | number, index: number) => {\n if (multiple && Array.isArray(enumKey)) {\n return <ArrayEnumPreview\n key={`${enumKey}-${index}`}\n value={enumKey}\n name={name}\n enumValues={enumValues}\n size={small ? \"small\" : \"medium\"}/>;\n } else {\n return <EnumValuesChip\n key={`${enumKey}-${index}`}\n enumKey={enumKey}\n enumValues={enumValues}\n size={small ? \"small\" : \"medium\"}/>;\n }\n };\n return (\n multiple\n ? <MultiSelect\n inputRef={ref}\n containerClassName=\"w-full h-full\"\n className=\"w-full h-full p-0 bg-transparent\"\n position={\"item-aligned\"}\n disabled={disabled}\n padding={false}\n includeFocusOutline={false}\n value={validValue\n ? ((internalValue as any[]).map(v => v.toString()))\n : ([])}\n onMultiValueChange={onChange}\n renderValue={renderValue}>\n {enumValues?.map((enumConfig) => (\n <MultiSelectItem\n key={enumConfig.id}\n value={String(enumConfig.id)}>\n <EnumValuesChip\n enumKey={enumConfig.id}\n enumValues={enumValues}\n size={small ? \"small\" : \"medium\"}/>\n </MultiSelectItem>\n ))}\n </MultiSelect>\n : <Select\n inputRef={ref}\n className=\"w-full h-full p-0 bg-transparent\"\n position={\"item-aligned\"}\n disabled={disabled}\n multiple={multiple}\n padding={false}\n includeFocusOutline={false}\n value={validValue\n ? (multiple ? (internalValue as any[]).map(v => v.toString()) : internalValue?.toString())\n : (multiple ? [] : \"\")}\n onValueChange={onChange}\n onMultiValueChange={onChange}\n renderValue={renderValue}>\n {enumValues?.map((enumConfig) => (\n <SelectItem\n key={enumConfig.id}\n value={String(enumConfig.id)}>\n <EnumValuesChip\n enumKey={enumConfig.id}\n enumValues={enumValues}\n size={small ? \"small\" : \"medium\"}/>\n </SelectItem>\n ))}\n </Select>\n\n );\n}\n","import React, { useEffect, useRef, useState } from \"react\";\nimport { useDebouncedCallback } from \"../../../util\";\n\nexport function VirtualTableNumberInput(props: {\n error: Error | undefined;\n value: number;\n align: \"right\" | \"left\" | \"center\";\n updateValue: (newValue: (number | null)) => void;\n focused: boolean;\n disabled: boolean;\n}) {\n\n const {\n align,\n value,\n updateValue,\n focused,\n } = props;\n const propStringValue = (value && typeof value === \"number\") ? value.toString() : \"\";\n const [internalValue, setInternalValue] = useState<string | null>(propStringValue);\n\n const prevValue = useRef<number | null>(value);\n\n useEffect(() => {\n if (prevValue.current !== value && String(value) !== internalValue)\n setInternalValue(value ? value.toString() : null);\n prevValue.current = value;\n }, [value]);\n\n const doUpdate = React.useCallback(() => {\n if (internalValue !== propStringValue) {\n if (internalValue !== undefined && internalValue !== null) {\n const numberValue = parseFloat(internalValue);\n if (isNaN(numberValue))\n return;\n if (numberValue !== undefined && numberValue !== null)\n updateValue(numberValue);\n } else {\n updateValue(null);\n }\n }\n\n }, [internalValue, value]);\n\n useDebouncedCallback(internalValue, doUpdate, !focused, 2000);\n\n useEffect(\n () => {\n if (!focused && propStringValue !== internalValue)\n setInternalValue(value !== undefined && value !== null ? value.toString() : null);\n },\n [value, focused]\n );\n\n const ref = React.useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (ref.current && focused) {\n ref.current.focus({ preventScroll: true });\n }\n }, [focused, ref]);\n\n const regexp = /^-?[0-9]+[,.]?[0-9]*$/;\n\n return (\n <input\n ref={ref}\n className=\"w-full text-right p-0 m-0 bg-transparent border-none resize-none outline-none font-normal leading-normal text-unset\"\n style={{\n textAlign: align\n }}\n value={internalValue ?? \"\"}\n onChange={(evt) => {\n const newValue = evt.target.value.replace(\",\", \".\");\n if (newValue.length === 0)\n setInternalValue(null);\n if (regexp.test(newValue) || newValue.startsWith(\"-\"))\n setInternalValue(newValue);\n }}\n />\n );\n}\n","import React, { useEffect } from \"react\";\nimport { BooleanSwitch } from \"@firecms/ui\";\n\nexport function VirtualTableSwitch(props: {\n error: Error | undefined;\n internalValue?: boolean;\n focused: boolean;\n disabled: boolean;\n updateValue: (newValue: (boolean | null)) => void;\n}) {\n const {\n internalValue,\n updateValue,\n focused\n } = props;\n const ref = React.useRef<HTMLButtonElement>(null);\n\n useEffect(() => {\n if (ref.current && focused) {\n ref.current.focus({ preventScroll: true });\n }\n }, [focused, ref]);\n\n return (\n <BooleanSwitch\n ref={ref}\n size={\"small\"}\n value={Boolean(internalValue)}\n onValueChange={updateValue}\n />\n );\n}\n","import React from \"react\";\nimport { DateTimeField } from \"@firecms/ui\";\nimport { useCustomizationController } from \"../../../hooks\";\n\nexport function VirtualTableDateField(props: {\n name: string;\n error: Error | undefined;\n mode?: \"date\" | \"date_time\";\n internalValue: Date | undefined | null;\n updateValue: (newValue: (Date | null)) => void;\n focused: boolean;\n disabled: boolean;\n onBlur?: React.FocusEventHandler<HTMLInputElement | HTMLTextAreaElement>;\n}) {\n\n const { locale } = useCustomizationController();\n const {\n disabled,\n error,\n mode,\n internalValue,\n updateValue\n } = props;\n\n return (\n <DateTimeField\n value={internalValue ?? undefined}\n onChange={(dateValue) => updateValue(dateValue)}\n size={\"medium\"}\n invisible={true}\n className={\"w-full h-full\"}\n inputClassName={\"w-full h-full\"}\n mode={mode}\n locale={locale}\n />\n );\n}\n","import React, { ErrorInfo, PropsWithChildren } from \"react\";\n\nimport { ErrorIcon, Typography } from \"@firecms/ui\";\n\nexport class ErrorBoundary extends React.Component<PropsWithChildren<Record<string, unknown>>, {\n error: Error | null\n}> {\n constructor(props: any) {\n super(props);\n this.state = { error: null };\n }\n\n // eslint-disable-next-line n/handle-callback-err\n static getDerivedStateFromError(error: Error) {\n return { error };\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo) {\n console.error(error);\n // logErrorToMyService(error, errorInfo);\n }\n\n render() {\n if (this.state.error) {\n return (\n <div className=\"flex flex-col m-2\">\n <div className=\"flex items-center m-2\">\n <ErrorIcon color={\"error\"} size={\"small\"}/>\n <div className=\"ml-4\">Error</div>\n </div>\n <Typography variant={\"caption\"}>\n {this.state.error?.message ?? \"See the error in the console\"}\n </Typography>\n </div>\n );\n }\n\n return this.props.children;\n }\n}\n","import {\n EntityValues,\n ResolvedArrayProperty,\n ResolvedStringProperty,\n StorageConfig,\n UploadedFileContext\n} from \"../types\";\nimport { randomString } from \"./strings\";\n\nexport async function resolveFilenameString<M extends object>(\n input: string | ((context: UploadedFileContext) => Promise<string> | string),\n storage: StorageConfig,\n values: EntityValues<M>,\n entityId: string,\n path: string,\n property: ResolvedStringProperty | ResolvedArrayProperty<string[]>,\n file: File,\n propertyKey: string): Promise<string> {\n let result;\n if (typeof input === \"function\") {\n result = await input({\n path,\n entityId,\n values,\n property,\n file,\n storage,\n propertyKey\n });\n if (!result)\n console.warn(\"Storage callback returned empty result. Using default name value\")\n } else {\n result = replacePlaceholders(file, input, entityId, propertyKey, path);\n }\n\n if (!result)\n result = randomString() + \"_\" + file.name;\n\n return result;\n}\n\nexport function resolveStoragePathString<M extends object>(\n input: string | ((context: UploadedFileContext) => string),\n storage: StorageConfig,\n values: EntityValues<M>,\n entityId: string,\n path: string,\n property: ResolvedStringProperty | ResolvedArrayProperty<string[]>,\n file: File,\n propertyKey: string): string {\n let result;\n if (typeof input === \"function\") {\n result = input({\n path,\n entityId,\n values,\n property,\n file,\n storage,\n propertyKey\n });\n if (!result)\n console.warn(\"Storage callback returned empty result. Using default name value\")\n } else {\n result = replacePlaceholders(file, input, entityId, propertyKey, path);\n }\n\n if (!result)\n result = randomString() + \"_\" + file.name;\n\n return result;\n}\n\nfunction replacePlaceholders(file: File, input: string, entityId: string, propertyKey: string, path: string) {\n const ext = file.name.split(\".\").pop();\n let result = input.replace(\"{entityId}\", entityId)\n .replace(\"{propertyKey}\", propertyKey)\n .replace(\"{rand}\", randomString())\n .replace(\"{file}\", file.name)\n .replace(\"{file.type}\", file.type)\n .replace(\"{path}\", path);\n if (ext) {\n result = result.replace(\"{file.ext}\", ext);\n const name = file.name.replace(`.${ext}`, \"\");\n result = result.replace(\"{file.name}\", name)\n }\n\n if (!result)\n result = randomString() + \"_\" + file.name;\n\n return result;\n}\n","import Resizer from \"react-image-file-resizer\";\nimport equal from \"react-fast-compare\";\n\nimport {\n EntityValues,\n ImageCompression,\n Property,\n ResolvedArrayProperty,\n ResolvedStringProperty,\n StorageConfig,\n StorageSource,\n StringProperty\n} from \"../types\";\nimport { useCallback, useEffect, useState } from \"react\";\nimport { PreviewSize } from \"../preview\";\nimport { randomString } from \"./strings\";\nimport { resolveFilenameString, resolveStoragePathString } from \"./storage\";\n\n/**\n * Internal representation of an item in the storage\n * It can have two states, having a storagePathOrDownloadUrl set,\n * which means the file has been uploaded, and it is rendered as a preview\n * Or have a pending file being uploaded.\n */\nexport interface StorageFieldItem {\n id: number; // generated on the fly for internal use only\n storagePathOrDownloadUrl?: string;\n file?: File;\n fileName?: string;\n metadata?: any,\n size: PreviewSize\n}\n\nexport function useStorageUploadController<M extends object>({\n entityId,\n entityValues,\n path,\n value,\n property,\n propertyKey,\n storageSource,\n disabled,\n onChange\n }:\n {\n entityId: string,\n entityValues: EntityValues<M>,\n value: string | string[] | null;\n path: string,\n propertyKey: string,\n property: ResolvedStringProperty | ResolvedArrayProperty<string[]>,\n storageSource: StorageSource,\n disabled: boolean,\n onChange: (value: string | string[] | null) => void\n }) {\n\n const storage: StorageConfig | undefined = property.dataType === \"string\"\n ? property.storage\n : property.dataType === \"array\" &&\n (property.of as Property).dataType === \"string\"\n ? (property.of as StringProperty).storage\n : undefined;\n\n const multipleFilesSupported = property.dataType === \"array\";\n\n if (!storage)\n throw Error(\"Storage meta must be specified\");\n\n const metadata: Record<string, any> | undefined = storage?.metadata;\n const size = multipleFilesSupported ? \"small\" : \"medium\";\n\n const compression: ImageCompression | undefined = storage?.imageCompression;\n\n const internalInitialValue: StorageFieldItem[] =\n (multipleFilesSupported\n ? (value ?? []) as string[]\n : value ? [value as string] : []).map(entry => (\n {\n id: getRandomId(),\n storagePathOrDownloadUrl: entry,\n metadata,\n size\n }\n ));\n\n const [initialValue, setInitialValue] = useState<string | string[] | null>(value);\n const [internalValue, setInternalValue] = useState<StorageFieldItem[]>(internalInitialValue);\n\n useEffect(() => {\n if (!equal(initialValue, value)) {\n setInitialValue(value);\n setInternalValue(internalInitialValue);\n }\n }, [internalInitialValue, value, initialValue]);\n\n const fileNameBuilder = useCallback(async (file: File) => {\n if (storage.fileName) {\n const fileName = await resolveFilenameString(storage.fileName, storage, entityValues, entityId, path, property, file, propertyKey);\n if (!fileName || fileName.length === 0) {\n throw Error(\"You need to return a valid filename\");\n }\n return fileName;\n }\n return randomString() + \"_\" + file.name;\n }, [entityId, entityValues, path, property, propertyKey, storage]);\n\n const storagePathBuilder = useCallback((file: File) => {\n return resolveStoragePathString(storage.storagePath, storage, entityValues, entityId, path, property, file, propertyKey) ?? \"/\";\n }, [entityId, entityValues, path, property, propertyKey, storage]);\n\n const onFileUploadComplete = useCallback(async (uploadedPath: string,\n entry: StorageFieldItem,\n metadata?: any) => {\n\n console.debug(\"onFileUploadComplete\", uploadedPath, entry);\n\n let uploadPathOrDownloadUrl: string | null = uploadedPath;\n if (storage.storeUrl) {\n uploadPathOrDownloadUrl = (await storageSource.getDownloadURL(uploadedPath)).url;\n }\n if (storage.postProcess && uploadPathOrDownloadUrl) {\n uploadPathOrDownloadUrl = await storage.postProcess(uploadPathOrDownloadUrl);\n }\n\n if (!uploadPathOrDownloadUrl) {\n console.warn(\"uploadPathOrDownloadUrl is null\")\n return;\n }\n\n let newValue: StorageFieldItem[];\n\n entry.storagePathOrDownloadUrl = uploadPathOrDownloadUrl;\n entry.metadata = metadata;\n newValue = [...internalValue];\n\n newValue = removeDuplicates(newValue);\n setInternalValue(newValue);\n\n const fieldValue = newValue\n .filter(e => !!e.storagePathOrDownloadUrl)\n .map(e => e.storagePathOrDownloadUrl as string);\n\n if (multipleFilesSupported) {\n onChange(fieldValue);\n } else {\n onChange(fieldValue ? fieldValue[0] : null);\n }\n }, [internalValue, multipleFilesSupported, onChange, storage, storageSource]);\n\n const onFilesAdded = useCallback(async (acceptedFiles: File[]) => {\n\n if (!acceptedFiles.length || disabled)\n return;\n\n let newInternalValue: StorageFieldItem[];\n if (multipleFilesSupported) {\n newInternalValue = [...internalValue,\n ...(await Promise.all(acceptedFiles.map(async file => {\n if (compression && compressionFormat(file)) {\n file = await resizeAndCompressImage(file, compression)\n }\n\n return {\n id: getRandomId(),\n file,\n fileName: await fileNameBuilder(file),\n metadata,\n size\n } as StorageFieldItem;\n })))];\n } else {\n let file = acceptedFiles[0]\n if (compression && compressionFormat(file)) {\n file = await resizeAndCompressImage(file, compression)\n }\n\n newInternalValue = [{\n id: getRandomId(),\n file,\n fileName: await fileNameBuilder(file),\n metadata,\n size\n }];\n }\n\n // Remove either storage path or file duplicates\n newInternalValue = removeDuplicates(newInternalValue);\n setInternalValue(newInternalValue);\n }, [disabled, fileNameBuilder, internalValue, metadata, multipleFilesSupported, size]);\n\n return {\n internalValue,\n setInternalValue,\n storage,\n fileNameBuilder,\n storagePathBuilder,\n onFileUploadComplete,\n onFilesAdded,\n multipleFilesSupported\n }\n}\n\nfunction removeDuplicates(items: StorageFieldItem[]) {\n return items.filter(\n (item, i) => {\n return ((items.map((v) => v.storagePathOrDownloadUrl).indexOf(item.storagePathOrDownloadUrl) === i) || !item.storagePathOrDownloadUrl) &&\n ((items.map((v) => v.file).indexOf(item.file) === i) || !item.file);\n }\n );\n}\n\nfunction getRandomId() {\n return Math.floor(Math.random() * Math.floor(Number.MAX_SAFE_INTEGER));\n}\n\nconst supportedTypes: Record<string, string> = {\n \"image/jpeg\": \"JPEG\",\n \"image/png\": \"PNG\",\n \"image/webp\": \"WEBP\"\n}\nconst compressionFormat = (file: File) => supportedTypes[file.type] ? supportedTypes[file.type] : null;\n\nconst defaultQuality = 100;\nconst resizeAndCompressImage = (file: File, compression: ImageCompression) => new Promise<File>((resolve) => {\n\n const inputQuality = compression.quality === undefined ? defaultQuality : compression.quality;\n const quality = inputQuality >= 0 ? inputQuality <= 100 ? inputQuality : 100 : 100;\n\n const format = compressionFormat(file);\n if (!format) {\n throw Error(\"resizeAndCompressImage: Unsupported image format\");\n }\n Resizer.imageFileResizer(\n file,\n compression.maxWidth || Number.MAX_VALUE,\n compression.maxHeight || Number.MAX_VALUE,\n format,\n quality,\n 0,\n (file: string | Blob | File | ProgressEvent<FileReader>) => resolve(file as File),\n \"file\"\n )\n});\n","import React, { useCallback } from \"react\";\n\nimport { useSnackbarController, useStorageSource } from \"../../hooks\";\nimport { StorageFieldItem } from \"../../util/useStorageUploadController\";\nimport { ErrorView } from \"../../components\";\nimport { cn, paperMixin, Skeleton } from \"@firecms/ui\";\nimport { EntityCollection, StorageSource } from \"../../types\";\n\nexport interface StorageUploadItemProps {\n storagePath: string;\n metadata?: any,\n entry: StorageFieldItem,\n onFileUploadComplete: (value: string,\n entry: StorageFieldItem,\n metadata?: any) => Promise<void>;\n imageSize: number;\n simple: boolean;\n}\n\nexport function StorageUploadProgress({\n storagePath,\n entry,\n metadata,\n onFileUploadComplete,\n imageSize,\n simple,\n }: StorageUploadItemProps) {\n\n const storageSource = useStorageSource();\n\n const snackbarController = useSnackbarController();\n\n const [error, setError] = React.useState<Error | undefined>();\n const [loading, setLoading] = React.useState<boolean>(false);\n const mounted = React.useRef(false);\n const uploading = React.useRef(false);\n\n const upload = useCallback((file: File, fileName?: string) => {\n\n if (uploading.current) return;\n uploading.current = true;\n setError(undefined);\n setLoading(true);\n\n storageSource.uploadFile({\n file,\n fileName,\n path: storagePath,\n metadata\n })\n .then(async ({ path }) => {\n console.debug(\"Upload successful\");\n await onFileUploadComplete(path, entry, metadata);\n if (mounted.current)\n setLoading(false);\n })\n .catch((e) => {\n console.warn(\"Upload error\", e);\n if (mounted.current) {\n setError(e);\n setLoading(false);\n snackbarController.open({\n type: \"error\",\n message: \"Error uploading file: \" + e.message\n });\n }\n })\n .finally(() => {\n uploading.current = false;\n });\n }, [entry, metadata, onFileUploadComplete, storageSource, storagePath]);\n\n React.useEffect(() => {\n mounted.current = true;\n if (entry.file)\n upload(entry.file, entry.fileName);\n return () => {\n mounted.current = false;\n };\n }, [entry.file, entry.fileName, upload]);\n\n if (simple) {\n return <div className={`m-4 w-${imageSize} h-${imageSize}`}>\n\n {loading && <Skeleton className={`w-${imageSize} h-${imageSize}`}/>}\n\n </div>\n }\n return (\n\n <div className={cn(paperMixin,\n \"relative m-4 border-box flex items-center justify-center\",\n `min-w-[${imageSize}px] min-h-[${imageSize}px]`)}>\n\n {loading &&\n <Skeleton className=\"w-full h-full\"/>}\n\n {error && <ErrorView title={\"Error uploading file\"}\n error={error}/>}\n\n </div>\n\n );\n\n}\n","import { ErrorOutlineIcon, IconButton } from \"@firecms/ui\";\nimport { ErrorTooltip } from \"../../ErrorTooltip\";\nimport { useCallback, useEffect, useRef } from \"react\";\n\nexport interface EntityTableCellActionsProps {\n showError: false | Error | undefined;\n disabled: boolean;\n showExpandIcon: boolean | undefined;\n selected: boolean | undefined;\n openPopup?: (cellRect: DOMRect | undefined) => void;\n children?: React.ReactNode;\n}\n\nexport function EntityTableCellActions({ showError, disabled, showExpandIcon, selected, openPopup, children }: EntityTableCellActionsProps) {\n\n const ref = useRef<HTMLDivElement>(null);\n const doOpenPopup = useCallback(() => {\n if (openPopup) {\n const cellRect = ref && ref?.current?.getBoundingClientRect();\n openPopup(cellRect);\n }\n }, []);\n\n const iconRef = useRef<HTMLButtonElement>();\n useEffect(() => {\n if (iconRef.current && selected) {\n iconRef.current.focus({ preventScroll: true });\n }\n }, [selected]);\n\n return <>\n {(showError || (!disabled && showExpandIcon)) &&\n <div ref={ref} className=\"absolute top-0.5 right-0.5 flex items-center\">\n {selected && children}\n\n {selected && !disabled && showExpandIcon &&\n <IconButton\n ref={iconRef}\n color={\"inherit\"}\n size={\"small\"}\n onClick={doOpenPopup}>\n <svg\n fill={\"#888\"}\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\">\n <path className=\"cls-2\"\n d=\"M20,5a1,1,0,0,0-1-1L14,4h0a1,1,0,0,0,0,2h2.57L13.29,9.29a1,1,0,0,0,0,1.42,1,1,0,0,0,1.42,0L18,7.42V10a1,1,0,0,0,1,1h0a1,1,0,0,0,1-1Z\"/>\n <path className=\"cls-2\"\n d=\"M10.71,13.29a1,1,0,0,0-1.42,0L6,16.57V14a1,1,0,0,0-1-1H5a1,1,0,0,0-1,1l0,5a1,1,0,0,0,1,1h5a1,1,0,0,0,0-2H7.42l3.29-3.29A1,1,0,0,0,10.71,13.29Z\"/>\n </svg>\n </IconButton>\n }\n\n {showError && <ErrorTooltip\n side={\"left\"}\n className={\"flex items-center justify-center\"}\n style={{ width: 32, height: 32 }}\n title={showError.message}>\n <ErrorOutlineIcon\n size={\"small\"}\n color={\"error\"}\n />\n </ErrorTooltip>\n }\n\n </div>\n }\n </>;\n}\n","import * as React from \"react\";\nimport { useMemo, useState } from \"react\";\n\nimport { Entity, ResolvedArrayProperty, ResolvedStringProperty, StorageConfig } from \"../../../types\";\nimport { useDropzone } from \"react-dropzone\";\nimport { PreviewSize, PropertyPreview } from \"../../../preview\";\nimport { ErrorBoundary } from \"../../ErrorBoundary\";\nimport { useSnackbarController, useStorageSource } from \"../../../hooks\";\nimport { getThumbnailMeasure } from \"../../../preview/util\";\nimport { StorageFieldItem, useStorageUploadController } from \"../../../util/useStorageUploadController\";\nimport { StorageUploadProgress } from \"../../../form/components/StorageUploadProgress\";\nimport { cn, EditIcon, IconButton, Typography } from \"@firecms/ui\";\nimport { EntityTableCellActions } from \"../internal/EntityTableCellActions\";\n\nconst dropZoneClasses = \"max-w-full box-border relative pt-[2px] items-center border border-transparent outline-none rounded-md duration-200 ease-[cubic-bezier(0.4,0,0.2,1)] focus:border-primary-solid\";\nconst activeDropClasses = \"pt-0 border-2 border-solid\"\nconst acceptDropClasses = \"transition-colors duration-200 ease-[cubic-bezier(0,0,0.2,1)] border-2 border-solid border-green-500 bg-green-50 dark:bg-green-900\"\nconst rejectDropClasses = \"transition-colors duration-200 ease-[cubic-bezier(0,0,0.2,1)] border-2 border-solid border-red-500 bg-red-50 dark:bg-red-900\"\n\n/**\n * Field that allows to upload files to Google Cloud Storage.\n *\n * This is one of the internal components that get mapped natively inside forms\n * and tables to the specified properties.\n * @group Form fields\n */\nexport function TableStorageUpload(props: {\n propertyKey: string;\n error: Error | undefined;\n disabled: boolean;\n value: string | string[] | null;\n updateValue: (newValue: (string | string[] | null)) => void;\n selected: boolean;\n focused: boolean;\n property: ResolvedStringProperty | ResolvedArrayProperty<string[]>;\n entity: Entity<any>;\n path: string;\n previewSize: PreviewSize;\n openPopup?: (cellRect?: DOMRect) => void;\n onBlur?: React.FocusEventHandler<HTMLInputElement | HTMLTextAreaElement>;\n}) {\n\n const {\n propertyKey,\n error,\n selected,\n openPopup,\n value,\n disabled,\n property,\n entity,\n path,\n previewSize,\n updateValue,\n } = props;\n\n const storageSource = useStorageSource();\n\n const {\n internalValue,\n setInternalValue,\n onFilesAdded,\n storage,\n onFileUploadComplete,\n storagePathBuilder,\n multipleFilesSupported\n } = useStorageUploadController({\n entityValues: entity.values,\n entityId: entity.id,\n path,\n property,\n propertyKey,\n storageSource,\n onChange: updateValue,\n value,\n disabled\n });\n\n return (\n\n <StorageUpload\n internalValue={internalValue}\n setInternalValue={setInternalValue}\n name={propertyKey}\n disabled={disabled}\n autoFocus={false}\n openPopup={openPopup}\n error={error}\n selected={selected}\n property={property}\n onChange={updateValue}\n entity={entity}\n storagePathBuilder={storagePathBuilder}\n storage={storage}\n multipleFilesSupported={multipleFilesSupported}\n onFilesAdded={onFilesAdded}\n onFileUploadComplete={onFileUploadComplete}\n previewSize={previewSize}/>\n\n );\n}\n\ninterface StorageUploadProps {\n internalValue: StorageFieldItem[];\n setInternalValue: (v: StorageFieldItem[]) => void;\n name: string;\n error?: Error;\n property: ResolvedStringProperty | ResolvedArrayProperty<string[]>;\n onChange: (value: string | string[] | null) => void;\n multipleFilesSupported: boolean;\n autoFocus: boolean;\n selected: boolean;\n disabled: boolean;\n entity: Entity<any>;\n previewSize: PreviewSize;\n storage: StorageConfig;\n onFilesAdded: (acceptedFiles: File[]) => void;\n storagePathBuilder: (file: File) => string;\n openPopup?: (cellRect?: DOMRect) => void;\n onFileUploadComplete: (uploadedPath: string, entry: StorageFieldItem, fileMetadata?: any) => Promise<void>;\n}\n\nfunction StorageUpload({\n property,\n name,\n internalValue,\n setInternalValue,\n openPopup,\n entity,\n selected,\n error,\n onChange,\n multipleFilesSupported,\n previewSize: previewSizeInput,\n disabled,\n autoFocus,\n storage,\n onFilesAdded,\n onFileUploadComplete,\n storagePathBuilder,\n }: StorageUploadProps) {\n\n const [onHover, setOnHover] = useState(false);\n\n const previewSize = multipleFilesSupported && previewSizeInput === \"medium\" ? \"small\" : previewSizeInput;\n if (multipleFilesSupported) {\n const arrayProperty = property as ResolvedArrayProperty<string[]>;\n if (Array.isArray(arrayProperty.of)) {\n throw Error(\"Using array properties instead of single one in `of` in ArrayProperty\");\n }\n if (arrayProperty.of) {\n if (arrayProperty.of.dataType !== \"string\") {\n throw Error(\"Storage field using array must be of data type string\");\n }\n } else {\n throw Error(\"Storage field using array must be of data type string\");\n }\n }\n\n const metadata: any | undefined = storage?.metadata;\n const hasValue = Boolean(internalValue);\n\n const snackbarContext = useSnackbarController();\n\n const {\n open,\n getRootProps,\n getInputProps,\n isDragActive,\n isDragAccept,\n isDragReject\n } = useDropzone({\n accept: storage.acceptedFiles ? storage.acceptedFiles.map(e => ({ [e]: [] })).reduce((a, b) => ({ ...a, ...b }), {}) : undefined,\n disabled,\n maxSize: storage.maxSize,\n noClick: true,\n noKeyboard: true,\n onDrop: onFilesAdded,\n onDropRejected: (fileRejections, event) => {\n for (const fileRejection of fileRejections) {\n for (const error of fileRejection.errors) {\n snackbarContext.open({\n type: \"error\",\n message: `Error uploading file: File is larger than ${storage.maxSize} bytes`\n });\n }\n }\n }\n }\n );\n\n const { ...rootProps } = getRootProps();\n\n const helpText = multipleFilesSupported\n ? \"Drag 'n' drop some files here, or click here to edit\"\n : \"Drag 'n' drop a file here, or click here edit\";\n\n const renderProperty = multipleFilesSupported\n ? (property as ResolvedArrayProperty<string[]>).of as ResolvedStringProperty\n : property as ResolvedStringProperty;\n\n const imageSize = useMemo(() => getThumbnailMeasure(previewSize), [previewSize]);\n const showError = !disabled && error;\n\n return (\n <div {...rootProps}\n onMouseEnter={() => setOnHover(true)}\n onMouseMove={() => setOnHover(true)}\n onMouseLeave={() => setOnHover(false)}\n className={cn(dropZoneClasses,\n \"relative w-full h-full flex\",\n `justify-${hasValue ? \"start\" : \"center\"}`,\n isDragActive ? activeDropClasses : \"\",\n isDragAccept ? acceptDropClasses : \"\",\n isDragReject ? rejectDropClasses : \"\"\n )}\n >\n\n <input autoFocus={autoFocus} {...getInputProps()} />\n\n {internalValue.map((entry, index) => {\n let child;\n if (entry.storagePathOrDownloadUrl) {\n child = (\n <TableStorageItemPreview\n key={`storage_preview_${index}`}\n property={renderProperty}\n value={entry.storagePathOrDownloadUrl}\n entity={entity}\n size={previewSize}/>\n );\n } else if (entry.file) {\n child = (\n <StorageUploadProgress\n key={`storage_progress_${index}`}\n entry={entry}\n metadata={metadata}\n storagePath={storagePathBuilder(entry.file)}\n onFileUploadComplete={onFileUploadComplete}\n imageSize={imageSize}\n simple={true}\n />\n );\n }\n\n return child;\n })\n }\n\n {!internalValue && <div\n className=\"flex-grow m-2 max-w-[200px]\"\n onClick={open}>\n <Typography\n className=\"text-gray-400 dark:text-gray-600\"\n variant={\"body2\"}\n align={\"center\"}>\n {helpText}\n </Typography>\n </div>}\n\n <EntityTableCellActions\n showError={showError}\n disabled={disabled}\n showExpandIcon={true}\n selected={selected}\n openPopup={!disabled ? openPopup : undefined}>\n <IconButton\n color={\"inherit\"}\n size={\"small\"}\n onClick={open}>\n <EditIcon size={\"small\"} className={\"text-gray-500\"}/>\n </IconButton>\n </EntityTableCellActions>\n\n </div>\n );\n\n}\n\ninterface TableStorageItemPreviewProps {\n property: ResolvedStringProperty;\n value: string,\n size: PreviewSize;\n entity: Entity<any>;\n}\n\nexport function TableStorageItemPreview({\n property,\n value,\n size,\n entity\n }: TableStorageItemPreviewProps) {\n\n return (\n <div\n className={\"relative p-2 max-w-full\"}\n >\n\n {value &&\n <ErrorBoundary>\n <PropertyPreview\n propertyKey={\"ignore\"} // TODO: Fix this\n value={value}\n property={property}\n // entity={entity}\n size={size}/>\n </ErrorBoundary>\n }\n\n </div>\n );\n\n}\n","import React, { useCallback, useState } from \"react\";\nimport equal from \"react-fast-compare\"\n\nimport { ReferencePreview } from \"../../../preview\";\nimport { CollectionSize, Entity, EntityCollection, EntityReference, FilterValues } from \"../../../types\";\n\nimport { getPreviewSizeFrom } from \"../../../preview/util\";\nimport { getReferenceFrom } from \"../../../util\";\nimport { useCustomizationController, useNavigationController, useReferenceDialog } from \"../../../hooks\";\nimport { ErrorView } from \"../../ErrorView\";\nimport { Button } from \"@firecms/ui\";\nimport { EntityPreviewContainer } from \"../../EntityPreview\";\n\ntype TableReferenceFieldProps = {\n name: string;\n disabled: boolean;\n internalValue: EntityReference | EntityReference[] | undefined | null;\n updateValue: (newValue: (EntityReference | EntityReference [] | null)) => void;\n size: CollectionSize;\n multiselect: boolean;\n previewProperties?: string[];\n title?: string;\n path: string;\n forceFilter?: FilterValues<string>;\n};\n\nexport function TableReferenceField(props: TableReferenceFieldProps) {\n const customizationController = useCustomizationController();\n\n const navigationController = useNavigationController();\n const { path } = props;\n const collection = navigationController.getCollection<EntityCollection>(path);\n if (!collection) {\n if (customizationController.components?.missingReference) {\n return <customizationController.components.missingReference path={path}/>;\n } else {\n throw Error(`Couldn't find the corresponding collection view for the path: ${path}`);\n }\n }\n return <TableReferenceFieldSuccess {...props} collection={collection}/>;\n}\n\nexport const TableReferenceFieldSuccess = React.memo(\n function TableReferenceFieldSuccess(props: TableReferenceFieldProps & {\n collection: EntityCollection;\n }) {\n const {\n name,\n internalValue,\n updateValue,\n multiselect,\n path,\n size,\n previewProperties,\n title,\n disabled,\n forceFilter,\n collection\n } = props;\n\n const onSingleEntitySelected = useCallback((entity: Entity<any>) => {\n updateValue(entity ? getReferenceFrom(entity) : null);\n }, [updateValue]);\n\n const onMultipleEntitiesSelected = useCallback((entities: Entity<any>[]) => {\n updateValue(entities.map((e) => getReferenceFrom(e)));\n }, [updateValue]);\n\n const selectedEntityIds = internalValue\n ? (Array.isArray(internalValue)\n ? internalValue.map((ref) => ref.id)\n : internalValue.id ? [internalValue.id] : [])\n : [];\n\n const referenceDialogController = useReferenceDialog({\n multiselect,\n path,\n collection,\n onMultipleEntitiesSelected,\n onSingleEntitySelected,\n selectedEntityIds,\n forceFilter\n }\n );\n\n const handleOpen = useCallback(() => {\n if (disabled)\n return;\n referenceDialogController.open();\n }, [disabled, referenceDialogController]);\n\n const valueNotSet = !internalValue || (Array.isArray(internalValue) && internalValue.length === 0);\n\n const buildSingleReferenceField = () => {\n if (internalValue && !Array.isArray(internalValue) && internalValue.isEntityReference && internalValue.isEntityReference())\n return <ReferencePreview\n onClick={disabled ? undefined : handleOpen}\n size={getPreviewSizeFrom(size)}\n reference={internalValue as EntityReference}\n hover={!disabled}\n disabled={!path}\n previewProperties={previewProperties}\n />;\n else\n return <EntityPreviewContainer\n onClick={disabled ? undefined : handleOpen}\n size={getPreviewSizeFrom(size)}>\n <ErrorView title=\"Value is not a reference.\" error={\"Click to edit\"}/>\n </EntityPreviewContainer>;\n };\n\n const buildMultipleReferenceField = () => {\n if (Array.isArray(internalValue))\n return <>\n {internalValue.map((reference, index) =>\n <div className=\"w-full my-0.5\"\n key={`preview_array_ref_${name}_${index}`}>\n <ReferencePreview\n onClick={disabled ? undefined : handleOpen}\n size={\"tiny\"}\n reference={reference}\n hover={!disabled}\n disabled={!path}\n previewProperties={previewProperties}\n />\n </div>\n )\n }\n </>;\n else\n return <ErrorView error={\"Data is not an array of references\"}/>;\n };\n\n if (!collection)\n return <ErrorView error={\"The specified collection does not exist\"}/>;\n\n return (\n <div className=\"w-full group\">\n\n {internalValue && !multiselect && buildSingleReferenceField()}\n\n {internalValue && multiselect && buildMultipleReferenceField()}\n\n {valueNotSet &&\n <Button\n onClick={handleOpen}\n size={\"small\"}\n variant=\"outlined\"\n color=\"primary\">\n Edit {title}\n </Button>}\n\n </div>\n );\n }, equal);\n","import {\n CMSType,\n EntityReference,\n GeoPoint,\n ResolvedArrayProperty,\n ResolvedMapProperty,\n ResolvedProperties,\n ResolvedProperty\n} from \"../types\";\nimport * as yup from \"yup\";\nimport { AnySchema, ArraySchema, BooleanSchema, DateSchema, NumberSchema, ObjectSchema, StringSchema } from \"yup\";\nimport { enumToObjectEntries, getValueInPath, hydrateRegExp, isPropertyBuilder } from \"../util\";\n\n// Add custom unique function for array values\ndeclare module \"yup\" {\n // tslint:disable-next-line\n interface ArraySchema<T> {\n uniqueInArray(mapper: (a: T) => T, message: string): ArraySchema<T>;\n }\n}\nyup.addMethod(yup.array, \"uniqueInArray\", function (\n mapper = (a: any) => a,\n message: string\n) {\n return this.test(\"uniqueInArray\", message, values => {\n return !values || values.length === new Set(values.map(mapper)).size;\n });\n});\n\nexport type CustomFieldValidator = (props: {\n name: string,\n value: any,\n property: ResolvedProperty,\n entityId?: string,\n parentProperty?: ResolvedMapProperty | ResolvedArrayProperty,\n}) => Promise<boolean>;\n\ninterface PropertyContext<T extends CMSType> {\n property: ResolvedProperty<T>,\n parentProperty?: ResolvedMapProperty | ResolvedArrayProperty,\n entityId: string,\n customFieldValidator?: CustomFieldValidator,\n name?: any\n}\n\nexport function getYupEntitySchema<M extends Record<string, any>>(\n entityId: string,\n properties: ResolvedProperties<M>,\n customFieldValidator?: CustomFieldValidator): ObjectSchema<any> {\n const objectSchema: any = {};\n Object.entries(properties as Record<string, ResolvedProperty>)\n .forEach(([name, property]) => {\n objectSchema[name] = mapPropertyToYup({\n property: property as ResolvedProperty<any>,\n customFieldValidator,\n name,\n entityId\n });\n });\n return yup.object().shape(objectSchema);\n}\n\nexport function mapPropertyToYup<T extends CMSType>(propertyContext: PropertyContext<T>): AnySchema<unknown> {\n\n const property = propertyContext.property;\n if (isPropertyBuilder(property)) {\n console.error(\"Error in property\", propertyContext);\n throw Error(\"Trying to create a yup mapping from a property builder. Please use resolved properties only\");\n }\n\n if (property.dataType === \"string\") {\n return getYupStringSchema(propertyContext as PropertyContext<string>);\n } else if (property.dataType === \"number\") {\n return getYupNumberSchema(propertyContext as PropertyContext<number>);\n } else if (property.dataType === \"boolean\") {\n return getYupBooleanSchema(propertyContext as PropertyContext<boolean>);\n } else if (property.dataType === \"map\") {\n return getYupMapObjectSchema(propertyContext as PropertyContext<object>);\n } else if (property.dataType === \"array\") {\n return getYupArraySchema(propertyContext as PropertyContext<any[]>);\n } else if (property.dataType === \"date\") {\n return getYupDateSchema(propertyContext as PropertyContext<Date>);\n } else if (property.dataType === \"geopoint\") {\n return getYupGeoPointSchema(propertyContext as PropertyContext<GeoPoint>);\n } else if (property.dataType === \"reference\") {\n return getYupReferenceSchema(propertyContext as PropertyContext<EntityReference>);\n }\n console.error(\"Unsupported data type in yup mapping\", property)\n throw Error(\"Unsupported data type in yup mapping\");\n}\n\nexport function getYupMapObjectSchema({\n property,\n entityId,\n customFieldValidator,\n name\n }: PropertyContext<Record<string, any>>): ObjectSchema<any> {\n const objectSchema: any = {};\n const validation = property.validation;\n if (property.properties)\n Object.entries(property.properties).forEach(([childName, childProperty]: [string, ResolvedProperty]) => {\n objectSchema[childName] = mapPropertyToYup<any>({\n property: childProperty,\n parentProperty: property as ResolvedMapProperty,\n customFieldValidator,\n name: `${name}[${childName}]`,\n entityId\n });\n });\n\n const shape = yup.object().shape(objectSchema);\n if (validation?.required) {\n return shape.required(validation?.requiredMessage ? validation.requiredMessage : \"Required\").nullable(true);\n }\n return shape.nullable(true);\n // const object: ObjectSchema<any> = yup.object().shape(objectSchema);\n // return validation?.required\n // ? object.required(validation?.requiredMessage ? validation.requiredMessage : \"Required\").nullable(true)\n // : yup.object().optional().default(undefined).notRequired().nullable(true).test(\n // \"empty-check\",\n // \"Optional map can be empty\",\n // (o: any, testContext: any) => {\n // try {\n // if (!o || Object.keys(o).length === 0) return true;\n // return object.validateSync(o);\n // } catch (e) {\n // testContext.createError(e);\n // console.error(e);\n // return false;\n // }\n // });\n}\n\nfunction getYupStringSchema({\n property,\n parentProperty,\n customFieldValidator,\n name,\n entityId\n }: PropertyContext<string>): StringSchema {\n let collection: StringSchema<any> = yup.string();\n const validation = property.validation;\n if (property.enumValues) {\n if (validation?.required)\n collection = collection.required(validation?.requiredMessage ? validation.requiredMessage : \"Required\");\n const entries = enumToObjectEntries(property.enumValues);\n collection = collection.oneOf(\n (validation?.required ? entries : [...entries, null])\n .map((enumValueConfig) => enumValueConfig?.id ?? null)\n ).nullable(true);\n }\n if (validation) {\n collection = validation.required\n ? collection.required(validation?.requiredMessage ? validation.requiredMessage : \"Required\").nullable(true)\n : collection.notRequired().nullable(true);\n if (validation.unique && customFieldValidator && name)\n collection = collection.test(\"unique\", \"This value already exists and should be unique\",\n (value, context) =>\n customFieldValidator({\n name,\n property,\n parentProperty,\n value,\n entityId\n }));\n if (validation.min || validation.min === 0) collection = collection.min(validation.min, `${property.name} must be min ${validation.min} characters long`);\n if (validation.max || validation.max === 0) collection = collection.max(validation.max, `${property.name} must be max ${validation.max} characters long`);\n if (validation.matches) {\n const regExp = typeof validation.matches === \"string\" ? hydrateRegExp(validation.matches) : validation.matches;\n if (regExp) {\n collection = collection.matches(regExp, validation.matchesMessage ? { message: validation.matchesMessage } : undefined)\n }\n }\n if (validation.trim) collection = collection.trim();\n if (validation.lowercase) collection = collection.lowercase();\n if (validation.uppercase) collection = collection.uppercase();\n if (property.email) collection = collection.email(`${property.name} must be an email`);\n if (property.url) collection = collection.url(`${property.name} must be a url`);\n } else {\n collection = collection.notRequired().nullable(true);\n }\n return collection;\n}\n\nfunction getYupNumberSchema({\n property,\n parentProperty,\n customFieldValidator,\n name,\n entityId\n }: PropertyContext<number>): NumberSchema {\n const validation = property.validation;\n let collection: NumberSchema<any> = yup.number().typeError(\"Must be a number\");\n if (validation) {\n collection = validation.required\n ? collection.required(validation.requiredMessage ? validation.requiredMessage : \"Required\").nullable(true)\n : collection.notRequired().nullable(true);\n if (validation.unique && customFieldValidator && name)\n collection = collection.test(\"unique\",\n \"This value already exists and should be unique\",\n (value) => customFieldValidator({\n name,\n property,\n parentProperty,\n value,\n entityId\n }));\n if (validation.min || validation.min === 0) collection = collection.min(validation.min, `${property.name} must be higher or equal to ${validation.min}`);\n if (validation.max || validation.max === 0) collection = collection.max(validation.max, `${property.name} must be lower or equal to ${validation.max}`);\n if (validation.lessThan || validation.lessThan === 0) collection = collection.lessThan(validation.lessThan, `${property.name} must be higher than ${validation.lessThan}`);\n if (validation.moreThan || validation.moreThan === 0) collection = collection.moreThan(validation.moreThan, `${property.name} must be lower than ${validation.moreThan}`);\n if (validation.positive) collection = collection.positive(`${property.name} must be positive`);\n if (validation.negative) collection = collection.negative(`${property.name} must be negative`);\n if (validation.integer) collection = collection.integer(`${property.name} must be an integer`);\n } else {\n collection = collection.notRequired().nullable(true);\n }\n return collection;\n}\n\nfunction getYupGeoPointSchema({\n property,\n parentProperty,\n customFieldValidator,\n name,\n entityId\n }: PropertyContext<GeoPoint>): AnySchema {\n let collection: ObjectSchema<any> = yup.object();\n const validation = property.validation;\n if (validation?.unique && customFieldValidator && name)\n collection = collection.test(\"unique\",\n \"This value already exists and should be unique\",\n (value) => customFieldValidator({\n name,\n property,\n parentProperty,\n value,\n entityId\n }));\n if (validation?.required) {\n collection = collection.required(validation.requiredMessage).nullable(true);\n } else {\n collection = collection.notRequired().nullable(true);\n }\n return collection;\n}\n\nfunction getYupDateSchema({\n property,\n parentProperty,\n customFieldValidator,\n name,\n entityId\n }: PropertyContext<Date>): AnySchema | DateSchema {\n if (property.autoValue) {\n return yup.object().nullable();\n }\n let collection: DateSchema<any> = yup.date();\n const validation = property.validation;\n if (validation) {\n collection = validation.required\n ? collection.required(validation?.requiredMessage ? validation.requiredMessage : \"Required\")\n : collection.notRequired();\n if (validation.unique && customFieldValidator && name)\n collection = collection.test(\"unique\",\n \"This value already exists and should be unique\",\n (value) => customFieldValidator({\n name,\n property,\n parentProperty,\n value,\n entityId\n }));\n if (validation.min) collection = collection.min(validation.min, `${property.name} must be after ${validation.min}`);\n if (validation.max) collection = collection.max(validation.max, `${property.name} must be before ${validation.min}`);\n } else {\n collection = collection.notRequired();\n }\n return collection\n .transform((v: any) => (v instanceof Date ? v : null))\n .nullable();\n}\n\nfunction getYupReferenceSchema({\n property,\n parentProperty,\n customFieldValidator,\n name,\n entityId\n }: PropertyContext<EntityReference>): AnySchema {\n let collection: ObjectSchema<any> = yup.object();\n const validation = property.validation;\n if (validation) {\n collection = validation.required\n ? collection.required(validation?.requiredMessage ? validation.requiredMessage : \"Required\").nullable(true)\n : collection.notRequired().nullable(true);\n if (validation.unique && customFieldValidator && name)\n collection = collection.test(\"unique\",\n \"This value already exists and should be unique\",\n (value) => customFieldValidator({\n name,\n property,\n parentProperty,\n value,\n entityId\n }));\n } else {\n collection = collection.notRequired().nullable(true);\n }\n return collection;\n}\n\nfunction getYupBooleanSchema({\n property,\n parentProperty,\n customFieldValidator,\n name,\n entityId\n }: PropertyContext<boolean>): BooleanSchema {\n let collection: BooleanSchema<any> = yup.boolean();\n const validation = property.validation;\n if (validation) {\n collection = validation.required\n ? collection.required(validation?.requiredMessage ? validation.requiredMessage : \"Required\").nullable(true)\n : collection.notRequired().nullable(true);\n if (validation.unique && customFieldValidator && name)\n collection = collection.test(\"unique\",\n \"This value already exists and should be unique\",\n (value) => customFieldValidator({\n name,\n property,\n parentProperty,\n value,\n entityId\n }));\n } else {\n collection = collection.notRequired().nullable(true);\n }\n return collection;\n}\n\nfunction hasUniqueInArrayModifier(property: ResolvedProperty): boolean | [string, ResolvedProperty][] {\n if (property.validation?.uniqueInArray) {\n return true;\n } else if (property.dataType === \"map\" && property.properties) {\n return Object.entries(property.properties)\n .filter(([key, childProperty]) => childProperty.validation?.uniqueInArray);\n }\n return false;\n}\n\nfunction getYupArraySchema({\n property,\n parentProperty,\n customFieldValidator,\n name,\n entityId\n }: PropertyContext<any[]>): AnySchema<any> {\n\n let arraySchema: ArraySchema<any> = yup.array();\n\n if (property.of) {\n if (Array.isArray(property.of)) {\n const yupProperties = (property.of as ResolvedProperty[]).map((p, index) => ({\n [`${name}[${index}]`]: mapPropertyToYup({\n property: p as ResolvedProperty<any>,\n parentProperty: property,\n entityId\n })\n })).reduce((a, b) => ({ ...a, ...b }), {});\n return yup.array().of(\n yup.mixed().test(\n \"Dynamic object validation\",\n \"Dynamic object validation error\",\n (object, context) => {\n const yupProperty = getValueInPath(yupProperties, context.path);\n return yupProperty.validate(object);\n }\n )\n );\n } else {\n arraySchema = arraySchema.of(mapPropertyToYup({\n property: property.of,\n parentProperty: property,\n entityId\n }));\n const arrayUniqueFields = hasUniqueInArrayModifier(property.of);\n if (arrayUniqueFields) {\n if (typeof arrayUniqueFields === \"boolean\") {\n arraySchema = arraySchema.uniqueInArray(v => v, `${property.name} should have unique values within the array`);\n } else if (Array.isArray(arrayUniqueFields)) {\n arrayUniqueFields.forEach(([name, childProperty]) => {\n arraySchema = arraySchema.uniqueInArray(v => v && v[name], `${property.name} → ${childProperty.name ?? name}: should have unique values within the array`);\n }\n );\n }\n }\n }\n }\n const validation = property.validation;\n\n if (validation) {\n arraySchema = validation.required\n ? arraySchema.required(validation?.requiredMessage ? validation.requiredMessage : \"Required\").nullable(true)\n : arraySchema.notRequired().nullable(true);\n if (validation.min || validation.min === 0) arraySchema = arraySchema.min(validation.min, `${property.name} should be min ${validation.min} entries long`);\n if (validation.max) arraySchema = arraySchema.max(validation.max, `${property.name} should be max ${validation.max} entries long`);\n } else {\n arraySchema = arraySchema.notRequired().nullable(true);\n }\n return arraySchema;\n}\n","import { VirtualTableSize } from \"./VirtualTableProps\";\n\nexport function getRowHeight(size: VirtualTableSize): number {\n switch (size) {\n case \"xl\":\n return 400;\n case \"l\":\n return 280;\n case \"m\":\n return 140;\n case \"s\":\n return 80;\n case \"xs\":\n return 54;\n default:\n throw Error(\"Missing mapping for collection size -> height\");\n }\n}\n","import React, { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\nimport useMeasure from \"react-use-measure\";\n\nimport { VirtualTableSize } from \"../../VirtualTable\";\nimport { getRowHeight } from \"../../VirtualTable/common\";\nimport { cn, RemoveCircleIcon, Tooltip } from \"@firecms/ui\";\nimport { ErrorBoundary } from \"../../../components\";\n\ninterface EntityTableCellProps {\n children: React.ReactNode;\n actions?: React.ReactNode;\n /**\n * The value is used only to check changes and force re-renders\n */\n value?: any;\n disabled: boolean;\n saved?: boolean;\n error?: Error;\n allowScroll?: boolean;\n align: \"right\" | \"left\" | \"center\";\n size: VirtualTableSize;\n disabledTooltip?: string;\n width: number;\n showExpandIcon?: boolean;\n removePadding?: boolean;\n fullHeight?: boolean;\n selected?: boolean;\n hideOverflow?: boolean;\n onSelect?: (cellRect: DOMRect | undefined) => void;\n}\n\ntype TableCellInnerProps = {\n justifyContent: string;\n scrollable: boolean;\n faded: boolean;\n fullHeight: boolean;\n children: React.ReactNode;\n}\n\nconst TableCellInner = ({\n justifyContent,\n scrollable,\n faded,\n fullHeight,\n children\n }: TableCellInnerProps) => {\n return (\n <div\n className={cn(\"flex flex-col max-h-full w-full\",\n {\n \"items-start\": faded || scrollable\n })}\n style={{\n justifyContent,\n height: fullHeight ? \"100%\" : undefined,\n overflow: scrollable ? \"auto\" : undefined,\n WebkitMaskImage: faded\n ? \"linear-gradient(to bottom, black 60%, transparent 100%)\"\n : undefined,\n maskImage: faded\n ? \"linear-gradient(to bottom, black 60%, transparent 100%)\"\n : undefined\n }}\n >\n {children}\n </div>\n );\n};\n\nexport const EntityTableCell = React.memo<EntityTableCellProps>(\n function EntityTableCell({\n children,\n actions,\n size,\n selected,\n disabled,\n disabledTooltip,\n saved,\n error,\n align,\n allowScroll,\n removePadding,\n fullHeight,\n onSelect,\n width,\n hideOverflow = true,\n showExpandIcon = true\n }: EntityTableCellProps) {\n\n const [measureRef, bounds] = useMeasure();\n const ref = useRef<HTMLDivElement>(null);\n\n const maxHeight = useMemo(() => getRowHeight(size), [size]);\n\n const [onHover, setOnHover] = useState(false);\n const [internalSaved, setInternalSaved] = useState(saved);\n\n const showError = !disabled && error;\n\n useEffect(() => {\n if (saved) {\n setInternalSaved(true);\n }\n const handler = setTimeout(() => {\n setInternalSaved(false);\n }, 800);\n return () => {\n clearTimeout(handler);\n };\n }, [saved]);\n\n let p = 0;\n if (!removePadding) {\n switch (size) {\n case \"l\":\n case \"xl\":\n p = 4;\n break;\n case \"m\":\n p = 2;\n break;\n case \"s\":\n default:\n p = 1;\n break;\n }\n }\n\n let justifyContent;\n switch (align) {\n case \"right\":\n justifyContent = \"flex-end\";\n break;\n case \"center\":\n justifyContent = \"center\";\n break;\n case \"left\":\n default:\n justifyContent = \"flex-start\";\n }\n\n // const onClick = useCallback((event: React.MouseEvent<HTMLDivElement>) => {\n // if (event.detail === 3) {\n // doOpenPopup();\n // }\n // }, [doOpenPopup]);\n\n const onSelectCallback = useCallback(() => {\n if (!onSelect) return;\n const cellRect = ref && ref?.current?.getBoundingClientRect();\n if (disabled) {\n onSelect(undefined);\n } else if (!selected && cellRect) {\n onSelect(cellRect);\n }\n }, [ref, onSelect, selected, disabled]);\n\n const onFocus = useCallback((event: React.SyntheticEvent<HTMLDivElement>) => {\n onSelectCallback();\n event.stopPropagation();\n }, [onSelectCallback]);\n\n const isOverflowing = useMemo(() => {\n if (bounds) {\n return bounds.height > maxHeight;\n }\n return false;\n }, [bounds, maxHeight]);\n\n const isSelected = !showError && selected;\n\n const scrollable = !disabled && allowScroll && isOverflowing;\n const faded = !disabled && !allowScroll && isOverflowing;\n\n const setOnHoverTrue = useCallback(() => setOnHover(true), []);\n const setOnHoverFalse = useCallback(() => setOnHover(false), []);\n\n return (\n <div\n ref={ref}\n className={cn(\n \"transition-colors duration-100 ease-in-out\",\n `flex relative h-full rounded-md p-${p} border border-4 border-opacity-75`,\n onHover && !disabled ? \"bg-gray-50 dark:bg-gray-900\" : \"\",\n saved ? \"bg-gray-100 bg-opacity-75 dark:bg-gray-800 dark:bg-opacity-75\" : \"\",\n !isSelected && !internalSaved && !showError ? \"border-transparent\" : \"\",\n hideOverflow ? \"overflow-hidden\" : \"\",\n isSelected ? \"bg-gray-50 dark:bg-gray-900\" : \"\",\n isSelected && !internalSaved ? \"border-primary\" : \"\",\n internalSaved ? \"border-green-500 \" : \"\",\n showError ? \"border-red-500\" : \"\"\n )}\n style={{\n justifyContent,\n alignItems: disabled || !isOverflowing ? \"center\" : undefined,\n width: width ?? \"100%\",\n textAlign: align\n }}\n tabIndex={selected || disabled ? undefined : 0}\n onFocus={onFocus}\n // onClick={onClick}\n onMouseEnter={setOnHoverTrue}\n onMouseMove={setOnHoverTrue}\n onMouseLeave={setOnHoverFalse}\n // contain={scrollable ? \"content\" : \"size\"}\n >\n\n <ErrorBoundary>\n\n {fullHeight && !faded && children}\n\n {(!fullHeight || faded) && <TableCellInner\n fullHeight={fullHeight ?? false}\n justifyContent={justifyContent}\n scrollable={scrollable ?? false}\n faded={faded}>\n\n {!fullHeight && <div ref={measureRef}\n style={{\n display: \"flex\",\n width: \"100%\",\n justifyContent,\n height: fullHeight ? \"100%\" : undefined\n }}>\n {children}\n </div>}\n\n </TableCellInner>}\n </ErrorBoundary>\n\n {actions}\n\n {disabled && onHover && disabledTooltip &&\n <div className=\"absolute top-1 right-1 text-xs\">\n <Tooltip title={disabledTooltip}>\n <RemoveCircleIcon size={\"smallest\"} color={\"disabled\"} className={\"text-gray-500\"}/>\n </Tooltip>\n </div>}\n\n </div>\n );\n }, (a, b) => {\n return a.error === b.error &&\n a.value === b.value &&\n a.disabled === b.disabled &&\n a.saved === b.saved &&\n a.allowScroll === b.allowScroll &&\n a.align === b.align &&\n a.size === b.size &&\n a.disabledTooltip === b.disabledTooltip &&\n a.width === b.width &&\n a.showExpandIcon === b.showExpandIcon &&\n a.removePadding === b.removePadding &&\n a.fullHeight === b.fullHeight &&\n a.selected === b.selected;\n }) as React.FunctionComponent<EntityTableCellProps>;\n","import React, { useContext } from \"react\";\nimport { EntityCollectionTableController } from \"../common/types\";\n\nexport const SelectableTableContext = React.createContext<EntityCollectionTableController<any>>({} as any);\n\nexport const useSelectableTableController = () => useContext<EntityCollectionTableController<any>>(SelectableTableContext);\n","import { useEffect, useRef } from \"react\";\nimport { CMSType, ResolvedProperty } from \"../types\";\n\n/**\n * Hook we use to restore a value after it has been cleared\n * @param property\n * @param value\n * @param setValue\n * @ignore\n */\nexport function useClearRestoreValue<T extends CMSType>({\n property,\n value,\n setValue\n }:\n {\n property: ResolvedProperty<T>,\n value: T,\n setValue: (value: T | null, shouldValidate?: boolean) => void\n }) {\n\n const clearedValueRef = useRef<T | null>(null);\n useEffect(() => {\n const shouldClearValueIfDisabled = typeof property.disabled === \"object\" && Boolean(property.disabled.clearOnDisabled);\n if (shouldClearValueIfDisabled) {\n if (value != null) {\n clearedValueRef.current = value;\n setValue(null);\n }\n } else if (clearedValueRef.current) {\n setValue(clearedValueRef.current);\n clearedValueRef.current = null;\n }\n }, [property]);\n}\n","import React, { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport equal from \"react-fast-compare\"\nimport {\n CMSType,\n Entity,\n EntityReference,\n ResolvedArrayProperty,\n ResolvedNumberProperty,\n ResolvedProperty,\n ResolvedStringProperty\n} from \"../../types\";\n\nimport { VirtualTableInput } from \"../VirtualTable/fields/VirtualTableInput\";\nimport { VirtualTableSelect } from \"../VirtualTable/fields/VirtualTableSelect\";\nimport { VirtualTableNumberInput } from \"../VirtualTable/fields/VirtualTableNumberInput\";\nimport { VirtualTableSwitch } from \"../VirtualTable/fields/VirtualTableSwitch\";\nimport { VirtualTableDateField } from \"../VirtualTable/fields/VirtualTableDateField\";\n\nimport { TableStorageUpload } from \"./fields/TableStorageUpload\";\nimport { TableReferenceField } from \"./fields/TableReferenceField\";\n\nimport { PropertyPreview } from \"../../preview\";\nimport { getPreviewSizeFrom } from \"../../preview/util\";\nimport { isReadOnly } from \"../../util\";\n\nimport { CustomFieldValidator, mapPropertyToYup } from \"../../form/validation\";\nimport { useFireCMSContext } from \"../../hooks\";\n\nimport { EntityTableCell } from \"./internal/EntityTableCell\";\nimport { EntityTableCellActions } from \"./internal/EntityTableCellActions\";\n\nimport { getRowHeight } from \"../VirtualTable/common\";\nimport { useSelectableTableController } from \"../SelectableTable/SelectableTableContext\";\nimport { useClearRestoreValue } from \"../../form/useClearRestoreValue\";\n\nexport interface PropertyTableCellProps<T extends CMSType> {\n propertyKey: string;\n columnIndex: number;\n align: \"right\" | \"left\" | \"center\";\n customFieldValidator?: CustomFieldValidator;\n value: T;\n readonly: boolean;\n property: ResolvedProperty<T>;\n height: number;\n width: number;\n entity: Entity<any>;\n path: string;\n disabled: boolean;\n}\n\nfunction isStorageProperty(property: ResolvedProperty) {\n if (property.dataType === \"string\" && (property as ResolvedStringProperty).storage)\n return true;\n if (property.dataType === \"array\") {\n if (Array.isArray(property.of)) {\n return false;\n } else {\n return ((property as ResolvedArrayProperty).of as ResolvedProperty)?.dataType === \"string\" &&\n ((property as ResolvedArrayProperty).of as ResolvedStringProperty)?.storage\n }\n }\n return false;\n}\n\nexport const PropertyTableCell = React.memo<PropertyTableCellProps<any>>(\n function PropertyTableCell<T extends CMSType, M extends Record<string, any>>({\n propertyKey,\n customFieldValidator,\n value,\n property,\n align,\n width,\n height,\n path,\n entity,\n readonly,\n disabled: disabledProp\n }: PropertyTableCellProps<T>) {\n\n const context = useFireCMSContext();\n\n const {\n onValueChange,\n size,\n selectedCell,\n select,\n setPopupCell\n } = useSelectableTableController();\n\n const selected = selectedCell?.propertyKey === propertyKey &&\n selectedCell?.entity.path === entity.path &&\n selectedCell?.entity.id === entity.id;\n\n const [internalValue, setInternalValue] = useState<any | null>(value);\n const internalValueRef = useRef(value);\n\n const [error, setError] = useState<Error | undefined>();\n const [saved, setSaved] = useState<boolean>(false);\n\n const onValueUpdated = useCallback(() => {\n setSaved(true)\n setTimeout(() => {\n setSaved(false);\n }, 100);\n }, []);\n\n const customField = Boolean(property.Field);\n const customPreview = Boolean(property.Preview);\n const readOnlyProperty = isReadOnly(property);\n const disabledTooltip: string | undefined = typeof property.disabled === \"object\" ? property.disabled.disabledMessage : undefined;\n const disabled = readonly || disabledProp || Boolean(property.disabled);\n\n const validation = useMemo(() => mapPropertyToYup({\n property,\n entityId: entity.id,\n customFieldValidator,\n name: propertyKey\n }), [entity.id, property, propertyKey]);\n\n useEffect(\n () => {\n if (!equal(value, internalValueRef.current)) {\n setError(undefined);\n setInternalValue(value);\n internalValueRef.current = value;\n onValueUpdated();\n }\n },\n [onValueUpdated, value]\n );\n\n const saveValues = (value: any) => {\n if (equal(value, internalValueRef.current))\n return;\n setSaved(false);\n validation\n .validate(value)\n .then(() => {\n setError(undefined);\n internalValueRef.current = value;\n if (onValueChange) {\n onValueChange({\n value,\n propertyKey,\n setError,\n onValueUpdated,\n entity,\n fullPath: path,\n context\n });\n }\n })\n .catch((e) => {\n setError(e);\n });\n };\n\n useEffect(() => {\n validation\n .validate(internalValue)\n .then(() => setError(undefined))\n .catch((e) => {\n setError(e);\n });\n }, [internalValue, validation, propertyKey, property, entity]);\n\n const updateValue = (newValue: any | null) => {\n\n let updatedValue: any;\n if (newValue === undefined) {\n updatedValue = null;\n } else {\n updatedValue = newValue;\n }\n setInternalValue(updatedValue);\n saveValues(updatedValue);\n };\n\n useClearRestoreValue<any>({\n property,\n value: internalValue,\n setValue: updateValue\n });\n\n const onSelect = useCallback((cellRect: DOMRect | undefined) => {\n if (!cellRect) {\n select(undefined);\n } else {\n select({\n width,\n height,\n entity,\n cellRect,\n propertyKey: propertyKey as Extract<keyof M, string>\n });\n }\n }, [entity, height, propertyKey, select, width]);\n\n const openPopup = (cellRect: DOMRect | undefined) => {\n if (!setPopupCell)\n return;\n if (!cellRect) {\n setPopupCell(undefined);\n } else {\n setPopupCell({\n width,\n height,\n entity,\n cellRect,\n propertyKey: propertyKey as Extract<keyof M, string>\n });\n }\n };\n\n let innerComponent: React.ReactNode | undefined;\n let allowScroll = false;\n let showExpandIcon = false;\n let hideOverflow = true;\n let removePadding = false;\n let fullHeight = false;\n let includeActions = true;\n const showError = !disabled && error;\n\n if (readonly || readOnlyProperty) {\n return <EntityTableCell\n size={size}\n width={width}\n saved={saved}\n key={`${propertyKey}_${entity.path}_${entity.id}`}\n value={internalValue}\n align={align ?? \"left\"}\n fullHeight={false}\n disabledTooltip={disabledTooltip ?? (readOnlyProperty ? \"Read only\" : undefined)}\n disabled={true}>\n <PropertyPreview\n width={width}\n height={getRowHeight(size)}\n propertyKey={propertyKey}\n property={property}\n // entity={entity}\n value={internalValue}\n size={getPreviewSizeFrom(size)}\n />\n </EntityTableCell>;\n }\n\n if (!customField && (!customPreview || selected)) {\n const isAStorageProperty = isStorageProperty(property);\n if (isAStorageProperty) {\n innerComponent = <TableStorageUpload error={error}\n disabled={disabled}\n focused={selected}\n selected={selected}\n openPopup={setPopupCell ? openPopup : undefined}\n property={property as ResolvedStringProperty | ResolvedArrayProperty<string[]>}\n entity={entity}\n path={path}\n value={internalValue}\n previewSize={getPreviewSizeFrom(size)}\n updateValue={updateValue}\n propertyKey={propertyKey as string}\n />;\n includeActions = false;\n showExpandIcon = true;\n fullHeight = true;\n removePadding = true;\n } else if (selected && property.dataType === \"number\") {\n const numberProperty = property as ResolvedNumberProperty;\n if (numberProperty.enumValues) {\n innerComponent = <VirtualTableSelect name={propertyKey as string}\n multiple={false}\n disabled={disabled}\n focused={selected}\n valueType={\"number\"}\n small={getPreviewSizeFrom(size) !== \"medium\"}\n enumValues={numberProperty.enumValues}\n error={error}\n internalValue={internalValue as string | number}\n updateValue={updateValue}\n />;\n fullHeight = true;\n } else {\n innerComponent = <VirtualTableNumberInput\n align={align}\n error={error}\n focused={selected}\n disabled={disabled}\n value={internalValue as number}\n updateValue={updateValue}\n />;\n allowScroll = true;\n }\n } else if (selected && property.dataType === \"string\") {\n const stringProperty = property as ResolvedStringProperty;\n if (stringProperty.enumValues) {\n innerComponent = <VirtualTableSelect name={propertyKey as string}\n multiple={false}\n focused={selected}\n disabled={disabled}\n valueType={\"string\"}\n small={getPreviewSizeFrom(size) !== \"medium\"}\n enumValues={stringProperty.enumValues}\n error={error}\n internalValue={internalValue as string | number}\n updateValue={updateValue}\n />;\n fullHeight = true;\n } else if (!stringProperty.storage) {\n const multiline = Boolean(stringProperty.multiline) || Boolean(stringProperty.markdown);\n innerComponent = <VirtualTableInput error={error}\n disabled={disabled}\n multiline={multiline}\n focused={selected}\n value={internalValue as string}\n updateValue={updateValue}\n />;\n allowScroll = true;\n }\n } else if (property.dataType === \"boolean\") {\n innerComponent = <VirtualTableSwitch error={error}\n disabled={disabled}\n focused={selected}\n internalValue={internalValue as boolean}\n updateValue={updateValue}\n />;\n } else if (property.dataType === \"date\") {\n innerComponent = <VirtualTableDateField name={propertyKey as string}\n error={error}\n disabled={disabled}\n mode={property.mode}\n focused={selected}\n internalValue={internalValue as Date}\n updateValue={updateValue}\n />;\n fullHeight = true;\n hideOverflow = false;\n allowScroll = false;\n } else if (property.dataType === \"reference\") {\n if (typeof property.path === \"string\") {\n innerComponent =\n <TableReferenceField name={propertyKey as string}\n internalValue={internalValue as EntityReference}\n updateValue={updateValue}\n disabled={disabled}\n size={size}\n path={property.path}\n multiselect={false}\n previewProperties={property.previewProperties}\n title={property.name}\n forceFilter={property.forceFilter}\n />;\n }\n allowScroll = false;\n } else if (property.dataType === \"array\") {\n const arrayProperty = (property as ResolvedArrayProperty);\n\n if (!arrayProperty.of && !arrayProperty.oneOf) {\n throw Error(`You need to specify an 'of' or 'oneOf' prop (or specify a custom field) in your array property ${propertyKey}`);\n }\n if (arrayProperty.of && !Array.isArray(arrayProperty.of)) {\n if (arrayProperty.of.dataType === \"string\" || arrayProperty.of.dataType === \"number\") {\n if (selected && arrayProperty.of.enumValues) {\n innerComponent =\n <VirtualTableSelect name={propertyKey as string}\n multiple={true}\n disabled={disabled}\n focused={selected}\n small={getPreviewSizeFrom(size) !== \"medium\"}\n valueType={arrayProperty.of.dataType}\n enumValues={arrayProperty.of.enumValues}\n error={error}\n internalValue={internalValue as string | number}\n updateValue={updateValue}\n />;\n allowScroll = true;\n fullHeight = true;\n hideOverflow = false;\n }\n } else if (arrayProperty.of.dataType === \"reference\") {\n if (typeof arrayProperty.of.path === \"string\") {\n innerComponent =\n <TableReferenceField\n name={propertyKey as string}\n disabled={disabled}\n internalValue={internalValue as EntityReference[]}\n updateValue={updateValue}\n size={size}\n multiselect={true}\n path={arrayProperty.of.path}\n previewProperties={arrayProperty.of.previewProperties}\n title={arrayProperty.name}\n forceFilter={arrayProperty.of.forceFilter}\n />;\n }\n allowScroll = false;\n }\n }\n\n }\n }\n\n if (!innerComponent) {\n allowScroll = false;\n showExpandIcon = selected && !innerComponent && !disabled && !readOnlyProperty;\n innerComponent = (\n <PropertyPreview width={width}\n height={height}\n // entity={entity}\n propertyKey={propertyKey as string}\n value={internalValue}\n property={property}\n size={getPreviewSizeFrom(size)}\n />\n );\n }\n\n return (\n <EntityTableCell\n key={`cell_${propertyKey}_${entity.path}_${entity.id}`}\n size={size}\n width={width}\n onSelect={onSelect}\n selected={selected}\n disabled={disabled || readOnlyProperty}\n disabledTooltip={disabledTooltip ?? \"Disabled\"}\n removePadding={removePadding}\n fullHeight={fullHeight}\n saved={saved}\n error={error}\n align={align}\n allowScroll={allowScroll}\n showExpandIcon={showExpandIcon}\n value={internalValue}\n hideOverflow={hideOverflow}\n actions={includeActions && <EntityTableCellActions\n showError={showError}\n disabled={disabled}\n showExpandIcon={showExpandIcon}\n selected={selected}\n openPopup={!disabled ? openPopup : undefined}/>}\n >\n\n {innerComponent}\n\n </EntityTableCell>\n );\n\n },\n areEqual) as React.FunctionComponent<PropertyTableCellProps<any>>;\n\nfunction areEqual(prevProps: PropertyTableCellProps<any>, nextProps: PropertyTableCellProps<any>) {\n return prevProps.height === nextProps.height &&\n prevProps.propertyKey === nextProps.propertyKey &&\n prevProps.align === nextProps.align &&\n prevProps.width === nextProps.width &&\n equal(prevProps.property, nextProps.property) &&\n equal(prevProps.value, nextProps.value) &&\n equal(prevProps.entity.id, nextProps.entity.id) &&\n equal(prevProps.entity.values, nextProps.entity.values)\n ;\n}\n","import React, { MouseEvent, useCallback } from \"react\";\n\nimport { CollectionSize, Entity, EntityAction, EntityCollection, SelectionController } from \"../../types\";\nimport { Checkbox, cn, IconButton, Menu, MenuItem, MoreVertIcon, Skeleton, Tooltip, Typography } from \"@firecms/ui\";\nimport { useFireCMSContext, useLargeLayout } from \"../../hooks\";\n\n/**\n *\n * @param entity\n * @param width\n * @param frozen\n * @param isSelected\n * @param selectionEnabled\n * @param size\n * @param toggleEntitySelection\n * @param hideId\n * @constructor\n *\n * @group Collection components\n */\nexport const EntityCollectionRowActions = function EntityCollectionRowActions({\n entity,\n collection,\n fullPath,\n width,\n frozen,\n isSelected,\n selectionEnabled,\n size,\n highlightEntity,\n onCollectionChange,\n unhighlightEntity,\n actions = [],\n hideId,\n selectionController,\n }:\n {\n entity: Entity<any>,\n collection?: EntityCollection<any>,\n fullPath?: string,\n width: number,\n frozen?: boolean,\n size: CollectionSize,\n isSelected?: boolean,\n selectionEnabled?: boolean,\n actions?: EntityAction[],\n hideId?: boolean,\n onCollectionChange?: () => void,\n selectionController?: SelectionController;\n highlightEntity?: (entity: Entity<any>) => void;\n unhighlightEntity?: (entity: Entity<any>) => void;\n }) {\n\n const largeLayout = useLargeLayout();\n\n const context = useFireCMSContext();\n\n const onCheckedChange = useCallback((checked: boolean) => {\n selectionController?.toggleEntitySelection(entity);\n }, [entity, selectionController?.toggleEntitySelection]);\n\n const onClick = useCallback((event: MouseEvent) => {\n event.stopPropagation();\n selectionController?.toggleEntitySelection(entity);\n }, [entity, selectionController?.toggleEntitySelection]);\n\n const hasActions = actions.length > 0;\n const hasCollapsedActions = actions.some(a => a.collapsed || a.collapsed === undefined);\n\n const collapsedActions = actions.filter(a => a.collapsed || a.collapsed === undefined);\n const uncollapsedActions = actions.filter(a => a.collapsed === false);\n return (\n <div\n onClick={onClick}\n className={cn(\n \"h-full flex items-center justify-center flex-col bg-gray-50 dark:bg-gray-900 bg-opacity-90 dark:bg-opacity-90 z-10\",\n frozen ? \"sticky left-0\" : \"\"\n )}\n style={{\n width,\n position: frozen ? \"sticky\" : \"initial\",\n left: frozen ? 0 : \"initial\",\n contain: \"strict\"\n }}>\n\n {(hasActions || selectionEnabled) &&\n <div className=\"w-34 flex justify-center\">\n\n {uncollapsedActions.map((action, index) => (\n <Tooltip key={index} title={action.name}>\n <IconButton\n onClick={(event: MouseEvent) => {\n event.stopPropagation();\n action.onClick({\n entity,\n fullPath,\n collection,\n context,\n selectionController,\n highlightEntity,\n unhighlightEntity,\n onCollectionChange,\n });\n }}\n size={largeLayout ? \"medium\" : \"small\"}>\n {action.icon}\n </IconButton>\n </Tooltip>\n ))}\n\n {hasCollapsedActions &&\n <Menu\n trigger={<IconButton\n size={largeLayout ? \"medium\" : \"small\"}>\n <MoreVertIcon/>\n </IconButton>}>\n {collapsedActions.map((action, index) => (\n <MenuItem\n key={index}\n onClick={(e) => {\n e.stopPropagation();\n action.onClick({\n entity,\n fullPath,\n collection,\n context,\n selectionController,\n highlightEntity,\n unhighlightEntity,\n onCollectionChange,\n });\n }}>\n {action.icon}\n {action.name}\n </MenuItem>\n ))}\n </Menu>\n }\n\n {selectionEnabled &&\n <Tooltip title={`Select ${entity.id}`}>\n <Checkbox\n size={largeLayout ? \"medium\" : \"small\"}\n checked={Boolean(isSelected)}\n onCheckedChange={onCheckedChange}\n />\n </Tooltip>}\n\n </div>}\n\n {!hideId && size !== \"xs\" && (\n <div className=\"w-[138px] text-center overflow-hidden truncate\">\n\n {entity\n ? <Typography\n onClick={(event) => {\n event.stopPropagation();\n }}\n className={\"font-mono select-all\"}\n variant={\"caption\"}\n color={\"secondary\"}> {entity.id} </Typography>\n : <Skeleton/>\n }\n </div>\n )}\n\n </div>\n );\n\n};\n","import React, { useEffect } from \"react\";\n\nimport {\n Button,\n CircularProgress,\n cn,\n defaultBorderMixin,\n FilterListOffIcon,\n SearchBar,\n Select,\n SelectItem,\n Tooltip\n} from \"@firecms/ui\";\nimport { CollectionSize } from \"../../../types\";\nimport { useLargeLayout } from \"../../../hooks\";\n\ninterface CollectionTableToolbarProps {\n size: CollectionSize;\n filterIsSet: boolean;\n loading: boolean;\n forceFilter?: boolean;\n actionsStart?: React.ReactNode;\n actions?: React.ReactNode;\n title?: React.ReactNode,\n onTextSearchClick?: () => void;\n onTextSearch?: (searchString?: string) => void;\n onSizeChanged: (size: CollectionSize) => void;\n clearFilter?: () => void;\n textSearchLoading?: boolean;\n}\n\nexport function CollectionTableToolbar(props: CollectionTableToolbarProps) {\n\n const searchInputRef = React.useRef<HTMLInputElement>(null);\n const largeLayout = useLargeLayout();\n\n const searchLoading = React.useRef<boolean>(false);\n\n useEffect(() => {\n if (searchInputRef.current && searchLoading.current && !props.textSearchLoading) {\n searchInputRef.current.focus();\n }\n searchLoading.current = props.textSearchLoading ?? false;\n }, [props.textSearchLoading]);\n\n const clearFilterButton = !props.forceFilter && props.filterIsSet && props.clearFilter &&\n <Button\n variant={\"outlined\"}\n className=\"h-fit-content\"\n aria-label=\"filter clear\"\n onClick={props.clearFilter}\n size={\"small\"}>\n <FilterListOffIcon/>\n Clear filter\n </Button>;\n\n const sizeSelect = (\n <Tooltip title={\"Table row size\"} side={\"right\"} sideOffset={4}>\n <Select\n value={props.size as string}\n className=\"w-16 h-10\"\n size={\"small\"}\n onValueChange={(v) => props.onSizeChanged(v as CollectionSize)}\n renderValue={(v) => <div className={\"font-medium\"}>{v.toUpperCase()}</div>}\n >\n {[\"xs\", \"s\", \"m\", \"l\", \"xl\"].map((size) => (\n <SelectItem key={size} value={size} className={\"w-12 font-medium text-center\"}>\n {size.toUpperCase()}\n </SelectItem>\n ))}\n </Select>\n </Tooltip>\n );\n\n return (\n <div\n className={cn(defaultBorderMixin, \"no-scrollbar min-h-[56px] overflow-x-auto px-2 md:px-4 bg-gray-50 dark:bg-gray-900 border-b flex flex-row justify-between items-center w-full\")}>\n\n <div className=\"flex items-center gap-2 md:mr-4 mr-2\">\n\n {props.title && <div className={\"hidden lg:block\"}>\n {props.title}\n </div>}\n\n {sizeSelect}\n\n {props.actionsStart}\n\n {clearFilterButton}\n\n </div>\n\n <div className=\"flex items-center gap-2\">\n\n {largeLayout && <div className=\"w-[22px]\">\n {props.loading &&\n <CircularProgress size={\"small\"}/>}\n </div>}\n\n {(props.onTextSearch || props.onTextSearchClick) &&\n <SearchBar\n key={\"search-bar\"}\n inputRef={searchInputRef}\n loading={props.textSearchLoading}\n disabled={Boolean(props.onTextSearchClick)}\n onClick={props.onTextSearchClick}\n onTextSearch={props.onTextSearchClick ? undefined : props.onTextSearch}\n expandable={true}/>}\n\n {props.actions}\n\n </div>\n\n </div>\n );\n}\n","import { EntityCollection, Property, ResolvedArrayProperty, ResolvedProperty } from \"../../../types\";\n\nexport function getTableCellAlignment(property: Property | ResolvedProperty): \"right\" | \"left\" | \"center\" {\n if (property.dataType === \"boolean\") {\n return \"center\";\n } else if (property.dataType === \"number\") {\n if (property.enumValues)\n return \"left\";\n return \"right\";\n } else if (property.dataType === \"date\") {\n return \"right\";\n } else {\n return \"left\";\n }\n}\n\nexport function getTablePropertyColumnWidth(property: ResolvedProperty): number {\n\n if (property.columnWidth) {\n return property.columnWidth;\n }\n\n if (property.dataType === \"string\") {\n if (property.url) {\n return 280;\n } else if (property.storage) {\n return 160;\n } else if (property.enumValues) {\n return 200;\n } else if (property.multiline) {\n return 300;\n } else if (property.markdown) {\n return 300;\n } else if (property.email) {\n return 200;\n } else {\n return 200;\n }\n } else if (property.dataType === \"array\") {\n const arrayProperty = property as ResolvedArrayProperty;\n if (arrayProperty.of) {\n if (Array.isArray(property.of)) {\n return 300;\n } else {\n return getTablePropertyColumnWidth(arrayProperty.of as ResolvedProperty);\n }\n } else {\n return 300;\n }\n } else if (property.dataType === \"number\") {\n if (property.enumValues) {\n return 200;\n }\n return 140;\n } else if (property.dataType === \"map\") {\n return 360;\n } else if (property.dataType === \"date\") {\n return 200;\n } else if (property.dataType === \"reference\") {\n return 220;\n } else if (property.dataType === \"boolean\") {\n return 140;\n } else {\n return 200;\n }\n}\n\nexport function getSubcollectionColumnId(collection: EntityCollection) {\n return `subcollection:${collection.id ?? collection.path}`;\n}\n","import { useMemo } from \"react\";\nimport { EntityCollection, ResolvedEntityCollection, ResolvedProperty } from \"../../types\";\nimport { getSubcollectionColumnId } from \"../EntityCollectionTable/internal/common\";\nimport { PropertyColumnConfig } from \"../EntityCollectionTable/EntityCollectionTableProps\";\n\nconst COLLECTION_GROUP_PARENT_ID = \"collectionGroupParent\";\n\nexport function useColumnIds<M extends Record<string, any>>(collection: ResolvedEntityCollection<M>, includeSubcollections: boolean): PropertyColumnConfig[] {\n return useMemo(() => {\n if (collection.propertiesOrder)\n return hideAndExpandKeys(collection, collection.propertiesOrder);\n return getDefaultColumnKeys(collection, includeSubcollections);\n }, [collection, includeSubcollections]);\n}\n\nfunction hideAndExpandKeys<M extends Record<string, any>>(collection: ResolvedEntityCollection<M>, keys: string[]): PropertyColumnConfig[] {\n\n return keys.flatMap((key) => {\n const property = collection.properties[key];\n if (property) {\n if (property.hideFromCollection)\n return [null];\n if (property.disabled && typeof property.disabled === \"object\" && property.disabled.hidden)\n return [null];\n if (property.dataType === \"map\" && property.spreadChildren && property.properties) {\n return getColumnKeysForProperty(property, key);\n }\n return [{\n key,\n disabled: Boolean(property.disabled) || Boolean(property.readOnly)\n }];\n }\n\n const additionalField = collection.additionalFields?.find(field => field.key === key);\n if (additionalField) {\n return [{\n key,\n disabled: true\n }];\n }\n\n if (collection.subcollections) {\n const subCollection = collection.subcollections.find(subCol => getSubcollectionColumnId(subCol) === key);\n if (subCollection) {\n return [{\n key,\n disabled: true\n }];\n }\n }\n\n if (collection.collectionGroup && key === COLLECTION_GROUP_PARENT_ID) {\n return [{\n key,\n disabled: true\n }];\n }\n\n return [null];\n }).filter(Boolean) as PropertyColumnConfig[];\n}\n\nfunction getDefaultColumnKeys<M extends Record<string, any> = any>(collection: ResolvedEntityCollection<M>, includeSubCollections: boolean) {\n const propertyKeys = Object.keys(collection.properties);\n\n const additionalFields = collection.additionalFields ?? [];\n const subCollections: EntityCollection[] = collection.subcollections ?? [];\n\n const columnIds: string[] = [\n ...propertyKeys,\n ...additionalFields.map((field) => field.key)\n ];\n\n if (includeSubCollections) {\n const subCollectionIds = subCollections\n .map((collection) => getSubcollectionColumnId(collection));\n columnIds.push(...subCollectionIds.filter((subColId) => !columnIds.includes(subColId)));\n }\n\n if (collection.collectionGroup) {\n columnIds.push(COLLECTION_GROUP_PARENT_ID);\n }\n\n return hideAndExpandKeys(collection, columnIds);\n}\n\nexport function getColumnKeysForProperty(property: ResolvedProperty, key: string, disabled?: boolean): PropertyColumnConfig[] {\n if (property.dataType === \"map\" && property.spreadChildren && property.properties) {\n return Object.entries(property.properties)\n .flatMap(([childKey, childProperty]) => getColumnKeysForProperty(\n childProperty,\n `${key}.${childKey}`,\n disabled || Boolean(property.disabled) || Boolean(property.readOnly))\n );\n }\n return [{\n key,\n disabled: disabled || Boolean(property.disabled) || Boolean(property.readOnly)\n }];\n}\n","import React from \"react\";\nimport { getTableCellAlignment, getTablePropertyColumnWidth } from \"./internal/common\";\nimport { FilterValues, ResolvedProperties, ResolvedProperty } from \"../../types\";\nimport { VirtualTableColumn } from \"../VirtualTable\";\nimport { getIconForProperty, getResolvedPropertyInPath } from \"../../util\";\nimport { getColumnKeysForProperty } from \"../common/useColumnsIds\";\n\nexport function buildIdColumn(largeLayout?: boolean): VirtualTableColumn {\n return {\n key: \"id_ewcfedcswdf3\",\n width: (largeLayout ? 160 : 130),\n title: \"ID\",\n resizable: false,\n frozen: largeLayout ?? false,\n headerAlign: \"center\",\n align: \"center\",\n };\n}\n\nexport interface PropertiesToColumnsParams<M extends Record<string, any>> {\n properties: ResolvedProperties<M>;\n sortable?: boolean;\n forceFilter?: FilterValues<keyof M extends string ? keyof M : never>;\n disabledFilter?: boolean;\n AdditionalHeaderWidget?: React.ComponentType<{\n property: ResolvedProperty,\n propertyKey: string,\n onHover: boolean,\n }>;\n}\n\nexport function propertiesToColumns<M extends Record<string, any>>({ properties, sortable, forceFilter, disabledFilter, AdditionalHeaderWidget }: PropertiesToColumnsParams<M>): VirtualTableColumn[] {\n return Object.entries<ResolvedProperty>(properties)\n .flatMap(([key, property]) => getColumnKeysForProperty(property, key))\n .map(({\n key,\n disabled\n }) => {\n const property = getResolvedPropertyInPath(properties, key);\n if (!property)\n throw Error(\"Internal error: no property found in path \" + key);\n const filterable = filterableProperty(property);\n return {\n key: key as string,\n align: getTableCellAlignment(property),\n icon: getIconForProperty(property, \"small\"),\n title: property.name ?? key as string,\n sortable: sortable && (forceFilter ? Object.keys(forceFilter).includes(key) : true),\n filter: !disabledFilter && filterable,\n width: getTablePropertyColumnWidth(property),\n resizable: true,\n custom: {\n resolvedProperty: property,\n disabled\n },\n AdditionalHeaderWidget: AdditionalHeaderWidget\n ? ({ onHover }) => <AdditionalHeaderWidget property={property} propertyKey={key} onHover={onHover}/>\n : undefined\n } satisfies VirtualTableColumn;\n });\n}\n\nfunction filterableProperty(property: ResolvedProperty, partOfArray = false): boolean {\n if (partOfArray) {\n return [\"string\", \"number\", \"date\", \"reference\"].includes(property.dataType);\n }\n if (property.dataType === \"array\") {\n if (property.of)\n return filterableProperty(property.of, true);\n else\n return false;\n }\n return [\"string\", \"number\", \"boolean\", \"date\", \"reference\", \"array\"].includes(property.dataType);\n}\n","import React from \"react\";\nimport { CircularProgress, CircularProgressProps, Typography } from \"@firecms/ui\";\n\n/**\n *\n * @param text\n * @param props\n * @constructor\n * @ignore\n */\nexport function CircularProgressCenter({ text, ...props }: CircularProgressProps & {\n text?: string\n}) {\n return (\n <div\n className=\"flex w-full h-screen max-h-full max-w-full bg-gray-50 dark:bg-gray-900 gap-4\">\n <div className=\"m-auto flex flex-col gap-2 items-center\">\n <CircularProgress {...props}/>\n {text && <Typography\n color={\"secondary\"}\n variant={\"caption\"}\n className=\"text-center\">{text}</Typography>}\n </div>\n </div>\n );\n}\n","import React, { RefObject, useCallback, useEffect, useState } from \"react\";\nimport equal from \"react-fast-compare\";\n\nimport { VirtualTableColumn, VirtualTableSort, VirtualTableWhereFilterOp } from \"./VirtualTableProps\";\nimport { ErrorBoundary } from \"../ErrorBoundary\";\nimport {\n ArrowUpwardIcon,\n Badge,\n Button,\n cn,\n defaultBorderMixin,\n FilterListIcon,\n IconButton,\n Popover\n} from \"@firecms/ui\";\n\ninterface FilterFormProps<T> {\n column: VirtualTableColumn<T>;\n onFilterUpdate: (filter?: [VirtualTableWhereFilterOp, any], newOpenFilterState?: boolean) => void;\n filter?: [VirtualTableWhereFilterOp, any];\n onHover: boolean,\n createFilterField: (props: FilterFormFieldProps<T>) => React.ReactNode;\n hidden: boolean;\n setHidden: (hidden: boolean) => void;\n}\n\nexport type FilterFormFieldProps<CustomProps> = {\n id: React.Key,\n filterValue: [VirtualTableWhereFilterOp, any] | undefined,\n setFilterValue: (filterValue?: [VirtualTableWhereFilterOp, any]) => void;\n column: VirtualTableColumn<CustomProps>;\n hidden: boolean;\n setHidden: (hidden: boolean) => void;\n};\n\ntype VirtualTableHeaderProps<M extends Record<string, any>> = {\n resizeHandleRef: RefObject<HTMLDivElement>;\n columnIndex: number;\n isResizingIndex: number;\n column: VirtualTableColumn<any>;\n onColumnSort: (key: Extract<keyof M, string>) => void;\n filter?: [VirtualTableWhereFilterOp, any];\n sort: VirtualTableSort;\n onFilterUpdate: (column: VirtualTableColumn, filterForProperty?: [VirtualTableWhereFilterOp, any]) => void;\n onClickResizeColumn?: (columnIndex: number, column: VirtualTableColumn) => void;\n createFilterField?: (props: FilterFormFieldProps<any>) => React.ReactNode;\n AdditionalHeaderWidget?: (props: { onHover: boolean }) => React.ReactNode;\n};\n\nexport const VirtualTableHeader = React.memo<VirtualTableHeaderProps<any>>(\n function VirtualTableHeader<M extends Record<string, any>>({\n resizeHandleRef,\n columnIndex,\n isResizingIndex,\n sort,\n onColumnSort,\n onFilterUpdate,\n filter,\n column,\n onClickResizeColumn,\n createFilterField,\n AdditionalHeaderWidget\n }: VirtualTableHeaderProps<M>) {\n\n const [onHover, setOnHover] = useState(false);\n\n const [openFilter, setOpenFilter] = React.useState(false);\n const [hidden, setHidden] = React.useState(false);\n\n const handleSettingsClick = useCallback((event: any) => {\n setOpenFilter(true);\n }, []);\n\n const update = useCallback((filterForProperty?: [VirtualTableWhereFilterOp, any], newOpenFilterState?: boolean) => {\n onFilterUpdate(column, filterForProperty);\n if (newOpenFilterState !== undefined)\n setOpenFilter(newOpenFilterState);\n }, [column, onFilterUpdate]);\n\n const thisColumnIsResizing = isResizingIndex === columnIndex;\n const anotherColumnIsResizing = isResizingIndex !== columnIndex && isResizingIndex > 0;\n\n const hovered = !anotherColumnIsResizing && (onHover || thisColumnIsResizing);\n\n return (\n <ErrorBoundary>\n <div\n className={cn(\"flex py-0 px-3 h-full text-xs uppercase font-semibold relative select-none items-center bg-gray-50 dark:bg-gray-900\",\n \"text-gray-600 hover:text-gray-800 dark:text-gray-400 dark:hover:text-gray-200 \",\n \"hover:bg-gray-100 dark:hover:bg-gray-800 hover:bg-opacity-50 dark:hover:bg-opacity-50\",\n column.frozen ? \"sticky left-0 z-10\" : \"relative z-0\"\n )}\n style={{\n // transition: \"color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms\",\n // fontSize: \"0.750rem\",\n left: column.frozen ? 0 : undefined,\n minWidth: column.width,\n maxWidth: column.width\n }}\n onMouseEnter={() => setOnHover(true)}\n onMouseMove={() => setOnHover(true)}\n onMouseLeave={() => setOnHover(false)}\n >\n\n <div className=\"overflow-hidden flex-grow\">\n <div\n className={`flex items-center justify-${column.headerAlign} flex-row`}>\n\n {column.icon}\n\n <div\n className=\"truncate -webkit-box w-full mx-1 overflow-hidden\"\n style={{\n WebkitBoxOrient: \"vertical\",\n WebkitLineClamp: 2,\n justifyContent: column.align\n }}>\n {column.title}\n </div>\n\n </div>\n </div>\n <>\n\n {AdditionalHeaderWidget &&\n <AdditionalHeaderWidget onHover={onHover || openFilter}/>}\n\n {column.sortable && (sort || hovered || openFilter) &&\n <Badge color=\"secondary\"\n invisible={!sort}>\n <IconButton\n size={\"small\"}\n className={onHover || openFilter ? \"bg-white dark:bg-gray-950\" : undefined}\n onClick={() => {\n onColumnSort(column.key as Extract<keyof M, string>);\n }}\n >\n {!sort &&\n <ArrowUpwardIcon/>}\n {sort === \"asc\" &&\n <ArrowUpwardIcon/>}\n {sort === \"desc\" &&\n <ArrowUpwardIcon className={\"rotate-180\"}/>}\n </IconButton>\n </Badge>\n }\n </>\n\n {column.filter && createFilterField && <div>\n <Badge color=\"secondary\"\n invisible={!filter}>\n\n <Popover\n open={openFilter}\n onOpenChange={setOpenFilter}\n className={hidden ? \"hidden\" : undefined}\n modal={true}\n trigger={\n <IconButton\n className={onHover || openFilter ? \"bg-white dark:bg-gray-950\" : undefined}\n size={\"small\"}\n onClick={handleSettingsClick}>\n <FilterListIcon size={\"small\"}/>\n </IconButton>}\n >\n <FilterForm column={column}\n filter={filter}\n onHover={onHover}\n onFilterUpdate={update}\n createFilterField={createFilterField}\n hidden={hidden}\n setHidden={setHidden}/>\n\n </Popover>\n\n </Badge>\n\n </div>}\n\n {column.resizable && <div\n ref={resizeHandleRef}\n className={cn(\n \"absolute h-full w-[6px] top-0 right-0 cursor-col-resize\",\n hovered && \"bg-gray-300 dark:bg-gray-700\"\n )}\n onMouseDown={onClickResizeColumn ? () => onClickResizeColumn(columnIndex, column) : undefined}\n />}\n </div>\n\n </ErrorBoundary>\n );\n }, equal) as React.FunctionComponent<VirtualTableHeaderProps<any>>;\n\nfunction FilterForm<M>({\n column,\n onFilterUpdate,\n filter,\n onHover,\n createFilterField,\n hidden,\n setHidden\n }: FilterFormProps<M>) {\n\n const id = column.key;\n\n const [filterInternal, setFilterInternal] = useState<[VirtualTableWhereFilterOp, any] | undefined>(filter);\n\n useEffect(() => {\n setFilterInternal(filter);\n }, [filter]);\n\n if (!column.filter) return null;\n\n const submit = () => {\n onFilterUpdate(filterInternal, false);\n };\n\n const reset = (e: any) => {\n onFilterUpdate(undefined, false);\n };\n\n const filterIsSet = !!filter;\n\n const filterField = createFilterField({\n id,\n filterValue: filterInternal,\n setFilterValue: setFilterInternal,\n column,\n hidden,\n setHidden\n });\n\n if (!filterField) return null;\n return (\n <form noValidate={true}\n onSubmit={(e) => {\n e.stopPropagation();\n e.preventDefault();\n submit();\n }}\n className={\"text-gray-900 dark:text-white\"}>\n <div\n className={cn(defaultBorderMixin, \"py-4 px-6 text-xs font-semibold uppercase border-b\")}>\n {column.title ?? id}\n </div>\n {filterField && <div className=\"m-4\">\n {filterField}\n </div>}\n <div className=\"flex justify-end m-4\">\n <Button\n className=\"mr-4\"\n disabled={!filterIsSet}\n variant={\"text\"}\n color=\"primary\"\n type=\"reset\"\n aria-label=\"filter clear\"\n onClick={reset}>Clear</Button>\n <Button\n variant=\"outlined\"\n color=\"primary\"\n type=\"submit\">Filter</Button>\n </div>\n </form>\n );\n\n}\n","import React, { createRef, useCallback, useEffect, useState } from \"react\";\n\nimport { VirtualTableColumn, VirtualTableWhereFilterOp } from \"./VirtualTableProps\";\nimport { ErrorBoundary } from \"../ErrorBoundary\";\nimport { VirtualTableHeader } from \"./VirtualTableHeader\";\nimport { VirtualTableContextProps } from \"./types\";\nimport { cn, defaultBorderMixin } from \"@firecms/ui\";\n\nexport const VirtualTableHeaderRow = ({\n columns,\n currentSort,\n onColumnSort,\n onFilterUpdate,\n sortByProperty,\n filter,\n onColumnResize,\n onColumnResizeEnd,\n createFilterField,\n AddColumnComponent\n }: VirtualTableContextProps<any>) => {\n\n const columnRefs = columns.map(() => createRef<HTMLDivElement>());\n const [isResizing, setIsResizing] = useState(-1);\n\n const adjustWidthColumn = useCallback((index: number, width: number, end: boolean) => {\n const column = columns[index];\n const minWidth = 100;\n const maxWidth = 800;\n const newWidth = width > maxWidth ? maxWidth : (width < minWidth ? minWidth : width);\n const params = {\n width: newWidth,\n key: column.key as string,\n column: {\n ...column,\n width: newWidth\n } as VirtualTableColumn\n };\n if (!end)\n onColumnResize(params);\n else\n onColumnResizeEnd(params);\n }, [columns, onColumnResize, onColumnResizeEnd]);\n\n const getEventNewWidth = useCallback((e: MouseEvent) => {\n if (isResizing >= 0) {\n const left = columnRefs[isResizing].current?.parentElement?.getBoundingClientRect().left;\n if (!left) return;\n return e.clientX - left;\n }\n return undefined;\n }, [columnRefs, isResizing]);\n\n const setCursorDocument = useCallback((isResizing: boolean) => {\n document.body.style.cursor = isResizing ? \"col-resize\" : \"auto\";\n }, []);\n\n const handleOnMouseMove = useCallback((e: MouseEvent) => {\n e.stopPropagation();\n e.preventDefault();\n const newWidth = getEventNewWidth(e);\n if (newWidth)\n adjustWidthColumn(isResizing, newWidth, false);\n }, [adjustWidthColumn, getEventNewWidth, isResizing]);\n\n const handleOnMouseUp = useCallback((e: MouseEvent) => {\n e.stopPropagation();\n e.preventDefault();\n const newWidth = getEventNewWidth(e);\n if (newWidth)\n adjustWidthColumn(isResizing, newWidth, true);\n setIsResizing(-1);\n setCursorDocument(false);\n }, [adjustWidthColumn, getEventNewWidth, isResizing, setCursorDocument]);\n\n const removeResizingListeners = useCallback(() => {\n document.removeEventListener(\"mousemove\", handleOnMouseMove);\n document.removeEventListener(\"mouseup\", handleOnMouseUp);\n }, [handleOnMouseMove, handleOnMouseUp]);\n\n const attachResizeListeners = useCallback(() => {\n document.addEventListener(\"mousemove\", handleOnMouseMove);\n document.addEventListener(\"mouseup\", handleOnMouseUp);\n }, [handleOnMouseMove, handleOnMouseUp]);\n\n useEffect(() => {\n if (isResizing >= 0) {\n attachResizeListeners();\n } else {\n removeResizingListeners();\n }\n return () => {\n removeResizingListeners();\n };\n }, [attachResizeListeners, isResizing, removeResizingListeners]);\n\n const onClickResizeColumn = useCallback((index: number) => {\n setIsResizing(index);\n setCursorDocument(true);\n }, [setCursorDocument]);\n\n return (\n <div\n className={cn(defaultBorderMixin, \"z-20 sticky min-w-full flex w-fit flex-row top-0 left-0 h-12 border-b bg-gray-50 dark:bg-gray-900\")}>\n {columns.map((c, columnIndex) => {\n const column = columns[columnIndex];\n\n const filterForThisProperty: [VirtualTableWhereFilterOp, any] | undefined =\n column && filter && filter[column.key]\n ? filter[column.key]\n : undefined;\n return <ErrorBoundary key={\"header_\" + column.key}>\n <VirtualTableHeader\n resizeHandleRef={columnRefs[columnIndex]}\n columnIndex={columnIndex}\n isResizingIndex={isResizing}\n onFilterUpdate={onFilterUpdate}\n filter={filterForThisProperty}\n sort={sortByProperty === column.key ? currentSort : undefined}\n onColumnSort={onColumnSort}\n onClickResizeColumn={onClickResizeColumn}\n column={column}\n createFilterField={createFilterField}\n AdditionalHeaderWidget={column.AdditionalHeaderWidget}/>\n </ErrorBoundary>;\n })}\n\n {AddColumnComponent && <AddColumnComponent/>}\n\n </div>\n );\n};\n","import React, { useCallback } from \"react\";\n\nimport equal from \"react-fast-compare\"\n\nimport { getRowHeight } from \"./common\";\nimport { VirtualTableRowProps } from \"./types\";\nimport { cn } from \"@firecms/ui\";\n\nexport const VirtualTableRow = React.memo<VirtualTableRowProps<any>>(\n function VirtualTableRow<T>({\n rowData,\n rowIndex,\n children,\n onRowClick,\n size,\n style,\n hoverRow,\n rowClassName\n }: VirtualTableRowProps<T>) {\n\n const onClick = useCallback((event: React.SyntheticEvent) => {\n if (onRowClick)\n onRowClick({\n rowData,\n rowIndex,\n event\n })\n }, [onRowClick, rowData, rowIndex]);\n\n return (\n <div\n className={cn(\n \"flex min-w-full text-sm border-b border-gray-200 dark:border-gray-800 border-opacity-40 dark:border-opacity-40\",\n rowClassName ? rowClassName(rowData) : \"\",\n {\n \"hover:bg-opacity-95\": hoverRow,\n \"cursor-pointer\": onRowClick\n }\n )}\n onClick={onClick}\n style={{\n ...(style),\n height: getRowHeight(size),\n width: \"fit-content\"\n }}\n >\n {children}\n </div>\n );\n\n },\n equal\n);\n","import React from \"react\";\n\nimport equal from \"react-fast-compare\"\n\nimport { CellRendererParams, VirtualTableColumn } from \"./VirtualTableProps\";\n\ntype VirtualTableCellProps<T extends any> = {\n dataKey: string;\n column: VirtualTableColumn;\n columns: VirtualTableColumn[];\n rowData: any;\n cellData: any;\n rowIndex: any;\n columnIndex: number;\n cellRenderer: React.ComponentType<CellRendererParams<T>>;\n};\n\nexport const VirtualTableCell = React.memo<VirtualTableCellProps<any>>(\n function VirtualTableCell<T extends any>(props: VirtualTableCellProps<T>) {\n // @ts-ignore\n return props.rowData && props.cellRenderer(\n {\n cellData: props.cellData,\n rowData: props.rowData,\n rowIndex: props.rowIndex,\n isScrolling: false,\n column: props.column,\n columns: props.columns,\n columnIndex: props.columnIndex,\n width: props.column.width\n } as CellRendererParams<T>\n );\n // return props.rowData && <props.cellRenderer\n // rowData={props.rowData}\n // rowIndex={props.rowIndex}\n // isScrolling={false}\n // column={props.column}\n // columns={props.columns}\n // columnIndex={props.columnIndex}\n // width={props.column.width}/>\n },\n (a, b) => {\n return equal(a.rowData, b.rowData) &&\n equal(a.column, b.column) &&\n equal(a.cellData, b.cellData) &&\n equal(a.rowIndex, b.rowIndex) &&\n equal(a.cellRenderer, b.cellRenderer) &&\n equal(a.columnIndex, b.columnIndex)\n }\n);\n","import React, { createContext, forwardRef, RefObject, useCallback, useEffect, useRef, useState } from \"react\";\n\nimport equal from \"react-fast-compare\"\n\n// @ts-ignore\nimport { FixedSizeList as List } from \"react-window\";\nimport useMeasure from \"react-use-measure\";\n\nimport { CircularProgressCenter } from \"../CircularProgressCenter\";\nimport {\n OnVirtualTableColumnResizeParams,\n VirtualTableColumn,\n VirtualTableFilterValues,\n VirtualTableProps,\n VirtualTableWhereFilterOp\n} from \"./VirtualTableProps\";\n\nimport { getRowHeight } from \"./common\";\nimport { VirtualTableContextProps } from \"./types\";\nimport { VirtualTableHeaderRow } from \"./VirtualTableHeaderRow\";\nimport { VirtualTableRow } from \"./VirtualTableRow\";\nimport { VirtualTableCell } from \"./VirtualTableCell\";\nimport { AssignmentIcon, cn, Markdown, Typography } from \"@firecms/ui\";\n\nconst VirtualListContext = createContext<VirtualTableContextProps<any>>({} as any);\nVirtualListContext.displayName = \"VirtualListContext\";\n\ntype InnerElementProps = {\n children: React.ReactNode,\n style: any\n};\n\n// eslint-disable-next-line react/display-name\nconst innerElementType = forwardRef<HTMLDivElement, InnerElementProps>(({\n children,\n ...rest\n }: InnerElementProps, ref) => {\n\n return (\n <VirtualListContext.Consumer>\n {(virtualTableProps) => {\n const customView = virtualTableProps.customView;\n return (\n <>\n <div\n id={\"virtual-table\"}\n style={{\n position: \"relative\",\n height: \"100%\"\n }}>\n <div\n ref={ref}\n {...rest}\n style={{\n ...rest?.style,\n minHeight: \"100%\",\n position: \"relative\"\n }}>\n <VirtualTableHeaderRow {...virtualTableProps}/>\n {!customView && children}\n </div>\n\n </div>\n\n {customView && <div style={{\n position: \"sticky\",\n top: \"56px\",\n flexGrow: 1,\n height: \"calc(100% - 56px)\",\n marginTop: \"calc(56px - 100vh)\",\n left: 0\n }}>{customView}</div>}\n\n </>\n );\n }}\n </VirtualListContext.Consumer>\n );\n })\n;\n\n/**\n * This is a Table component that allows displaying arbitrary data, not\n * necessarily related to entities or properties. It is the component\n * that powers the entity collections but has a generic API, so it\n * can be reused.\n *\n * @group Components\n */\nexport const VirtualTable = React.memo<VirtualTableProps<any>>(\n function VirtualTable<T extends Record<string, any>>({\n data,\n onResetPagination,\n onEndReached,\n size = \"m\",\n columns: columnsProp,\n onRowClick,\n onColumnResize,\n filter: filterInput,\n checkFilterCombination,\n onFilterUpdate,\n sortBy,\n error,\n emptyComponent,\n onSortByUpdate,\n loading,\n cellRenderer,\n hoverRow,\n createFilterField,\n rowClassName,\n className,\n endAdornment,\n AddColumnComponent\n }: VirtualTableProps<T>) {\n\n const sortByProperty: string | undefined = sortBy ? sortBy[0] : undefined;\n const currentSort: \"asc\" | \"desc\" | undefined = sortBy ? sortBy[1] : undefined;\n\n const [columns, setColumns] = useState(columnsProp);\n\n const tableRef = useRef<HTMLDivElement>(null);\n const endReachCallbackThreshold = useRef<number>(0);\n\n useEffect(() => {\n setColumns(columnsProp);\n }, [columnsProp]);\n\n const [measureRef, bounds] = useMeasure();\n\n const onColumnResizeInternal = useCallback((params: OnVirtualTableColumnResizeParams) => {\n setColumns(columns.map((column) => column.key === params.column.key ? params.column : column));\n }, [columns]);\n\n const onColumnResizeEndInternal = useCallback((params: OnVirtualTableColumnResizeParams) => {\n setColumns(columns.map((column) => column.key === params.column.key ? params.column : column));\n if (onColumnResize) {\n onColumnResize(params);\n }\n }, [columns, onColumnResize]);\n\n // saving the current filter as a ref as a workaround for header closure\n const filterRef = useRef<VirtualTableFilterValues<any> | undefined>();\n\n useEffect(() => {\n filterRef.current = filterInput;\n }, [filterInput]);\n\n const scrollToTop = useCallback(() => {\n endReachCallbackThreshold.current = 0;\n if (tableRef.current) {\n // scrollRef.current = [scrollRef.current[0], 0];\n tableRef.current.scrollTo(tableRef.current?.scrollLeft, 0);\n }\n }, []);\n\n const onColumnSort = useCallback((key: string) => {\n\n const isDesc = sortByProperty === key && currentSort === \"desc\";\n const isAsc = sortByProperty === key && currentSort === \"asc\";\n const newSort = isAsc ? \"desc\" : (isDesc ? undefined : \"asc\");\n const newSortProperty: string | undefined = isDesc ? undefined : key;\n\n const filter = filterRef.current;\n\n const newSortBy: [string, \"asc\" | \"desc\"] | undefined = newSort && newSortProperty ? [newSortProperty, newSort] : undefined;\n if (filter) {\n if (checkFilterCombination && !checkFilterCombination(filter, newSortBy)) {\n if (onFilterUpdate)\n onFilterUpdate(undefined);\n }\n }\n\n if (onResetPagination) {\n onResetPagination();\n }\n\n if (onSortByUpdate) {\n onSortByUpdate(newSortBy);\n }\n\n scrollToTop();\n }, [checkFilterCombination, currentSort, onFilterUpdate, onResetPagination, onSortByUpdate, scrollToTop, sortByProperty]);\n\n const resetSort = useCallback(() => {\n endReachCallbackThreshold.current = 0;\n if (onSortByUpdate)\n onSortByUpdate(undefined);\n }, [onSortByUpdate]);\n\n const maxScroll = Math.max((data?.length ?? 0) * getRowHeight(size) - bounds.height, 0);\n const onEndReachedInternal = useCallback((scrollOffset: number) => {\n if (onEndReached && (data?.length ?? 0) > 0 && scrollOffset > endReachCallbackThreshold.current + 600) {\n endReachCallbackThreshold.current = scrollOffset;\n onEndReached();\n }\n }, [data?.length, onEndReached]);\n\n const onScroll = useCallback(({\n scrollOffset,\n scrollUpdateWasRequested\n }: {\n scrollDirection: \"forward\" | \"backward\",\n scrollOffset: number,\n scrollUpdateWasRequested: boolean;\n }) => {\n if (!scrollUpdateWasRequested && (scrollOffset >= maxScroll - 600))\n onEndReachedInternal(scrollOffset);\n }, [maxScroll, onEndReachedInternal]);\n\n const onFilterUpdateInternal = useCallback((column: VirtualTableColumn, filterForProperty?: [VirtualTableWhereFilterOp, any]) => {\n\n endReachCallbackThreshold.current = 0;\n const filter = filterRef.current;\n let newFilterValue: VirtualTableFilterValues<any> = filter ? { ...filter } : {};\n\n if (!filterForProperty) {\n delete newFilterValue[column.key];\n } else {\n newFilterValue[column.key] = filterForProperty;\n }\n const newSortBy: [string, \"asc\" | \"desc\"] | undefined = sortByProperty && currentSort ? [sortByProperty, currentSort] : undefined;\n const isNewFilterCombinationValid = !checkFilterCombination || checkFilterCombination(newFilterValue, newSortBy);\n if (!isNewFilterCombinationValid) {\n newFilterValue = filterForProperty ? { [column.key]: filterForProperty } as VirtualTableFilterValues<Extract<keyof T, string>> : {};\n }\n\n if (onFilterUpdate) onFilterUpdate(newFilterValue);\n\n if (column.key !== sortByProperty) {\n resetSort();\n }\n }, [checkFilterCombination, currentSort, onFilterUpdate, resetSort, sortByProperty]);\n\n const buildErrorView = useCallback(() => (\n <div\n className=\"h-full flex flex-col items-center justify-center sticky left-0\">\n\n <Typography variant={\"h6\"}>\n {\"Error fetching data from the data source\"}\n </Typography>\n\n {error?.message && <Markdown className={\"px-4 break-all\"} source={error.message}/>}\n\n </div>\n ), [error?.message]);\n\n const buildEmptyView = useCallback(() => {\n if (loading)\n return <CircularProgressCenter/>;\n return <div\n className=\"flex flex-col overflow-auto items-center justify-center p-2 gap-2 h-full\">\n <AssignmentIcon/>\n {emptyComponent}\n </div>;\n }, [emptyComponent, loading]);\n\n const empty = !loading && (data?.length ?? 0) === 0;\n const customView = error ? buildErrorView() : (empty ? buildEmptyView() : undefined);\n\n const virtualListController = {\n data,\n size,\n cellRenderer,\n columns,\n currentSort,\n onRowClick,\n customView,\n onColumnResize: onColumnResizeInternal,\n onColumnResizeEnd: onColumnResizeEndInternal,\n filter: filterRef.current,\n onColumnSort,\n onFilterUpdate: onFilterUpdateInternal,\n sortByProperty,\n hoverRow: hoverRow ?? false,\n createFilterField,\n rowClassName,\n endAdornment,\n AddColumnComponent\n };\n\n // useTraceUpdate(virtualListController);\n return (\n <div\n ref={measureRef}\n className={cn(\"h-full w-full\", className)}>\n <VirtualListContext.Provider\n value={virtualListController}>\n\n <MemoizedList\n outerRef={tableRef}\n key={size}\n width={bounds.width}\n height={bounds.height}\n itemCount={(data?.length ?? 0) + (endAdornment ? 1 : 0)}\n onScroll={onScroll}\n includeAddColumn={Boolean(AddColumnComponent)}\n itemSize={getRowHeight(size)}/>\n\n </VirtualListContext.Provider>\n </div>\n );\n },\n equal\n);\n\nfunction MemoizedList({\n outerRef,\n width,\n height,\n itemCount,\n onScroll,\n itemSize,\n includeAddColumn\n }: {\n outerRef: RefObject<HTMLDivElement>;\n width: number;\n height: number;\n itemCount: number;\n onScroll: (params: {\n scrollDirection: \"forward\" | \"backward\",\n scrollOffset: number,\n scrollUpdateWasRequested: boolean;\n }) => void;\n itemSize: number;\n includeAddColumn?: boolean;\n}) {\n\n const Row = useCallback(({\n index,\n style\n }: any) => {\n return <VirtualListContext.Consumer>\n {({\n onRowClick,\n data,\n columns,\n size = \"m\",\n cellRenderer,\n hoverRow,\n rowClassName,\n endAdornment\n }) => {\n\n if (endAdornment && index === (data ?? []).length) {\n return <div style={{\n ...style,\n height: \"auto\",\n position: \"sticky\",\n bottom: 0,\n zIndex: 1\n }}>\n {endAdornment}\n </div>;\n }\n\n const rowData = data && data[index];\n return (\n <VirtualTableRow\n key={`row_${index}`}\n rowData={rowData}\n rowIndex={index}\n onRowClick={onRowClick}\n columns={columns}\n hoverRow={hoverRow}\n rowClassName={rowClassName}\n style={{\n ...style,\n top: `calc(${style.top}px + 48px)`\n }}\n size={size}>\n\n {columns.map((column: VirtualTableColumn, columnIndex: number) => {\n const cellData = rowData && rowData[column.key];\n return <VirtualTableCell\n key={`cell_${column.key}`}\n dataKey={column.key}\n cellRenderer={cellRenderer}\n column={column}\n columns={columns}\n rowData={rowData}\n cellData={cellData}\n rowIndex={index}\n columnIndex={columnIndex}/>;\n })}\n\n {includeAddColumn && <div className={\"w-20\"}/>}\n\n </VirtualTableRow>\n );\n }}\n </VirtualListContext.Consumer>;\n }, []);\n\n return <List\n outerRef={outerRef}\n innerElementType={innerElementType}\n width={width}\n height={height}\n overscanCount={4}\n itemCount={itemCount}\n onScroll={onScroll}\n itemSize={itemSize}>\n {Row}\n </List>;\n}\n","import React, { useMemo, useState } from \"react\";\nimport { VirtualTableWhereFilterOp } from \"../../VirtualTable\";\nimport { Entity, EntityCollection, EntityReference } from \"../../../types\";\nimport { ReferencePreview } from \"../../../preview\";\nimport { getReferenceFrom } from \"../../../util\";\nimport { useNavigationController, useReferenceDialog } from \"../../../hooks\";\nimport { Button, Select, SelectItem } from \"@firecms/ui\";\n\ninterface ReferenceFilterFieldProps {\n name: string,\n value?: [op: VirtualTableWhereFilterOp, fieldValue: any];\n setValue: (filterValue?: [VirtualTableWhereFilterOp, any]) => void;\n isArray?: boolean;\n path?: string;\n title?: string;\n previewProperties?: string[];\n hidden: boolean;\n setHidden: (hidden: boolean) => void;\n}\n\nconst operationLabels = {\n \"==\": \"==\",\n \"!=\": \"!=\",\n \">\": \">\",\n \"<\": \"<\",\n \">=\": \">=\",\n \"<=\": \"<=\",\n in: \"In\",\n \"not-in\": \"Not in\",\n \"array-contains\": \"Contains\",\n \"array-contains-any\": \"Contains Any\"\n};\n\nconst multipleSelectOperations = [\"array-contains-any\", \"in\", \"not-in\"];\n\nexport function ReferenceFilterField({\n name,\n value,\n setValue,\n isArray,\n path,\n title,\n previewProperties,\n setHidden\n }: ReferenceFilterFieldProps) {\n\n const possibleOperations: (keyof typeof operationLabels) [] = isArray\n ? [\"array-contains\"]\n : [\"==\", \"!=\", \">\", \"<\", \">=\", \"<=\"];\n\n isArray\n ? possibleOperations.push(\"array-contains-any\")\n : possibleOperations.push(\"in\", \"not-in\");\n\n const [fieldOperation, fieldValue] = value || [possibleOperations[0], undefined];\n const [operation, setOperation] = useState<VirtualTableWhereFilterOp>(fieldOperation);\n const [internalValue, setInternalValue] = useState<EntityReference | EntityReference[] | undefined>(fieldValue);\n\n const selectedEntityIds = internalValue\n ? (Array.isArray(internalValue) ? internalValue.map((ref) => {\n if (!(ref?.isEntityReference && ref?.isEntityReference())) {\n return null;\n }\n return ref.id;\n }).filter(Boolean) as string[] : [internalValue.id])\n : [];\n\n function updateFilter(op: VirtualTableWhereFilterOp, val?: EntityReference | EntityReference[]) {\n\n const prevOpIsArray = multipleSelectOperations.includes(operation);\n const newOpIsArray = multipleSelectOperations.includes(op);\n let newValue = val;\n if (prevOpIsArray !== newOpIsArray) {\n // @ts-ignore\n newValue = newOpIsArray ? (newValue?.isEntityReference && newValue?.isEntityReference() ? [newValue] : []) : undefined\n }\n\n setOperation(op);\n setInternalValue(newValue);\n\n const hasNewValue = newValue !== null && Array.isArray(newValue)\n ? newValue.length > 0\n : newValue !== undefined;\n if (op && hasNewValue) {\n setValue(\n [op, newValue]\n );\n } else {\n setValue(\n undefined\n );\n }\n }\n\n const navigationController = useNavigationController();\n const collection: EntityCollection | undefined = useMemo(() => {\n return path ? navigationController.getCollection(path) : undefined;\n }, [path]);\n\n const onSingleEntitySelected = (entity: Entity<any>) => {\n updateFilter(operation, getReferenceFrom(entity));\n };\n\n const onMultipleEntitiesSelected = (entities: Entity<any>[]) => {\n updateFilter(operation, entities.map(e => getReferenceFrom(e)));\n };\n\n const multiple = multipleSelectOperations.includes(operation);\n\n const referenceDialogController = useReferenceDialog({\n multiselect: multiple,\n path,\n collection,\n onSingleEntitySelected,\n onMultipleEntitiesSelected,\n selectedEntityIds,\n onClose: () => {\n setHidden(false);\n }\n }\n );\n\n const doOpenDialog = () => {\n setHidden(true);\n referenceDialogController.open();\n };\n\n const buildEntry = (reference: EntityReference) => {\n return (\n <ReferencePreview\n disabled={!path}\n previewProperties={previewProperties}\n size={\"medium\"}\n onClick={doOpenDialog}\n reference={reference}\n hover={true}\n allowEntityNavigation={false}\n />\n );\n };\n\n return (\n\n <div className=\"flex w-[440px] flex-row\">\n <div className=\"w-[120px]\">\n <Select value={operation}\n onValueChange={(value) => {\n updateFilter(value as VirtualTableWhereFilterOp, internalValue);\n }}\n renderValue={(op) => operationLabels[op as VirtualTableWhereFilterOp]}>\n {possibleOperations.map((op) => (\n <SelectItem key={op} value={op}>\n {operationLabels[op]}\n </SelectItem>\n ))}\n </Select>\n </div>\n\n <div className=\"flex-grow ml-2 h-full\">\n\n {internalValue && Array.isArray(internalValue) && <div>\n {internalValue.map((ref, index) => buildEntry(ref))}\n </div>}\n {internalValue && !Array.isArray(internalValue) && <div>\n {buildEntry(internalValue)}\n </div>}\n {(!internalValue || (Array.isArray(internalValue) && internalValue.length === 0)) &&\n <Button onClick={doOpenDialog}\n variant={\"outlined\"}\n className=\"h-full w-full\">\n {multiple ? \"Select references\" : \"Select reference\"}\n </Button>\n }\n </div>\n\n </div>\n );\n\n}\n","import React, { useState } from \"react\";\nimport { EnumValuesChip } from \"../../../preview\";\nimport { VirtualTableWhereFilterOp } from \"../../VirtualTable\";\nimport { ClearIcon, IconButton, Select, SelectItem, TextField } from \"@firecms/ui\";\nimport { EnumValueConfig } from \"../../../types\";\n\ninterface StringNumberFilterFieldProps {\n name: string,\n dataType: \"string\" | \"number\";\n value?: [op: VirtualTableWhereFilterOp, fieldValue: any];\n setValue: (value?: [op: VirtualTableWhereFilterOp, newValue: any]) => void;\n isArray?: boolean;\n enumValues?: EnumValueConfig[];\n title?: string;\n}\n\nconst operationLabels = {\n \"==\": \"==\",\n \"!=\": \"!=\",\n \">\": \">\",\n \"<\": \"<\",\n \">=\": \">=\",\n \"<=\": \"<=\",\n in: \"In\",\n \"not-in\": \"Not in\",\n \"array-contains\": \"Contains\",\n \"array-contains-any\": \"Any\"\n};\n\nconst multipleSelectOperations = [\"array-contains-any\", \"in\", \"not-in\"];\n\nexport function StringNumberFilterField({\n name,\n value,\n setValue,\n dataType,\n isArray,\n enumValues,\n title\n }: StringNumberFilterFieldProps) {\n\n const possibleOperations: (keyof typeof operationLabels) [] = isArray\n ? [\"array-contains\"]\n : [\"==\", \"!=\", \">\", \"<\", \">=\", \"<=\"];\n\n if (enumValues)\n isArray\n ? possibleOperations.push(\"array-contains-any\")\n : possibleOperations.push(\"in\", \"not-in\");\n\n const [fieldOperation, fieldValue] = value || [possibleOperations[0], undefined];\n const [operation, setOperation] = useState<VirtualTableWhereFilterOp>(fieldOperation);\n const [internalValue, setInternalValue] = useState<string | number | string[] | number[] | undefined>(fieldValue);\n\n function updateFilter(op: VirtualTableWhereFilterOp, val: string | number | string[] | number[] | undefined) {\n let newValue = val;\n const prevOpIsArray = multipleSelectOperations.includes(operation);\n const newOpIsArray = multipleSelectOperations.includes(op);\n if (prevOpIsArray !== newOpIsArray) {\n // @ts-ignore\n newValue = newOpIsArray ? (typeof val === \"string\" || typeof val === \"number\" ? [val] : []) : \"\";\n }\n\n if (typeof newValue === \"number\" && isNaN(newValue))\n newValue = undefined;\n\n setOperation(op);\n setInternalValue(newValue);\n\n const hasNewValue = newValue !== null && Array.isArray(newValue)\n ? newValue.length > 0\n : newValue !== undefined;\n if (op && hasNewValue) {\n setValue(\n [op, newValue]\n );\n } else {\n setValue(\n undefined\n );\n }\n }\n\n const multiple = multipleSelectOperations.includes(operation);\n return (\n\n <div className=\"flex w-[440px] items-center\">\n <div className={\"w-[80px]\"}>\n <Select value={operation}\n position={\"item-aligned\"}\n onValueChange={(value) => {\n updateFilter(value as VirtualTableWhereFilterOp, internalValue);\n }}\n renderValue={(op) => operationLabels[op as VirtualTableWhereFilterOp]}>\n {possibleOperations.map((op) => (\n <SelectItem key={op} value={op}>\n {operationLabels[op]}\n </SelectItem>\n ))}\n </Select>\n </div>\n\n <div className=\"flex-grow ml-2\">\n\n {!enumValues && <TextField\n type={dataType === \"number\" ? \"number\" : undefined}\n value={internalValue !== undefined ? String(internalValue) : \"\"}\n onChange={(evt) => {\n const val = dataType === \"number\"\n ? parseFloat(evt.target.value)\n : evt.target.value;\n updateFilter(operation, val);\n }}\n endAdornment={internalValue && <IconButton\n onClick={(e) => updateFilter(operation, undefined)}>\n <ClearIcon/>\n </IconButton>}\n />}\n\n {enumValues &&\n\n <Select\n position={\"item-aligned\"}\n value={internalValue !== undefined\n ? (Array.isArray(internalValue) ? internalValue.map(e => String(e)) : String(internalValue))\n : isArray ? [] : \"\"}\n onValueChange={(value) => {\n updateFilter(operation, dataType === \"number\" ? parseInt(value as string) : value as string)\n }}\n multiple={multiple}\n endAdornment={internalValue && <IconButton\n className=\"absolute right-3 top-2\"\n onClick={(e) => updateFilter(operation, undefined)}>\n <ClearIcon/>\n </IconButton>}\n renderValue={(enumKey) => <EnumValuesChip\n key={`select_value_${name}_${enumKey}`}\n enumKey={enumKey}\n enumValues={enumValues}\n size={\"small\"}/>}>\n {enumValues.map((enumConfig) => (\n <SelectItem key={`select_value_${name}_${enumConfig.id}`}\n value={String(enumConfig.id)}>\n <EnumValuesChip\n enumKey={String(enumConfig.id)}\n enumValues={enumValues}\n size={\"small\"}/>\n </SelectItem>\n ))}\n </Select>\n }\n\n </div>\n\n </div>\n );\n\n}\n","import React from \"react\";\nimport { VirtualTableWhereFilterOp } from \"../../VirtualTable\";\nimport { BooleanSwitchWithLabel } from \"@firecms/ui\";\n\ninterface BooleanFieldProps {\n name: string,\n value?: [op: VirtualTableWhereFilterOp, fieldValue: any];\n setValue: (value?: [op: VirtualTableWhereFilterOp, newValue: any]) => void;\n title?: string;\n}\n\nexport function BooleanFilterField({\n name,\n title,\n value,\n setValue\n }: BooleanFieldProps) {\n\n function updateFilter(val?: boolean) {\n if (val !== undefined) {\n setValue(\n [\"==\", val]\n );\n } else {\n setValue(\n undefined\n );\n }\n }\n\n const valueSetToTrue = value && value[1];\n const valueSet = !!value;\n\n return (\n <div className=\"w-[200px]\">\n <BooleanSwitchWithLabel\n value={valueSetToTrue}\n allowIndeterminate={true}\n onValueChange={(v: boolean | null) => updateFilter(v === null ? undefined : v)}\n label={!valueSet\n ? \"No filter\"\n : valueSetToTrue\n ? `${title} is true`\n : `${title} is false`}\n />\n </div>\n )\n ;\n}\n","import React, { useState } from \"react\";\nimport { VirtualTableWhereFilterOp } from \"../../VirtualTable\";\nimport { DateTimeField, Select, SelectItem } from \"@firecms/ui\";\nimport { useCustomizationController } from \"../../../hooks\";\n\ninterface DateTimeFilterFieldProps {\n name: string,\n mode?: \"date\" | \"date_time\",\n value?: [op: VirtualTableWhereFilterOp, fieldValue: any];\n setValue: (value?: [op: VirtualTableWhereFilterOp, newValue: any]) => void;\n isArray?: boolean;\n title?: string;\n}\n\nconst operationLabels: Record<VirtualTableWhereFilterOp, string> = {\n \"==\": \"==\",\n \"!=\": \"!=\",\n \">\": \">\",\n \"<\": \"<\",\n \">=\": \">=\",\n \"<=\": \"<=\",\n \"not-in\": \"not in\",\n in: \"in\",\n \"array-contains\": \"Contains\",\n \"array-contains-any\": \"Any\"\n};\n\nconst multipleSelectOperations = [\"array-contains-any\", \"in\"];\n\nexport function DateTimeFilterField({\n name,\n isArray,\n mode,\n value,\n setValue,\n title\n }: DateTimeFilterFieldProps) {\n\n const { locale } = useCustomizationController();\n const possibleOperations: (keyof typeof operationLabels) [] = isArray\n ? [\"array-contains\"]\n : [\"==\", \"!=\", \">\", \"<\", \">=\", \"<=\"];\n\n const [fieldOperation, fieldValue] = value || [possibleOperations[0], undefined];\n const [operation, setOperation] = useState<VirtualTableWhereFilterOp>(fieldOperation);\n const [internalValue, setInternalValue] = useState<Date | undefined>(fieldValue);\n\n function updateFilter(op: VirtualTableWhereFilterOp, val: Date | undefined) {\n let newValue: Date | undefined = val;\n const prevOpIsArray = multipleSelectOperations.includes(operation);\n const newOpIsArray = multipleSelectOperations.includes(op);\n if (prevOpIsArray !== newOpIsArray) {\n // @ts-ignore\n newValue = newOpIsArray ? (val ? [val] : []) : \"\";\n }\n\n setOperation(op);\n setInternalValue(newValue === null ? undefined : newValue);\n\n const hasNewValue = newValue !== null && Array.isArray(newValue)\n ? newValue.length > 0\n : newValue !== undefined;\n if (op && hasNewValue) {\n setValue(\n [op, newValue]\n );\n } else {\n setValue(\n undefined\n );\n }\n }\n\n return (\n\n <div className=\"flex w-[440px] items-center\">\n <div className=\"w-[80px]\">\n <Select value={operation}\n onValueChange={(value) => {\n updateFilter(value as VirtualTableWhereFilterOp, internalValue);\n }}\n renderValue={(op) => operationLabels[op as VirtualTableWhereFilterOp]}>\n {possibleOperations.map((op) => (\n <SelectItem key={op} value={op}>\n {operationLabels[op]}\n </SelectItem>\n ))}\n </Select>\n </div>\n\n <div className=\"flex-grow ml-2\">\n\n <DateTimeField\n mode={mode}\n size={\"medium\"}\n locale={locale}\n value={internalValue}\n onChange={(dateValue: Date | null) => {\n updateFilter(operation, dateValue === null ? undefined : dateValue);\n }}\n clearable={true}\n />\n\n </div>\n\n </div>\n );\n\n}\n","import React, { useCallback, useEffect, useRef } from \"react\";\nimport equal from \"react-fast-compare\";\nimport {\n CollectionSize,\n Entity,\n EntityTableController,\n FilterValues,\n ResolvedProperty,\n SelectedCellProps\n} from \"../../types\";\nimport { CellRendererParams, VirtualTable, VirtualTableColumn } from \"../VirtualTable\";\nimport { enumToObjectEntries } from \"../../util\";\nimport { OnCellValueChange, OnColumnResizeParams } from \"../common/types\";\nimport { FilterFormFieldProps } from \"../VirtualTable/VirtualTableHeader\";\nimport { ReferenceFilterField } from \"./filters/ReferenceFilterField\";\nimport { StringNumberFilterField } from \"./filters/StringNumberFilterField\";\nimport { BooleanFilterField } from \"./filters/BooleanFilterField\";\nimport { DateTimeFilterField } from \"./filters/DateTimeFilterField\";\nimport { useOutsideAlerter } from \"@firecms/ui\";\nimport { SelectableTableContext } from \"./SelectableTableContext\";\n\nexport type SelectableTableProps<M extends Record<string, any>> = {\n\n /**\n * Callback when a cell value changes.\n */\n onValueChange?: OnCellValueChange<any, M>;\n\n columns: VirtualTableColumn[];\n\n cellRenderer: React.ComponentType<CellRendererParams<Entity<M>>>;\n\n /**\n * Builder for creating the buttons in each row\n * @param entity\n * @param size\n */\n tableRowActionsBuilder?: (params: {\n entity: Entity<M>,\n size: CollectionSize,\n width: number,\n frozen?: boolean\n }) => React.ReactNode;\n\n /**\n * Callback when anywhere on the table is clicked\n */\n onEntityClick?(entity: Entity<M>): void;\n\n /**\n * Callback when a column is resized\n */\n onColumnResize?(params: OnColumnResizeParams): void;\n\n /**\n * Should apply a different style to a row when hovering\n */\n hoverRow?: boolean;\n\n /**\n * Controller holding the logic for the table\n * {@link useDataSourceEntityCollectionTableController}\n * {@link EntityTableController}\n */\n tableController: EntityTableController<M>;\n\n filterable?: boolean;\n\n sortable?: boolean;\n\n inlineEditing?: boolean;\n\n forceFilter?: FilterValues<keyof M extends string ? keyof M : never>;\n\n highlightedRow?: (data: Entity<M>) => boolean;\n\n size?: CollectionSize;\n\n emptyComponent?: React.ReactNode;\n\n endAdornment?: React.ReactNode;\n\n AddColumnComponent?: React.ComponentType;\n}\n\n/**\n * This component is in charge of rendering a collection table with a high\n * degree of customization.\n *\n * This component is used internally by {@link EntityCollectionView} and\n * {@link useReferenceDialog}\n *\n * Please note that you only need to use this component if you are building\n * a custom view. If you just need to create a default view you can do it\n * exclusively with config options.\n *\n * If you want to bind a {@link EntityCollection} to a table with the default\n * options you see in collections in the top level navigation, you can\n * check {@link EntityCollectionView}.\n *\n * The data displayed in the table is managed by a {@link EntityTableController}.\n * You can build the default, bound to a path in the datasource, by using the hook\n * {@link useDataSourceEntityCollectionTableController}\n *\n * @see EntityCollectionTableProps\n * @see EntityCollectionView\n * @see VirtualTable\n * @group Components\n */\nexport const SelectableTable = React.memo<SelectableTableProps<any>>(\n function SelectableTable<M extends Record<string, any>>\n ({\n onValueChange,\n cellRenderer,\n onEntityClick,\n onColumnResize,\n hoverRow = true,\n size,\n inlineEditing = false,\n tableController:\n {\n data,\n dataLoading,\n noMoreToLoad,\n dataLoadingError,\n filterValues,\n setFilterValues,\n sortBy,\n setSortBy,\n setSearchString,\n clearFilter,\n itemCount,\n setItemCount,\n pageSize = 50,\n paginationEnabled,\n checkFilterCombination,\n setPopupCell\n },\n filterable = true,\n emptyComponent,\n columns,\n forceFilter,\n highlightedRow,\n endAdornment,\n AddColumnComponent\n }: SelectableTableProps<M>) {\n\n const ref = useRef<HTMLDivElement>(null);\n\n const [selectedCell, setSelectedCell] = React.useState<SelectedCellProps<M> | undefined>(undefined);\n\n const loadNextPage = () => {\n if (!paginationEnabled || dataLoading || noMoreToLoad)\n return;\n if (itemCount !== undefined)\n setItemCount?.(itemCount + pageSize);\n };\n\n const resetPagination = useCallback(() => {\n setItemCount?.(pageSize);\n }, [pageSize]);\n\n const onRowClick = useCallback(({ rowData }: {\n rowData: Entity<M>\n }) => {\n if (inlineEditing)\n return;\n return onEntityClick && onEntityClick(rowData);\n }, [onEntityClick, inlineEditing]);\n\n useOutsideAlerter(ref,\n () => {\n if (selectedCell) {\n unselect();\n }\n },\n Boolean(selectedCell));\n\n // on ESC key press\n useEffect(() => {\n const escFunction = (event: any) => {\n if (event.keyCode === 27) {\n unselect();\n }\n };\n document.addEventListener(\"keydown\", escFunction, false);\n return () => {\n document.removeEventListener(\"keydown\", escFunction, false);\n };\n });\n\n const select = useCallback((cell?: SelectedCellProps<M>) => {\n setSelectedCell(cell);\n }, []);\n\n const unselect = useCallback(() => {\n setSelectedCell(undefined);\n }, []);\n\n const onFilterUpdate = useCallback((updatedFilterValues?: FilterValues<any>) => {\n setFilterValues?.({ ...updatedFilterValues, ...forceFilter } as FilterValues<any>);\n }, [forceFilter]);\n\n return (\n <SelectableTableContext.Provider\n value={{\n setPopupCell: setPopupCell as ((cell?: SelectedCellProps<M>) => void),\n select,\n onValueChange,\n size: size ?? \"m\",\n selectedCell,\n }}\n >\n <div className=\"h-full w-full flex flex-col bg-white dark:bg-gray-950\"\n ref={ref}>\n\n <VirtualTable\n data={data}\n columns={columns}\n cellRenderer={cellRenderer}\n onRowClick={inlineEditing ? undefined : (onEntityClick ? onRowClick : undefined)}\n onEndReached={loadNextPage}\n onResetPagination={resetPagination}\n error={dataLoadingError}\n paginationEnabled={paginationEnabled}\n onColumnResize={onColumnResize}\n size={size}\n loading={dataLoading}\n filter={filterValues}\n onFilterUpdate={setFilterValues ? onFilterUpdate : undefined}\n sortBy={sortBy}\n onSortByUpdate={setSortBy as ((sortBy?: [string, \"asc\" | \"desc\"]) => void)}\n hoverRow={hoverRow}\n checkFilterCombination={checkFilterCombination}\n createFilterField={filterable ? createFilterField : undefined}\n rowClassName={useCallback((entity: Entity<M>) => {\n return highlightedRow?.(entity) ? \"bg-gray-100 bg-opacity-75 dark:bg-gray-800 dark:bg-opacity-75\" : \"\";\n }, [highlightedRow])}\n className=\"flex-grow\"\n emptyComponent={emptyComponent}\n endAdornment={endAdornment}\n AddColumnComponent={AddColumnComponent}\n />\n\n </div>\n </SelectableTableContext.Provider>\n );\n\n },\n equal\n);\n\nfunction createFilterField({\n id,\n filterValue,\n setFilterValue,\n column,\n hidden,\n setHidden\n }: FilterFormFieldProps<{\n resolvedProperty: ResolvedProperty,\n disabled: boolean,\n}>): React.ReactNode {\n\n if (!column.custom) {\n return null;\n }\n\n const { resolvedProperty } = column.custom;\n\n const isArray = resolvedProperty?.dataType === \"array\";\n const baseProperty: ResolvedProperty = isArray ? resolvedProperty.of : resolvedProperty;\n if (!baseProperty) {\n return null;\n }\n if (baseProperty.dataType === \"reference\") {\n return <ReferenceFilterField value={filterValue}\n setValue={setFilterValue}\n name={id as string}\n isArray={isArray}\n path={baseProperty.path}\n title={resolvedProperty?.name}\n previewProperties={baseProperty?.previewProperties}\n hidden={hidden}\n setHidden={setHidden}/>;\n } else if (baseProperty.dataType === \"number\" || baseProperty.dataType === \"string\") {\n const name = baseProperty.name;\n const enumValues = baseProperty.enumValues ? enumToObjectEntries(baseProperty.enumValues) : undefined;\n return <StringNumberFilterField value={filterValue}\n setValue={setFilterValue}\n name={id as string}\n dataType={baseProperty.dataType}\n isArray={isArray}\n enumValues={enumValues}\n title={name}/>;\n } else if (baseProperty.dataType === \"boolean\") {\n const name = baseProperty.name;\n return <BooleanFilterField value={filterValue}\n setValue={setFilterValue}\n name={id as string}\n title={name}/>;\n\n } else if (baseProperty.dataType === \"date\") {\n const title = baseProperty.name;\n return <DateTimeFilterField value={filterValue}\n setValue={setFilterValue}\n name={id as string}\n mode={baseProperty.mode}\n isArray={isArray}\n title={title}/>;\n }\n\n return (\n <div>{`Currently the filter field ${resolvedProperty.dataType} is not supported`}</div>\n );\n}\n\nfunction filterableProperty(property: ResolvedProperty, partOfArray = false): boolean {\n if (partOfArray) {\n return [\"string\", \"number\", \"date\", \"reference\"].includes(property.dataType);\n }\n if (property.dataType === \"array\") {\n if (property.of)\n return filterableProperty(property.of, true);\n else\n return false;\n }\n return [\"string\", \"number\", \"boolean\", \"date\", \"reference\", \"array\"].includes(property.dataType);\n}\n","import React, { useCallback, useMemo, useRef } from \"react\";\nimport { AdditionalFieldDelegate, CollectionSize, Entity, FireCMSContext, User } from \"../../types\";\nimport { PropertyTableCell } from \"./PropertyTableCell\";\nimport { ErrorBoundary } from \"../ErrorBoundary\";\nimport { useFireCMSContext, useLargeLayout } from \"../../hooks\";\nimport { CellRendererParams, VirtualTableColumn } from \"../VirtualTable\";\nimport { getValueInPath } from \"../../util\";\nimport { getRowHeight } from \"../VirtualTable/common\";\nimport { EntityCollectionRowActions } from \"./EntityCollectionRowActions\";\nimport { CollectionTableToolbar } from \"./internal/CollectionTableToolbar\";\nimport { EntityCollectionTableProps } from \"./EntityCollectionTableProps\";\nimport { EntityTableCell } from \"./internal/EntityTableCell\";\nimport { CustomFieldValidator } from \"../../form/validation\";\nimport { renderSkeletonText } from \"../../preview\";\nimport { propertiesToColumns } from \"./column_utils\";\nimport { ErrorView } from \"../ErrorView\";\nimport { SelectableTable } from \"../SelectableTable/SelectableTable\";\n\n\n/**\n * This component is in charge of rendering a collection table with a high\n * degree of customization.\n *\n * This component is used internally by {@link EntityCollectionView} and\n * {@link useReferenceDialog}\n *\n * Please note that you only need to use this component if you are building\n * a custom view. If you just need to create a default view you can do it\n * exclusively with config options.\n *\n * If you want to bind a {@link EntityCollection} to a table with the default\n * options you see in collections in the top level navigation, you can\n * check {@link EntityCollectionView}.\n *\n * The data displayed in the table is managed by a {@link EntityTableController}.\n * You can build the default, bound to a path in the datasource, by using the hook\n * {@link useDataSourceEntityCollectionTableController}\n *\n * @see EntityCollectionTableProps\n * @see EntityCollectionView\n * @see VirtualTable\n * @group Components\n */\nexport const EntityCollectionTable = function EntityCollectionTable<M extends Record<string, any>, UserType extends User>\n({\n forceFilter,\n actionsStart,\n actions,\n title,\n tableRowActionsBuilder,\n uniqueFieldValidator,\n getPropertyFor,\n onValueChange,\n selectionController,\n highlightedEntities,\n onEntityClick,\n onColumnResize,\n onSizeChanged,\n textSearchEnabled = false,\n hoverRow = true,\n inlineEditing = false,\n additionalFields,\n displayedColumnIds,\n defaultSize,\n properties,\n tableController,\n filterable = true,\n sortable = true,\n endAdornment,\n AddColumnComponent,\n AdditionalHeaderWidget,\n additionalIDHeaderWidget,\n emptyComponent,\n getIdColumnWidth,\n onTextSearchClick,\n textSearchLoading\n }: EntityCollectionTableProps<M>) {\n\n const ref = useRef<HTMLDivElement>(null);\n\n const largeLayout = useLargeLayout();\n const disabledFilterChange = Boolean(forceFilter);\n const selectedEntities = (selectionController?.selectedEntities?.length > 0 ? selectionController?.selectedEntities : highlightedEntities)?.filter(Boolean);\n\n const context: FireCMSContext<UserType> = useFireCMSContext();\n\n const [size, setSize] = React.useState<CollectionSize>(defaultSize ?? \"m\");\n\n const selectedEntityIds = selectedEntities?.map(e => e.id);\n\n const filterIsSet = !!tableController.filterValues && Object.keys(tableController.filterValues).length > 0;\n\n const updateSize = useCallback((size: CollectionSize) => {\n if (onSizeChanged)\n onSizeChanged(size);\n setSize(size);\n }, []);\n\n const onTextSearch = useCallback((newSearchString?: string) => tableController.setSearchString?.(newSearchString), []);\n\n const additionalFieldsMap: Record<string, AdditionalFieldDelegate<M, UserType>> = useMemo(() => {\n return (additionalFields\n ? additionalFields\n .map((aC) => ({ [aC.key]: aC as AdditionalFieldDelegate<M, any> }))\n .reduce((a, b) => ({ ...a, ...b }), {})\n : {}) as Record<string, AdditionalFieldDelegate<M, UserType>>;\n }, [additionalFields]);\n\n const customFieldValidator: CustomFieldValidator | undefined = uniqueFieldValidator;\n\n const propertyCellRenderer = ({\n column,\n columnIndex,\n rowData,\n rowIndex\n }: CellRendererParams<any>) => {\n\n const entity: Entity<M> = rowData;\n\n const propertyKey = column.key;\n\n let disabled = column.custom?.disabled;\n const propertyValue = entity.values ? getValueInPath(entity.values, propertyKey) : undefined;\n const property = getPropertyFor?.({\n propertyKey,\n propertyValue,\n entity\n }) ?? column.custom.resolvedProperty;\n if (!property?.disabled) {\n disabled = false;\n }\n\n if (!property) {\n return null;\n }\n\n return (\n <ErrorBoundary>\n {entity\n ? <PropertyTableCell\n key={`property_table_cell_${entity.id}_${propertyKey}`}\n readonly={!inlineEditing}\n align={column.align ?? \"left\"}\n propertyKey={propertyKey as string}\n property={property}\n value={entity?.values ? getValueInPath(entity.values, propertyKey) : undefined}\n customFieldValidator={customFieldValidator}\n columnIndex={columnIndex}\n width={column.width}\n height={getRowHeight(size)}\n entity={entity}\n disabled={disabled}\n path={entity.path}/>\n : renderSkeletonText()\n }\n </ErrorBoundary>);\n\n };\n\n const additionalCellRenderer = useCallback(({\n column,\n rowData,\n width\n }: CellRendererParams<any>) => {\n\n const entity: Entity<M> = rowData;\n\n const additionalField = additionalFieldsMap[column.key as string];\n const value = additionalField.dependencies\n ? Object.entries(entity.values)\n .filter(([key, value]) => additionalField.dependencies!.includes(key as Extract<keyof M, string>))\n .reduce((a, b) => ({ ...a, ...b }), {})\n : entity;\n\n const Builder = additionalField.Builder;\n if (!Builder && !additionalField.value) {\n throw new Error(\"When using additional fields you need to provide a Builder or a value\");\n }\n\n const child = Builder\n ? <Builder entity={entity} context={context}/>\n : <>{additionalField.value?.({ entity, context })}</>;\n\n return (\n <EntityTableCell\n key={`additional_table_cell_${entity.id}_${column.key}`}\n width={width}\n size={size}\n value={value}\n selected={false}\n disabled={true}\n align={\"left\"}\n allowScroll={false}\n showExpandIcon={false}\n disabledTooltip={\"This column can't be edited directly\"}\n >\n <ErrorBoundary>\n {child}\n </ErrorBoundary>\n </EntityTableCell>\n );\n\n }, [size, selectedEntityIds]);\n\n const collectionColumns: VirtualTableColumn[] = (() => {\n const columnsResult: VirtualTableColumn[] = propertiesToColumns({\n properties,\n sortable,\n forceFilter,\n disabledFilter: disabledFilterChange,\n AdditionalHeaderWidget\n });\n\n const additionalTableColumns: VirtualTableColumn[] = additionalFields\n ? additionalFields.map((additionalField) =>\n ({\n key: additionalField.key,\n align: \"left\",\n sortable: false,\n title: additionalField.name,\n width: additionalField.width ?? 200\n }))\n : [];\n return [...columnsResult, ...additionalTableColumns];\n })();\n\n const idColumn: VirtualTableColumn = {\n key: \"id_ewcfedcswdf3\",\n width: getIdColumnWidth?.() ?? (largeLayout ? 160 : 130),\n title: \"ID\",\n resizable: false,\n frozen: largeLayout,\n headerAlign: \"center\",\n align: \"center\",\n AdditionalHeaderWidget: () => additionalIDHeaderWidget\n }\n\n const columns: VirtualTableColumn[] = [\n idColumn,\n ...displayedColumnIds\n .map((p) => {\n return collectionColumns.find(c => c.key === p.key);\n }).filter(Boolean) as VirtualTableColumn[]\n ];\n\n const cellRenderer = (props: CellRendererParams<any>) => {\n const column = props.column;\n const columns = props.columns;\n const columnKey = column.key;\n\n try {\n if (props.columnIndex === 0) {\n if (tableRowActionsBuilder)\n return tableRowActionsBuilder({\n entity: props.rowData,\n size,\n width: column.width,\n frozen: column.frozen\n });\n else\n return <EntityCollectionRowActions entity={props.rowData}\n width={column.width}\n frozen={column.frozen}\n isSelected={false}\n size={size}/>;\n } else if (additionalFieldsMap[columnKey]) {\n return additionalCellRenderer(props);\n } else if (props.columnIndex < columns.length + 1) {\n return propertyCellRenderer(props);\n } else {\n throw Error(\"Internal: columns not mapped properly\");\n }\n } catch (e: any) {\n console.error(\"Error rendering cell\", e);\n return <EntityTableCell\n size={size}\n width={column.width}\n saved={false}\n value={null}\n align={\"left\"}\n fullHeight={false}\n disabled={true}>\n <ErrorView error={e}/>\n </EntityTableCell>;\n }\n }\n\n return (\n\n <div ref={ref}\n className=\"h-full w-full flex flex-col bg-white dark:bg-gray-950\">\n\n <CollectionTableToolbar\n forceFilter={disabledFilterChange}\n filterIsSet={filterIsSet}\n onTextSearch={textSearchEnabled ? onTextSearch : undefined}\n textSearchLoading={textSearchLoading}\n onTextSearchClick={textSearchEnabled ? onTextSearchClick : undefined}\n clearFilter={tableController.clearFilter}\n size={size}\n onSizeChanged={updateSize}\n title={title}\n actionsStart={actionsStart}\n actions={actions}\n loading={tableController.dataLoading}/>\n\n <SelectableTable columns={columns}\n size={size}\n inlineEditing={inlineEditing}\n cellRenderer={cellRenderer}\n onEntityClick={onEntityClick}\n highlightedRow={useCallback((entity: Entity<M>) => selectedEntityIds?.includes(entity.id) ?? false, [selectedEntityIds])}\n tableController={tableController}\n onValueChange={onValueChange}\n onColumnResize={onColumnResize}\n hoverRow={hoverRow}\n filterable={filterable}\n emptyComponent={emptyComponent}\n endAdornment={endAdornment}\n AddColumnComponent={AddColumnComponent}/>\n\n </div>\n );\n\n};\n","import { Entity } from \"../../types\";\n\nexport interface DataOrderProps<M extends Record<string, any>> {\n data: Entity<M>[];\n entitiesDisplayedFirst?: Entity<M>[];\n}\n\n/**\n * This hook is used to have some entities at the beginning of data.\n * @param path\n * @param entitiesDisplayedFirst\n * @group Hooks and utilities\n */\nexport function useDataOrder<M extends Record<string, any>>(\n {\n data,\n entitiesDisplayedFirst\n }: DataOrderProps<M>): Entity<M>[] {\n\n if (!entitiesDisplayedFirst)\n return data;\n\n const displayedFirstId = new Set(entitiesDisplayedFirst.map((e) => e.id));\n return [...entitiesDisplayedFirst, ...data.filter((e) => !displayedFirstId.has(e.id))];\n\n}\n","import React from \"react\";\nimport equal from \"react-fast-compare\";\n\n/**\n * Hack to prevent data updates for incomplete callbacks from Firestore\n * triggers.\n * If any deps change, the update is immediate\n * @param data\n * @param deps\n * @param timeoutMs\n */\nexport function useDebouncedData<T>(data: T[], deps: any, timeoutMs = 5000) {\n\n const [deferredData, setDeferredData] = React.useState(data);\n const dataLength = React.useRef(deferredData.length ?? 0);\n const pendingUpdate = React.useRef(false);\n const currentDeps = React.useRef(deps);\n\n const haveDepsChanged = !equal(currentDeps.current, deps);\n const immediateUpdate = data.length >= dataLength.current || haveDepsChanged;\n\n React.useEffect(() => {\n\n const performUpdate = () => {\n if (!equal(deferredData, data)) {\n currentDeps.current = deps;\n dataLength.current = data.length;\n setDeferredData(data);\n }\n pendingUpdate.current = false;\n };\n\n pendingUpdate.current = true;\n\n let handler: any;\n if (immediateUpdate)\n performUpdate()\n else\n handler = setTimeout(performUpdate, timeoutMs);\n\n return () => {\n clearTimeout(handler);\n if (pendingUpdate.current && immediateUpdate)\n performUpdate();\n };\n }, [data, timeoutMs, deps, immediateUpdate]);\n\n return immediateUpdate ? data : deferredData;\n}\n","import React, { useCallback, useEffect, useMemo, useState } from \"react\";\n\nimport { useDataSource, useFireCMSContext, useNavigationController } from \"../../hooks\";\nimport { useDataOrder } from \"../../hooks/data/useDataOrder\";\nimport {\n Entity,\n EntityCollection,\n EntityTableController,\n FilterValues,\n FireCMSContext,\n SelectedCellProps,\n User\n} from \"../../types\";\nimport { useDebouncedData } from \"./useDebouncedData\";\n\nconst DEFAULT_PAGE_SIZE = 50;\n\nexport type DataSourceEntityCollectionTableControllerProps<M extends Record<string, any> = any> = {\n /**\n * Full path where the data of this table is located\n */\n fullPath: string;\n /**\n * The collection that is represented by this config.\n */\n collection: EntityCollection<M>;\n /**\n * List of entities that will be displayed on top, no matter the ordering.\n * This is used for reference fields selection\n */\n entitiesDisplayedFirst?: Entity<M>[];\n\n lastDeleteTimestamp?: number;\n forceFilter?: FilterValues<string>;\n}\n\n/**\n * Use this hook to build a controller for the {@link EntityCollectionTable}.\n * This controller is bound to data in a path in your specified datasource.\n *\n * Note that you can build your own hook returning a {@link EntityTableController}\n * if you would like to display different data.\n *\n * @param fullPath\n * @param collection\n * @param entitiesDisplayedFirst\n * @param lastDeleteTimestamp\n * @param forceFilterFromProps\n */\nexport function useDataSourceEntityCollectionTableController<M extends Record<string, any> = any, UserType extends User = User>(\n {\n fullPath,\n collection,\n entitiesDisplayedFirst,\n lastDeleteTimestamp,\n forceFilter: forceFilterFromProps,\n }: DataSourceEntityCollectionTableControllerProps<M>)\n : EntityTableController<M> {\n\n const {\n initialFilter,\n initialSort,\n forceFilter: forceFilterFromCollection\n } = collection;\n\n const [popupCell, setPopupCell] = React.useState<SelectedCellProps<M> | undefined>(undefined);\n const navigation = useNavigationController();\n const dataSource = useDataSource(collection);\n const resolvedPath = useMemo(() => navigation.resolveAliasesFrom(fullPath), [fullPath, navigation.resolveAliasesFrom]);\n\n const forceFilter = forceFilterFromProps ?? forceFilterFromCollection;\n const paginationEnabled = collection.pagination === undefined || Boolean(collection.pagination);\n const pageSize = typeof collection.pagination === \"number\" ? collection.pagination : DEFAULT_PAGE_SIZE;\n\n const [searchString, setSearchString] = React.useState<string | undefined>();\n const [itemCount, setItemCount] = React.useState<number | undefined>(paginationEnabled ? pageSize : undefined);\n\n const initialSortInternal = useMemo(() => {\n if (initialSort && forceFilter && !checkFilterCombination(forceFilter, initialSort)) {\n console.warn(\"Initial sort is not compatible with the force filter. Ignoring initial sort\");\n return undefined;\n }\n return initialSort;\n }, [initialSort, forceFilter]);\n\n const [filterValues, setFilterValues] = React.useState<FilterValues<Extract<keyof M, string>> | undefined>(forceFilter ?? initialFilter ?? undefined);\n const [sortBy, setSortBy] = React.useState<[Extract<keyof M, string>, \"asc\" | \"desc\"] | undefined>(initialSortInternal);\n\n const sortByProperty = sortBy ? sortBy[0] : undefined;\n const currentSort = sortBy ? sortBy[1] : undefined;\n\n const context: FireCMSContext<UserType> = useFireCMSContext();\n\n const [rawData, setRawData] = useState<Entity<M>[]>([]);\n\n const [dataLoading, setDataLoading] = useState<boolean>(false);\n const [dataLoadingError, setDataLoadingError] = useState<Error | undefined>();\n const [noMoreToLoad, setNoMoreToLoad] = useState<boolean>(false);\n\n const checkFilterCombination = useCallback((filterValues: FilterValues<any>,\n sortBy?: [string, \"asc\" | \"desc\"]) => {\n if (!dataSource.isFilterCombinationValid)\n return true;\n return dataSource.isFilterCombinationValid({\n path: resolvedPath,\n collection,\n filterValues,\n sortBy\n })\n }, []);\n\n const clearFilter = useCallback(() => setFilterValues(forceFilter ?? undefined), [forceFilter]);\n\n const updateFilterValues = useCallback((updatedFilter: FilterValues<Extract<keyof M, string>> | undefined) => {\n if (forceFilter) {\n console.warn(\"Filter is not compatible with the force filter. Ignoring filter\");\n return;\n }\n if (updatedFilter && Object.keys(updatedFilter).length === 0) {\n setFilterValues(undefined);\n } else {\n setFilterValues(updatedFilter);\n }\n }, [forceFilter]);\n\n useEffect(() => {\n\n setDataLoading(true);\n\n const onEntitiesUpdate = async (entities: Entity<M>[]) => {\n if (collection.callbacks?.onFetch) {\n try {\n entities = await Promise.all(\n entities.map((entity) =>\n collection.callbacks!.onFetch!({\n collection,\n path: resolvedPath,\n entity,\n context\n })));\n } catch (e: any) {\n console.error(e);\n }\n }\n setDataLoading(false);\n setDataLoadingError(undefined);\n setRawData(entities.map(e => ({\n ...e,\n // values: sanitizeData(e.values, resolvedCollection.properties)\n })));\n setNoMoreToLoad(!itemCount || entities.length < itemCount);\n };\n\n const onError = (error: Error) => {\n console.error(\"ERROR\", error);\n setDataLoading(false);\n setRawData([]);\n setDataLoadingError(error);\n };\n\n if (dataSource.listenCollection) {\n return dataSource.listenCollection<M>({\n path: resolvedPath,\n collection,\n onUpdate: onEntitiesUpdate,\n onError,\n searchString,\n filter: filterValues,\n limit: itemCount,\n startAfter: undefined,\n orderBy: sortByProperty,\n order: currentSort\n });\n } else {\n dataSource.fetchCollection<M>({\n path: resolvedPath,\n collection,\n searchString,\n filter: filterValues,\n limit: itemCount,\n startAfter: undefined,\n orderBy: sortByProperty,\n order: currentSort\n })\n .then(onEntitiesUpdate)\n .catch(onError);\n return () => {\n };\n }\n }, [resolvedPath, itemCount, currentSort, sortByProperty, filterValues, searchString]);\n\n const orderedData = useDataOrder({\n data: rawData,\n entitiesDisplayedFirst\n });\n\n // hack to fix Firestore listeners firing with incomplete data\n const data = useDebouncedData(orderedData, {\n filterValues,\n sortBy,\n searchString,\n lastDeleteTimestamp\n });\n\n return {\n data,\n dataLoading,\n noMoreToLoad,\n dataLoadingError,\n filterValues,\n setFilterValues: updateFilterValues,\n sortBy,\n setSortBy,\n searchString,\n setSearchString,\n clearFilter,\n itemCount,\n setItemCount,\n paginationEnabled,\n pageSize,\n checkFilterCombination,\n popupCell,\n setPopupCell\n }\n}\n","import { useCallback, useState } from \"react\";\nimport { Entity, SelectionController } from \"../../types\";\n\nexport function useSelectionController<M extends Record<string, any> = any>(\n onSelectionChange?: (entity: Entity<M>, selected: boolean) => void\n): SelectionController<M> {\n\n const [selectedEntities, setSelectedEntities] = useState<Entity<M>[]>([]);\n\n const toggleEntitySelection = useCallback((entity: Entity<M>) => {\n let newValue;\n if (selectedEntities.map(e => e.id).includes(entity.id)) {\n onSelectionChange?.(entity, false);\n newValue = selectedEntities.filter((item: Entity<M>) => item.id !== entity.id);\n } else {\n onSelectionChange?.(entity, true);\n newValue = [...selectedEntities, entity];\n }\n setSelectedEntities(newValue);\n }, [selectedEntities]);\n\n const isEntitySelected = useCallback((entity: Entity<M>) => selectedEntities.map(e => e.id).includes(entity.id), [selectedEntities]);\n\n return {\n selectedEntities,\n setSelectedEntities,\n isEntitySelected,\n toggleEntitySelection\n };\n}\n","import { useState } from \"react\";\n\nimport { EntityCollection } from \"../../types\";\nimport { useCustomizationController, useFireCMSContext } from \"../../hooks\";\n\nexport interface UseTableSearchHelperParams<M extends Record<string, any>> {\n collection: EntityCollection<M>;\n fullPath: string;\n parentCollectionIds?: string[];\n}\n\nexport function useTableSearchHelper<M extends Record<string, any>>({ collection, fullPath, parentCollectionIds }: UseTableSearchHelperParams<M>) {\n\n const context = useFireCMSContext();\n const customizationController = useCustomizationController();\n\n const [textSearchLoading, setTextSearchLoading] = useState<boolean>(false);\n const [textSearchInitialised, setTextSearchInitialised] = useState<boolean>(false);\n let onTextSearchClick: (() => void) | undefined;\n let textSearchEnabled = Boolean(collection.textSearchEnabled);\n if (customizationController?.plugins) {\n const addTextSearchClickListener = customizationController.plugins?.find(p => Boolean(p.collectionView?.onTextSearchClick));\n\n onTextSearchClick = addTextSearchClickListener\n ? () => {\n setTextSearchLoading(true);\n Promise.all(customizationController.plugins?.map(p => {\n if (p.collectionView?.onTextSearchClick)\n return p.collectionView.onTextSearchClick({ context, path: fullPath, collection, parentCollectionIds });\n return Promise.resolve(true);\n }) as Promise<boolean>[])\n .then((res) => {\n if (res.every(Boolean)) setTextSearchInitialised(true);\n })\n .finally(() => setTextSearchLoading(false));\n }\n : undefined;\n\n customizationController.plugins?.forEach(p => {\n if (!textSearchEnabled)\n if (p.collectionView?.showTextSearchBar) {\n textSearchEnabled = p.collectionView.showTextSearchBar({ context, path: fullPath, collection, parentCollectionIds });\n }\n })\n }\n return { textSearchLoading, textSearchInitialised, onTextSearchClick, textSearchEnabled };\n}\n","import React, { MouseEventHandler, useCallback, useEffect, useMemo, useState } from \"react\";\nimport { CollectionSize, Entity, EntityCollection, FilterValues } from \"../../types\";\n\nimport {\n EntityCollectionRowActions,\n EntityCollectionTable,\n useDataSourceEntityCollectionTableController\n} from \"../EntityCollectionTable\";\nimport {\n useAuthController,\n useCustomizationController,\n useDataSource,\n useLargeLayout,\n useNavigationController,\n useSideEntityController\n} from \"../../hooks\";\nimport { ErrorView } from \"../ErrorView\";\nimport { AddIcon, Button, DialogActions, Typography } from \"@firecms/ui\";\nimport { canCreateEntity, fullPathToCollectionSegments, resolveCollection } from \"../../util\";\nimport { useSelectionController } from \"../EntityCollectionView/useSelectionController\";\nimport { useColumnIds, useTableSearchHelper } from \"../common\";\nimport { useSideDialogContext } from \"../../core\";\nimport { useAnalyticsController } from \"../../hooks/useAnalyticsController\";\n\n/**\n * @group Components\n */\nexport interface ReferenceSelectionInnerProps<M extends Record<string, any>> {\n\n /**\n * Allow multiple selection of values\n */\n multiselect?: boolean;\n\n /**\n * Entity collection config\n */\n collection?: EntityCollection<M>;\n\n /**\n * Absolute path of the collection.\n * May be not set if this hook is being used in a component and the path is\n * dynamic. If not set, the dialog won't open.\n */\n path: string;\n\n /**\n * If you are opening the dialog for the first time, you can select some\n * entity ids to be displayed first.\n */\n selectedEntityIds?: string[];\n\n /**\n * If `multiselect` is set to `false`, you will get the selected entity\n * in this callback.\n * @param entity\n * @callback\n */\n onSingleEntitySelected?(entity: Entity<any> | null): void;\n\n /**\n * If `multiselect` is set to `true`, you will get the selected entities\n * in this callback.\n * @param entities\n * @callback\n */\n onMultipleEntitiesSelected?(entities: Entity<any>[]): void;\n\n /**\n * Allow selection of entities that pass the given filter only.\n */\n forceFilter?: FilterValues<string>;\n\n /**\n * Use this description to indicate the user what to do in this dialog.\n */\n description?: React.ReactNode;\n\n /**\n * Maximum number of entities that can be selected.\n */\n maxSelection?: number;\n\n}\n\n/**\n * This component allows to select entities from a given collection.\n * You probably want to open this dialog as a side view using {@link useReferenceDialog}\n * @group Components\n */\nexport function ReferenceSelectionTable<M extends Record<string, any>>(\n {\n onSingleEntitySelected,\n onMultipleEntitiesSelected,\n multiselect,\n collection,\n path: pathInput,\n selectedEntityIds: selectedEntityIdsProp,\n description,\n forceFilter,\n maxSelection,\n }: ReferenceSelectionInnerProps<M>) {\n\n const sideDialogContext = useSideDialogContext();\n const sideEntityController = useSideEntityController();\n const navigation = useNavigationController();\n const analyticsController = useAnalyticsController();\n const customizationController = useCustomizationController();\n\n const fullPath = navigation.resolveAliasesFrom(pathInput);\n\n const dataSource = useDataSource(collection);\n\n const [entitiesDisplayedFirst, setEntitiesDisplayedFirst] = useState<Entity<any>[]>([]);\n\n const toggleEntitySelection = (entity: Entity<any>) => {\n let newValue;\n const selectedEntities = selectionController.selectedEntities;\n\n analyticsController.onAnalyticsEvent?.(\"reference_selection_toggle\", {\n path: fullPath,\n entityId: entity.id\n });\n if (selectedEntities) {\n\n if (selectedEntities.map((e) => e.id).indexOf(entity.id) > -1) {\n newValue = selectedEntities.filter((item: Entity<any>) => item.id !== entity.id);\n } else {\n if (maxSelection && selectedEntities.length >= maxSelection)\n return;\n newValue = [...selectedEntities, entity];\n }\n selectionController.setSelectedEntities(newValue);\n\n if (onMultipleEntitiesSelected)\n onMultipleEntitiesSelected(newValue);\n }\n };\n\n const selectionController = useSelectionController(toggleEntitySelection);\n\n /**\n * Fetch initially selected ids\n */\n useEffect(() => {\n let unmounted = false;\n const selectedEntityIds = selectedEntityIdsProp?.map(id => id?.toString()).filter(Boolean);\n if (selectedEntityIds && collection) {\n Promise.all(\n selectedEntityIds.map((entityId) =>\n dataSource.fetchEntity({\n path: fullPath,\n entityId,\n collection\n })))\n .then((entities) => {\n if (!unmounted) {\n const result = entities.filter(e => e !== undefined) as Entity<any>[];\n selectionController.setSelectedEntities(result);\n setEntitiesDisplayedFirst(result);\n }\n });\n } else {\n selectionController.setSelectedEntities([]);\n setEntitiesDisplayedFirst([]);\n }\n return () => {\n unmounted = true;\n };\n }, [dataSource, fullPath, selectedEntityIdsProp, collection, selectionController.setSelectedEntities]);\n\n const onClear = () => {\n analyticsController.onAnalyticsEvent?.(\"reference_selection_clear\", {\n path: fullPath\n });\n selectionController.setSelectedEntities([]);\n if (!multiselect && onSingleEntitySelected) {\n onSingleEntitySelected(null);\n } else if (onMultipleEntitiesSelected) {\n onMultipleEntitiesSelected([]);\n }\n };\n\n const onEntityClick = (entity: Entity<any>) => {\n if (!multiselect && onSingleEntitySelected) {\n analyticsController.onAnalyticsEvent?.(\"reference_selected_single\", {\n path: fullPath,\n entityId: entity.id\n });\n onSingleEntitySelected(entity);\n sideDialogContext.close(false);\n } else {\n toggleEntitySelection(entity);\n }\n };\n\n // create a new entity from within the reference dialog\n const onNewClick = () => {\n analyticsController.onAnalyticsEvent?.(\"reference_selection_new_entity\", {\n path: fullPath\n });\n sideEntityController.open({\n path: fullPath,\n collection,\n updateUrl: true,\n onUpdate: ({ entity }) => {\n setEntitiesDisplayedFirst([entity, ...entitiesDisplayedFirst]);\n onEntityClick(entity);\n },\n closeOnSave: true\n });\n };\n\n const tableRowActionsBuilder = ({\n entity,\n size,\n width,\n frozen\n }: {\n entity: Entity<any>,\n size: CollectionSize,\n width: number,\n frozen?: boolean\n }) => {\n const selectedEntities = selectionController.selectedEntities;\n const isSelected = selectedEntities && selectedEntities.map(e => e.id).indexOf(entity.id) > -1;\n return <EntityCollectionRowActions\n width={width}\n frozen={frozen}\n entity={entity}\n size={size}\n isSelected={isSelected}\n selectionEnabled={multiselect}\n hideId={collection?.hideIdFromCollection}\n fullPath={fullPath}\n selectionController={selectionController}/>;\n\n };\n\n const onDone = useCallback((event: React.SyntheticEvent) => {\n event.stopPropagation();\n sideDialogContext.close(false);\n }, [sideDialogContext]);\n\n if (!collection) {\n return <ErrorView\n error={\"Could not find collection with id \" + collection}/>\n }\n\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const resolvedCollection = useMemo(() => resolveCollection({\n collection: collection,\n path: fullPath,\n values: {},\n fields: customizationController.propertyConfigs\n }), [collection, customizationController.propertyConfigs, fullPath]);\n\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const displayedColumnIds = useColumnIds(resolvedCollection, false);\n\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const tableController = useDataSourceEntityCollectionTableController<M>({\n fullPath,\n collection,\n entitiesDisplayedFirst,\n forceFilter\n });\n\n const {\n textSearchLoading,\n textSearchInitialised,\n onTextSearchClick,\n textSearchEnabled\n } =\n // eslint-disable-next-line react-hooks/rules-of-hooks\n useTableSearchHelper({\n collection,\n fullPath,\n });\n\n return (\n\n <div className=\"flex flex-col h-full\">\n\n <div className=\"flex-grow\">\n {entitiesDisplayedFirst &&\n <EntityCollectionTable\n textSearchLoading={textSearchLoading}\n onTextSearchClick={textSearchInitialised ? undefined : onTextSearchClick}\n textSearchEnabled={textSearchEnabled}\n displayedColumnIds={displayedColumnIds}\n onEntityClick={onEntityClick}\n tableController={tableController}\n tableRowActionsBuilder={tableRowActionsBuilder}\n title={<Typography variant={\"subtitle2\"}>\n {collection.singularName ? `Select ${collection.singularName}` : `Select from ${collection.name}`}\n </Typography>}\n defaultSize={collection.defaultSize}\n properties={resolvedCollection.properties}\n forceFilter={forceFilter}\n inlineEditing={false}\n selectionController={selectionController}\n actions={<ReferenceDialogActions\n collection={collection}\n path={fullPath}\n onNewClick={onNewClick}\n onClear={onClear}/>\n }\n />}\n </div>\n <DialogActions translucent={false}>\n {description &&\n <Typography variant={\"body2\"}\n className=\"flex-grow text-left\">\n {description}\n </Typography>}\n <Button\n onClick={onDone}\n color=\"primary\"\n variant=\"filled\">\n Done\n </Button>\n </DialogActions>\n </div>\n\n );\n\n}\n\nfunction ReferenceDialogActions({\n collection,\n path,\n onClear,\n onNewClick\n }: {\n collection: EntityCollection<any>,\n path: string,\n onClear: () => void,\n onNewClick: () => void\n}) {\n\n const authController = useAuthController();\n\n const largeLayout = useLargeLayout();\n\n const onClick: MouseEventHandler<HTMLButtonElement> | undefined = onNewClick\n ? (e) => {\n e.preventDefault();\n onNewClick();\n }\n : undefined;\n const addButton = canCreateEntity(collection, authController, path, null) &&\n onClick && (largeLayout\n ? <Button\n onClick={onClick}\n startIcon={<AddIcon/>}\n variant=\"outlined\"\n color=\"primary\">\n Add {collection.singularName ?? collection.name}\n </Button>\n : <Button\n onClick={onClick}\n variant=\"outlined\"\n color=\"primary\"\n >\n <AddIcon/>\n </Button>);\n\n return (\n <>\n <Button onClick={onClear}\n variant={\"text\"}\n color=\"primary\">\n Clear\n </Button>\n {addButton}\n </>\n );\n}\n","export function toArray<T>(input?: T | T[]): T[] {\n return Array.isArray(input) ? input : (input ? [input] : []);\n}\n","import { PropsWithChildren } from \"react\";\nimport { useUserConfigurationPersistence } from \"../../hooks/useUserConfigurationPersistence\";\nimport { ExpandablePanel, Typography } from \"@firecms/ui\";\n\nexport function NavigationGroup({\n children,\n group\n }: PropsWithChildren<{\n group: string | undefined\n}>) {\n const userConfigurationPersistence = useUserConfigurationPersistence();\n return (\n <ExpandablePanel\n invisible={true}\n titleClassName={\"font-medium text-sm text-gray-600 dark:text-gray-400\"}\n className={\"py-4\"}\n initiallyExpanded={!(userConfigurationPersistence?.collapsedGroups ?? []).includes(group ?? \"ungrouped\")}\n onExpandedChange={expanded => {\n if (userConfigurationPersistence) {\n\n if (!expanded) {\n const paths = (userConfigurationPersistence.collapsedGroups ?? []).concat(group ?? \"ungrouped\");\n userConfigurationPersistence.setCollapsedGroups(paths);\n } else {\n userConfigurationPersistence.setCollapsedGroups((userConfigurationPersistence.collapsedGroups ?? []).filter(g => g !== (group ?? \"ungrouped\")));\n }\n }\n }}\n title={<Typography color={\"secondary\"}\n className=\"font-medium ml-1\">\n {group?.toUpperCase() ?? \"Views\".toUpperCase()}\n </Typography>}>\n\n <div className=\"mb-8\">\n {children}\n </div>\n </ExpandablePanel>\n );\n}\n","import { ArrowForwardIcon, Card, cn, Markdown, Typography, } from \"@firecms/ui\";\n\nexport type NavigationCardProps = {\n name: string,\n description?: string;\n actions: React.ReactNode;\n icon: React.ReactNode;\n onClick?: () => void,\n};\n\nexport function NavigationCard({\n name,\n description,\n icon,\n actions,\n onClick,\n }: NavigationCardProps) {\n\n return (<Card\n className={cn(\"h-full p-4 cursor-pointer min-h-[230px]\")}\n onClick={() => {\n onClick?.();\n }}>\n\n <div className=\"flex flex-col items-start h-full\">\n <div\n className=\"flex-grow w-full\">\n\n <div\n className=\"h-10 flex items-center w-full justify-between text-gray-300 dark:text-gray-600\">\n\n {icon}\n\n <div\n className=\"flex items-center gap-1\"\n onClick={(event: React.MouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n }}>\n\n {actions}\n\n </div>\n\n </div>\n\n <Typography gutterBottom variant=\"h5\"\n component=\"h2\">\n {name}\n </Typography>\n\n {description && <Typography variant=\"body2\"\n color=\"secondary\"\n component=\"div\">\n <Markdown source={description}/>\n </Typography>}\n </div>\n\n <div style={{ alignSelf: \"flex-end\" }}>\n\n <div className={\"p-4\"}>\n <ArrowForwardIcon className=\"text-primary\"/>\n </div>\n </div>\n\n </div>\n\n </Card>)\n}\n","import { ArrowForwardIcon, cardClickableMixin, cardMixin, cn, focusedMixin, Typography, } from \"@firecms/ui\";\n\nimport { Link as ReactLink } from \"react-router-dom\";\n\nexport type SmallNavigationCardProps = {\n name: string,\n url: string;\n icon: React.ReactElement;\n};\n\nexport function SmallNavigationCard({\n name,\n url,\n icon,\n }: SmallNavigationCardProps) {\n\n return (\n <>\n\n <ReactLink\n tabIndex={0}\n className={cn(cardMixin,\n cardClickableMixin,\n focusedMixin,\n \"cursor-pointer flex flex-row items-center px-4 py-2 text-inherit dark:text-inherit visited:text-inherit visited:dark:text-inherit hover:text-inherit hover:dark:text-inherit \")}\n to={url}\n >\n\n <div className=\"flex flex-row items-center flex-grow gap-2 \">\n {icon}\n\n <Typography gutterBottom variant=\"h5\"\n component=\"h2\"\n className=\"mb-0 ml-4\">\n {name}\n </Typography>\n </div>\n\n <div className={\"p-4\"}>\n <ArrowForwardIcon color=\"primary\"/>\n </div>\n </ReactLink>\n\n </>);\n}\n","import { useNavigate } from \"react-router-dom\";\n\nimport { useCustomizationController, useFireCMSContext } from \"../../hooks\";\nimport { PluginHomePageActionsProps, TopNavigationEntry } from \"../../types\";\nimport { IconForView } from \"../../util\";\nimport { useUserConfigurationPersistence } from \"../../hooks/useUserConfigurationPersistence\";\nimport { IconButton, StarBorderIcon, StarIcon } from \"@firecms/ui\";\nimport { NavigationCard } from \"./NavigationCard\";\nimport { SmallNavigationCard } from \"./SmallNavigationCard\";\n\n/**\n * This is the component used in the home page to render a card for each\n * collection or view.\n * @group Components\n * @param view\n * @param path\n * @param collection\n * @param url\n * @param name\n * @param description\n * @param onClick\n * @constructor\n */\nexport function NavigationCardBinding({\n path,\n collection,\n view,\n url,\n name,\n description,\n onClick,\n type\n }: TopNavigationEntry & {\n onClick?: () => void\n}) {\n\n const userConfigurationPersistence = useUserConfigurationPersistence();\n const collectionIcon = <IconForView collectionOrView={collection ?? view}/>;\n\n const navigate = useNavigate();\n const context = useFireCMSContext();\n const customizationController = useCustomizationController();\n\n const favourite = (userConfigurationPersistence?.favouritePaths ?? []).includes(path);\n\n const actionsArray: React.ReactNode[] = userConfigurationPersistence\n ? [\n <IconButton\n key={\"favourite\"}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n if (favourite) {\n userConfigurationPersistence.setFavouritePaths(\n userConfigurationPersistence.favouritePaths.filter(p => p !== path)\n );\n } else {\n userConfigurationPersistence.setFavouritePaths(\n [...userConfigurationPersistence.favouritePaths, path]\n );\n }\n }}>\n {\n favourite\n ? <StarIcon\n size={18}\n className={\"text-secondary\"}/>\n : <StarBorderIcon\n size={18}\n className={\"text-gray-400 dark:text-gray-500\"}/>}\n </IconButton>\n ]\n : [];\n\n if (customizationController.plugins && collection) {\n const actionProps: PluginHomePageActionsProps = {\n path,\n collection,\n context\n };\n customizationController.plugins.forEach((plugin, i) => (\n actionsArray.push(plugin.homePage?.CollectionActions\n ? <plugin.homePage.CollectionActions\n key={`actions_${i}`}\n {...actionProps}\n extraProps={plugin.homePage.extraProps}\n />\n : null\n )))\n }\n\n const actions: React.ReactNode | undefined = <>\n {actionsArray}\n </>\n\n if (type === \"admin\") {\n return <SmallNavigationCard icon={collectionIcon}\n name={name}\n url={url}/>\n }\n\n return <NavigationCard\n icon={collectionIcon}\n name={name}\n description={description}\n actions={actions}\n onClick={() => {\n onClick?.();\n navigate(url);\n if (userConfigurationPersistence) {\n userConfigurationPersistence.setRecentlyVisitedPaths(\n [path, ...(userConfigurationPersistence.recentlyVisitedPaths ?? []).filter(p => p !== path)]\n );\n }\n }}/>;\n}\n","import { useNavigate } from \"react-router-dom\";\nimport { useNavigationController } from \"../../hooks\";\nimport { useUserConfigurationPersistence } from \"../../hooks/useUserConfigurationPersistence\";\nimport { TopNavigationEntry } from \"../../types\";\nimport { Chip, Collapse, StarBorderIcon, StarIcon } from \"@firecms/ui\";\n\nfunction NavigationChip({ entry }: { entry: TopNavigationEntry }) {\n\n const navigate = useNavigate();\n const userConfigurationPersistence = useUserConfigurationPersistence();\n\n if (!userConfigurationPersistence)\n return null;\n\n const favourite = userConfigurationPersistence.favouritePaths.includes(entry.path);\n const onIconClick = (e: React.SyntheticEvent) => {\n e.preventDefault();\n e.stopPropagation();\n if (favourite) {\n userConfigurationPersistence.setFavouritePaths(\n userConfigurationPersistence.favouritePaths.filter(p => p !== entry.path)\n );\n } else {\n userConfigurationPersistence.setFavouritePaths(\n [...userConfigurationPersistence.favouritePaths, entry.path]\n );\n }\n };\n return <Chip\n key={entry.path}\n onClick={() => navigate(entry.url)}\n icon={\n favourite\n ? <StarIcon\n onClick={onIconClick}\n size={18}\n className={\"text-secondary\"}/>\n : <StarBorderIcon\n onClick={onIconClick}\n size={18}\n className={\"text-gray-400 dark:text-gray-500\"}/>}>\n {entry.name}\n </Chip>;\n}\n\nexport function FavouritesView({ hidden }: { hidden: boolean }) {\n\n const navigationController = useNavigationController();\n const userConfigurationPersistence = useUserConfigurationPersistence();\n\n if (!userConfigurationPersistence)\n return null;\n\n const favouriteCollections = (userConfigurationPersistence?.favouritePaths ?? [])\n .map((path) => navigationController.topLevelNavigation?.navigationEntries.find((entry) => entry.path === path))\n .filter(Boolean) as TopNavigationEntry[];\n\n return <Collapse in={favouriteCollections.length > 0}>\n <div className=\"flex flex-row flex-wrap gap-2 pb-2 min-h-[32px]\">\n {favouriteCollections.map((entry) => <NavigationChip key={entry.path}\n entry={entry}/>)}\n </div>\n </Collapse>;\n}\n","import React, { useCallback, useEffect } from \"react\";\nimport { useLocation } from \"react-router-dom\";\n\nconst scrollsMap: Record<string, number> = {};\n\nexport function useRestoreScroll() {\n\n // const scrollsMap = React.useRef<Record<string, number>>({});\n\n const location = useLocation();\n\n const containerRef = React.useRef<HTMLDivElement>(null);\n const [scroll, setScroll] = React.useState(0);\n const [direction, setDirection] = React.useState<\"up\" | \"down\">(\"down\");\n\n const handleScroll = useCallback(() => {\n if (!containerRef.current || !location.key) return;\n scrollsMap[location.key] = containerRef.current.scrollTop;\n setScroll(containerRef.current.scrollTop);\n setDirection(containerRef.current.scrollTop > scroll ? \"down\" : \"up\");\n }, [containerRef, location.key, scroll]);\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n container.addEventListener(\"scroll\", handleScroll, { passive: true });\n\n return () => {\n if (container)\n container.removeEventListener(\"scroll\", handleScroll);\n };\n }, [containerRef, handleScroll, location]);\n\n useEffect(() => {\n if (!containerRef.current || !scrollsMap[location.key]) return;\n containerRef.current.scrollTo(\n {\n top: scrollsMap[location.key],\n behavior: \"auto\"\n });\n }, [location]);\n\n return {\n containerRef,\n scroll,\n direction\n };\n}\n","import React, { useCallback, useEffect, useState } from \"react\";\n\nimport { useCustomizationController, useFireCMSContext, useNavigationController } from \"../../hooks\";\nimport { CMSAnalyticsEvent, PluginGenericProps, PluginHomePageAdditionalCardsProps } from \"../../types\";\n\nimport { toArray } from \"../../util/arrays\";\nimport { NavigationGroup } from \"./NavigationGroup\";\nimport { NavigationCardBinding } from \"./NavigationCardBinding\";\n\n// @ts-ignore\nimport * as JsSearch from \"js-search\";\n\nimport { Container, SearchBar } from \"@firecms/ui\";\nimport { FavouritesView } from \"./FavouritesView\";\nimport { useRestoreScroll } from \"../../internal/useRestoreScroll\";\n\nconst search = new JsSearch.Search(\"url\");\nsearch.addIndex(\"name\");\nsearch.addIndex(\"description\");\nsearch.addIndex(\"group\");\nsearch.addIndex(\"path\");\n\n/**\n * Default entry view for the CMS. This component renders navigation cards\n * for each collection defined in the navigation.\n * @constructor\n * @group Components\n */\nexport function DefaultHomePage({\n additionalActions,\n additionalChildrenStart,\n additionalChildrenEnd\n }: {\n /**\n * Additional actions to be rendered in the home page, close to the search bar.\n */\n additionalActions?: React.ReactNode;\n /**\n * Additional children to be rendered in the beginning of the home page.\n */\n additionalChildrenStart?: React.ReactNode;\n /**\n * Additional children to be rendered at the end of the home page.\n */\n additionalChildrenEnd?: React.ReactNode;\n}) {\n\n const context = useFireCMSContext();\n const customizationController = useCustomizationController();\n const navigationController = useNavigationController();\n\n if (!navigationController.topLevelNavigation)\n throw Error(\"Navigation not ready in FireCMSHomePage\");\n\n const {\n containerRef,\n scroll,\n direction\n } = useRestoreScroll();\n\n const {\n navigationEntries,\n groups\n } = navigationController.topLevelNavigation;\n\n const [filteredUrls, setFilteredUrls] = useState<string[] | null>(null);\n\n const filteredNavigationEntries = filteredUrls\n ? navigationEntries.filter((entry) => filteredUrls.includes(entry.url))\n : navigationEntries;\n\n useEffect(() => {\n search.addDocuments(navigationEntries);\n }, [navigationEntries]);\n\n const updateSearchResults = useCallback(\n (value?: string) => {\n if (!value || value === \"\") {\n setFilteredUrls(null);\n } else {\n const searchResult = search.search(value);\n setFilteredUrls(searchResult.map((e: any) => e.url));\n }\n }, []);\n\n const allGroups: Array<string | undefined> = [...groups];\n if (filteredNavigationEntries.filter(e => !e.group).length > 0 || filteredNavigationEntries.length === 0) {\n allGroups.push(undefined);\n }\n\n let additionalPluginChildrenStart: React.ReactNode | undefined;\n let additionalPluginChildrenEnd: React.ReactNode | undefined;\n let additionalPluginSections: React.ReactNode | undefined;\n if (customizationController.plugins) {\n const sectionProps: PluginGenericProps = {\n context\n };\n additionalPluginSections = <>\n {customizationController.plugins.filter(plugin => plugin.homePage?.includeSection)\n .map((plugin, i) => {\n const section = plugin.homePage!.includeSection!(sectionProps)\n return (\n <NavigationGroup\n group={section.title}\n key={`plugin_section_${plugin.name}`}>\n {section.children}\n </NavigationGroup>\n );\n })}\n </>;\n additionalPluginChildrenStart = <div className={\"flex flex-col gap-2\"}>\n {customizationController.plugins.filter(plugin => plugin.homePage?.additionalChildrenStart)\n .map((plugin, i) => {\n return <div key={`plugin_children_start_${i}`}>{plugin.homePage!.additionalChildrenStart}</div>;\n })}\n </div>;\n\n additionalPluginChildrenEnd = <div className={\"flex flex-col gap-2\"}>\n {customizationController.plugins.filter(plugin => plugin.homePage?.additionalChildrenEnd)\n .map((plugin, i) => {\n return <div key={`plugin_children_start_${i}`}>{plugin.homePage!.additionalChildrenEnd}</div>;\n })}\n </div>;\n }\n\n return (\n <div id=\"home_page\"\n ref={containerRef}\n className=\"py-2 overflow-auto h-full w-full\">\n <Container maxWidth={\"6xl\"}>\n <div\n className=\"w-full sticky py-4 transition-all duration-400 ease-in-out top-0 z-10 flex flex-row gap-4\"\n style={{ top: direction === \"down\" ? -84 : 0 }}>\n <SearchBar onTextSearch={updateSearchResults}\n placeholder={\"Search collections\"}\n large={false}\n innerClassName={\"w-full\"}\n className={\"w-full flex-grow\"}/>\n {additionalActions}\n </div>\n\n <FavouritesView hidden={Boolean(filteredUrls)}/>\n\n {additionalChildrenStart}\n\n {additionalPluginChildrenStart}\n\n {allGroups.map((group, index) => {\n\n const AdditionalCards: React.ComponentType<PluginHomePageAdditionalCardsProps>[] = [];\n const actionProps: PluginHomePageAdditionalCardsProps = {\n group,\n context\n };\n\n if (customizationController.plugins) {\n customizationController.plugins.forEach(plugin => {\n if (plugin.homePage?.AdditionalCards) {\n AdditionalCards.push(...toArray(plugin.homePage?.AdditionalCards));\n }\n });\n }\n\n const thisGroupCollections = filteredNavigationEntries\n .filter((entry) => entry.group === group || (!entry.group && group === undefined));\n if (thisGroupCollections.length === 0 && AdditionalCards.length === 0)\n return null;\n return (\n <NavigationGroup\n group={group}\n key={`plugin_section_${group}`}>\n\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\">\n {thisGroupCollections.map((entry) => (\n <div key={`nav_${entry.group}_${entry.name}`} className=\"col-span-1\">\n <NavigationCardBinding\n {...entry}\n onClick={() => {\n let event: CMSAnalyticsEvent;\n if (entry.type === \"collection\") {\n event = \"home_navigate_to_collection\";\n } else if (entry.type === \"view\") {\n event = \"home_navigate_to_view\";\n } else if (entry.type === \"admin\") {\n event = \"home_navigate_to_admin_view\";\n } else {\n event = \"unmapped_event\";\n }\n context.analyticsController?.onAnalyticsEvent?.(event, { path: entry.path });\n }}\n />\n </div>\n ))}\n {AdditionalCards &&\n AdditionalCards.map((AdditionalCard, i) => (\n <div key={`nav_${group}_add_${i}`}>\n <AdditionalCard {...actionProps} />\n </div>\n ))}\n </div>\n </NavigationGroup>\n );\n })}\n\n {additionalPluginSections}\n\n {additionalPluginChildrenEnd}\n\n {additionalChildrenEnd}\n\n </Container>\n </div>\n );\n}\n","import React from \"react\";\n\nimport { canCreateEntity, canDeleteEntity, fullPathToCollectionSegments } from \"../../util\";\nimport { useAuthController, useCustomizationController, useFireCMSContext, useLargeLayout } from \"../../hooks\";\nimport { CollectionActionsProps, EntityCollection, EntityTableController, SelectionController } from \"../../types\";\nimport { AddIcon, Button, DeleteIcon, IconButton, Tooltip } from \"@firecms/ui\";\nimport { toArray } from \"../../util/arrays\";\nimport { ErrorBoundary } from \"../ErrorBoundary\";\n\nexport type EntityCollectionViewActionsProps<M extends Record<string, any>> = {\n collection: EntityCollection<M>;\n path: string;\n relativePath: string;\n parentCollectionIds: string[];\n selectionEnabled: boolean;\n onNewClick: () => void;\n onMultipleDeleteClick: () => void;\n selectionController: SelectionController<M>;\n tableController: EntityTableController<M>;\n collectionEntitiesCount: number;\n}\n\nexport function EntityCollectionViewActions<M extends Record<string, any>>({\n collection,\n relativePath,\n parentCollectionIds,\n onNewClick,\n onMultipleDeleteClick,\n selectionEnabled,\n path,\n selectionController,\n tableController,\n collectionEntitiesCount\n }: EntityCollectionViewActionsProps<M>) {\n\n const context = useFireCMSContext();\n\n const customizationController = useCustomizationController();\n const plugins = customizationController.plugins ?? [];\n\n const authController = useAuthController();\n\n const largeLayout = useLargeLayout();\n\n const selectedEntities = selectionController.selectedEntities;\n\n const addButton = canCreateEntity(collection, authController, path, null) &&\n onNewClick && (largeLayout\n ? <Button\n id={`add_entity_${path}`}\n onClick={onNewClick}\n startIcon={<AddIcon/>}\n variant=\"filled\"\n color=\"primary\">\n Add {collection.singularName ?? collection.name}\n </Button>\n : <Button\n id={`add_entity_${path}`}\n onClick={onNewClick}\n variant=\"filled\"\n color=\"primary\"\n >\n <AddIcon/>\n </Button>);\n\n const multipleDeleteEnabled = canDeleteEntity(collection, authController, path, null);\n\n let multipleDeleteButton: React.ReactNode | undefined;\n if (selectionEnabled) {\n const button = largeLayout\n ? <Button\n variant={\"text\"}\n disabled={!(selectedEntities?.length) || !multipleDeleteEnabled}\n startIcon={<DeleteIcon/>}\n onClick={onMultipleDeleteClick}\n color={\"primary\"}\n className=\"lg:w-20\"\n >\n ({selectedEntities?.length})\n </Button>\n : <IconButton\n color={\"primary\"}\n disabled={!(selectedEntities?.length) || !multipleDeleteEnabled}\n onClick={onMultipleDeleteClick}>\n <DeleteIcon/>\n </IconButton>;\n multipleDeleteButton =\n <Tooltip\n title={multipleDeleteEnabled ? \"Delete\" : \"You have selected at least one entity you cannot delete\"}>\n {button}\n </Tooltip>\n }\n\n const actionProps: CollectionActionsProps = {\n path,\n relativePath,\n parentCollectionIds,\n collection,\n selectionController,\n context,\n tableController,\n collectionEntitiesCount\n };\n\n const actions = toArray(collection.Actions)\n .map((Action, i) => (\n <ErrorBoundary key={`actions_${i}`}>\n <Action {...actionProps} />\n </ErrorBoundary>\n ));\n\n if (plugins) {\n plugins.forEach((plugin, i) => {\n if (plugin.collectionView?.CollectionActions) {\n actions.push(...toArray(plugin.collectionView?.CollectionActions)\n .map((Action, j) => (\n <ErrorBoundary key={`plugin_actions_${i}_${j}`}>\n <Action {...actionProps} {...plugin.collectionView?.collectionActionsProps}/>\n </ErrorBoundary>\n )));\n }\n });\n }\n\n return (\n <>\n {actions}\n {multipleDeleteButton}\n {addButton}\n </>\n );\n}\n","import React, { useEffect } from \"react\";\n\ninterface DraggableProps {\n containerRef: React.RefObject<HTMLDivElement>,\n innerRef: React.RefObject<HTMLDivElement>,\n // ref: React.RefObject<HTMLDivElement>,\n x?: number;\n y?: number;\n onMove: (params: { x: number, y: number }) => void,\n}\n\nexport function useDraggable({\n containerRef,\n innerRef,\n x,\n y,\n onMove\n }: DraggableProps) {\n\n let relX = 0;\n let relY = 0;\n\n const listeningRef = React.useRef(false);\n\n const onMouseDown = (event: any) => {\n if (event.button !== 0 || !containerRef.current || event.defaultPrevented || event.innerClicked) {\n return;\n }\n\n const {\n x,\n y\n } = containerRef.current.getBoundingClientRect();\n\n relX = event.screenX - x;\n relY = event.screenY - y;\n document.addEventListener(\"mousemove\", onMouseMove);\n document.addEventListener(\"mouseup\", onMouseUp);\n document.addEventListener(\"selectstart\", onSelect);\n listeningRef.current = true;\n // event.stopPropagation();\n };\n const onMouseDownInner = (event: any) => {\n // @ts-ignore\n event.innerClicked = true;\n };\n\n const onSelect = (event: any) => {\n event.preventDefault()\n event.stopPropagation();\n };\n\n const onMouseUp = (event: any) => {\n document.removeEventListener(\"mousemove\", onMouseMove);\n document.removeEventListener(\"mouseup\", onMouseUp);\n document.removeEventListener(\"selectstart\", onSelect);\n event.stopPropagation();\n listeningRef.current = false;\n };\n\n const onMouseMove = (event: any) => {\n if (event.target.localName === \"input\" || !listeningRef.current)\n return;\n onMove({\n x: event.screenX - relX,\n y: event.screenY - relY\n }\n );\n event.stopPropagation();\n };\n\n const update = () => {\n if (containerRef.current) {\n containerRef.current.style.top = `${y}px`;\n containerRef.current.style.left = `${x}px`;\n }\n };\n\n useEffect(() => {\n const current = containerRef.current;\n const innerCurrent = innerRef.current;\n if (!current || !innerCurrent)\n return;\n if (innerCurrent)\n innerCurrent.addEventListener(\"mousedown\", onMouseDownInner);\n if (current)\n current.addEventListener(\"mousedown\", onMouseDown);\n update();\n return () => {\n if (current)\n current.removeEventListener(\"mousedown\", onMouseDown);\n if (innerCurrent)\n innerCurrent.removeEventListener(\"mousedown\", onMouseDownInner);\n };\n });\n\n}\n","import { useLayoutEffect, useState } from \"react\";\n\ninterface WindowSize {\n width: number,\n height: number\n}\n\nexport function useWindowSize(): WindowSize {\n const [size, setSize] = useState<WindowSize>({ width: 0, height: 0 });\n useLayoutEffect(() => {\n function updateSize() {\n setSize({ width: window.innerWidth, height: window.innerHeight });\n }\n\n window.addEventListener(\"resize\", updateSize);\n updateSize();\n return () => window.removeEventListener(\"resize\", updateSize);\n }, []);\n return size;\n}\n","import { RefObject, useCallback, useEffect, useRef } from \"react\";\n\ninterface Props {\n onResize: (event: Event) => void;\n}\n\nexport const ElementResizeListener: React.FC<Props> = ({ onResize }) => {\n const rafRef = useRef(0);\n const objectRef: RefObject<HTMLObjectElement> = useRef(null);\n const onResizeRef = useRef(onResize);\n\n onResizeRef.current = onResize;\n\n const _onResize = useCallback((e: Event) => {\n if (rafRef.current) {\n cancelAnimationFrame(rafRef.current);\n }\n rafRef.current = requestAnimationFrame(() => {\n onResizeRef.current(e);\n });\n }, []);\n\n const onLoad = useCallback(() => {\n const obj = objectRef.current;\n if (obj && obj.contentDocument && obj.contentDocument.defaultView) {\n obj.contentDocument.defaultView.addEventListener(\"resize\", _onResize);\n }\n }, [_onResize]);\n\n useEffect(() => {\n const obj = objectRef.current;\n return () => {\n if (obj && obj.contentDocument && obj.contentDocument.defaultView) {\n obj.contentDocument.defaultView.removeEventListener(\"resize\", _onResize);\n }\n };\n }, [_onResize]);\n\n return (\n <object\n onLoad={onLoad}\n ref={objectRef}\n tabIndex={-1}\n type={\"text/html\"}\n data={\"about:blank\"}\n title={\"\"}\n style={{\n position: \"absolute\",\n top: 0,\n left: 0,\n height: \"100%\",\n width: \"100%\",\n pointerEvents: \"none\",\n zIndex: -1,\n opacity: 0\n }}\n />\n );\n};\n","import { ArrayContainer } from \"../../components\";\nimport React from \"react\";\n\ninterface ArrayContainerProps<T> {\n value: T[];\n name: string;\n addLabel: string;\n buildEntry: (index: number, internalId: number) => React.ReactNode;\n disabled?: boolean;\n small?: boolean;\n onInternalIdAdded?: (id: number) => void;\n includeAddButton?: boolean;\n newDefaultEntry?: T | null;\n setFieldValue: (field: string, value: any, shouldValidate?: boolean | undefined) => void;\n}\n\n/**\n * @group Form custom fields\n */\nexport function FormikArrayContainer<T>({\n name,\n addLabel,\n value,\n disabled = false,\n buildEntry,\n small,\n onInternalIdAdded,\n includeAddButton,\n newDefaultEntry = null,\n setFieldValue\n }: ArrayContainerProps<T>) {\n\n return <ArrayContainer droppableId={name}\n addLabel={addLabel}\n value={value}\n disabled={disabled}\n buildEntry={buildEntry}\n size={small ? \"small\" : \"medium\"}\n onInternalIdAdded={onInternalIdAdded}\n includeAddButton={includeAddButton}\n newDefaultEntry={newDefaultEntry}\n onValueChange={(value) => setFieldValue(name, value)}\n />;\n}\n","import { ResolvedProperty } from \"../../types\";\nimport { IconButton, InfoIcon, Tooltip, Typography } from \"@firecms/ui\";\n\n/**\n * Component in charge of rendering the description of a field\n * as well as the error message if any.\n */\nexport function FieldHelperText({\n error,\n showError,\n property,\n includeDescription = true,\n disabled\n }: {\n error?: string,\n showError: boolean,\n property: ResolvedProperty,\n includeDescription?: boolean,\n disabled?: boolean,\n }\n) {\n\n const hasDescription = property.description || property.longDescription;\n\n if (!(showError && error) && (!includeDescription || !hasDescription))\n return null;\n\n if (showError && error) {\n return <Typography variant={\"caption\"}\n className={\"ml-3.5 text-red-500 dark:text-red-500\"}>\n {error}\n </Typography>\n }\n\n const disabledTooltip: string | undefined = typeof property.disabled === \"object\" ? property.disabled.disabledMessage : undefined;\n\n return <div className={\"flex ml-3.5 mt-1\"}>\n <Typography variant={\"caption\"}\n color={disabled ? \"disabled\" : \"secondary\"}\n className={\"flex-grow\"}>\n {disabledTooltip || property.description}\n </Typography>\n\n {property.longDescription &&\n <Tooltip title={property.longDescription}\n side=\"bottom\"\n >\n <IconButton\n size={\"small\"}\n className=\"self-start\">\n\n <InfoIcon color={\"disabled\"}\n size={\"small\"}/>\n </IconButton>\n </Tooltip>}\n\n </div>\n}\n","import React from \"react\";\n\ninterface LabelWithIconProps {\n icon: React.ReactNode;\n title?: string;\n small?: boolean;\n className?: string;\n required?: boolean;\n}\n\n/**\n * Render the label of with an icon and the title of a property\n * @group Form custom fields\n */\nexport function LabelWithIcon({\n icon,\n title,\n small,\n className,\n required\n }: LabelWithIconProps) {\n return (\n <span\n className={`inline-flex items-center my-0.5 ${small ? \"gap-1\" : \"gap-2\"} ${className ?? \"\"}`}>\n\n {icon}\n\n <span\n className={`text-start font-medium text-${small ? \"base\" : \"sm\"} origin-top-left transform ${small ? \"translate-x-2 scale-75\" : \"\"}`}>{(title ?? \"\") + (required ? \" *\" : \"\")}</span>\n\n </span>\n );\n}\n","import React, { useCallback } from \"react\";\n\nimport { EnumType, FieldProps } from \"../../types\";\nimport { FieldHelperText, LabelWithIcon } from \"../components\";\nimport { EnumValuesChip } from \"../../preview\";\nimport { getIconForProperty } from \"../../util\";\nimport { ClearIcon, cn, IconButton, Select, SelectItem } from \"@firecms/ui\";\nimport { useClearRestoreValue } from \"../useClearRestoreValue\";\n\ntype SelectProps<T extends EnumType> = FieldProps<T>;\n\n/**\n * If `enumValues` are set in the string config, this field renders a select\n * where each option is a colored chip.\n *\n * This is one of the internal components that get mapped natively inside forms\n * and tables to the specified properties.\n * @group Form fields\n */\nexport function SelectFieldBinding<T extends EnumType>({\n propertyKey,\n value,\n setValue,\n error,\n showError,\n disabled,\n autoFocus,\n touched,\n property,\n includeDescription\n }: SelectProps<T>) {\n\n const enumValues = property.enumValues;\n\n useClearRestoreValue({\n property,\n value,\n setValue\n });\n\n const handleClearClick = useCallback((e: React.MouseEvent) => {\n e.stopPropagation();\n e.preventDefault();\n setValue(null);\n }, [setValue]);\n\n return (\n <>\n\n <Select\n value={value ? value.toString() : \"\"}\n disabled={disabled}\n position=\"item-aligned\"\n inputClassName={cn(\"w-full\")}\n label={<LabelWithIcon icon={getIconForProperty(property, \"small\")}\n required={property.validation?.required}\n title={property.name}\n className={\"text-text-secondary dark:text-text-secondary-dark ml-3.5\"}\n />}\n endAdornment={\n property.clearable && <IconButton\n onClick={handleClearClick}>\n <ClearIcon/>\n </IconButton>\n }\n onValueChange={(updatedValue: string) => {\n const newValue = updatedValue\n ? (property.dataType === \"number\" ? parseFloat(updatedValue) : updatedValue)\n : null;\n return setValue(newValue as T);\n }}\n renderValue={(enumKey: any) => {\n return <EnumValuesChip\n enumKey={enumKey}\n enumValues={enumValues}\n size={\"medium\"}/>;\n }}\n >\n {enumValues && enumValues.map((option) => {\n return <SelectItem\n key={option.id}\n value={String(option.id)}>\n <EnumValuesChip\n enumKey={String(option.id)}\n enumValues={enumValues}\n size={\"medium\"}/>\n </SelectItem>\n })}\n </Select>\n\n <FieldHelperText includeDescription={includeDescription}\n showError={showError}\n error={error}\n disabled={disabled}\n property={property}/>\n\n </>\n );\n}\n","import React, { useCallback } from \"react\";\n\nimport { EnumType, FieldProps, ResolvedProperty } from \"../../types\";\nimport { FieldHelperText, LabelWithIcon } from \"../components\";\nimport { EnumValuesChip } from \"../../preview\";\nimport { enumToObjectEntries, getIconForProperty, getLabelOrConfigFrom } from \"../../util\";\nimport { CloseIcon, MultiSelect, MultiSelectItem } from \"@firecms/ui\";\nimport { useClearRestoreValue } from \"../useClearRestoreValue\";\n\n/**\n * This fields renders a dropdown with multiple selection.\n *\n * This is one of the internal components that get mapped natively inside forms\n * and tables to the specified properties.\n * @group Form fields\n */\nexport function MultiSelectBinding({\n propertyKey,\n value,\n setValue,\n error,\n showError,\n disabled,\n property,\n includeDescription,\n autoFocus\n }: FieldProps<EnumType[], any, any>) {\n\n const of: ResolvedProperty<any> | ResolvedProperty<any>[] = property.of;\n if (!of) {\n throw Error(\"Using wrong component ArrayEnumSelect\");\n }\n\n if (Array.isArray(of)) {\n throw Error(\"Using array properties instead of single one in `of` in ArrayProperty\");\n }\n\n if (of.dataType !== \"string\" && of.dataType !== \"number\") {\n throw Error(\"Field misconfiguration: array field of type string or number\");\n }\n\n const enumValues = enumToObjectEntries(of.enumValues);\n if (!enumValues) {\n console.error(property);\n throw Error(\"Field misconfiguration: array field of type string or number needs to have enumValues\");\n }\n\n useClearRestoreValue({\n property,\n value,\n setValue\n });\n\n const validValue = !!value && Array.isArray(value);\n\n const renderValue = useCallback((enumKey: string, list: boolean) => {\n const enumValue = enumKey !== undefined ? getLabelOrConfigFrom(enumValues, enumKey) : undefined;\n return <EnumValuesChip\n enumKey={enumKey}\n enumValues={enumValues}\n size={\"medium\"}\n key={enumKey}>\n {enumValue?.label ?? enumKey}\n {!list && <button\n className=\"ml-1 ring-offset-background rounded-full outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2\"\n onMouseDown={(e) => {\n e.preventDefault();\n e.stopPropagation();\n }}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n setValue(value.filter(v => v !== enumKey));\n }}\n >\n <CloseIcon size=\"smallest\"/>\n </button>}\n </EnumValuesChip>;\n }, [enumValues, setValue, value]);\n\n return (\n <div className=\"mt-0.5 ml-0.5 mt-2\">\n <MultiSelect\n value={validValue ? value.map((v) => v.toString()) : []}\n disabled={disabled}\n label={<LabelWithIcon icon={getIconForProperty(property, \"small\")}\n required={property.validation?.required}\n title={property.name}\n className={\"text-text-secondary dark:text-text-secondary-dark ml-3.5\"}/>}\n renderValue={useCallback((v: string) => renderValue(v, false), [renderValue])}\n onMultiValueChange={(updatedValue: string[]) => {\n let newValue: EnumType[] | null;\n if (of && (of as ResolvedProperty)?.dataType === \"number\") {\n newValue = updatedValue ? (updatedValue as string[]).map((e) => parseFloat(e)) : [];\n } else {\n newValue = updatedValue;\n }\n return setValue(newValue);\n }}>\n {enumValues.map((enumValue) => String(enumValue.id)).map((enumKey) => (\n <MultiSelectItem key={enumKey} value={enumKey}>\n {renderValue(enumKey, true)}\n </MultiSelectItem>))}\n </MultiSelect>\n\n <FieldHelperText includeDescription={includeDescription}\n showError={showError}\n error={error}\n disabled={disabled}\n property={property}/>\n\n </div>\n );\n}\n","import React, { useCallback, useMemo } from \"react\";\nimport { Entity, EntityCollection, EntityReference, FieldProps, ResolvedProperty } from \"../../types\";\nimport { ReferencePreview } from \"../../preview\";\nimport { FieldHelperText, FormikArrayContainer, LabelWithIcon } from \"../components\";\nimport { ErrorView } from \"../../components\";\nimport { getIconForProperty, getReferenceFrom } from \"../../util\";\n\nimport { useNavigationController, useReferenceDialog } from \"../../hooks\";\nimport { Button, cn, ExpandablePanel, fieldBackgroundMixin } from \"@firecms/ui\";\nimport { useClearRestoreValue } from \"../useClearRestoreValue\";\n\ntype ArrayOfReferencesFieldProps = FieldProps<EntityReference[]>;\n\n/**\n * This field allows selecting multiple references.\n *\n * This is one of the internal components that get mapped natively inside forms\n * and tables to the specified properties.\n * @group Form fields\n */\nexport function ArrayOfReferencesFieldBinding({\n propertyKey,\n value,\n error,\n showError,\n disabled,\n isSubmitting,\n tableMode,\n property,\n includeDescription,\n setValue,\n setFieldValue\n }: ArrayOfReferencesFieldProps) {\n\n const ofProperty = property.of as ResolvedProperty;\n if (ofProperty.dataType !== \"reference\") {\n throw Error(\"ArrayOfReferencesField expected a property containing references\");\n }\n\n const expanded = property.expanded === undefined ? true : property.expanded;\n const selectedEntityIds = value && Array.isArray(value) ? value.map((ref) => ref.id) : [];\n\n useClearRestoreValue({\n property,\n value,\n setValue\n });\n\n const navigationController = useNavigationController();\n const collection: EntityCollection | undefined = useMemo(() => {\n return ofProperty.path ? navigationController.getCollection(ofProperty.path) : undefined;\n }, [ofProperty.path]);\n\n if (!collection) {\n throw Error(`Couldn't find the corresponding collection for the path: ${ofProperty.path}`);\n }\n\n const onMultipleEntitiesSelected = useCallback((entities: Entity<any>[]) => {\n console.debug(\"onMultipleEntitiesSelected\", entities);\n setValue(entities.map(e => getReferenceFrom(e)));\n }, [setValue]);\n\n const referenceDialogController = useReferenceDialog({\n multiselect: true,\n path: ofProperty.path,\n collection,\n onMultipleEntitiesSelected,\n selectedEntityIds,\n forceFilter: ofProperty.forceFilter\n }\n );\n\n const onEntryClick = useCallback((e: React.SyntheticEvent) => {\n e.preventDefault();\n referenceDialogController.open();\n }, [referenceDialogController]);\n\n const buildEntry = useCallback((index: number, internalId: number) => {\n const entryValue = value && value.length > index ? value[index] : undefined;\n if (!entryValue)\n return <div>Internal ERROR</div>;\n return (\n <ReferencePreview\n key={internalId}\n disabled={!ofProperty.path}\n previewProperties={ofProperty.previewProperties}\n size={\"medium\"}\n onClick={onEntryClick}\n hover={!disabled}\n reference={entryValue}\n />\n );\n }, [ofProperty.path, ofProperty.previewProperties, value]);\n\n const title = (\n <LabelWithIcon icon={getIconForProperty(property, \"small\")}\n required={property.validation?.required}\n title={property.name}\n className={\"text-text-secondary dark:text-text-secondary-dark\"}/>\n );\n\n const body = <>\n {!collection && <ErrorView\n error={\"The specified collection does not exist. Check console\"}/>}\n\n {collection && <div className={\"group\"}>\n\n <FormikArrayContainer value={value}\n addLabel={property.name ? \"Add reference to \" + property.name : \"Add reference\"}\n name={propertyKey}\n buildEntry={buildEntry}\n disabled={isSubmitting}\n setFieldValue={setFieldValue}\n newDefaultEntry={property.of.defaultValue}/>\n\n <Button\n className=\"my-4 justify-center text-left\"\n variant=\"outlined\"\n color=\"primary\"\n disabled={isSubmitting}\n onClick={onEntryClick}>\n Edit {property.name}\n </Button>\n </div>}\n </>;\n\n return (\n <>\n\n {!tableMode &&\n <ExpandablePanel\n titleClassName={fieldBackgroundMixin}\n className={cn(\"px-2 md:px-4 pb-2 md:pb-4 pt-1 md:pt-2\", fieldBackgroundMixin)}\n initiallyExpanded={expanded}\n title={title}>\n {body}\n </ExpandablePanel>}\n\n {tableMode && body}\n\n <FieldHelperText includeDescription={includeDescription}\n showError={showError}\n error={error}\n disabled={disabled}\n property={property}/>\n\n </>\n );\n}\n","import React from \"react\";\n\nimport { Entity, EntityCollection, ResolvedStringProperty } from \"../../types\";\nimport { PreviewSize, PropertyPreview } from \"../../preview\";\n\nimport { cn, IconButton, paperMixin, RemoveIcon, Tooltip } from \"@firecms/ui\";\nimport { ErrorBoundary } from \"../../components\";\n\ninterface StorageItemPreviewProps {\n name: string;\n property: ResolvedStringProperty;\n value: string,\n entity: Entity<any>,\n onRemove: (value: string) => void;\n size: PreviewSize;\n disabled: boolean;\n collection: EntityCollection;\n}\n\nexport function StorageItemPreview({\n name,\n property,\n value,\n entity,\n onRemove,\n disabled,\n size,\n collection\n }: StorageItemPreviewProps) {\n\n return (\n <div className={cn(paperMixin,\n \"relative m-4 border-box flex items-center justify-center\",\n size === \"medium\" ? \"min-w-[220px] min-h-[220px] max-w-[220px]\" : \"min-w-[118px] min-h-[118px] max-w-[118px]\")}>\n\n {!disabled &&\n <div\n className=\"absolute rounded-full -top-2 -right-2 z-10 bg-white dark:bg-gray-900\">\n\n <Tooltip\n title=\"Remove\">\n <IconButton\n size={\"small\"}\n onClick={(event) => {\n event.stopPropagation();\n onRemove(value);\n }}>\n <RemoveIcon size={\"small\"}/>\n </IconButton>\n </Tooltip>\n </div>\n }\n\n {value &&\n <ErrorBoundary>\n <PropertyPreview propertyKey={name}\n value={value}\n property={property}\n // entity={entity}\n size={size}/>\n </ErrorBoundary>\n }\n\n\n </div>\n );\n\n}\n","import React, { useCallback } from \"react\";\n\nimport {\n ArrayProperty,\n Entity,\n EntityCollection,\n FieldProps,\n ResolvedArrayProperty,\n ResolvedStringProperty,\n StorageConfig\n} from \"../../types\";\nimport { useDropzone } from \"react-dropzone\";\nimport { PreviewSize } from \"../../preview\";\nimport { FieldHelperText, LabelWithIcon } from \"../components\";\n\nimport { getIconForProperty, isReadOnly } from \"../../util\";\nimport { useSnackbarController, useStorageSource } from \"../../hooks\";\nimport { DragDropContext, Draggable, Droppable } from \"@hello-pangea/dnd\";\nimport { StorageFieldItem, useStorageUploadController } from \"../../util/useStorageUploadController\";\nimport { StorageUploadProgress } from \"../components/StorageUploadProgress\";\nimport { StorageItemPreview } from \"../components/StorageItemPreview\";\nimport {\n cn,\n fieldBackgroundDisabledMixin,\n fieldBackgroundHoverMixin,\n fieldBackgroundMixin,\n focusedMixin,\n Typography\n} from \"@firecms/ui\";\nimport { useClearRestoreValue } from \"../useClearRestoreValue\";\n\nconst dropZoneClasses = \"box-border relative pt-[2px] items-center border border-transparent min-h-[254px] outline-none rounded-md duration-200 ease-[cubic-bezier(0.4,0,0.2,1)] focus:border-primary-solid\";\nconst disabledClasses = \"border-dotted-gray\"\nconst nonActiveDropClasses = \"hover:bg-field-hover dark:hover:bg-field-hover-dark\"\nconst activeDropClasses = \"pt-0 border-2 border-solid\"\nconst acceptDropClasses = \"transition-colors duration-200 ease-[cubic-bezier(0,0,0.2,1)] border-2 border-solid border-green-500\"\nconst rejectDropClasses = \"transition-colors duration-200 ease-[cubic-bezier(0,0,0.2,1)] border-2 border-solid border-red-500\"\n\ntype StorageUploadFieldProps = FieldProps<string | string[]>;\n\n/**\n * Field that allows to upload files to Google Cloud Storage.\n *\n * This is one of the internal components that get mapped natively inside forms\n * and tables to the specified properties.\n * @group Form fields\n */\nexport function StorageUploadFieldBinding({\n propertyKey,\n value,\n setValue,\n error,\n showError,\n autoFocus,\n tableMode,\n property,\n includeDescription,\n context,\n isSubmitting,\n }: StorageUploadFieldProps) {\n\n if (!context.entityId)\n throw new Error(\"StorageUploadFieldBinding: Entity id is null\");\n\n const storageSource = useStorageSource(context.collection);\n const disabled = isReadOnly(property) || !!property.disabled || isSubmitting;\n\n const {\n internalValue,\n setInternalValue,\n onFilesAdded,\n storage,\n onFileUploadComplete,\n storagePathBuilder,\n multipleFilesSupported\n } = useStorageUploadController({\n entityValues: context.values,\n entityId: context.entityId,\n path: context.path,\n property,\n propertyKey,\n value,\n storageSource,\n disabled,\n onChange: setValue\n });\n\n useClearRestoreValue<string | string[]>({\n property,\n value,\n setValue\n });\n\n const entity: Entity<any> = {\n id: context.entityId,\n values: context.values,\n path: context.path\n };\n\n return (\n\n <>\n\n {!tableMode &&\n <LabelWithIcon icon={getIconForProperty(property, \"small\")}\n required={property.validation?.required}\n title={property.name}\n className={\"text-text-secondary dark:text-text-secondary-dark ml-3.5\"}/>}\n\n <StorageUpload\n value={internalValue}\n collection={context.collection}\n name={propertyKey}\n disabled={disabled}\n autoFocus={autoFocus}\n property={property}\n onChange={setValue}\n setInternalValue={setInternalValue}\n onFilesAdded={onFilesAdded}\n entity={entity}\n onFileUploadComplete={onFileUploadComplete}\n storagePathBuilder={storagePathBuilder}\n storage={storage}\n multipleFilesSupported={multipleFilesSupported}/>\n\n <FieldHelperText includeDescription={includeDescription}\n showError={showError}\n error={error}\n disabled={disabled}\n property={property}/>\n\n </>\n );\n}\n\nfunction FileDropComponent({\n storage,\n collection,\n disabled,\n isDraggingOver,\n onFilesAdded,\n multipleFilesSupported,\n droppableProvided,\n autoFocus,\n internalValue,\n property,\n entity,\n onClear,\n metadata,\n storagePathBuilder,\n onFileUploadComplete,\n size,\n name,\n helpText\n }: {\n storage: StorageConfig,\n collection: EntityCollection,\n disabled: boolean,\n isDraggingOver: boolean,\n droppableProvided: any,\n onFilesAdded: (acceptedFiles: File[]) => void,\n multipleFilesSupported: boolean,\n autoFocus: boolean,\n internalValue: StorageFieldItem[],\n property: ResolvedStringProperty,\n onClear: (clearedStoragePathOrDownloadUrl: string) => void,\n metadata: any,\n entity: Entity<any>;\n storagePathBuilder: (file: File) => string,\n onFileUploadComplete: (uploadedPath: string, entry: StorageFieldItem, fileMetadata?: any) => Promise<void>,\n size: PreviewSize,\n name: string,\n helpText: string\n}) {\n\n const snackbarContext = useSnackbarController();\n\n const {\n getRootProps,\n getInputProps,\n isDragActive,\n isDragAccept,\n isDragReject\n } = useDropzone({\n accept: storage.acceptedFiles ? storage.acceptedFiles.map(e => ({ [e]: [] })).reduce((a, b) => ({ ...a, ...b }), {}) : undefined,\n disabled: disabled || isDraggingOver,\n noDragEventsBubbling: true,\n maxSize: storage.maxSize,\n onDrop: onFilesAdded,\n onDropRejected: (fileRejections, event) => {\n for (const fileRejection of fileRejections) {\n for (const error of fileRejection.errors) {\n snackbarContext.open({\n type: \"error\",\n message: `Error uploading file: File is larger than ${storage.maxSize} bytes`\n });\n }\n }\n }\n }\n );\n\n return (\n <div\n {...getRootProps()}\n className={cn(\n fieldBackgroundMixin,\n disabled ? fieldBackgroundDisabledMixin : fieldBackgroundHoverMixin,\n dropZoneClasses,\n multipleFilesSupported && internalValue.length ? \"\" : \"flex\",\n focusedMixin,\n {\n [nonActiveDropClasses]: !isDragActive,\n [activeDropClasses]: isDragActive,\n [rejectDropClasses]: isDragReject,\n [acceptDropClasses]: isDragAccept,\n [disabledClasses]: disabled\n })}\n >\n <div\n {...droppableProvided.droppableProps}\n ref={droppableProvided.innerRef}\n className={cn(\"flex items-center p-1 no-scrollbar\",\n multipleFilesSupported && internalValue.length ? \"overflow-auto\" : \"\",\n multipleFilesSupported && internalValue.length ? \"min-h-[180px]\" : \"min-h-[250px]\"\n )}\n >\n\n <input\n autoFocus={autoFocus}\n {...getInputProps()} />\n\n {internalValue.map((entry, index) => {\n let child: any;\n if (entry.storagePathOrDownloadUrl) {\n child = (\n <StorageItemPreview\n collection={collection}\n name={`storage_preview_${entry.storagePathOrDownloadUrl}`}\n property={property}\n disabled={disabled}\n entity={entity}\n value={entry.storagePathOrDownloadUrl}\n onRemove={onClear}\n size={entry.size}/>\n );\n } else if (entry.file) {\n child = (\n <StorageUploadProgress\n entry={entry}\n metadata={metadata}\n storagePath={storagePathBuilder(entry.file)}\n onFileUploadComplete={onFileUploadComplete}\n imageSize={size === \"medium\" ? 220 : 118}\n simple={false}\n />\n );\n }\n\n return (\n <Draggable\n key={`array_field_${name}_${entry.id}`}\n draggableId={`array_field_${name}_${entry.id}`}\n index={index}>\n {(provided, snapshot) => (\n <div\n tabIndex={-1}\n ref={provided.innerRef}\n {...provided.draggableProps}\n {...provided.dragHandleProps}\n className={cn(focusedMixin, \"rounded-md\")}\n style={{\n ...provided.draggableProps.style\n }}\n >\n {child}\n </div>\n )}\n </Draggable>\n );\n })\n }\n\n {droppableProvided.placeholder}\n\n </div>\n\n <div\n className=\"flex-grow min-h-[38px] box-border m-2 text-center\">\n <Typography align={\"center\"}\n variant={\"label\"}>\n {helpText}\n </Typography>\n </div>\n\n </div>\n );\n}\n\nexport interface StorageUploadProps {\n value: StorageFieldItem[];\n collection: EntityCollection;\n setInternalValue: (v: StorageFieldItem[]) => void;\n name: string;\n property: ResolvedStringProperty | ResolvedArrayProperty<string[]>;\n onChange: (value: string | string[] | null) => void;\n multipleFilesSupported: boolean;\n autoFocus: boolean;\n disabled: boolean;\n entity: Entity<any>;\n storage: StorageConfig;\n onFilesAdded: (acceptedFiles: File[]) => void;\n storagePathBuilder: (file: File) => string;\n onFileUploadComplete: (uploadedPath: string, entry: StorageFieldItem, fileMetadata?: any) => Promise<void>;\n}\n\nexport function StorageUpload({\n collection,\n property,\n name,\n value,\n setInternalValue,\n onChange,\n multipleFilesSupported,\n onFileUploadComplete,\n disabled,\n onFilesAdded,\n autoFocus,\n storage,\n entity,\n storagePathBuilder,\n }: StorageUploadProps) {\n\n if (multipleFilesSupported) {\n const arrayProperty = property as ResolvedArrayProperty<string[]>;\n if (arrayProperty.of) {\n if (Array.isArray(arrayProperty.of)) {\n throw Error(\"Storage field using array must be of data type string\");\n }\n if (arrayProperty.of.dataType !== \"string\") {\n throw Error(\"Storage field using array must be of data type string\");\n }\n } else {\n throw Error(\"Storage field using array must be of data type string\");\n }\n }\n\n const metadata: Record<string, unknown> | undefined = storage?.metadata;\n const size = multipleFilesSupported ? \"small\" : \"medium\";\n\n const moveItem = useCallback((fromIndex: number, toIndex: number) => {\n if (!multipleFilesSupported) return;\n const newValue = [...value];\n const item = newValue[fromIndex];\n newValue.splice(fromIndex, 1);\n newValue.splice(toIndex, 0, item);\n setInternalValue(newValue);\n const fieldValue = newValue\n .filter(e => !!e.storagePathOrDownloadUrl)\n .map(e => e.storagePathOrDownloadUrl as string);\n onChange(fieldValue);\n }, [multipleFilesSupported, onChange, setInternalValue, value]);\n\n const onDragEnd = useCallback((result: any) => {\n // dropped outside the list\n if (!result.destination) {\n return;\n }\n\n moveItem(result.source.index, result.destination.index);\n\n }, [moveItem])\n\n const onClear = useCallback((clearedStoragePathOrDownloadUrl: string) => {\n if (multipleFilesSupported) {\n const newValue: StorageFieldItem[] = value.filter(v => v.storagePathOrDownloadUrl !== clearedStoragePathOrDownloadUrl);\n onChange(newValue.filter(v => !!v.storagePathOrDownloadUrl).map(v => v.storagePathOrDownloadUrl as string));\n setInternalValue(newValue);\n } else {\n onChange(null);\n setInternalValue([]);\n }\n }, [value, multipleFilesSupported, onChange]);\n\n const helpText = multipleFilesSupported\n ? \"Drag 'n' drop some files here, or click to select files\"\n : \"Drag 'n' drop a file here, or click to select one\";\n\n const renderProperty: ResolvedStringProperty = multipleFilesSupported\n ? (property as ArrayProperty<string[]>).of as ResolvedStringProperty\n : property as ResolvedStringProperty;\n\n return (\n <DragDropContext onDragEnd={onDragEnd}>\n <Droppable\n droppableId={`droppable_${name}`}\n direction=\"horizontal\"\n renderClone={(provided, snapshot, rubric) => {\n const entry = value[rubric.source.index];\n return (\n <div\n ref={provided.innerRef}\n {...provided.draggableProps}\n {...provided.dragHandleProps}\n style={\n provided.draggableProps.style\n }\n className=\"rounded\"\n >\n <StorageItemPreview\n collection={collection}\n name={`storage_preview_${entry.storagePathOrDownloadUrl}`}\n property={renderProperty}\n disabled={true}\n entity={entity}\n value={entry.storagePathOrDownloadUrl as string}\n onRemove={onClear}\n size={entry.size}/>\n </div>\n );\n }}\n >\n {(provided, snapshot) => {\n return <FileDropComponent storage={storage}\n collection={collection}\n disabled={disabled}\n isDraggingOver={snapshot.isDraggingOver}\n droppableProvided={provided}\n onFilesAdded={onFilesAdded}\n multipleFilesSupported={multipleFilesSupported}\n autoFocus={autoFocus}\n internalValue={value}\n property={renderProperty}\n entity={entity}\n onClear={onClear}\n metadata={metadata}\n storagePathBuilder={storagePathBuilder}\n onFileUploadComplete={onFileUploadComplete}\n size={size}\n name={name}\n helpText={helpText}/>\n }}\n </Droppable>\n </DragDropContext>\n );\n\n}\n","import React, { useCallback } from \"react\";\n\nimport { ClearIcon, Collapse, IconButton, TextField } from \"@firecms/ui\";\nimport { FieldProps, PreviewType } from \"../../types\";\nimport { FieldHelperText, LabelWithIcon } from \"../components\";\nimport { getIconForProperty } from \"../../util\";\nimport { PropertyPreview } from \"../../preview\";\nimport { useClearRestoreValue } from \"../useClearRestoreValue\";\n\ninterface TextFieldBindingProps<T extends string | number> extends FieldProps<T> {\n allowInfinity?: boolean\n}\n\n/**\n * Generic text field.\n * This is one of the internal components that get mapped natively inside forms\n * and tables to the specified properties.\n * @group Form fields\n */\nexport function TextFieldBinding<T extends string | number>({\n context,\n propertyKey,\n value,\n setValue,\n error,\n showError,\n disabled,\n autoFocus,\n property,\n includeDescription,\n }: TextFieldBindingProps<T>) {\n\n let multiline: boolean | undefined;\n let url: boolean | PreviewType | undefined;\n if (property.dataType === \"string\") {\n multiline = property.multiline;\n url = property.url;\n }\n\n useClearRestoreValue({\n property,\n value,\n setValue\n });\n\n const handleClearClick = useCallback((e: React.MouseEvent) => {\n e.stopPropagation();\n e.preventDefault();\n setValue(null);\n }, [setValue]);\n\n const onChange = (event: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n if (inputType === \"number\") {\n const numberValue = event.target.value ? parseFloat(event.target.value) : undefined;\n if (numberValue && isNaN(numberValue)) {\n setValue(null);\n } else if (numberValue !== undefined && numberValue !== null) {\n setValue(numberValue as T);\n } else {\n setValue(null);\n }\n } else {\n setValue(event.target.value as T);\n }\n };\n\n const isMultiline = Boolean(multiline);\n\n const inputType = property.dataType === \"number\" ? \"number\" : undefined;\n return (\n <>\n <TextField\n value={value}\n onChange={onChange}\n autoFocus={autoFocus}\n label={<LabelWithIcon icon={getIconForProperty(property, \"small\")}\n required={property.validation?.required}\n title={property.name}/>}\n type={inputType}\n multiline={isMultiline}\n disabled={disabled}\n endAdornment={\n property.clearable && <IconButton\n onClick={handleClearClick}>\n <ClearIcon/>\n </IconButton>\n }\n error={showError ? error : undefined}\n inputClassName={error ? \"text-red-500 dark:text-red-600\" : \"\"}/>\n\n <FieldHelperText includeDescription={includeDescription}\n showError={showError}\n error={error}\n disabled={disabled}\n property={property}/>\n\n {url && <Collapse\n className=\"mt-1 ml-1\"\n in={Boolean(value)}>\n <PropertyPreview\n value={value}\n property={property}\n size={\"medium\"}/>\n </Collapse>}\n\n </>\n );\n\n}\n","import React from \"react\";\n\nimport { FieldProps } from \"../../types\";\nimport { getIconForProperty } from \"../../util\";\nimport { FieldHelperText, LabelWithIcon } from \"../components\";\nimport { BooleanSwitchWithLabel } from \"@firecms/ui\";\nimport { useClearRestoreValue } from \"../useClearRestoreValue\";\n\ntype SwitchFieldProps = FieldProps<boolean>;\n\n/**\n * Simple boolean switch biding to a boolean property.\n *\n * This is one of the internal components that get mapped natively inside forms\n * and tables to the specified properties.\n * @group Form fields\n */\nexport const SwitchFieldBinding = React.forwardRef(function SwitchFieldBinding({\n propertyKey,\n value,\n setValue,\n error,\n showError,\n autoFocus,\n disabled,\n touched,\n property,\n includeDescription\n }: SwitchFieldProps, ref) {\n\n useClearRestoreValue({\n property,\n value,\n setValue\n });\n\n return (\n <>\n\n <BooleanSwitchWithLabel\n value={value}\n onValueChange={(v) => setValue(v)}\n error={showError}\n label={<LabelWithIcon icon={getIconForProperty(property, \"small\")}\n required={property.validation?.required}\n title={property.name}/>}\n disabled={disabled}\n autoFocus={autoFocus}\n size={\"medium\"}\n />\n\n <FieldHelperText includeDescription={includeDescription}\n showError={showError}\n error={error}\n disabled={disabled}\n property={property}/>\n </>\n\n );\n});\n","import React from \"react\";\n\nimport { FieldProps } from \"../../types\";\n\nimport { FieldHelperText, LabelWithIcon } from \"../components\";\nimport { useCustomizationController } from \"../../hooks\";\nimport { getIconForProperty } from \"../../util\";\nimport { DateTimeField } from \"@firecms/ui\";\nimport { useClearRestoreValue } from \"../useClearRestoreValue\";\n\ntype DateTimeFieldProps = FieldProps<Date>;\n\n/**\n * Field that allows selecting a date\n *\n * This is one of the internal components that get mapped natively inside forms\n * and tables to the specified properties.\n * @group Form fields\n */\nexport function DateTimeFieldBinding({\n propertyKey,\n value,\n setValue,\n autoFocus,\n error,\n showError,\n disabled,\n touched,\n property,\n includeDescription\n }: DateTimeFieldProps) {\n\n const { locale } = useCustomizationController();\n const internalValue = value || null;\n\n useClearRestoreValue({\n property,\n value,\n setValue\n });\n\n return (\n <>\n <DateTimeField\n value={internalValue}\n onChange={(dateValue) => setValue(dateValue)}\n size={\"medium\"}\n mode={property.mode}\n clearable={property.clearable}\n locale={locale}\n error={showError}\n label={<LabelWithIcon\n icon={getIconForProperty(property, \"small\")}\n required={property.validation?.required}\n className={showError ? \"text-red-500 dark:text-red-500\" : \"text-text-secondary dark:text-text-secondary-dark\"}\n title={property.name}/>}\n />\n\n <FieldHelperText includeDescription={includeDescription}\n showError={showError}\n error={error}\n disabled={disabled}\n property={property}/>\n\n </>\n );\n}\n","import React from \"react\";\n\nimport { Entity, FieldProps } from \"../../types\";\n\nimport { PropertyPreview } from \"../../preview\";\nimport { FieldHelperText, LabelWithIcon } from \"../components\";\nimport { ErrorBoundary } from \"../../components\";\nimport { getIconForProperty } from \"../../util\";\nimport { cn, paperMixin } from \"@firecms/ui\";\n\n/**\n *\n * Simply render the non-editable preview of a field\n *\n * This is one of the internal components that get mapped natively inside forms\n * and tables to the specified properties.\n * @group Form fields\n */\nexport function ReadOnlyFieldBinding({\n propertyKey,\n value,\n error,\n showError,\n tableMode,\n property,\n includeDescription,\n context\n }: FieldProps<any>) {\n\n if (!context.entityId)\n throw new Error(\"ReadOnlyFieldBinding: Entity id is null\");\n\n const entity: Entity<any> = {\n id: context.entityId!,\n values: context.values,\n path: context.path\n };\n\n return (\n\n <>\n\n {!tableMode && <LabelWithIcon icon={getIconForProperty(property, \"small\")}\n required={property.validation?.required}\n title={property.name}\n className={\"text-text-secondary dark:text-text-secondary-dark ml-3.5\"}/>\n }\n\n <div\n className={cn(paperMixin, \"min-h-14 p-4 md:p-6 overflow-x-scroll no-scrollbar\")}>\n\n <ErrorBoundary>\n <PropertyPreview propertyKey={propertyKey}\n value={value}\n property={property}\n // entity={entity}\n size={\"medium\"}/>\n </ErrorBoundary>\n\n </div>\n\n <FieldHelperText includeDescription={includeDescription}\n showError={showError}\n error={error}\n property={property}/>\n\n </>\n );\n}\n","import React, { useCallback, useMemo } from \"react\";\n\nimport { Entity, EntityCollection, EntityReference, FieldProps } from \"../../types\";\nimport { useNavigationController, useReferenceDialog } from \"../../hooks\";\nimport { ReadOnlyFieldBinding } from \"./ReadOnlyFieldBinding\";\nimport { FieldHelperText, LabelWithIcon } from \"../components\";\nimport { ErrorView } from \"../../components\";\nimport { ReferencePreview } from \"../../preview\";\nimport { getIconForProperty, getReferenceFrom } from \"../../util\";\nimport { Button } from \"@firecms/ui\";\nimport { useClearRestoreValue } from \"../useClearRestoreValue\";\n\n/**\n * Field that opens a reference selection dialog.\n *\n * This is one of the internal components that get mapped natively inside forms\n * and tables to the specified properties.\n * @group Form fields\n */\nexport function ReferenceFieldBinding<M extends Record<string, any>>(props: FieldProps<EntityReference>) {\n\n if (typeof props.property.path !== \"string\") {\n return <ReadOnlyFieldBinding {...props}/>\n }\n\n return <ReferenceFieldBindingInternal {...props}/>;\n\n}\n\nfunction ReferenceFieldBindingInternal<M extends Record<string, any>>({\n value,\n setValue,\n error,\n showError,\n isSubmitting,\n disabled,\n touched,\n autoFocus,\n property,\n includeDescription,\n context\n }: FieldProps<EntityReference>) {\n if (!property.path) {\n throw new Error(\"Property path is required for ReferenceFieldBinding\");\n }\n\n useClearRestoreValue({\n property,\n value,\n setValue\n });\n\n const validValue = value && value.isEntityReference && value.isEntityReference();\n\n const navigationController = useNavigationController();\n const collection: EntityCollection | undefined = useMemo(() => {\n return property.path ? navigationController.getCollection(property.path) : undefined;\n }, [property.path]);\n\n if (!collection) {\n throw Error(`Couldn't find the corresponding collection for the path: ${property.path}`);\n }\n\n const onSingleEntitySelected = useCallback((e: Entity<any> | null) => {\n setValue(e ? getReferenceFrom(e) : null);\n }, [setValue]);\n\n const referenceDialogController = useReferenceDialog({\n multiselect: false,\n path: property.path,\n collection,\n onSingleEntitySelected,\n selectedEntityIds: validValue ? [value.id] : undefined,\n forceFilter: property.forceFilter\n }\n );\n\n const onEntryClick = useCallback((e: React.SyntheticEvent) => {\n e.preventDefault();\n referenceDialogController.open();\n }, [referenceDialogController]);\n\n return (\n <>\n <LabelWithIcon icon={getIconForProperty(property, \"small\")}\n required={property.validation?.required}\n title={property.name}\n className={\"text-text-secondary dark:text-text-secondary-dark ml-3.5\"}/>\n\n {!collection && <ErrorView\n error={\"The specified collection does not exist. Check console\"}/>}\n\n {collection && <>\n\n {value && <ReferencePreview\n disabled={!property.path}\n previewProperties={property.previewProperties}\n hover={!disabled}\n size={\"medium\"}\n onClick={disabled || isSubmitting ? undefined : onEntryClick}\n reference={value}\n />}\n\n {!value && <div className=\"justify-center text-left\">\n <Button variant=\"outlined\"\n color=\"primary\"\n disabled={disabled || isSubmitting}\n onClick={onEntryClick}>\n Edit {property.name}\n </Button>\n </div>}\n </>}\n\n <FieldHelperText includeDescription={includeDescription}\n showError={showError}\n error={error}\n disabled={disabled}\n property={property}/>\n\n </>\n );\n\n}\n","import React, { ComponentType, ReactElement, useCallback, useRef } from \"react\";\nimport equal from \"react-fast-compare\"\n\nimport { Field, FieldProps as FormexFieldProps, getIn } from \"@firecms/formex\";\n\nimport {\n CMSType,\n EntityCollection,\n FieldProps,\n FireCMSPlugin,\n PluginFieldBuilderParams,\n Property,\n PropertyFieldBindingProps,\n PropertyOrBuilder,\n ResolvedProperty\n} from \"../types\";\nimport { ReadOnlyFieldBinding } from \"./field_bindings/ReadOnlyFieldBinding\";\n\nimport { isHidden, isPropertyBuilder, isReadOnly, resolveProperty } from \"../util\";\nimport { useCustomizationController } from \"../hooks\";\nimport { Typography } from \"@firecms/ui\";\nimport { getFieldConfig, getFieldId } from \"../core\";\nimport { ErrorBoundary } from \"../components\";\n\n/**\n * This component renders a form field creating the corresponding configuration\n * from a property. For example if bound to a string property, it will generate\n * a text field.\n *\n * You can use it when you are creating a custom field, and need to\n * render additional fields mapped to properties. This is useful if you\n * need to build a complex property mapping, like an array where each index\n * is a different property.\n *\n * Please note that if you build a custom field in a component, the\n * **validation** passed in the property will have no effect. You need to set\n * the validation in the `EntityCollection` definition.\n *\n * @param propertyKey You can use nested names such as `address.street` or `friends[2]`\n * @param property\n * @param context\n * @param includeDescription\n * @param underlyingValueHasChanged\n * @param disabled\n * @param tableMode\n * @param partOfArray\n * @param autoFocus\n * @group Form custom fields\n */\nexport const PropertyFieldBinding = React.memo(PropertyFieldBindingInternal, (a: PropertyFieldBindingProps<any>, b: PropertyFieldBindingProps<any>) => {\n if (a.propertyKey !== b.propertyKey) {\n return false;\n }\n const aIsBuilder = isPropertyBuilder(a.property) || a.property.fromBuilder;\n const bIsBuilder = isPropertyBuilder(b.property) || b.property.fromBuilder;\n\n const baseCheck = (aIsBuilder === bIsBuilder || equal(a.property, b.property)) &&\n a.disabled === b.disabled;\n if (!baseCheck) {\n return false;\n }\n\n if (shouldPropertyReRender(b.property)) {\n return false;\n }\n\n return false;\n}) as typeof PropertyFieldBindingInternal;\n\nfunction PropertyFieldBindingInternal<T extends CMSType = CMSType, M extends Record<string, any> = Record<string, any>>\n({\n propertyKey,\n property,\n context,\n includeDescription,\n underlyingValueHasChanged,\n disabled,\n tableMode,\n partOfArray,\n partOfBlock,\n autoFocus,\n }: PropertyFieldBindingProps<T, M>): ReactElement<PropertyFieldBindingProps<T, M>> {\n\n const customizationController = useCustomizationController();\n\n return (\n <Field\n name={propertyKey}\n >\n {(fieldProps) => {\n\n let Component: ComponentType<FieldProps<T>> | undefined;\n const resolvedProperty: ResolvedProperty<T> | null = resolveProperty({\n propertyKey,\n propertyValue: fieldProps.field.value,\n propertyOrBuilder: property,\n values: fieldProps.form.values,\n path: context.path,\n entityId: context.entityId,\n fields: customizationController.propertyConfigs\n });\n\n if (resolvedProperty === null || isHidden(resolvedProperty)) {\n return <></>;\n } else if (isReadOnly(resolvedProperty)) {\n Component = ReadOnlyFieldBinding;\n } else if (resolvedProperty.Field) {\n if (typeof resolvedProperty.Field === \"function\") {\n Component = resolvedProperty.Field as ComponentType<FieldProps<any>>;\n }\n } else {\n const propertyConfig = getFieldConfig(resolvedProperty, customizationController.propertyConfigs);\n if (!propertyConfig) {\n console.log(\"INTERNAL: Could not find field config for property\", { propertyKey, resolvedProperty, fields: customizationController.propertyConfigs, propertyConfig });\n throw new Error(`INTERNAL: Could not find field config for property ${propertyKey}`);\n }\n const configProperty = resolveProperty({\n propertyOrBuilder: propertyConfig.property,\n propertyValue: fieldProps.field.value,\n values: fieldProps.form.values,\n path: context.path,\n entityId: context.entityId,\n fields: customizationController.propertyConfigs\n });\n Component = configProperty.Field as ComponentType<FieldProps<T>>;\n }\n if (!Component) {\n console.warn(`No field component found for property ${propertyKey}`);\n console.warn(\"Property:\", property);\n return (\n <div>{`Currently the field ${resolvedProperty.dataType} is not supported`}</div>\n );\n }\n\n const componentProps: ResolvedPropertyFieldBindingProps<T, M> = {\n propertyKey,\n property: resolvedProperty,\n includeDescription,\n underlyingValueHasChanged,\n context,\n disabled,\n tableMode,\n partOfArray,\n partOfBlock,\n autoFocus\n };\n\n return <FieldInternal\n Component={Component as ComponentType<FieldProps>}\n componentProps={componentProps}\n fieldProps={fieldProps}/>;\n }}\n </Field>\n );\n\n}\n\ntype ResolvedPropertyFieldBindingProps<T extends CMSType = CMSType, M extends Record<string, any> = Record<string, any>> =\n Omit<PropertyFieldBindingProps<T, M>, \"property\">\n & {\n property: ResolvedProperty<T>\n};\n\nfunction FieldInternal<T extends CMSType, CustomProps, M extends Record<string, any>>\n({\n Component,\n componentProps: {\n propertyKey,\n property,\n includeDescription,\n underlyingValueHasChanged,\n tableMode,\n partOfArray,\n partOfBlock,\n autoFocus,\n context,\n disabled\n },\n fieldProps\n }:\n {\n Component: ComponentType<FieldProps<T, any, M>>,\n componentProps: ResolvedPropertyFieldBindingProps<T, M>,\n fieldProps: FormexFieldProps<T, any>\n }) {\n\n const { plugins } = useCustomizationController();\n\n const customFieldProps: any = property.customProps;\n const value = fieldProps.field.value;\n // const initialValue = fieldProps.meta.initialValue;\n const error = getIn(fieldProps.form.errors, propertyKey);\n const touched = getIn(fieldProps.form.touched, propertyKey);\n\n const showError: boolean = error &&\n (fieldProps.form.submitCount > 0 || property.validation?.unique) &&\n (!Array.isArray(error) || !!error.filter((e: any) => !!e).length);\n\n const WrappedComponent: ComponentType<FieldProps<T, any, M>> | null = useWrappedComponent(context.path, context.collection, propertyKey, property, Component, plugins);\n const UsedComponent: ComponentType<FieldProps<T>> = WrappedComponent ?? Component;\n\n const isSubmitting = fieldProps.form.isSubmitting;\n\n const setValue = useCallback((value: T | null, shouldValidate?: boolean) => {\n fieldProps.form.setFieldTouched(propertyKey, true, false);\n fieldProps.form.setFieldValue(propertyKey, value, shouldValidate);\n }, []);\n\n const setFieldValue = useCallback((otherPropertyKey: string, value: CMSType | null, shouldValidate?: boolean) => {\n fieldProps.form.setFieldTouched(propertyKey, true, false);\n fieldProps.form.setFieldValue(otherPropertyKey, value, shouldValidate);\n }, []);\n\n const cmsFieldProps: FieldProps<T, CustomProps, M> = {\n propertyKey,\n value: value as T,\n // initialValue,\n setValue,\n setFieldValue,\n error,\n touched,\n showError,\n isSubmitting,\n includeDescription: includeDescription ?? true,\n property: property as ResolvedProperty<T>,\n disabled: disabled ?? false,\n underlyingValueHasChanged: underlyingValueHasChanged ?? false,\n tableMode: tableMode ?? false,\n partOfArray: partOfArray ?? false,\n partOfBlock: partOfBlock ?? false,\n autoFocus: autoFocus ?? false,\n customProps: customFieldProps,\n context\n };\n\n return (\n <ErrorBoundary>\n\n <UsedComponent {...cmsFieldProps}/>\n\n {underlyingValueHasChanged && !isSubmitting &&\n <Typography variant={\"caption\"} className={\"ml-3.5\"}>\n This value has been updated elsewhere\n </Typography>}\n\n </ErrorBoundary>);\n\n}\n\nconst shouldPropertyReRender = (property: PropertyOrBuilder | ResolvedProperty, plugins?: FireCMSPlugin[]): boolean => {\n if (plugins?.some((plugin) => plugin.form?.fieldBuilder)) {\n return true;\n }\n if (isPropertyBuilder(property)) {\n return true;\n }\n const defAProperty = property as Property | ResolvedProperty;\n const rerenderThisProperty = Boolean(defAProperty.Field) || (\"fromBuilder\" in defAProperty && defAProperty.fromBuilder);\n if (defAProperty.dataType === \"map\" && defAProperty.properties) {\n return rerenderThisProperty || Object.values(defAProperty.properties).some((childProperty) => shouldPropertyReRender(childProperty, plugins));\n } else if (defAProperty.dataType === \"array\" && \"resolvedProperties\" in defAProperty) {\n // @ts-ignore\n return rerenderThisProperty || defAProperty.resolvedProperties?.some((childProperty) => childProperty && shouldPropertyReRender(childProperty, plugins));\n } else {\n return rerenderThisProperty;\n }\n}\n\nfunction useWrappedComponent<T extends CMSType = CMSType, M extends Record<string, any> = any>(\n path: string,\n collection: EntityCollection<M>,\n propertyKey: string,\n property: ResolvedProperty<T>,\n Component: ComponentType<FieldProps<T, any, M>>,\n plugins?: FireCMSPlugin[]\n): ComponentType<FieldProps<T, any, M>> | null {\n\n const wrapperRef = useRef<ComponentType<FieldProps<T, any, M>> | null>((() => {\n let Wrapper: ComponentType<FieldProps<T, any, M>> | null = null;\n if (plugins) {\n plugins.forEach((plugin) => {\n const fieldId = getFieldId(property);\n if (fieldId && plugin.form?.fieldBuilder) {\n const params: PluginFieldBuilderParams<T> = {\n fieldConfigId: fieldId,\n propertyKey,\n property,\n Field: Component,\n plugin,\n path,\n collection\n };\n const enabled = plugin.form?.fieldBuilderEnabled?.(params);\n if (enabled === undefined || enabled)\n Wrapper = plugin.form.fieldBuilder(params) || Wrapper;\n }\n if (!fieldId) {\n console.warn(\"INTERNAL: Field id not found for property\", property);\n }\n });\n }\n return Wrapper;\n })());\n\n return wrapperRef.current;\n}\n","import React from \"react\";\nimport { FieldProps, Properties, ResolvedProperties } from \"../../types\";\n\nimport { ErrorBoundary } from \"../../components\";\nimport { getIconForProperty, isHidden, pick } from \"../../util\";\nimport { FieldHelperText, LabelWithIcon } from \"../components\";\nimport { PropertyFieldBinding } from \"../PropertyFieldBinding\";\nimport { ExpandablePanel, InputLabel, Select, SelectItem } from \"@firecms/ui\";\n\n/**\n * Field that renders the children property fields\n *\n * This is one of the internal components that get mapped natively inside forms\n * and tables to the specified properties.\n * @group Form fields\n */\nexport function MapFieldBinding({\n propertyKey,\n value,\n showError,\n error,\n disabled,\n property,\n setValue,\n partOfBlock,\n tableMode,\n includeDescription,\n underlyingValueHasChanged,\n autoFocus,\n context\n }: FieldProps<Record<string, any>>) {\n\n const pickOnlySomeKeys = property.pickOnlySomeKeys || false;\n const expanded = (property.expanded === undefined ? true : property.expanded) || autoFocus;\n\n if (!property.properties) {\n throw Error(`You need to specify a 'properties' prop (or specify a custom field) in your map property ${propertyKey}`);\n }\n\n let mapProperties: ResolvedProperties;\n if (pickOnlySomeKeys) {\n if (value) {\n mapProperties = pick(property.properties,\n ...Object.keys(value)\n .filter(key => key in property.properties!)\n );\n } else {\n mapProperties = {};\n }\n } else {\n mapProperties = property.properties;\n }\n\n const mapFormView = <>\n <div className=\"py-1 flex flex-col space-y-2\">\n {Object.entries(mapProperties)\n .filter(([_, property]) => !isHidden(property))\n .map(([entryKey, childProperty], index) => {\n const fieldProps = {\n propertyKey: `${propertyKey}.${entryKey}`,\n disabled,\n property: childProperty,\n includeDescription,\n underlyingValueHasChanged,\n context,\n tableMode: false,\n partOfArray: false,\n partOfBlock: false,\n autoFocus: autoFocus && index === 0\n };\n return (\n <div key={`map-${propertyKey}-${index}`}>\n <ErrorBoundary>\n <PropertyFieldBinding\n {...fieldProps}/>\n </ErrorBoundary>\n </div>\n );\n }\n )}\n </div>\n\n {/*{pickOnlySomeKeys && buildPickKeysSelect(disabled, property.properties, setValue, value)}*/}\n\n </>;\n\n const title = (\n <LabelWithIcon icon={getIconForProperty(property, \"small\")}\n required={property.validation?.required}\n title={property.name}\n className={\"text-text-secondary dark:text-text-secondary-dark\"}/>\n );\n\n return (\n <ErrorBoundary>\n\n {!tableMode && !partOfBlock && <ExpandablePanel initiallyExpanded={expanded}\n className={\"px-2 md:px-4 pb-2 md:pb-4 pt-1 md:pt-2 bg-slate-50 bg-opacity-50 dark:bg-gray-900\"}\n title={title}>{mapFormView}</ExpandablePanel>}\n\n {(tableMode || partOfBlock) && mapFormView}\n\n <FieldHelperText includeDescription={includeDescription}\n showError={showError}\n error={error ? (typeof error === \"string\" ? error : \"A property of this map has an error\") : undefined}\n disabled={disabled}\n property={property}/>\n\n </ErrorBoundary>\n );\n}\n\nconst buildPickKeysSelect = (disabled: boolean, properties: Properties, setValue: (value: any) => void, value: any) => {\n\n const keys = Object.keys(properties)\n .filter((key) => !value || !(key in value));\n\n const handleAddProperty = (updatedValue: string | string[]) => {\n setValue({\n ...value,\n [updatedValue as string]: null\n });\n };\n\n if (!keys.length) return <></>;\n\n return <div className={\"m-4\"}>\n <InputLabel>Add property</InputLabel>\n <Select\n value={\"\"}\n disabled={disabled}\n onValueChange={handleAddProperty}\n renderValue={(key) => (properties as Properties)[key].name || key}>\n {keys.map((key) => <SelectItem key={key}\n value={key}>{(properties as Properties)[key].name || key}</SelectItem>)}\n </Select>\n </div>;\n};\n","import React, { useEffect, useState } from \"react\";\nimport { DataType, FieldProps, GeoPoint } from \"../../types\";\n\nimport { ArrayContainer } from \"../../components\";\nimport { FieldHelperText, LabelWithIcon } from \"../components\";\nimport {\n AddIcon,\n ArrowDropDownIcon,\n BooleanSwitchWithLabel,\n Button,\n cn,\n DateTimeField,\n defaultBorderMixin,\n ExpandablePanel,\n IconButton,\n Menu,\n MenuItem,\n RemoveIcon,\n TextField,\n Typography\n} from \"@firecms/ui\";\nimport { getDefaultValueForDataType, getIconForProperty } from \"../../util\";\nimport { useCustomizationController } from \"../../hooks\";\n\ntype MapEditViewRowState = [number, {\n key: string,\n dataType: DataType\n}];\n\n/**\n * Field that allows edition of key value pairs.\n *\n * @group Form fields\n */\nexport function KeyValueFieldBinding({\n propertyKey,\n value,\n showError,\n error,\n disabled,\n property,\n setValue,\n tableMode,\n includeDescription,\n underlyingValueHasChanged,\n autoFocus,\n context\n }: FieldProps<Record<string, any>>) {\n\n const expanded = (property.expanded === undefined ? true : property.expanded) || autoFocus;\n\n if (!property.keyValue) {\n throw Error(`Your property ${propertyKey} needs to have the 'keyValue' prop in order to use this field binding`);\n }\n const mapFormView = <MapEditView value={value}\n setValue={setValue}\n disabled={disabled}\n fieldName={property.name ?? propertyKey}/>;\n\n const title = <LabelWithIcon\n icon={getIconForProperty(property, \"small\")}\n required={property.validation?.required}\n title={property.name}\n className={\"text-text-secondary dark:text-text-secondary-dark\"}/>;\n\n return (\n <>\n\n {!tableMode && <ExpandablePanel initiallyExpanded={expanded}\n title={title}\n className={\"px-2 md:px-4 pb-2 md:pb-4 pt-1 md:pt-2\"}>{mapFormView}</ExpandablePanel>}\n\n {tableMode && mapFormView}\n\n <FieldHelperText includeDescription={includeDescription}\n showError={showError}\n error={error}\n disabled={disabled}\n property={property}/>\n\n </>\n );\n}\n\ninterface MapEditViewParams<T extends Record<string, any>> {\n value?: T;\n setValue: (value: (T | null)) => void;\n fieldName?: string,\n disabled?: boolean\n}\n\nfunction MapEditView<T extends Record<string, any>>({\n value,\n setValue,\n fieldName,\n disabled\n }: MapEditViewParams<T>) {\n const [internalState, setInternalState] = React.useState<MapEditViewRowState[]>(\n Object.keys(value ?? {}).map((key) => [getRandomId(), {\n key,\n dataType: getDataType(value?.[key]) ?? \"string\"\n }])\n );\n\n useEffect(() => {\n const currentKeys = internalState.map(([id, { key }]) => key);\n const newKeys = Object.entries(value ?? {}).filter(([key, v]) => v !== undefined).map(([key]) => key);\n const keysToAdd = newKeys.filter((key) => !currentKeys.includes(key));\n const keysToRemove = currentKeys.filter((key) => !newKeys.includes(key));\n const newRowIds = [...internalState];\n keysToAdd.forEach((key) => {\n newRowIds.push([getRandomId(), {\n key,\n dataType: getDataType(value?.[key]) ?? \"string\"\n }]);\n });\n keysToRemove.forEach((key) => {\n const index = newRowIds.findIndex(([id, { key: k }]) => k === key);\n newRowIds.splice(index, 1);\n });\n setInternalState(newRowIds);\n }, [value]);\n\n const originalValue = React.useRef<T>(value ?? {} as T);\n\n const updateDataType = (rowId: number, dataType: DataType) => {\n if (!rowId) {\n console.warn(\"No key selected for data type update\");\n return;\n }\n setInternalState(internalState.map((row) => {\n if (row[0] === rowId) {\n return [row[0], {\n key: row[1].key,\n dataType\n }];\n }\n return row;\n }));\n setValue({\n ...(value ?? {} as T),\n [internalState.find((row) => row[0] === rowId)?.[1].key ?? \"\"]: getDefaultValueForDataType(dataType)\n })\n };\n\n return <div className=\"py-1 flex flex-col gap-1\">\n {internalState\n .map(([rowId, {\n key: fieldKey,\n dataType\n }], index) => {\n const entryValue = fieldKey ? value?.[fieldKey] : \"\";\n const onFieldKeyChange = (newKey: string) => {\n\n setInternalState(internalState.map((currentRowId) => {\n if (currentRowId[0] === rowId) {\n return [rowId, {\n key: newKey ?? \"\",\n dataType: currentRowId[1].dataType\n }];\n }\n return currentRowId;\n }));\n\n if (typeof value === \"object\" && newKey in value) {\n // if the key is already there, don't delete the previous value\n return;\n }\n\n const newValue = { ...(value ?? {}) } as T;\n if (typeof originalValue.current === \"object\" && fieldKey in originalValue.current) {\n // @ts-ignore\n newValue[fieldKey] = undefined; // set to undefined to remove from the object, the datasource will remove it from the backend\n } else {\n // @ts-ignore\n delete newValue[fieldKey];\n }\n setValue({\n ...newValue,\n [newKey ?? \"\"]: entryValue\n });\n };\n return <MapKeyValueRow rowId={rowId}\n key={rowId}\n fieldKey={fieldKey}\n value={value ?? {} as T}\n onDeleteClick={() => {\n const newValue = { ...(value ?? {}) as T };\n if (originalValue.current && fieldKey in originalValue.current) {\n // @ts-ignore\n newValue[fieldKey] = undefined;\n } else {\n // @ts-ignore\n delete newValue[fieldKey];\n }\n setInternalState(internalState.filter((currentRowId) => currentRowId[0] !== rowId));\n setValue({\n ...newValue\n });\n }}\n onFieldKeyChange={onFieldKeyChange}\n setValue={setValue}\n entryValue={entryValue}\n dataType={dataType}\n disabled={disabled}\n updateDataType={updateDataType}/>;\n }\n )}\n\n <Button variant={\"text\"}\n size={\"small\"}\n color=\"primary\"\n className=\"w-full\"\n disabled={disabled}\n startIcon={<AddIcon/>}\n onClick={(e) => {\n e.preventDefault();\n setValue({\n ...(value ?? {} as T),\n \"\": null\n });\n setInternalState([...internalState, [getRandomId(), {\n key: \"\",\n dataType: \"string\"\n }]]);\n }\n }>\n {fieldName ? `Add to ${fieldName}` : \"Add\"}\n </Button>\n\n </div>;\n}\n\nfunction MapKeyValueRow<T extends Record<string, any>>({\n rowId,\n fieldKey,\n value,\n onFieldKeyChange,\n onDeleteClick,\n setValue,\n entryValue,\n dataType,\n updateDataType,\n disabled\n }: {\n rowId: number,\n fieldKey: string,\n value: T,\n onFieldKeyChange: (newKey: string) => void,\n onDeleteClick: () => void,\n setValue: (value: (T | null)) => void,\n entryValue: any,\n dataType: DataType,\n disabled?: boolean,\n updateDataType: (rowId: number, dataType: DataType) => void\n}) {\n\n const { locale } = useCustomizationController();\n\n function buildInput(entryValue: any, fieldKey: string, dataType: DataType) {\n if (dataType === \"string\" || dataType === \"number\") {\n return <TextField\n key={dataType}\n placeholder={\"value\"}\n value={entryValue}\n type={dataType === \"number\" ? \"number\" : \"text\"}\n size={\"small\"}\n disabled={disabled || !fieldKey}\n onChange={(event) => {\n if (dataType === \"number\") {\n const numberValue = event.target.value ? parseFloat(event.target.value) : undefined;\n if (numberValue && isNaN(numberValue)) {\n setValue({\n ...value,\n [fieldKey]: null\n });\n } else if (numberValue !== undefined && numberValue !== null) {\n setValue({\n ...value,\n [fieldKey]: numberValue\n });\n } else {\n setValue({\n ...value,\n [fieldKey]: null\n });\n }\n } else {\n setValue({\n ...value,\n [fieldKey]: event.target.value\n });\n }\n }}/>;\n } else if (dataType === \"date\") {\n return <DateTimeField value={entryValue}\n size={\"small\"}\n locale={locale}\n disabled={disabled || !fieldKey}\n onChange={(date) => {\n setValue({\n ...value,\n [fieldKey]: date\n });\n }}/>;\n } else if (dataType === \"boolean\") {\n return <BooleanSwitchWithLabel value={entryValue}\n size={\"small\"}\n position={\"start\"}\n disabled={disabled || !fieldKey}\n onValueChange={(newValue) => {\n setValue({\n ...value,\n [fieldKey]: newValue\n });\n }}/>;\n } else if (dataType === \"array\") {\n return <div\n className={cn(defaultBorderMixin, \"ml-2 pl-2 border-l border-solid\")}>\n <ArrayContainer value={entryValue}\n newDefaultEntry={\"\"}\n droppableId={rowId.toString()}\n addLabel={fieldKey ? `Add to ${fieldKey}` : \"Add\"}\n size={\"small\"}\n disabled={disabled || !fieldKey}\n includeAddButton={true}\n onValueChange={(newValue) => {\n setValue({\n ...value,\n [fieldKey]: newValue\n });\n }}\n buildEntry={(index, internalId) => {\n return <ArrayKeyValueRow\n index={index}\n id={internalId}\n value={entryValue[index]}\n disabled={disabled || !fieldKey}\n setValue={(newValue) => {\n const newArrayValue = [...entryValue];\n newArrayValue[index] = newValue;\n setValue({\n ...value,\n [fieldKey]: newArrayValue\n });\n }}\n />\n }}/>\n </div>;\n } else if (dataType === \"map\") {\n return <div\n className={cn(defaultBorderMixin, \"ml-2 pl-2 border-l border-solid\")}>\n <MapEditView value={entryValue}\n fieldName={fieldKey}\n setValue={(updatedValue) => {\n setValue({\n ...value,\n [fieldKey]: updatedValue\n });\n }}/>\n </div>;\n } else {\n return <Typography\n variant={\"caption\"}>\n {`Data type ${dataType} not supported yet`}\n </Typography>;\n }\n }\n\n function doUpdateDataType(dataType: DataType) {\n updateDataType(rowId, dataType);\n }\n\n return (<>\n <Typography key={rowId.toString()}\n component={\"div\"}\n className=\"font-mono flex flex-row gap-1\">\n <div className=\"w-[200px] max-w-[25%]\">\n <TextField\n value={fieldKey}\n placeholder={\"key\"}\n disabled={disabled || (entryValue !== undefined && entryValue !== null && entryValue !== \"\")}\n size={\"small\"}\n onChange={(event) => {\n onFieldKeyChange(event.target.value);\n }}/>\n </div>\n\n <div className=\"flex-grow\">\n {(dataType !== \"map\" && dataType !== \"array\") && buildInput(entryValue, fieldKey, dataType)}\n </div>\n <Menu\n trigger={<IconButton size={\"small\"}\n className=\"h-7 w-7\">\n <ArrowDropDownIcon/>\n </IconButton>}\n >\n <MenuItem dense\n onClick={() => doUpdateDataType(\"string\")}>string</MenuItem>\n <MenuItem dense\n onClick={() => doUpdateDataType(\"number\")}>number</MenuItem>\n <MenuItem dense\n onClick={() => doUpdateDataType(\"boolean\")}>boolean</MenuItem>\n <MenuItem dense\n onClick={() => doUpdateDataType(\"date\")}>date</MenuItem>\n <MenuItem dense\n onClick={() => doUpdateDataType(\"map\")}>map</MenuItem>\n <MenuItem dense\n onClick={() => doUpdateDataType(\"array\")}>array</MenuItem>\n </Menu>\n\n <IconButton aria-label=\"delete\"\n size={\"small\"}\n onClick={onDeleteClick}\n className=\"h-7 w-7\">\n <RemoveIcon size={\"small\"}/>\n </IconButton>\n </Typography>\n\n {(dataType === \"map\" || dataType === \"array\") && buildInput(entryValue, fieldKey, dataType)}\n\n </>\n\n );\n}\n\nfunction ArrayKeyValueRow<T>({\n id,\n index,\n value,\n setValue\n }: {\n id: number,\n index: number,\n value: T,\n setValue: (value: T | null) => void,\n disabled?: boolean,\n}) {\n\n const { locale } = useCustomizationController();\n const [selectedDataType, setSelectedDataType] = useState<DataType>(getDataType(value) ?? \"string\");\n\n function doUpdateDataType(dataType: DataType) {\n setSelectedDataType(dataType);\n }\n\n function buildInput(entryValue: any, dataType: DataType) {\n if (dataType === \"string\" || dataType === \"number\") {\n return <TextField value={entryValue}\n type={dataType === \"number\" ? \"number\" : \"text\"}\n size={\"small\"}\n onChange={(event) => {\n if (dataType === \"number\") {\n const numberValue = event.target.value ? parseFloat(event.target.value) : undefined;\n if (numberValue && isNaN(numberValue)) {\n setValue(null);\n } else if (numberValue !== undefined && numberValue !== null) {\n setValue(numberValue as T);\n } else {\n setValue(null);\n }\n } else {\n setValue(event.target.value as T);\n }\n }}/>;\n } else if (dataType === \"date\") {\n return <DateTimeField value={entryValue}\n size={\"small\"}\n locale={locale}\n onChange={(date) => {\n setValue(date as T);\n }}/>;\n } else if (dataType === \"boolean\") {\n return <BooleanSwitchWithLabel value={entryValue}\n size={\"small\"}\n position={\"start\"}\n onValueChange={(v) => {\n setValue(v as T);\n }}/>;\n } else if (dataType === \"array\") {\n return <Typography variant={\"caption\"}>\n Arrays of arrays are not supported.\n </Typography>;\n } else if (dataType === \"map\") {\n return <div className={cn(defaultBorderMixin, \"ml-2 pl-2 border-l border-solid\")}>\n <MapEditView value={entryValue}\n setValue={(updatedValue) => {\n setValue(updatedValue);\n }}/>\n </div>;\n } else {\n return <Typography\n variant={\"caption\"}>\n {`Data type ${dataType} not supported yet`}\n </Typography>;\n }\n }\n\n return (<>\n <Typography key={id.toString()}\n component={\"div\"}\n className=\"font-mono flex min-h-12 flex-row gap-1 items-center\">\n\n <div className=\"flex-grow\">\n {selectedDataType !== \"map\" && buildInput(value, selectedDataType)}\n </div>\n\n <Menu\n trigger={<IconButton size={\"small\"}\n className=\"h-7 w-7\">\n <ArrowDropDownIcon/>\n </IconButton>}>\n <MenuItem dense\n onClick={() => doUpdateDataType(\"string\")}>string</MenuItem>\n <MenuItem dense\n onClick={() => doUpdateDataType(\"number\")}>number</MenuItem>\n <MenuItem dense\n onClick={() => doUpdateDataType(\"boolean\")}>boolean</MenuItem>\n <MenuItem dense\n onClick={() => doUpdateDataType(\"map\")}>map</MenuItem>\n <MenuItem dense\n onClick={() => doUpdateDataType(\"date\")}>date</MenuItem>\n </Menu>\n\n </Typography>\n\n {selectedDataType === \"map\" && buildInput(value, selectedDataType)}\n\n </>\n\n );\n}\n\nfunction getRandomId() {\n return Math.floor(Math.random() * Math.floor(Number.MAX_SAFE_INTEGER));\n}\n\nfunction getDataType(value: any): DataType | undefined {\n if (typeof value === \"string\" || value === null) {\n return \"string\";\n } else if (typeof value === \"number\") {\n return \"number\";\n } else if (typeof value === \"boolean\") {\n return \"boolean\";\n } else if (Array.isArray(value)) {\n return \"array\";\n } else if (value instanceof Date) {\n return \"date\";\n } else if (value?.isEntityReference && value?.isEntityReference()) {\n return \"reference\";\n } else if (value instanceof GeoPoint) {\n return \"geopoint\";\n } else if (typeof value === \"object\") {\n return \"map\";\n }\n\n return undefined;\n}\n","import React, { useState } from \"react\";\nimport { CMSType, FieldProps, ResolvedProperty } from \"../../types\";\nimport { FieldHelperText, FormikArrayContainer, LabelWithIcon } from \"../components\";\nimport { ErrorBoundary } from \"../../components\";\nimport { getIconForProperty } from \"../../util\";\nimport { PropertyFieldBinding } from \"../PropertyFieldBinding\";\nimport { ExpandablePanel } from \"@firecms/ui\";\nimport { useClearRestoreValue } from \"../useClearRestoreValue\";\n\n/**\n * Generic array field that allows reordering and renders the child property\n * as nodes.\n *\n * This is one of the internal components that get mapped natively inside forms\n * and tables to the specified properties.\n * @group Form fields\n */\nexport function RepeatFieldBinding<T extends Array<any>>({\n propertyKey,\n value,\n error,\n showError,\n isSubmitting,\n setValue,\n setFieldValue,\n tableMode,\n property,\n includeDescription,\n underlyingValueHasChanged,\n context,\n disabled\n }: FieldProps<T>) {\n\n if (!property.of)\n throw Error(\"RepeatFieldBinding misconfiguration. Property `of` not set\");\n\n if (!property.resolvedProperties || !Array.isArray(property.resolvedProperties))\n throw Error(\"RepeatFieldBinding - Internal error: Expected array in 'property.resolvedProperties'\");\n\n const expanded = property.expanded === undefined ? true : property.expanded;\n const ofProperty: ResolvedProperty<CMSType[]> = property.of as ResolvedProperty<CMSType[]>;\n\n const [lastAddedId, setLastAddedId] = useState<number | undefined>();\n\n useClearRestoreValue({\n property,\n value,\n setValue\n });\n\n const buildEntry = (index: number, internalId: number) => {\n const childProperty = property.resolvedProperties[index] ?? ofProperty;\n const fieldProps = {\n propertyKey: `${propertyKey}.${index}`,\n disabled,\n property: childProperty,\n includeDescription,\n underlyingValueHasChanged,\n context,\n tableMode: false,\n partOfArray: true,\n partOfBlock: false,\n autoFocus: internalId === lastAddedId\n };\n return <ErrorBoundary>\n <PropertyFieldBinding {...fieldProps}/>\n </ErrorBoundary>;\n };\n\n const arrayContainer = <FormikArrayContainer value={value}\n addLabel={property.name ? \"Add entry to \" + property.name : \"Add entry\"}\n name={propertyKey}\n setFieldValue={setFieldValue}\n buildEntry={buildEntry}\n onInternalIdAdded={setLastAddedId}\n disabled={isSubmitting || Boolean(property.disabled)}\n includeAddButton={!property.disabled}\n newDefaultEntry={property.of.defaultValue}/>;\n\n const title = (<LabelWithIcon icon={getIconForProperty(property, \"small\")}\n required={property.validation?.required}\n title={property.name}\n className={\"text-text-secondary dark:text-text-secondary-dark\"}/>);\n\n return (\n\n <>\n\n {!tableMode && <ExpandablePanel initiallyExpanded={expanded}\n className={\"px-2 md:px-4 pb-2 md:pb-4 pt-1 md:pt-2\"}\n title={title}>\n {arrayContainer}\n </ExpandablePanel>}\n\n {tableMode && arrayContainer}\n\n <FieldHelperText includeDescription={includeDescription}\n showError={showError}\n error={error}\n disabled={disabled}\n property={property}/>\n\n </>\n );\n}\n","import React, { useCallback, useEffect, useState } from \"react\";\n\nimport { Field, useFormex } from \"@firecms/formex\";\n\nimport { FieldHelperText, FormikArrayContainer, LabelWithIcon } from \"../components\";\nimport { PropertyFieldBinding } from \"../PropertyFieldBinding\";\nimport { EnumValuesChip } from \"../../preview\";\nimport { FieldProps, FormContext, PropertyFieldBindingProps, PropertyOrBuilder } from \"../../types\";\nimport { getDefaultValueFor, getIconForProperty, } from \"../../util\";\nimport { DEFAULT_ONE_OF_TYPE, DEFAULT_ONE_OF_VALUE } from \"../../util/common\";\nimport { cn, ExpandablePanel, paperMixin, Select, SelectItem, Typography } from \"@firecms/ui\";\nimport { useClearRestoreValue } from \"../useClearRestoreValue\";\n\n/**\n * If the `oneOf` property is specified, this fields render each array entry as\n * a `type` select and the corresponding field widget to the selected `type.\n *\n * This is one of the internal components that get mapped natively inside forms\n * and tables to the specified properties.\n * @group Form fields\n */\nexport function BlockFieldBinding<T extends Array<any>>({\n propertyKey,\n value,\n error,\n showError,\n isSubmitting,\n setValue,\n setFieldValue,\n tableMode,\n property,\n includeDescription,\n underlyingValueHasChanged,\n context,\n disabled\n }: FieldProps<T>) {\n\n if (!property.oneOf)\n throw Error(\"ArrayOneOfField misconfiguration. Property `oneOf` not set\");\n\n const expanded = property.expanded === undefined ? true : property.expanded;\n useClearRestoreValue({\n property,\n value,\n setValue\n });\n\n const [lastAddedId, setLastAddedId] = useState<number | undefined>();\n\n const buildEntry = useCallback((index: number, internalId: number) => {\n return <BlockEntry\n key={`array_one_of_${index}`}\n name={`${propertyKey}.${index}`}\n index={index}\n value={value[index]}\n typeField={property.oneOf!.typeField ?? DEFAULT_ONE_OF_TYPE}\n valueField={property.oneOf!.valueField ?? DEFAULT_ONE_OF_VALUE}\n properties={property.oneOf!.properties}\n autoFocus={internalId === lastAddedId}\n context={context}/>;\n }, [context, lastAddedId, property.oneOf, propertyKey, value]);\n\n const title = (\n <LabelWithIcon icon={getIconForProperty(property, \"small\")}\n required={property.validation?.required}\n title={property.name}\n className={\"text-text-secondary dark:text-text-secondary-dark\"}/>\n );\n\n const firstOneOfKey = Object.keys(property.oneOf.properties)[0];\n const body = <FormikArrayContainer value={value}\n name={propertyKey}\n addLabel={property.name ? \"Add entry to \" + property.name : \"Add entry\"}\n buildEntry={buildEntry}\n onInternalIdAdded={setLastAddedId}\n disabled={isSubmitting || Boolean(property.disabled)}\n includeAddButton={!property.disabled}\n setFieldValue={setFieldValue}\n newDefaultEntry={{\n [property.oneOf!.typeField ?? DEFAULT_ONE_OF_TYPE]: firstOneOfKey,\n [property.oneOf!.valueField ?? DEFAULT_ONE_OF_VALUE]: getDefaultValueFor(property.oneOf.properties[firstOneOfKey])\n }}/>;\n return (\n\n <>\n\n {!tableMode &&\n <ExpandablePanel\n className={\"px-2 md:px-4 pb-2 md:pb-4 pt-1 md:pt-2\"}\n initiallyExpanded={expanded}\n title={title}>\n {body}\n </ExpandablePanel>}\n\n {tableMode && body}\n\n <FieldHelperText includeDescription={includeDescription}\n showError={showError}\n error={error}\n disabled={disabled}\n property={property}/>\n\n </>\n );\n}\n\ninterface BlockEntryProps {\n name: string;\n index: number;\n value: any;\n /**\n * Name of the field to use as the discriminator for type\n * Defaults to `type`\n */\n typeField: string;\n /**\n * Name of the field to use as the value\n * Defaults to `value`\n */\n valueField: string;\n\n autoFocus: boolean;\n /**\n * Record of properties, where the key is the `type` and the value\n * is the corresponding property\n */\n properties: Record<string, PropertyOrBuilder>;\n\n /**\n * Additional values related to the state of the form or the entity\n */\n context: FormContext<any>;\n\n}\n\nfunction BlockEntry({\n name,\n index,\n value,\n typeField,\n valueField,\n properties,\n autoFocus,\n context\n }: BlockEntryProps) {\n\n const type = value && value[typeField];\n const [typeInternal, setTypeInternal] = useState<string | undefined>(type ?? undefined);\n\n const formex = useFormex();\n\n useEffect(() => {\n if (!type) {\n updateType(Object.keys(properties)[0]);\n }\n }, []);\n\n useEffect(() => {\n if (type !== typeInternal) {\n setTypeInternal(type);\n }\n }, [type]);\n\n const property = typeInternal ? properties[typeInternal] : undefined;\n\n const enumValuesConfigs = Object.entries(properties)\n .map(([key, property]) => ({\n id: key,\n label: property.name ?? key\n }));\n\n const typeFieldName = `${name}.${typeField}`;\n const valueFieldName = `${name}.${valueField}`;\n\n const fieldProps: PropertyFieldBindingProps<any, any> | undefined = property\n ? {\n propertyKey: valueFieldName,\n property,\n context,\n autoFocus,\n partOfArray: false,\n partOfBlock: true,\n tableMode: false\n }\n : undefined;\n\n const updateType = (newType: any) => {\n const newSelectedProperty = newType ? properties[newType] : undefined;\n setTypeInternal(newType);\n formex.setFieldTouched(typeFieldName, true);\n formex.setFieldValue(typeFieldName, newType);\n formex.setFieldValue(valueFieldName, newSelectedProperty ? getDefaultValueFor(newSelectedProperty) : null);\n };\n\n return (\n <div className={cn(paperMixin, \"bg-transparent p-4 my-4 py-8\")}>\n\n <Field\n name={typeFieldName}\n >\n {(fieldProps) => {\n const value1 = fieldProps.field.value !== undefined && fieldProps.field.value !== null ? fieldProps.field.value as string : \"\";\n return (\n <>\n <Select\n className=\"mb-2\"\n placeholder={<Typography variant={\"caption\"}\n className={\"px-4 py-2 font-medium\"}>Type</Typography>}\n size={\"small\"}\n position={\"item-aligned\"}\n value={value1}\n renderValue={(enumKey: any) =>\n <EnumValuesChip\n enumKey={enumKey}\n enumValues={enumValuesConfigs}\n size={\"small\"}/>\n }\n onValueChange={(value) => {\n updateType(value);\n }}>\n {enumValuesConfigs.map((enumConfig) => (\n <SelectItem\n key={enumConfig.id}\n value={String(enumConfig.id)}>\n <EnumValuesChip\n enumKey={enumConfig.id}\n enumValues={enumValuesConfigs}\n size={\"small\"}/>\n </SelectItem>)\n )}\n </Select>\n </>\n );\n }\n }\n </Field>\n\n {fieldProps && (\n // It is important to use this key to force a re-render of the field on type change\n <PropertyFieldBinding key={`form_control_${name}_${typeInternal}`} {...fieldProps}/>\n )}\n\n </div>\n );\n}\n","import React, { useDeferredValue, useEffect, useRef } from \"react\";\n\n// @ts-ignore\nimport MarkdownIt from \"markdown-it\";\nimport MdEditor, { Plugins } from \"react-markdown-editor-lite\";\n\nimport { FieldHelperText, LabelWithIcon } from \"../components\";\nimport { FieldProps } from \"../../types\";\nimport { getIconForProperty } from \"../../util\";\nimport {\n cn,\n fieldBackgroundDisabledMixin,\n fieldBackgroundHoverMixin,\n fieldBackgroundMixin,\n Typography,\n useInjectStyles\n} from \"@firecms/ui\";\n\nconst mdParser = new MarkdownIt();\ntry {\n MdEditor.use(Plugins.AutoResize, {\n min: 100\n })\n MdEditor.unuse(Plugins.FontUnderline)\n MdEditor.unuse(Plugins.Clear);\n} catch (e) {\n // this fails in some tests, we can ignore it\n}\n\n/**\n * Render a markdown field that allows edition and seeing the preview.\n *\n * This is one of the internal components that get mapped natively inside forms\n * and tables to the specified properties.\n * @group Form fields\n */\nexport function MarkdownFieldBinding({\n propertyKey,\n value,\n setValue,\n error,\n showError,\n disabled,\n autoFocus,\n touched,\n property,\n tableMode,\n includeDescription,\n context\n }: FieldProps<string>) {\n\n const [internalValue, setInternalValue] = React.useState(value);\n const valueRef = useRef(value);\n\n useInjectStyles(\"MarkdownFieldBinding\", markdownCss);\n\n const deferred = useDeferredValue({\n internalValue,\n value\n });\n\n useEffect(() => {\n valueRef.current = value;\n setInternalValue(value);\n }, [value]);\n\n useEffect(() => {\n if (deferred.internalValue !== valueRef.current)\n setValue(deferred.internalValue);\n }, [deferred]);\n\n return (\n <>\n\n {!tableMode && <Typography variant={\"caption\"}\n className={\"flex-grow\"}>\n <LabelWithIcon icon={getIconForProperty(property, \"small\")}\n required={property.validation?.required}\n title={property.name}\n className={\"text-text-secondary dark:text-text-secondary-dark ml-3.5\"}/>\n </Typography>}\n\n <MdEditor value={internalValue ?? \"\"}\n className={cn(fieldBackgroundMixin,\n disabled ? fieldBackgroundDisabledMixin : fieldBackgroundHoverMixin,\n \"text-base\")}\n readOnly={disabled}\n renderHTML={text => mdParser.render(text)}\n view={{\n menu: true,\n md: true,\n html: false\n }}\n onChange={({\n html,\n text\n }) => {\n setInternalValue(text ?? null);\n }}/>\n\n <FieldHelperText includeDescription={includeDescription}\n showError={showError}\n error={error}\n disabled={disabled}\n property={property}/>\n\n </>\n );\n\n}\n\nconst markdownCss = `\n @font-face {\n font-family: rmel-iconfont;\n src: url(data:application/vnd.ms-fontobject;base64,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NS4BJyMOAd0VGwEBGxWRFRsbFWEcFBQcYRUbGxWRFRsBARsCK2EVGxsVkRUbAQEbKRySARsVYRwpGwEBGxWRFRsBHwEbFZEVGwEBGykcYRUbwwEbFWEcKRsBARsVkRUb/qscKRsBARsVkRUbGxUBtRQcYRUbGxWRFRsBARsAAAAAAAASAN4AAQAAAAAAAAAVAAAAAQAAAAAAAQANABUAAQAAAAAAAgAHACIAAQAAAAAAAwANACkAAQAAAAAABAANADYAAQAAAAAABQALAEMAAQAAAAAABgANAE4AAQAAAAAACgArAFsAAQAAAAAACwATAIYAAwABBAkAAAAqAJkAAwABBAkAAQAaAMMAAwABBAkAAgAOAN0AAwABBAkAAwAaAOsAAwABBAkABAAaAQUAAwABBAkABQAWAR8AAwABBAkABgAaATUAAwABBAkACgBWAU8AAwABBAkACwAmAaUKQ3JlYXRlZCBieSBpY29uZm9udApybWVsLWljb25mb250UmVndWxhcnJtZWwtaWNvbmZvbnRybWVsLWljb25mb250VmVyc2lvbiAxLjBybWVsLWljb25mb250R2VuZXJhdGVkIGJ5IHN2ZzJ0dGYgZnJvbSBGb250ZWxsbyBwcm9qZWN0Lmh0dHA6Ly9mb250ZWxsby5jb20ACgBDAHIAZQBhAHQAZQBkACAAYgB5ACAAaQBjAG8AbgBmAG8AbgB0AAoAcgBtAGUAbAAtAGkAYwBvAG4AZgBvAG4AdABSAGUAZwB1AGwAYQByAHIAbQBlAGwALQBpAGMAbwBuAGYAbwBuAHQAcgBtAGUAbAAtAGkAYwBvAG4AZgBvAG4AdABWAGUAcgBzAGkAbwBuACAAMQAuADAAcgBtAGUAbAAtAGkAYwBvAG4AZgBvAG4AdABHAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAHMAdgBnADIAdAB0AGYAIABmAHIAbwBtACAARgBvAG4AdABlAGwAbABvACAAcAByAG8AagBlAGMAdAAuAGgAdAB0AHAAOgAvAC8AZgBvAG4AdABlAGwAbABvAC4AYwBvAG0AAAAAAgAAAAAAAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaAQIBAwEEAQUBBgEHAQgBCQEKAQsBDAENAQ4BDwEQAREBEgETARQBFQEWARcBGAEZARoBGwADdGFiCGtleWJvYXJkBmRlbGV0ZQpjb2RlLWJsb2NrBGNvZGUKdmlzaWJpbGl0eQp2aWV3LXNwbGl0BGxpbmsEcmVkbwR1bmRvBGJvbGQGaXRhbGljDGxpc3Qtb3JkZXJlZA5saXN0LXVub3JkZXJlZAVxdW90ZQ1zdHJpa2V0aHJvdWdoCXVuZGVybGluZQR3cmFwCWZvbnQtc2l6ZQRncmlkBWltYWdlC2V4cGFuZC1sZXNzC2V4cGFuZC1tb3JlD2Z1bGxzY3JlZW4tZXhpdApmdWxsc2NyZWVuAAAAAAA=);\n src: url(data:font/ttf;base64,AAEAAAALAIAAAwAwR1NVQrD+s+0AAAE4AAAAQk9TLzI940+UAAABfAAAAFZjbWFwQOSPXQAAAjwAAAMIZ2x5ZjCJoW0AAAV8AAAPYGhlYWQbUPpPAAAA4AAAADZoaGVhB94DmwAAALwAAAAkaG10eGgAAAAAAAHUAAAAaGxvY2E1+jIAAAAFRAAAADZtYXhwATAAewAAARgAAAAgbmFtZXPc7cIAABTcAAACqXBvc3QnKb+uAAAXiAAAATUAAQAAA4D/gABcBAAAAAAABAAAAQAAAAAAAAAAAAAAAAAAABoAAQAAAAEAAOLjgrdfDzz1AAsEAAAAAADcGNspAAAAANwY2ykAAP//BAADAQAAAAgAAgAAAAAAAAABAAAAGgBvAAwAAAAAAAIAAAAKAAoAAAD/AAAAAAAAAAEAAAAKAB4ALAABREZMVAAIAAQAAAAAAAAAAQAAAAFsaWdhAAgAAAABAAAAAQAEAAQAAAABAAgAAQAGAAAAAQAAAAAAAQQAAZAABQAIAokCzAAAAI8CiQLMAAAB6wAyAQgAAAIABQMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUGZFZABA523togOA/4AAXAOAAIAAAAABAAAAAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAAAAAFAAAAAwAAACwAAAAEAAABzAABAAAAAADGAAMAAQAAACwAAwAKAAABzAAEAJoAAAAWABAAAwAG523pQe087UXtYe117XjtgO2N7aL//wAA523pQe077UTtX+1v7XftgO2M7Z///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAFgAWABYAGAAaAB4AKgAsACwALgAAAAEABAAFAAMABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATAAIAFAAVABYAFwAYABkAAAEGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAATwAAAAAAAAAGQAA520AAOdtAAAAAQAA6UEAAOlBAAAABAAA7TsAAO07AAAABQAA7TwAAO08AAAAAwAA7UQAAO1EAAAABgAA7UUAAO1FAAAABwAA7V8AAO1fAAAACAAA7WAAAO1gAAAACQAA7WEAAO1hAAAACgAA7W8AAO1vAAAACwAA7XAAAO1wAAAADAAA7XEAAO1xAAAADQAA7XIAAO1yAAAADgAA7XMAAO1zAAAADwAA7XQAAO10AAAAEAAA7XUAAO11AAAAEQAA7XcAAO13AAAAEgAA7XgAAO14AAAAEwAA7YAAAO2AAAAAAgAA7YwAAO2MAAAAFAAA7Y0AAO2NAAAAFQAA7Z8AAO2fAAAAFgAA7aAAAO2gAAAAFwAA7aEAAO2hAAAAGAAA7aIAAO2iAAAAGQAAAAAAZgDMAR4BhAG8Af4CZgLIAv4DNANyA6IEQASoBO4FLgVwBcoGCgZqBqQGxAboB0YHsAAAAAUAAAAAA1YC1gALABgAJQA0AEAAABMhMhYUBgchLgE0Nhc+ATchHgEUBiMhIiYDNDY3IR4BFAYjISImNz4BMyEyHgEUDgEjISImJxYUDwEGJjURNDYX1gJUEhkZEv2sEhkZ2gEYEwFgEhkZEv6gEhn0GRICVBIZGRL9rBIZ8wEYEwFgDBQLCxQM/qASGTkICJILHh4LAtUZJRgBARglGfITGAEBGCUZGf6FExgBARglGRnZEhkLFRcUDBqGBhYGlQwMEQEqEQwMAAAAAAwAAAAAA6sCqwAPABMAFwAbAB8AIwAnADMANwA7AD8AQwAAASEOAQcDHgEXIT4BNxEuAQUzFSMVMxUjJzMVIxUzFSsCNTM1IzUzASEiJjQ2MyEyFhQGNyM1MzUjNTMXIzUzNSM1MwNV/VYkMAEBATEkAqokMQEBMf5cVlZWVoBWVlZWKlZWVlYBVf8AEhgYEgEAEhgYGVZWVlaAVlZWVgKrATEk/lYkMQEBMSQBqiQxf1YqVtZWKlZWKlb+gBgkGRkkGKpWKlbWVipWAAMAAAAAAysDAAAPAB8AMwAAJR4BFyE+ATcRLgEnIQ4BBzMhMhYXEQ4BByEuAScRPgElJyYrASIPASMiBhQWMyEyNjQmIwEAATAkAVYkMAEBMCT+qiQwAYABABMXAQEXE/8AExcBARcBKB4LErQSCx5rExcXEwIAERkZEVUkMAEBMCQBqyQwAQEwJBcU/qsRGQEBGREBVRQX1R4NDR4XJxcXJxcAAwAAAAADqwLZABYALQA+AAABFQYPAQYiLwEmND8BJyY0PwE2Mh8BFgU3NjQvASYiDwEGBxUWHwEWMj8BNjQnAScmBgcDBhYfARY2NxM2JicDqwEJsAcRBx4GBpOTBgYeBxEHsAn9D5MGBh8GEgawCQEBCbAHEQceBgYBQikJDwTjAgcIKAkPBOIDBwkBiBANCrAGBh4HEQaTkwYSBh4GBrAKFZMGEQceBgawCg0QDQqwBgYeBhIGAdkPAwcI/YwIEAMOAwcIAnMIDwQAAgAAAAADmgJvABAAIQAAJSc3NjQmIg8BBhQfARYyNjQlNycmNDYyHwEWFA8BBiImNAFzpqYNGSQMxA0NxA4hGgENpqYNGiEOxA0NxA4hGtqmpg4hGg3EDSINxA0aIQ6mpgwkGQ3EDSINxA0ZJAAAAAMAAAAAA7gCrAALABcAIwAAAQ4BBx4BFz4BNy4BAy4BJz4BNx4BFw4BAw4BBx4BFz4BNy4BAgCY6zU165iY6zU165hWcAICcFZWcAICcFY0QwEBQzQ0QwEBQwKsAqSGhqQCAqSGhqT+DgJwVlZwAgJwVlZwAT4BQzQ0QwEBQzQ0QwAAAAUAAAAAA4ACqwALABcAIwAwAEAAABMhMjY0JiMhIgYUFhchPgE0JichDgEUFhMhMjY0JiMhIgYUFiceARchPgE0JichDgElIR4BFxEOAQchLgE1ETQ2qwEAExcXE/8AERkZEQEAExcXE/8AERkZEQEAExcXE/8AERkZGgEZEQEAExcXE/8AERkB1AEAERkBARkR/wATFxcBABcnFxcnF6sBGSIZAQEZIhkBVRcnFxcnF9UTFwEBFyYXAQEXGAEXE/4AERkBARkRAgATFwAAAAADAAAAAAOrAlYAGQAmAEAAAAEjIgYUFjsBHgEXDgEHIyIGFBY7AT4BNy4BBR4BFyE+ATQmJyEOARcjLgEnPgE3MzI2NCYrAQ4BBx4BFzMyNjQmAtWAEhgYEoA3SAEBSDeAEhgYEoBbeAMDeP4lARgSAQASGBgS/wASGFWAN0gBAUg3gBIYGBKAW3gDA3hbgBIYGAJVGCQZAUk2NkkBGSQYAnhbW3jTEhgBARgkGAEBGJIBSTY2SQEZJBgCeFtbeAIYJBkAAQAAAAADrAIrAB4AAAEuAScOAQcGFhcWNjc+ATcyFhcHBhYXMz4BNzUuAQcDEjuWVYfUOAoTFxQjCSuhZz9vLFETEx7uEhgBAjEWAbw0OgECiXIXKggGDxJWaQErJVIWMQIBGBLvHRQTAAAAAQAAAAADsgIrAB4AAAEOAQcnJgYHFR4BFzM+AS8BPgEzHgEXHgE3PgEnLgECFFWWO1EWMQIBGBLuHhQTUi1vPmehKwkkExcTCjnTAisBOjRQFBQd7xIYAQIxFlIlKwFpVhIPBggqF3KJAAAAAwAAAAAC9QK/ABQAHAAkAAABPgE3LgEnIw4BBxEeARchPgE3NCYlMx4BFAYHIxMjNTMeARQGApMhKQECZk7vFBkBARkUAQdJaQI0/tSIHScnHYifn58dJycBihdEJE5mAgEaE/3eExoBAmFJNVLZASY7JgH+74kBJjsmAAEAAAAAAxICvwAcAAABHgEXMwMjDgEUFhczPgE0JicjEzM+ATQmJyMOAQGlASYdIZw7HSYmHeQdJiYdIZw7HSYmHeQdJgJ6HSYB/pQBJjonAQEnOiYBAWwBJjonAQEnAAYAAAAAA5YC1gALABcAIwBBAFIAbgAAASE+ATQmJyEOARQWASEOARQWFyE+ATQmAyEOARQWFyE+ATQmBSMiBhQWOwEVIyIGFBY7ARUjIgYUFjsBMjY3NS4BAzMVHgEyNj0BNCYrASIGFBYXIyIGFBY7AQcGHQEUFjsBMjY0JisBNzY9AS4BAWsCABIYGBL+ABIZGQIS/gASGRkSAgASGBgS/gASGRkSAgASGBj9WFUJDAwJQBUKCwsKFUAJDAwJVQoLAQELXxUBCxMMDAkrCQwMXlUJDAwJN0cFDAlVCgsLCjdIBQELAlUBGCQYAQEYJBj+VQEYJBgBARgkGAEBARgkGAEBGCQY1QwSDBYMEgwWDBIMDAmACQwB1msJDAwJgAkMDBIM1gwSDFQGCAkJDAwSDFQGCAkJDAAAAAAGAAAAAAOLAsAACAARABoAJgAyAD8AABMOARQWMjY0JgMOARQWMjY0JgMOARQWMjY0JhchPgE0JichDgEUFjchPgE0JichDgEUFgMeARchPgE0JichDgG1GyQkNyQkHBskJDckJBwbJCQ2JSSPAgASGBgS/gASGBgSAgASGBgS/gASGBgZARgSAgASGBgS/gASGAHAASQ2JCQ2JAEBASQ2JCQ2JP4BASQ2JCQ2JGoBGCQYAQEYJBj/ARgkGAEBGCQYASoSGAEBGCQYAQEYAAAAAgAAAAADVgJWABYALQAAJTI2PwE2PQEuASsBIgYdARQWFzMHBhYFMjY/ATY9ATQmKwEiBgcVHgEXMwcGFgEyERsHPQkBGBKrEhgYElYsDiABzBAbCDwJGBKrEhgBARgSVSwNIKsRDnkSFMISGBgSqxIYAVgeMwERDnkSFMISGBgSqxIYAVgeMwAAAAADAAAAAAOAAsAACAAZACUAACU+ATc1IxUeAQEeARczFTM1Mz4BNCYnIQ4BAyE+ATQmJyEOARQWAgAkMAGqATD++QEkG5aqlhskJBv+KhskKwKqEhkZEv1WEhkZQAEwJCsrJDACPxskAYCAASQ2JAEBJP56ARgkGAEBGCQYAAAAAAIAAP//AysDAQAbACgAACU+ATcRLgEiBgcRFAYHBi4CNREuASIGBxEeAQceATMhMjY0JiMhIgYCImJ6AgEeLR4BQTUhQTUdAR4tHgEDptQBGBICABIYGBL+ABIYrQ+TZQEXFh4eFv7kN1MMBw8rPCMBIBYeHhb+4HaUdhIZGSQYGAAAAAMAAAAAA3ACxwALAC0AOQAAEyE+ATQmIyEiBhQWBSEiBhQWFyEyFhcWBgcjNS4BDwEGFB8BFjY3NTM+AScuAQUjIgYUFhczPgE0JsACVRIZGRL9qxIYGAIL/gcSGBgSAgYgMwYFMShgARkLTAYGTAwYAVVNYgUIZP5tqxIYGBKrEhgYAnEBGCQYGCQYrBgkGAEnICk5AiIPCgpMBxEHTAoKDyICa05EVf8YJBgBARgkGAAAAAIAAAAAA5YCwAAUACgAAAEUFhczER4BMjY3ETM+ATQmJyEOAQMzFRQWMjY3NTMyNjQmJyEOARQWAWskHJUBJDYkAZUcJCQc/lYcJMBAJDckAUAbJCQb/wAcJCQCgBskAf5AGyQkGwHAASQ2JAEBJP7Q6xskJBvrJDckAQEkNyQACgAAAAADeAL4AA8AFgAaACEAJQApAC0ANAA4AD8AAAEhDgEHER4BFyE+ATcRLgEBIyImPQEzNSM1MzUjNTQ2OwETIzUzNSM1MzUjNTMTIzUzFRQGNyM1MzUjNTMyFhUDLP2oICoBASogAlggKgEBKv4ecQ8WlpaWlhYPceGWlpaWlpa8cZYWFpaWlnEPFgL3ASog/aggKgEBKiACWCAq/V4WD3FLlktxDxb9qJZLlkuW/aiWcQ8W4ZZLlhYPAAAAAgAA//8DgAMAAA8AIAAAJREuASchDgEHER4BFyE+ASUXNzYyHwEWBiMhIiY/AT4BA4ABMCT9qiQwAQEwJAJWJDD9/VmFBxQHlQgMDf4BDgsIagcUVQJWJDABATAk/aokMAEBMPtsqggJxwsXFwuJCAEAAAABAAAAAAM1AjYAEAAAAQcGFBYyPwEXFjI2NC8BJiIB2f4QISwR19cRLCEQ/hAuAib+ESwhENfXECEsEf4QAAAAAQAAAAADNQI2ABIAAAEHJyYnIg4BFh8BFjI/ATY0LgEC1tbXEBcRGw0GDP4RLBH+ECEtAibX1w8BEiAgDP4QEP4QLSABAAAABAAAAAADawLrABAAIQAzAEQAADczFRQWMjY9ATQmKwEiBhQWEyMiBhQWOwEyNj0BNCYiBhUBMjY9ATMyNjQmKwEiBh0BFBYTNTQmIgYdARQWOwEyNjQmI8loHiwdHRacFh0dfmgWHR0WnBYdHSweAWoWHmgWHR0WnBYdHUoeLB0dFpwWHR0WsWgWHR0WnBYdHSweAZ4eLB0dFpwWHR0W/V8dFmgeLB0dFpwWHQI5aBYdHRacFh0dLB4AAAAEAAAAAANUAtQAEQAjADQARgAAEw4BBxUeARczPgE0JisBNTQmJz4BPQEzMjY0JicjDgEHFR4BASMiBhQWFzM+ATc1LgEiBhUDHgE7ARUUFjI2NzUuAScjDgHdFRsBARsVkRUbGxVhHBQUHGEVGxsVkRUbAQEbAithFRsbFZEVGwEBGykckgEbFWEcKRsBARsVkRUbAR8BGxWRFRsBARspHGEVG8MBGxVhHCkbAQEbFZEVG/6rHCkbAQEbFZEVGxsVAbUUHGEVGxsVkRUbAQEbAAAAAAAAEgDeAAEAAAAAAAAAFQAAAAEAAAAAAAEADQAVAAEAAAAAAAIABwAiAAEAAAAAAAMADQApAAEAAAAAAAQADQA2AAEAAAAAAAUACwBDAAEAAAAAAAYADQBOAAEAAAAAAAoAKwBbAAEAAAAAAAsAEwCGAAMAAQQJAAAAKgCZAAMAAQQJAAEAGgDDAAMAAQQJAAIADgDdAAMAAQQJAAMAGgDrAAMAAQQJAAQAGgEFAAMAAQQJAAUAFgEfAAMAAQQJAAYAGgE1AAMAAQQJAAoAVgFPAAMAAQQJAAsAJgGlCkNyZWF0ZWQgYnkgaWNvbmZvbnQKcm1lbC1pY29uZm9udFJlZ3VsYXJybWVsLWljb25mb250cm1lbC1pY29uZm9udFZlcnNpb24gMS4wcm1lbC1pY29uZm9udEdlbmVyYXRlZCBieSBzdmcydHRmIGZyb20gRm9udGVsbG8gcHJvamVjdC5odHRwOi8vZm9udGVsbG8uY29tAAoAQwByAGUAYQB0AGUAZAAgAGIAeQAgAGkAYwBvAG4AZgBvAG4AdAAKAHIAbQBlAGwALQBpAGMAbwBuAGYAbwBuAHQAUgBlAGcAdQBsAGEAcgByAG0AZQBsAC0AaQBjAG8AbgBmAG8AbgB0AHIAbQBlAGwALQBpAGMAbwBuAGYAbwBuAHQAVgBlAHIAcwBpAG8AbgAgADEALgAwAHIAbQBlAGwALQBpAGMAbwBuAGYAbwBuAHQARwBlAG4AZQByAGEAdABlAGQAIABiAHkAIABzAHYAZwAyAHQAdABmACAAZgByAG8AbQAgAEYAbwBuAHQAZQBsAGwAbwAgAHAAcgBvAGoAZQBjAHQALgBoAHQAdABwADoALwAvAGYAbwBuAHQAZQBsAGwAbwAuAGMAbwBtAAAAAAIAAAAAAAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGgECAQMBBAEFAQYBBwEIAQkBCgELAQwBDQEOAQ8BEAERARIBEwEUARUBFgEXARgBGQEaARsAA3RhYghrZXlib2FyZAZkZWxldGUKY29kZS1ibG9jawRjb2RlCnZpc2liaWxpdHkKdmlldy1zcGxpdARsaW5rBHJlZG8EdW5kbwRib2xkBml0YWxpYwxsaXN0LW9yZGVyZWQObGlzdC11bm9yZGVyZWQFcXVvdGUNc3RyaWtldGhyb3VnaAl1bmRlcmxpbmUEd3JhcAlmb250LXNpemUEZ3JpZAVpbWFnZQtleHBhbmQtbGVzcwtleHBhbmQtbW9yZQ9mdWxsc2NyZWVuLWV4aXQKZnVsbHNjcmVlbgAAAAAA) format(\"truetype\")\n }\n\n .rmel-iconfont {\n font-family: rmel-iconfont !important;\n font-size: 16px;\n font-style: normal;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale\n }\n\n .rmel-icon-tab:before {\n content: \"\\\\e76d\"\n }\n\n .rmel-icon-keyboard:before {\n content: \"\\\\ed80\"\n }\n\n .rmel-icon-delete:before {\n content: \"\\\\ed3c\"\n }\n\n .rmel-icon-code-block:before {\n content: \"\\\\e941\"\n }\n\n .rmel-icon-code:before {\n content: \"\\\\ed3b\"\n }\n\n .rmel-icon-visibility:before {\n content: \"\\\\ed44\"\n }\n\n .rmel-icon-view-split:before {\n content: \"\\\\ed45\"\n }\n\n .rmel-icon-link:before {\n content: \"\\\\ed5f\"\n }\n\n .rmel-icon-redo:before {\n content: \"\\\\ed60\"\n }\n\n .rmel-icon-undo:before {\n content: \"\\\\ed61\"\n }\n\n .rmel-icon-bold:before {\n content: \"\\\\ed6f\"\n }\n\n .rmel-icon-italic:before {\n content: \"\\\\ed70\"\n }\n\n .rmel-icon-list-ordered:before {\n content: \"\\\\ed71\"\n }\n\n .rmel-icon-list-unordered:before {\n content: \"\\\\ed72\"\n }\n\n .rmel-icon-quote:before {\n content: \"\\\\ed73\"\n }\n\n .rmel-icon-strikethrough:before {\n content: \"\\\\ed74\"\n }\n\n .rmel-icon-underline:before {\n content: \"\\\\ed75\"\n }\n\n .rmel-icon-wrap:before {\n content: \"\\\\ed77\"\n }\n\n .rmel-icon-font-size:before {\n content: \"\\\\ed78\"\n }\n\n .rmel-icon-grid:before {\n content: \"\\\\ed8c\"\n }\n\n .rmel-icon-image:before {\n content: \"\\\\ed8d\"\n }\n\n .rmel-icon-expand-less:before {\n content: \"\\\\ed9f\"\n }\n\n .rmel-icon-expand-more:before {\n content: \"\\\\eda0\"\n }\n\n .rmel-icon-fullscreen-exit:before {\n content: \"\\\\eda1\"\n }\n\n .rmel-icon-fullscreen:before {\n content: \"\\\\eda2\"\n }\n\n .rc-md-editor {\n padding-bottom: 1px;\n position: relative;\n -webkit-box-sizing: border-box;\n box-sizing: border-box;\n display: -webkit-box;\n display: -webkit-flex;\n display: -ms-flexbox;\n display: flex;\n overflow: hidden;\n -webkit-box-orient: vertical;\n -webkit-box-direction: normal;\n -webkit-flex-direction: column;\n -ms-flex-direction: column;\n flex-direction: column;\n border-radius: 6px;\n }\n\n .rc-md-editor.full {\n width: 100%;\n height: 100% !important;\n position: fixed;\n left: 0;\n top: 0;\n z-index: 1000\n }\n\n .rc-md-editor .editor-container {\n -webkit-box-flex: 1;\n -webkit-flex: 1;\n -ms-flex: 1;\n flex: 1;\n display: -webkit-box;\n display: -webkit-flex;\n display: -ms-flexbox;\n display: flex;\n width: 100%;\n min-height: 0;\n position: relative;\n\n }\n\n .rc-md-editor .editor-container > .section {\n -webkit-box-flex: 1;\n -webkit-flex-grow: 1;\n -ms-flex-positive: 1;\n flex-grow: 1;\n -webkit-flex-shrink: 1;\n -ms-flex-negative: 1;\n flex-shrink: 1;\n -webkit-flex-basis: 1px;\n -ms-flex-preferred-size: 1px;\n flex-basis: 1px;\n padding: 0px 8px;\n border: none\n }\n\n .rc-md-editor .editor-container > .section.in-visible {\n display: none\n }\n\n .rc-md-editor .editor-container > .section > .section-container {\n padding: 8x 16px 16px\n }\n\n .rc-md-editor .editor-container > .section:last-child {\n border-radius: unset\n }\n\n .rc-md-editor .editor-container .sec-md {\n min-height: 0;\n min-width: 0;\n overflow: hidden;\n }\n\n .rc-md-editor .editor-container .sec-md .input {\n background: transparent;\n font-size: 1rem;\n display: block;\n -webkit-box-sizing: border-box;\n box-sizing: border-box;\n width: 100%;\n height: 100%;\n overflow-y: scroll;\n border: none;\n resize: none;\n outline: none;\n min-height: 0;\n color: inherit;\n line-height: 1.7;\n\n }\n\n .rc-md-editor .editor-container .sec-html {\n min-height: 0;\n min-width: 0;\n\n }\n\n .rc-md-editor .editor-container .sec-html .html-wrap {\n height: 100%;\n -webkit-box-sizing: border-box;\n box-sizing: border-box;\n overflow: auto\n }\n\n .custom-html-style {\n color: inherit\n }\n\n .custom-html-style h1 {\n font-size: 32px;\n padding: 0;\n border: none;\n font-weight: 700;\n margin: 32px 0;\n line-height: 1.2\n }\n\n .custom-html-style h2 {\n font-size: 24px;\n padding: 0;\n border: none;\n font-weight: 700;\n margin: 24px 0;\n line-height: 1.7\n }\n\n .custom-html-style h3 {\n font-size: 18px;\n margin: 18px 0;\n padding: 0;\n line-height: 1.7;\n border: none\n }\n\n .custom-html-style p {\n font-size: 16px;\n line-height: 1.7;\n margin: 8px 0\n }\n\n .custom-html-style a {\n }\n\n .custom-html-style a:hover {\n text-decoration: none\n }\n\n .custom-html-style strong {\n font-weight: 700\n }\n\n .custom-html-style ol, .custom-html-style ul {\n font-size: 16px;\n line-height: 28px;\n padding-left: 36px\n }\n\n .custom-html-style li {\n margin-bottom: 8px;\n line-height: 1.7\n }\n\n .custom-html-style hr {\n margin-top: 20px;\n margin-bottom: 20px;\n border: 0;\n }\n\n .custom-html-style pre {\n display: block;\n padding: 20px;\n line-height: 28px;\n word-break: break-word\n }\n\n .custom-html-style code, .custom-html-style pre {\n font-size: 16px;\n border-radius: 0;\n overflow-x: auto\n }\n\n .custom-html-style code {\n padding: 3px 0;\n margin: 0;\n word-break: normal\n }\n\n .custom-html-style code:after, .custom-html-style code:before {\n letter-spacing: 0\n }\n\n .custom-html-style blockquote {\n position: relative;\n margin: 16px 0;\n padding: 5px 8px 5px 30px;\n background: none repeat scroll 0 0 ${\"rgb(39 39 41)\"};\n color: inherit;\n border: none;\n border-left: 10px solid #d6dbdf\n }\n\n .custom-html-style img, .custom-html-style video {\n max-width: 100%\n }\n\n .custom-html-style table {\n font-size: 16px;\n line-height: 1.7;\n max-width: 100%;\n overflow: auto;\n\n border-collapse: collapse;\n border-spacing: 0;\n -webkit-box-sizing: border-box;\n box-sizing: border-box\n }\n\n .custom-html-style table td, .custom-html-style table th {\n word-break: break-all;\n word-wrap: break-word;\n white-space: normal\n }\n\n .custom-html-style table tr {\n }\n\n .custom-html-style table tr:nth-of-type(2n) {\n background-color: transparent\n }\n\n .custom-html-style table th {\n text-align: center;\n font-weight: 700;\n\n padding: 10px 6px;\n background-color: #f5f7fa;\n word-break: break-word\n }\n\n .custom-html-style table td {\n\n text-align: left;\n padding: 10px 15px;\n word-break: break-word;\n min-width: 60px\n }\n\n .rc-md-editor .drop-wrap {\n display: block;\n position: absolute;\n left: 0;\n top: 28px;\n z-index: 2;\n min-width: 20px;\n padding: 10px 0;\n text-align: center;\n border-style: solid;\n border-width: 1px\n }\n\n .rc-md-editor .drop-wrap.hidden {\n display: none !important\n }\n\n .rc-md-editor .rc-md-navigation {\n min-height: 38px;\n padding: 0 8px;\n -webkit-box-sizing: border-box;\n box-sizing: border-box;\n font-size: 16px;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n display: -webkit-box;\n display: -webkit-flex;\n display: -ms-flexbox;\n display: flex;\n -webkit-box-orient: horizontal;\n -webkit-box-direction: normal;\n -webkit-flex-direction: row;\n -ms-flex-direction: row;\n flex-direction: row;\n -webkit-box-pack: justify;\n -webkit-justify-content: space-between;\n -ms-flex-pack: justify;\n justify-content: space-between;\n color: \"inherit\",\n\n }\n\n .rc-md-editor .rc-md-navigation.in-visible {\n display: none\n }\n\n .rc-md-editor .rc-md-navigation .navigation-nav {\n -webkit-box-align: center;\n -webkit-align-items: center;\n -ms-flex-align: center;\n align-items: center;\n -webkit-box-pack: center;\n -webkit-justify-content: center;\n -ms-flex-pack: center;\n justify-content: center;\n font-size: 16px;\n }\n\n .rc-md-editor .rc-md-navigation .button-wrap, .rc-md-editor .rc-md-navigation .navigation-nav {\n display: -webkit-box;\n display: -webkit-flex;\n display: -ms-flexbox;\n display: flex;\n -webkit-box-orient: horizontal;\n -webkit-box-direction: normal;\n -webkit-flex-direction: row;\n -ms-flex-direction: row;\n flex-direction: row\n }\n\n .rc-md-editor .rc-md-navigation .button-wrap {\n -webkit-flex-wrap: wrap;\n -ms-flex-wrap: wrap;\n flex-wrap: wrap\n }\n\n .rc-md-editor .rc-md-navigation .button-wrap .button {\n position: relative;\n min-width: 22px;\n height: 28px;\n margin-left: 3px;\n margin-right: -2px;\n display: inline-block;\n cursor: pointer;\n line-height: 28px;\n text-align: center;\n }\n\n .rc-md-editor .rc-md-navigation .button-wrap .button:hover {\n }\n\n .rc-md-editor .rc-md-navigation .button-wrap .button.disabled {\n cursor: not-allowed\n }\n\n .rc-md-editor .rc-md-navigation .button-wrap .button:first-of-type {\n margin-left: 0\n }\n\n .rc-md-editor .rc-md-navigation .button-wrap .button:last-child {\n margin-right: 0\n }\n\n .rc-md-editor .rc-md-navigation .button-wrap .rmel-iconfont {\n font-size: 18px\n }\n\n .rc-md-editor .rc-md-navigation li, .rc-md-editor .rc-md-navigation ul {\n list-style: none;\n margin: 0;\n padding: 0\n }\n\n .rc-md-editor .rc-md-navigation .h1, .rc-md-editor .rc-md-navigation .h2, .rc-md-editor .rc-md-navigation .h3, .rc-md-editor .rc-md-navigation .h4, .rc-md-editor .rc-md-navigation .h5, .rc-md-editor .rc-md-navigation .h6, .rc-md-editor .rc-md-navigation h1, .rc-md-editor .rc-md-navigation h2, .rc-md-editor .rc-md-navigation h3, .rc-md-editor .rc-md-navigation h4, .rc-md-editor .rc-md-navigation h5, .rc-md-editor .rc-md-navigation h6 {\n font-family: inherit;\n font-weight: 500;\n color: inherit;\n padding: 0;\n margin: 0;\n line-height: 1.1\n }\n\n .rc-md-editor .rc-md-navigation h1 {\n font-size: 34px\n }\n\n .rc-md-editor .rc-md-navigation h2 {\n font-size: 30px\n }\n\n .rc-md-editor .rc-md-navigation h3 {\n font-size: 24px\n }\n\n .rc-md-editor .rc-md-navigation h4 {\n font-size: 18px\n }\n\n .rc-md-editor .rc-md-navigation h5 {\n font-size: 16px\n }\n\n .rc-md-editor .rc-md-navigation h6 {\n font-size: 12px\n }\n\n .rc-md-editor .tool-bar {\n position: absolute;\n z-index: 1;\n right: 8px;\n top: 8px\n }\n\n .rc-md-editor .tool-bar .button {\n min-width: 24px;\n height: 28px;\n margin-right: 5px;\n display: inline-block;\n cursor: pointer;\n font-size: 16px;\n line-height: 28px;\n text-align: center;\n color: #999\n }\n\n .rc-md-editor .tool-bar .button:hover {\n color: inherit\n }\n\n .rc-md-editor .rc-md-gray-100 {\n display: block;\n width: 1px;\n }\n\n .rc-md-editor .table-list.wrap {\n position: relative;\n margin: 0 10px;\n -webkit-box-sizing: border-box;\n box-sizing: border-box\n }\n\n .rc-md-editor .table-list.wrap .list-item {\n position: absolute;\n top: 0;\n left: 0;\n display: inline-block;\n width: 20px;\n height: 20px;\n border-radius: 4px\n }\n\n .rc-md-editor .table-list.wrap .list-item.active {\n }\n\n .rc-md-editor .tab-map-list .list-item {\n width: 120px;\n -webkit-box-sizing: border-box;\n box-sizing: border-box\n }\n\n .rc-md-editor .tab-map-list .list-item:hover {\n }\n\n .rc-md-editor .tab-map-list .list-item.active {\n font-weight: 700\n }\n\n .rc-md-editor .header-list .list-item {\n width: 100px;\n -webkit-box-sizing: border-box;\n box-sizing: border-box;\n padding: 8px 0\n }\n\n .rc-md-editor .header-list .list-item:hover {\n }\n\n`;\n","import React from \"react\";\nimport { FieldProps } from \"../../types\";\nimport { FieldHelperText, LabelWithIcon } from \"../components\";\nimport { PropertyFieldBinding } from \"../PropertyFieldBinding\";\nimport { ExpandablePanel } from \"@firecms/ui\";\nimport { getIconForProperty } from \"../../util\";\nimport { useClearRestoreValue } from \"../useClearRestoreValue\";\n\n/**\n * Array field used for custom\n *\n * This is one of the internal components that get mapped natively inside forms\n * and tables to the specified properties.\n * @group Form fields\n */\nexport function ArrayCustomShapedFieldBinding<T extends Array<any>>({\n propertyKey,\n value,\n error,\n showError,\n isSubmitting,\n setValue,\n tableMode,\n property,\n includeDescription,\n underlyingValueHasChanged,\n context,\n disabled\n }: FieldProps<T, any, any>) {\n\n if (!Array.isArray(property.resolvedProperties))\n throw Error(\"ArrayCustomShapedFieldBinding misconfiguration. Property `of` not set\");\n\n const expanded = property.expanded === undefined ? true : property.expanded;\n\n useClearRestoreValue({\n property,\n value,\n setValue\n });\n\n const title = <LabelWithIcon icon={getIconForProperty(property, \"small\")}\n required={property.validation?.required}\n className={\"text-text-secondary dark:text-text-secondary-dark\"}\n title={property.name}/>;\n\n const body = property.resolvedProperties.map((childProperty, index) => {\n const fieldProps = {\n propertyKey: `${propertyKey}[${index}]`,\n disabled,\n property: childProperty,\n includeDescription,\n underlyingValueHasChanged,\n context,\n tableMode: false,\n partOfArray: true,\n partOfBlock: false,\n autoFocus: false\n };\n return <div key={`custom_shaped_array_${index}`} className=\"pb-4\">\n <PropertyFieldBinding {...fieldProps}/>\n </div>;\n });\n\n return (\n\n <>\n\n {!tableMode &&\n <ExpandablePanel initiallyExpanded={expanded}\n title={title}\n className={\"px-2 md:px-4 pb-2 md:pb-4 pt-1 md:pt-2\"}>\n {body}\n </ExpandablePanel>}\n\n {tableMode && body}\n\n <FieldHelperText includeDescription={includeDescription}\n showError={showError}\n error={error}\n disabled={disabled}\n property={property}/>\n\n </>\n );\n}\n","import React, { useEffect } from \"react\";\nimport { useFormex } from \"@firecms/formex\";\n\nexport const ErrorFocus = ({ containerRef }:\n {\n containerRef?: React.RefObject<HTMLDivElement>\n }) => {\n const { isSubmitting, isValidating, errors } = useFormex();\n\n useEffect(() => {\n const keys = Object.keys(errors);\n\n // Whenever there are errors and the form is submitting but finished validating.\n if (keys.length > 0 && isSubmitting && !isValidating) {\n const errorElement = containerRef?.current?.querySelector<HTMLDivElement>(\n `#form_field_${keys[0]}`\n );\n\n if (errorElement && containerRef?.current) {\n const scrollableParent = getScrollableParent(containerRef.current);\n if (scrollableParent) {\n const top = errorElement.getBoundingClientRect().top;\n scrollableParent.scrollTo({\n top: scrollableParent.scrollTop + top - 196,\n behavior: \"smooth\"\n });\n }\n const input = errorElement.querySelector(\"input\");\n if (input) input.focus();\n }\n }\n }, [isSubmitting, isValidating, errors, containerRef]);\n\n // This component does not render anything by itself.\n return null;\n};\n\nconst isScrollable = (ele: HTMLElement | null) => {\n const hasScrollableContent = ele && ele.scrollHeight > ele.clientHeight;\n\n const overflowYStyle = ele ? window.getComputedStyle(ele).overflowY : null;\n const isOverflowHidden = overflowYStyle && overflowYStyle.indexOf(\"hidden\") !== -1;\n\n return hasScrollableContent && !isOverflowHidden;\n};\n\nconst getScrollableParent = (ele: HTMLElement | null): HTMLElement | null => {\n return (!ele || ele === document.body)\n ? document.body\n : (isScrollable(ele) ? ele : getScrollableParent(ele.parentNode as HTMLElement));\n};\n","import React, { useMemo } from \"react\";\n\n// import { ErrorMessage } from \"@firecms/formex\";\nimport { Entity, EntityStatus, EnumValueConfig, EnumValues } from \"../../types\";\n\nimport { useClipboard, useSnackbarController } from \"../../hooks\";\nimport { enumToObjectEntries } from \"../../util\";\nimport {\n CircularProgress,\n ContentCopyIcon,\n IconButton,\n OpenInNewIcon,\n Select,\n SelectItem,\n TextField,\n Tooltip,\n Typography\n} from \"@firecms/ui\";\nimport { EnumValuesChip } from \"../../preview\";\nimport { useCustomizationController } from \"../../hooks/useCustomizationController\";\nimport { CustomizationController } from \"../../types/customization_controller\";\nimport { useFormex } from \"@firecms/formex\";\n\nexport function CustomIdField<M extends Record<string, any>>({\n customId,\n entityId,\n status,\n onChange,\n error,\n entity,\n loading\n }: {\n customId?: boolean | EnumValues | \"optional\"\n entityId?: string\n status: EntityStatus,\n onChange: (id?: string) => void,\n error: boolean,\n entity: Entity<M> | undefined,\n loading: boolean\n}) {\n\n const { errors } = useFormex();\n const disabled = status === \"existing\" || !customId;\n const idSetAutomatically = status !== \"existing\" && !customId;\n\n const enumValues: EnumValueConfig[] | undefined = useMemo(() => {\n if (!customId || typeof customId === \"boolean\" || customId === \"optional\")\n return undefined;\n return enumToObjectEntries(customId);\n }, [customId]);\n\n const snackbarController = useSnackbarController();\n const { copy } = useClipboard({\n onSuccess: (text) => snackbarController.open({\n type: \"success\",\n message: `Copied ${text}`\n })\n });\n\n const customizationController: CustomizationController = useCustomizationController();\n\n const fieldProps = {\n label: idSetAutomatically ? \"ID is set automatically\" : \"ID\",\n disabled: disabled || loading,\n name: \"id\",\n value: (entity && status === \"existing\" ? entity.id : entityId) ?? \"\",\n endAdornment: loading ? <CircularProgress size={\"small\"}/> : (entity\n ? (\n <>\n\n <Tooltip title={\"Copy\"}>\n <IconButton onClick={(e) => copy(entity.id)}\n aria-label=\"copy-id\">\n <ContentCopyIcon size={\"small\"}/>\n </IconButton>\n </Tooltip>\n\n {customizationController?.entityLinkBuilder &&\n <Tooltip title={\"Open in the console\"}>\n <IconButton component={\"a\"}\n href={customizationController.entityLinkBuilder({ entity })}\n rel=\"noopener noreferrer\"\n target=\"_blank\"\n onClick={(e) => e.stopPropagation()}\n aria-label=\"go-to-datasource\">\n <OpenInNewIcon size={\"small\"}/>\n </IconButton>\n </Tooltip>}\n\n </>\n )\n : undefined\n )\n };\n\n return (\n <>\n\n {enumValues &&\n <Select\n error={error}\n onValueChange={(v) => onChange(v as string)}\n {...fieldProps}\n renderValue={(option) => {\n const enumConfig = enumValues.find(e => e.id === option);\n if (!enumConfig) return option;\n return `${enumConfig.id} - ${enumConfig.label}`;\n }}\n >\n {enumValues.map((enumConfig) => (\n <SelectItem\n key={enumConfig.id}\n value={String(enumConfig.id)}>\n <EnumValuesChip\n enumKey={enumConfig.id}\n enumValues={enumValues}\n size={\"medium\"}/>\n </SelectItem>)\n )}\n </Select>}\n\n {!enumValues &&\n <TextField {...fieldProps}\n error={error}\n placeholder={customId === \"optional\" ? \"Autogenerated ID, it can be manually changed\" : (status === \"new\" || status === \"copy\" ? \"ID of the new document\" : \"ID of the document\")}\n onChange={(event) => {\n let value = event.target.value;\n if (value) value = value.trim();\n return onChange(value.length ? value : undefined);\n }}/>}\n\n {errors.id && <Typography variant={\"caption\"}\n className={\"ml-3.5 text-red-500 dark:text-red-500\"}>\n {errors.id}\n </Typography>}\n\n </>\n );\n}\n","import { Entity, EntityCallbacks, EntityCollection } from \"../types\";\nimport React, { useCallback, useMemo, useState } from \"react\";\nimport { Button, CircularProgress, Dialog, DialogActions, DialogContent, Typography } from \"@firecms/ui\";\nimport {\n deleteEntityWithCallbacks,\n useCustomizationController,\n useDataSource,\n useFireCMSContext,\n useSnackbarController\n} from \"../hooks\";\nimport { resolveCollection } from \"../util\";\nimport { EntityView } from \"./EntityView\";\n\nexport interface DeleteEntityDialogProps<M extends Record<string, any>> {\n entityOrEntitiesToDelete?: Entity<M> | Entity<M>[],\n path: string,\n collection: EntityCollection<M>\n open: boolean;\n onClose: () => void;\n callbacks?: EntityCallbacks<M>,\n\n onEntityDelete?(path: string, entity: Entity<M>): void;\n\n onMultipleEntitiesDelete?(path: string, entities: Entity<M>[]): void;\n}\n\nexport function DeleteEntityDialog<M extends Record<string, any>>({\n entityOrEntitiesToDelete,\n collection,\n onClose,\n open,\n callbacks,\n onEntityDelete,\n onMultipleEntitiesDelete,\n path\n }: DeleteEntityDialogProps<M>) {\n\n const dataSource = useDataSource(collection);\n const customizationController = useCustomizationController();\n const snackbarController = useSnackbarController();\n const [loading, setLoading] = useState(false);\n\n const [entityOrEntities, setUsedEntityOrEntities] = React.useState<Entity<M> | Entity<M>[]>();\n\n const [multipleEntities, setMultipleEntities] = React.useState<boolean>();\n const context = useFireCMSContext();\n\n React.useEffect(() => {\n if (entityOrEntitiesToDelete) {\n const revisedEntityOrEntities = Array.isArray(entityOrEntitiesToDelete) && entityOrEntitiesToDelete.length === 1\n ? entityOrEntitiesToDelete[0]\n : entityOrEntitiesToDelete;\n setUsedEntityOrEntities(revisedEntityOrEntities);\n setMultipleEntities(Array.isArray(revisedEntityOrEntities));\n }\n }, [entityOrEntitiesToDelete]);\n\n const resolvedCollection = useMemo(() => resolveCollection<M>({\n collection,\n path,\n fields: customizationController.propertyConfigs\n }), [collection, path]);\n\n const handleCancel = useCallback(() => {\n onClose();\n }, [onClose]);\n\n const onDeleteSuccess = useCallback((entity: Entity<any>) => {\n console.debug(\"Deleted\", entity);\n }, []);\n\n const onDeleteFailure = useCallback((entity: Entity<any>, e: Error) => {\n snackbarController.open({\n type: \"error\",\n message: \"Error deleting: \" + e?.message\n });\n\n console.error(\"Error deleting entity\");\n console.error(e);\n }, [resolvedCollection.name]);\n\n const onPreDeleteHookError = useCallback((entity: Entity<any>, e: Error) => {\n snackbarController.open({\n type: \"error\",\n message: \"Error before deleting: \" + e?.message\n });\n console.error(e);\n }, [resolvedCollection.name]);\n\n const onDeleteSuccessHookError = useCallback((entity: Entity<any>, e: Error) => {\n snackbarController.open({\n type: \"error\",\n message: \"Error after deleting: \" + e?.message\n });\n console.error(e);\n }, [resolvedCollection.name]);\n\n const performDelete = useCallback((entity: Entity<M>): Promise<boolean> =>\n deleteEntityWithCallbacks({\n dataSource,\n entity,\n collection: resolvedCollection,\n callbacks,\n onDeleteSuccess,\n onDeleteFailure,\n onPreDeleteHookError,\n onDeleteSuccessHookError,\n context\n }), [dataSource, resolvedCollection, callbacks, onDeleteSuccess, onDeleteFailure, onPreDeleteHookError, onDeleteSuccessHookError, context]);\n\n const handleOk = useCallback(async () => {\n if (entityOrEntities) {\n\n setLoading(true);\n\n if (multipleEntities) {\n Promise.all((entityOrEntities as Entity<M>[]).map(performDelete)).then((results) => {\n\n setLoading(false);\n\n if (onMultipleEntitiesDelete && entityOrEntities)\n onMultipleEntitiesDelete(path, entityOrEntities as Entity<M>[]);\n\n if (results.every(Boolean)) {\n snackbarController.open({\n type: \"success\",\n message: `${resolvedCollection.name}: multiple deleted`\n });\n } else if (results.some(Boolean)) {\n snackbarController.open({\n type: \"warning\",\n message: `${resolvedCollection.name}: Some of the entities have been deleted, but not all`\n });\n } else {\n snackbarController.open({\n type: \"error\",\n message: `${resolvedCollection.name}: Error deleting entities`\n });\n }\n onClose();\n });\n\n } else {\n performDelete(entityOrEntities as Entity<M>).then((success) => {\n setLoading(false);\n if (success) {\n if (onEntityDelete && entityOrEntities)\n onEntityDelete(path, entityOrEntities as Entity<M>);\n snackbarController.open({\n type: \"success\",\n message: `${resolvedCollection.singularName ?? resolvedCollection.name} deleted`\n });\n onClose();\n }\n });\n }\n }\n }, [entityOrEntities, multipleEntities, performDelete, onMultipleEntitiesDelete, path, onClose, snackbarController, resolvedCollection.name, onEntityDelete]);\n\n let content: React.ReactNode;\n if (entityOrEntities && multipleEntities) {\n content = <>Multiple entities</>;\n } else {\n const entity = entityOrEntities as Entity<M> | undefined;\n content = entity\n ? <EntityView\n entity={entity}\n collection={collection}\n path={path}/>\n : <></>;\n }\n\n const dialogTitle = multipleEntities\n ? <><b>{resolvedCollection.name}</b>: Confirm multiple delete?</>\n : `Would you like to delete this ${resolvedCollection.singularName ?? resolvedCollection.name}?`;\n\n return (\n <Dialog\n maxWidth={multipleEntities ? \"lg\" : \"2xl\"}\n aria-labelledby=\"delete-dialog\"\n open={open}\n onOpenChange={(open) => !open ? onClose() : undefined}\n >\n <DialogContent fullHeight={true}>\n <Typography variant={\"subtitle2\"} className={\"p-4\"}>\n {dialogTitle}\n </Typography>\n\n {!multipleEntities && <div className={\"p-4\"}>{content}</div>}\n </DialogContent>\n <DialogActions>\n\n {loading && <CircularProgress size={\"small\"}/>}\n\n <Button onClick={handleCancel}\n disabled={loading}\n variant=\"text\"\n color=\"primary\">\n Cancel\n </Button>\n <Button\n autoFocus\n disabled={loading}\n onClick={handleOk}\n variant=\"filled\"\n color=\"primary\">\n Ok\n </Button>\n </DialogActions>\n\n </Dialog>\n );\n}\n","import { EntityAction } from \"../../../types\";\nimport { ArchiveIcon, DeleteIcon, FileCopyIcon, KeyboardTabIcon, OpenInNewIcon } from \"@firecms/ui\";\nimport { DeleteEntityDialog } from \"../../DeleteEntityDialog\";\n\nexport const editEntityAction: EntityAction = {\n icon: <KeyboardTabIcon/>,\n name: \"Edit\",\n collapsed: false,\n onClick({\n entity,\n collection,\n fullPath,\n context,\n highlightEntity,\n unhighlightEntity,\n }): Promise<void> {\n highlightEntity?.(entity);\n context.analyticsController?.onAnalyticsEvent?.(\"entity_click\", {\n path: entity.path,\n entityId: entity.id\n });\n const path = collection?.collectionGroup ? entity.path : (fullPath ?? entity.path);\n context.sideEntityController.open({\n entityId: entity.id,\n path,\n collection,\n updateUrl: true,\n onClose: () => unhighlightEntity?.(entity),\n });\n return Promise.resolve(undefined);\n }\n}\n\nexport const copyEntityAction: EntityAction = {\n icon: <FileCopyIcon/>,\n name: \"Copy\",\n onClick({\n entity,\n collection,\n context,\n highlightEntity,\n unhighlightEntity,\n }): Promise<void> {\n highlightEntity?.(entity);\n context.analyticsController?.onAnalyticsEvent?.(\"copy_entity_click\", {\n path: entity.path,\n entityId: entity.id\n });\n context.sideEntityController.open({\n entityId: entity.id,\n path: entity.path,\n copy: true,\n collection,\n updateUrl: true,\n onClose: () => unhighlightEntity?.(entity),\n });\n return Promise.resolve(undefined);\n }\n}\n\nexport const archiveEntityAction: EntityAction = {\n icon: <ArchiveIcon/>,\n name: \"Archive\",\n onClick({\n entity,\n collection,\n context: {\n dataSource,\n }\n }): Promise<void> {\n // Add your code here\n return Promise.resolve(undefined);\n }\n}\n\nexport const openWebsiteAction: EntityAction = {\n icon: <OpenInNewIcon/>,\n name: \"See in website\",\n onClick({\n entity,\n collection,\n context,\n }): Promise<void> {\n // open a new tab\n window.open(`https://example.com/${entity.id}`, \"_blank\");\n return Promise.resolve(undefined);\n }\n}\n\nexport const deleteEntityAction: EntityAction = {\n icon: <DeleteIcon/>,\n name: \"Delete\",\n onClick({\n entity,\n fullPath,\n collection,\n context,\n selectionController,\n onCollectionChange,\n sideEntityController\n }): Promise<void> {\n const { closeDialog } = context.dialogsController.open({\n key: \"delete_entity_dialog_\" + entity.id,\n Component: ({ open }) => {\n if (!collection || !fullPath)\n throw new Error(\"deleteEntityAction: Collection is undefined\");\n return <DeleteEntityDialog\n entityOrEntitiesToDelete={entity}\n path={fullPath}\n collection={collection}\n callbacks={collection.callbacks}\n open={open}\n onEntityDelete={() => {\n context.analyticsController?.onAnalyticsEvent?.(\"single_entity_deleted\", {\n path: fullPath\n });\n selectionController?.setSelectedEntities(selectionController.selectedEntities.filter(e => e.id !== entity.id));\n onCollectionChange?.();\n sideEntityController?.close();\n }}\n onClose={closeDialog}/>;\n }\n })\n return Promise.resolve(undefined);\n }\n}\n","import { ContentPasteIcon, IconButton, Typography } from \"@firecms/ui\";\nimport { useCallback, useState } from \"react\";\n\nexport function PropertyIdCopyTooltipContent({ propertyId }: { propertyId: string }) {\n\n const [copied, setCopied] = useState(false);\n\n return (\n <div className={\"flex flex-row gap-2 items-center justify-center text-white\"}>\n <div>\n <Typography variant={\"caption\"} className={\"min-w-20 text-slate-400\"}\n color={\"disabled\"}>{copied ? \"Copied\" : \"Property ID\"}</Typography>\n <Typography variant={\"caption\"} className={\"text-white\"}><code>{propertyId}</code></Typography>\n </div>\n {/* Copy to clipboard button*/}\n <IconButton size={\"small\"}>\n <ContentPasteIcon size={\"smallest\"}\n className={\"text-white\"}\n onClick={useCallback(() => {\n navigator.clipboard.writeText(propertyId);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n }, [propertyId])}\n />\n </IconButton>\n </div>\n );\n}\n","import React, { MutableRefObject, useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\nimport {\n CMSAnalyticsEvent,\n Entity,\n EntityAction,\n EntityCollection,\n EntityStatus,\n EntityValues,\n FormContext,\n PluginFormActionProps,\n PropertyFieldBindingProps,\n ResolvedEntityCollection\n} from \"../types\";\nimport { Formex, FormexController, getIn, setIn, useCreateFormex } from \"@firecms/formex\";\nimport { PropertyFieldBinding } from \"./PropertyFieldBinding\";\nimport { CustomFieldValidator, getYupEntitySchema } from \"./validation\";\nimport equal from \"react-fast-compare\"\nimport {\n canCreateEntity,\n canDeleteEntity,\n getDefaultValuesFor,\n getEntityTitlePropertyKey,\n getValueInPath,\n isHidden,\n isReadOnly,\n resolveCollection\n} from \"../util\";\nimport {\n useAuthController,\n useCustomizationController,\n useDataSource,\n useFireCMSContext,\n useSideEntityController\n} from \"../hooks\";\nimport { ErrorFocus } from \"./components/ErrorFocus\";\nimport { CustomIdField } from \"./components/CustomIdField\";\nimport { Alert, Button, cn, DialogActions, IconButton, Tooltip, Typography } from \"@firecms/ui\";\nimport { ErrorBoundary } from \"../components\";\nimport {\n copyEntityAction,\n deleteEntityAction\n} from \"../components/EntityCollectionTable/internal/default_entity_actions\";\nimport { useAnalyticsController } from \"../hooks/useAnalyticsController\";\nimport { ValidationError } from \"yup\";\nimport { PropertyIdCopyTooltipContent } from \"../components/PropertyIdCopyTooltipContent\";\n\n/**\n * @group Components\n */\nexport interface EntityFormProps<M extends Record<string, any>> {\n\n /**\n * New or existing status\n */\n status: EntityStatus;\n\n /**\n * Path of the collection this entity is located\n */\n path: string;\n\n /**\n * The collection is used to build the fields of the form\n */\n collection: EntityCollection<M>\n\n /**\n * The updated entity is passed from the parent component when the underlying data\n * has changed in the datasource\n */\n entity?: Entity<M>;\n\n /**\n * The callback function called when Save is clicked and validation is correct\n */\n onEntitySaveRequested: (\n props: EntityFormSaveParams<M>\n ) => Promise<void>;\n\n /**\n * The callback function called when discard is clicked\n */\n onDiscard?: () => void;\n\n /**\n * The callback function when the form is dirty, so the values are different\n * from the original ones\n */\n onModified?: (dirty: boolean) => void;\n\n /**\n * The callback function when the form original values have been modified\n */\n onValuesChanged?: (values?: EntityValues<M>) => void;\n\n /**\n *\n * @param id\n */\n onIdChange?: (id: string) => void;\n\n currentEntityId?: string;\n\n onFormContextChange?: (formContext: FormContext<M>) => void;\n\n hideId?: boolean;\n\n autoSave?: boolean;\n\n onIdUpdateError?: (error: any) => void;\n\n}\n\nexport type EntityFormSaveParams<M extends Record<string, any>> = {\n collection: ResolvedEntityCollection<M>,\n path: string,\n entityId: string | undefined,\n values: EntityValues<M>,\n previousValues?: EntityValues<M>,\n closeAfterSave: boolean,\n autoSave: boolean\n};\n\n/**\n * This is the form used internally by the CMS\n * @param status\n * @param path\n * @param collection\n * @param entity\n * @param onEntitySave\n * @param onDiscard\n * @param onModified\n * @param onValuesChanged\n * @constructor\n * @group Components\n */\nexport const EntityForm = React.memo<EntityFormProps<any>>(EntityFormInternal,\n (a: EntityFormProps<any>, b: EntityFormProps<any>) => {\n return a.status === b.status &&\n a.path === b.path &&\n equal(a.entity?.values, b.entity?.values);\n }) as typeof EntityFormInternal;\n\nfunction getDataSourceEntityValues<M extends object>(initialResolvedCollection: ResolvedEntityCollection,\n status: \"new\" | \"existing\" | \"copy\",\n entity: Entity<M> | undefined): Partial<EntityValues<M>> {\n const properties = initialResolvedCollection.properties;\n if ((status === \"existing\" || status === \"copy\") && entity) {\n return entity.values ?? getDefaultValuesFor(properties);\n } else if (status === \"new\") {\n return getDefaultValuesFor(properties);\n } else {\n console.error({\n status,\n entity\n });\n throw new Error(\"Form has not been initialised with the correct parameters\");\n }\n}\n\nfunction EntityFormInternal<M extends Record<string, any>>({\n status,\n path,\n collection: inputCollection,\n entity,\n onEntitySaveRequested,\n onDiscard,\n onModified,\n onValuesChanged,\n onIdChange,\n onFormContextChange,\n hideId,\n autoSave,\n onIdUpdateError,\n }: EntityFormProps<M>) {\n\n const analyticsController = useAnalyticsController();\n\n const customizationController = useCustomizationController();\n\n const context = useFireCMSContext();\n const dataSource = useDataSource(inputCollection);\n const plugins = customizationController.plugins;\n\n const initialResolvedCollection = useMemo(() => resolveCollection({\n collection: inputCollection,\n path,\n values: entity?.values,\n fields: customizationController.propertyConfigs\n }), [entity?.values, path]);\n\n const mustSetCustomId: boolean = (status === \"new\" || status === \"copy\") &&\n (Boolean(initialResolvedCollection.customId) && initialResolvedCollection.customId !== \"optional\");\n\n const initialEntityId = useMemo(() => {\n if (status === \"new\" || status === \"copy\") {\n if (mustSetCustomId) {\n return undefined;\n } else {\n return dataSource.generateEntityId(path);\n }\n } else {\n return entity?.id;\n }\n }, []);\n\n const closeAfterSaveRef = useRef(false);\n\n const baseDataSourceValuesRef = useRef<Partial<EntityValues<M>>>(getDataSourceEntityValues(initialResolvedCollection, status, entity));\n\n const [entityId, setEntityId] = React.useState<string | undefined>(initialEntityId);\n const [entityIdError, setEntityIdError] = React.useState<boolean>(false);\n const [savingError, setSavingError] = React.useState<Error | undefined>();\n\n const [customIdLoading, setCustomIdLoading] = React.useState<boolean>(false);\n\n // const initialValuesRef = useRef<EntityValues<M>>(entity?.values ?? baseDataSourceValues as EntityValues<M>);\n const [internalValues, setInternalValues] = useState<EntityValues<M> | undefined>(entity?.values ?? baseDataSourceValuesRef.current as EntityValues<M>);\n\n const save = (values: EntityValues<M>): Promise<void> => {\n return onEntitySaveRequested({\n collection: resolvedCollection,\n path,\n entityId,\n values,\n previousValues: entity?.values,\n closeAfterSave: closeAfterSaveRef.current,\n autoSave: autoSave ?? false\n }).then(_ => {\n const eventName: CMSAnalyticsEvent = status === \"new\"\n ? \"new_entity_saved\"\n : (status === \"copy\" ? \"entity_copied\" : (status === \"existing\" ? \"entity_edited\" : \"unmapped_event\"));\n analyticsController.onAnalyticsEvent?.(eventName, { path });\n }).catch(e => {\n console.error(e);\n setSavingError(e);\n }).finally(() => {\n closeAfterSaveRef.current = false;\n });\n };\n\n const onSubmit = (values: EntityValues<M>, formexController: FormexController<EntityValues<M>>) => {\n\n if (mustSetCustomId && !entityId) {\n console.error(\"Missing custom Id\");\n setEntityIdError(true);\n formexController.setSubmitting(false);\n return;\n }\n\n setSavingError(undefined);\n setEntityIdError(false);\n\n if (status === \"existing\") {\n if (!entity?.id) throw Error(\"Form misconfiguration when saving, no id for existing entity\");\n } else if (status === \"new\" || status === \"copy\") {\n if (inputCollection.customId) {\n if (inputCollection.customId !== \"optional\" && !entityId) {\n throw Error(\"Form misconfiguration when saving, entityId should be set\");\n }\n }\n } else {\n throw Error(\"New FormType added, check EntityForm\");\n }\n\n return save(values)\n ?.then(_ => {\n formexController.resetForm({\n values,\n submitCount: 0,\n touched: {}\n });\n })\n .finally(() => {\n formexController.setSubmitting(false);\n });\n\n };\n\n const formex: FormexController<M> = useCreateFormex<M>({\n initialValues: baseDataSourceValuesRef.current as M,\n onSubmit,\n validation: (values) => {\n return validationSchema?.validate(values, { abortEarly: false })\n .then(() => {\n return {};\n })\n .catch((e) => {\n\n const errors: Record<string, string> = {};\n e.inner.forEach((error: any) => {\n errors[error.path] = error.message;\n });\n return yupToFormErrors(e);\n });\n }\n });\n\n useEffect(() => {\n baseDataSourceValuesRef.current = getDataSourceEntityValues(initialResolvedCollection, status, entity);\n const initialValues = formex.initialValues;\n if (!formex.isSubmitting && initialValues && status === \"existing\") {\n setUnderlyingChanges(\n Object.entries(resolvedCollection.properties)\n .map(([key, property]) => {\n if (isHidden(property)) {\n return {};\n }\n const initialValue = initialValues[key];\n const latestValue = baseDataSourceValuesRef.current[key];\n if (!equal(initialValue, latestValue)) {\n return { [key]: latestValue };\n }\n return {};\n })\n .reduce((a, b) => ({ ...a, ...b }), {}) as Partial<EntityValues<M>>\n );\n } else {\n setUnderlyingChanges({});\n }\n }, [entity, initialResolvedCollection, status]);\n\n const doOnValuesChanges = (values?: EntityValues<M>) => {\n const initialValues = formex.initialValues;\n setInternalValues(values);\n if (onValuesChanged)\n onValuesChanged(values);\n if (autoSave && values && !equal(values, initialValues)) {\n save(values);\n }\n };\n\n useEffect(() => {\n if (entityId && onIdChange)\n onIdChange(entityId);\n }, [entityId, onIdChange]);\n\n const resolvedCollection = resolveCollection<M>({\n collection: inputCollection,\n path,\n entityId,\n values: internalValues,\n previousValues: formex.initialValues,\n fields: customizationController.propertyConfigs\n });\n\n const titlePropertyKey = getEntityTitlePropertyKey(resolvedCollection, customizationController.propertyConfigs);\n const title = internalValues && titlePropertyKey ? getValueInPath(internalValues, titlePropertyKey) : undefined;\n\n const onIdUpdate = inputCollection.callbacks?.onIdUpdate;\n\n const doOnIdUpdate = useCallback(async () => {\n if (onIdUpdate && internalValues && (status === \"new\" || status === \"copy\")) {\n setCustomIdLoading(true);\n try {\n const updatedId = await onIdUpdate({\n collection: resolvedCollection,\n path,\n entityId,\n values: internalValues,\n context\n });\n setEntityId(updatedId);\n } catch (e) {\n onIdUpdateError && onIdUpdateError(e);\n console.error(e);\n }\n setCustomIdLoading(false);\n }\n }, [entityId, internalValues, status]);\n\n useEffect(() => {\n doOnIdUpdate();\n }, [doOnIdUpdate]);\n\n const [underlyingChanges, setUnderlyingChanges] = useState<Partial<EntityValues<M>>>({});\n\n const uniqueFieldValidator: CustomFieldValidator = useCallback(({\n name,\n value,\n property\n }) => dataSource.checkUniqueField(path, name, value, entityId),\n [dataSource, path, entityId]);\n\n const validationSchema = useMemo(() => entityId\n ? getYupEntitySchema(\n entityId,\n resolvedCollection.properties,\n uniqueFieldValidator)\n : undefined,\n [entityId, resolvedCollection.properties, uniqueFieldValidator]);\n\n const authController = useAuthController();\n\n const getActionsForEntity = useCallback(({\n entity,\n customEntityActions\n }: {\n entity?: Entity<M>,\n customEntityActions?: EntityAction[]\n }): EntityAction[] => {\n const createEnabled = canCreateEntity(inputCollection, authController, path, null);\n const deleteEnabled = entity ? canDeleteEntity(inputCollection, authController, path, entity) : true;\n const actions: EntityAction[] = [];\n if (createEnabled)\n actions.push(copyEntityAction);\n if (deleteEnabled)\n actions.push(deleteEntityAction);\n if (customEntityActions)\n actions.push(...customEntityActions);\n return actions;\n }, [authController, inputCollection, path]);\n\n const pluginActions: React.ReactNode[] = [];\n\n const formContext: FormContext<M> = {\n setFieldValue: formex.setFieldValue,\n values: formex.values,\n collection: resolvedCollection,\n entityId,\n path,\n save\n };\n\n // eslint-disable-next-line react-hooks/rules-of-hooks\n useEffect(() => {\n if (onFormContextChange) {\n onFormContextChange(formContext);\n }\n }, [onFormContextChange, formContext]);\n\n if (plugins && inputCollection) {\n const actionProps: PluginFormActionProps = {\n entityId,\n path,\n status,\n collection: inputCollection,\n context,\n currentEntityId: entityId,\n formContext\n };\n pluginActions.push(...plugins.map((plugin, i) => (\n plugin.form?.Actions\n ? <plugin.form.Actions\n key={`actions_${plugin.name}`} {...actionProps}/>\n : null\n )).filter(Boolean));\n }\n\n return <Formex value={formex}>\n <div className=\"h-full overflow-auto\">\n\n {pluginActions.length > 0 && <div\n className={cn(\"w-full flex justify-end items-center sticky top-0 right-0 left-0 z-10 bg-opacity-60 bg-slate-200 dark:bg-opacity-60 dark:bg-slate-800 backdrop-blur-md\")}>\n {pluginActions}\n </div>}\n\n <div className=\"pt-12 pb-16 pl-8 pr-8 md:pl-10 md:pr-10\">\n <div\n className={`w-full py-2 flex flex-col items-start mt-${4 + (pluginActions ? 8 : 0)} lg:mt-${8 + (pluginActions ? 8 : 0)} mb-8`}>\n\n <Typography\n className={\"mt-4 flex-grow line-clamp-1 \" + inputCollection.hideIdFromForm ? \"mb-2\" : \"mb-0\"}\n variant={\"h4\"}>{title ?? inputCollection.singularName ?? inputCollection.name}\n </Typography>\n <Alert color={\"base\"} className={\"w-full\"} size={\"small\"}>\n <code className={\"text-xs select-all\"}>{path}/{entityId}</code>\n </Alert>\n </div>\n\n {!hideId &&\n <CustomIdField customId={inputCollection.customId}\n entityId={entityId}\n status={status}\n onChange={setEntityId}\n error={entityIdError}\n loading={customIdLoading}\n entity={entity}/>}\n\n {entityId && <InnerForm\n {...formex}\n initialValues={formex.initialValues}\n onModified={onModified}\n onDiscard={onDiscard}\n onValuesChanged={doOnValuesChanges}\n underlyingChanges={underlyingChanges}\n entity={entity}\n resolvedCollection={resolvedCollection}\n formContext={formContext}\n status={status}\n savingError={savingError}\n closeAfterSaveRef={closeAfterSaveRef}\n autoSave={autoSave}\n entityActions={getActionsForEntity({\n entity,\n customEntityActions: inputCollection.entityActions\n })}/>}\n\n </div>\n </div>\n </Formex>\n}\n\nfunction InnerForm<M extends Record<string, any>>(props: FormexController<M> & {\n initialValues: EntityValues<M>,\n onModified: ((modified: boolean) => void) | undefined,\n onValuesChanged?: (changedValues?: EntityValues<M>) => void,\n underlyingChanges: Partial<M>,\n entity: Entity<M> | undefined,\n resolvedCollection: ResolvedEntityCollection<M>,\n formContext: FormContext<M>,\n onDiscard?: () => void,\n status: \"new\" | \"existing\" | \"copy\",\n savingError?: Error,\n closeAfterSaveRef: MutableRefObject<boolean>,\n autoSave?: boolean,\n entityActions: EntityAction[],\n}) {\n\n const {\n values,\n onDiscard,\n onModified,\n onValuesChanged,\n underlyingChanges,\n formContext,\n entity,\n touched,\n setFieldValue,\n resolvedCollection,\n isSubmitting,\n status,\n handleSubmit,\n resetForm,\n savingError,\n dirty,\n closeAfterSaveRef,\n autoSave,\n entityActions,\n } = props;\n\n const context = useFireCMSContext();\n const formActions = entityActions.filter(a => a.includeInForm === undefined || a.includeInForm);\n const sideEntityController = useSideEntityController();\n\n const modified = dirty;\n useEffect(() => {\n if (onModified)\n onModified(modified);\n if (onValuesChanged)\n onValuesChanged(values);\n }, [modified, values]);\n\n useEffect(() => {\n if (!autoSave && !isSubmitting && underlyingChanges && entity) {\n // we update the form fields from the Firestore data\n // if they were not touched\n Object.entries(underlyingChanges).forEach(([key, value]) => {\n const formValue = values[key];\n if (!equal(value, formValue) && !touched[key]) {\n console.debug(\"Updated value from the datasource:\", key, value);\n setFieldValue(key, value !== undefined ? value : null);\n }\n });\n }\n }, [isSubmitting, autoSave, underlyingChanges, entity, values, touched, setFieldValue]);\n\n const formFields = (\n <div className={\"flex flex-col gap-8\"}>\n {(resolvedCollection.propertiesOrder ?? Object.keys(resolvedCollection.properties))\n .map((key) => {\n\n const property = resolvedCollection.properties[key];\n if (!property) {\n console.warn(`Property ${key} not found in collection ${resolvedCollection.name}`);\n return null;\n }\n\n const underlyingValueHasChanged: boolean =\n !!underlyingChanges &&\n Object.keys(underlyingChanges).includes(key) &&\n !!touched[key];\n\n const disabled = (!autoSave && isSubmitting) || isReadOnly(property) || Boolean(property.disabled);\n const hidden = isHidden(property);\n if (hidden) return null;\n const cmsFormFieldProps: PropertyFieldBindingProps<any, M> = {\n propertyKey: key,\n disabled,\n property,\n includeDescription: property.description || property.longDescription,\n underlyingValueHasChanged: underlyingValueHasChanged && !autoSave,\n context: formContext,\n tableMode: false,\n partOfArray: false,\n partOfBlock: false,\n autoFocus: false\n };\n\n return (\n <div id={`form_field_${key}`}\n key={`field_${resolvedCollection.name}_${key}`}>\n <ErrorBoundary>\n <Tooltip title={<PropertyIdCopyTooltipContent propertyId={key}/>}\n delayDuration={800}\n side={\"left\"}\n align={\"start\"}\n sideOffset={16}>\n <PropertyFieldBinding {...cmsFormFieldProps}/>\n </Tooltip>\n </ErrorBoundary>\n </div>\n );\n })\n .filter(Boolean)}\n\n </div>\n );\n\n const disabled = isSubmitting || (!modified && status === \"existing\");\n const formRef = React.useRef<HTMLDivElement>(null);\n\n return (\n\n <form onSubmit={handleSubmit}\n onReset={() => {\n console.debug(\"Resetting form\")\n resetForm();\n return onDiscard && onDiscard();\n }}\n noValidate>\n <div className=\"mt-12\"\n ref={formRef}>\n\n {formFields}\n\n <ErrorFocus containerRef={formRef}/>\n\n </div>\n\n <div className=\"h-14\"/>\n\n {!autoSave && <DialogActions position={\"absolute\"}>\n\n {savingError &&\n <div className=\"text-right\">\n <Typography color={\"error\"}>\n {savingError.message}\n </Typography>\n </div>}\n\n {entity && formActions.length > 0 && <div className=\"flex-grow flex overflow-auto no-scrollbar\">\n {formActions.map(action => (\n <IconButton\n key={action.name}\n color=\"primary\"\n onClick={(event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {\n event.stopPropagation();\n if (entity)\n action.onClick({\n entity,\n fullPath: resolvedCollection.path,\n collection: resolvedCollection,\n context,\n sideEntityController,\n });\n }}>\n {action.icon}\n </IconButton>\n ))}\n </div>}\n\n <Button\n variant=\"text\"\n disabled={disabled}\n type=\"reset\"\n >\n {status === \"existing\" ? \"Discard\" : \"Clear\"}\n </Button>\n\n <Button\n variant=\"text\"\n color=\"primary\"\n type=\"submit\"\n disabled={disabled}\n onClick={() => {\n closeAfterSaveRef.current = false;\n }}\n >\n {status === \"existing\" && \"Save\"}\n {status === \"copy\" && \"Create copy\"}\n {status === \"new\" && \"Create\"}\n </Button>\n\n <Button\n variant=\"filled\"\n color=\"primary\"\n type=\"submit\"\n disabled={disabled}\n onClick={() => {\n closeAfterSaveRef.current = true;\n }}\n >\n {status === \"existing\" && \"Save and close\"}\n {status === \"copy\" && \"Create copy and close\"}\n {status === \"new\" && \"Create and close\"}\n </Button>\n\n </DialogActions>}\n </form>\n );\n}\n\nexport function yupToFormErrors(yupError: ValidationError): Record<string, any> {\n let errors: Record<string, any> = {};\n if (yupError.inner) {\n if (yupError.inner.length === 0) {\n return setIn(errors, yupError.path!, yupError.message);\n }\n for (const err of yupError.inner) {\n if (!getIn(errors, err.path!)) {\n errors = setIn(errors, err.path!, err.message);\n }\n }\n }\n return errors;\n}\n","import React, { useCallback, useEffect, useLayoutEffect, useMemo, useState } from \"react\";\nimport equal from \"react-fast-compare\"\n\nimport * as Portal from \"@radix-ui/react-portal\";\n\nimport {\n Entity,\n EntityCollection,\n EntityValues,\n FireCMSPlugin,\n FormContext,\n PropertyFieldBindingProps,\n ResolvedEntityCollection,\n ResolvedProperties,\n ResolvedProperty\n} from \"../../../../types\";\nimport { Formex, useCreateFormex } from \"@firecms/formex\";\nimport { useDraggable } from \"./useDraggable\";\nimport { CustomFieldValidator, getYupEntitySchema } from \"../../../../form/validation\";\nimport { useWindowSize } from \"./useWindowSize\";\nimport { ElementResizeListener } from \"./ElementResizeListener\";\nimport { ErrorView } from \"../../../ErrorView\";\nimport { getPropertyInPath, isReadOnly, resolveCollection } from \"../../../../util\";\nimport { Button, ClearIcon, DialogActions, IconButton, Typography } from \"@firecms/ui\";\nimport { PropertyFieldBinding } from \"../../../../form\";\nimport { useCustomizationController, useFireCMSContext } from \"../../../../hooks\";\nimport { OnCellValueChangeParams } from \"../../../common\";\n\ninterface PopupFormFieldProps<M extends Record<string, any>> {\n entity?: Entity<M>;\n customFieldValidator?: CustomFieldValidator;\n path: string;\n tableKey: string;\n propertyKey?: Extract<keyof M, string>;\n collection?: EntityCollection<M>;\n cellRect?: DOMRect;\n open: boolean;\n onClose: () => void;\n container: HTMLElement | null;\n /**\n * Callback when the value of a cell has been edited\n * @param params\n */\n onCellValueChange?: (params: OnCellValueChangeParams<any, M>) => Promise<void> | void;\n}\n\nexport function PopupFormField<M extends Record<string, any>>(props: PopupFormFieldProps<M>) {\n if (!props.open) return null;\n return <PopupFormFieldInternal {...props} />;\n\n}\n\nexport function PopupFormFieldInternal<M extends Record<string, any>>({\n tableKey,\n entity: entityProp,\n customFieldValidator,\n propertyKey,\n collection: inputCollection,\n path,\n cellRect,\n open,\n onClose,\n onCellValueChange,\n container\n }: PopupFormFieldProps<M>) {\n\n // const dataSource = useDataSource();\n const fireCMSContext = useFireCMSContext();\n const customizationController = useCustomizationController();\n\n const [savingError, setSavingError] = React.useState<any>();\n const [popupLocation, setPopupLocation] = useState<{\n x: number,\n y: number\n }>();\n\n const entityId = entityProp?.id;\n const [entity, setEntity] = useState<Entity<M> | undefined>(entityProp);\n // useEffect(() => {\n // if (entityId && inputCollection) {\n // return dataSource.listenEntity?.({\n // path,\n // entityId,\n // collection: inputCollection,\n // onUpdate: (e) => {\n // setEntity(e);\n // setInternalValue(e?.values);\n // }\n // });\n // } else {\n // return () => {\n // };\n // }\n // }, [dataSource, entityId, inputCollection, path, open]);\n\n const [internalValue, setInternalValue] = useState<EntityValues<M> | undefined>(entity?.values);\n\n const collection: ResolvedEntityCollection<M> | undefined = inputCollection\n ? resolveCollection<M>({\n collection: inputCollection,\n path,\n values: internalValue,\n entityId,\n fields: customizationController.propertyConfigs\n })\n : undefined;\n\n const windowSize = useWindowSize();\n\n const draggableRef = React.useRef<HTMLDivElement>(null);\n const innerRef = React.useRef<HTMLDivElement>(null);\n\n const initialPositionSet = React.useRef<boolean>(false);\n\n const getInitialLocation = useCallback(() => {\n if (!cellRect) throw Error(\"getInitialLocation error\");\n\n return {\n x: cellRect.left < windowSize.width - cellRect.right\n ? cellRect.x + cellRect.width / 2\n : cellRect.x - cellRect.width / 2,\n y: cellRect.top < windowSize.height - cellRect.bottom\n ? cellRect.y + cellRect.height / 2\n : cellRect.y - cellRect.height / 2\n };\n }, [cellRect, windowSize.height, windowSize.width]);\n\n const normalizePosition = useCallback(({\n x,\n y\n }: { x: number, y: number }) => {\n\n const draggableBoundingRect = draggableRef.current?.getBoundingClientRect();\n if (!draggableBoundingRect)\n throw Error(\"normalizePosition called before draggableBoundingRect is set\");\n\n return {\n x: Math.max(0, Math.min(x, windowSize.width - draggableBoundingRect.width)),\n y: Math.max(0, Math.min(y, windowSize.height - draggableBoundingRect.height))\n };\n }, [windowSize]);\n\n const updatePopupLocation = useCallback((position?: {\n x: number,\n y: number\n }) => {\n\n const draggableBoundingRect = draggableRef.current?.getBoundingClientRect();\n if (!cellRect || !draggableBoundingRect) return;\n // const newPosition = normalizePosition(position ?? getInitialLocation());\n const newPosition = position ?? normalizePosition(getInitialLocation());\n if (!popupLocation || newPosition.x !== popupLocation.x || newPosition.y !== popupLocation.y)\n setPopupLocation(newPosition);\n }, [cellRect, getInitialLocation, normalizePosition, popupLocation]);\n\n useDraggable({\n containerRef: draggableRef,\n innerRef,\n x: popupLocation?.x,\n y: popupLocation?.y,\n onMove: updatePopupLocation\n });\n\n useEffect(\n () => {\n initialPositionSet.current = false;\n },\n [propertyKey, entity]\n );\n\n useLayoutEffect(\n () => {\n const draggableBoundingRect = draggableRef.current?.getBoundingClientRect();\n if (!cellRect || !draggableBoundingRect || initialPositionSet.current) return;\n updatePopupLocation();\n initialPositionSet.current = true;\n },\n [cellRect, updatePopupLocation, initialPositionSet.current]\n );\n\n useLayoutEffect(\n () => {\n updatePopupLocation(popupLocation);\n },\n [windowSize, cellRect]\n );\n\n const validationSchema = useMemo(() => {\n if (!collection || !entityId) return;\n return getYupEntitySchema(\n entityId,\n propertyKey && collection.properties[propertyKey as string]\n ? { [propertyKey]: collection.properties[propertyKey as string] } as ResolvedProperties<any>\n : {} as ResolvedProperties<any>,\n customFieldValidator);\n }, [collection, entityId, propertyKey, customFieldValidator]);\n\n const adaptResize = useCallback(() => {\n return updatePopupLocation(popupLocation);\n }, [popupLocation, updatePopupLocation]);\n\n const saveValue = async (values: M) => {\n setSavingError(null);\n if (inputCollection && entity && onCellValueChange && propertyKey) {\n return onCellValueChange({\n value: values[propertyKey as string],\n propertyKey: propertyKey as string,\n entity,\n setError: setSavingError,\n onValueUpdated: () => {\n },\n fullPath: path,\n context: fireCMSContext\n });\n }\n return Promise.resolve();\n };\n\n if (!entity)\n return <></>;\n\n // enableReinitialize={true}\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const formex = useCreateFormex<M>({\n initialValues: (entity?.values ?? {}) as EntityValues<M>,\n validation: (values) => {\n return validationSchema?.validate(values, { abortEarly: false })\n .then(() => ({}))\n .catch((e) => {\n const errors: Record<string, string> = {};\n e.inner.forEach((error: any) => {\n errors[error.path] = error.message;\n });\n return errors;\n });\n },\n validateOnInitialRender: true,\n onSubmit: (values, actions) => {\n saveValue(values)\n .then(() => onClose())\n .finally(() => actions.setSubmitting(false));\n }\n });\n\n const { values, isSubmitting, setFieldValue, handleSubmit } = formex;\n\n // eslint-disable-next-line react-hooks/rules-of-hooks\n useEffect(() => {\n if (!equal(values, internalValue)) {\n setInternalValue(values);\n }\n }, [values]);\n\n if (!entity)\n return <ErrorView\n error={\"PopupFormField misconfiguration\"}/>;\n\n if (!collection)\n return <></>;\n\n const disabled = isSubmitting;\n\n const formContext: FormContext<M> = {\n collection,\n entityId,\n values,\n path,\n setFieldValue,\n save: saveValue\n };\n\n const property: ResolvedProperty<any> | undefined = propertyKey && getPropertyInPath(collection.properties, propertyKey as string);\n const fieldProps: PropertyFieldBindingProps<any, M> | undefined = propertyKey && property\n ? {\n propertyKey: propertyKey as string,\n disabled: isSubmitting || isReadOnly(property) || !!property.disabled,\n property,\n includeDescription: false,\n underlyingValueHasChanged: false,\n context: formContext,\n tableMode: true,\n partOfArray: false,\n partOfBlock: false,\n autoFocus: open\n }\n : undefined;\n\n let internalForm = <>\n <div\n key={`popup_form_${tableKey}_${entityId}_${propertyKey}`}\n className=\"w-[560px] max-w-full max-h-[85vh]\">\n <form\n onSubmit={handleSubmit}\n noValidate>\n\n <div\n className=\"mb-1 p-4 flex flex-col relative\">\n <div\n ref={innerRef}\n className=\"cursor-auto\"\n style={{ cursor: \"auto !important\" }}>\n {fieldProps &&\n <PropertyFieldBinding {...fieldProps}/>}\n </div>\n </div>\n\n <DialogActions>\n <Button\n variant=\"filled\"\n color=\"primary\"\n type=\"submit\"\n disabled={disabled}\n >\n Save\n </Button>\n </DialogActions>\n\n </form>\n\n </div>\n\n </>;\n\n const plugins = customizationController.plugins;\n if (plugins) {\n // const formController: FormContext<M> = {\n // values,\n // setFieldValue\n // }\n plugins.forEach((plugin: FireCMSPlugin) => {\n if (plugin.form?.provider) {\n internalForm = (\n <plugin.form.provider.Component\n status={\"existing\"}\n path={path}\n collection={collection}\n entity={entity}\n context={fireCMSContext}\n currentEntityId={entityId}\n formContext={formContext}\n {...plugin.form.provider.props}>\n {internalForm}\n </plugin.form.provider.Component>\n );\n }\n });\n }\n const form = <div\n className={`text-gray-900 dark:text-white overflow-auto rounded rounded-md bg-white dark:bg-gray-950 ${!open ? \"hidden\" : \"\"} cursor-grab max-w-[100vw]`}>\n\n {internalForm}\n\n {savingError &&\n <Typography color={\"error\"}>\n {savingError.message}\n </Typography>\n }\n </div>;\n\n const draggable = (\n <div\n key={`draggable_${propertyKey as string}_${entityId}_${open}`}\n style={{\n boxShadow: \"0 0 0 2px rgba(128,128,128,0.2)\",\n }}\n className={`inline-block fixed z-20 shadow-outline rounded-md bg-white dark:bg-gray-950 ${\n !open ? \"invisible\" : \"visible\"\n } cursor-grab overflow-visible`}\n ref={draggableRef}>\n\n <ElementResizeListener onResize={adaptResize}/>\n\n <div\n className=\"overflow-hidden\">\n\n {form}\n\n <div\n className=\"absolute -top-3.5 -right-3.5 bg-gray-500 rounded-full\"\n style={{\n width: \"32px\",\n height: \"32px\"\n }}>\n <IconButton\n size={\"small\"}\n onClick={(event) => {\n event.stopPropagation();\n onClose();\n }}>\n <ClearIcon className=\"text-white\"\n size={\"small\"}/>\n </IconButton>\n </div>\n </div>\n\n </div>\n );\n\n return (\n <Portal.Root asChild\n container={container}>\n <Formex value={formex}>\n {draggable}\n </Formex>\n </Portal.Root>\n );\n\n}\n","import React, { useCallback, useEffect, useMemo, useState } from \"react\";\n\nimport equal from \"react-fast-compare\"\n\nimport {\n AdditionalFieldDelegate,\n CollectionSize,\n Entity,\n EntityAction,\n EntityCollection,\n FilterValues,\n PartialEntityCollection,\n PropertyOrBuilder,\n ResolvedProperty,\n SaveEntityProps\n} from \"../../types\";\nimport {\n EntityCollectionRowActions,\n EntityCollectionTable,\n useDataSourceEntityCollectionTableController\n} from \"../EntityCollectionTable\";\n\nimport {\n canCreateEntity,\n canDeleteEntity,\n canEditEntity,\n getPropertyInPath,\n mergeDeep,\n resolveCollection,\n resolveProperty\n} from \"../../util\";\nimport { ReferencePreview } from \"../../preview\";\nimport {\n saveEntityWithCallbacks,\n useAuthController,\n useCustomizationController,\n useDataSource,\n useLargeLayout,\n useNavigationController,\n useSideEntityController\n} from \"../../hooks\";\nimport { useUserConfigurationPersistence } from \"../../hooks/useUserConfigurationPersistence\";\nimport { EntityCollectionViewActions } from \"./EntityCollectionViewActions\";\nimport {\n AddIcon,\n Button,\n cn,\n IconButton,\n KeyboardTabIcon,\n Markdown,\n Popover,\n SearchIcon,\n Skeleton,\n Tooltip,\n Typography\n} from \"@firecms/ui\";\nimport { setIn } from \"@firecms/formex\";\nimport { getSubcollectionColumnId } from \"../EntityCollectionTable/internal/common\";\nimport {\n OnCellValueChange,\n OnColumnResizeParams,\n UniqueFieldValidator,\n useColumnIds,\n useTableSearchHelper\n} from \"../common\";\nimport { PopupFormField } from \"../EntityCollectionTable/internal/popup_field/PopupFormField\";\nimport { GetPropertyForProps } from \"../EntityCollectionTable/EntityCollectionTableProps\";\nimport {\n copyEntityAction,\n deleteEntityAction,\n editEntityAction\n} from \"../EntityCollectionTable/internal/default_entity_actions\";\nimport { DeleteEntityDialog } from \"../DeleteEntityDialog\";\nimport { useAnalyticsController } from \"../../hooks/useAnalyticsController\";\nimport { useSelectionController } from \"./useSelectionController\";\n\nconst COLLECTION_GROUP_PARENT_ID = \"collectionGroupParent\";\n\n/**\n * @group Components\n */\nexport type EntityCollectionViewProps<M extends Record<string, any>> = {\n fullPath: string;\n parentCollectionIds?: string[];\n isSubCollection?: boolean;\n className?: string;\n} & EntityCollection<M>;\n\n/**\n * This component is in charge of binding a datasource path with an {@link EntityCollection}\n * where it's configuration is defined. It includes an infinite scrolling table\n * and a 'Add' new entities button,\n *\n * This component is the default one used for displaying entity collections\n * and is in charge of generating all the specific actions and customization\n * of the lower level {@link EntityCollectionTable}\n *\n * Please **note** that you only need to use this component if you are building\n * a custom view. If you just need to create a default view you can do it\n * exclusively with config options.\n *\n * If you need a lower level implementation with more granular options, you\n * can use {@link EntityCollectionTable}.\n *\n * If you need a generic table that is not bound to the datasource or entities and\n * properties at all, you can check {@link VirtualTable}\n *\n * @param fullPath\n * @param collection\n * @constructor\n * @group Components\n */\nexport const EntityCollectionView = React.memo(\n function EntityCollectionView<M extends Record<string, any>>({\n fullPath,\n parentCollectionIds,\n isSubCollection,\n className,\n ...collectionProp\n }: EntityCollectionViewProps<M>\n ) {\n\n const dataSource = useDataSource(collectionProp);\n const navigation = useNavigationController();\n const sideEntityController = useSideEntityController();\n const authController = useAuthController();\n const userConfigPersistence = useUserConfigurationPersistence();\n const analyticsController = useAnalyticsController();\n const customizationController = useCustomizationController();\n\n\n const containerRef = React.useRef<HTMLDivElement>(null);\n\n const collection = useMemo(() => {\n const userOverride = userConfigPersistence?.getCollectionConfig<M>(fullPath);\n return (userOverride ? mergeDeep(collectionProp, userOverride) : collectionProp) as EntityCollection<M>;\n }, [collectionProp, fullPath, userConfigPersistence?.getCollectionConfig]);\n\n const collectionRef = React.useRef(collection);\n useEffect(() => {\n collectionRef.current = collection;\n }, [collection]);\n\n const canCreateEntities = canCreateEntity(collection, authController, fullPath, null);\n const [selectedNavigationEntity, setSelectedNavigationEntity] = useState<Entity<M> | undefined>(undefined);\n const [deleteEntityClicked, setDeleteEntityClicked] = React.useState<Entity<M> | Entity<M>[] | undefined>(undefined);\n\n const [lastDeleteTimestamp, setLastDeleteTimestamp] = React.useState<number>(0);\n\n // number of entities in the collection\n const [docsCount, setDocsCount] = useState<number>(0);\n\n const unselectNavigatedEntity = useCallback(() => {\n const currentSelection = selectedNavigationEntity;\n setTimeout(() => {\n if (currentSelection === selectedNavigationEntity)\n setSelectedNavigationEntity(undefined);\n }, 2400);\n }, [selectedNavigationEntity]);\n\n const checkInlineEditing = useCallback((entity?: Entity<any>): boolean => {\n const collection = collectionRef.current;\n if (!canEditEntity(collection, authController, fullPath, entity ?? null)) {\n return false;\n }\n return collection.inlineEditing === undefined || collection.inlineEditing;\n }, [authController, fullPath]);\n\n const selectionEnabled = collection.selectionEnabled === undefined || collection.selectionEnabled;\n const hoverRow = !checkInlineEditing();\n\n const [popOverOpen, setPopOverOpen] = useState(false);\n\n const selectionController = useSelectionController<M>();\n const usedSelectionController = collection.selectionController ?? selectionController;\n const {\n selectedEntities,\n toggleEntitySelection,\n isEntitySelected,\n setSelectedEntities\n } = usedSelectionController;\n\n useEffect(() => {\n setDeleteEntityClicked(undefined);\n }, [selectedEntities]);\n\n const tableController = useDataSourceEntityCollectionTableController<M>({\n fullPath,\n collection: collectionRef.current,\n entitiesDisplayedFirst: [],\n lastDeleteTimestamp\n });\n\n const tableKey = React.useRef<string>(Math.random().toString(36));\n const popupCell = tableController.popupCell;\n\n const onPopupClose = useCallback(() => {\n tableController.setPopupCell?.(undefined);\n }, [tableController.setPopupCell]);\n\n const onEntityClick = useCallback((clickedEntity: Entity<M>) => {\n console.log(\"Entity clicked\", clickedEntity)\n const collection = collectionRef.current;\n setSelectedNavigationEntity(clickedEntity);\n analyticsController.onAnalyticsEvent?.(\"edit_entity_clicked\", {\n path: clickedEntity.path,\n entityId: clickedEntity.id\n });\n return sideEntityController.open({\n entityId: clickedEntity.id,\n path: clickedEntity.path,\n collection,\n updateUrl: true,\n onClose: unselectNavigatedEntity,\n });\n }, [unselectNavigatedEntity, sideEntityController]);\n\n const onNewClick = useCallback(() => {\n\n const collection = collectionRef.current;\n analyticsController.onAnalyticsEvent?.(\"new_entity_click\", {\n path: fullPath\n });\n sideEntityController.open({\n path: fullPath,\n collection,\n updateUrl: true,\n onClose: unselectNavigatedEntity,\n });\n }, [fullPath, sideEntityController]);\n\n const onMultipleDeleteClick = () => {\n analyticsController.onAnalyticsEvent?.(\"multiple_delete_dialog_open\", {\n path: fullPath\n });\n setDeleteEntityClicked(selectedEntities);\n };\n\n const internalOnEntityDelete = (_path: string, entity: Entity<M>) => {\n analyticsController.onAnalyticsEvent?.(\"single_entity_deleted\", {\n path: fullPath\n });\n setSelectedEntities((selectedEntities) => selectedEntities.filter((e) => e.id !== entity.id));\n setLastDeleteTimestamp(Date.now());\n };\n\n const internalOnMultipleEntitiesDelete = (_path: string, entities: Entity<M>[]) => {\n analyticsController.onAnalyticsEvent?.(\"multiple_entities_deleted\", {\n path: fullPath\n });\n setSelectedEntities([]);\n setDeleteEntityClicked(undefined);\n setLastDeleteTimestamp(Date.now());\n };\n\n let AddColumnComponent: React.ComponentType<{\n fullPath: string,\n parentCollectionIds: string[],\n collection: EntityCollection;\n }> | undefined\n\n // we are only using the first plugin that implements this\n if (customizationController?.plugins) {\n AddColumnComponent = customizationController.plugins.find(plugin => plugin.collectionView?.AddColumnComponent)?.collectionView?.AddColumnComponent;\n }\n\n const onCollectionModifiedForUser = useCallback((path: string, partialCollection: PartialEntityCollection<M>) => {\n if (userConfigPersistence) {\n const currentStoredConfig = userConfigPersistence.getCollectionConfig(path);\n const updatedConfig = mergeDeep(currentStoredConfig, partialCollection);\n userConfigPersistence.onCollectionModified(path, updatedConfig);\n }\n }, [userConfigPersistence]);\n\n const onColumnResize = useCallback(({\n width,\n key\n }: OnColumnResizeParams) => {\n\n const collection = collectionRef.current;\n // Only for property columns\n if (!getPropertyInPath(collection.properties, key)) return;\n const localCollection = buildPropertyWidthOverwrite(key, width);\n onCollectionModifiedForUser(fullPath, localCollection);\n }, [onCollectionModifiedForUser, fullPath]);\n\n const onSizeChanged = useCallback((size: CollectionSize) => {\n if (userConfigPersistence)\n onCollectionModifiedForUser(fullPath, { defaultSize: size })\n }, [onCollectionModifiedForUser, fullPath, userConfigPersistence]);\n\n const createEnabled = canCreateEntity(collection, authController, fullPath, null);\n\n const uniqueFieldValidator: UniqueFieldValidator = useCallback(\n ({\n name,\n value,\n property,\n entityId\n }) => dataSource.checkUniqueField(fullPath, name, value, entityId),\n [fullPath]);\n\n const onValueChange: OnCellValueChange<any, any> = ({\n fullPath,\n context,\n value,\n propertyKey,\n onValueUpdated,\n setError,\n entity,\n }) => {\n\n const updatedValues = setIn({ ...entity.values }, propertyKey, value);\n\n const saveProps: SaveEntityProps = {\n path: fullPath,\n entityId: entity.id,\n values: updatedValues,\n previousValues: entity.values,\n collection,\n status: \"existing\"\n };\n\n return saveEntityWithCallbacks({\n ...saveProps,\n collection,\n callbacks: collection.callbacks,\n dataSource,\n context,\n onSaveSuccess: () => onValueUpdated(),\n onSaveFailure: (e: Error) => {\n console.error(\"Save failure\");\n console.error(e);\n setError(e);\n }\n });\n\n };\n\n const resolvedFullPath = navigation.resolveAliasesFrom(fullPath);\n const resolvedCollection = useMemo(() => resolveCollection<M>({\n collection,\n path: fullPath,\n fields: customizationController.propertyConfigs\n }), [collection, fullPath]);\n\n const getPropertyFor = useCallback(({\n propertyKey,\n propertyValue,\n entity\n }: GetPropertyForProps<M>) => {\n let propertyOrBuilder: PropertyOrBuilder<any, M> | undefined = getPropertyInPath<M>(collection.properties, propertyKey);\n\n // we might not find the property in the collection if combining property builders and map spread\n if (!propertyOrBuilder) {\n // these 2 properties are coming from the resolved collection with default values\n propertyOrBuilder = getPropertyInPath<M>(resolvedCollection.properties, propertyKey);\n }\n\n return resolveProperty({\n propertyKey,\n propertyOrBuilder,\n path: fullPath,\n propertyValue,\n values: entity.values,\n entityId: entity.id,\n fields: customizationController.propertyConfigs\n });\n }, [collection.properties, customizationController.propertyConfigs, fullPath, resolvedCollection.properties]);\n\n const displayedColumnIds = useColumnIds(resolvedCollection, true);\n\n const additionalFields = useMemo(() => {\n const subcollectionColumns: AdditionalFieldDelegate<M, any>[] = collection.subcollections?.map((subcollection) => {\n return {\n key: getSubcollectionColumnId(subcollection),\n name: subcollection.name,\n width: 200,\n dependencies: [],\n Builder: ({ entity }) => (\n <Button color={\"primary\"}\n variant={\"outlined\"}\n startIcon={<KeyboardTabIcon size={\"small\"}/>}\n onClick={(event: any) => {\n event.stopPropagation();\n sideEntityController.open({\n path: fullPath,\n entityId: entity.id,\n selectedSubPath: subcollection.id ?? subcollection.path,\n collection,\n updateUrl: true,\n });\n }}>\n {subcollection.name}\n </Button>\n )\n };\n }) ?? [];\n\n const collectionGroupParentCollections: AdditionalFieldDelegate<M, any>[] = collection.collectionGroup\n ? [{\n key: COLLECTION_GROUP_PARENT_ID,\n name: \"Parent entities\",\n width: 260,\n dependencies: [],\n Builder: ({ entity }) => {\n const collectionsWithPath = navigation.getParentReferencesFromPath(entity.path);\n return (\n <>\n {collectionsWithPath.map((reference) => {\n return (\n <ReferencePreview\n key={reference.path + \"/\" + reference.id}\n reference={reference}\n size={\"tiny\"}/>\n );\n })}\n </>\n );\n }\n }]\n : [];\n\n return [\n ...(collection.additionalFields ?? []),\n ...subcollectionColumns,\n ...collectionGroupParentCollections\n ];\n }, [collection, fullPath, sideEntityController]);\n\n const updateLastDeleteTimestamp = useCallback(() => {\n setLastDeleteTimestamp(Date.now());\n }, []);\n\n const largeLayout = useLargeLayout();\n\n const getActionsForEntity = ({\n entity,\n customEntityActions\n }: {\n entity?: Entity<M>,\n customEntityActions?: EntityAction[]\n }): EntityAction[] => {\n const deleteEnabled = entity ? canDeleteEntity(collection, authController, fullPath, entity) : true;\n const actions: EntityAction[] = [editEntityAction];\n if (createEnabled)\n actions.push(copyEntityAction);\n if (deleteEnabled)\n actions.push(deleteEntityAction);\n if (customEntityActions)\n actions.push(...customEntityActions);\n return actions;\n };\n\n const getIdColumnWidth = () => {\n const entityActions = getActionsForEntity({});\n const collapsedActions = entityActions.filter(a => a.collapsed !== false);\n const uncollapsedActions = entityActions.filter(a => a.collapsed === false);\n const actionsWidth = uncollapsedActions.length * (largeLayout ? 40 : 30);\n return (largeLayout ? (80 + actionsWidth) : (70 + actionsWidth)) + (collapsedActions.length > 0 ? (largeLayout ? 40 : 30) : 0);\n };\n\n const tableRowActionsBuilder = ({\n entity,\n size,\n width,\n frozen\n }: {\n entity: Entity<any>,\n size: CollectionSize,\n width: number,\n frozen?: boolean\n }) => {\n\n const isSelected = isEntitySelected(entity);\n\n const actions = getActionsForEntity({\n entity,\n customEntityActions: collection.entityActions\n });\n\n return (\n <EntityCollectionRowActions\n entity={entity}\n width={width}\n frozen={frozen}\n isSelected={isSelected}\n selectionEnabled={selectionEnabled}\n size={size}\n highlightEntity={setSelectedNavigationEntity}\n unhighlightEntity={unselectNavigatedEntity}\n collection={collection}\n fullPath={fullPath}\n actions={actions}\n hideId={collection?.hideIdFromCollection}\n onCollectionChange={updateLastDeleteTimestamp}\n selectionController={usedSelectionController}\n />\n );\n\n };\n\n const title = <Popover\n open={popOverOpen}\n onOpenChange={setPopOverOpen}\n enabled={Boolean(collection.description)}\n trigger={<div className=\"flex flex-col items-start\">\n <Typography\n variant={\"subtitle1\"}\n className={`leading-none truncate max-w-[160px] lg:max-w-[240px] ${collection.description ? \"cursor-pointer\" : \"cursor-auto\"}`}\n onClick={collection.description\n ? (e) => {\n setPopOverOpen(true);\n e.stopPropagation();\n }\n : undefined}>\n {`${collection.name}`}\n </Typography>\n\n <EntitiesCount\n fullPath={fullPath}\n collection={collection}\n filter={tableController.filterValues}\n sortBy={tableController.sortBy}\n onCountChange={setDocsCount}\n />\n\n </div>}\n >\n\n {collection.description && <div className=\"m-4 text-gray-900 dark:text-white\">\n <Markdown source={collection.description}/>\n </div>}\n\n </Popover>;\n\n const buildAdditionalHeaderWidget = useCallback(({\n property,\n propertyKey,\n onHover\n }: {\n property: ResolvedProperty,\n propertyKey: string,\n onHover: boolean\n }) => {\n const collection = collectionRef.current;\n if (!customizationController.plugins)\n return null;\n return <>\n {customizationController.plugins.filter(plugin => plugin.collectionView?.HeaderAction)\n .map((plugin, i) => {\n const HeaderAction = plugin.collectionView!.HeaderAction!;\n return <HeaderAction\n onHover={onHover}\n key={`plugin_header_action_${i}`}\n propertyKey={propertyKey}\n property={property}\n fullPath={fullPath}\n collection={collection}\n parentCollectionIds={parentCollectionIds ?? []}/>;\n })}\n </>;\n }, [customizationController.plugins, fullPath, parentCollectionIds]);\n\n const addColumnComponentInternal = AddColumnComponent\n ? function () {\n if (typeof AddColumnComponent === \"function\")\n return <AddColumnComponent fullPath={fullPath}\n parentCollectionIds={parentCollectionIds ?? []}\n collection={collection}/>;\n return null;\n }\n : undefined;\n\n const {\n textSearchLoading,\n textSearchInitialised,\n onTextSearchClick,\n textSearchEnabled\n } = useTableSearchHelper({\n collection,\n fullPath: resolvedFullPath,\n parentCollectionIds\n });\n\n return (\n <div className={cn(\"overflow-hidden h-full w-full rounded-md\", className)}\n ref={containerRef}>\n <EntityCollectionTable\n key={`collection_table_${fullPath}`}\n additionalFields={additionalFields}\n tableController={tableController}\n displayedColumnIds={displayedColumnIds}\n onSizeChanged={onSizeChanged}\n onEntityClick={onEntityClick}\n onColumnResize={onColumnResize}\n onValueChange={onValueChange}\n tableRowActionsBuilder={tableRowActionsBuilder}\n uniqueFieldValidator={uniqueFieldValidator}\n title={title}\n selectionController={usedSelectionController}\n highlightedEntities={selectedNavigationEntity ? [selectedNavigationEntity] : []}\n defaultSize={collection.defaultSize}\n properties={resolvedCollection.properties}\n getPropertyFor={getPropertyFor}\n onTextSearchClick={textSearchInitialised ? undefined : onTextSearchClick}\n textSearchLoading={textSearchLoading}\n textSearchEnabled={textSearchEnabled}\n actions={<EntityCollectionViewActions\n parentCollectionIds={parentCollectionIds ?? []}\n collection={collection}\n tableController={tableController}\n onMultipleDeleteClick={onMultipleDeleteClick}\n onNewClick={onNewClick}\n path={fullPath}\n relativePath={collection.path}\n selectionController={usedSelectionController}\n selectionEnabled={selectionEnabled}\n collectionEntitiesCount={docsCount}\n />}\n emptyComponent={canCreateEntities && tableController.filterValues === undefined && tableController.sortBy === undefined\n ? <div className=\"flex flex-col items-center justify-center\">\n <Typography variant={\"subtitle2\"}>So empty...</Typography>\n <Button\n color={\"primary\"}\n variant={\"outlined\"}\n onClick={onNewClick}\n className=\"mt-4\"\n >\n <AddIcon/>\n Create your first entity\n </Button>\n </div>\n : <Typography variant={\"label\"}>No results with the applied filter/sort</Typography>\n }\n hoverRow={hoverRow}\n inlineEditing={checkInlineEditing()}\n AdditionalHeaderWidget={buildAdditionalHeaderWidget}\n AddColumnComponent={addColumnComponentInternal}\n getIdColumnWidth={getIdColumnWidth}\n additionalIDHeaderWidget={<EntityIdHeaderWidget\n path={fullPath}\n collection={collection}/>}\n />\n\n <PopupFormField\n key={`popup_form_${popupCell?.propertyKey}_${popupCell?.entity?.id}`}\n open={Boolean(popupCell)}\n onClose={onPopupClose}\n cellRect={popupCell?.cellRect}\n propertyKey={popupCell?.propertyKey}\n collection={collection}\n entity={popupCell?.entity}\n tableKey={tableKey.current}\n customFieldValidator={uniqueFieldValidator}\n path={resolvedFullPath}\n onCellValueChange={onValueChange}\n container={containerRef.current}/>\n\n {deleteEntityClicked &&\n <DeleteEntityDialog\n entityOrEntitiesToDelete={deleteEntityClicked}\n path={fullPath}\n collection={collection}\n callbacks={collection.callbacks}\n open={Boolean(deleteEntityClicked)}\n onEntityDelete={internalOnEntityDelete}\n onMultipleEntitiesDelete={internalOnMultipleEntitiesDelete}\n onClose={() => setDeleteEntityClicked(undefined)}/>}\n\n </div>\n );\n }, (a, b) => {\n return equal(a.fullPath, b.fullPath) &&\n equal(a.parentCollectionIds, b.parentCollectionIds) &&\n equal(a.isSubCollection, b.isSubCollection) &&\n equal(a.className, b.className) &&\n equal(a.properties, b.properties) &&\n equal(a.propertiesOrder, b.propertiesOrder) &&\n equal(a.hideIdFromCollection, b.hideIdFromCollection) &&\n equal(a.inlineEditing, b.inlineEditing) &&\n equal(a.selectionEnabled, b.selectionEnabled) &&\n equal(a.selectionController, b.selectionController) &&\n equal(a.Actions, b.Actions) &&\n equal(a.defaultSize, b.defaultSize) &&\n equal(a.textSearchEnabled, b.textSearchEnabled) &&\n equal(a.additionalFields, b.additionalFields) &&\n equal(a.forceFilter, b.forceFilter);\n }) as React.FunctionComponent<EntityCollectionViewProps<any>>\n\nfunction EntitiesCount({\n fullPath,\n collection,\n filter,\n sortBy,\n onCountChange\n }: {\n fullPath: string,\n collection: EntityCollection,\n filter?: FilterValues<any>,\n sortBy?: [string, \"asc\" | \"desc\"],\n onCountChange?: (count: number) => void,\n}) {\n\n const dataSource = useDataSource(collection);\n const navigation = useNavigationController();\n const [count, setCount] = useState<number | undefined>(undefined);\n const [error, setError] = useState<Error | undefined>(undefined);\n\n const sortByProperty = sortBy ? sortBy[0] : undefined;\n const currentSort = sortBy ? sortBy[1] : undefined;\n const resolvedPath = useMemo(() => navigation.resolveAliasesFrom(fullPath), [fullPath, navigation.resolveAliasesFrom]);\n\n useEffect(() => {\n if (dataSource.countEntities)\n dataSource.countEntities({\n path: resolvedPath,\n collection,\n filter,\n orderBy: sortByProperty,\n order: currentSort\n }).then(setCount).catch(setError);\n }, [fullPath, dataSource.countEntities, resolvedPath, collection, filter, sortByProperty, currentSort]);\n\n useEffect(() => {\n if (onCountChange) {\n onCountChange(count ?? 0);\n }\n }, [onCountChange, count]);\n\n if (error) {\n return null;\n }\n\n return <Typography\n className=\"w-full text-ellipsis block overflow-hidden whitespace-nowrap max-w-xs text-left w-fit-content\"\n variant={\"caption\"}\n color={\"secondary\"}>\n {count !== undefined ? `${count} entities` : <Skeleton className={\"w-full max-w-[80px] mt-1\"}/>}\n </Typography>;\n}\n\nfunction buildPropertyWidthOverwrite(key: string, width: number): PartialEntityCollection {\n if (key.includes(\".\")) {\n const [parentKey, ...childKey] = key.split(\".\");\n return { properties: { [parentKey]: buildPropertyWidthOverwrite(childKey.join(\".\"), width) } } as PartialEntityCollection;\n }\n return { properties: { [key]: { columnWidth: width } } } as PartialEntityCollection;\n}\n\nfunction EntityIdHeaderWidget({\n collection,\n path\n }: {\n collection: EntityCollection,\n path: string\n}) {\n const [openPopup, setOpenPopup] = React.useState(false);\n const [searchString, setSearchString] = React.useState(\"\");\n const sideEntityController = useSideEntityController();\n return (\n <Tooltip title={!openPopup ? \"Find by ID\" : undefined}>\n <Popover\n open={openPopup}\n onOpenChange={setOpenPopup}\n trigger={\n <IconButton size={\"small\"}>\n <SearchIcon size={\"small\"}/>\n </IconButton>\n }\n >\n <form noValidate={true}\n onSubmit={(e) => {\n e.preventDefault();\n if (!searchString) return;\n setOpenPopup(false);\n return sideEntityController.open({\n entityId: searchString,\n path,\n collection,\n updateUrl: true,\n });\n }}\n className={\"text-gray-900 dark:text-white w-96 max-w-full\"}>\n\n <div className=\"flex p-2 w-full gap-4\">\n <input\n autoFocus={openPopup}\n placeholder={\"Find entity by ID\"}\n // size={\"small\"}\n onChange={(e) => setSearchString(e.target.value)}\n value={searchString}\n className={\"flex-grow bg-transparent outline-none p-1\"}/>\n <Button variant={\"outlined\"}\n disabled={!searchString}\n type={\"submit\"}\n >Go</Button>\n </div>\n </form>\n </Popover>\n\n </Tooltip>\n );\n}\n","import { getIconForWidget } from \"../util\";\nimport { PropertyConfig } from \"../types\";\nimport { getDefaultFieldConfig } from \"../core\";\n\nexport function PropertyConfigBadge({ propertyConfig }: { propertyConfig: PropertyConfig | undefined }): React.ReactNode {\n const classes = \"h-8 w-8 p-1 rounded-full shadow text-white\";\n\n const defaultPropertyConfig = typeof propertyConfig?.property === \"object\" ? getDefaultFieldConfig(propertyConfig.property) : undefined;\n\n return <div\n className={classes}\n style={{\n background: propertyConfig?.color ?? defaultPropertyConfig?.color ?? \"#888\"\n }}>\n {propertyConfig?.Icon ? getIconForWidget(propertyConfig, \"medium\") : getIconForWidget(defaultPropertyConfig, \"medium\")}\n </div>\n}\n","import React from \"react\";\nimport { Link as ReactLink } from \"react-router-dom\";\nimport { Button, Typography } from \"@firecms/ui\";\n\nexport function NotFoundPage() {\n\n return (\n <div className=\"flex w-full h-full\">\n <div className=\"m-auto flex items-center flex-col\"\n >\n <Typography variant={\"h4\"} align={\"center\"}\n gutterBottom={true}>\n Page not found\n </Typography>\n <Typography align={\"center\"} gutterBottom={true}>\n This page does not exist or you may not have access to it\n </Typography>\n <Button\n variant={\"text\"}\n component={ReactLink}\n to={\"/\"}>Back to home</Button>\n </div>\n </div>\n );\n}\n","import React from \"react\";\n\nimport { Button, Dialog, DialogActions, DialogContent, LoadingButton, Typography } from \"@firecms/ui\";\n\nexport function DeleteConfirmationDialog({\n open,\n onAccept,\n onCancel,\n title,\n loading,\n body\n }: {\n open: boolean,\n onAccept: () => void,\n onCancel: () => void,\n loading?: boolean,\n title: React.ReactNode,\n body?: React.ReactNode,\n}) {\n return (\n <Dialog\n open={open}\n onOpenChange={(open) => !open ? onCancel() : undefined}\n >\n <DialogContent>\n <Typography variant={\"h6\"} className={\"mb-2\"}>{title}</Typography>\n {body}\n </DialogContent>\n\n <DialogActions>\n <Button\n variant={\"text\"}\n onClick={onCancel}\n autoFocus>Cancel</Button>\n\n <LoadingButton\n color=\"primary\"\n type=\"submit\"\n loading={loading}\n onClick={onAccept}\n >\n Ok\n </LoadingButton>\n </DialogActions>\n </Dialog>\n );\n}\n","import React from \"react\";\n\nexport function FireCMSLogo({\n width,\n height,\n className,\n style\n }: {\n width?: string,\n height?: string,\n className?: string,\n style?: React.CSSProperties\n}) {\n return (\n <svg\n width={width ?? \"100%\"} height={height ?? \"100%\"}\n viewBox=\"0 0 599 599\" version=\"1.1\"\n style={style}\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\">\n <defs>\n <radialGradient cx=\"28.6213569%\" cy=\"43.1133328%\"\n fx=\"28.6213569%\"\n fy=\"43.1133328%\" r=\"71.5003456%\"\n gradientTransform=\"translate(0.286214,0.431133),rotate(3.343450),scale(1.000000,0.996175),translate(-0.286214,-0.431133)\"\n id=\"radialGradient-1\">\n <stop stopColor=\"#FF5B79\" offset=\"0%\"/>\n <stop stopColor=\"#FA5574\" offset=\"28.0930803%\"/>\n <stop stopColor=\"#EC4C51\" offset=\"44.7242531%\"/>\n <stop stopColor=\"#9543C1\" offset=\"71.4578165%\"/>\n <stop stopColor=\"#3857B3\" offset=\"100%\"/>\n </radialGradient>\n <radialGradient cx=\"53.6205516%\" cy=\"47.2473036%\"\n fx=\"53.6205516%\"\n fy=\"47.2473036%\" r=\"50.8229649%\"\n gradientTransform=\"translate(0.536206,0.472473),rotate(90.000000),scale(1.000000,1.206631),translate(-0.536206,-0.472473)\"\n id=\"radialGradient-2\">\n <stop stopColor=\"#68294F\" stopOpacity=\"0\" offset=\"0%\"/>\n <stop stopColor=\"#5E2548\" stopOpacity=\"0.04641108\"\n offset=\"75.3503173%\"/>\n <stop stopColor=\"#0D060B\" stopOpacity=\"0.437431709\"\n offset=\"100%\"/>\n </radialGradient>\n <radialGradient cx=\"53.8605015%\" cy=\"48.1990423%\"\n fx=\"53.8605015%\"\n fy=\"48.1990423%\" r=\"59.9151549%\"\n gradientTransform=\"translate(0.538605,0.481990),rotate(180.000000),scale(1.000000,0.925027),translate(-0.538605,-0.481990)\"\n id=\"radialGradient-3\">\n <stop stopColor=\"#68294F\" stopOpacity=\"0\" offset=\"0%\"/>\n <stop stopColor=\"#5E2548\" stopOpacity=\"0.04641108\"\n offset=\"84.0867343%\"/>\n <stop stopColor=\"#FF0000\" stopOpacity=\"0.567324765\"\n offset=\"100%\"/>\n </radialGradient>\n </defs>\n <g id=\"Page-1\" stroke=\"none\" strokeWidth=\"1\" fill=\"none\"\n fillRule=\"evenodd\">\n <g id=\"firecms_logo\">\n <circle fill=\"url(#radialGradient-1)\" cx=\"299.5\"\n cy=\"299.5\"\n r=\"299.5\"/>\n <circle fill=\"url(#radialGradient-2)\" cx=\"299.5\"\n cy=\"299.5\"\n r=\"299.5\"/>\n <circle fill=\"url(#radialGradient-3)\" cx=\"299.5\"\n cy=\"299.5\"\n r=\"299.5\"/>\n </g>\n </g>\n </svg>\n );\n\n}\n","import React from \"react\";\n\nimport { Link as ReactLink } from \"react-router-dom\";\nimport { ErrorBoundary } from \"../components\";\nimport {\n Avatar,\n cn,\n DarkModeIcon,\n IconButton,\n LightModeIcon,\n LogoutIcon,\n Menu,\n MenuItem,\n Skeleton,\n Typography\n} from \"@firecms/ui\";\nimport { useAuthController, useLargeLayout, useModeController, useNavigationController } from \"../hooks\";\nimport { User } from \"../types\";\n\nexport type FireCMSAppBarProps<ADDITIONAL_PROPS = object> = {\n title: string;\n /**\n * A component that gets rendered on the upper side of the main toolbar\n */\n endAdornment?: React.ReactNode;\n\n startAdornment?: React.ReactNode;\n\n dropDownActions?: React.ReactNode;\n\n includeDrawer?: boolean;\n\n drawerOpen: boolean;\n\n className?: string;\n\n style?: React.CSSProperties;\n\n user?: User;\n} & ADDITIONAL_PROPS;\n\n/**\n * This component renders the main app bar of FireCMS.\n * You will likely not need to use this component directly.\n *\n * @param title\n * @param toolbarExtraWidget\n * @param drawerOpen\n * @constructor\n */\nexport const FireCMSAppBar = function FireCMSAppBar({\n title,\n endAdornment,\n startAdornment,\n drawerOpen,\n dropDownActions,\n includeDrawer,\n className,\n style,\n user: userProp\n }: FireCMSAppBarProps) {\n const navigation = useNavigationController();\n\n const authController = useAuthController();\n const {\n mode,\n toggleMode\n } = useModeController();\n\n const largeLayout = useLargeLayout();\n\n const user = userProp ?? authController.user;\n\n let avatarComponent: JSX.Element;\n if (user && user.photoURL) {\n avatarComponent = <Avatar\n src={user.photoURL}/>;\n } else if (user === undefined || authController.initialLoading) {\n avatarComponent = <div className={\"p-1 flex justify-center\"}>\n <Skeleton className={\"w-10 h-10 rounded-full\"}/>\n </div>;\n } else {\n const initial = user?.displayName\n ? user.displayName[0].toUpperCase()\n : (user?.email ? user.email[0].toUpperCase() : \"A\");\n avatarComponent = <Avatar>{initial}</Avatar>;\n }\n\n return (\n <div\n style={style}\n className={cn(\"pr-2\",\n {\n \"ml-[17rem]\": drawerOpen && largeLayout,\n \"ml-16\": includeDrawer && !(drawerOpen && largeLayout) && !startAdornment,\n \"h-16\": true,\n \"z-10\": largeLayout,\n \"transition-all\": true,\n \"ease-in\": true,\n \"duration-75\": true,\n \"w-full\": !includeDrawer,\n \"w-[calc(100%-64px)]\": includeDrawer && !(drawerOpen && largeLayout),\n \"w-[calc(100%-17rem)]\": includeDrawer && (drawerOpen && largeLayout),\n \"duration-150\": drawerOpen && largeLayout,\n fixed: true,\n },\n className)}>\n\n <div className=\"flex flex-row gap-2 px-4 h-full items-center\">\n\n {startAdornment}\n\n {navigation && <div className=\"mr-8 hidden lg:block\">\n <ReactLink\n className=\"visited:text-inherit visited:dark:text-inherit\"\n to={navigation?.basePath ?? \"/\"}\n >\n <Typography variant=\"subtitle1\"\n noWrap\n className={\"ml-2 !font-medium\"}>\n {title}\n </Typography>\n </ReactLink>\n </div>}\n\n <div className={\"flex-grow\"}/>\n\n {endAdornment &&\n <ErrorBoundary>\n {endAdornment}\n </ErrorBoundary>}\n\n <IconButton\n color=\"inherit\"\n aria-label=\"Open drawer\"\n onClick={toggleMode}\n size=\"large\">\n {mode === \"dark\"\n ? <DarkModeIcon/>\n : <LightModeIcon/>}\n </IconButton>\n\n <Menu trigger={avatarComponent}>\n {user && <div className={\"px-4 py-2 mb-2\"}>\n {user.displayName && <Typography variant={\"body1\"} color={\"secondary\"}>\n {user.displayName}\n </Typography>}\n {user.email && <Typography variant={\"body2\"} color={\"secondary\"}>\n {user.email}\n </Typography>}\n </div>}\n\n {dropDownActions}\n\n {!dropDownActions && <MenuItem onClick={authController.signOut}>\n <LogoutIcon/>\n Log Out\n </MenuItem>}\n\n </Menu>\n\n </div>\n </div>\n );\n}\n","import React, { useCallback, useEffect, useRef, useState } from \"react\";\n\nimport { DragDropContext, Draggable, DraggableProvided, Droppable } from \"@hello-pangea/dnd\";\n\nimport { getHashValue } from \"../util\";\nimport {\n AddIcon,\n Button,\n ContentCopyIcon,\n fieldBackgroundHoverMixin, HandleIcon,\n IconButton,\n Menu,\n MenuItem,\n RemoveIcon,\n Tooltip,\n useOutsideAlerter\n} from \"@firecms/ui\";\n\ninterface ArrayContainerProps<T> {\n droppableId: string;\n value: T[];\n addLabel: string;\n buildEntry: (index: number, internalId: number) => React.ReactNode;\n disabled?: boolean;\n size?: \"small\" | \"medium\";\n onInternalIdAdded?: (id: number) => void;\n includeAddButton?: boolean;\n newDefaultEntry: T;\n onValueChange: (value: T[]) => void\n}\n\nconst buildIdsMap = (value: any[]) =>\n value && Array.isArray(value) && value.length > 0\n ? value.map((v, index) => {\n if (!v) return {};\n return ({\n [getHashValue(v) + index]: getRandomId()\n });\n }).reduce((a, b) => ({ ...a, ...b }), {})\n : {}\n\n/**\n * @group Form custom fields\n */\nexport function ArrayContainer<T>({\n droppableId,\n addLabel,\n value,\n disabled = false,\n buildEntry,\n size = \"medium\",\n onInternalIdAdded,\n includeAddButton,\n newDefaultEntry,\n onValueChange\n }: ArrayContainerProps<T>) {\n\n const hasValue = value && Array.isArray(value) && value.length > 0;\n\n // Used to track the ids that have displayed the initial show animation\n const internalIdsRef = useRef<Record<string, number>>(buildIdsMap(value));\n\n const [internalIds, setInternalIds] = useState<number[]>(\n hasValue\n ? Object.values(internalIdsRef.current)\n : []);\n\n useEffect(() => {\n if (hasValue && value && value.length !== internalIds.length) {\n const newInternalIds = value.map((v, index) => {\n const hashValue = getHashValue(v) + index;\n if (hashValue in internalIdsRef.current) {\n return internalIdsRef.current[hashValue];\n } else {\n const newInternalId = getRandomId();\n internalIdsRef.current[hashValue] = newInternalId;\n return newInternalId;\n }\n });\n setInternalIds(newInternalIds);\n }\n }, [hasValue, internalIds.length, value]);\n\n const insertInEnd = (e: React.SyntheticEvent) => {\n e.preventDefault();\n if (disabled) return;\n const id = getRandomId();\n const newIds: number[] = [...internalIds, id];\n if (onInternalIdAdded)\n onInternalIdAdded(id);\n setInternalIds(newIds);\n onValueChange([...(value ?? []), newDefaultEntry]);\n };\n\n const remove = (index: number) => {\n const newIds = [...internalIds];\n newIds.splice(index, 1);\n setInternalIds(newIds);\n onValueChange(value.filter((_, i) => i !== index));\n };\n\n const copy = (index: number) => {\n const id = getRandomId();\n const copyingItem = value[index];\n const newIds: number[] = [\n ...internalIds.splice(0, index + 1),\n id,\n ...internalIds.splice(index + 1, internalIds.length - index - 1)];\n if (onInternalIdAdded)\n onInternalIdAdded(id);\n setInternalIds(newIds);\n // insert value in index + 1\n onValueChange([...value.slice(0, index + 1), copyingItem, ...value.slice(index + 1)]);\n };\n\n const onDragEnd = (result: any) => {\n // dropped outside the list\n if (!result.destination) {\n return;\n }\n const sourceIndex = result.source.index;\n const destinationIndex = result.destination.index;\n\n const newIds = [...internalIds];\n const temp = newIds[sourceIndex];\n newIds[sourceIndex] = newIds[destinationIndex];\n newIds[destinationIndex] = temp;\n setInternalIds(newIds);\n\n onValueChange(arrayMove(value, sourceIndex, destinationIndex));\n };\n\n return (\n <DragDropContext onDragEnd={onDragEnd}>\n <Droppable droppableId={droppableId}\n renderClone={(provided, snapshot, rubric) => {\n const index = rubric.source.index;\n const internalId = internalIds[index];\n return (\n <ArrayContainerItem\n provided={provided}\n internalId={internalId}\n index={index}\n size={size}\n disabled={disabled}\n buildEntry={buildEntry}\n remove={remove}\n copy={copy}\n isDragging={snapshot.isDragging}\n />\n );\n }}\n >\n {(droppableProvided, droppableSnapshot) => (\n <div\n {...droppableProvided.droppableProps}\n ref={droppableProvided.innerRef}>\n {hasValue && internalIds.map((internalId: number, index: number) => {\n return (\n <Draggable\n key={`array_field_${internalId}`}\n draggableId={`array_field_${internalId}`}\n isDragDisabled={disabled}\n index={index}>\n {(provided, snapshot) => (\n <ArrayContainerItem\n provided={provided}\n internalId={internalId}\n index={index}\n size={size}\n disabled={disabled}\n buildEntry={buildEntry}\n remove={remove}\n copy={copy}\n isDragging={snapshot.isDragging}\n />\n )}\n </Draggable>\n );\n })}\n\n {droppableProvided.placeholder}\n\n {includeAddButton && <div className=\"py-4 justify-center text-left\">\n <Button\n variant={\"text\"}\n size={size === \"small\" ? \"small\" : \"medium\"}\n color=\"primary\"\n disabled={disabled}\n startIcon={<AddIcon/>}\n onClick={insertInEnd}>\n {addLabel ?? \"Add\"}\n </Button>\n </div>}\n </div>\n )}\n </Droppable>\n </DragDropContext>\n );\n}\n\ntype ArrayContainerItemProps = {\n provided: DraggableProvided,\n index: number,\n internalId: number,\n size?: \"small\" | \"medium\",\n disabled: boolean,\n buildEntry: (index: number, internalId: number) => React.ReactNode,\n remove: (index: number) => void,\n copy: (index: number) => void,\n isDragging: boolean,\n};\n\nexport function ArrayContainerItem({\n provided,\n index,\n internalId,\n size,\n disabled,\n buildEntry,\n remove,\n copy,\n isDragging\n }: ArrayContainerItemProps) {\n\n const [onHover, setOnHover] = React.useState(false);\n const setOnHoverTrue = useCallback(() => setOnHover(true), []);\n const setOnHoverFalse = useCallback(() => setOnHover(false), []);\n\n return <div\n onMouseEnter={setOnHoverTrue}\n onMouseMove={setOnHoverTrue}\n onMouseLeave={setOnHoverFalse}\n ref={provided.innerRef}\n {...provided.draggableProps}\n style={provided.draggableProps.style}\n className={`${\n (isDragging || onHover) ? fieldBackgroundHoverMixin : \"\"\n } mb-1 rounded-md opacity-100`}\n >\n <div\n className=\"flex items-start\">\n <div className=\"flex-grow w-[calc(100%-48px)] text-text-primary dark:text-text-primary-dark\">\n {buildEntry(index, internalId)}\n </div>\n <ArrayItemOptions direction={size === \"small\" ? \"row\" : \"column\"}\n disabled={disabled}\n remove={remove}\n index={index}\n provided={provided}\n copy={copy}/>\n </div>\n </div>;\n}\n\n\nexport function ArrayItemOptions({\n direction,\n disabled,\n remove,\n index,\n provided,\n copy,\n }: {\n direction?: \"row\" | \"column\",\n disabled: boolean,\n remove: (index: number) => void,\n index: number,\n provided: any,\n copy: (index: number) => void\n}) {\n\n const [menuOpen, setMenuOpen] = useState(false);\n\n const iconRef = React.useRef<HTMLDivElement>(null);\n useOutsideAlerter(iconRef, () => setMenuOpen(false));\n\n return <div className={`pl-2 pt-1 pb-4 flex ${direction === \"row\" ? \"flex-row-reverse\" : \"flex-col\"} items-center`}\n ref={iconRef}\n {...provided.dragHandleProps}>\n <Tooltip\n delayDuration={400}\n open={menuOpen ? false : undefined}\n side={direction === \"column\" ? \"left\" : undefined}\n title=\"Drag to move. Click for more options\">\n\n <IconButton\n size=\"small\"\n disabled={disabled}\n onClick={() => setMenuOpen(true)}\n onDragStart={(e: any) => {\n setMenuOpen(false);\n }}\n className={`cursor-${disabled ? \"inherit\" : \"grab\"}`}>\n <HandleIcon/>\n </IconButton>\n\n <Menu\n portalContainer={iconRef.current}\n open={menuOpen}\n trigger={<div/>}>\n\n <MenuItem dense onClick={(e) => {\n setMenuOpen(false);\n remove(index);\n }}>\n <RemoveIcon size={\"small\"}/>\n Remove\n </MenuItem>\n <MenuItem dense onClick={() => {\n setMenuOpen(false);\n copy(index);\n }}>\n <ContentCopyIcon size={\"small\"}/>\n Copy\n </MenuItem>\n\n </Menu>\n\n </Tooltip>\n\n </div>;\n}\n\nfunction arrayMove(value: any[], sourceIndex: number, destinationIndex: number) {\n const result = Array.from(value);\n const [removed] = result.splice(sourceIndex, 1);\n result.splice(destinationIndex, 0, removed);\n return result;\n}\n\nexport function getRandomId() {\n return Math.floor(Math.random() * Math.floor(Number.MAX_SAFE_INTEGER));\n}\n","import React, { useCallback, useMemo } from \"react\";\n\nimport { Entity, EntityCollection, EntityReference, FilterValues } from \"../types\";\nimport { getReferenceFrom } from \"../util\";\nimport { PreviewSize, ReferencePreview } from \"../preview\";\nimport { useNavigationController, useReferenceDialog } from \"../hooks\";\nimport { Button, cn } from \"@firecms/ui\";\n\nexport type ReferenceWidgetProps<M extends Record<string, any>> = {\n name?: string,\n multiselect?: boolean,\n value: EntityReference | EntityReference[] | null,\n onReferenceSelected?: (params: {\n reference: EntityReference | null,\n entity: Entity<M> | null\n }) => void,\n onMultipleReferenceSelected?: (params: {\n references: EntityReference[] | null,\n entities: Entity<M>[] | null\n }) => void,\n path: string,\n disabled?: boolean,\n previewProperties?: string[];\n /**\n * Allow selection of entities that pass the given filter only.\n */\n forceFilter?: FilterValues<string>;\n size: PreviewSize;\n className?: string;\n};\n\n/**\n * This field allows selecting reference/s.\n */\nexport function ReferenceWidget<M extends Record<string, any>>({\n name,\n multiselect = false,\n path,\n disabled,\n value,\n onReferenceSelected,\n onMultipleReferenceSelected,\n previewProperties,\n forceFilter,\n size,\n className\n }: ReferenceWidgetProps<M>) {\n\n const navigationController = useNavigationController();\n\n const collection: EntityCollection | undefined = useMemo(() => {\n return navigationController.getCollection(path);\n }, [path, navigationController]);\n\n // if (!collection) {\n // throw Error(`Couldn't find the corresponding collection for the path: ${path}`);\n // }\n\n const onSingleEntitySelected = useCallback((entity: Entity<M> | null) => {\n if (disabled)\n return;\n if (onReferenceSelected) {\n const reference = entity ? getReferenceFrom(entity) : null;\n onReferenceSelected?.({ reference, entity });\n }\n }, [disabled, onReferenceSelected]);\n\n const onMultipleEntitiesSelected = useCallback((entities: Entity<M>[]) => {\n if (disabled)\n return;\n if (onMultipleReferenceSelected) {\n const references = entities ? entities.map(e => getReferenceFrom(e)) : null;\n onMultipleReferenceSelected({ references, entities });\n }\n }, [disabled, onReferenceSelected]);\n\n const referenceDialogController = useReferenceDialog({\n multiselect,\n path,\n collection,\n onSingleEntitySelected,\n onMultipleEntitiesSelected,\n forceFilter\n }\n );\n\n const clearValue = useCallback((e: React.MouseEvent) => {\n e.stopPropagation();\n if (multiselect) {\n onMultipleEntitiesSelected([]);\n } else {\n onSingleEntitySelected(null);\n }\n }, [onReferenceSelected]);\n\n let child: React.ReactNode;\n\n const onEntryClick = () => {\n if (disabled)\n return;\n referenceDialogController.open();\n };\n\n if (Array.isArray(value)) {\n child = <div className={\"flex flex-col gap-4\"}>\n {value.map((ref, index) => {\n return <ReferencePreview\n key={`reference_preview_${index}`}\n onClick={onEntryClick}\n reference={ref}\n disabled={disabled}\n previewProperties={previewProperties}\n size={size}/>\n })}\n </div>\n } else if (value?.isEntityReference && value?.isEntityReference()) {\n child = <ReferencePreview\n reference={value}\n onClick={onEntryClick}\n disabled={disabled}\n previewProperties={previewProperties}\n size={size}/>\n\n }\n return <div className={cn(\"text-sm font-medium text-gray-500\",\n \"min-w-80 flex flex-col gap-4\",\n \"relative transition-colors duration-200 ease-in rounded font-medium\",\n disabled ? \"bg-opacity-50\" : \"hover:bg-opacity-75\",\n \"text-opacity-50 dark:text-white dark:text-opacity-50\",\n className\n )}\n >\n\n {child}\n {!value && <div className=\"justify-center text-left\">\n <Button variant=\"outlined\"\n color=\"primary\"\n disabled={disabled}\n onClick={onEntryClick}>\n Edit {name}\n </Button>\n </div>}\n\n </div>;\n}\n","import React from \"react\";\n\nimport { coolIconKeys, debounce, Icon, IconButton, iconKeys, SearchBar, Tooltip } from \"@firecms/ui\";\nimport { icon_synonyms, iconsSearch } from \"../util\";\n\nconst UPDATE_SEARCH_INDEX_WAIT_MS = 220;\n\nif (process.env.NODE_ENV !== \"production\") {\n Object.keys(icon_synonyms).forEach((icon: string) => {\n if (!iconKeys.includes(icon)) {\n console.warn(`The icon ${icon} no longer exists. Remove it from \\`icon_synonyms\\``);\n }\n });\n}\n\nexport interface SearchIconsProps {\n selectedIcon?: string;\n onIconSelected?: (icon: string) => void;\n}\n\nexport function SearchIconsView({\n selectedIcon = \"\",\n onIconSelected\n }: SearchIconsProps) {\n const [keys, setKeys] = React.useState<string[] | null>(null);\n const [query, setQuery] = React.useState<string>(\"\");\n\n const updateSearchResults = React.useMemo(() =>\n debounce((value: string) => {\n if (!value || value === \"\") {\n setKeys(null);\n } else {\n const searchResult = iconsSearch.search(value);\n setKeys(searchResult.map((e: any) => e.key));\n }\n }, UPDATE_SEARCH_INDEX_WAIT_MS), []\n );\n\n React.useEffect(() => {\n updateSearchResults(query);\n return () => {\n updateSearchResults.clear();\n };\n }, [query, updateSearchResults]);\n\n const icons = keys === null ? coolIconKeys : keys;\n\n return (\n <>\n <SearchBar\n autoFocus\n innerClassName={\"w-full sticky top-0 z-10\"}\n onTextSearch={(value?: string) => setQuery(value ?? \"\")}\n placeholder=\"Search for more icons…\"\n />\n\n <div className={\"flex max-w-full flex-wrap mt-4\"}>\n {icons.map((icon: string) => {\n return (\n <Tooltip title={icon} key={icon}>\n <IconButton\n shape={\"square\"}\n toggled={selectedIcon === icon}\n onClick={onIconSelected ? () => onIconSelected(icon) : undefined}\n className=\"box-content m-1\"\n >\n <Icon iconKey={icon} size={24}/>\n </IconButton>\n </Tooltip>\n );\n })}\n </div>\n </>\n );\n}\n","import { Typography } from \"@firecms/ui\";\n\nexport function FieldCaption({\n error,\n children\n }: { error?: boolean, children?: React.ReactNode }) {\n if (!children) return null;\n return (\n <Typography variant={\"caption\"} color={error ? \"error\" : \"secondary\"} className={\"ml-3.5 mt-0.5\"}>\n {children}\n </Typography>\n );\n}\n","import { useSideDialogsController } from \"./useSideDialogsController\";\nimport { ReferenceSelectionInnerProps, ReferenceSelectionTable } from \"../components\";\nimport { useCallback } from \"react\";\nimport { useNavigationController } from \"./useNavigationController\";\n\n/**\n * This hook is used to open a side dialog that allows the selection\n * of entities under a given path.\n * You can use it in custom views for selecting entities.\n * You need to specify the path of the target collection at least.\n * If your collection is not defined in your top collection configuration\n * (in your `FireCMS` component), you need to specify explicitly.\n * This is the same hook used internally when a reference property is defined.\n * @group Hooks and utilities\n */\nexport function useReferenceDialog<M extends Record<string, any>>(referenceDialogProps: Omit<ReferenceSelectionInnerProps<M>, \"path\"> & {\n path?: string | false;\n onClose?: () => void;\n}): { open: () => void; close: () => void } {\n\n const navigation = useNavigationController();\n const sideDialogsController = useSideDialogsController();\n\n const open = useCallback(() => {\n if (referenceDialogProps.path) {\n let usedCollection = referenceDialogProps.collection;\n if (!usedCollection)\n usedCollection = navigation.getCollection(referenceDialogProps.path);\n if (!usedCollection)\n throw Error(\"Not able to resolve the collection in useReferenceDialog. Make sure a collection is registered in path \" + referenceDialogProps.path);\n sideDialogsController.open({\n key: `reference_${referenceDialogProps.path}`,\n component:\n <ReferenceSelectionTable\n collection={usedCollection}\n {...referenceDialogProps as ReferenceSelectionInnerProps<M>}/>,\n width: \"90vw\",\n onClose: () => {\n referenceDialogProps.onClose?.();\n }\n });\n } else {\n throw Error(\"useReferenceDialog: You are trying to open a reference dialog, but have not declared the `path`\")\n }\n }, [navigation, referenceDialogProps, sideDialogsController]);\n\n const close = useCallback(() => {\n sideDialogsController.close();\n }, [sideDialogsController]);\n\n return {\n open,\n close\n }\n\n}\n","import { useEffect } from \"react\";\n\nconst fireCMSLogo = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAASAAAAEgARslrPgAAB9pJREFUWMONl12obVUVx39jzLk+9j7nHq9y1QT1qpcbSIaXQFGs24PQl3HroSQyqHwJFJF6qaceCsqQoJdELHoIC6EeJCSKsi/TFLGozGsKXksljRLxnrP3WmvOOUYPa+19zsmPWpux5pxrzTX///Exx5hb+B/X1y+/nuIlVKF5m0v1YbQ55tIcKTQXFerNQkumOZ1oTiXCqUH8saR+74L8ZIWWux7+7JuuL2/04s5jJyhWQlXV71KtbhCtr1WtD6s0KlrjNBRaEi3JGzpv6bymQ0sn9mwv9otB7Ls7kn9Xo+U7D9z8/xG4+bz3cs35SjE/HEK8NWr8RBOrs+tQUUlEtAYaijRkbxmY0fuMzucsfcbSWnZQtiWxJL3Uid09iH0jIM8/1f+d3/zuS29M4PvHrmG+cZA8dMdjiLfNYrx6owrMVKlVUQkgkeI1iYbBJ3A2WPpKNtnx+UQisy29L0gPDGKfrwkPn2bJPfd/Zo0ZVp0fvOOdnLGxheX+A/Mq3nGwqS8/q645o4psxkgbhFqdSgqVJKIkghgqjuDoWh+dlm1AI0gUC3o4C9d04idbmZ06euQDPPHMj3YJ3HnkrZx98Fys2PFZ1dxxsJkdPbOecaBqmcWGqBVBIkEiKkoQJ5IJJBTbY8aRgBMwjxgVJoJJwDScnYUrOy2PBamfv/CS4zz9zE+IAIfPuQQzPzyrmq9u1e3RM+qWeaipNCCiE4DjbjgF94xZQj2htpjeK84ImqlIUpO9JllgEKgJDFpfOoh8paN8chbOeQ4g/OTq97PdLXSz3fjiVjO7/sx6g804ow41QWuCrjQPBB3bkZQgAkpBJOMojmIEjIgRKV6RpaYIZHGKQlK5OIv0L8bul8eOfsxjDJGD8613z6rmhq1qxkY1o9YKFUFEEED2xqoE1MNoWgPBwQZMl2SrSbQM9NQyUMlA5S3Rlcqd6E50RdRvPMvn9yE8qP9+9WWtQvXxzdic8xrwPaJrUYJGoq4sVBM1Ukuiln4UBipJVJrGoHUhrARB0XMQ/cizbSd61uaZlzUhXjuvWmqt9oOyAmUPEabnkSDV2j0Rp2YgksZdQpoCtRBwAiN4cKYdw4m3pNnbY9Tw4SZUh9tQEda+ld1WpmThgoivU8fYDbgEggRcleiZ6BOoFNRXLQQX1Eelggsgh8GPx6DhWB2iRgkj2OTuVX8dBzJtMx93BAKK4hIwUUSEID4BGspecWTfDwSCw+UxqByJoqPf9+xmYWQg7H3u+5Poyk3o5BZDxRBxxH29fdkF3YcBXKHgF+m+hLxn4OvbnnbPzMkjsm/+f5cXec2ye6ZfpO6+OX7pE8TqPj1zcN/7Zu8CDm44Bu6skrKjuOs0FlxWCJNMYxMOqLlR3DAvsAKaZo6t7+u7r6nhjN/5RKIQKESKhykhjeIINgJi+0m4Fiuns2WKZQybtJ2AfAWzGu/ayt0wz5gXimeKQyKSPI4kiCMhDxSgyLiOiY9kxnW2NVs+1ZeBbAmzhLmtgd0d8z1k1mIUTxQbKD5gnkmuDN6QvCF5TaIie0UmkIU1id3WcfwZHUo61eWB3gayDdOiZR+JXUuMWmcbyGWcny2RzOi8obeWwRsGrxm8JlGPBHCyOJmpJkwkHHs09pnfL1L60KLqtBKZtprhU+lVmSq9+xRsBfOMW6L4QLFM7zWdz+l8Ru8tA+10YKlJIiSxkcC6dQqlmJc/xaHIvTuZT7UpHalFUHEqL6iGsfKtM8FEzMdy7J4oXui9mk5CczpGErtEKgacQUZJE3gSwzw/i+dfx2G7e6IcOPALCXIkakGkYx4iwceyq+uENPp+RSI7DN7Q+5ylb7JgJLH0+XRGbOlRerWJwNgmnOwJ83Tvq/7KX2KZb1nJfnfp5YRoda7hFC/MQyGI7Mteow2E4pHkDT2zyfS758HV4bSjolOjF2PYS4KBbN2L5vmHZ7DpsWQnDsvfLj1+Lwufy9LSO2y5M1Mnik8OEJxAoSJRk7xhoKX3+URiztI3WPgGS2/p1OnE6CcSvRQGH+htQfH07dPSP7Lp9ajcNy+9DnG/oMT67qqZHz/QtGxVyjworQqVCIjiPiaaTD1ttZZ+fTIeCXQ+Y6HCQm0tO5LYpmfHlyy9/1nCPi3ICw/99JbxUHrdvxr6Q4depdhTfeGapVeH+imKxwhv6ZnR+5zeN0aNGU2+ZIPON0cX0LBQYSnGQgsLSSzoWdiCHVvQ2fLP2fMtwf2vDz50K6TpVPxj/sn7Ni5iu9l6Tof+yd78yoWFQ0uvWYvVLK1h6e34B8RnY9DZnIW3LAijxpLYkZ6Fd+z4km3bYcd2WNry8ezppsZ5ZMd2+MfTv3xtjbr9/PfwyoFDzPvtq7I2t+Vq/m6pt4hxThVaojao1CANRkORmkwkiTCI00thKYWOzJJR+6V1JE8/z2JfqGgfW9jLPPLg7a9Xe8frHs7j5MVXESxfmLS5KYXmxhQ3z/a4icQNRFtEGlwjJkoRIamTmIKNTE+it57kw0sF+1ah3CkSXkiPf42Htl+3WL/2+vIFJ6ishJ3QXD1o9dEhVCcGbS7ModUcakwrigaKChkoYmQK2XMp5L8V/F7DfuDePYrEcv8f7npdnDcksEvkg9RewquhuayTcHzQeCyJXpFVD2fRzSxCFtkuwqks8mjB/ujYr9y6k0gs9528503X/w/F3eUgyIBI4wAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAyMS0wNS0xMFQxOToyODozMyswMDowMEzeSx4AAAAldEVYdGRhdGU6bW9kaWZ5ADIwMjEtMDUtMTBUMTk6Mjg6MzMrMDA6MDA9g/OiAAAARnRFWHRzb2Z0d2FyZQBJbWFnZU1hZ2ljayA2LjcuOC05IDIwMTQtMDUtMTIgUTE2IGh0dHA6Ly93d3cuaW1hZ2VtYWdpY2sub3Jn3IbtAAAAABh0RVh0VGh1bWI6OkRvY3VtZW50OjpQYWdlcwAxp/+7LwAAABh0RVh0VGh1bWI6OkltYWdlOjpoZWlnaHQAMTkyDwByhQAAABd0RVh0VGh1bWI6OkltYWdlOjpXaWR0aAAxOTLTrCEIAAAAGXRFWHRUaHVtYjo6TWltZXR5cGUAaW1hZ2UvcG5nP7JWTgAAABd0RVh0VGh1bWI6Ok1UaW1lADE2MjA2NzQ5MTMk8oswAAAAD3RFWHRUaHVtYjo6U2l6ZQAwQkKUoj7sAAAAVnRFWHRUaHVtYjo6VVJJAGZpbGU6Ly8vbW50bG9nL2Zhdmljb25zLzIwMjEtMDUtMTAvOGIxNDNhYjgwODhkMjBlZThkYmUzOTFhN2NkNmQ3NmQuaWNvLnBuZ9msgG0AAAAASUVORK5CYII=\\n\";\n\n/**\n * Internal hook to handle the browser title and icon\n * @param name\n * @param logo\n */\nexport function useBrowserTitleAndIcon(name: string, logo?: string) {\n useEffect(() => {\n if (document) {\n document.title = `${name} - FireCMS`;\n let link = document.querySelector(\"link[rel~='icon']\");\n if (!link) {\n link = document.createElement(\"link\");\n // @ts-ignore\n link.rel = \"icon\";\n document.getElementsByTagName(\"head\")[0].appendChild(link);\n }\n // @ts-ignore\n link.href = logo ?? fireCMSLogo;\n }\n }, [name, logo]);\n}\n","import { EntityCollection, EntityReference } from \"../types\";\nimport { getCollectionPathsCombinations, removeInitialAndTrailingSlashes } from \"./navigation_utils\";\n\nexport function getParentReferencesFromPath(props: {\n path: string,\n collections: EntityCollection[] | undefined,\n currentFullPath?: string,\n}): EntityReference [] {\n\n const {\n path,\n collections = [],\n currentFullPath,\n } = props;\n\n const subpaths = removeInitialAndTrailingSlashes(path).split(\"/\");\n const subpathCombinations = getCollectionPathsCombinations(subpaths);\n\n const result: EntityReference[] = [];\n for (let i = 0; i < subpathCombinations.length; i++) {\n const subpathCombination = subpathCombinations[i];\n\n const collection: EntityCollection<any> | undefined = collections && collections.find((entry) => entry.id === subpathCombination || entry.path === subpathCombination);\n\n if (collection) {\n const pathOrAlias = collection.id ?? collection.path;\n const collectionPath = currentFullPath && currentFullPath.length > 0\n ? (currentFullPath + \"/\" + pathOrAlias)\n : pathOrAlias;\n\n const restOfThePath = removeInitialAndTrailingSlashes(removeInitialAndTrailingSlashes(path).replace(subpathCombination, \"\"));\n const nextSegments = restOfThePath.length > 0 ? restOfThePath.split(\"/\") : [];\n if (nextSegments.length > 0) {\n const entityId = nextSegments[0];\n const fullPath = collectionPath + \"/\" + entityId;\n result.push(new EntityReference(entityId, collectionPath));\n if (nextSegments.length > 1) {\n const newPath = nextSegments.slice(1).join(\"/\");\n if (!collection) {\n throw Error(\"collection not found resolving path: \" + collection);\n }\n if (collection.subcollections) {\n result.push(...getParentReferencesFromPath({\n path: newPath,\n collections: collection.subcollections,\n currentFullPath: fullPath\n }));\n }\n }\n }\n break;\n }\n\n }\n return result;\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport equal from \"react-fast-compare\"\n\nimport {\n AuthController,\n CMSView,\n CMSViewsBuilder,\n DataSourceDelegate,\n EntityCollection,\n EntityCollectionsBuilder,\n EntityReference,\n NavigationController,\n PermissionsBuilder,\n TopNavigationEntry,\n TopNavigationResult,\n User,\n UserConfigurationPersistence\n} from \"../types\";\nimport {\n applyPermissionsFunctionIfEmpty,\n getCollectionByPathOrId,\n mergeDeep,\n removeInitialAndTrailingSlashes,\n resolveCollectionPathIds,\n resolvePermissions\n} from \"../util\";\nimport { getParentReferencesFromPath } from \"../util/parent_references_from_path\";\n\nconst DEFAULT_BASE_PATH = \"/\";\nconst DEFAULT_COLLECTION_PATH = \"/c\";\n\ntype BuildNavigationContextProps<EC extends EntityCollection, UserType extends User> = {\n basePath?: string,\n baseCollectionPath?: string,\n authController: AuthController<UserType>;\n collections?: EC[] | EntityCollectionsBuilder<EC>;\n collectionPermissions?: PermissionsBuilder;\n views?: CMSView[] | CMSViewsBuilder;\n adminViews?: CMSView[] | CMSViewsBuilder;\n viewsOrder?: string[];\n userConfigPersistence?: UserConfigurationPersistence;\n dataSourceDelegate: DataSourceDelegate;\n /**\n * Use this method to inject collections to the CMS.\n * You receive the current collections as a parameter, and you can return\n * a new list of collections.\n * @see {@link joinCollectionLists}\n * @param collections\n */\n injectCollections?: (collections: EntityCollection[]) => EntityCollection[];\n};\n\nexport function useBuildNavigationController<EC extends EntityCollection, UserType extends User>(props: BuildNavigationContextProps<EC, UserType>): NavigationController {\n const {\n basePath = DEFAULT_BASE_PATH,\n baseCollectionPath = DEFAULT_COLLECTION_PATH,\n authController,\n collections: collectionsProp,\n collectionPermissions,\n views: viewsProp,\n adminViews: adminViewsProp,\n viewsOrder,\n userConfigPersistence,\n dataSourceDelegate,\n injectCollections\n } = props;\n\n const collectionsRef = useRef<EntityCollection[] | null>();\n const [collections, setCollections] = useState<EntityCollection[] | undefined>();\n const [views, setViews] = useState<CMSView[] | undefined>();\n const [adminViews, setAdminViews] = useState<CMSView[] | undefined>();\n const [initialised, setInitialised] = useState<boolean>(false);\n\n const [topLevelNavigation, setTopLevelNavigation] = useState<TopNavigationResult | undefined>(undefined);\n const [navigationLoading, setNavigationLoading] = useState<boolean>(true);\n const [navigationLoadingError, setNavigationLoadingError] = useState<Error | undefined>(undefined);\n\n const cleanBasePath = removeInitialAndTrailingSlashes(basePath);\n const cleanBaseCollectionPath = removeInitialAndTrailingSlashes(baseCollectionPath);\n\n const homeUrl = cleanBasePath ? `/${cleanBasePath}` : \"/\";\n\n const fullCollectionPath = cleanBasePath ? `/${cleanBasePath}/${cleanBaseCollectionPath}` : `/${cleanBaseCollectionPath}`;\n\n const buildCMSUrlPath = useCallback((path: string): string => cleanBasePath ? `/${cleanBasePath}/${encodePath(path)}` : `/${encodePath(path)}`,\n [cleanBasePath]);\n\n const buildUrlCollectionPath = useCallback((path: string): string => `${removeInitialAndTrailingSlashes(baseCollectionPath)}/${encodePath(path)}`,\n [baseCollectionPath]);\n\n const computeTopNavigation = useCallback((collections: EntityCollection[], views: CMSView[], adminViews: CMSView[], viewsOrder?: string[]): TopNavigationResult => {\n let navigationEntries: TopNavigationEntry[] = [\n ...(collections ?? []).map(collection => (!collection.hideFromNavigation\n ? ({\n url: buildUrlCollectionPath(collection.id ?? collection.path),\n type: \"collection\",\n name: collection.name.trim(),\n path: collection.id ?? collection.path,\n collection,\n description: collection.description?.trim(),\n group: collection.group?.trim() ?? \"Views\"\n } satisfies TopNavigationEntry)\n : undefined))\n .filter(Boolean) as TopNavigationEntry[],\n ...(views ?? []).map(view =>\n !view.hideFromNavigation\n ? ({\n url: buildCMSUrlPath(Array.isArray(view.path) ? view.path[0] : view.path),\n name: view.name.trim(),\n type: \"view\",\n path: view.path,\n view,\n description: view.description?.trim(),\n group: view.group?.trim() ?? \"Views\"\n }satisfies TopNavigationEntry)\n : undefined)\n .filter(Boolean) as TopNavigationEntry[],\n ...(adminViews ?? []).map(view =>\n !view.hideFromNavigation\n ? ({\n url: buildCMSUrlPath(Array.isArray(view.path) ? view.path[0] : view.path),\n name: view.name.trim(),\n type: \"admin\",\n path: view.path,\n view,\n description: view.description?.trim(),\n group: \"Admin\"\n } satisfies TopNavigationEntry)\n : undefined)\n .filter(Boolean) as TopNavigationEntry[]\n ];\n\n if (viewsOrder) {\n navigationEntries = navigationEntries.sort((a, b) => {\n const aIndex = viewsOrder.indexOf(a.path);\n const bIndex = viewsOrder.indexOf(b.path);\n if (aIndex === -1 && bIndex === -1) {\n return 0;\n }\n if (aIndex === -1) {\n return 1;\n }\n if (bIndex === -1) {\n return -1;\n }\n return aIndex - bIndex;\n });\n }\n\n const groups: string[] = Object.values(navigationEntries)\n .map(e => e.group)\n .filter(Boolean)\n .filter((value, index, array) => array.indexOf(value) === index) as string[];\n\n return {\n navigationEntries,\n groups\n };\n }, [buildCMSUrlPath, buildUrlCollectionPath]);\n\n const refreshNavigation = useCallback(async () => {\n\n if (authController.initialLoading)\n return;\n\n try {\n const [resolvedCollections = [], resolvedViews, resolvedAdminViews = []] = await Promise.all([\n resolveCollections(collectionsProp, collectionPermissions, authController, dataSourceDelegate, injectCollections),\n resolveCMSViews(viewsProp, authController, dataSourceDelegate),\n resolveCMSViews(adminViewsProp, authController, dataSourceDelegate)\n ]\n );\n if (\n !equal(collectionsRef.current, resolvedCollections) ||\n !equal(views, resolvedViews) ||\n !equal(adminViews, resolvedAdminViews) ||\n !equal(topLevelNavigation, computeTopNavigation(resolvedCollections, resolvedViews, resolvedAdminViews, viewsOrder))\n ) {\n collectionsRef.current = resolvedCollections;\n setCollections(resolvedCollections);\n setViews(resolvedViews);\n setAdminViews(resolvedAdminViews);\n setTopLevelNavigation(computeTopNavigation(resolvedCollections ?? [], resolvedViews, resolvedAdminViews, viewsOrder));\n }\n } catch (e) {\n console.error(e);\n setNavigationLoadingError(e as any);\n }\n\n setNavigationLoading(false);\n setInitialised(true);\n }, [collectionsProp, collectionPermissions, authController.user, authController.initialLoading, viewsProp, adminViewsProp, computeTopNavigation, injectCollections]);\n\n useEffect(() => {\n refreshNavigation();\n }, [refreshNavigation]);\n\n const getCollection = useCallback(<EC extends EntityCollection>(\n idOrPath: string,\n entityId?: string,\n includeUserOverride = false\n ): EC | undefined => {\n\n if (!collections)\n return undefined;\n\n const baseCollection = getCollectionByPathOrId(removeInitialAndTrailingSlashes(idOrPath), collections);\n\n const userOverride = includeUserOverride ? userConfigPersistence?.getCollectionConfig(idOrPath) : undefined;\n\n const overriddenCollection = baseCollection ? mergeDeep(baseCollection, userOverride) : undefined;\n\n let result: Partial<EntityCollection> | undefined = overriddenCollection;\n\n if (overriddenCollection) {\n const subcollections = overriddenCollection.subcollections;\n const callbacks = overriddenCollection.callbacks;\n const permissions = overriddenCollection.permissions;\n result = {\n ...result,\n subcollections: result?.subcollections ?? subcollections,\n callbacks: result?.callbacks ?? callbacks,\n permissions: result?.permissions ?? permissions\n };\n }\n\n if (!result) return undefined;\n\n return { ...overriddenCollection, ...result } as EC;\n\n }, [\n basePath,\n baseCollectionPath,\n collections\n ]);\n\n const getCollectionFromPaths = useCallback(<EC extends EntityCollection>(pathSegments: string[]): EC | undefined => {\n let currentCollections = collections;\n if (!currentCollections)\n throw Error(\"Collections have not been initialised yet\");\n\n for (let i = 0; i < pathSegments.length; i++) {\n const pathSegment = pathSegments[i];\n const collection: EntityCollection | undefined = currentCollections!.find(c => c.id === pathSegment || c.path === pathSegment);\n if (!collection)\n return undefined;\n currentCollections = collection.subcollections;\n if (i === pathSegments.length - 1)\n return collection as EC;\n }\n\n return undefined;\n\n }, [collections]);\n\n const getCollectionFromIds = useCallback(<EC extends EntityCollection>(ids: string[]): EC | undefined => {\n let currentCollections = collections;\n if (!currentCollections)\n throw Error(\"Collections have not been initialised yet\");\n\n for (let i = 0; i < ids.length; i++) {\n const id = ids[i];\n const collection: EntityCollection | undefined = currentCollections!.find(c => c.id === id);\n if (!collection)\n return undefined;\n currentCollections = collection.subcollections;\n if (i === ids.length - 1)\n return collection as EC;\n }\n\n return undefined;\n\n }, [collections]);\n\n const isUrlCollectionPath = useCallback(\n (path: string): boolean => removeInitialAndTrailingSlashes(path + \"/\").startsWith(removeInitialAndTrailingSlashes(fullCollectionPath) + \"/\"),\n [fullCollectionPath]);\n\n const urlPathToDataPath = useCallback((path: string): string => {\n if (path.startsWith(fullCollectionPath))\n return path.replace(fullCollectionPath, \"\");\n throw Error(\"Expected path starting with \" + fullCollectionPath);\n }, [fullCollectionPath]);\n\n const buildUrlEditCollectionPath = useCallback(({\n path\n }: {\n path: string\n }): string => {\n return `s/edit/${encodePath(path)}`;\n },\n []);\n\n const resolveAliasesFrom = useCallback((path: string): string => {\n if (!collections)\n throw Error(\"Collections have not been initialised yet\");\n return resolveCollectionPathIds(path, collections);\n }, [collections]);\n\n const getAllParentReferencesForPath = useCallback((path: string): EntityReference[] => {\n return getParentReferencesFromPath({\n path,\n collections\n });\n }, [collections]);\n\n const getParentCollectionIds = useCallback((path: string): string[] => {\n\n const strings = path.split(\"/\");\n const oddPathSegments = strings.filter((_, i) => i % 2 === 0);\n oddPathSegments.pop();\n\n const result: string[][] = [];\n\n for (let i = 1; i <= oddPathSegments.length; i++) {\n result.push(oddPathSegments.slice(0, i));\n }\n\n // for each odd path segment, get the collection\n return result.map(r => getCollectionFromPaths(r)?.id).filter(Boolean) as string[];\n }, [getAllParentReferencesForPath])\n\n const convertIdsToPaths = useCallback((ids: string[]): string[] => {\n let currentCollections = collections;\n const paths: string[] = [];\n for (let i = 0; i < ids.length; i++) {\n const id = ids[i];\n const collection: EntityCollection | undefined = currentCollections!.find(c => c.id === id);\n if (!collection)\n throw Error(`Collection with id ${id} not found`);\n paths.push(collection.path);\n currentCollections = collection.subcollections;\n }\n return paths;\n }\n , [getCollectionFromIds]);\n\n return {\n collections,\n views,\n adminViews,\n loading: !initialised || navigationLoading,\n navigationLoadingError,\n homeUrl,\n basePath,\n baseCollectionPath,\n initialised,\n getCollection,\n getCollectionFromPaths,\n getCollectionFromIds,\n isUrlCollectionPath,\n urlPathToDataPath,\n buildUrlCollectionPath,\n buildUrlEditCollectionPath,\n buildCMSUrlPath,\n resolveAliasesFrom,\n topLevelNavigation,\n refreshNavigation,\n getParentReferencesFromPath: getAllParentReferencesForPath,\n getParentCollectionIds,\n convertIdsToPaths\n };\n}\n\nexport function getSidePanelKey(path: string, entityId?: string) {\n if (entityId)\n return `${removeInitialAndTrailingSlashes(path)}/${removeInitialAndTrailingSlashes(entityId)}`;\n else\n return removeInitialAndTrailingSlashes(path);\n}\n\nfunction encodePath(input: string) {\n return encodeURIComponent(removeInitialAndTrailingSlashes(input))\n .replaceAll(\"%2F\", \"/\")\n .replaceAll(\"%23\", \"#\");\n}\n\nfunction filterOutNotAllowedCollections(resolvedCollections: EntityCollection[], authController: AuthController<User>): EntityCollection[] {\n return resolvedCollections\n .filter((c) => {\n if (!c.permissions) return true;\n const resolvedPermissions = resolvePermissions(c, authController, c.path, null)\n return resolvedPermissions?.read !== false;\n })\n .map((c) => {\n if (!c.subcollections) return c;\n return {\n ...c,\n subcollections: filterOutNotAllowedCollections(c.subcollections, authController)\n }\n });\n}\n\nasync function resolveCollections(collections: undefined | EntityCollection[] | EntityCollectionsBuilder<any>,\n collectionPermissions: PermissionsBuilder | undefined,\n authController: AuthController,\n dataSource: DataSourceDelegate,\n injectCollections?: (collections: EntityCollection[]) => EntityCollection[]) {\n let resolvedCollections: EntityCollection[] = [];\n if (typeof collections === \"function\") {\n resolvedCollections = await collections({\n user: authController.user,\n authController,\n dataSource\n });\n } else if (Array.isArray(collections)) {\n resolvedCollections = collections;\n }\n\n resolvedCollections = applyPermissionsFunctionIfEmpty(resolvedCollections, collectionPermissions);\n\n resolvedCollections = filterOutNotAllowedCollections(resolvedCollections, authController);\n\n if (injectCollections) {\n resolvedCollections = injectCollections(resolvedCollections ?? []);\n }\n\n return resolvedCollections;\n}\n\nasync function resolveCMSViews(baseViews: CMSView[] | CMSViewsBuilder | undefined, authController: AuthController, dataSource: DataSourceDelegate) {\n let resolvedViews: CMSView[] = [];\n if (typeof baseViews === \"function\") {\n resolvedViews = await baseViews({\n user: authController.user,\n authController,\n dataSource\n });\n } else if (Array.isArray(baseViews)) {\n resolvedViews = baseViews;\n }\n return resolvedViews;\n}\n","import { useCallback, useEffect, useState } from \"react\";\nimport { PartialEntityCollection, UserConfigurationPersistence } from \"../types\";\nimport { mergeDeep, stripCollectionPath } from \"../util\";\n\nexport function useBuildLocalConfigurationPersistence(): UserConfigurationPersistence {\n\n const [configCache, setConfigCache] = useState<Record<string, PartialEntityCollection>>({});\n\n const getCollectionFromStorage = useCallback((storageKey: string) => {\n const item = localStorage.getItem(storageKey);\n return item ? JSON.parse(item) : {};\n }, []);\n\n const getCollectionConfig = useCallback(<M extends Record<string, any>>(path: string): PartialEntityCollection<M> => {\n const storageKey = `collection_config::${stripCollectionPath(path)}`;\n if (configCache[storageKey]) {\n return configCache[storageKey] as PartialEntityCollection<M>;\n }\n return getCollectionFromStorage(storageKey);\n }, [configCache, getCollectionFromStorage]);\n\n const onCollectionModified = useCallback(<M extends Record<string, any>>(path: string, data: PartialEntityCollection<M>) => {\n const storageKey = `collection_config::${stripCollectionPath(path)}`;\n localStorage.setItem(storageKey, JSON.stringify(data));\n setConfigCache((currentCache) => {\n const cachedConfig = currentCache[storageKey];\n const newConfig = mergeDeep(cachedConfig ?? getCollectionFromStorage(path), data);\n return (mergeDeep(currentCache, newConfig));\n });\n }, [getCollectionFromStorage]);\n\n const [recentlyVisitedPaths, _setRecentlyVisitedPaths] = useState<string[]>([]);\n const [favouritePaths, _setFavouritePaths] = useState<string[]>([]);\n const [collapsedGroups, _setCollapsedGroups] = useState<string[]>([]);\n\n useEffect(() => {\n _setRecentlyVisitedPaths(localStorage.getItem(\"recently_visited_paths\") ? JSON.parse(localStorage.getItem(\"recently_visited_paths\")!) : []);\n _setFavouritePaths(localStorage.getItem(\"favourite_paths\") ? JSON.parse(localStorage.getItem(\"favourite_paths\")!) : []);\n _setCollapsedGroups(localStorage.getItem(\"collapsed_groups\") ? JSON.parse(localStorage.getItem(\"collapsed_groups\")!) : []);\n }, []);\n\n const setRecentlyVisitedPaths = useCallback((paths: string[]) => {\n localStorage.setItem(\"recently_visited_paths\", JSON.stringify(paths));\n _setRecentlyVisitedPaths(paths);\n }, []);\n\n const setFavouritePaths = useCallback((paths: string[]) => {\n localStorage.setItem(\"favourite_paths\", JSON.stringify(paths));\n _setFavouritePaths(paths);\n }, []);\n\n const setCollapsedGroups = useCallback((paths: string[]) => {\n localStorage.setItem(\"collapsed_groups\", JSON.stringify(paths));\n _setCollapsedGroups(paths);\n }, []);\n\n return {\n onCollectionModified,\n getCollectionConfig,\n recentlyVisitedPaths,\n setRecentlyVisitedPaths,\n favouritePaths,\n setFavouritePaths,\n collapsedGroups,\n setCollapsedGroups\n }\n}\n","import { useCallback, useEffect, useState } from \"react\";\n\nimport { ModeController } from \"./index\";\n\n/**\n * Use this hook to build a color mode controller that determines\n * the theme of the CMS\n */\nexport function useBuildModeController(): ModeController {\n\n const prefersDarkModeQuery = typeof window !== \"undefined\" &&\n window.matchMedia(\"(prefers-color-scheme: dark)\");\n const prefersDarkModeStorage: boolean | null = localStorage.getItem(\"prefers-dark-mode\") != null ? localStorage.getItem(\"prefers-dark-mode\") === \"true\" : null;\n const prefersDarkMode = prefersDarkModeStorage ?? prefersDarkModeQuery;\n const [mode, setMode] = useState<\"light\" | \"dark\">(prefersDarkMode ? \"dark\" : \"light\");\n\n useEffect(() => {\n setMode(prefersDarkMode ? \"dark\" : \"light\");\n setDocumentMode(prefersDarkMode ? \"dark\" : \"light\");\n }, [prefersDarkMode]);\n\n // color-scheme: dark;\n const setDarkMode = useCallback(() => {\n setMode(\"dark\");\n setDocumentMode(\"dark\");\n }, [prefersDarkModeQuery]);\n\n const setLightMode = useCallback(() => {\n setMode(\"light\");\n setDocumentMode(\"light\");\n }, []);\n\n const setDocumentMode = (mode: \"light\" | \"dark\") => {\n document.body.style.setProperty(\"color-scheme\", mode);\n document.documentElement.dataset.theme = mode;\n };\n\n const toggleMode = useCallback(() => {\n\n if (mode === \"light\") {\n if (!prefersDarkModeQuery)\n localStorage.setItem(\"prefers-dark-mode\", \"true\");\n else\n localStorage.removeItem(\"prefers-dark-mode\");\n setDarkMode();\n } else {\n if (prefersDarkModeQuery)\n localStorage.setItem(\"prefers-dark-mode\", \"false\");\n else\n localStorage.removeItem(\"prefers-dark-mode\");\n setLightMode();\n }\n }, [mode, prefersDarkModeQuery]);\n\n return {\n mode,\n setMode,\n toggleMode\n };\n}\n","import React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport {\n Entity,\n EntityCollection,\n EntityCustomView,\n EntityStatus,\n EntityValues,\n FireCMSPlugin,\n FormContext,\n User\n} from \"../types\";\nimport { CircularProgressCenter, EntityCollectionView, EntityView, ErrorBoundary, } from \"../components\";\nimport {\n canEditEntity,\n removeInitialAndTrailingSlashes,\n resolveDefaultSelectedView,\n resolveEntityView,\n useDebouncedCallback\n} from \"../util\";\n\nimport {\n saveEntityWithCallbacks,\n useAuthController,\n useCustomizationController,\n useDataSource,\n useEntityFetch,\n useFireCMSContext,\n useSideEntityController,\n useSnackbarController\n} from \"../hooks\";\nimport { EntityForm } from \"../form\";\nimport { CircularProgress, CloseIcon, cn, defaultBorderMixin, IconButton, Tab, Tabs, Typography } from \"@firecms/ui\";\nimport { EntityFormSaveParams } from \"../form/EntityForm\";\nimport { FORM_CONTAINER_WIDTH } from \"../internal/common\";\nimport { useSideDialogContext } from \"./index\";\n\nconst MAIN_TAB_VALUE = \"main_##Q$SC^#S6\";\n\nexport interface EntityEditViewProps<M extends Record<string, any>> {\n path: string;\n collection: EntityCollection<M>;\n entityId?: string;\n copy?: boolean;\n selectedSubPath?: string;\n parentCollectionIds: string[];\n formWidth?: number | string;\n onValuesAreModified: (modified: boolean) => void;\n onUpdate?: (params: { entity: Entity<any> }) => void;\n onClose?: () => void;\n}\n\n/**\n * This is the default view that is used as the content of a side panel when\n * an entity is opened.\n * You probably don't want to use this view directly since it is bound to the\n * side panel. Instead, you might want to use {@link EntityForm} or {@link EntityCollectionView}\n */\nexport function EntityEditView<M extends Record<string, any>, UserType extends User>({\n path,\n entityId,\n selectedSubPath,\n copy,\n collection,\n parentCollectionIds,\n onValuesAreModified,\n formWidth,\n onUpdate,\n onClose,\n }: EntityEditViewProps<M>) {\n\n if (collection.customId && collection.formAutoSave) {\n console.warn(`The collection ${collection.path} has customId and formAutoSave enabled. This is not supported and formAutoSave will be ignored`);\n }\n\n const [saving, setSaving] = useState(false);\n /**\n * These are the values that are being saved. They are debounced.\n * We use this only when autoSave is enabled.\n */\n const [valuesToBeSaved, setValuesToBeSaved] = useState<EntityValues<M> | undefined>(undefined);\n useDebouncedCallback(valuesToBeSaved, () => {\n if (valuesToBeSaved)\n saveEntity({\n entityId: usedEntity?.id,\n collection,\n path,\n values: valuesToBeSaved,\n closeAfterSave: false\n });\n }, false, 2000);\n\n // const largeLayout = useLargeLayout();\n // const largeLayoutTabSelected = useRef(!largeLayout);\n\n const resolvedFormWidth: string = typeof formWidth === \"number\" ? `${formWidth}px` : formWidth ?? FORM_CONTAINER_WIDTH;\n\n const dataSource = useDataSource(collection);\n const sideDialogContext = useSideDialogContext();\n const sideEntityController = useSideEntityController();\n const snackbarController = useSnackbarController();\n const customizationController = useCustomizationController();\n const context = useFireCMSContext();\n const authController = useAuthController<UserType>();\n\n const [formContext, setFormContext] = useState<FormContext<M> | undefined>(undefined);\n\n const [status, setStatus] = useState<EntityStatus>(copy ? \"copy\" : (entityId ? \"existing\" : \"new\"));\n\n const modifiedValuesRef = useRef<EntityValues<M> | undefined>(undefined);\n const modifiedValues = modifiedValuesRef.current;\n\n const subcollections = (collection.subcollections ?? []).filter(c => !c.hideFromNavigation);\n const subcollectionsCount = subcollections?.length ?? 0;\n const customViews = collection.entityViews;\n const customViewsCount = customViews?.length ?? 0;\n const autoSave = collection.formAutoSave && !collection.customId;\n\n const hasAdditionalViews = customViewsCount > 0 || subcollectionsCount > 0;\n\n const defaultSelectedView = selectedSubPath ?? resolveDefaultSelectedView(\n collection ? collection.defaultSelectedView : undefined,\n {\n status,\n entityId\n }\n );\n\n const selectedTabRef = useRef<string>(defaultSelectedView ?? MAIN_TAB_VALUE);\n\n const mainViewVisible = selectedTabRef.current === MAIN_TAB_VALUE;\n\n const {\n entity,\n dataLoading,\n // eslint-disable-next-line no-unused-vars\n dataLoadingError\n } = useEntityFetch<M, UserType>({\n path,\n entityId,\n collection,\n useCache: false\n });\n\n const [usedEntity, setUsedEntity] = useState<Entity<M> | undefined>(entity);\n const [readOnly, setReadOnly] = useState<boolean | undefined>(undefined);\n\n useEffect(() => {\n if (entity)\n setUsedEntity(entity);\n }, [entity]);\n\n useEffect(() => {\n if (status === \"new\") {\n setReadOnly(false);\n } else {\n const editEnabled = usedEntity ? canEditEntity(collection, authController, path, usedEntity ?? null) : false;\n if (usedEntity)\n setReadOnly(!editEnabled);\n }\n }, [authController, usedEntity, status]);\n\n const onPreSaveHookError = useCallback((e: Error) => {\n setSaving(false);\n snackbarController.open({\n type: \"error\",\n message: \"Error before saving: \" + e?.message\n });\n console.error(e);\n }, [snackbarController]);\n\n const onSaveSuccessHookError = useCallback((e: Error) => {\n setSaving(false);\n snackbarController.open({\n type: \"error\",\n message: \"Error after saving (entity is saved): \" + e?.message\n });\n console.error(e);\n }, [snackbarController]);\n\n const onSaveSuccess = (updatedEntity: Entity<M>, closeAfterSave: boolean) => {\n\n setSaving(false);\n if (!autoSave)\n snackbarController.open({\n type: \"success\",\n message: `${collection.singularName ?? collection.name}: Saved correctly`\n });\n\n setUsedEntity(updatedEntity);\n setStatus(\"existing\");\n\n onValuesAreModified(false);\n\n if (onUpdate)\n onUpdate({ entity: updatedEntity });\n\n if (closeAfterSave) {\n sideDialogContext.setBlocked(false);\n sideDialogContext.close(true);\n onClose?.();\n } else if (status !== \"existing\") {\n sideEntityController.replace({\n path,\n entityId: updatedEntity.id,\n selectedSubPath: selectedTabRef.current,\n updateUrl: true,\n collection,\n });\n }\n\n };\n\n const onSaveFailure = useCallback((e: Error) => {\n\n setSaving(false);\n snackbarController.open({\n type: \"error\",\n message: \"Error saving: \" + e?.message\n });\n\n console.error(\"Error saving entity\", path, entityId);\n console.error(e);\n }, [entityId, path, snackbarController]);\n\n const saveEntity = ({\n values,\n previousValues,\n closeAfterSave,\n entityId,\n collection,\n path\n }: {\n collection: EntityCollection<M>,\n path: string,\n entityId: string | undefined,\n values: M,\n previousValues?: M,\n closeAfterSave: boolean,\n }) => {\n setSaving(true);\n saveEntityWithCallbacks({\n path,\n entityId,\n values,\n previousValues,\n collection,\n status,\n dataSource,\n context,\n onSaveSuccess: (updatedEntity: Entity<M>) => onSaveSuccess(updatedEntity, closeAfterSave),\n onSaveFailure,\n onPreSaveHookError,\n onSaveSuccessHookError\n }).then();\n };\n\n const onSaveEntityRequest = async ({\n collection,\n path,\n entityId,\n values,\n previousValues,\n closeAfterSave,\n autoSave\n }: EntityFormSaveParams<M>): Promise<void> => {\n if (!status)\n return;\n\n if (autoSave) {\n setValuesToBeSaved(values);\n } else {\n saveEntity({\n collection,\n path,\n entityId,\n values,\n previousValues,\n closeAfterSave\n });\n }\n };\n\n const resolvedEntityViews = customViews ? customViews\n .map(e => resolveEntityView(e, customizationController.entityViews))\n .filter(Boolean) as EntityCustomView[]\n : [];\n\n const customViewsView: React.ReactNode[] | undefined = customViews && resolvedEntityViews\n .map(\n (customView, colIndex) => {\n if (!customView)\n return null;\n if (selectedTabRef.current !== customView.key)\n return null;\n const Builder = customView.Builder;\n if (!Builder) {\n console.error(\"customView.Builder is not defined\");\n return null;\n }\n return <div\n className={cn(defaultBorderMixin,\n \"relative flex-grow w-full h-full overflow-auto \")}\n key={`custom_view_${customView.key}`}\n role=\"tabpanel\">\n <ErrorBoundary>\n {formContext && <Builder\n collection={collection}\n entity={usedEntity}\n modifiedValues={modifiedValues ?? usedEntity?.values}\n formContext={formContext}\n />}\n </ErrorBoundary>\n </div>;\n }\n ).filter(Boolean);\n\n const globalLoading = (dataLoading && !usedEntity) ||\n ((!usedEntity || readOnly === undefined) && (status === \"existing\" || status === \"copy\"));\n\n const loading = globalLoading || saving;\n\n const subCollectionsViews = subcollections && subcollections.map(\n (subcollection, colIndex) => {\n const subcollectionId = subcollection.id ?? subcollection.path;\n const fullPath = usedEntity ? `${path}/${usedEntity?.id}/${removeInitialAndTrailingSlashes(subcollectionId)}` : undefined;\n if (selectedTabRef.current !== subcollectionId)\n return null;\n return (\n <div\n className={\"relative flex-grow h-full overflow-auto w-full\"}\n key={`subcol_${subcollectionId}`}\n role=\"tabpanel\">\n\n {loading && <CircularProgressCenter/>}\n\n {!globalLoading &&\n (usedEntity && fullPath\n ? <EntityCollectionView\n fullPath={fullPath}\n parentCollectionIds={[...parentCollectionIds, collection.id]}\n isSubCollection={true}\n {...subcollection}/>\n : <div\n className=\"flex items-center justify-center w-full h-full p-3\">\n <Typography variant={\"label\"}>\n You need to save your entity before\n adding additional collections\n </Typography>\n </div>)\n }\n\n </div>\n );\n }\n ).filter(Boolean);\n\n const onDiscard = useCallback(() => {\n onValuesAreModified(false);\n }, []);\n\n const onSideTabClick = (value: string) => {\n selectedTabRef.current = value;\n sideEntityController.replace({\n path,\n entityId,\n selectedSubPath: value === MAIN_TAB_VALUE ? undefined : value,\n updateUrl: true,\n collection,\n });\n };\n\n const onValuesChanged = useCallback((values?: EntityValues<M>) => {\n modifiedValuesRef.current = values;\n }, []);\n\n // eslint-disable-next-line n/handle-callback-err\n const onIdUpdateError = useCallback((error: any) => {\n snackbarController.open({\n type: \"error\",\n message: \"Error updating id, check the console\"\n });\n }, []);\n\n const onIdChange = useCallback((id: string) => {\n setUsedEntity((prevEntity) => prevEntity\n ? {\n ...prevEntity,\n id\n }\n : undefined);\n }, []);\n\n const onModified = (dirty: boolean) => {\n if (!autoSave)\n onValuesAreModified(dirty);\n }\n\n function buildForm() {\n const plugins = customizationController.plugins;\n let form = <EntityForm\n status={status}\n path={path}\n collection={collection}\n onEntitySaveRequested={onSaveEntityRequest}\n onDiscard={onDiscard}\n onValuesChanged={onValuesChanged}\n onModified={onModified}\n entity={usedEntity}\n onIdChange={onIdChange}\n onFormContextChange={setFormContext}\n hideId={collection.hideIdFromForm}\n autoSave={autoSave}\n onIdUpdateError={onIdUpdateError}\n />;\n if (plugins) {\n plugins.forEach((plugin: FireCMSPlugin) => {\n if (plugin.form?.provider) {\n form = (\n <plugin.form.provider.Component\n status={status}\n path={path}\n collection={collection}\n onDiscard={onDiscard}\n onValuesChanged={onValuesChanged}\n onModified={onModified}\n entity={usedEntity}\n context={context}\n formContext={formContext}\n {...plugin.form.provider.props}>\n {form}\n </plugin.form.provider.Component>\n );\n }\n });\n }\n return <ErrorBoundary>{form}</ErrorBoundary>;\n }\n\n const form = (readOnly === undefined)\n ? <></>\n : (!readOnly\n ? buildForm()\n : (\n <>\n <Typography\n className={\"mt-16 mb-8 mx-8\"}\n variant={\"h4\"}>{collection.singularName ?? collection.name}\n </Typography>\n <EntityView\n className={\"px-12\"}\n entity={usedEntity as Entity<M>}\n path={path}\n collection={collection}/>\n </>\n ));\n\n const subcollectionTabs = subcollections && subcollections.map(\n (subcollection) =>\n <Tab\n className=\"text-sm min-w-[140px]\"\n value={subcollection.id}\n key={`entity_detail_collection_tab_${subcollection.name}`}>\n {subcollection.name}\n </Tab>\n );\n\n const customViewTabs = resolvedEntityViews.map(\n (view) =>\n\n <Tab\n className=\"text-sm min-w-[140px]\"\n value={view.key}\n key={`entity_detail_collection_tab_${view.name}`}>\n {view.name}\n </Tab>\n );\n\n return (\n <div\n className=\"flex flex-col h-full w-full transition-width duration-250 ease-in-out\">\n {\n <>\n\n <div\n className={cn(defaultBorderMixin, \"no-scrollbar border-b pl-2 pr-2 pt-1 flex items-end overflow-scroll bg-gray-50 dark:bg-gray-950\")}>\n\n <div\n className=\"pb-1 self-center\">\n <IconButton\n onClick={() => {\n onClose?.();\n return sideDialogContext.close(false);\n }}\n size=\"large\">\n <CloseIcon/>\n </IconButton>\n </div>\n\n <div className={\"flex-grow\"}/>\n\n {globalLoading && <div\n className=\"self-center\">\n <CircularProgress size={\"small\"}/>\n </div>}\n\n <Tabs\n value={selectedTabRef.current}\n onValueChange={(value) => {\n onSideTabClick(value);\n }}\n className=\"pl-4 pr-4 pt-0\">\n\n <Tab\n disabled={!hasAdditionalViews}\n value={MAIN_TAB_VALUE}\n className={`${\n !hasAdditionalViews ? \"hidden\" : \"\"\n } text-sm min-w-[140px]`}\n >{collection.singularName ?? collection.name}</Tab>\n\n {customViewTabs}\n\n {subcollectionTabs}\n </Tabs>\n\n </div>\n\n <div\n className={\"flex-grow h-full flex overflow-auto flex-row w-full \"}\n style={{\n // width: `calc(${ADDITIONAL_TAB_WIDTH} + ${resolvedFormWidth})`,\n // maxWidth: \"100%\",\n // [`@media (max-width: ${resolvedFormWidth})`]: {\n // width: resolvedFormWidth\n // }\n }}>\n\n <div\n role=\"tabpanel\"\n hidden={!mainViewVisible}\n id={`form_${path}`}\n className={\" w-full\"}>\n\n {globalLoading\n ? <CircularProgressCenter/>\n : form}\n\n </div>\n\n {customViewsView}\n\n {subCollectionsViews}\n\n </div>\n\n </>\n }\n\n </div>\n );\n}\n","import React, { useCallback } from \"react\";\nimport { Blocker, Transition } from \"history\";\nimport { UNSAFE_NavigationContext, useNavigate } from \"react-router-dom\";\nimport { Button, Dialog, DialogActions, DialogContent, Typography } from \"@firecms/ui\";\n\nexport function useNavigationUnsavedChangesDialog(when: boolean, onSuccess: () => void):\n {\n navigationWasBlocked: boolean,\n handleCancel: () => void,\n handleOk: () => void\n } {\n\n const [nextLocation, setNextLocation] = React.useState<any | undefined>();\n const { navigator } = React.useContext(UNSAFE_NavigationContext);\n\n const navigate = useNavigate();\n\n const handleCancel = () => {\n setNextLocation(undefined);\n };\n\n const handleOk = () => {\n onSuccess();\n setNextLocation(undefined);\n navigate(-1);\n };\n\n const blocker: Blocker = useCallback(({\n action,\n location: nextLocation,\n retry\n }) => {\n switch (action) {\n case \"REPLACE\": {\n retry();\n return;\n }\n case \"POP\": {\n setNextLocation(nextLocation);\n }\n }\n }, []);\n\n React.useEffect(() => {\n if (!when) return;\n if (nextLocation) return;\n if (!(\"block\" in navigator)) return;\n const unblock = (navigator as any).block((tx: Transition) => {\n const autoUnblockingTx = {\n ...tx,\n retry() {\n unblock();\n tx.retry();\n }\n };\n blocker(autoUnblockingTx);\n });\n\n return unblock;\n }, [navigator, blocker, when, nextLocation]);\n\n return {\n navigationWasBlocked: Boolean(nextLocation),\n handleCancel,\n handleOk\n };\n}\n\nexport interface UnsavedChangesDialogProps {\n open: boolean;\n body?: React.ReactNode;\n title?: string;\n handleOk: () => void;\n handleCancel: () => void;\n}\n\nexport function UnsavedChangesDialog({\n open,\n handleOk,\n handleCancel,\n body,\n title\n }: UnsavedChangesDialogProps) {\n\n return (\n <Dialog\n open={open}\n onOpenChange={(open) => open ? handleCancel() : handleOk()}\n >\n <DialogContent>\n <Typography variant={\"h6\"}>{title}</Typography>\n\n {body}\n\n <Typography>\n Are you sure you want to leave this page?\n </Typography>\n\n </DialogContent>\n <DialogActions>\n <Button variant=\"text\" onClick={handleCancel} autoFocus> Cancel </Button>\n <Button onClick={handleOk}> Ok </Button>\n </DialogActions>\n </Dialog>\n );\n}\n","import React, { useContext, useEffect, useState } from \"react\";\nimport { useSideDialogsController } from \"../hooks\";\nimport { SideDialogPanelProps } from \"../types\";\nimport { Sheet } from \"@firecms/ui\";\nimport { UnsavedChangesDialog, useNavigationUnsavedChangesDialog } from \"../internal/useUnsavedChangesDialog\";\nimport { ErrorBoundary } from \"../components\";\n\nexport type SideDialogContextProps = {\n blocked: boolean,\n setBlocked: (blocked: boolean) => void,\n setBlockedNavigationMessage: (message?: React.ReactNode) => void,\n width?: string,\n close: (force?: boolean) => void\n}\n\nconst SideDialogContext = React.createContext<SideDialogContextProps>({\n width: \"\",\n blocked: false,\n setBlocked: (blocked: boolean) => {\n },\n setBlockedNavigationMessage: (message?: React.ReactNode) => {\n },\n close: () => {\n }\n});\n\n/**\n * This hook is used to access the properties of a particular side dialog,\n * in contrast with {@link useSideDialogsController} which handles the\n * state of all the dialogs.\n */\nexport const useSideDialogContext = () => useContext<SideDialogContextProps>(SideDialogContext);\n\n/**\n * This is the component in charge of rendering the side dialogs used\n * for editing entities. Use the {@link useSideEntityController} to open\n * and control the dialogs.\n * This component needs a parent {@link FireCMS}\n * {@link useSideDialogsController}\n * @group Components\n */\nexport function SideDialogs() {\n\n const sideDialogsController = useSideDialogsController();\n\n const sidePanels = sideDialogsController.sidePanels;\n\n const panels: (SideDialogPanelProps | undefined)[] = [...sidePanels];\n panels.push(undefined);\n\n return <>\n {\n panels.map((panel, index) =>\n <SideDialogView\n key={`side_dialog_${index}`}\n panel={panel}\n offsetPosition={sidePanels.length - index - 1}/>)\n }\n </>;\n}\n\nfunction SideDialogView({\n offsetPosition,\n panel\n }: {\n offsetPosition: number,\n panel?: SideDialogPanelProps\n}) {\n\n // was the closing of the dialog requested by the drawer\n const [drawerCloseRequested, setDrawerCloseRequested] = useState<boolean>(false);\n const [blocked, setBlocked] = useState(false);\n const [blockedNavigationMessage, setBlockedNavigationMessage] = useState<React.ReactNode | undefined>();\n\n const widthRef = React.useRef<string | undefined>(panel?.width);\n const width = widthRef.current;\n\n const sideDialogsController = useSideDialogsController();\n\n const {\n navigationWasBlocked,\n handleOk: handleNavigationOk,\n handleCancel: handleNavigationCancel\n } = useNavigationUnsavedChangesDialog(\n blocked && !drawerCloseRequested,\n () => setBlocked(false)\n );\n\n useEffect(() => {\n if (panel)\n widthRef.current = panel.width;\n }, [panel])\n\n const handleDrawerCloseOk = () => {\n setBlocked(false);\n setDrawerCloseRequested(false);\n sideDialogsController.close();\n panel?.onClose?.();\n };\n\n const handleDrawerCloseCancel = () => {\n setDrawerCloseRequested(false);\n };\n\n const onCloseRequest = (force?: boolean) => {\n if (blocked && !force) {\n setDrawerCloseRequested(true);\n } else {\n sideDialogsController.close();\n panel?.onClose?.();\n }\n };\n\n // const offsetClass = offsetPosition > 0 ? `transform translate-x-${offsetPosition}` : \"\";\n\n return (\n <SideDialogContext.Provider\n value={{\n blocked,\n setBlocked,\n setBlockedNavigationMessage,\n width,\n close: onCloseRequest\n }}>\n\n <Sheet\n open={Boolean(panel)}\n onOpenChange={(open) => !open && onCloseRequest()}\n >\n {panel &&\n <div\n className={\"transform max-w-[100vw] lg:max-w-[95vw] flex flex-col h-full transition-all duration-250 ease-in-out bg-white dark:bg-gray-900 \"}\n style={{\n width: panel.width,\n transform: `translateX(-${offsetPosition * 200}px)`\n }}\n >\n <ErrorBoundary>\n {panel.component}\n </ErrorBoundary>\n </div>}\n\n {!panel && <div style={{ width }}/>}\n\n </Sheet>\n\n <UnsavedChangesDialog\n open={navigationWasBlocked || drawerCloseRequested}\n handleOk={drawerCloseRequested ? handleDrawerCloseOk : handleNavigationOk}\n handleCancel={drawerCloseRequested ? handleDrawerCloseCancel : handleNavigationCancel}\n body={blockedNavigationMessage}/>\n\n </SideDialogContext.Provider>\n\n );\n}\n","import React, { useCallback, useEffect, useMemo } from \"react\";\n\nimport { EntitySidePanelProps } from \"../types\";\nimport { useNavigationController } from \"../hooks\";\n\nimport { ErrorBoundary } from \"../components\";\nimport { EntityEditView } from \"./EntityEditView\";\nimport { useSideDialogContext } from \"./SideDialogs\";\n\n/**\n * This is the component in charge of rendering the side dialog used\n * for editing entities. Use the {@link useSideEntityController} to open\n * and control the dialogs.\n * This component needs a parent {@link FireCMS}\n * {@link useSideEntityController}\n * @group Components\n */\nexport function EntitySidePanel(props: EntitySidePanelProps) {\n\n const {\n blocked,\n setBlocked,\n setBlockedNavigationMessage\n } = useSideDialogContext();\n\n const navigationController = useNavigationController();\n\n const parentCollectionIds = useMemo(() => {\n return navigationController.getParentCollectionIds(props.path);\n }, [navigationController, props.path]);\n\n const collection = useMemo(() => {\n if (!props) return undefined;\n let usedCollection = props.collection;\n\n const registryCollection = navigationController.getCollection(props.path, props.entityId);\n if (registryCollection) {\n usedCollection = registryCollection;\n }\n if (!usedCollection) {\n console.error(\"ERROR: No collection found in path `\", props.path, \"`. Entity id: \", props.entityId);\n throw Error(\"ERROR: No collection found in path `\" + props.path + \"`. Make sure you have defined a collection for this path in the root navigation.\");\n }\n\n return usedCollection;\n }, [navigationController, props]);\n\n useEffect(() => {\n function beforeunload(e: any) {\n if (blocked && collection) {\n e.preventDefault();\n e.returnValue = `You have unsaved changes in this ${collection.name}. Are you sure you want to leave this page?`;\n }\n }\n\n if (typeof window !== \"undefined\")\n window.addEventListener(\"beforeunload\", beforeunload);\n\n return () => {\n if (typeof window !== \"undefined\")\n window.removeEventListener(\"beforeunload\", beforeunload);\n };\n\n }, [blocked, collection]);\n\n const onValuesAreModified = useCallback((modified: boolean) => {\n setBlocked(modified);\n setBlockedNavigationMessage(modified\n ? <> You have unsaved changes in this <b>{collection?.singularName ?? collection?.name}</b>.</>\n : undefined)\n }, [collection?.name, setBlocked, setBlockedNavigationMessage]);\n\n if (!props || !collection) {\n return <div className={\"w-full\"}/>;\n }\n\n return (\n <>\n <ErrorBoundary>\n <EntityEditView\n {...props}\n formWidth={props.width}\n collection={collection}\n parentCollectionIds={parentCollectionIds}\n onValuesAreModified={onValuesAreModified}\n />\n </ErrorBoundary>\n\n </>\n );\n}\n","import { useCallback, useEffect, useRef } from \"react\";\nimport {\n EntityCollection,\n EntitySidePanelProps,\n NavigationController,\n SideDialogPanelProps,\n SideDialogsController,\n SideEntityController\n} from \"../types\";\nimport { getNavigationEntriesFromPathInternal, NavigationViewInternal } from \"../util/navigation_from_path\";\nimport { useLocation } from \"react-router-dom\";\nimport { removeInitialAndTrailingSlashes, resolveDefaultSelectedView } from \"../util\";\nimport { ADDITIONAL_TAB_WIDTH, CONTAINER_FULL_WIDTH, FORM_CONTAINER_WIDTH } from \"./common\";\nimport { useLargeLayout } from \"../hooks\";\nimport { EntitySidePanel } from \"../core/EntitySidePanel\";\n\nconst NEW_URL_HASH = \"new\";\n\nexport function getEntityViewWidth(props: EntitySidePanelProps<any>, small: boolean): string {\n if (small) return CONTAINER_FULL_WIDTH;\n const mainViewSelected = !props.selectedSubPath;\n const resolvedWidth: string | undefined = typeof props.width === \"number\" ? `${props.width}px` : props.width;\n return !mainViewSelected ? `calc(${ADDITIONAL_TAB_WIDTH} + ${resolvedWidth ?? FORM_CONTAINER_WIDTH})` : resolvedWidth ?? FORM_CONTAINER_WIDTH\n}\n\nexport const useBuildSideEntityController = (navigation: NavigationController,\n sideDialogsController: SideDialogsController): SideEntityController => {\n\n const location = useLocation();\n const initialised = useRef<boolean>(false);\n\n const smallLayout = !useLargeLayout();\n\n // only on initialisation, create panels from URL\n useEffect(() => {\n if (!navigation.loading && !initialised.current) {\n if (navigation.isUrlCollectionPath(location.pathname)) {\n const newFlag = location.hash === `#${NEW_URL_HASH}`;\n const entityOrCollectionPath = navigation.urlPathToDataPath(location.pathname);\n const panelsFromUrl = buildSidePanelsFromUrl(entityOrCollectionPath, navigation.collections ?? [], newFlag);\n for (let i = 0; i < panelsFromUrl.length; i++) {\n const panel = panelsFromUrl[i];\n setTimeout(() => {\n if (i === 0)\n sideDialogsController.replace(propsToSidePanel(panel, navigation, smallLayout));\n else\n sideDialogsController.open(propsToSidePanel(panel, navigation, smallLayout))\n }, 1);\n }\n }\n initialised.current = true;\n }\n }, [location, navigation, sideDialogsController, smallLayout]);\n\n const close = useCallback(() => {\n sideDialogsController.close();\n }, [sideDialogsController]);\n\n const open = useCallback((props: EntitySidePanelProps<any>) => {\n\n if (props.copy && !props.entityId) {\n throw Error(\"If you want to copy an entity you need to provide an entityId\");\n }\n\n const defaultSelectedView = resolveDefaultSelectedView(\n props.collection ? props.collection.defaultSelectedView : undefined,\n {\n status: props.copy ? \"copy\" : (props.entityId ? \"existing\" : \"new\"),\n entityId: props.entityId\n }\n );\n\n sideDialogsController.open(propsToSidePanel({\n selectedSubPath: defaultSelectedView,\n ...props,\n }, navigation, smallLayout));\n\n }, [sideDialogsController, navigation, smallLayout]);\n\n const replace = useCallback((props: EntitySidePanelProps<any>) => {\n\n if (props.copy && !props.entityId) {\n throw Error(\"If you want to copy an entity you need to provide an entityId\");\n }\n\n sideDialogsController.replace(propsToSidePanel(props, navigation, smallLayout));\n\n }, [navigation, sideDialogsController, smallLayout]);\n\n return {\n close,\n open,\n replace\n };\n};\n\nexport function buildSidePanelsFromUrl(path: string, collections: EntityCollection[], newFlag: boolean): EntitySidePanelProps<any>[] {\n\n const navigationViewsForPath: NavigationViewInternal<any>[] = getNavigationEntriesFromPathInternal({\n path,\n collections\n });\n\n const sidePanels: EntitySidePanelProps<any>[] = [];\n let lastCollectionPath = \"\";\n for (let i = 0; i < navigationViewsForPath.length; i++) {\n const navigationEntry = navigationViewsForPath[i];\n\n if (navigationEntry.type === \"collection\") {\n lastCollectionPath = navigationEntry.path;\n }\n\n if (i > 0) { // the first collection is handled by the main navigation\n const previousEntry = navigationViewsForPath[i - 1];\n if (navigationEntry.type === \"entity\") {\n sidePanels.push({\n path: navigationEntry.path,\n entityId: navigationEntry.entityId,\n copy: false\n }\n );\n } else if (navigationEntry.type === \"custom_view\") {\n if (previousEntry.type === \"entity\") {\n const lastSidePanel: EntitySidePanelProps<any> = sidePanels[sidePanels.length - 1];\n if (lastSidePanel)\n lastSidePanel.selectedSubPath = navigationEntry.view.key;\n }\n } else if (navigationEntry.type === \"collection\") {\n if (previousEntry.type === \"entity\") {\n const lastSidePanel: EntitySidePanelProps<any> = sidePanels[sidePanels.length - 1];\n if (lastSidePanel)\n lastSidePanel.selectedSubPath = navigationEntry.collection.id ?? navigationEntry.collection.path;\n }\n }\n }\n\n }\n\n if (newFlag) {\n sidePanels.push({\n path: lastCollectionPath,\n copy: false\n });\n }\n\n return sidePanels;\n}\n\nconst propsToSidePanel = (props: EntitySidePanelProps<any>, navigation: NavigationController, smallLayout: boolean): SideDialogPanelProps => {\n\n const collectionPath = removeInitialAndTrailingSlashes(props.path);\n\n const newPath = props.entityId\n ? navigation.buildUrlCollectionPath(`${collectionPath}/${props.entityId}/${props.selectedSubPath || \"\"}`)\n : navigation.buildUrlCollectionPath(`${collectionPath}#${NEW_URL_HASH}`);\n const resolvedPath = navigation.resolveAliasesFrom(props.path);\n\n const resolvedPanelProps: EntitySidePanelProps<any> = {\n ...props,\n path: resolvedPath\n };\n\n return ({\n key: `${props.path}/${props.entityId}`,\n component: <EntitySidePanel {...resolvedPanelProps}/>,\n urlPath: newPath,\n parentUrlPath: navigation.buildUrlCollectionPath(collectionPath),\n width: getEntityViewWidth(props, smallLayout),\n onClose: props.onClose\n });\n }\n;\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useLocation, useNavigate } from \"react-router-dom\";\nimport { SideDialogPanelProps, SideDialogsController } from \"../types\";\nimport equal from \"react-fast-compare\"\n\nexport function useBuildSideDialogsController(): SideDialogsController {\n\n const location = useLocation();\n const navigate = useNavigate();\n\n const [sidePanels, setSidePanels] = useState<SideDialogPanelProps[]>([]);\n const sidePanelsRef = useRef<SideDialogPanelProps[]>(sidePanels);\n\n const routesStore = useRef<Record<string, SideDialogPanelProps>>({});\n const routesCount = useRef<number>(0);\n\n const updateSidePanels = (newPanels: SideDialogPanelProps[]) => {\n sidePanelsRef.current = newPanels;\n setSidePanels(newPanels);\n };\n\n useEffect(() => {\n const state = location.state as any;\n const panelKeys: string[] = state?.panels ?? [];\n const newPanels = panelKeys\n .map(key => routesStore.current[key])\n .filter(p => Boolean(p)) as SideDialogPanelProps[];\n if (!equal(sidePanelsRef.current.map(p => p.key), newPanels.map(p => p.key)))\n updateSidePanels(newPanels);\n }, [location]);\n\n const close = useCallback(() => {\n\n if (sidePanels.length === 0)\n return;\n\n const lastSidePanel = sidePanels[sidePanels.length - 1];\n const updatedPanels = [...sidePanels.slice(0, -1)];\n updateSidePanels(updatedPanels);\n\n if (routesCount.current > 0) {\n if (lastSidePanel.urlPath)\n navigate(-1);\n routesCount.current--;\n } else if (lastSidePanel.parentUrlPath) {\n const baseLocation = (location.state as any)?.base_location ?? location;\n navigate(\n lastSidePanel.parentUrlPath,\n {\n replace: true,\n state: {\n base_location: baseLocation,\n panels: updatedPanels.map(p => p.key)\n }\n }\n );\n }\n }, [sidePanels, navigate, location]);\n\n const open = useCallback((panelProps: SideDialogPanelProps | SideDialogPanelProps[]) => {\n\n const newPanels: SideDialogPanelProps[] = Array.isArray(panelProps) ? panelProps : [panelProps];\n\n newPanels.forEach((panel) => {\n routesStore.current[panel.key] = panel;\n });\n routesCount.current = routesCount.current + newPanels.length;\n\n const baseLocation = (location.state as any)?.base_location ?? location;\n\n const updatedPanels = [...sidePanels, ...newPanels];\n updateSidePanels(updatedPanels);\n\n newPanels.forEach((panel) => {\n if (panel.urlPath) {\n navigate(\n panel.urlPath,\n {\n state: {\n base_location: baseLocation,\n panels: updatedPanels.map(p => p.key)\n }\n }\n );\n }\n });\n\n }, [location, navigate, sidePanels]);\n\n const replace = useCallback((panelProps: SideDialogPanelProps | SideDialogPanelProps[]) => {\n\n const newPanels: SideDialogPanelProps[] = Array.isArray(panelProps) ? panelProps : [panelProps];\n newPanels.forEach((panel) => {\n routesStore.current[panel.key] = panel;\n });\n\n const baseLocation = (location.state as any)?.base_location ?? location;\n\n const updatedPanels = [...sidePanels.slice(0, -newPanels.length), ...newPanels];\n updateSidePanels(updatedPanels);\n\n newPanels.forEach((panel) => {\n if (panel.urlPath) {\n navigate(\n panel.urlPath,\n {\n replace: true,\n state: {\n base_location: baseLocation,\n panels: updatedPanels.map(p => p.key)\n }\n }\n );\n }\n });\n\n }, [location, navigate, sidePanels]);\n\n return {\n sidePanels,\n close,\n open,\n replace\n };\n}\n","import * as locales from \"date-fns/locale\";\n// @ts-ignore\nimport { registerLocale, setDefaultLocale } from \"react-datepicker\";\nimport { useEffect } from \"react\";\n\nexport function useLocaleConfig(locale?: string) {\n useEffect(() => {\n if (!locale) {\n return;\n }\n // @ts-ignore\n const dateFnsLocale = locales[locale];\n if (dateFnsLocale) {\n registerLocale(locale, dateFnsLocale);\n setDefaultLocale(locale);\n }\n }, [locale])\n}\n","import { useCallback } from \"react\";\nimport {\n DataSource,\n DataSourceDelegate,\n DeleteEntityProps,\n Entity,\n EntityCollection,\n EntityReference,\n EntityValues,\n FetchCollectionProps,\n FetchEntityProps,\n FilterValues,\n GeoPoint,\n ListenCollectionProps,\n ListenEntityProps,\n NavigationController,\n PropertyConfig,\n ResolvedProperties,\n SaveEntityProps\n} from \"../types\";\nimport { resolveCollection, updateDateAutoValues } from \"../util\";\n\n/**\n * Use this hook to build a {@link DataSource} based on Firestore\n * @param firebaseApp\n * @group Firebase\n */\nexport function useBuildDataSource({\n delegate,\n propertyConfigs,\n navigationController\n }: {\n delegate: DataSourceDelegate,\n propertyConfigs?: Record<string, PropertyConfig>;\n navigationController: NavigationController;\n}): DataSource {\n\n return {\n\n /**\n * Fetch entities in a Firestore path\n * @param path\n * @param collection\n * @param filter\n * @param limit\n * @param startAfter\n * @param searchString\n * @param orderBy\n * @param order\n * @return Function to cancel subscription\n * @see useCollectionFetch if you need this functionality implemented as a hook\n * @group Firestore\n */\n fetchCollection: useCallback(<M extends Record<string, any>>({\n path,\n collection: collectionProp,\n filter,\n limit,\n startAfter,\n searchString,\n orderBy,\n order\n }: FetchCollectionProps<M>\n ): Promise<Entity<M>[]> => {\n return delegate.fetchCollection<M>({\n path,\n filter,\n limit,\n startAfter,\n searchString,\n orderBy,\n order\n });\n }, [delegate]),\n\n /**\n * Listen to a entities in a given path\n * @param path\n * @param collection\n * @param onError\n * @param filter\n * @param limit\n * @param startAfter\n * @param searchString\n * @param orderBy\n * @param order\n * @param onUpdate\n * @return Function to cancel subscription\n * @see useCollectionFetch if you need this functionality implemented as a hook\n * @group Firestore\n */\n listenCollection: delegate.listenCollection\n // eslint-disable-next-line react-hooks/rules-of-hooks\n ? useCallback(<M extends Record<string, any>>(\n {\n path,\n collection: collectionProp,\n filter,\n limit,\n startAfter,\n searchString,\n orderBy,\n order,\n onUpdate,\n onError\n }: ListenCollectionProps<M>\n ): () => void => {\n\n const collection = collectionProp ?? navigationController.getCollection(path);\n const isCollectionGroup = Boolean(collection?.collectionGroup) ?? false;\n if (!delegate.listenCollection)\n throw Error(\"useBuildDataSource delegate not initialised\");\n\n return delegate.listenCollection<M>({\n path,\n filter,\n limit,\n startAfter,\n searchString,\n orderBy,\n order,\n onUpdate,\n onError,\n isCollectionGroup,\n collection\n });\n }, [delegate, navigationController.getCollection])\n : undefined,\n\n /**\n * Retrieve an entity given a path and a collection\n * @param path\n * @param entityId\n * @param collection\n * @group Firestore\n */\n fetchEntity: useCallback(<M extends Record<string, any>>({\n path,\n entityId\n }: FetchEntityProps<M>\n ): Promise<Entity<M> | undefined> => delegate.fetchEntity({\n path,\n entityId\n }), [delegate]),\n\n /**\n *\n * @param path\n * @param entityId\n * @param collection\n * @param onUpdate\n * @param onError\n * @return Function to cancel subscription\n * @group Firestore\n */\n listenEntity: delegate.listenEntity\n // eslint-disable-next-line react-hooks/rules-of-hooks\n ? useCallback(<M extends Record<string, any>>(\n {\n path,\n entityId,\n collection,\n onUpdate,\n onError\n }: ListenEntityProps<M>): () => void => {\n if (!delegate.listenEntity)\n throw Error(\"useBuildDataSource delegate not initialised\");\n\n return delegate.listenEntity<M>({\n path,\n entityId,\n onUpdate,\n onError\n })\n }, [delegate.listenEntity]) : undefined,\n\n /**\n * Save entity to the specified path. Note that Firestore does not allow\n * undefined values.\n * @param path\n * @param entityId\n * @param values\n * @param schemaId\n * @param collection\n * @param status\n * @group Firestore\n */\n saveEntity: useCallback(<M extends Record<string, any>>(\n {\n path,\n entityId,\n values,\n collection: collectionProp,\n status\n }: SaveEntityProps<M>): Promise<Entity<M>> => {\n\n const collection = collectionProp ?? navigationController.getCollection(path);\n\n const resolvedCollection = collection\n ? resolveCollection<M>({\n collection,\n path,\n entityId,\n fields: propertyConfigs\n })\n : undefined;\n\n const properties: ResolvedProperties<M> | undefined = resolvedCollection?.properties;\n\n const firestoreValues = cmsToDelegateModel(\n values,\n delegate.buildReference,\n delegate.buildGeoPoint,\n delegate.buildDate,\n delegate.buildDeleteFieldValue\n );\n const updatedFirestoreValues: EntityValues<M> = properties\n ? updateDateAutoValues(\n {\n inputValues: firestoreValues,\n properties,\n status,\n timestampNowValue: delegate.currentTime(),\n setDateToMidnight: delegate.setDateToMidnight\n })\n : firestoreValues;\n\n return delegate.saveEntity({\n path,\n entityId,\n values: updatedFirestoreValues,\n status\n }).then((res) => {\n return {\n id: res.id,\n path: res.path,\n values: delegate.delegateToCMSModel(updatedFirestoreValues)\n } as Entity<M>;\n });\n }, [delegate.saveEntity, navigationController.getCollection]),\n\n /**\n * Delete an entity\n * @param entity\n * @param collection\n * @group Firestore\n */\n deleteEntity: useCallback(<M extends Record<string, any>>(\n {\n entity\n }: DeleteEntityProps<M>\n ): Promise<void> => {\n return delegate.deleteEntity({ entity });\n }, [delegate.deleteEntity]),\n\n /**\n * Check if the given property is unique in the given collection\n * @param path Collection path\n * @param name of the property\n * @param value\n * @param property\n * @param entityId\n * @return `true` if there are no other fields besides the given entity\n * @group Firestore\n */\n checkUniqueField: useCallback((\n path: string,\n name: string,\n value: any,\n entityId?: string\n ): Promise<boolean> => {\n return delegate.checkUniqueField(path, name, value, entityId);\n }, [delegate.checkUniqueField]),\n\n generateEntityId: useCallback((path: string): string => {\n return delegate.generateEntityId(path,);\n }, [delegate.generateEntityId]),\n\n countEntities: delegate.countEntities ? async ({\n path,\n collection,\n filter,\n order,\n orderBy\n }: {\n path: string,\n collection: EntityCollection<any>,\n filter?: FilterValues<Extract<keyof any, string>>,\n orderBy?: string,\n order?: \"desc\" | \"asc\",\n }): Promise<number> => {\n return delegate.countEntities!({\n path,\n filter,\n orderBy,\n order,\n isCollectionGroup: Boolean(collection.collectionGroup) ?? false\n });\n } : undefined,\n\n isFilterCombinationValid: useCallback(({\n path,\n filterValues,\n sortBy\n }: {\n path: string,\n filterValues: FilterValues<any>,\n sortBy?: [string, \"asc\" | \"desc\"]\n }): boolean => {\n if (!delegate.isFilterCombinationValid)\n return true;\n return delegate.isFilterCombinationValid(\n {\n path,\n filterValues,\n sortBy\n }\n )\n }, [delegate.isFilterCombinationValid])\n\n };\n\n}\n\n/**\n * Recursive function that converts Firestore data types into CMS or plain\n * JS types.\n * FireCMS uses Javascript dates internally instead of Firestore timestamps.\n * This makes it easier to interact with the rest of the libraries and\n * bindings.\n * Also, Firestore references are replaced with {@link EntityReference}\n * @param data\n * @param buildReference\n * @param buildGeoPoint\n * @param buildDate\n * @param buildDelete\n * @group Firestore\n */\nexport function cmsToDelegateModel(data: any,\n buildReference: (reference: EntityReference) => any,\n buildGeoPoint: (geoPoint: GeoPoint) => any,\n buildDate: (date: Date) => any,\n buildDelete: () => any\n): any {\n if (data === undefined) {\n return buildDelete();\n } else if (data === null) {\n return null;\n } else if (Array.isArray(data)) {\n return data.map(v => cmsToDelegateModel(v, buildReference, buildGeoPoint, buildDate, buildDelete));\n } else if (data.isEntityReference && data.isEntityReference()) {\n return buildReference(data);\n } else if (data instanceof GeoPoint) {\n return buildGeoPoint(data);\n } else if (data instanceof Date) {\n return buildDate(data);\n } else if (data && typeof data === \"object\") {\n return Object.entries(data)\n .map(([key, v]) => ({ [key]: cmsToDelegateModel(v, buildReference, buildGeoPoint, buildDate, buildDelete) }))\n .reduce((a, b) => ({ ...a, ...b }), {});\n }\n return data;\n}\n","import { CustomizationController } from \"../types/customization_controller\";\n\nexport function useBuildCustomizationController(controller: CustomizationController): CustomizationController {\n return controller;\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport { AuthController } from \"../types\";\n\nexport const DEFAULT_SERVER_DEV = \"https://api-kdoe6pj3qq-ey.a.run.app\";\nexport const DEFAULT_SERVER = \"https://api-drplyi3b6q-ey.a.run.app\";\n\nexport type AccessResponse = {\n blocked?: boolean;\n message?: string;\n}\n\nasync function makeRequest(authController: AuthController) {\n const firebaseToken = await authController.getAuthToken();\n return fetch(DEFAULT_SERVER + \"/access_log\",\n {\n // mode: \"no-cors\",\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Basic ${firebaseToken}`,\n },\n body: JSON.stringify({})\n })\n .then(async (res) => {\n return res.json();\n });\n}\n\nexport function useProjectLog(authController: AuthController): AccessResponse | null {\n const [accessResponse, setAccessResponse] = useState<AccessResponse | null>(null);\n const accessedUserRef = useRef<string | null>(null);\n useEffect(() => {\n if (authController.user && authController.user.uid !== accessedUserRef.current && !authController.initialLoading) {\n makeRequest(authController).then(setAccessResponse);\n accessedUserRef.current = authController.user.uid;\n }\n }, [authController]);\n return accessResponse;\n}\n","import React, { useMemo } from \"react\";\n\nimport { EntityCollection, FireCMSContext, FireCMSPlugin, FireCMSProps, User } from \"../types\";\nimport { AuthControllerContext, ModeControllerContext } from \"../contexts\";\nimport { useBuildSideEntityController } from \"../internal/useBuildSideEntityController\";\nimport { useCustomizationController, useFireCMSContext, useModeController } from \"../hooks\";\nimport { useBuildSideDialogsController } from \"../internal/useBuildSideDialogsController\";\nimport { ErrorView } from \"../components\";\nimport { StorageSourceContext } from \"../contexts/StorageSourceContext\";\nimport { UserConfigurationPersistenceContext } from \"../contexts/UserConfigurationPersistenceContext\";\nimport { DataSourceContext } from \"../contexts/DataSourceContext\";\nimport { SideEntityControllerContext } from \"../contexts/SideEntityControllerContext\";\nimport { NavigationContext } from \"../contexts/NavigationContext\";\nimport { SideDialogsControllerContext } from \"../contexts/SideDialogsControllerContext\";\nimport { useLocaleConfig } from \"../internal/useLocaleConfig\";\nimport { CenteredView, Typography } from \"@firecms/ui\";\nimport { DialogsProvider } from \"../contexts/DialogsProvider\";\nimport { useBuildDataSource } from \"../internal/useBuildDataSource\";\nimport { useBuildCustomizationController } from \"../internal/useBuildCustomizationController\";\nimport { CustomizationControllerContext } from \"../contexts/CustomizationControllerContext\";\nimport { AnalyticsContext } from \"../contexts/AnalyticsContext\";\nimport { useProjectLog } from \"../hooks/useProjectLog\";\n\n/**\n * If you are using independent components of the CMS\n * you need to wrap them with this main component, so the internal hooks work.\n *\n * This is the main component of FireCMS. It acts as the provider of all the\n * internal contexts and hooks.\n *\n * You only need to use this component if you are building a custom app.\n *\n * @constructor\n * @group Core\n */\nexport function FireCMS<UserType extends User, EC extends EntityCollection>(props: FireCMSProps<UserType, EC>) {\n\n const modeController = useModeController();\n const {\n children,\n entityLinkBuilder,\n userConfigPersistence,\n dateTimeFormat,\n locale,\n authController,\n storageSource,\n dataSourceDelegate,\n plugins,\n onAnalyticsEvent,\n propertyConfigs,\n entityViews,\n components,\n navigationController,\n } = props;\n\n useLocaleConfig(locale);\n\n /**\n * Controller in charge of fetching and persisting data\n */\n const dataSource = useBuildDataSource({\n delegate: dataSourceDelegate,\n propertyConfigs,\n navigationController\n });\n\n const sideDialogsController = useBuildSideDialogsController();\n const sideEntityController = useBuildSideEntityController(navigationController, sideDialogsController);\n\n const pluginsLoading = plugins?.some(p => p.loading) ?? false;\n\n const loading = authController.initialLoading || navigationController.loading || pluginsLoading;\n\n const customizationController = useBuildCustomizationController({\n dateTimeFormat,\n locale,\n entityLinkBuilder,\n plugins,\n entityViews: entityViews ?? [],\n propertyConfigs: propertyConfigs ?? {},\n components\n });\n\n const analyticsController = useMemo(() => ({\n onAnalyticsEvent\n }), []);\n\n const accessResponse = useProjectLog(authController);\n\n if (navigationController.navigationLoadingError) {\n return (\n <CenteredView maxWidth={\"md\"}>\n <ErrorView\n title={\"Error loading navigation\"}\n error={navigationController.navigationLoadingError}/>\n </CenteredView>\n );\n }\n\n if (authController.authError) {\n return (\n <CenteredView maxWidth={\"md\"}>\n <ErrorView\n title={\"Error loading auth\"}\n error={authController.authError}/>\n </CenteredView>\n );\n }\n\n if (accessResponse?.blocked) {\n return (\n <CenteredView maxWidth={\"md\"} fullScreen={true}>\n <Typography variant={\"h4\"}>\n Access blocked\n </Typography>\n <Typography>\n This app has been blocked. Please reach out at <a\n href={\"mailto:hello@firecms.co\"}>hello@firecms.co</a> for more information.\n </Typography>\n {accessResponse?.message &&\n <Typography>Response from the server: {accessResponse?.message}</Typography>}\n </CenteredView>\n );\n }\n\n return (\n <ModeControllerContext.Provider value={modeController}>\n <AnalyticsContext.Provider value={analyticsController}>\n <CustomizationControllerContext.Provider value={customizationController}>\n <UserConfigurationPersistenceContext.Provider\n value={userConfigPersistence}>\n <StorageSourceContext.Provider\n value={storageSource}>\n <DataSourceContext.Provider\n value={dataSource}>\n <AuthControllerContext.Provider\n value={authController}>\n <SideDialogsControllerContext.Provider\n value={sideDialogsController}>\n <SideEntityControllerContext.Provider\n value={sideEntityController}>\n <NavigationContext.Provider\n value={navigationController}>\n <DialogsProvider>\n <FireCMSInternal\n loading={loading}>\n {children}\n </FireCMSInternal>\n </DialogsProvider>\n </NavigationContext.Provider>\n </SideEntityControllerContext.Provider>\n </SideDialogsControllerContext.Provider>\n </AuthControllerContext.Provider>\n </DataSourceContext.Provider>\n </StorageSourceContext.Provider>\n </UserConfigurationPersistenceContext.Provider>\n </CustomizationControllerContext.Provider>\n </AnalyticsContext.Provider>\n </ModeControllerContext.Provider>\n );\n\n}\n\nfunction FireCMSInternal({\n loading,\n children\n }: {\n loading: boolean;\n children: (props: {\n context: FireCMSContext;\n loading: boolean;\n }) => React.ReactNode;\n}) {\n\n const context = useFireCMSContext();\n const customizationController = useCustomizationController();\n\n let childrenResult = children({\n context,\n loading\n });\n\n const plugins = customizationController.plugins;\n if (!loading && plugins) {\n plugins.forEach((plugin: FireCMSPlugin) => {\n if (plugin.provider) {\n childrenResult = (\n <plugin.provider.Component {...plugin.provider.props}\n context={context}>\n {childrenResult}\n </plugin.provider.Component>\n );\n }\n });\n }\n\n return <>{childrenResult}</>;\n}\n","import React, { useCallback } from \"react\";\n\nimport { useLargeLayout, useNavigationController } from \"../hooks\";\n\nimport { NavLink, useNavigate } from \"react-router-dom\";\nimport { CMSAnalyticsEvent, TopNavigationEntry, TopNavigationResult } from \"../types\";\nimport { IconForView } from \"../util\";\nimport { cn, IconButton, Menu, MenuItem, MoreVertIcon, Tooltip, Typography } from \"@firecms/ui\";\nimport { useAnalyticsController } from \"../hooks/useAnalyticsController\";\n\n/**\n * Props used in case you need to override the default drawer\n * @group Core\n */\nexport type DrawerProps<T = {}> = T & {\n hovered: boolean,\n drawerOpen: boolean,\n closeDrawer: () => any,\n}\n\n/**\n * Default drawer used in the CMS\n * @group Core\n */\nexport function Drawer({\n hovered,\n drawerOpen,\n closeDrawer\n }: DrawerProps) {\n\n const analyticsController = useAnalyticsController();\n const navigation = useNavigationController();\n\n const tooltipsOpen = hovered && !drawerOpen;\n const largeLayout = useLargeLayout();\n const navigate = useNavigate();\n\n const [adminMenuOpen, setAdminMenuOpen] = React.useState(false);\n\n if (!navigation.topLevelNavigation)\n throw Error(\"Navigation not ready in Drawer\");\n\n const {\n navigationEntries,\n groups\n }: TopNavigationResult = navigation.topLevelNavigation;\n\n const adminViews = navigationEntries.filter(e => e.type === \"admin\") ?? [];\n const groupsWithoutAdmin = groups.filter(g => g !== \"Admin\");\n\n const buildGroupHeader = useCallback((group?: string) => {\n if (!drawerOpen) return <div className=\"h-12 w-full\"/>;\n return <div\n className=\"pt-8 pl-6 pr-8 pb-2 flex flex-row items-center\">\n <Typography variant={\"caption\"}\n color={\"secondary\"}\n className=\"font-medium flex-grow line-clamp-1\">\n {group ? group.toUpperCase() : \"Views\".toUpperCase()}\n </Typography>\n\n </div>;\n }, [drawerOpen]);\n\n const onClick = (view: TopNavigationEntry) => {\n const eventName: CMSAnalyticsEvent = view.type === \"collection\"\n ? \"drawer_navigate_to_collection\"\n : (view.type === \"view\" ? \"drawer_navigate_to_view\" : \"unmapped_event\");\n analyticsController.onAnalyticsEvent?.(eventName, { url: view.url });\n if (!largeLayout)\n closeDrawer();\n };\n\n return (\n <>\n\n <div className={\"flex-grow overflow-scroll no-scrollbar\"}>\n\n {groupsWithoutAdmin.map((group) => (\n <React.Fragment\n key={`drawer_group_${group}`}>\n {buildGroupHeader(group)}\n {Object.values(navigationEntries)\n .filter(e => e.group === group)\n .map((view, index) =>\n <DrawerNavigationItem\n key={`navigation_${index}`}\n icon={<IconForView collectionOrView={view.collection ?? view.view}/>}\n tooltipsOpen={tooltipsOpen}\n drawerOpen={drawerOpen}\n onClick={() => onClick(view)}\n url={view.url}\n name={view.name}/>)}\n </React.Fragment>\n ))}\n\n </div>\n\n {adminViews.length > 0 && <Menu\n open={adminMenuOpen}\n onOpenChange={setAdminMenuOpen}\n trigger={\n <IconButton\n shape={\"square\"}\n className={\"m-4 text-gray-900 dark:text-white w-fit\"}>\n <Tooltip title={\"Admin\"}\n open={tooltipsOpen}\n side={\"right\"} sideOffset={28}>\n <MoreVertIcon/>\n </Tooltip>\n {drawerOpen && <div\n className={cn(\n drawerOpen ? \"opacity-100\" : \"opacity-0 hidden\",\n \"mx-4 font-inherit text-inherit\"\n )}>\n ADMIN\n </div>}\n </IconButton>}\n >\n {adminViews.map((entry, index) =>\n <MenuItem\n onClick={(event) => {\n event.preventDefault();\n navigate(entry.path);\n }}\n key={`navigation_${index}`}>\n {<IconForView collectionOrView={entry.view}/>}\n {entry.name}\n </MenuItem>)}\n\n </Menu>}\n </>\n );\n}\n\nexport function DrawerNavigationItem({\n name,\n icon,\n drawerOpen,\n tooltipsOpen,\n url,\n onClick\n }: {\n icon: React.ReactElement,\n name: string,\n tooltipsOpen: boolean,\n drawerOpen: boolean,\n url: string,\n onClick?: () => void,\n}) {\n\n const iconWrap = <div\n className={\"text-gray-600 dark:text-gray-500\"}>\n {icon}\n </div>;\n\n const listItem = <NavLink\n onClick={onClick}\n style={{\n width: !drawerOpen ? \"72px\" : \"280px\",\n transition: drawerOpen ? \"width 150ms ease-in\" : undefined\n }}\n className={({ isActive }: any) => cn(\"rounded-r-xl truncate\",\n \"hover:bg-slate-300 hover:bg-opacity-75 dark:hover:bg-gray-700 dark:hover:bg-opacity-75 text-gray-800 dark:text-gray-200 hover:text-gray-900 hover:dark:text-white\",\n \"flex flex-row items-center mr-8\",\n // \"transition-all ease-in-out delay-100 duration-300\",\n // drawerOpen ? \"w-full\" : \"w-18\",\n drawerOpen ? \"pl-8 h-12\" : \"pl-6 h-11\",\n \"font-medium text-sm\",\n isActive ? \"bg-slate-200 bg-opacity-75 dark:bg-gray-800\" : \"\"\n )}\n to={url}\n >\n\n {iconWrap}\n\n <div\n className={cn(\n drawerOpen ? \"opacity-100\" : \"opacity-0 hidden\",\n \"ml-4 font-inherit text-inherit\"\n )}>\n {name.toUpperCase()}\n </div>\n </NavLink>;\n\n return <Tooltip\n open={drawerOpen ? false : tooltipsOpen}\n side=\"right\"\n title={name}>\n {listItem}\n </Tooltip>;\n}\n","import React, { PropsWithChildren, useCallback } from \"react\";\nimport equal from \"react-fast-compare\"\nimport { Link } from \"react-router-dom\";\n\nimport { Drawer as DefaultDrawer, DrawerProps } from \"./Drawer\";\nimport { useLargeLayout, useNavigationController } from \"../hooks\";\nimport { ErrorBoundary, FireCMSAppBar as DefaultFireCMSAppBar, FireCMSAppBarProps, FireCMSLogo } from \"../components\";\nimport { ChevronLeftIcon, cn, defaultBorderMixin, IconButton, MenuIcon, Sheet, Tooltip } from \"@firecms/ui\";\n\nexport const DRAWER_WIDTH = 280;\n\n/**\n * @group Core\n */\nexport interface ScaffoldProps<ExtraDrawerProps = object, ExtraAppbarProps = object> {\n\n /**\n * Name of the app, displayed as the main title and in the tab title\n */\n name: string;\n\n /**\n * Logo to be displayed in the drawer of the CMS\n */\n logo?: string;\n\n /**\n * Whether to include the drawer in the scaffold\n */\n includeDrawer?: boolean;\n\n /**\n * In case you need to override the view that gets rendered as a drawer\n * @see DefaultDrawer\n */\n Drawer?: React.ComponentType<DrawerProps<ExtraDrawerProps>>;\n\n /**\n * Additional props passed to the custom Drawer\n */\n drawerProps?: Partial<DrawerProps> & ExtraDrawerProps;\n\n /**\n * Open the drawer on hover\n */\n autoOpenDrawer?: boolean;\n\n /**\n * A component that gets rendered on the upper side of the main toolbar.\n * `toolbarExtraWidget` has no effect if this is set.\n */\n FireCMSAppBar?: React.ComponentType<FireCMSAppBarProps<ExtraAppbarProps>>;\n\n /**\n * Additional props passed to the custom AppBar\n */\n fireCMSAppBarProps?: Partial<FireCMSAppBarProps> & ExtraAppbarProps;\n\n}\n\n/**\n * This view acts as a scaffold for FireCMS.\n *\n * It is in charge of displaying the navigation drawer, top bar and main\n * collection views.\n * This component needs a parent {@link FireCMS}\n *\n * @param props\n * @constructor\n * @group Core\n */\nexport const Scaffold = React.memo<PropsWithChildren<ScaffoldProps>>(\n function Scaffold(props: PropsWithChildren<ScaffoldProps>) {\n\n const {\n children,\n name,\n logo,\n includeDrawer = true,\n autoOpenDrawer,\n Drawer = DefaultDrawer,\n drawerProps,\n FireCMSAppBar = DefaultFireCMSAppBar,\n fireCMSAppBarProps,\n } = props;\n\n const largeLayout = useLargeLayout();\n\n const [drawerOpen, setDrawerOpen] = React.useState(false);\n const [onHover, setOnHover] = React.useState(false);\n\n const setOnHoverTrue = useCallback(() => setOnHover(true), []);\n const setOnHoverFalse = useCallback(() => setOnHover(false), []);\n\n const handleDrawerClose = useCallback(() => {\n setDrawerOpen(false);\n }, []);\n\n const computedDrawerOpen: boolean = drawerOpen || Boolean(largeLayout && autoOpenDrawer && onHover);\n return (\n <div\n className=\"flex h-screen w-screen bg-gray-50 dark:bg-gray-900 text-gray-900 dark:text-white overflow-hidden\"\n style={{\n paddingTop: \"env(safe-area-inset-top)\",\n paddingLeft: \"env(safe-area-inset-left)\",\n paddingRight: \"env(safe-area-inset-right)\",\n paddingBottom: \"env(safe-area-inset-bottom)\",\n height: \"100dvh\"\n // \"@supports (height: 100dvh)\": {\n // height: \"100dvh\"\n // }\n }}>\n\n <FireCMSAppBar title={name}\n includeDrawer={includeDrawer}\n drawerOpen={computedDrawerOpen}\n {...fireCMSAppBarProps}/>\n\n <StyledDrawer\n displayed={includeDrawer}\n onMouseEnter={setOnHoverTrue}\n onMouseMove={setOnHoverTrue}\n onMouseLeave={setOnHoverFalse}\n open={computedDrawerOpen}\n logo={logo}\n hovered={onHover}\n setDrawerOpen={setDrawerOpen}>\n {includeDrawer && (\n <Drawer\n hovered={onHover}\n drawerOpen={computedDrawerOpen}\n closeDrawer={handleDrawerClose}\n {...drawerProps}/>)}\n </StyledDrawer>\n\n <main\n className=\"flex flex-col flex-grow overflow-auto\">\n <DrawerHeader/>\n <div\n className={cn(defaultBorderMixin, \"flex-grow overflow-auto lg:m-0 lg:mx-4 lg:mb-4 lg:rounded-lg lg:border lg:border-solid m-0 mt-1\")}>\n\n <ErrorBoundary>\n {children}\n </ErrorBoundary>\n\n </div>\n </main>\n </div>\n );\n },\n equal\n)\n\nconst DrawerHeader = () => {\n return (\n <div className=\"flex flex-col min-h-[68px]\"></div>\n );\n};\n\nfunction StyledDrawer(props: {\n children: React.ReactNode,\n displayed: boolean,\n open: boolean,\n logo?: string,\n hovered: boolean,\n setDrawerOpen: (open: boolean) => void,\n onMouseEnter: () => void,\n onMouseMove: () => void,\n onMouseLeave: () => void\n}) {\n\n const navigation = useNavigationController();\n\n const width = !props.displayed ? 0 : (props.open ? DRAWER_WIDTH : 72);\n const innerDrawer = <div\n className={\"relative h-full no-scrollbar overflow-y-auto overflow-x-hidden\"}\n style={{\n width,\n transition: \"left 100ms cubic-bezier(0.4, 0, 0.6, 1) 0ms, opacity 100ms cubic-bezier(0.4, 0, 0.6, 1) 0ms, width 100ms cubic-bezier(0.4, 0, 0.6, 1) 0ms\"\n }}\n >\n\n {!props.open && props.displayed && (\n <Tooltip title=\"Open menu\"\n side=\"right\"\n sideOffset={12}\n className=\"fixed top-2 left-3 !bg-gray-50 dark:!bg-gray-900 rounded-full w-fit\"\n >\n <IconButton\n color=\"inherit\"\n aria-label=\"Open menu\"\n className=\"sticky top-2 left-3 \"\n onClick={() => props.setDrawerOpen(true)}\n size=\"large\"\n >\n <MenuIcon/>\n </IconButton>\n </Tooltip>\n )}\n\n <div className={\"flex flex-col h-full\"}>\n <div\n style={{\n transition: \"padding 100ms cubic-bezier(0.4, 0, 0.6, 1) 0ms\",\n padding: props.open ? \"32px 144px 0px 24px\" : \"72px 16px 0px\"\n }}\n className={cn(\"cursor-pointer\")}>\n\n <Tooltip title={\"Home\"}\n sideOffset={20}\n side=\"right\">\n <Link\n to={navigation.basePath}>\n {props.logo\n ? <img src={props.logo}\n alt=\"Logo\"\n className={cn(\"max-w-full max-h-full\",\n props.open ?? \"w-[112px] h-[112px]\")}/>\n : <FireCMSLogo/>}\n\n </Link>\n </Tooltip>\n </div>\n\n {props.children}\n </div>\n\n </div>;\n\n const largeLayout = useLargeLayout();\n if (!largeLayout) {\n if (!props.displayed)\n return null;\n return <>\n <IconButton\n color=\"inherit\"\n aria-label=\"Open drawer\"\n onClick={() => props.setDrawerOpen(true)}\n size=\"large\"\n className=\"absolute top-2 left-6\"\n >\n <MenuIcon/>\n </IconButton>\n <Sheet side={\"left\"}\n transparent={true}\n open={props.open}\n onOpenChange={props.setDrawerOpen}\n >\n {innerDrawer}\n </Sheet>\n </>;\n }\n\n return (\n <div\n className=\"relative\"\n onMouseEnter={props.onMouseEnter}\n onMouseMove={props.onMouseMove}\n onMouseLeave={props.onMouseLeave}\n style={{\n width,\n transition: \"left 100ms cubic-bezier(0.4, 0, 0.6, 1) 0ms, opacity 100ms cubic-bezier(0.4, 0, 0.6, 1) 0ms, width 100ms cubic-bezier(0.4, 0, 0.6, 1) 0ms\"\n }}>\n\n {innerDrawer}\n\n <div\n className={`absolute right-0 top-4 ${\n props.open ? \"opacity-100\" : \"opacity-0 invisible\"\n } transition-opacity duration-1000 ease-in-out`}>\n <IconButton\n aria-label=\"Close drawer\"\n onClick={() => props.setDrawerOpen(false)}\n >\n <ChevronLeftIcon/>\n </IconButton>\n </div>\n\n </div>\n );\n}\n","import React from \"react\";\n\nimport { ArrayProperty, FieldProps, Property, PropertyConfig, ResolvedProperty } from \"../types\";\nimport {\n ArrayCustomShapedFieldBinding,\n ArrayOfReferencesFieldBinding,\n BlockFieldBinding,\n DateTimeFieldBinding,\n KeyValueFieldBinding,\n MapFieldBinding,\n MarkdownFieldBinding,\n MultiSelectBinding,\n ReferenceFieldBinding,\n RepeatFieldBinding,\n SelectFieldBinding,\n StorageUploadFieldBinding,\n SwitchFieldBinding,\n TextFieldBinding\n} from \"../form\";\nimport { isPropertyBuilder, mergeDeep } from \"../util\";\n\nimport {\n AddLinkIcon,\n BallotIcon,\n DriveFolderUploadIcon,\n EmailIcon,\n FlagIcon,\n FormatListNumberedIcon,\n FormatQuoteIcon,\n HttpIcon,\n LinkIcon,\n ListAltIcon,\n ListIcon,\n NumbersIcon,\n RepeatIcon,\n ScheduleIcon,\n ShortTextIcon,\n SubjectIcon,\n UploadFileIcon,\n ViewStreamIcon\n} from \"@firecms/ui\";\n\nexport function isDefaultFieldConfigId(id: string) {\n return Object.keys(DEFAULT_FIELD_CONFIGS).includes(id);\n}\n\nexport const DEFAULT_FIELD_CONFIGS: Record<string, PropertyConfig<any>> = {\n text_field: {\n key: \"text_field\",\n name: \"Text field\",\n description: \"Simple short text\",\n Icon: ShortTextIcon,\n color: \"#2d7ff9\",\n property: {\n dataType: \"string\",\n Field: TextFieldBinding\n }\n },\n multiline: {\n key: \"multiline\",\n name: \"Multiline\",\n description: \"Text with multiple lines\",\n Icon: SubjectIcon,\n color: \"#2d7ff9\",\n property: {\n dataType: \"string\",\n multiline: true,\n Field: TextFieldBinding\n }\n },\n markdown: {\n key: \"markdown\",\n name: \"Markdown\",\n description: \"Text with advanced markdown syntax\",\n Icon: FormatQuoteIcon,\n color: \"#2d7ff9\",\n property: {\n dataType: \"string\",\n markdown: true,\n Field: MarkdownFieldBinding\n }\n },\n url: {\n key: \"url\",\n name: \"Url\",\n description: \"Text with URL validation\",\n Icon: HttpIcon,\n color: \"#154fb3\",\n property: {\n dataType: \"string\",\n url: true,\n Field: TextFieldBinding\n }\n },\n email: {\n key: \"email\",\n name: \"Email\",\n description: \"Text with email validation\",\n Icon: EmailIcon,\n color: \"#154fb3\",\n property: {\n dataType: \"string\",\n email: true,\n Field: TextFieldBinding\n }\n },\n switch: {\n key: \"switch\",\n name: \"Switch\",\n description: \"Boolean true or false field (or yes or no, 0 or 1...)\",\n Icon: FlagIcon,\n color: \"#20d9d2\",\n property: {\n dataType: \"boolean\",\n Field: SwitchFieldBinding\n }\n },\n select: {\n key: \"select\",\n name: \"Select/enum\",\n description: \"Select one text value from within an enumeration\",\n Icon: ListIcon,\n color: \"#4223c9\",\n property: {\n dataType: \"string\",\n enumValues: [],\n Field: SelectFieldBinding\n }\n },\n multi_select: {\n key: \"multi_select\",\n name: \"Multi select\",\n description: \"Select multiple text values from within an enumeration\",\n Icon: ListAltIcon,\n color: \"#4223c9\",\n property: {\n dataType: \"array\",\n of: {\n dataType: \"string\",\n enumValues: [],\n },\n Field: MultiSelectBinding\n }\n },\n number_input: {\n key: \"number_input\",\n name: \"Number input\",\n description: \"Simple number field with validation\",\n Icon: NumbersIcon,\n color: \"#bec920\",\n property: {\n dataType: \"number\",\n Field: TextFieldBinding\n }\n },\n number_select: {\n key: \"number_select\",\n name: \"Number select\",\n description: \"Select a number value from within an enumeration\",\n Icon: FormatListNumberedIcon,\n color: \"#bec920\",\n property: {\n dataType: \"number\",\n enumValues: [],\n Field: SelectFieldBinding\n }\n },\n multi_number_select: {\n key: \"multi_number_select\",\n name: \"Multiple number select\",\n description: \"Select multiple number values from within an enumeration\",\n Icon: FormatListNumberedIcon,\n color: \"#bec920\",\n property: {\n dataType: \"array\",\n of: {\n dataType: \"number\",\n enumValues: [],\n },\n Field: MultiSelectBinding\n }\n },\n file_upload: {\n key: \"file_upload\",\n name: \"File upload\",\n description: \"Input for uploading single files\",\n Icon: UploadFileIcon,\n color: \"#f92d9a\",\n property: {\n dataType: \"string\",\n storage: {\n storagePath: \"{path}\"\n },\n Field: StorageUploadFieldBinding as React.ComponentType<FieldProps<string>>\n }\n },\n multi_file_upload: {\n key: \"multi_file_upload\",\n name: \"Multiple file upload\",\n description: \"Input for uploading multiple files\",\n Icon: DriveFolderUploadIcon,\n color: \"#f92d9a\",\n property: {\n dataType: \"array\",\n of: {\n dataType: \"string\",\n storage: {\n storagePath: \"{path}\"\n }\n },\n Field: StorageUploadFieldBinding\n }\n },\n reference: {\n key: \"reference\",\n name: \"Reference\",\n description: \"The value refers to a different collection\",\n Icon: LinkIcon,\n color: \"#ff0042\",\n property: {\n dataType: \"reference\",\n Field: ReferenceFieldBinding\n }\n },\n multi_references: {\n key: \"multi_references\",\n name: \"Multiple references\",\n description: \"Multiple values that refer to a different collection\",\n Icon: AddLinkIcon,\n color: \"#ff0042\",\n property: {\n dataType: \"array\",\n of: {\n dataType: \"reference\",\n },\n Field: ArrayOfReferencesFieldBinding\n }\n },\n date_time: {\n key: \"date_time\",\n name: \"Date/time\",\n description: \"A date time select field\",\n Icon: ScheduleIcon,\n color: \"#8b46ff\",\n property: {\n dataType: \"date\",\n Field: DateTimeFieldBinding\n }\n },\n group: {\n key: \"group\",\n name: \"Group\",\n description: \"Group of multiple fields\",\n Icon: BallotIcon,\n color: \"#ff9408\",\n property: {\n dataType: \"map\",\n properties: {},\n Field: MapFieldBinding\n }\n },\n key_value: {\n key: \"key_value\",\n name: \"Key-value\",\n description: \"Flexible field that allows the user to add multiple key-value pairs\",\n Icon: BallotIcon,\n color: \"#ff9408\",\n property: {\n dataType: \"map\",\n keyValue: true,\n Field: KeyValueFieldBinding\n }\n },\n repeat: {\n key: \"repeat\",\n name: \"Repeat/list\",\n description: \"A field that gets repeated multiple times (e.g. multiple text fields)\",\n Icon: RepeatIcon,\n color: \"#ff9408\",\n property: {\n dataType: \"array\",\n of: {\n dataType: \"string\",\n },\n Field: RepeatFieldBinding\n }\n },\n custom_array: {\n key: \"custom_array\",\n name: \"Custom array\",\n description: \"A field that saved its value as an array of custom objects\",\n Icon: RepeatIcon,\n color: \"#ff9408\",\n property: {\n dataType: \"array\",\n of: [],\n Field: ArrayCustomShapedFieldBinding\n }\n },\n block: {\n key: \"block\",\n name: \"Block\",\n description: \"A complex field that allows the user to compose different fields together, with a key->value format\",\n Icon: ViewStreamIcon,\n color: \"#ff9408\",\n property: {\n dataType: \"array\",\n oneOf: {\n properties: {},\n },\n Field: BlockFieldBinding\n }\n }\n};\n\nexport function getDefaultFieldConfig(property: Property | ResolvedProperty): PropertyConfig | undefined {\n const fieldId = getDefaultFieldId(property);\n if (!fieldId) {\n console.error(\"No field id found for property\", property);\n return undefined;\n }\n return DEFAULT_FIELD_CONFIGS[fieldId];\n}\n\nexport function getFieldConfig(property: Property | ResolvedProperty, propertyConfigs: Record<string, PropertyConfig<any>>): PropertyConfig | undefined {\n const fieldId = getFieldId(property);\n const defaultFieldId = getDefaultFieldId(property);\n if (!defaultFieldId) {\n console.error(\"No field id found for property\", property);\n return undefined;\n }\n const defaultFieldConfig = DEFAULT_FIELD_CONFIGS[defaultFieldId];\n const customField = fieldId ? propertyConfigs[fieldId] : undefined;\n return mergeDeep(defaultFieldConfig ?? {}, customField ?? {});\n}\n\nexport function getDefaultFieldId(property: Property | ResolvedProperty) {\n if (property.dataType === \"string\") {\n if (property.multiline) {\n return \"multiline\";\n } else if (property.markdown) {\n return \"markdown\";\n } else if (property.storage) {\n return \"file_upload\";\n } else if (property.url) {\n return \"url\";\n } else if (property.email) {\n return \"email\";\n } else if (property.enumValues) {\n return \"select\";\n } else {\n return \"text_field\";\n }\n } else if (property.dataType === \"number\") {\n if (property.enumValues) {\n return \"number_select\";\n }\n return \"number_input\";\n } else if (property.dataType === \"map\") {\n if (property.keyValue)\n return \"key_value\";\n if (property.properties)\n return \"group\";\n } else if (property.dataType === \"array\") {\n const of = (property as ArrayProperty).of;\n const oneOf = (property as ArrayProperty).oneOf;\n if (oneOf) {\n return \"block\";\n } else if (Array.isArray(of)) {\n return \"custom_array\";\n } else if (isPropertyBuilder(of)) {\n return \"repeat\";\n } else if (of?.dataType === \"string\" && of.enumValues) {\n return \"multi_select\";\n } else if (of?.dataType === \"number\" && of.enumValues) {\n return \"multi_number_select\";\n } else if (of?.dataType === \"string\" && of.storage) {\n return \"multi_file_upload\";\n } else if (of?.dataType === \"reference\") {\n return \"multi_references\";\n } else {\n return \"repeat\";\n }\n } else if (property.dataType === \"boolean\") {\n return \"switch\";\n } else if (property.dataType === \"date\") {\n return \"date_time\";\n } else if (property.dataType === \"reference\") {\n return \"reference\";\n }\n\n console.error(\"Unsupported field config mapping\", property);\n return undefined;\n}\n\nexport function getFieldId(property: Property | ResolvedProperty): string | undefined {\n if (property.propertyConfig)\n return property.propertyConfig;\n return getDefaultFieldId(property);\n}\n","import React from \"react\";\n\nimport { Route, Routes, useLocation } from \"react-router-dom\";\nimport { CMSView } from \"../types\";\nimport { DefaultHomePage, EntityCollectionView, ErrorBoundary, NotFoundPage } from \"../components\";\nimport { useNavigationController } from \"../hooks\";\nimport { toArray } from \"../util/arrays\";\n\n/**\n * @group Components\n */\nexport type NavigationRoutesProps = {\n /**\n * In case you need to override the home page\n */\n HomePage?: React.ComponentType;\n\n customRoutes?: React.ReactNode[]\n\n};\n\n/**\n * This component is in charge of rendering\n * all the related routes (entity collection root views, custom views\n * or the home route) related to a {@link NavigationController}.\n * This component needs a parent {@link FireCMS}\n *\n * @constructor\n * @group Components\n */\n\nexport const NavigationRoutes = React.memo<NavigationRoutesProps>(\n function NavigationRoutes({\n HomePage = DefaultHomePage,\n customRoutes\n }: NavigationRoutesProps) {\n\n const location = useLocation();\n const navigation = useNavigationController();\n\n if (!navigation)\n return <></>;\n\n const state = location.state as any;\n\n /**\n * The location can be overridden if `base_location` is set in the\n * state field of the current location. This can happen if you open\n * a side entity, like `products`, from a different one, like `users`\n */\n const baseLocation = state && state.base_location ? state.base_location : location;\n\n const cmsViews: React.ReactNode[] = [];\n if (navigation.views) {\n navigation.views.forEach((cmsView) => {\n if (Array.isArray(cmsView.path))\n cmsViews.push(...cmsView.path.map(path => buildCMSViewRoute(path, cmsView)));\n else\n cmsViews.push(buildCMSViewRoute(cmsView.path, cmsView));\n });\n }\n if (navigation.adminViews) {\n navigation.adminViews.forEach((cmsView) => {\n if (Array.isArray(cmsView.path))\n cmsViews.push(...cmsView.path.map(path => buildCMSViewRoute(path, cmsView)));\n else\n cmsViews.push(buildCMSViewRoute(cmsView.path, cmsView));\n });\n }\n\n // we reorder collections so that nested paths are included first\n const sortedCollections = [...(navigation.collections ?? [])]\n .sort((a, b) => b.path.length - a.path.length);\n\n const collectionRoutes = sortedCollections\n .map((collection) => {\n const urlPath = navigation.buildUrlCollectionPath(collection.id ?? collection.path);\n return <Route path={urlPath + \"/*\"}\n key={`navigation_${collection.id ?? collection.path}`}\n element={\n <ErrorBoundary>\n <EntityCollectionView\n key={`collection_view_${collection.id ?? collection.path}`}\n isSubCollection={false}\n parentCollectionIds={[]}\n fullPath={collection.id ?? collection.path}\n {...collection}\n Actions={toArray(collection.Actions)}/>\n </ErrorBoundary>\n }/>;\n }\n );\n\n const homeRoute = (\n <Route path={\"/\"}\n element={<HomePage/>}/>\n );\n\n const notFoundRoute = <Route path={\"*\"}\n element={\n <NotFoundPage/>\n }/>;\n\n return (\n <Routes location={baseLocation}>\n\n {collectionRoutes}\n\n {cmsViews}\n\n {homeRoute}\n\n {notFoundRoute}\n\n {customRoutes}\n\n </Routes>\n );\n });\n\nconst buildCMSViewRoute = (path: string, cmsView: CMSView) => {\n return <Route\n key={\"navigation_view_\" + path}\n path={path}\n element={cmsView.view}\n />;\n};\n"],"names":["SnackbarProvider","children","jsx","NotistackSnackbarProvider","DEFAULT_MODE_STATE","mode","ModeControllerContext","React","ModeControllerProvider","AuthControllerContext","removeInitialAndTrailingSlashes","s","removeInitialSlash","removeTrailingSlash","addInitialSlash","getLastSegment","path","cleanPath","segments","resolveCollectionPathIds","allCollections","subpaths","aliasedCollection","col","resolvedAliased","segmentCollection","getCollectionByPathOrId","restOfThePath","pathOrAlias","collections","subpathCombinations","getCollectionPathsCombinations","result","subpathCombination","navigationEntry","a","b","entry","newPath","entries","length","i","EntityReference","id","GeoPoint","latitude","longitude","pick","obj","args","res","key","isObject","item","mergeDeep","target","source","targetIsObject","output","getValueInPath","o","pathSegments","segment","firstSegment","isArrayAndIndexExists","nextObject","nextPath","removeInPath","currentObject","parts","last","part","removeFunctions","_","value","v","getHashValue","hash","removeUndefined","removeEmptyStrings","isEmptyObject","childRes","isString","shouldKeepIfString","removePropsIfExisting","comparison","val","isArray","DEFAULT_ONE_OF_TYPE","DEFAULT_ONE_OF_VALUE","isReadOnly","property","isHidden","isPropertyBuilder","propertyOrBuilder","getDefaultValuesFor","properties","getDefaultValueFor","defaultValuesFor","getDefaultValueForDataType","dataType","updateDateAutoValues","inputValues","status","timestampNowValue","setDateToMidnight","traverseValuesProperties","inputValue","resultDate","sanitizeData","values","getReferenceFrom","entity","operation","updatedValues","updatedValue","traverseValueProperty","e","typeField","valueField","type","childProperty","enumToObjectEntries","enumValues","getLabelOrConfigFrom","getColorScheme","labelOrConfig","getColorSchemeForSeed","CHIP_COLORS","isEnumValueDisabled","buildEnumLabel","resolveCollection","collection","entityId","previousValues","userConfigPersistence","fields","collectionOverride","storedProperties","defaultValues","usedValues","usedPreviousValues","resolvedProperties","propertyValue","getIn","childResolvedProperty","resolveProperty","cleanedProperties","fromBuilder","props","resolvedProperty","resolveProperties","resolveArrayProperty","resolvePropertyEnum","isDefaultFieldConfigId","cmsFields","customField","configPropertyOrBuilder","customFieldProperty","propertyKey","p","index","of","ofProperty","thisPropertyValue","resolveEnumValues","input","resolveEntityView","entityView","contextEntityViews","getNavigationEntriesFromPathInternal","currentFullPath","collectionPath","nextSegments","fullPath","entityViews","customView","sortProperties","propertiesOrder","propertiesKeys","resolveDefaultSelectedView","defaultSelectedView","params","applyPermissionsFunctionIfEmpty","permissionsBuilder","kebabCaseRegex","toKebabCase","str","regExpMatchArray","x","snakeCaseRegex","toSnakeCase","randomString","strLength","randomColor","slugify","text","separator","lowercase","from","to","l","unslugify","slug","txt","defaultDateFormat","COLLECTION_PATH_SEPARATOR","stripCollectionPath","segmentsToStrippedPath","fullPathToCollectionSegments","paths","serializeRegExp","hydrateRegExp","fragments","isValidRegExp","useDebouncedCallback","callback","immediate","timeoutMs","pendingUpdate","performUpdate","handlerRef","isReferenceProperty","getIdIcon","size","CircleIcon","getIconForWidget","widget","Icon","getIconForProperty","FunctionsIcon","getFieldConfig","getColorForProperty","getPropertyInPath","getResolvedPropertyInPath","getBracketNotation","getPropertiesWithPropertiesOrder","getDefaultPropertiesOrder","field","DEFAULT_PERMISSIONS","resolvePermissions","authController","permission","canEditEntity","canCreateEntity","canDeleteEntity","icon_synonyms","iconsSearch","JsSearch","iconKeys","importName","hashString","chr","getIcon","iconKey","className","iconKeysMap","IconForView","collectionOrView","Fragment","icon","slugName","iconsCount","coolIconKeys","prevProps","nextProps","equal","acc","plural","word","amount","plurals","irregular","w","pattern","replace","reg","singular","singulars","getEntityPreviewKeys","targetCollection","previewProperties","limit","allProperties","listProperties","getEntityTitlePropertyKey","propertyConfigs","getEntityImagePreviewPropertyKey","flattenObject","parentKey","flatObj","newKey","getArrayValuesCount","array","nested","nestedKey","nestedCount","compoundKey","makePropertiesEditable","makePropertiesNonEditable","updated","applyModifyFunction","modifyCollection","parentPaths","resCollection","subcollection","joinCollectionLists","targetCollections","sourceCollections","updatedCollections","sourceCol","targetCol","mergeCollection","sourceCollectionIds","resultStoredCollections","subcollectionsMerged","propertiesMerged","mergePropertyOrBuilder","mergedCollection","targetPropertiesOrder","getCollectionKeys","sourcePropertiesOrder","mergedPropertiesOrder","mergedEntityViews","resultCollection","modifiedCollection","mergedProperty","targetEditable","sourceEditable","targetProperties","sourceProperties","mergedProperties","f","buildCollection","buildProperty","buildProperties","buildPropertiesOrBuilder","propertiesOrBuilder","buildEnumValues","buildEnumValueConfig","enumValueConfig","buildEntityCallbacks","callbacks","buildAdditionalFieldDelegate","additionalFieldDelegate","buildFieldConfig","propertyConfig","printChanged","prev","depth","maxDepth","useTraceUpdate","useRef","useEffect","CONTAINER_FULL_WIDTH","ADDITIONAL_TAB_WIDTH","FORM_CONTAINER_WIDTH","DataSourceContext","useDataSource","defaultDataSource","useContext","NavigationContext","useNavigationController","useAuthController","SideDialogsControllerContext","useSideDialogsController","SideEntityControllerContext","useSideEntityController","StorageSourceContext","useStorageSource","defaultStorageSource","useSnackbarController","enqueueSnackbar","closeSnackbar","useSnackbar","open","useCallback","message","autoHideDuration","close","useMemo","UserConfigurationPersistenceContext","useUserConfigurationPersistence","DialogsControllerContext","DialogsProvider","dialogEntries","setDialogEntries","useState","dialogEntriesRef","updateDialogEntries","newPanels","updatedPanels","dialogEntry","jsxs","useDialogsController","CustomizationControllerContext","useCustomizationController","AnalyticsContext","useAnalyticsController","useFireCMSContext","sideDialogsController","sideEntityController","navigation","dataSource","storageSource","snackbarController","dialogsController","customizationController","analyticsController","fireCMSContextRef","useCollectionFetch","inputPath","filterValues","sortBy","itemCount","searchString","sortByProperty","currentSort","context","data","setData","dataLoading","setDataLoading","dataLoadingError","setDataLoadingError","noMoreToLoad","setNoMoreToLoad","onEntitiesUpdate","entities","onError","error","CACHE","useEntityFetch","useCache","setEntity","onEntityUpdate","updatedEntity","saveEntityWithCallbacks","onSaveSuccess","onSaveFailure","onPreSaveHookError","onSaveSuccessHookError","resolvedPath","resolvedCollection","deleteEntityWithCallbacks","onDeleteSuccess","onDeleteFailure","onPreDeleteHookError","onDeleteSuccessHookError","entityDeleteProps","resolveNavigationFrom","resultPromises","useResolvedNavigationFrom","useModeController","useClipboard","options","onSuccess","disableClipboardAPI","copiedDuration","ref","isCoppied","setIsCoppied","clipboard","setClipbaord","isSupported","handleError","handleSuccess","copyToClipboard","err","clearClipboard","copy","action","cut","element","isInput","breakpoints","isLargeLayoutGlobal","checkLargeLayout","listeners","notifyListeners","listener","newIsLargeLayout","useLargeLayout","isLargeLayout","setIsLargeLayout","breakpoint","ErrorTooltip","Tooltip","ErrorView","title","tooltip","component","body","ErrorIcon","Typography","EmptyValue","TINY_THUMBNAIL","SMALL_THUMBNAIL","REGULAR_THUMBNAIL","getThumbnailMeasure","getPreviewSizeFrom","ImagePreview","url","onHover","setOnHover","imageSize","imageStyle","IconButton","ContentCopyIcon","OpenInNewIcon","UrlComponentPreview","previewType","hint","DescriptionIcon","SkeletonPropertyComponent","content","stringProperty","renderUrlComponent","renderSkeletonImageThumbnail","renderSkeletonText","arrayProperty","renderGenericArrayCell","renderArrayOfMaps","renderArrayEnumTableCell","renderArrayOfStrings","renderMap","renderReference","mapPropertyKeys","tableProperties","Skeleton","renderSkeletonIcon","renderUrlFile","width","renderSkeletonCaptionText","StorageThumbnail","StorageThumbnailInternal","areEqual","URL_CACHE","storeUrl","storagePathOrDownloadUrl","setError","storage","downloadConfig","setDownloadConfig","unmounted","filetype","getFiletype","EnumValuesChip","enumKey","enumValuesConfig","enumValue","label","colorScheme","Chip","StringPropertyPreview","ErrorBoundary","lines","cn","ArrayPropertyPreview","inputProperty","childSize","defaultBorderMixin","PropertyPreview","EntityPreview","actions","disabled","hover","collectionProp","onClick","includeEntityNavigation","navigationController","titleProperty","imagePropertyKey","imageProperty","restProperties","EntityPreviewContainer","KeyboardTabIcon","EntityPreviewContainerInner","style","event","ReferencePreview","reference","ReferencePreviewInternal","allowEntityNavigation","ReferencePreviewExisting","referencesCache","usedEntity","ArrayOfReferencesPreview","ArrayOfStorageComponentsPreview","ArrayEnumPreview","name","ArrayPropertyEnumPreview","ArrayOfStringsPreview","ArrayOneOfPreview","MapPropertyPreview","mapProperty","KeyValuePreview","childValue","DatePreview","date","dateUtilsLocale","locales","dateFormat","formattedDate","format","BooleanPreview","Checkbox","NumberPropertyPreview","height","createElement","Markdown","buildWrongValueType","ArrayOfMapsPreview","mapProperties","AsyncPreviewComponent","builder","loading","setLoading","setResult","EntityView","VirtualTableInput","multiline","updateValue","focused","prevValue","internalValue","setInternalValue","focusedState","doUpdate","TextareaAutosize","evt","newValue","VirtualTableSelect","small","multiple","valueType","validValue","onChange","renderValue","MultiSelect","enumConfig","MultiSelectItem","Select","SelectItem","VirtualTableNumberInput","align","propStringValue","numberValue","regexp","VirtualTableSwitch","BooleanSwitch","VirtualTableDateField","locale","DateTimeField","dateValue","errorInfo","resolveFilenameString","file","replacePlaceholders","resolveStoragePathString","ext","useStorageUploadController","entityValues","multipleFilesSupported","metadata","compression","internalInitialValue","getRandomId","initialValue","setInitialValue","fileNameBuilder","fileName","storagePathBuilder","onFileUploadComplete","uploadedPath","uploadPathOrDownloadUrl","removeDuplicates","fieldValue","onFilesAdded","acceptedFiles","newInternalValue","compressionFormat","resizeAndCompressImage","items","supportedTypes","defaultQuality","resolve","inputQuality","quality","Resizer","StorageUploadProgress","storagePath","simple","mounted","uploading","upload","paperMixin","EntityTableCellActions","showError","showExpandIcon","selected","openPopup","doOpenPopup","cellRect","iconRef","ErrorOutlineIcon","dropZoneClasses","activeDropClasses","acceptDropClasses","rejectDropClasses","TableStorageUpload","previewSize","StorageUpload","previewSizeInput","autoFocus","hasValue","snackbarContext","getRootProps","getInputProps","isDragActive","isDragAccept","isDragReject","useDropzone","fileRejections","fileRejection","rootProps","helpText","renderProperty","child","TableStorageItemPreview","EditIcon","TableReferenceField","TableReferenceFieldSuccess","multiselect","forceFilter","onSingleEntitySelected","onMultipleEntitiesSelected","selectedEntityIds","referenceDialogController","useReferenceDialog","handleOpen","valueNotSet","buildSingleReferenceField","buildMultipleReferenceField","Button","yup","mapper","getYupEntitySchema","customFieldValidator","objectSchema","mapPropertyToYup","propertyContext","getYupStringSchema","getYupNumberSchema","getYupBooleanSchema","getYupMapObjectSchema","getYupArraySchema","getYupDateSchema","getYupGeoPointSchema","getYupReferenceSchema","validation","childName","shape","parentProperty","regExp","hasUniqueInArrayModifier","arraySchema","yupProperties","object","arrayUniqueFields","getRowHeight","TableCellInner","justifyContent","scrollable","faded","fullHeight","EntityTableCell","disabledTooltip","saved","allowScroll","removePadding","onSelect","hideOverflow","measureRef","bounds","useMeasure","maxHeight","internalSaved","setInternalSaved","handler","onSelectCallback","onFocus","isOverflowing","isSelected","setOnHoverTrue","setOnHoverFalse","RemoveCircleIcon","SelectableTableContext","useSelectableTableController","useClearRestoreValue","setValue","clearedValueRef","isStorageProperty","PropertyTableCell","readonly","disabledProp","onValueChange","selectedCell","select","setPopupCell","internalValueRef","setSaved","onValueUpdated","customPreview","readOnlyProperty","saveValues","innerComponent","includeActions","numberProperty","EntityCollectionRowActions","frozen","selectionEnabled","highlightEntity","onCollectionChange","unhighlightEntity","hideId","selectionController","largeLayout","onCheckedChange","checked","hasActions","hasCollapsedActions","collapsedActions","uncollapsedActions","Menu","MoreVertIcon","MenuItem","CollectionTableToolbar","searchInputRef","searchLoading","clearFilterButton","FilterListOffIcon","sizeSelect","CircularProgress","SearchBar","getTableCellAlignment","getTablePropertyColumnWidth","getSubcollectionColumnId","COLLECTION_GROUP_PARENT_ID","useColumnIds","includeSubcollections","hideAndExpandKeys","getDefaultColumnKeys","keys","getColumnKeysForProperty","subCol","includeSubCollections","propertyKeys","additionalFields","subCollections","columnIds","subCollectionIds","subColId","childKey","buildIdColumn","propertiesToColumns","sortable","disabledFilter","AdditionalHeaderWidget","filterable","filterableProperty","partOfArray","CircularProgressCenter","VirtualTableHeader","resizeHandleRef","columnIndex","isResizingIndex","sort","onColumnSort","onFilterUpdate","filter","column","onClickResizeColumn","createFilterField","openFilter","setOpenFilter","hidden","setHidden","handleSettingsClick","update","filterForProperty","newOpenFilterState","thisColumnIsResizing","hovered","Badge","ArrowUpwardIcon","Popover","FilterListIcon","FilterForm","filterInternal","setFilterInternal","submit","reset","filterIsSet","filterField","VirtualTableHeaderRow","columns","onColumnResize","onColumnResizeEnd","AddColumnComponent","columnRefs","createRef","isResizing","setIsResizing","adjustWidthColumn","end","minWidth","maxWidth","newWidth","getEventNewWidth","left","setCursorDocument","handleOnMouseMove","handleOnMouseUp","removeResizingListeners","attachResizeListeners","c","filterForThisProperty","VirtualTableRow","rowData","rowIndex","onRowClick","hoverRow","rowClassName","VirtualTableCell","VirtualListContext","createContext","innerElementType","forwardRef","rest","virtualTableProps","VirtualTable","onResetPagination","onEndReached","columnsProp","filterInput","checkFilterCombination","emptyComponent","onSortByUpdate","cellRenderer","endAdornment","setColumns","tableRef","endReachCallbackThreshold","onColumnResizeInternal","onColumnResizeEndInternal","filterRef","scrollToTop","isDesc","newSort","newSortProperty","newSortBy","resetSort","maxScroll","onEndReachedInternal","scrollOffset","onScroll","scrollUpdateWasRequested","onFilterUpdateInternal","newFilterValue","buildErrorView","buildEmptyView","AssignmentIcon","empty","virtualListController","MemoizedList","outerRef","itemSize","includeAddColumn","Row","cellData","List","operationLabels","multipleSelectOperations","ReferenceFilterField","possibleOperations","fieldOperation","setOperation","updateFilter","op","prevOpIsArray","newOpIsArray","hasNewValue","doOpenDialog","buildEntry","StringNumberFilterField","TextField","ClearIcon","BooleanFilterField","valueSetToTrue","valueSet","BooleanSwitchWithLabel","DateTimeFilterField","SelectableTable","onEntityClick","inlineEditing","setFilterValues","setSortBy","setSearchString","clearFilter","setItemCount","pageSize","paginationEnabled","highlightedRow","setSelectedCell","loadNextPage","resetPagination","useOutsideAlerter","unselect","escFunction","cell","updatedFilterValues","filterValue","setFilterValue","baseProperty","EntityCollectionTable","actionsStart","tableRowActionsBuilder","uniqueFieldValidator","getPropertyFor","highlightedEntities","onSizeChanged","textSearchEnabled","displayedColumnIds","defaultSize","tableController","additionalIDHeaderWidget","getIdColumnWidth","onTextSearchClick","textSearchLoading","disabledFilterChange","selectedEntities","setSize","updateSize","onTextSearch","newSearchString","additionalFieldsMap","aC","propertyCellRenderer","additionalCellRenderer","additionalField","Builder","collectionColumns","columnsResult","additionalTableColumns","columnKey","useDataOrder","entitiesDisplayedFirst","displayedFirstId","useDebouncedData","deps","deferredData","setDeferredData","dataLength","currentDeps","haveDepsChanged","immediateUpdate","DEFAULT_PAGE_SIZE","useDataSourceEntityCollectionTableController","lastDeleteTimestamp","forceFilterFromProps","initialFilter","initialSort","forceFilterFromCollection","popupCell","initialSortInternal","rawData","setRawData","updateFilterValues","updatedFilter","orderedData","useSelectionController","onSelectionChange","setSelectedEntities","toggleEntitySelection","isEntitySelected","useTableSearchHelper","parentCollectionIds","setTextSearchLoading","textSearchInitialised","setTextSearchInitialised","ReferenceSelectionTable","pathInput","selectedEntityIdsProp","description","maxSelection","sideDialogContext","useSideDialogContext","setEntitiesDisplayedFirst","onClear","onNewClick","onDone","ReferenceDialogActions","DialogActions","addButton","AddIcon","toArray","NavigationGroup","group","userConfigurationPersistence","ExpandablePanel","expanded","g","NavigationCard","Card","ArrowForwardIcon","SmallNavigationCard","ReactLink","cardMixin","cardClickableMixin","focusedMixin","NavigationCardBinding","view","collectionIcon","navigate","useNavigate","favourite","actionsArray","StarIcon","StarBorderIcon","actionProps","plugin","NavigationChip","onIconClick","FavouritesView","favouriteCollections","Collapse","scrollsMap","useRestoreScroll","location","useLocation","containerRef","scroll","setScroll","direction","setDirection","handleScroll","container","search","DefaultHomePage","additionalActions","additionalChildrenStart","additionalChildrenEnd","navigationEntries","groups","filteredUrls","setFilteredUrls","filteredNavigationEntries","updateSearchResults","searchResult","allGroups","additionalPluginChildrenStart","additionalPluginChildrenEnd","additionalPluginSections","sectionProps","section","Container","AdditionalCards","thisGroupCollections","AdditionalCard","EntityCollectionViewActions","relativePath","onMultipleDeleteClick","collectionEntitiesCount","plugins","multipleDeleteEnabled","multipleDeleteButton","button","DeleteIcon","Action","j","useDraggable","innerRef","y","onMove","relX","relY","listeningRef","onMouseDown","y2","onMouseMove","onMouseUp","onMouseDownInner","current","innerCurrent","useWindowSize","useLayoutEffect","ElementResizeListener","onResize","rafRef","objectRef","onResizeRef","_onResize","onLoad","FormikArrayContainer","addLabel","onInternalIdAdded","includeAddButton","newDefaultEntry","setFieldValue","ArrayContainer","FieldHelperText","includeDescription","hasDescription","InfoIcon","LabelWithIcon","required","SelectFieldBinding","touched","handleClearClick","option","MultiSelectBinding","list","CloseIcon","ArrayOfReferencesFieldBinding","isSubmitting","tableMode","onEntryClick","internalId","entryValue","fieldBackgroundMixin","StorageItemPreview","onRemove","RemoveIcon","disabledClasses","nonActiveDropClasses","StorageUploadFieldBinding","FileDropComponent","isDraggingOver","droppableProvided","fieldBackgroundDisabledMixin","fieldBackgroundHoverMixin","Draggable","provided","snapshot","moveItem","fromIndex","toIndex","onDragEnd","clearedStoragePathOrDownloadUrl","DragDropContext","Droppable","rubric","TextFieldBinding","inputType","isMultiline","SwitchFieldBinding","DateTimeFieldBinding","ReadOnlyFieldBinding","ReferenceFieldBinding","ReferenceFieldBindingInternal","PropertyFieldBinding","PropertyFieldBindingInternal","aIsBuilder","bIsBuilder","shouldPropertyReRender","underlyingValueHasChanged","partOfBlock","Field","fieldProps","Component","componentProps","FieldInternal","customFieldProps","UsedComponent","useWrappedComponent","shouldValidate","otherPropertyKey","cmsFieldProps","defAProperty","rerenderThisProperty","Wrapper","fieldId","getFieldId","enabled","MapFieldBinding","pickOnlySomeKeys","mapFormView","entryKey","KeyValueFieldBinding","MapEditView","fieldName","internalState","setInternalState","getDataType","currentKeys","newKeys","keysToAdd","keysToRemove","newRowIds","k","originalValue","updateDataType","rowId","row","fieldKey","onFieldKeyChange","currentRowId","MapKeyValueRow","onDeleteClick","buildInput","ArrayKeyValueRow","newArrayValue","doUpdateDataType","ArrowDropDownIcon","selectedDataType","setSelectedDataType","RepeatFieldBinding","lastAddedId","setLastAddedId","arrayContainer","BlockFieldBinding","BlockEntry","firstOneOfKey","typeInternal","setTypeInternal","formex","useFormex","updateType","enumValuesConfigs","typeFieldName","valueFieldName","newType","newSelectedProperty","value1","mdParser","MarkdownIt","MdEditor","Plugins","MarkdownFieldBinding","valueRef","useInjectStyles","markdownCss","deferred","useDeferredValue","html","ArrayCustomShapedFieldBinding","ErrorFocus","isValidating","errors","errorElement","scrollableParent","getScrollableParent","top","isScrollable","ele","hasScrollableContent","overflowYStyle","isOverflowHidden","CustomIdField","customId","idSetAutomatically","DeleteEntityDialog","entityOrEntitiesToDelete","onClose","onEntityDelete","onMultipleEntitiesDelete","entityOrEntities","setUsedEntityOrEntities","multipleEntities","setMultipleEntities","revisedEntityOrEntities","handleCancel","performDelete","handleOk","results","success","dialogTitle","Dialog","DialogContent","editEntityAction","copyEntityAction","FileCopyIcon","deleteEntityAction","closeDialog","PropertyIdCopyTooltipContent","propertyId","copied","setCopied","ContentPasteIcon","EntityForm","EntityFormInternal","getDataSourceEntityValues","initialResolvedCollection","inputCollection","onEntitySaveRequested","onDiscard","onModified","onValuesChanged","onIdChange","onFormContextChange","autoSave","onIdUpdateError","mustSetCustomId","initialEntityId","closeAfterSaveRef","baseDataSourceValuesRef","setEntityId","entityIdError","setEntityIdError","savingError","setSavingError","customIdLoading","setCustomIdLoading","internalValues","setInternalValues","save","eventName","onSubmit","formexController","useCreateFormex","validationSchema","yupToFormErrors","initialValues","setUnderlyingChanges","latestValue","doOnValuesChanges","titlePropertyKey","onIdUpdate","doOnIdUpdate","updatedId","underlyingChanges","getActionsForEntity","customEntityActions","createEnabled","deleteEnabled","pluginActions","formContext","Formex","Alert","InnerForm","handleSubmit","resetForm","dirty","entityActions","formActions","modified","formValue","formFields","cmsFormFieldProps","formRef","yupError","setIn","PopupFormField","PopupFormFieldInternal","tableKey","entityProp","onCellValueChange","fireCMSContext","popupLocation","setPopupLocation","windowSize","draggableRef","initialPositionSet","getInitialLocation","normalizePosition","draggableBoundingRect","updatePopupLocation","position","newPosition","adaptResize","saveValue","internalForm","form","draggable","Portal","EntityCollectionView","isSubCollection","userOverride","collectionRef","canCreateEntities","selectedNavigationEntity","setSelectedNavigationEntity","deleteEntityClicked","setDeleteEntityClicked","setLastDeleteTimestamp","docsCount","setDocsCount","unselectNavigatedEntity","currentSelection","checkInlineEditing","popOverOpen","setPopOverOpen","usedSelectionController","onPopupClose","clickedEntity","internalOnEntityDelete","_path","internalOnMultipleEntitiesDelete","onCollectionModifiedForUser","partialCollection","currentStoredConfig","updatedConfig","localCollection","buildPropertyWidthOverwrite","saveProps","resolvedFullPath","subcollectionColumns","collectionGroupParentCollections","collectionsWithPath","updateLastDeleteTimestamp","actionsWidth","EntitiesCount","buildAdditionalHeaderWidget","HeaderAction","addColumnComponentInternal","EntityIdHeaderWidget","onCountChange","count","setCount","setOpenPopup","SearchIcon","PropertyConfigBadge","classes","defaultPropertyConfig","getDefaultFieldConfig","NotFoundPage","DeleteConfirmationDialog","onAccept","onCancel","LoadingButton","FireCMSLogo","FireCMSAppBar","startAdornment","drawerOpen","dropDownActions","includeDrawer","userProp","toggleMode","user","avatarComponent","Avatar","initial","DarkModeIcon","LightModeIcon","LogoutIcon","buildIdsMap","droppableId","internalIdsRef","internalIds","setInternalIds","newInternalIds","hashValue","newInternalId","insertInEnd","newIds","remove","copyingItem","sourceIndex","destinationIndex","temp","arrayMove","ArrayContainerItem","droppableSnapshot","isDragging","ArrayItemOptions","menuOpen","setMenuOpen","HandleIcon","removed","ReferenceWidget","onReferenceSelected","onMultipleReferenceSelected","references","UPDATE_SEARCH_INDEX_WAIT_MS","SearchIconsView","selectedIcon","onIconSelected","setKeys","query","setQuery","debounce","icons","FieldCaption","referenceDialogProps","usedCollection","fireCMSLogo","useBrowserTitleAndIcon","logo","link","getParentReferencesFromPath","DEFAULT_BASE_PATH","DEFAULT_COLLECTION_PATH","useBuildNavigationController","basePath","baseCollectionPath","collectionsProp","collectionPermissions","viewsProp","adminViewsProp","viewsOrder","dataSourceDelegate","injectCollections","collectionsRef","setCollections","views","setViews","adminViews","setAdminViews","initialised","setInitialised","topLevelNavigation","setTopLevelNavigation","navigationLoading","setNavigationLoading","navigationLoadingError","setNavigationLoadingError","cleanBasePath","cleanBaseCollectionPath","homeUrl","fullCollectionPath","buildCMSUrlPath","encodePath","buildUrlCollectionPath","computeTopNavigation","aIndex","bIndex","refreshNavigation","resolvedCollections","resolvedViews","resolvedAdminViews","resolveCollections","resolveCMSViews","getCollection","idOrPath","includeUserOverride","baseCollection","overriddenCollection","subcollections","permissions","getCollectionFromPaths","currentCollections","pathSegment","getCollectionFromIds","ids","isUrlCollectionPath","urlPathToDataPath","buildUrlEditCollectionPath","resolveAliasesFrom","getAllParentReferencesForPath","getParentCollectionIds","oddPathSegments","r","convertIdsToPaths","getSidePanelKey","filterOutNotAllowedCollections","baseViews","useBuildLocalConfigurationPersistence","configCache","setConfigCache","getCollectionFromStorage","storageKey","getCollectionConfig","onCollectionModified","currentCache","cachedConfig","newConfig","recentlyVisitedPaths","_setRecentlyVisitedPaths","favouritePaths","_setFavouritePaths","collapsedGroups","_setCollapsedGroups","setRecentlyVisitedPaths","setFavouritePaths","setCollapsedGroups","useBuildModeController","prefersDarkModeQuery","prefersDarkMode","setMode","setDocumentMode","setDarkMode","setLightMode","MAIN_TAB_VALUE","EntityEditView","selectedSubPath","onValuesAreModified","formWidth","onUpdate","saving","setSaving","valuesToBeSaved","setValuesToBeSaved","saveEntity","setFormContext","setStatus","modifiedValuesRef","modifiedValues","subcollectionsCount","customViews","customViewsCount","hasAdditionalViews","selectedTabRef","mainViewVisible","setUsedEntity","readOnly","setReadOnly","editEnabled","closeAfterSave","onSaveEntityRequest","resolvedEntityViews","customViewsView","colIndex","globalLoading","subCollectionsViews","subcollectionId","onSideTabClick","prevEntity","buildForm","subcollectionTabs","Tab","customViewTabs","Tabs","useNavigationUnsavedChangesDialog","when","nextLocation","setNextLocation","navigator","UNSAFE_NavigationContext","blocker","retry","unblock","tx","autoUnblockingTx","UnsavedChangesDialog","SideDialogContext","blocked","SideDialogs","sidePanels","panels","panel","SideDialogView","offsetPosition","drawerCloseRequested","setDrawerCloseRequested","setBlocked","blockedNavigationMessage","setBlockedNavigationMessage","widthRef","navigationWasBlocked","handleNavigationOk","handleNavigationCancel","handleDrawerCloseOk","handleDrawerCloseCancel","onCloseRequest","force","Sheet","EntitySidePanel","registryCollection","beforeunload","NEW_URL_HASH","getEntityViewWidth","mainViewSelected","resolvedWidth","useBuildSideEntityController","smallLayout","newFlag","entityOrCollectionPath","panelsFromUrl","buildSidePanelsFromUrl","propsToSidePanel","navigationViewsForPath","lastCollectionPath","previousEntry","lastSidePanel","resolvedPanelProps","useBuildSideDialogsController","setSidePanels","sidePanelsRef","routesStore","routesCount","updateSidePanels","baseLocation","panelProps","useLocaleConfig","dateFnsLocale","registerLocale","setDefaultLocale","useBuildDataSource","delegate","startAfter","orderBy","order","isCollectionGroup","firestoreValues","cmsToDelegateModel","updatedFirestoreValues","buildReference","buildGeoPoint","buildDate","buildDelete","useBuildCustomizationController","controller","DEFAULT_SERVER","makeRequest","firebaseToken","useProjectLog","accessResponse","setAccessResponse","accessedUserRef","FireCMS","modeController","entityLinkBuilder","dateTimeFormat","onAnalyticsEvent","components","pluginsLoading","CenteredView","FireCMSInternal","childrenResult","Drawer","closeDrawer","tooltipsOpen","adminMenuOpen","setAdminMenuOpen","groupsWithoutAdmin","buildGroupHeader","DrawerNavigationItem","iconWrap","listItem","NavLink","isActive","DRAWER_WIDTH","Scaffold","autoOpenDrawer","DefaultDrawer","drawerProps","DefaultFireCMSAppBar","fireCMSAppBarProps","setDrawerOpen","handleDrawerClose","computedDrawerOpen","StyledDrawer","DrawerHeader","innerDrawer","MenuIcon","Link","ChevronLeftIcon","DEFAULT_FIELD_CONFIGS","ShortTextIcon","SubjectIcon","FormatQuoteIcon","HttpIcon","EmailIcon","FlagIcon","ListIcon","ListAltIcon","NumbersIcon","FormatListNumberedIcon","UploadFileIcon","DriveFolderUploadIcon","LinkIcon","AddLinkIcon","ScheduleIcon","BallotIcon","RepeatIcon","ViewStreamIcon","getDefaultFieldId","defaultFieldId","defaultFieldConfig","NavigationRoutes","HomePage","customRoutes","state","cmsViews","cmsView","buildCMSViewRoute","collectionRoutes","urlPath","Route","homeRoute","notFoundRoute","Routes"],"mappings":"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A,CAAmB,CAExC,CAAA,CAAA,CAGR,CAEA,MAAMmuC,GAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EChGb,SAASI,GAAoD,CACI,YAAAnqC,EACA,MAAArF,EACA,MAAAoW,EACA,UAAA4Q,EACA,aAAA+gB,EACA,SAAAza,EACA,UAAA0a,EACA,SAAA/mC,EACA,mBAAAimC,EACA,0BAAAsD,EACA,QAAAh1B,EACA,SAAAmJ,CACJ,EAA4B,CAE5F,GAAI,CAAC,MAAM,QAAQ1d,EAAS,kBAAkB,EAC1C,MAAM,MAAM,uEAAuE,EAEvF,MAAM4/B,EAAW5/B,EAAS,WAAa,OAAY,GAAOA,EAAS,SAE9CosB,GAAA,CACjB,SAAApsB,EACA,MAAAjB,EACA,SAAAstB,CAAA,CACH,EAED,MAAMvT,EAAQve,EAAA,IAAC6rC,GAAA,CAAc,KAAM19B,GAAmB1I,EAAU,OAAO,EAC1C,SAAUA,EAAS,YAAY,SAC/B,UAAW,oDACX,MAAOA,EAAS,IAAA,CAAA,EAEvCiZ,EAAOjZ,EAAS,mBAAmB,IAAI,CAAC8B,EAAewC,IAAU,CACnE,MAAMolC,EAAa,CACf,YAAa,GAAGtlC,CAAW,IAAIE,CAAK,IACpC,SAAAoZ,EACA,SAAU5b,EACV,mBAAAmkC,EACA,0BAAAsD,EACA,QAAAh1B,EACA,UAAW,GACX,YAAa,GACb,YAAa,GACb,UAAW,EAAA,EAER,OAAAha,EAAAA,IAAC,MAAyC,CAAA,UAAU,OACvD,SAAAA,MAAC2uC,GAAsB,CAAA,GAAGQ,CAAW,CAAA,CAAA,EADxB,uBAAuBplC,CAAK,EAE7C,CAAA,CACH,EAED,OAISwO,EAAA,KAAAtI,WAAA,CAAA,SAAA,CAAA,CAACu8B,GACExsC,EAAA,IAAColC,EAAA,gBAAA,CAAgB,kBAAmBC,EACnB,MAAA9mB,EACA,UAAW,yCACvB,SAAAG,CAAA,CACL,EAEH8tB,GAAa9tB,EAEd1e,EAAA,IAACyrC,GAAA,CAAgB,mBAAAC,EACA,UAAAlgB,EACA,MAAA5Q,EACA,SAAAuI,EACA,SAAA1d,CAAA,CAAmB,CAExC,CAAA,CAAA,CAER,CClFO,MAAMwuC,GAAa,CAAC,CAAE,aAAA9M,KAGQ,CACjC,KAAM,CAAE,aAAAoF,EAAc,aAAA2H,EAAc,OAAAC,GAAWtB,GAAU,UAAA,EAEzD98B,OAAAA,EAAAA,UAAU,IAAM,CACN,MAAAof,EAAO,OAAO,KAAKgf,CAAM,EAG/B,GAAIhf,EAAK,OAAS,GAAKoX,GAAgB,CAAC2H,EAAc,CAC5C,MAAAE,EAAejN,GAAc,SAAS,cACxC,eAAehS,EAAK,CAAC,CAAC,EAAA,EAGtB,GAAAif,GAAgBjN,GAAc,QAAS,CACjC,MAAAkN,EAAmBC,GAAoBnN,EAAa,OAAO,EACjE,GAAIkN,EAAkB,CACZ,MAAAE,EAAMH,EAAa,sBAAA,EAAwB,IACjDC,EAAiB,SAAS,CACtB,IAAKA,EAAiB,UAAYE,EAAM,IACxC,SAAU,QAAA,CACb,CACL,CACM,MAAAnqC,EAAQgqC,EAAa,cAAc,OAAO,EAC5ChqC,GAAOA,EAAM,MAAM,CAC3B,CACJ,GACD,CAACmiC,EAAc2H,EAAcC,EAAQhN,CAAY,CAAC,EAG9C,IACX,EAEMqN,GAAgBC,GAA4B,CAC9C,MAAMC,EAAuBD,GAAOA,EAAI,aAAeA,EAAI,aAErDE,EAAiBF,EAAM,OAAO,iBAAiBA,CAAG,EAAE,UAAY,KAChEG,EAAmBD,GAAkBA,EAAe,QAAQ,QAAQ,IAAM,GAEhF,OAAOD,GAAwB,CAACE,CACpC,EAEMN,GAAuBG,GACjB,CAACA,GAAOA,IAAQ,SAAS,KAC3B,SAAS,KACRD,GAAaC,CAAG,EAAIA,EAAMH,GAAoBG,EAAI,UAAyB,EC1B/E,SAASI,GAA6C,CACI,SAAAC,EACA,SAAA3sC,EACA,OAAA9B,EACA,SAAAshB,EACA,MAAA/M,EACA,OAAA9T,EACA,QAAAwf,CACJ,EAQ1D,CAEO,KAAA,CAAE,OAAA6tB,GAAWtB,GAAAA,YACb1vB,EAAW9c,IAAW,YAAc,CAACyuC,EACrCC,EAAqB1uC,IAAW,YAAc,CAACyuC,EAE/CrtC,EAA4CiQ,EAAAA,QAAQ,IAAM,CAC5D,GAAI,GAACo9B,GAAY,OAAOA,GAAa,WAAaA,IAAa,YAE/D,OAAOttC,GAAoBstC,CAAQ,CAAA,EACpC,CAACA,CAAQ,CAAC,EAEP37B,EAAqBlC,KACrB,CAAE,KAAAmG,CAAK,EAAIhB,GAAa,CAC1B,UAAYlQ,GAASiN,EAAmB,KAAK,CACzC,KAAM,UACN,QAAS,UAAUjN,CAAI,EAAA,CAC1B,CAAA,CACJ,EAEKmN,EAAmDX,KAEnDy2B,EAAa,CACf,MAAO4F,EAAqB,0BAA4B,KACxD,SAAU5xB,GAAYmD,EACtB,KAAM,KACN,OAAQxf,GAAUT,IAAW,WAAaS,EAAO,GAAKqB,IAAa,GACnE,aAAcme,EAAWtmB,MAAAy0B,EAAAA,iBAAA,CAAiB,KAAM,OAAQ,CAAA,EAAM3tB,EAI9CyR,EAAAA,KAAAtI,EAAA,SAAA,CAAA,SAAA,CAACjQ,EAAAA,IAAAqe,EAAAA,QAAA,CAAQ,MAAO,OACZ,SAAAre,EAAA,IAACyf,EAAA,WAAA,CAAW,QAAUtY,GAAMiW,EAAKtW,EAAO,EAAE,EAC9B,aAAW,UACnB,SAAA9G,EAAAA,IAAC0f,EAAAA,gBAAgB,CAAA,KAAM,OAAQ,CAAA,CAAA,CAAA,EAEvC,EAECrG,GAAyB,mBACrBrZ,MAAAqe,EAAAA,QAAA,CAAQ,MAAO,sBACZ,SAAAre,EAAA,IAACyf,EAAA,WAAA,CAAW,UAAW,IACX,KAAMpG,EAAwB,kBAAkB,CAAE,OAAAvS,EAAQ,EAC1D,IAAI,sBACJ,OAAO,SACP,QAAUK,GAAMA,EAAE,gBAAgB,EAClC,aAAW,mBACnB,SAAAnH,EAAAA,IAAC2f,EAAAA,cAAc,CAAA,KAAM,OAAQ,CAAA,CAAA,CAAA,EAErC,CAAA,CAER,CAAA,EAEF,MAAA,EAId,OAGSpH,EAAA,KAAAtI,WAAA,CAAA,SAAA,CACGxI,GAAAzH,EAAA,IAACgoB,EAAA,OAAA,CACG,MAAApN,EACA,cAAgBnW,GAAMkjB,EAASljB,CAAW,EACzC,GAAG0qC,EACJ,YAAcjD,GAAW,CACrB,MAAMpkB,EAAargB,EAAW,KAAUN,GAAAA,EAAE,KAAO+kC,CAAM,EACvD,OAAKpkB,EACE,GAAGA,EAAW,EAAE,MAAMA,EAAW,KAAK,GADrBokB,CAE5B,EAEC,SAAWzkC,EAAA,IAAKqgB,GACb9nB,EAAA,IAACioB,EAAA,WAAA,CAEG,MAAO,OAAOH,EAAW,EAAE,EAC3B,SAAA9nB,EAAA,IAACiiB,GAAA,CACG,QAAS6F,EAAW,GACpB,WAAArgB,EACA,KAAM,QAAA,CAAS,CAAA,EALdqgB,EAAW,EAMpB,CACJ,CAAA,CACJ,EAEH,CAACrgB,GACEzH,EAAA,IAACk+B,EAAA,UAAA,CAAW,GAAGiR,EACJ,MAAAv0B,EACA,YAAak6B,IAAa,WAAa,+CAAkDzuC,IAAW,OAASA,IAAW,OAAS,yBAA2B,qBAC5J,SAAW4d,GAAU,CACb,IAAAzf,EAAQyf,EAAM,OAAO,MACrB,OAAAzf,IAAOA,EAAQA,EAAM,QAClBmjB,EAASnjB,EAAM,OAASA,EAAQ,MAAS,CACpD,CAAA,CAAE,EAEhB2vC,EAAO,IAAMn0C,EAAA,IAAC4e,EAAA,WAAA,CAAW,QAAS,UACT,UAAW,wCAChC,SAAOu1B,EAAA,EAAA,CACZ,CAEJ,CAAA,CAAA,CAER,CChHO,SAASa,GAAkD,CACI,yBAAAC,EACA,WAAA/sC,EACA,QAAAgtC,EACA,KAAA79B,EACA,UAAAjC,EACA,eAAA+/B,EACA,yBAAAC,EACA,KAAAt0C,CACJ,EAA+B,CAEvF,MAAAmY,EAAa7C,GAAclO,CAAU,EACrCmR,EAA0BX,KAC1BS,EAAqBlC,KACrB,CAACqP,EAASC,CAAU,EAAItO,WAAS,EAAK,EAEtC,CAACo9B,EAAkBC,CAAuB,EAAIj1C,EAAM,SAAkC,EAEtF,CAACk1C,EAAkBC,CAAmB,EAAIn1C,EAAM,SAAkB,EAClE2Z,EAAUnB,KAEhBxY,EAAM,UAAU,IAAM,CAClB,GAAI40C,EAA0B,CACpB,MAAAQ,EAA0B,MAAM,QAAQR,CAAwB,GAAKA,EAAyB,SAAW,EACzGA,EAAyB,CAAC,EAC1BA,EACNK,EAAwBG,CAAuB,EAC3BD,EAAA,MAAM,QAAQC,CAAuB,CAAC,CAC9D,CAAA,EACD,CAACR,CAAwB,CAAC,EAEvB,MAAAx5B,EAAqB/D,UAAQ,IAAMzP,GAAqB,CAC1D,WAAAC,EACA,KAAApH,EACA,OAAQuY,EAAwB,eACnC,CAAA,EAAG,CAACnR,EAAYpH,CAAI,CAAC,EAEhB40C,EAAep+B,EAAAA,YAAY,IAAM,CAC3B49B,GAAA,EACT,CAACA,CAAO,CAAC,EAENv5B,EAAkBrE,cAAaxQ,GAAwB,CACjD,QAAA,MAAM,UAAWA,CAAM,CACnC,EAAG,CAAE,CAAA,EAEC8U,EAAkBtE,EAAAA,YAAY,CAACxQ,EAAqBK,IAAa,CACnEgS,EAAmB,KAAK,CACpB,KAAM,QACN,QAAS,mBAAqBhS,GAAG,OAAA,CACpC,EAED,QAAQ,MAAM,uBAAuB,EACrC,QAAQ,MAAMA,CAAC,CAAA,EAChB,CAACsU,EAAmB,IAAI,CAAC,EAEtBI,EAAuBvE,EAAAA,YAAY,CAACxQ,EAAqBK,IAAa,CACxEgS,EAAmB,KAAK,CACpB,KAAM,QACN,QAAS,0BAA4BhS,GAAG,OAAA,CAC3C,EACD,QAAQ,MAAMA,CAAC,CAAA,EAChB,CAACsU,EAAmB,IAAI,CAAC,EAEtBK,EAA2BxE,EAAAA,YAAY,CAACxQ,EAAqBK,IAAa,CAC5EgS,EAAmB,KAAK,CACpB,KAAM,QACN,QAAS,yBAA2BhS,GAAG,OAAA,CAC1C,EACD,QAAQ,MAAMA,CAAC,CAAA,EAChB,CAACsU,EAAmB,IAAI,CAAC,EAEtBk6B,EAAgBr+B,EAAAA,YAAaxQ,GAC/B4U,GAA0B,CACtB,WAAAzC,EACA,OAAAnS,EACA,WAAY2U,EACZ,UAAArG,EACA,gBAAAuG,EACA,gBAAAC,EACA,qBAAAC,EACA,yBAAAC,EACA,QAAA9B,CACH,CAAA,EAAG,CAACf,EAAYwC,EAAoBrG,EAAWuG,EAAiBC,EAAiBC,EAAsBC,EAA0B9B,CAAO,CAAC,EAExI47B,EAAWt+B,EAAAA,YAAY,SAAY,CACjC+9B,IAEA9uB,EAAW,EAAI,EAEXgvB,EACQ,QAAA,IAAKF,EAAiC,IAAIM,CAAa,CAAC,EAAE,KAAME,GAAY,CAEhFtvB,EAAW,EAAK,EAEZ6uB,GAA4BC,GAC5BD,EAAyBt0C,EAAMu0C,CAA+B,EAE9DQ,EAAQ,MAAM,OAAO,EACrB18B,EAAmB,KAAK,CACpB,KAAM,UACN,QAAS,GAAGsC,EAAmB,IAAI,oBAAA,CACtC,EACMo6B,EAAQ,KAAK,OAAO,EAC3B18B,EAAmB,KAAK,CACpB,KAAM,UACN,QAAS,GAAGsC,EAAmB,IAAI,uDAAA,CACtC,EAEDtC,EAAmB,KAAK,CACpB,KAAM,QACN,QAAS,GAAGsC,EAAmB,IAAI,2BAAA,CACtC,EAEGy5B,GAAA,CACX,EAGDS,EAAcN,CAA6B,EAAE,KAAMS,GAAY,CAC3DvvB,EAAW,EAAK,EACZuvB,IACIX,GAAkBE,GAClBF,EAAer0C,EAAMu0C,CAA6B,EACtDl8B,EAAmB,KAAK,CACpB,KAAM,UACN,QAAS,GAAGsC,EAAmB,cAAgBA,EAAmB,IAAI,UAAA,CACzE,EACOy5B,IACZ,CACH,EAGV,EAAA,CAACG,EAAkBE,EAAkBI,EAAeP,EAA0Bt0C,EAAMo0C,EAAS/7B,EAAoBsC,EAAmB,KAAM05B,CAAc,CAAC,EAExJ,IAAAl1B,EACJ,GAAIo1B,GAAoBE,EACpBt1B,oBAAY,SAAiB,mBAAA,CAAA,MAC1B,CACH,MAAMnZ,EAASuuC,EACfp1B,EAAUnZ,EACJ9G,EAAA,IAACymB,GAAA,CACC,OAAA3f,EACA,WAAAoB,EACA,KAAApH,CAAA,CAAA,EACAd,EAAA,IAAAiQ,WAAA,CAAA,CAAA,CACZ,CAEM,MAAA8lC,EAAcR,EACZh9B,EAAA,KAAAtI,EAAA,SAAA,CAAA,SAAA,CAACjQ,EAAAA,IAAA,IAAA,CAAG,WAAmB,IAAK,CAAA,EAAI,4BAAA,EAA0B,EAC5D,iCAAiCyb,EAAmB,cAAgBA,EAAmB,IAAI,IAG7F,OAAAlD,EAAA,KAACy9B,EAAA,OAAA,CACG,SAAUT,EAAmB,KAAO,MACpC,kBAAgB,gBAChB,KAAAl+B,EACA,aAAeA,GAAUA,EAAmB,OAAZ69B,IAEhC,SAAA,CAAC38B,EAAAA,KAAA09B,EAAAA,cAAA,CAAc,WAAY,GACvB,SAAA,CAAAj2C,MAAC4e,EAAAA,WAAW,CAAA,QAAS,YAAa,UAAW,MACxC,SACLm3B,EAAA,EAEC,CAACR,GAAoBv1C,EAAA,IAAC,MAAI,CAAA,UAAW,MAAQ,SAAQigB,EAAA,CAAA,EAC1D,SACC4kB,EAAAA,cAEI,CAAA,SAAA,CAAWve,GAAAtmB,EAAAA,IAACy0B,EAAAA,iBAAiB,CAAA,KAAM,OAAQ,CAAA,EAE5Cz0B,EAAA,IAACsuB,EAAA,OAAA,CAAO,QAASonB,EACT,SAAUpvB,EACV,QAAQ,OACR,MAAM,UAAU,SAAA,QAAA,CAExB,EACAtmB,EAAA,IAACsuB,EAAA,OAAA,CACG,UAAS,GACT,SAAUhI,EACV,QAASsvB,EACT,QAAQ,SACR,MAAM,UAAU,SAAA,IAAA,CAEpB,CAAA,EACJ,CAAA,CAAA,CAAA,CAIZ,CChNO,MAAMM,GAAiC,CAC1C,WAAOpyB,EAAe,gBAAA,EAAA,EACtB,KAAM,OACN,UAAW,GACX,QAAQ,CACI,OAAAhd,EACA,WAAAoB,EACA,SAAA0C,EACA,QAAAoP,EACA,gBAAAoZ,EACA,kBAAAE,CAAA,EACc,CACtBF,IAAkBtsB,CAAM,EAChBkT,EAAA,qBAAqB,mBAAmB,eAAgB,CAC5D,KAAMlT,EAAO,KACb,SAAUA,EAAO,EAAA,CACpB,EACD,MAAMhG,EAAOoH,GAAY,gBAAkBpB,EAAO,KAAQ8D,GAAY9D,EAAO,KAC7E,OAAAkT,EAAQ,qBAAqB,KAAK,CAC9B,SAAUlT,EAAO,GACjB,KAAAhG,EACA,WAAAoH,EACA,UAAW,GACX,QAAS,IAAMorB,IAAoBxsB,CAAM,CAAA,CAC5C,EACM,QAAQ,QAAQ,MAAS,CACpC,CACJ,EAEaqvC,GAAiC,CAC1C,WAAOC,EAAY,aAAA,EAAA,EACnB,KAAM,OACN,QAAQ,CACI,OAAAtvC,EACA,WAAAoB,EACA,QAAA8R,EACA,gBAAAoZ,EACA,kBAAAE,CAAA,EACc,CACtB,OAAAF,IAAkBtsB,CAAM,EAChBkT,EAAA,qBAAqB,mBAAmB,oBAAqB,CACjE,KAAMlT,EAAO,KACb,SAAUA,EAAO,EAAA,CACpB,EACDkT,EAAQ,qBAAqB,KAAK,CAC9B,SAAUlT,EAAO,GACjB,KAAMA,EAAO,KACb,KAAM,GACN,WAAAoB,EACA,UAAW,GACX,QAAS,IAAMorB,IAAoBxsB,CAAM,CAAA,CAC5C,EACM,QAAQ,QAAQ,MAAS,CACpC,CACJ,EA+BauvC,GAAmC,CAC5C,WAAO7M,EAAU,WAAA,EAAA,EACjB,KAAM,SACN,QAAQ,CACI,OAAA1iC,EACA,SAAA8D,EACA,WAAA1C,EACA,QAAA8R,EACA,oBAAAwZ,EACA,mBAAAH,EACA,qBAAAta,CAAA,EACc,CACtB,KAAM,CAAE,YAAAu9B,CAAgB,EAAAt8B,EAAQ,kBAAkB,KAAK,CACnD,IAAK,wBAA0BlT,EAAO,GACtC,UAAW,CAAC,CAAE,KAAAuQ,KAAW,CACjB,GAAA,CAACnP,GAAc,CAAC0C,EACV,MAAA,IAAI,MAAM,6CAA6C,EAC1D,OAAA5K,EAAA,IAACg1C,GAAA,CACJ,yBAA0BluC,EAC1B,KAAM8D,EACN,WAAA1C,EACA,UAAWA,EAAW,UACtB,KAAAmP,EACA,eAAgB,IAAM,CACV2C,EAAA,qBAAqB,mBAAmB,wBAAyB,CACrE,KAAMpP,CAAA,CACT,EACoB4oB,GAAA,oBAAoBA,EAAoB,iBAAiB,UAAYrsB,EAAE,KAAOL,EAAO,EAAE,CAAC,EACxFusB,MACrBta,GAAsB,MAAM,CAChC,EACA,QAASu9B,CAAA,CAAA,CACjB,CAAA,CACH,EACM,OAAA,QAAQ,QAAQ,MAAS,CACpC,CACJ,EC1HgB,SAAAC,GAA6B,CAAE,WAAAC,GAAsC,CAEjF,KAAM,CAACC,EAAQC,CAAS,EAAIz+B,WAAS,EAAK,EAGtC,OAAAM,EAAA,KAAC,MAAI,CAAA,UAAW,6DACZ,SAAA,CAAAA,OAAC,MACG,CAAA,SAAA,CAAAvY,EAAA,IAAC4e,EAAA,WAAA,CAAW,QAAS,UAAW,UAAW,0BAC/B,MAAO,WAAa,WAAS,SAAW,aAAA,CAAc,EAClE5e,EAAAA,IAAC4e,EAAAA,YAAW,QAAS,UAAW,UAAW,aAAc,SAAA5e,EAAAA,IAAC,OAAM,CAAA,SAAAw2C,CAAA,CAAW,CAAO,CAAA,CAAA,EACtF,EAEAx2C,EAAAA,IAACyf,EAAAA,WAAW,CAAA,KAAM,QACd,SAAAzf,EAAA,IAAC22C,EAAA,iBAAA,CAAiB,KAAM,WACN,UAAW,aACX,QAASr/B,cAAY,IAAM,CACb,UAAA,UAAU,UAAUk/B,CAAU,EACxCE,EAAU,EAAI,EACd,WAAW,IAAMA,EAAU,EAAK,EAAG,GAAI,CAAA,EACxC,CAACF,CAAU,CAAC,CAAA,CAAA,EAErC,CACJ,CAAA,CAAA,CAER,CC8GO,MAAMI,GAAav2C,EAAM,KAA2Bw2C,GACvD,CAAC50C,EAAyBC,IACfD,EAAE,SAAWC,EAAE,QAClBD,EAAE,OAASC,EAAE,MACbsO,EAAMvO,EAAE,QAAQ,OAAQC,EAAE,QAAQ,MAAM,CAC/C,EAEL,SAAS40C,GAA4CC,EACA1wC,EACAS,EAAyD,CAC1G,MAAMhB,EAAaixC,EAA0B,WAC7C,IAAK1wC,IAAW,YAAcA,IAAW,SAAWS,EACzC,OAAAA,EAAO,QAAUjB,GAAoBC,CAAU,EAC1D,GAAWO,IAAW,MAClB,OAAOR,GAAoBC,CAAU,EAErC,cAAQ,MAAM,CACV,OAAAO,EACA,OAAAS,CAAA,CACH,EACK,IAAI,MAAM,2DAA2D,CAEnF,CAEA,SAAS+vC,GAAkD,CACI,OAAAxwC,EACA,KAAAvF,EACA,WAAYk2C,EACZ,OAAAlwC,EACA,sBAAAmwC,EACA,UAAAC,EACA,WAAAC,EACA,gBAAAC,EACA,WAAAC,EACA,oBAAAC,EACA,OAAA/jB,EACA,SAAAgkB,EACA,gBAAAC,CACJ,EAAuB,CAE9E,MAAMl+B,EAAsBV,KAEtBS,EAA0BX,KAE1BsB,EAAUnB,KACVI,EAAa7C,GAAc4gC,CAAe,EAC1C5N,EAAU/vB,EAAwB,QAElC09B,EAA4Br/B,UAAQ,IAAMzP,GAAkB,CAC9D,WAAY+uC,EACZ,KAAAl2C,EACA,OAAQgG,GAAQ,OAChB,OAAQuS,EAAwB,eACnC,CAAA,EAAG,CAACvS,GAAQ,OAAQhG,CAAI,CAAC,EAEpB22C,GAA4BpxC,IAAW,OAASA,IAAW,SAC5D,EAAQ0wC,EAA0B,UAAaA,EAA0B,WAAa,WAErFW,EAAkBhgC,EAAAA,QAAQ,IACxBrR,IAAW,OAASA,IAAW,OAC3BoxC,EACO,OAEAx+B,EAAW,iBAAiBnY,CAAI,EAGpCgG,GAAQ,GAEpB,CAAE,CAAA,EAEC6wC,EAAoB7hC,SAAO,EAAK,EAEhC8hC,EAA0B9hC,EAAAA,OAAiCghC,GAA0BC,EAA2B1wC,EAAQS,CAAM,CAAC,EAE/H,CAACqB,EAAU0vC,CAAW,EAAIx3C,EAAM,SAA6Bq3C,CAAe,EAC5E,CAACI,EAAeC,CAAgB,EAAI13C,EAAM,SAAkB,EAAK,EACjE,CAAC23C,EAAaC,CAAc,EAAI53C,EAAM,SAA4B,EAElE,CAAC63C,EAAiBC,CAAkB,EAAI93C,EAAM,SAAkB,EAAK,EAGrE,CAAC+3C,EAAgBC,CAAiB,EAAIpgC,EAAAA,SAAsCnR,GAAQ,QAAU8wC,EAAwB,OAA0B,EAEhJU,EAAQ1xC,GACHqwC,EAAsB,CACzB,WAAYx7B,EACZ,KAAA3a,EACA,SAAAqH,EACA,OAAAvB,EACA,eAAgBE,GAAQ,OACxB,eAAgB6wC,EAAkB,QAClC,SAAUJ,GAAY,EAAA,CACzB,EAAE,KAAUhzC,GAAA,CACH,MAAAg0C,EAA+BlyC,IAAW,MAC1C,mBACCA,IAAW,OAAS,gBAAmBA,IAAW,WAAa,gBAAkB,iBACxFiT,EAAoB,mBAAmBi/B,EAAW,CAAE,KAAAz3C,CAAM,CAAA,CAAA,CAC7D,EAAE,MAAWqG,GAAA,CACV,QAAQ,MAAMA,CAAC,EACf8wC,EAAe9wC,CAAC,CAAA,CACnB,EAAE,QAAQ,IAAM,CACbwwC,EAAkB,QAAU,EAAA,CAC/B,EAGCa,EAAW,CAAC5xC,EAAyB6xC,IAAwD,CAE3F,GAAAhB,GAAmB,CAACtvC,EAAU,CAC9B,QAAQ,MAAM,mBAAmB,EACjC4vC,EAAiB,EAAI,EACrBU,EAAiB,cAAc,EAAK,EACpC,MACJ,CAKA,GAHAR,EAAe,MAAS,EACxBF,EAAiB,EAAK,EAElB1xC,IAAW,YACX,GAAI,CAACS,GAAQ,GAAI,MAAM,MAAM,8DAA8D,UACpFT,IAAW,OAASA,IAAW,QACtC,GAAI2wC,EAAgB,UACZA,EAAgB,WAAa,YAAc,CAAC7uC,EAC5C,MAAM,MAAM,2DAA2D,MAI/E,OAAM,MAAM,sCAAsC,EAGtD,OAAOmwC,EAAK1xC,CAAM,GACZ,KAAUrC,GAAA,CACRk0C,EAAiB,UAAU,CACvB,OAAA7xC,EACA,YAAa,EACb,QAAS,CAAC,CAAA,CACb,CAAA,CACJ,EACA,QAAQ,IAAM,CACX6xC,EAAiB,cAAc,EAAK,CAAA,CACvC,CAAA,EAIH7F,EAA8B8F,GAAAA,gBAAmB,CACnD,cAAed,EAAwB,QACvC,SAAAY,EACA,WAAa5xC,GACF+xC,GAAkB,SAAS/xC,EAAQ,CAAE,WAAY,EAAO,CAAA,EAC1D,KAAK,KACK,GACV,EACA,MAAOO,GAAM,CAEV,MAAMgtC,EAAiC,CAAA,EACrC,OAAAhtC,EAAA,MAAM,QAASyT,IAAe,CACrBu5B,EAAAv5B,GAAM,IAAI,EAAIA,GAAM,OAAA,CAC9B,EACMg+B,GAAgBzxC,CAAC,CAAA,CAC3B,CACT,CACH,EAED4O,EAAAA,UAAU,IAAM,CACZ6hC,EAAwB,QAAUd,GAA0BC,EAA2B1wC,EAAQS,CAAM,EACrG,MAAM+xC,EAAgBjG,EAAO,cACzB,CAACA,EAAO,cAAgBiG,GAAiBxyC,IAAW,WACpDyyC,GACI,OAAO,QAAQr9B,EAAmB,UAAU,EACvC,IAAI,CAAC,CAACxY,EAAKwC,CAAQ,IAAM,CAClB,GAAAC,GAASD,CAAQ,EACjB,MAAO,GAEL,MAAAikB,GAAemvB,EAAc51C,CAAG,EAChC81C,GAAcnB,EAAwB,QAAQ30C,CAAG,EACvD,OAAKuN,EAAMkZ,GAAcqvB,EAAW,EAG7B,GAFI,CAAE,CAAC91C,CAAG,EAAG81C,GAEZ,CACX,EACA,OAAO,CAAC92C,EAAGC,KAAO,CAAE,GAAGD,EAAG,GAAGC,IAAM,EAAE,CAAA,EAG9C42C,GAAqB,CAAE,CAAA,CAE5B,EAAA,CAAChyC,EAAQiwC,EAA2B1wC,CAAM,CAAC,EAExC,MAAA2yC,EAAqBpyC,GAA6B,CACpD,MAAMiyC,EAAgBjG,EAAO,cAC7ByF,EAAkBzxC,CAAM,EACpBwwC,GACAA,EAAgBxwC,CAAM,EACtB2wC,GAAY3wC,GAAU,CAAC4J,EAAM5J,EAAQiyC,CAAa,GAClDP,EAAK1xC,CAAM,CACf,EAGJmP,EAAAA,UAAU,IAAM,CACR5N,GAAYkvC,GACZA,EAAWlvC,CAAQ,CAAA,EACxB,CAACA,EAAUkvC,CAAU,CAAC,EAEzB,MAAM57B,EAAqBxT,GAAqB,CAC5C,WAAY+uC,EACZ,KAAAl2C,EACA,SAAAqH,EACA,OAAQiwC,EACR,eAAgBxF,EAAO,cACvB,OAAQv5B,EAAwB,eAAA,CACnC,EAEK4/B,GAAmBtnC,GAA0B8J,EAAoBpC,EAAwB,eAAe,EACxGkF,EAAQ65B,GAAkBa,GAAmBx1C,GAAe20C,EAAgBa,EAAgB,EAAI,OAEhGC,GAAalC,EAAgB,WAAW,WAExCmC,GAAe7hC,EAAAA,YAAY,SAAY,CACzC,GAAI4hC,IAAcd,IAAmB/xC,IAAW,OAASA,IAAW,QAAS,CACzE8xC,EAAmB,EAAI,EACnB,GAAA,CACM,MAAAiB,EAAY,MAAMF,GAAW,CAC/B,WAAYz9B,EACZ,KAAA3a,EACA,SAAAqH,EACA,OAAQiwC,EACR,QAAAp+B,CAAA,CACH,EACD69B,EAAYuB,CAAS,QAChBjyC,EAAG,CACRqwC,GAAmBA,EAAgBrwC,CAAC,EACpC,QAAQ,MAAMA,CAAC,CACnB,CACAgxC,EAAmB,EAAK,CAC5B,CACD,EAAA,CAAChwC,EAAUiwC,EAAgB/xC,CAAM,CAAC,EAErC0P,EAAAA,UAAU,IAAM,CACCojC,IAAA,EACd,CAACA,EAAY,CAAC,EAEjB,KAAM,CAACE,GAAmBP,EAAoB,EAAI7gC,EAAA,SAAmC,CAAE,CAAA,EAEjFioB,GAA6C5oB,EAAA,YAAY,CAAC,CACI,KAAAsN,EACA,MAAApgB,EACA,SAAAiB,CAAA,IACEwT,EAAW,iBAAiBnY,EAAM8jB,EAAMpgB,EAAO2D,CAAQ,EACzH,CAAC8Q,EAAYnY,EAAMqH,CAAQ,CAAA,EAEzBwwC,EAAmBjhC,EAAA,QAAQ,IAAMvP,EAC7BsmB,GACEtmB,EACAsT,EAAmB,WACnBykB,EACF,EAAA,OACN,CAAC/3B,EAAUsT,EAAmB,WAAYykB,EAAoB,CAAA,EAE5DnxB,EAAiB0H,KAEjB6iC,EAAsBhiC,EAAAA,YAAY,CAAC,CACI,OAAAxQ,EACA,oBAAAyyC,CAAA,IAIvB,CAClB,MAAMC,EAAgBtqC,GAAgB8nC,EAAiBjoC,EAAgBjO,EAAM,IAAI,EAC3E24C,GAAgB3yC,EAASqI,GAAgB6nC,EAAiBjoC,EAAgBjO,EAAMgG,CAAM,EAAI,GAC1Foc,GAA0B,CAAA,EAC5B,OAAAs2B,GACAt2B,GAAQ,KAAKizB,EAAgB,EAC7BsD,IACAv2B,GAAQ,KAAKmzB,EAAkB,EAC/BkD,GACQr2B,GAAA,KAAK,GAAGq2B,CAAmB,EAChCr2B,EACR,EAAA,CAACnU,EAAgBioC,EAAiBl2C,CAAI,CAAC,EAEpC44C,EAAmC,CAAA,EAEnCC,EAA8B,CAChC,cAAe/G,EAAO,cACtB,OAAQA,EAAO,OACf,WAAYn3B,EACZ,SAAAtT,EACA,KAAArH,EACA,KAAAw3C,CAAA,EAUJ,GANAviC,EAAAA,UAAU,IAAM,CACRuhC,GACAA,EAAoBqC,CAAW,CACnC,EACD,CAACrC,EAAqBqC,CAAW,CAAC,EAEjCvQ,GAAW4N,EAAiB,CAC5B,MAAMxQ,EAAqC,CACvC,SAAAr+B,EACA,KAAArH,EACA,OAAAuF,EACA,WAAY2wC,EACZ,QAAAh9B,EACA,gBAAiB7R,EACjB,YAAAwxC,CAAA,EAEUD,EAAA,KAAK,GAAGtQ,EAAQ,IAAI,CAAC3C,EAAQlkC,IACvCkkC,EAAO,MAAM,QACPzmC,EAAA,IAACymC,EAAO,KAAK,QAAZ,CACiC,GAAGD,CAAA,EAA9B,WAAWC,EAAO,IAAI,EAC7B,EAAA,IACT,EAAE,OAAO,OAAO,CAAC,CACtB,CAEA,aAAQmT,GAAAA,OAAO,CAAA,MAAOhH,EAClB,SAACr6B,EAAA,KAAA,MAAA,CAAI,UAAU,uBAEV,SAAA,CAAAmhC,EAAc,OAAS,GAAK15C,EAAA,IAAC,MAAA,CAC1B,UAAW2iB,KAAG,wJAAwJ,EACrK,SAAA+2B,CAAA,CACL,EAEAnhC,EAAAA,KAAC,MAAI,CAAA,UAAU,0CACX,SAAA,CAAAA,EAAA,KAAC,MAAA,CACG,UAAW,4CAA4C,GAAKmhC,EAAgB,EAAI,EAAE,UAAU,GAAKA,EAAgB,EAAI,EAAE,QAEvH,SAAA,CAAA15C,EAAA,IAAC4e,EAAA,WAAA,CACG,UAAW,+BAAiCo4B,EAAgB,eAAiB,OAAS,OACtF,QAAS,KAAO,SAAAz4B,GAASy4B,EAAgB,cAAgBA,EAAgB,IAAA,CAC7E,EACAh3C,EAAA,IAAC65C,EAAM,MAAA,CAAA,MAAO,OAAQ,UAAW,SAAU,KAAM,QAC7C,SAAAthC,EAAAA,KAAC,OAAK,CAAA,UAAW,qBAAuB,SAAA,CAAAzX,EAAK,IAAEqH,CAAA,CAAA,CAAS,CAC5D,CAAA,CAAA,CAAA,CACJ,EAEC,CAACorB,GACEvzB,EAAA,IAAC60C,GAAA,CAAc,SAAUmC,EAAgB,SAC1B,SAAA7uC,EACA,OAAA9B,EACA,SAAUwxC,EACV,MAAOC,EACP,QAASI,EACT,OAAApxC,CAAA,CAAe,EAEjCqB,GAAYnI,EAAA,IAAC85C,GAAA,CACT,GAAGlH,EACJ,cAAeA,EAAO,cACtB,WAAAuE,EACA,UAAAD,EACA,gBAAiB8B,EACjB,kBAAAK,GACA,OAAAvyC,EACA,mBAAA2U,EACA,YAAAk+B,EACA,OAAAtzC,EACA,YAAA2xC,EACA,kBAAAL,EACA,SAAAJ,EACA,cAAe+B,EAAoB,CAC/B,OAAAxyC,EACA,oBAAqBkwC,EAAgB,aAAA,CACxC,CAAA,CAAE,CAAA,EAEX,CAAA,CACJ,CAAA,CACJ,CAAA,CACJ,CAEA,SAAS8C,GAAyC3wC,EAc/C,CAEO,KAAA,CACF,OAAAvC,EACA,UAAAswC,EACA,WAAAC,EACA,gBAAAC,EACA,kBAAAiC,EACA,YAAAM,EACA,OAAA7yC,EACA,QAAAklC,EACA,cAAAT,EACA,mBAAA9vB,EACA,aAAA8wB,EACA,OAAAlmC,EACA,aAAA0zC,EACA,UAAAC,EACA,YAAAhC,EACA,MAAAiC,EACA,kBAAAtC,EACA,SAAAJ,EACA,cAAA2C,CACA,EAAA/wC,EAEE6Q,EAAUnB,KACVshC,EAAcD,EAAc,OAAOj4C,GAAKA,EAAE,gBAAkB,QAAaA,EAAE,aAAa,EACxF8W,EAAuBlC,KAEvBujC,EAAWH,EACjBlkC,EAAAA,UAAU,IAAM,CACRohC,GACAA,EAAWiD,CAAQ,EACnBhD,GACAA,EAAgBxwC,CAAM,CAAA,EAC3B,CAACwzC,EAAUxzC,CAAM,CAAC,EAErBmP,EAAAA,UAAU,IAAM,CACR,CAACwhC,GAAY,CAAChL,GAAgB8M,GAAqBvyC,GAG5C,OAAA,QAAQuyC,CAAiB,EAAE,QAAQ,CAAC,CAACp2C,EAAKuB,CAAK,IAAM,CAClD,MAAA61C,EAAYzzC,EAAO3D,CAAG,EACxB,CAACuN,EAAMhM,EAAO61C,CAAS,GAAK,CAACrO,EAAQ/oC,CAAG,IAChC,QAAA,MAAM,qCAAsCA,EAAKuB,CAAK,EAC9D+mC,EAActoC,EAAKuB,IAAU,OAAYA,EAAQ,IAAI,EACzD,CACH,CACL,EACD,CAAC+nC,EAAcgL,EAAU8B,EAAmBvyC,EAAQF,EAAQolC,EAAST,CAAa,CAAC,EAEtF,MAAM+O,EACFt6C,EAAAA,IAAC,MAAI,CAAA,UAAW,sBACV,UAAmByb,EAAA,iBAAmB,OAAO,KAAKA,EAAmB,UAAU,GAC5E,IAAKxY,GAAQ,CAEJ,MAAAwC,EAAWgW,EAAmB,WAAWxY,CAAG,EAClD,GAAI,CAACwC,EACD,eAAQ,KAAK,YAAYxC,CAAG,4BAA4BwY,EAAmB,IAAI,EAAE,EAC1E,KAGX,MAAMuzB,EACF,CAAC,CAACqK,GACF,OAAO,KAAKA,CAAiB,EAAE,SAASp2C,CAAG,GAC3C,CAAC,CAAC+oC,EAAQ/oC,CAAG,EAEXkgB,EAAY,CAACo0B,GAAYhL,GAAiB/mC,GAAWC,CAAQ,GAAK,EAAQA,EAAS,SAErF,GADWC,GAASD,CAAQ,EACb,OAAA,KACnB,MAAM80C,EAAuD,CACzD,YAAat3C,EACb,SAAAkgB,EACA,SAAA1d,EACA,mBAAoBA,EAAS,aAAeA,EAAS,gBACrD,0BAA2BupC,GAA6B,CAACuI,EACzD,QAASoC,EACT,UAAW,GACX,YAAa,GACb,YAAa,GACb,UAAW,EAAA,EAIX,OAAA35C,EAAA,IAAC,MAAA,CAAI,GAAI,cAAciD,CAAG,GAEtB,eAACwf,GACG,CAAA,SAAAziB,EAAA,IAACqe,EAAA,QAAA,CAAQ,MAAOre,EAAAA,IAACu2C,GAA6B,CAAA,WAAYtzC,CAAI,CAAA,EACrD,cAAe,IACf,KAAM,OACN,MAAO,QACP,WAAY,GACjB,SAAAjD,EAAAA,IAAC2uC,GAAsB,CAAA,GAAG4L,CAAkB,CAAA,CAAA,CAAA,EAEpD,CAAA,EATM,SAAS9+B,EAAmB,IAAI,IAAIxY,CAAG,EAAA,CAYxD,CAAA,EACA,OAAO,OAAO,CAEvB,CAAA,EAGEkgB,EAAWopB,GAAiB,CAAC6N,GAAY/zC,IAAW,WACpDm0C,EAAUn6C,EAAM,OAAuB,IAAI,EAI7C,OAAAkY,EAAA,KAAC,OAAA,CAAK,SAAUwhC,EACV,QAAS,KACL,QAAQ,MAAM,gBAAgB,EACpBC,IACH9C,GAAaA,KAExB,WAAU,GACZ,SAAA,CAAA3+B,EAAA,KAAC,MAAA,CAAI,UAAU,QACV,IAAKiiC,EAEL,SAAA,CAAAF,EAEDt6C,EAAAA,IAACi0C,GAAW,CAAA,aAAcuG,CAAQ,CAAA,CAAA,CAAA,CAEtC,EAEAx6C,EAAAA,IAAC,MAAI,CAAA,UAAU,MAAM,CAAA,EAEpB,CAACu3C,GAAah/B,EAAAA,KAAAssB,EAAAA,cAAA,CAAc,SAAU,WAElC,SAAA,CACGmT,GAAAh4C,EAAA,IAAC,MAAI,CAAA,UAAU,aACX,SAAAA,EAAA,IAAC4e,cAAW,MAAO,QACd,SAAYo5B,EAAA,OACjB,CAAA,EACJ,EAEHlxC,GAAUqzC,EAAY,OAAS,GAAKn6C,EAAAA,IAAC,OAAI,UAAU,4CAC/C,SAAYm6C,EAAA,IACT98B,GAAArd,EAAA,IAACyf,EAAA,WAAA,CAEG,MAAM,UACN,QAAUwE,GAA2D,CACjEA,EAAM,gBAAgB,EAClBnd,GACAuW,EAAO,QAAQ,CACX,OAAAvW,EACA,SAAU2U,EAAmB,KAC7B,WAAYA,EACZ,QAAAzB,EACA,qBAAAjB,CAAA,CACH,CACT,EACC,SAAOsE,EAAA,IAAA,EAbHA,EAAO,IAenB,CAAA,EACL,EAEArd,EAAA,IAACsuB,EAAA,OAAA,CACG,QAAQ,OACR,SAAAnL,EACA,KAAK,QAEJ,SAAA9c,IAAW,WAAa,UAAY,OAAA,CACzC,EAEAkS,EAAA,KAAC+V,EAAA,OAAA,CACG,QAAQ,OACR,MAAM,UACN,KAAK,SACL,SAAAnL,EACA,QAAS,IAAM,CACXw0B,EAAkB,QAAU,EAChC,EAEC,SAAA,CAAAtxC,IAAW,YAAc,OACzBA,IAAW,QAAU,cACrBA,IAAW,OAAS,QAAA,CAAA,CACzB,EAEAkS,EAAA,KAAC+V,EAAA,OAAA,CACG,QAAQ,SACR,MAAM,UACN,KAAK,SACL,SAAAnL,EACA,QAAS,IAAM,CACXw0B,EAAkB,QAAU,EAChC,EAEC,SAAA,CAAAtxC,IAAW,YAAc,iBACzBA,IAAW,QAAU,wBACrBA,IAAW,OAAS,kBAAA,CAAA,CACzB,CAAA,EAEJ,CAAA,CAAA,CAAA,CAGZ,CAEO,SAASuyC,GAAgB6B,EAAgD,CAC5E,IAAItG,EAA8B,CAAA,EAClC,GAAIsG,EAAS,MAAO,CACZ,GAAAA,EAAS,MAAM,SAAW,EAC1B,OAAOC,GAAAA,MAAMvG,EAAQsG,EAAS,KAAOA,EAAS,OAAO,EAE9C,UAAAv9B,KAAOu9B,EAAS,MAClB3xC,GAAAA,MAAMqrC,EAAQj3B,EAAI,IAAK,IACxBi3B,EAASuG,GAAM,MAAAvG,EAAQj3B,EAAI,KAAOA,EAAI,OAAO,EAGzD,CACO,OAAAi3B,CACX,CCzqBO,SAASwG,GAA8CxxC,EAA+B,CACzF,OAAKA,EAAM,KACJnJ,EAAA,IAAC46C,GAAwB,CAAA,GAAGzxC,CAAO,CAAA,EADlB,IAG5B,CAEO,SAASyxC,GAAsD,CACI,SAAAC,EACA,OAAQC,EACR,qBAAApsB,EACA,YAAA7kB,EACA,WAAYmtC,EACZ,KAAAl2C,EACA,SAAA+qB,EACA,KAAAxU,EACA,QAAA69B,EACA,kBAAA6F,EACA,UAAAtT,CACJ,EAA2B,CAG7F,MAAMuT,EAAiBniC,KACjBQ,EAA0BX,KAE1B,CAACs/B,EAAaC,CAAc,EAAI53C,EAAM,SAAc,EACpD,CAAC46C,EAAeC,CAAgB,EAAIjjC,EAGvC,SAAA,EAEG9P,EAAW2yC,GAAY,GACvB,CAACh0C,EAAQkU,CAAS,EAAI/C,WAAgC6iC,CAAU,EAkBhE,CAAC/zB,EAAeC,CAAgB,EAAI/O,EAAAA,SAAsCnR,GAAQ,MAAM,EAExFoB,EAAsD8uC,EACtD/uC,GAAqB,CACnB,WAAY+uC,EACZ,KAAAl2C,EACA,OAAQimB,EACR,SAAA5e,EACA,OAAQkR,EAAwB,eAAA,CACnC,EACC,OAEA8hC,EAAa1Q,KAEb2Q,EAAe/6C,EAAM,OAAuB,IAAI,EAChDupC,EAAWvpC,EAAM,OAAuB,IAAI,EAE5Cg7C,EAAqBh7C,EAAM,OAAgB,EAAK,EAEhDi7C,EAAqBhkC,EAAAA,YAAY,IAAM,CACzC,GAAI,CAACuU,EAAU,MAAM,MAAM,0BAA0B,EAE9C,MAAA,CACH,EAAGA,EAAS,KAAOsvB,EAAW,MAAQtvB,EAAS,MACzCA,EAAS,EAAIA,EAAS,MAAQ,EAC9BA,EAAS,EAAIA,EAAS,MAAQ,EACpC,EAAGA,EAAS,IAAMsvB,EAAW,OAAStvB,EAAS,OACzCA,EAAS,EAAIA,EAAS,OAAS,EAC/BA,EAAS,EAAIA,EAAS,OAAS,CAAA,CACzC,EACD,CAACA,EAAUsvB,EAAW,OAAQA,EAAW,KAAK,CAAC,EAE5CI,EAAoBjkC,EAAAA,YAAY,CAAC,CACI,EAAA3L,EACA,EAAAk+B,CAAA,IAC4B,CAE7D,MAAA2R,EAAwBJ,EAAa,SAAS,sBAAsB,EAC1E,GAAI,CAACI,EACD,MAAM,MAAM,8DAA8D,EAEvE,MAAA,CACH,EAAG,KAAK,IAAI,EAAG,KAAK,IAAI7vC,EAAGwvC,EAAW,MAAQK,EAAsB,KAAK,CAAC,EAC1E,EAAG,KAAK,IAAI,EAAG,KAAK,IAAI3R,EAAGsR,EAAW,OAASK,EAAsB,MAAM,CAAC,CAAA,CAChF,EACD,CAACL,CAAU,CAAC,EAETM,EAAsBnkC,cAAaokC,GAGnC,CAEI,MAAAF,EAAwBJ,EAAa,SAAS,sBAAsB,EACtE,GAAA,CAACvvB,GAAY,CAAC2vB,EAAuB,OAEzC,MAAMG,EAAcD,GAAYH,EAAkBD,EAAoB,CAAA,GAClE,CAACL,GAAiBU,EAAY,IAAMV,EAAc,GAAKU,EAAY,IAAMV,EAAc,IACvFC,EAAiBS,CAAW,GACjC,CAAC9vB,EAAUyvB,EAAoBC,EAAmBN,CAAa,CAAC,EAEtDtR,GAAA,CACT,aAAcyR,EACd,SAAAxR,EACA,EAAGqR,GAAe,EAClB,EAAGA,GAAe,EAClB,OAAQQ,CAAA,CACX,EAED1lC,EAAA,UACI,IAAM,CACFslC,EAAmB,QAAU,EACjC,EACA,CAACxxC,EAAa/C,CAAM,CAAA,EAGxB4jC,EAAA,gBACI,IAAM,CACI,MAAA8Q,EAAwBJ,EAAa,SAAS,sBAAsB,EACtE,CAACvvB,GAAY,CAAC2vB,GAAyBH,EAAmB,UAC1CI,IACpBJ,EAAmB,QAAU,GACjC,EACA,CAACxvB,EAAU4vB,EAAqBJ,EAAmB,OAAO,CAAA,EAG9D3Q,EAAA,gBACI,IAAM,CACF+Q,EAAoBR,CAAa,CACrC,EACA,CAACE,EAAYtvB,CAAQ,CAAA,EAGnB,MAAA8sB,EAAmBjhC,EAAAA,QAAQ,IAAM,CAC/B,GAAA,GAACxP,GAAc,CAACC,GACb,OAAAsmB,GACHtmB,EACA0B,GAAe3B,EAAW,WAAW2B,CAAqB,EACpD,CAAE,CAACA,CAAW,EAAG3B,EAAW,WAAW2B,CAAqB,GAC5D,CAAC,EACP6kB,CAAA,GACL,CAACxmB,EAAYC,EAAU0B,EAAa6kB,CAAoB,CAAC,EAEtDktB,EAActkC,EAAAA,YAAY,IACrBmkC,EAAoBR,CAAa,EACzC,CAACA,EAAeQ,CAAmB,CAAC,EAEjCI,EAAY,MAAOj1C,IACrBqxC,EAAe,IAAI,EACfjB,GAAmBlwC,GAAUi0C,GAAqBlxC,EAC3CkxC,EAAkB,CACrB,MAAOn0C,EAAOiD,CAAqB,EACnC,YAAAA,EACA,OAAA/C,EACA,SAAUmxC,EACV,eAAgB,IAAM,CACtB,EACA,SAAUn3C,EACV,QAASk6C,CAAA,CACZ,EAEE,QAAQ,WAGnB,GAAI,CAACl0C,EACD,OAAS9G,EAAA,IAAAiQ,WAAA,CAAA,CAAA,EAIb,MAAM2iC,EAAS8F,GAAAA,gBAAmB,CAC9B,cAAgB5xC,GAAQ,QAAU,CAAC,EACnC,WAAaF,GACF+xC,GAAkB,SAAS/xC,EAAQ,CAAE,WAAY,EAAM,CAAC,EAC1D,KAAK,KAAO,CAAC,EAAE,EACf,MAAOO,GAAM,CACV,MAAMgtC,EAAiC,CAAA,EACrC,OAAAhtC,EAAA,MAAM,QAASyT,GAAe,CACrBu5B,EAAAv5B,EAAM,IAAI,EAAIA,EAAM,OAAA,CAC9B,EACMu5B,CAAA,CACV,EAET,wBAAyB,GACzB,SAAU,CAACvtC,EAAQsc,IAAY,CAC3B24B,EAAUj1C,CAAM,EACX,KAAK,IAAMsuC,EAAS,CAAA,EACpB,QAAQ,IAAMhyB,EAAQ,cAAc,EAAK,CAAC,CACnD,CAAA,CACH,EAEK,CAAE,OAAAtc,EAAQ,aAAA2lC,EAAc,cAAAhB,EAAe,aAAAwO,GAAiBnH,EAS9D,GANA78B,EAAAA,UAAU,IAAM,CACPvF,EAAM5J,EAAQmgB,CAAa,GAC5BC,EAAiBpgB,CAAM,CAC3B,EACD,CAACA,CAAM,CAAC,EAEP,CAACE,EACM,OAAA9G,EAAA,IAACse,GAAA,CACJ,MAAO,iCAAA,CAAA,EAEf,GAAI,CAACpW,EACD,OAASlI,EAAA,IAAAiQ,WAAA,CAAA,CAAA,EAEb,MAAMkT,GAAWopB,EAEXoN,EAA8B,CAChC,WAAAzxC,EACA,SAAAC,EACA,OAAAvB,EACA,KAAA9F,EACA,cAAAyqC,EACA,KAAMsQ,CAAA,EAGJp2C,GAA8CoE,GAAe0E,GAAkBrG,EAAW,WAAY2B,CAAqB,EAC3HslC,GAA4DtlC,GAAepE,GAC3E,CACE,YAAAoE,EACA,SAAU0iC,GAAgB/mC,GAAWC,EAAQ,GAAK,CAAC,CAACA,GAAS,SAC7D,SAAAA,GACA,mBAAoB,GACpB,0BAA2B,GAC3B,QAASk0C,EACT,UAAW,GACX,YAAa,GACb,YAAa,GACb,UAAWtiC,CAEb,EAAA,OAEN,IAAIykC,GACA97C,EAAA,IAAAiQ,WAAA,CAAA,SAAAjQ,EAAA,IAAC,MAAA,CAEG,UAAU,oCACV,SAAAuY,EAAA,KAAC,OAAA,CACG,SAAUwhC,EACV,WAAU,GAEV,SAAA,CAAA/5C,EAAA,IAAC,MAAA,CACG,UAAU,kCACV,SAAAA,EAAA,IAAC,MAAA,CACG,IAAK4pC,EACL,UAAU,cACV,MAAO,CAAE,OAAQ,iBAAkB,EAClC,SACGuF,IAAAnvC,EAAA,IAAC2uC,GAAsB,CAAA,GAAGQ,EAAW,CAAA,CAAA,CAC7C,CAAA,CACJ,QAECtK,EAAAA,cACG,CAAA,SAAA7kC,EAAA,IAACsuB,EAAA,OAAA,CACG,QAAQ,SACR,MAAM,UACN,KAAK,SACL,SAAAnL,GACH,SAAA,MAAA,CAAA,EAGL,CAAA,CAAA,CAEJ,CAAA,EA5BK,cAAc03B,CAAQ,IAAI1yC,CAAQ,IAAI0B,CAAW,EAgC9D,CAAA,CAAA,EAEA,MAAMu/B,GAAU/vB,EAAwB,QACpC+vB,IAKQA,GAAA,QAAS3C,GAA0B,CACnCA,EAAO,MAAM,WAETqV,GAAA97C,EAAA,IAACymC,EAAO,KAAK,SAAS,UAArB,CACG,OAAQ,WACR,KAAA3lC,EACA,WAAAoH,EACA,OAAApB,EACA,QAASk0C,EACT,gBAAiB7yC,EACjB,YAAAwxC,EACC,GAAGlT,EAAO,KAAK,SAAS,MACxB,SAAAqV,EAAA,CAAA,EAGb,CACH,EAEL,MAAMC,GAAOxjC,EAAA,KAAC,MAAA,CACV,UAAW,4FAA6FlB,EAAkB,GAAX,QAAa,6BAE3H,SAAA,CAAAykC,GAEA9D,GACIh4C,EAAAA,IAAA4e,EAAAA,WAAA,CAAW,MAAO,QACd,WAAY,QACjB,CAAA,CAAA,CAAA,EAIFo9B,EACFzjC,EAAA,KAAC,MAAA,CAEG,MAAO,CACH,UAAW,iCACf,EACA,UAAW,+EACNlB,EAAqB,UAAd,WACZ,gCACA,IAAK+jC,EAEL,SAAA,CAACp7C,EAAAA,IAAA2qC,GAAA,CAAsB,SAAUiR,CAAY,CAAA,EAE7CrjC,EAAA,KAAC,MAAA,CACG,UAAU,kBAET,SAAA,CAAAwjC,GAED/7C,EAAA,IAAC,MAAA,CACG,UAAU,wDACV,MAAO,CACH,MAAO,OACP,OAAQ,MACZ,EACA,SAAAA,EAAA,IAACyf,EAAA,WAAA,CACG,KAAM,QACN,QAAUwE,GAAU,CAChBA,EAAM,gBAAgB,EACdixB,GACZ,EACA,SAAAl1C,EAAA,IAACm+B,EAAA,UAAA,CAAU,UAAU,aACV,KAAM,OAAA,CAAQ,CAAA,CAC7B,CAAA,CACJ,CAAA,CAAA,CACJ,CAAA,CAAA,EAhCK,aAAat0B,CAAqB,IAAI1B,CAAQ,IAAIkP,CAAI,EAAA,EAsC/D,OAAArX,EAAA,IAACi8C,GAAO,KAAP,CAAY,QAAO,GACP,UAAAxU,EACT,SAACznC,EAAA,IAAA45C,UAAA,CAAO,MAAOhH,EACV,SACLoJ,EAAA,CAAA,CAAA,CAIZ,CC3UA,MAAMlnB,GAA6B,wBAoCtBonB,GAAuB77C,EAAM,KACtC,SAA6D,CACI,SAAAuK,EACA,oBAAAi5B,EACA,gBAAAsY,EACA,UAAAtsC,EACA,GAAGwT,CAAA,EAElE,CAEQ,MAAApK,EAAa7C,GAAciN,CAAc,EACzCrK,EAAaxC,KACbuC,EAAuBlC,KACvB9H,EAAiB0H,KACjBpO,EAAwBuP,KACxB0B,EAAsBV,KACtBS,EAA0BX,KAG1ByuB,EAAe9mC,EAAM,OAAuB,IAAI,EAEhD6H,EAAawP,EAAAA,QAAQ,IAAM,CACvB,MAAA0kC,EAAe/zC,GAAuB,oBAAuBuC,CAAQ,EAC3E,OAAQwxC,EAAeh5C,GAAUigB,EAAgB+4B,CAAY,EAAI/4B,GAClE,CAACA,EAAgBzY,EAAUvC,GAAuB,mBAAmB,CAAC,EAEnEg0C,EAAgBh8C,EAAM,OAAO6H,CAAU,EAC7C6N,EAAAA,UAAU,IAAM,CACZsmC,EAAc,QAAUn0C,CAAA,EACzB,CAACA,CAAU,CAAC,EAEf,MAAMo0C,EAAoBptC,GAAgBhH,EAAY6G,EAAgBnE,EAAU,IAAI,EAC9E,CAAC2xC,EAA0BC,CAA2B,EAAIvkC,EAAAA,SAAgC,MAAS,EACnG,CAACwkC,EAAqBC,CAAsB,EAAIr8C,EAAM,SAA8C,MAAS,EAE7G,CAACsiC,EAAqBga,CAAsB,EAAIt8C,EAAM,SAAiB,CAAC,EAGxE,CAACu8C,EAAWC,CAAY,EAAI5kC,WAAiB,CAAC,EAE9C6kC,EAA0BxlC,EAAAA,YAAY,IAAM,CAC9C,MAAMylC,EAAmBR,EACzB,WAAW,IAAM,CACTQ,IAAqBR,GACrBC,EAA4B,MAAS,GAC1C,IAAI,CAAA,EACR,CAACD,CAAwB,CAAC,EAEvBS,EAAqB1lC,cAAaxQ,GAAkC,CACtE,MAAMoB,GAAam0C,EAAc,QACjC,OAAKptC,GAAc/G,GAAY6G,EAAgBnE,EAAU9D,GAAU,IAAI,EAGhEoB,GAAW,gBAAkB,QAAaA,GAAW,cAFjD,EAEiD,EAC7D,CAAC6G,EAAgBnE,CAAQ,CAAC,EAEvBuoB,EAAmBjrB,EAAW,mBAAqB,QAAaA,EAAW,iBAC3EgyB,EAAW,CAAC8iB,IAEZ,CAACC,EAAaC,CAAc,EAAIjlC,WAAS,EAAK,EAE9Cub,EAAsB+P,KACtB4Z,EAA0Bj1C,EAAW,qBAAuBsrB,EAC5D,CACF,iBAAAuN,EACA,sBAAA2C,EACA,iBAAAC,EACA,oBAAAF,CACA,EAAA0Z,EAEJpnC,EAAAA,UAAU,IAAM,CACZ2mC,EAAuB,MAAS,CAAA,EACjC,CAAC3b,CAAgB,CAAC,EAErB,MAAMN,EAAkBiC,GAAgD,CACpE,SAAA93B,EACA,WAAYyxC,EAAc,QAC1B,uBAAwB,CAAC,EACzB,oBAAA1Z,CAAA,CACH,EAEKkY,GAAWx6C,EAAM,OAAe,KAAK,SAAS,SAAS,EAAE,CAAC,EAC1D2iC,EAAYvC,EAAgB,UAE5B2c,GAAe9lC,EAAAA,YAAY,IAAM,CACnCmpB,EAAgB,eAAe,MAAS,CAAA,EACzC,CAACA,EAAgB,YAAY,CAAC,EAE3B/B,GAAgBpnB,cAAa+lC,GAA6B,CACpD,QAAA,IAAI,iBAAkBA,CAAa,EAC3C,MAAMn1C,GAAam0C,EAAc,QACjC,OAAAG,EAA4Ba,CAAa,EACzC/jC,EAAoB,mBAAmB,sBAAuB,CAC1D,KAAM+jC,EAAc,KACpB,SAAUA,EAAc,EAAA,CAC3B,EACMtkC,EAAqB,KAAK,CAC7B,SAAUskC,EAAc,GACxB,KAAMA,EAAc,KACpB,WAAAn1C,GACA,UAAW,GACX,QAAS40C,CAAA,CACZ,CAAA,EACF,CAACA,EAAyB/jC,CAAoB,CAAC,EAE5C2rB,GAAaptB,EAAAA,YAAY,IAAM,CAEjC,MAAMpP,EAAam0C,EAAc,QACjC/iC,EAAoB,mBAAmB,mBAAoB,CACvD,KAAM1O,CAAA,CACT,EACDmO,EAAqB,KAAK,CACtB,KAAMnO,EACN,WAAA1C,EACA,UAAW,GACX,QAAS40C,CAAA,CACZ,CAAA,EACF,CAAClyC,EAAUmO,CAAoB,CAAC,EAE7BmwB,GAAwB,IAAM,CAChC5vB,EAAoB,mBAAmB,8BAA+B,CAClE,KAAM1O,CAAA,CACT,EACD8xC,EAAuB3b,CAAgB,CAAA,EAGrCuc,GAAyB,CAACC,EAAez2C,KAAsB,CACjEwS,EAAoB,mBAAmB,wBAAyB,CAC5D,KAAM1O,CAAA,CACT,EACmB64B,EAAC1C,IAAqBA,GAAiB,OAAQ55B,IAAMA,GAAE,KAAOL,GAAO,EAAE,CAAC,EACrE61C,EAAA,KAAK,KAAK,CAAA,EAG/Ba,EAAmC,CAACD,EAAe7iC,KAA0B,CAC/EpB,EAAoB,mBAAmB,4BAA6B,CAChE,KAAM1O,CAAA,CACT,EACD64B,EAAoB,CAAE,CAAA,EACtBiZ,EAAuB,MAAS,EACTC,EAAA,KAAK,KAAK,CAAA,EAGjC,IAAAhkB,EAOAtf,GAAyB,UACJsf,EAAAtf,EAAwB,QAAQ,KAAKotB,GAAUA,EAAO,gBAAgB,kBAAkB,GAAG,gBAAgB,oBAGpI,MAAMgX,EAA8BnmC,EAAAA,YAAY,CAACxW,EAAc48C,KAAkD,CAC7G,GAAIr1C,EAAuB,CACjB,MAAAs1C,GAAsBt1C,EAAsB,oBAAoBvH,CAAI,EACpE88C,GAAgBx6C,GAAUu6C,GAAqBD,EAAiB,EAChDr1C,EAAA,qBAAqBvH,EAAM88C,EAAa,CAClE,CAAA,EACD,CAACv1C,CAAqB,CAAC,EAEpBowB,EAAiBnhB,EAAAA,YAAY,CAAC,CACI,MAAA4J,EACA,IAAAje,EAAA,IACwB,CAE5D,MAAMiF,GAAam0C,EAAc,QAEjC,GAAI,CAAC9tC,GAAkBrG,GAAW,WAAYjF,EAAG,EAAG,OAC9C,MAAA46C,GAAkBC,GAA4B76C,GAAKie,CAAK,EAC9Du8B,EAA4B7yC,EAAUizC,EAAe,CAAA,EACtD,CAACJ,EAA6B7yC,CAAQ,CAAC,EAEpCy1B,EAAgB/oB,cAAaxJ,GAAyB,CACpDzF,GACAo1C,EAA4B7yC,EAAU,CAAE,YAAakD,CAAM,CAAA,CAChE,EAAA,CAAC2vC,EAA6B7yC,EAAUvC,CAAqB,CAAC,EAE3DmxC,EAAgBtqC,GAAgBhH,EAAY6G,EAAgBnE,EAAU,IAAI,EAE1Es1B,EAA6C5oB,EAAA,YAC/C,CAAC,CACI,KAAAsN,EACA,MAAApgB,GACA,SAAAiB,GACA,SAAA0C,EAAA,IACE8Q,EAAW,iBAAiBrO,EAAUga,EAAMpgB,GAAO2D,EAAQ,EAClE,CAACyC,CAAQ,CAAA,EAEPwnB,EAA6C,CAAC,CACI,SAAAxnB,EACA,QAAAoP,GACA,MAAAxV,GACA,YAAAqF,GACA,eAAA6oB,GACA,SAAAhR,GACA,OAAA5a,EAAA,IACE,CAEhD,MAAAE,GAAgB0zC,SAAM,CAAE,GAAG5zC,GAAO,QAAU+C,GAAarF,EAAK,EAE9Du5C,GAA6B,CAC/B,KAAMnzC,EACN,SAAU9D,GAAO,GACjB,OAAQE,GACR,eAAgBF,GAAO,OACvB,WAAAoB,EACA,OAAQ,UAAA,EAGZ,OAAOiT,GAAwB,CAC3B,GAAG4iC,GACH,WAAA71C,EACA,UAAWA,EAAW,UACtB,WAAA+Q,EACA,QAAAe,GACA,cAAe,IAAM0Y,GAAe,EACpC,cAAgBvrB,IAAa,CACzB,QAAQ,MAAM,cAAc,EAC5B,QAAQ,MAAMA,EAAC,EACfua,GAASva,EAAC,CACd,CAAA,CACH,CAAA,EAIC62C,GAAmBhlC,EAAW,mBAAmBpO,CAAQ,EACzD6Q,GAAqB/D,UAAQ,IAAMzP,GAAqB,CAC1D,WAAAC,EACA,KAAM0C,EACN,OAAQyO,EAAwB,eACnC,CAAA,EAAG,CAACnR,EAAY0C,CAAQ,CAAC,EAEpBu1B,GAAiB7oB,EAAAA,YAAY,CAAC,CACI,YAAAzN,EACA,cAAAhB,GACA,OAAA/B,EAAA,IAC0B,CAC9D,IAAIlB,GAA2D2I,GAAqBrG,EAAW,WAAY2B,CAAW,EAGtH,OAAKjE,KAEmBA,GAAA2I,GAAqBkN,GAAmB,WAAY5R,CAAW,GAGhFb,GAAgB,CACnB,YAAAa,EACA,kBAAAjE,GACA,KAAMgF,EACN,cAAA/B,GACA,OAAQ/B,GAAO,OACf,SAAUA,GAAO,GACjB,OAAQuS,EAAwB,eAAA,CACnC,CAAA,EACF,CAACnR,EAAW,WAAYmR,EAAwB,gBAAiBzO,EAAU6Q,GAAmB,UAAU,CAAC,EAEtG8kB,GAAqBxL,GAAatZ,GAAoB,EAAI,EAE1D+Z,GAAmB9d,EAAAA,QAAQ,IAAM,CACnC,MAAMumC,EAA0D/1C,EAAW,gBAAgB,IAAK6K,KACrF,CACH,IAAK8hB,GAAyB9hB,EAAa,EAC3C,KAAMA,GAAc,KACpB,MAAO,IACP,aAAc,CAAC,EACf,QAAS,CAAC,CAAE,OAAAjM,EAAA,IACR9G,EAAA,IAACsuB,EAAA,OAAA,CAAO,MAAO,UACP,QAAS,WACT,UAAWtuB,EAAAA,IAAC8jB,EAAAA,gBAAgB,CAAA,KAAM,OAAQ,CAAA,EAC1C,QAAUG,IAAe,CACrBA,GAAM,gBAAgB,EACtBlL,EAAqB,KAAK,CACtB,KAAMnO,EACN,SAAU9D,GAAO,GACjB,gBAAiBiM,GAAc,IAAMA,GAAc,KACnD,WAAA7K,EACA,UAAW,EAAA,CACd,CACL,EACH,SAAc6K,GAAA,IAAA,CACnB,CAAA,EAGX,GAAK,CAAA,EAEAmrC,GAAsEh2C,EAAW,gBACjF,CAAC,CACC,IAAK4sB,GACL,KAAM,kBACN,MAAO,IACP,aAAc,CAAC,EACf,QAAS,CAAC,CAAE,OAAAhuB,MAAa,CACrB,MAAMq3C,GAAsBnlC,EAAW,4BAA4BlS,GAAO,IAAI,EAC9E,OAES9G,EAAAA,IAAAiQ,EAAAA,SAAA,CAAA,SAAAkuC,GAAoB,IAAKh6B,IAElBnkB,EAAA,IAACkkB,GAAA,CAEG,UAAAC,GACA,KAAM,MAAA,EAFDA,GAAU,KAAO,IAAMA,GAAU,EAAA,CAIjD,CACL,CAAA,CAER,CACH,CAAA,EACC,CAAA,EAEC,MAAA,CACH,GAAIjc,EAAW,kBAAoB,CAAC,EACpC,GAAG+1C,EACH,GAAGC,EAAA,CAER,EAAA,CAACh2C,EAAY0C,EAAUmO,CAAoB,CAAC,EAEzCqlC,GAA4B9mC,EAAAA,YAAY,IAAM,CACzBqlC,EAAA,KAAK,KAAK,CACrC,EAAG,CAAE,CAAA,EAEClpB,GAAczV,KAEds7B,GAAsB,CAAC,CACI,OAAAxyC,EACA,oBAAAyyC,EAAA,IAIX,CAClB,MAAME,GAAgB3yC,EAASqI,GAAgBjH,EAAY6G,EAAgBnE,EAAU9D,CAAM,EAAI,GACzFoc,GAA0B,CAACgzB,EAAgB,EAC7C,OAAAsD,GACAt2B,GAAQ,KAAKizB,EAAgB,EAC7BsD,IACAv2B,GAAQ,KAAKmzB,EAAkB,EAC/BkD,IACQr2B,GAAA,KAAK,GAAGq2B,EAAmB,EAChCr2B,EAAA,EAGLyd,GAAmB,IAAM,CACrB,MAAAuZ,EAAgBZ,GAAoB,CAAA,CAAE,EACtCxlB,GAAmBomB,EAAc,OAAYj4C,IAAAA,GAAE,YAAc,EAAK,EAElEo8C,GADqBnE,EAAc,OAAYj4C,IAAAA,GAAE,YAAc,EAAK,EAClC,QAAUwxB,GAAc,GAAK,IAC7D,OAAAA,GAAe,GAAK4qB,GAAiB,GAAKA,KAAkBvqB,GAAiB,OAAS,EAAKL,GAAc,GAAK,GAAM,EAAA,EAG1HwM,GAAyB,CAAC,CACI,OAAAn5B,EACA,KAAAgH,GACA,MAAAoT,GACA,OAAAgS,EAAA,IAM9B,CAEI,MAAA3B,GAAaoS,EAAiB78B,CAAM,EAEpCoc,GAAUo2B,GAAoB,CAChC,OAAAxyC,EACA,oBAAqBoB,EAAW,aAAA,CACnC,EAGG,OAAAlI,EAAA,IAACizB,GAAA,CACG,OAAAnsB,EACA,MAAAoa,GACA,OAAAgS,GACA,WAAA3B,GACA,iBAAA4B,EACA,KAAArlB,GACA,gBAAiB0uC,EACjB,kBAAmBM,EACnB,WAAA50C,EACA,SAAA0C,EACA,QAAAsY,GACA,OAAQhb,GAAY,qBACpB,mBAAoBk2C,GACpB,oBAAqBjB,CAAA,CAAA,CACzB,EAKF5+B,GAAQve,EAAA,IAAC83B,EAAA,QAAA,CACX,KAAMmlB,EACN,aAAcC,EACd,QAAS,EAAQh1C,EAAW,YAC5B,QAASqQ,EAAA,KAAC,MAAI,CAAA,UAAU,4BACpB,SAAA,CAAAvY,EAAA,IAAC4e,EAAA,WAAA,CACG,QAAS,YACT,UAAW,wDAAwD1W,EAAW,YAAc,iBAAmB,aAAa,GAC5H,QAASA,EAAW,YACbf,GAAM,CACL+1C,EAAe,EAAI,EACnB/1C,EAAE,gBAAgB,CAEpB,EAAA,OACL,SAAA,GAAGe,EAAW,IAAI,EAAA,CACvB,EAEAlI,EAAA,IAACs+C,GAAA,CACG,SAAA1zC,EACA,WAAA1C,EACA,OAAQu4B,EAAgB,aACxB,OAAQA,EAAgB,OACxB,cAAeoc,CAAA,CACnB,CAAA,EAEJ,EAGC,SAAA30C,EAAW,aAAelI,EAAA,IAAC,MAAI,CAAA,UAAU,oCACtC,SAAAA,EAAA,IAACgmB,EAAS,SAAA,CAAA,OAAQ9d,EAAW,WAAY,CAAA,EAC7C,CAAA,CAAA,EAIEq2C,EAA8BjnC,EAAAA,YAAY,CAAC,CACI,SAAA7R,EACA,YAAAoE,GACA,QAAAwV,EAAA,IAK/C,CACF,MAAMnX,GAAam0C,EAAc,QACjC,OAAKhjC,EAAwB,QAGxBrZ,EAAAA,IAAAiQ,EAAAA,SAAA,CAAA,SAAAoJ,EAAwB,QAAQ,OAAiBotB,IAAAA,GAAO,gBAAgB,YAAY,EAChF,IAAI,CAACA,GAAQlkC,KAAM,CACV,MAAAi8C,GAAe/X,GAAO,eAAgB,aACrC,OAAAzmC,EAAA,IAACw+C,GAAA,CACJ,QAAAn/B,GAEA,YAAAxV,GACA,SAAApE,EACA,SAAAmF,EACA,WAAY1C,GACZ,oBAAqB27B,GAAuB,CAAC,CAAA,EALxC,wBAAwBthC,EAAC,EAAA,CAMrC,CAAA,CACT,CAAA,EAdW,MAeZ,CAAC8W,EAAwB,QAASzO,EAAUi5B,CAAmB,CAAC,EAE7D4a,GAA6B9lB,EAC7B,UAAY,CACV,OAAI,OAAOA,GAAuB,WACvB34B,EAAA,IAAC24B,EAAA,CAAmB,SAAA/tB,EACA,oBAAqBi5B,GAAuB,CAAC,EAC7C,WAAA37B,CAAA,CAAA,EACxB,IAET,EAAA,OAEA,CACF,kBAAA24B,GACA,sBAAAkD,GACA,kBAAAnD,GACA,kBAAAN,IACAsD,GAAqB,CACrB,WAAA17B,EACA,SAAU81C,GACV,oBAAAna,CAAA,CACH,EAGG,OAAAtrB,EAAA,KAAC,MAAA,CAAI,UAAWoK,EAAAA,GAAG,2CAA4C9S,CAAS,EACnE,IAAKs3B,EACN,SAAA,CAAAnnC,EAAA,IAAC+/B,GAAA,CAEG,iBAAAvK,GACA,gBAAAiL,EACA,mBAAAF,GACA,cAAAF,EACA,cAAA3B,GACA,eAAAjG,EACA,cAAArG,EACA,uBAAA6N,GACA,qBAAAC,EACA,MAAA3hB,GACA,oBAAqB4+B,EACrB,oBAAqBZ,EAA2B,CAACA,CAAwB,EAAI,CAAC,EAC9E,YAAar0C,EAAW,YACxB,WAAYuT,GAAmB,WAC/B,eAAA0kB,GACA,kBAAmB4D,GAAwB,OAAYnD,GACvD,kBAAAC,GACA,kBAAAP,GACA,QAAStgC,EAAA,IAACgpC,GAAA,CACN,oBAAqBnF,GAAuB,CAAC,EAC7C,WAAA37B,EACA,gBAAAu4B,EACA,sBAAAyI,GACA,WAAAxE,GACA,KAAM95B,EACN,aAAc1C,EAAW,KACzB,oBAAqBi1C,EACrB,iBAAAhqB,EACA,wBAAyBypB,CAAA,CAC7B,EACA,eAAgBN,GAAqB7b,EAAgB,eAAiB,QAAaA,EAAgB,SAAW,OACxGloB,EAAA,KAAC,MAAI,CAAA,UAAU,4CACb,SAAA,CAACvY,EAAA,IAAA4e,EAAA,WAAA,CAAW,QAAS,YAAa,SAAW,cAAA,EAC7CrG,EAAA,KAAC+V,EAAA,OAAA,CACG,MAAO,UACP,QAAS,WACT,QAASoW,GACT,UAAU,OAEV,SAAA,CAAA1kC,EAAA,IAAC+kC,EAAO,QAAA,EAAA,EAAE,0BAAA,CAAA,CAEd,CAAA,EACJ,EACE/kC,EAAA,IAAC4e,aAAW,CAAA,QAAS,QAAS,SAAuC,0CAAA,EAE3E,SAAAsb,EACA,cAAe8iB,EAAmB,EAClC,uBAAwBuB,EACxB,mBAAoBE,GACpB,iBAAA9d,GACA,yBAA0B3gC,EAAA,IAAC0+C,GAAA,CACvB,KAAM9zC,EACN,WAAA1C,CAAA,CAAuB,CAAA,EArDtB,oBAAoB0C,CAAQ,EAsDrC,EAEA5K,EAAA,IAAC26C,GAAA,CAEG,KAAM,EAAQ3X,EACd,QAASoa,GACT,SAAUpa,GAAW,SACrB,YAAaA,GAAW,YACxB,WAAA96B,EACA,OAAQ86B,GAAW,OACnB,SAAU6X,GAAS,QACnB,qBAAsB3a,EACtB,KAAM8d,GACN,kBAAmB5rB,EACnB,UAAW+U,EAAa,OAAA,EAXnB,cAAcnE,GAAW,WAAW,IAAIA,GAAW,QAAQ,EAAE,EAWlC,EAEnCyZ,GACGz8C,EAAA,IAACg1C,GAAA,CACG,yBAA0ByH,EAC1B,KAAM7xC,EACN,WAAA1C,EACA,UAAWA,EAAW,UACtB,KAAM,EAAQu0C,EACd,eAAgBa,GAChB,yBAA0BE,EAC1B,QAAS,IAAMd,EAAuB,MAAS,CAAA,CAAE,CAAA,CAAA,CAAA,CAIrE,EAAG,CAACz6C,EAAGC,IACIsO,EAAMvO,EAAE,SAAUC,EAAE,QAAQ,GAC/BsO,EAAMvO,EAAE,oBAAqBC,EAAE,mBAAmB,GAClDsO,EAAMvO,EAAE,gBAAiBC,EAAE,eAAe,GAC1CsO,EAAMvO,EAAE,UAAWC,EAAE,SAAS,GAC9BsO,EAAMvO,EAAE,WAAYC,EAAE,UAAU,GAChCsO,EAAMvO,EAAE,gBAAiBC,EAAE,eAAe,GAC1CsO,EAAMvO,EAAE,qBAAsBC,EAAE,oBAAoB,GACpDsO,EAAMvO,EAAE,cAAeC,EAAE,aAAa,GACtCsO,EAAMvO,EAAE,iBAAkBC,EAAE,gBAAgB,GAC5CsO,EAAMvO,EAAE,oBAAqBC,EAAE,mBAAmB,GAClDsO,EAAMvO,EAAE,QAASC,EAAE,OAAO,GAC1BsO,EAAMvO,EAAE,YAAaC,EAAE,WAAW,GAClCsO,EAAMvO,EAAE,kBAAmBC,EAAE,iBAAiB,GAC9CsO,EAAMvO,EAAE,iBAAkBC,EAAE,gBAAgB,GAC5CsO,EAAMvO,EAAE,YAAaC,EAAE,WAAW,CACzC,EAEL,SAASo8C,GAAc,CACI,SAAA1zC,EACA,WAAA1C,EACA,OAAA4uB,EACA,OAAAnd,EACA,cAAAglC,CACJ,EAMpB,CAEO,MAAA1lC,EAAa7C,GAAclO,CAAU,EACrC8Q,EAAaxC,KACb,CAACooC,EAAOC,CAAQ,EAAI5mC,EAAAA,SAA6B,MAAS,EAC1D,CAAC2C,EAAO8G,CAAQ,EAAIzJ,EAAAA,SAA4B,MAAS,EAEzD6B,EAAiBH,EAASA,EAAO,CAAC,EAAI,OACtCI,EAAcJ,EAASA,EAAO,CAAC,EAAI,OACnC6B,EAAe9D,EAAAA,QAAQ,IAAMsB,EAAW,mBAAmBpO,CAAQ,EAAG,CAACA,EAAUoO,EAAW,kBAAkB,CAAC,EAmBrH,OAjBAjD,EAAAA,UAAU,IAAM,CACRkD,EAAW,eACXA,EAAW,cAAc,CACrB,KAAMuC,EACN,WAAAtT,EACA,OAAA4uB,EACA,QAAShd,EACT,MAAOC,CACV,CAAA,EAAE,KAAK8kC,CAAQ,EAAE,MAAMn9B,CAAQ,CAAA,EACrC,CAAC9W,EAAUqO,EAAW,cAAeuC,EAActT,EAAY4uB,EAAQhd,EAAgBC,CAAW,CAAC,EAEtGhE,EAAAA,UAAU,IAAM,CACR4oC,GACAA,EAAcC,GAAS,CAAC,CAC5B,EACD,CAACD,EAAeC,CAAK,CAAC,EAErBhkC,EACO,KAGJ5a,EAAA,IAAC4e,EAAA,WAAA,CACJ,UAAU,gGACV,QAAS,UACT,MAAO,YACN,SAAAggC,IAAU,OAAY,GAAGA,CAAK,YAAe5+C,EAAA,IAAA+gB,EAAA,SAAA,CAAS,UAAW,0BAA2B,CAAA,CAAA,CAAA,CAErG,CAEA,SAAS+8B,GAA4B76C,EAAaie,EAAwC,CAClF,GAAAje,EAAI,SAAS,GAAG,EAAG,CACnB,KAAM,CAAC8O,EAAW,GAAG8jB,CAAQ,EAAI5yB,EAAI,MAAM,GAAG,EAC9C,MAAO,CAAE,WAAY,CAAE,CAAC8O,CAAS,EAAG+rC,GAA4BjoB,EAAS,KAAK,GAAG,EAAG3U,CAAK,CAAI,CAAA,CACjG,CACO,MAAA,CAAE,WAAY,CAAE,CAACje,CAAG,EAAG,CAAE,YAAaie,CAAM,CAAA,EACvD,CAEA,SAASw9B,GAAqB,CACI,WAAAx2C,EACA,KAAApH,CACJ,EAG3B,CACC,KAAM,CAAC6qB,EAAWmzB,CAAY,EAAIz+C,EAAM,SAAS,EAAK,EAChD,CAACwZ,EAAcilB,CAAe,EAAIz+B,EAAM,SAAS,EAAE,EACnD0Y,EAAuBlC,KAC7B,aACKwH,UAAQ,CAAA,MAAQsN,EAA2B,OAAf,aACzB,SAAA3rB,EAAA,IAAC83B,EAAA,QAAA,CACG,KAAMnM,EACN,aAAcmzB,EACd,cACKr/B,EAAAA,WAAW,CAAA,KAAM,QACd,SAACzf,EAAA,IAAA++C,EAAA,WAAA,CAAW,KAAM,OAAA,CAAQ,CAC9B,CAAA,EAGJ,SAAA/+C,EAAA,IAAC,OAAA,CAAK,WAAY,GACZ,SAAWmH,GAAM,CAEb,GADAA,EAAE,eAAe,EACb,EAAC0S,EACL,OAAAilC,EAAa,EAAK,EACX/lC,EAAqB,KAAK,CAC7B,SAAUc,EACV,KAAA/Y,EACA,WAAAoH,EACA,UAAW,EAAA,CACd,CACL,EACA,UAAW,gDAEb,SAAAqQ,EAAA,KAAC,MAAI,CAAA,UAAU,wBACX,SAAA,CAAAvY,EAAA,IAAC,QAAA,CACG,UAAW2rB,EACX,YAAa,oBAEb,SAAWxkB,GAAM23B,EAAgB33B,EAAE,OAAO,KAAK,EAC/C,MAAO0S,EACP,UAAW,2CAAA,CAA4C,EAC3D7Z,EAAA,IAACsuB,EAAA,OAAA,CAAO,QAAS,WACT,SAAU,CAACzU,EACX,KAAM,SACb,SAAA,IAAA,CAAE,CAAA,EACP,CAAA,CACJ,CAAA,CAGR,CAAA,CAAA,CAER,CC/xBgB,SAAAmlC,GAAoB,CAAE,eAAAxpC,GAAmF,CACrH,MAAMypC,EAAU,6CAEVC,EAAwB,OAAO1pC,GAAgB,UAAa,SAAW2pC,GAAsB3pC,EAAe,QAAQ,EAAI,OAEvH,OAAAxV,EAAA,IAAC,MAAA,CACJ,UAAWi/C,EACX,MAAO,CACH,WAAYzpC,GAAgB,OAAS0pC,GAAuB,OAAS,MACzE,EACC,SAAA1pC,GAAgB,KAAOxH,GAAiBwH,EAAgB,QAAQ,EAAIxH,GAAiBkxC,EAAuB,QAAQ,CAAA,CAAA,CAE7H,CCZO,SAASE,IAAe,CAGvB,OAAAp/C,EAAAA,IAAC,MAAI,CAAA,UAAU,qBACX,SAAAuY,EAAA,KAAC,MAAA,CAAI,UAAU,oCAEX,SAAA,CAAAvY,EAAA,IAAC4e,EAAA,WAAA,CAAW,QAAS,KAAM,MAAO,SACtB,aAAc,GAAM,SAAA,gBAAA,CAEhC,QACCA,EAAAA,WAAW,CAAA,MAAO,SAAU,aAAc,GAAM,SAEjD,4DAAA,EACA5e,EAAA,IAACsuB,EAAA,OAAA,CACG,QAAS,OACT,UAAWqX,GAAA,KACX,GAAI,IAAK,SAAA,cAAA,CAAY,CAAA,CAAA,CAEjC,CAAA,CAAA,CAER,CCpBO,SAAS0Z,GAAyB,CACI,KAAAhoC,EACA,SAAAioC,EACA,SAAAC,EACA,MAAAhhC,EACA,QAAA+H,EACA,KAAA5H,CACJ,EAOtC,CAEK,OAAAnG,EAAA,KAACy9B,EAAA,OAAA,CACG,KAAA3+B,EACA,aAAeA,GAAUA,EAAoB,OAAbkoC,IAEhC,SAAA,CAAAhnC,OAAC09B,EAAAA,cACG,CAAA,SAAA,CAAAj2C,MAAC4e,EAAAA,WAAW,CAAA,QAAS,KAAM,UAAW,OAAS,SAAML,EAAA,EACpDG,CAAA,EACL,SAECmmB,EAAAA,cACG,CAAA,SAAA,CAAA7kC,EAAA,IAACsuB,EAAA,OAAA,CACG,QAAS,OACT,QAASixB,EACT,UAAS,GAAC,SAAA,QAAA,CAAM,EAEpBv/C,EAAA,IAACw/C,EAAA,cAAA,CACG,MAAM,UACN,KAAK,SACL,QAAAl5B,EACA,QAASg5B,EACZ,SAAA,IAAA,CAED,CAAA,EACJ,CAAA,CAAA,CAAA,CAGZ,CC5CO,SAASG,GAAY,CACI,MAAAv+B,EACA,OAAA4E,EACA,UAAAjW,EACA,MAAAmU,CACJ,EAKzB,CAEK,OAAAzL,EAAA,KAAC,MAAA,CACG,MAAO2I,GAAS,OAAQ,OAAQ4E,GAAU,OAC1C,QAAQ,cAAc,QAAQ,MAC9B,MAAA9B,EACA,UAAAnU,EACA,MAAM,6BACN,SAAA,CAAA0I,OAAC,OACG,CAAA,SAAA,CAAAA,EAAA,KAAC,iBAAA,CAAe,GAAG,cAAc,GAAG,cACpB,GAAG,cACH,GAAG,cAAc,EAAE,cACnB,kBAAkB,wGAClB,GAAG,mBACf,SAAA,CAAAvY,EAAA,IAAC,OAAK,CAAA,UAAU,UAAU,OAAO,KAAI,EACpCA,EAAA,IAAA,OAAA,CAAK,UAAU,UAAU,OAAO,cAAa,EAC7CA,EAAA,IAAA,OAAA,CAAK,UAAU,UAAU,OAAO,cAAa,EAC7CA,EAAA,IAAA,OAAA,CAAK,UAAU,UAAU,OAAO,cAAa,EAC7CA,EAAA,IAAA,OAAA,CAAK,UAAU,UAAU,OAAO,OAAM,CAAA,CAAA,CAC3C,EACAuY,EAAA,KAAC,iBAAA,CAAe,GAAG,cAAc,GAAG,cACpB,GAAG,cACH,GAAG,cAAc,EAAE,cACnB,kBAAkB,yGAClB,GAAG,mBACf,SAAA,CAAAvY,MAAC,QAAK,UAAU,UAAU,YAAY,IAAI,OAAO,KAAI,EACrDA,EAAA,IAAC,OAAA,CAAK,UAAU,UAAU,YAAY,aAChC,OAAO,aAAA,CAAa,EAC1BA,EAAA,IAAC,OAAA,CAAK,UAAU,UAAU,YAAY,cAChC,OAAO,MAAA,CAAM,CAAA,CAAA,CACvB,EACAuY,EAAA,KAAC,iBAAA,CAAe,GAAG,cAAc,GAAG,cACpB,GAAG,cACH,GAAG,cAAc,EAAE,cACnB,kBAAkB,0GAClB,GAAG,mBACf,SAAA,CAAAvY,MAAC,QAAK,UAAU,UAAU,YAAY,IAAI,OAAO,KAAI,EACrDA,EAAA,IAAC,OAAA,CAAK,UAAU,UAAU,YAAY,aAChC,OAAO,aAAA,CAAa,EAC1BA,EAAA,IAAC,OAAA,CAAK,UAAU,UAAU,YAAY,cAChC,OAAO,MAAA,CAAM,CAAA,CAAA,CACvB,CAAA,EACJ,EACAA,EAAA,IAAC,IAAA,CAAE,GAAG,SAAS,OAAO,OAAO,YAAY,IAAI,KAAK,OAC/C,SAAS,UACR,SAAAuY,EAAA,KAAC,IAAE,CAAA,GAAG,eACF,SAAA,CAAAvY,EAAA,IAAC,SAAA,CAAO,KAAK,yBAAyB,GAAG,QACjC,GAAG,QACH,EAAE,OAAA,CAAO,EACjBA,EAAA,IAAC,SAAA,CAAO,KAAK,yBAAyB,GAAG,QACjC,GAAG,QACH,EAAE,OAAA,CAAO,EACjBA,EAAA,IAAC,SAAA,CAAO,KAAK,yBAAyB,GAAG,QACjC,GAAG,QACH,EAAE,OAAA,CAAO,CAAA,EACrB,CAAA,CACJ,CAAA,CAAA,CAAA,CAIZ,CCtBa,MAAA0/C,GAAgB,SAAuB,CACI,MAAAnhC,EACA,aAAA6c,EACA,eAAAukB,EACA,WAAAC,EACA,gBAAAC,EACA,cAAAC,EACA,UAAAjwC,EACA,MAAAmU,EACA,KAAM+7B,CACV,EAAuB,CACvE,MAAM/mC,EAAaxC,KAEbzH,EAAiB0H,KACjB,CACF,KAAAtW,EACA,WAAA6/C,GACA7jC,GAAkB,EAEhBsX,EAAczV,KAEdiiC,EAAOF,GAAYhxC,EAAe,KAEpC,IAAAmxC,EACA,GAAAD,GAAQA,EAAK,SACKC,EAAAlgD,EAAA,IAACmgD,EAAA,OAAA,CACf,IAAKF,EAAK,QAAA,CAAA,UACPA,IAAS,QAAalxC,EAAe,eAC1BmxC,EAAAlgD,EAAAA,IAAC,OAAI,UAAW,0BAC9B,eAAC+gB,EAAS,SAAA,CAAA,UAAW,wBAAyB,CAAA,CAClD,CAAA,MACG,CACH,MAAMq/B,EAAUH,GAAM,YAChBA,EAAK,YAAY,CAAC,EAAE,YAAA,EACnBA,GAAM,MAAQA,EAAK,MAAM,CAAC,EAAE,YAAgB,EAAA,IACjCC,EAAAlgD,EAAA,IAACmgD,UAAQ,SAAQC,CAAA,CAAA,CACvC,CAGI,OAAApgD,EAAA,IAAC,MAAA,CACG,MAAAgkB,EACA,UAAWrB,EAAA,GAAG,OACV,CACI,aAAci9B,GAAcnsB,EAC5B,QAASqsB,GAAiB,EAAEF,GAAcnsB,IAAgB,CAACksB,EAC3D,OAAQ,GACR,OAAQlsB,EACR,iBAAkB,GAClB,UAAW,GACX,cAAe,GACf,SAAU,CAACqsB,EACX,sBAAuBA,GAAiB,EAAEF,GAAcnsB,GACxD,uBAAwBqsB,GAAkBF,GAAcnsB,EACxD,eAAgBmsB,GAAcnsB,EAC9B,MAAO,EACX,EACA5jB,CAAS,EAEb,SAAA0I,EAAA,KAAC,MAAI,CAAA,UAAU,+CAEV,SAAA,CAAAonC,EAEA3mC,GAAchZ,EAAA,IAAC,MAAI,CAAA,UAAU,uBAC1B,SAAAA,EAAA,IAAC2lC,GAAA,KAAA,CACG,UAAU,iDACV,GAAI3sB,GAAY,UAAY,IAE5B,SAAAhZ,EAAA,IAAC4e,EAAA,WAAA,CAAW,QAAQ,YACR,OAAM,GACN,UAAW,oBAClB,SAAAL,CAAA,CACL,CAAA,CAAA,EAER,EAEAve,EAAAA,IAAC,MAAI,CAAA,UAAW,WAAY,CAAA,EAE3Bo7B,GACIp7B,EAAAA,IAAAyiB,GAAA,CACI,SACL2Y,CAAA,CAAA,EAEJp7B,EAAA,IAACyf,EAAA,WAAA,CACG,MAAM,UACN,aAAW,cACX,QAASugC,EACT,KAAK,QACJ,aAAS,OACJhgD,MAACqgD,EAAAA,aAAY,CAAA,CAAA,QACZC,EAAa,cAAA,EAAA,CAAA,CACxB,EAEA/nC,EAAAA,KAACyb,EAAAA,KAAK,CAAA,QAASksB,EACV,SAAA,CAAQD,GAAA1nC,EAAA,KAAC,MAAI,CAAA,UAAW,iBACpB,SAAA,CAAK0nC,EAAA,mBAAgBrhC,EAAAA,WAAW,CAAA,QAAS,QAAS,MAAO,YACrD,WAAK,WACV,CAAA,EACCqhC,EAAK,OAAUjgD,MAAA4e,EAAAA,WAAA,CAAW,QAAS,QAAS,MAAO,YAC/C,SAAAqhC,EAAK,KACV,CAAA,CAAA,EACJ,EAECJ,EAEA,CAACA,GAAmBtnC,EAAAA,KAAC2b,EAAS,SAAA,CAAA,QAASnlB,EAAe,QACnD,SAAA,CAAA/O,EAAA,IAACugD,EAAU,WAAA,EAAA,EAAE,SAAA,EAEjB,CAAA,EAEJ,CAAA,EAEJ,CAAA,CAAA,CAGZ,ECrIMC,GAAeh8C,GACjBA,GAAS,MAAM,QAAQA,CAAK,GAAKA,EAAM,OAAS,EAC1CA,EAAM,IAAI,CAACC,EAAGsF,IACPtF,EACG,CACJ,CAACC,GAAaD,CAAC,EAAIsF,CAAK,EAAG0f,GAAY,CAAA,EAF5B,EAIlB,EAAE,OAAO,CAACxnB,EAAGC,KAAO,CAAE,GAAGD,EAAG,GAAGC,CAAE,GAAI,CAAE,CAAA,EACtC,CAAA,EAKH,SAASspC,GAAkB,CACI,YAAAiV,EACA,SAAAtV,EACA,MAAA3mC,EACA,SAAA2e,EAAW,GACX,WAAA6a,EACA,KAAAlwB,EAAO,SACP,kBAAAs9B,EACA,iBAAAC,EACA,gBAAAC,EACA,cAAAlZ,CACJ,EAA2B,CAEzD,MAAM3F,EAAWjoB,GAAS,MAAM,QAAQA,CAAK,GAAKA,EAAM,OAAS,EAG3Dk8C,EAAiB5qC,EAAA,OAA+B0qC,GAAYh8C,CAAK,CAAC,EAElE,CAACm8C,EAAaC,CAAc,EAAI3oC,EAAA,SAClCwU,EACM,OAAO,OAAOi0B,EAAe,OAAO,EACpC,CAAC,CAAA,EAEX3qC,EAAAA,UAAU,IAAM,CACZ,GAAI0W,GAAYjoB,GAASA,EAAM,SAAWm8C,EAAY,OAAQ,CAC1D,MAAME,EAAiBr8C,EAAM,IAAI,CAACC,EAAGsF,IAAU,CACrC,MAAA+2C,EAAYp8C,GAAaD,CAAC,EAAIsF,EAChC,GAAA+2C,KAAaJ,EAAe,QACrB,OAAAA,EAAe,QAAQI,CAAS,EACpC,CACH,MAAMC,EAAgBt3B,KACP,OAAAi3B,EAAA,QAAQI,CAAS,EAAIC,EAC7BA,CACX,CAAA,CACH,EACDH,EAAeC,CAAc,CACjC,GACD,CAACp0B,EAAUk0B,EAAY,OAAQn8C,CAAK,CAAC,EAElC,MAAAw8C,EAAe75C,GAA4B,CAEzC,GADJA,EAAE,eAAe,EACbgc,EAAU,OACd,MAAM1gB,EAAKgnB,KACLw3B,EAAmB,CAAC,GAAGN,EAAal+C,CAAE,EACxC2oC,GACAA,EAAkB3oC,CAAE,EACxBm+C,EAAeK,CAAM,EACrB7uB,EAAc,CAAC,GAAI5tB,GAAS,CAAA,EAAK8mC,CAAe,CAAC,CAAA,EAG/C4V,EAAUn3C,GAAkB,CACxB,MAAAk3C,EAAS,CAAC,GAAGN,CAAW,EACvBM,EAAA,OAAOl3C,EAAO,CAAC,EACtB62C,EAAeK,CAAM,EACrB7uB,EAAc5tB,EAAM,OAAO,CAACD,EAAGhC,IAAMA,IAAMwH,CAAK,CAAC,CAAA,EAG/CqT,EAAQrT,GAAkB,CAC5B,MAAMtH,EAAKgnB,KACL03B,EAAc38C,EAAMuF,CAAK,EACzBk3C,EAAmB,CACrB,GAAGN,EAAY,OAAO,EAAG52C,EAAQ,CAAC,EAClCtH,EACA,GAAGk+C,EAAY,OAAO52C,EAAQ,EAAG42C,EAAY,OAAS52C,EAAQ,CAAC,CAAA,EAC/DqhC,GACAA,EAAkB3oC,CAAE,EACxBm+C,EAAeK,CAAM,EAErB7uB,EAAc,CAAC,GAAG5tB,EAAM,MAAM,EAAGuF,EAAQ,CAAC,EAAGo3C,EAAa,GAAG38C,EAAM,MAAMuF,EAAQ,CAAC,CAAC,CAAC,CAAA,EAGlF+jC,EAAahsC,GAAgB,CAE3B,GAAA,CAACA,EAAO,YACR,OAEE,MAAAs/C,EAAct/C,EAAO,OAAO,MAC5Bu/C,EAAmBv/C,EAAO,YAAY,MAEtCm/C,EAAS,CAAC,GAAGN,CAAW,EACxBW,EAAOL,EAAOG,CAAW,EACxBH,EAAAG,CAAW,EAAIH,EAAOI,CAAgB,EAC7CJ,EAAOI,CAAgB,EAAIC,EAC3BV,EAAeK,CAAM,EAErB7uB,EAAcmvB,GAAU/8C,EAAO48C,EAAaC,CAAgB,CAAC,CAAA,EAI7D,OAAArhD,EAAA,IAACguC,oBAAgB,UAAAF,EACb,SAAA9tC,EAAA,IAACiuC,GAAA,UAAA,CAAU,YAAAwS,EACA,YAAa,CAAChT,EAAUC,EAAUQ,IAAW,CACnC,MAAAnkC,EAAQmkC,EAAO,OAAO,MACtBxB,EAAaiU,EAAY52C,CAAK,EAEhC,OAAA/J,EAAA,IAACwhD,GAAA,CACG,SAAA/T,EACA,WAAAf,EACA,MAAA3iC,EACA,KAAA+D,EACA,SAAAqV,EACA,WAAA6a,EACA,OAAAkjB,EACA,KAAA9jC,EACA,WAAYswB,EAAS,UAAA,CAAA,CAGjC,EAEN,SAAA,CAACL,EAAmBoU,IACjBlpC,EAAA,KAAC,MAAA,CACI,GAAG80B,EAAkB,eACtB,IAAKA,EAAkB,SACtB,SAAA,CAAA5gB,GAAYk0B,EAAY,IAAI,CAACjU,EAAoB3iC,IAE1C/J,EAAA,IAACwtC,GAAA,UAAA,CAEG,YAAa,eAAed,CAAU,GACtC,eAAgBvpB,EAChB,MAAApZ,EACC,SAAA,CAAC0jC,EAAUC,IACR1tC,EAAA,IAACwhD,GAAA,CACG,SAAA/T,EACA,WAAAf,EACA,MAAA3iC,EACA,KAAA+D,EACA,SAAAqV,EACA,WAAA6a,EACA,OAAAkjB,EACA,KAAA9jC,EACA,WAAYswB,EAAS,UAAA,CACzB,CAAA,EAfC,eAAehB,CAAU,EAAA,CAmBzC,EAEAW,EAAkB,YAElBhC,GAAoBrrC,EAAA,IAAC,MAAI,CAAA,UAAU,gCAChC,SAAAA,EAAA,IAACsuB,EAAA,OAAA,CACG,QAAS,OACT,KAAMxgB,IAAS,QAAU,QAAU,SACnC,MAAM,UACN,SAAAqV,EACA,gBAAY4hB,EAAO,QAAA,EAAA,EACnB,QAASic,EACR,SAAY7V,GAAA,KAAA,CAAA,EAErB,CAAA,CAAA,CACJ,CAAA,CAGZ,CAAA,CAAA,CAER,CAcO,SAASqW,GAAmB,CACI,SAAA/T,EACA,MAAA1jC,EACA,WAAA2iC,EACA,KAAA5+B,EACA,SAAAqV,EACA,WAAA6a,EACA,OAAAkjB,EACA,KAAA9jC,EACA,WAAAskC,CACJ,EAA4B,CAE3D,KAAM,CAACriC,EAASC,CAAU,EAAIjf,EAAM,SAAS,EAAK,EAC5CmxB,EAAiBla,EAAAA,YAAY,IAAMgI,EAAW,EAAI,EAAG,CAAA,CAAE,EACvDmS,EAAkBna,EAAAA,YAAY,IAAMgI,EAAW,EAAK,EAAG,CAAA,CAAE,EAExD,OAAAtf,EAAA,IAAC,MAAA,CACJ,aAAcwxB,EACd,YAAaA,EACb,aAAcC,EACd,IAAKgc,EAAS,SACb,GAAGA,EAAS,eACb,MAAOA,EAAS,eAAe,MAC/B,UAAW,GACNiU,GAAcriC,EAAWkuB,4BAA4B,EAC1D,+BAEA,SAAAh1B,EAAA,KAAC,MAAA,CACG,UAAU,mBACV,SAAA,CAAAvY,MAAC,OAAI,UAAU,8EACV,SAAWg+B,EAAAj0B,EAAO2iC,CAAU,EACjC,EACA1sC,EAAA,IAAC2hD,GAAA,CAAiB,UAAW7zC,IAAS,QAAU,MAAQ,SACtC,SAAAqV,EACA,OAAA+9B,EACA,MAAAn3C,EACA,SAAA0jC,EACA,KAAArwB,CAAA,CAAW,CAAA,CAAA,CACjC,CAAA,CAAA,CAER,CAGO,SAASukC,GAAiB,CACI,UAAAra,EACA,SAAAnkB,EACA,OAAA+9B,EACA,MAAAn3C,EACA,SAAA0jC,EACA,KAAArwB,CACJ,EAO9B,CAEC,KAAM,CAACwkC,EAAUC,CAAW,EAAI5pC,WAAS,EAAK,EAExC6T,EAAUzrB,EAAM,OAAuB,IAAI,EACjDk/B,OAAAA,EAAAA,kBAAkBzT,EAAS,IAAM+1B,EAAY,EAAK,CAAC,EAE5C7hD,EAAA,IAAC,MAAA,CAAI,UAAW,uBAAuBsnC,IAAc,MAAQ,mBAAqB,UAAU,gBACvF,IAAKxb,EACJ,GAAG2hB,EAAS,gBACrB,SAAAl1B,EAAA,KAAC8F,EAAA,QAAA,CACG,cAAe,IACf,KAAMujC,EAAW,GAAQ,OACzB,KAAMta,IAAc,SAAW,OAAS,OACxC,MAAM,uCAEN,SAAA,CAAAtnC,EAAA,IAACyf,EAAA,WAAA,CACG,KAAK,QACL,SAAA0D,EACA,QAAS,IAAM0+B,EAAY,EAAI,EAC/B,YAAc16C,GAAW,CACrB06C,EAAY,EAAK,CACrB,EACA,UAAW,UAAU1+B,EAAW,UAAY,MAAM,GAClD,eAAC2+B,EAAU,WAAA,EAAA,CAAA,CACf,EAEAvpC,EAAA,KAACyb,EAAA,KAAA,CACG,gBAAiBlI,EAAQ,QACzB,KAAM81B,EACN,cAAU,MAAG,EAAA,EAEb,SAAA,CAAArpC,EAAA,KAAC2b,EAAS,SAAA,CAAA,MAAK,GAAC,QAAU/sB,GAAM,CAC5B06C,EAAY,EAAK,EACjBX,EAAOn3C,CAAK,CAEZ,EAAA,SAAA,CAAC/J,EAAAA,IAAA+sC,EAAA,WAAA,CAAW,KAAM,OAAQ,CAAA,EAAE,QAAA,EAEhC,EACCx0B,EAAAA,KAAA2b,EAAAA,SAAA,CAAS,MAAK,GAAC,QAAS,IAAM,CAC3B2tB,EAAY,EAAK,EACjBzkC,EAAKrT,CAAK,CAEV,EAAA,SAAA,CAAC/J,EAAAA,IAAA0f,EAAA,gBAAA,CAAgB,KAAM,OAAQ,CAAA,EAAE,MAAA,EAErC,CAAA,CAAA,CAEJ,CAAA,CAAA,CAEJ,CAAA,CAAA,CAGR,CAEA,SAAS6hC,GAAU/8C,EAAc48C,EAAqBC,EAA0B,CACtE,MAAAv/C,EAAS,MAAM,KAAK0C,CAAK,EACzB,CAACu9C,CAAO,EAAIjgD,EAAO,OAAOs/C,EAAa,CAAC,EACvC,OAAAt/C,EAAA,OAAOu/C,EAAkB,EAAGU,CAAO,EACnCjgD,CACX,CAEO,SAAS2nB,IAAc,CACnB,OAAA,KAAK,MAAM,KAAK,OAAA,EAAW,KAAK,MAAM,OAAO,gBAAgB,CAAC,CACzE,CC3SO,SAASu4B,GAA+C,CACI,KAAAp9B,EACA,YAAA+I,EAAc,GACd,KAAA7sB,EACA,SAAAqiB,EACA,MAAA3e,EACA,oBAAAy9C,EACA,4BAAAC,EACA,kBAAA3wC,EACA,YAAAqc,EACA,KAAA9f,EACA,UAAA+B,CACJ,EAA4B,CAEvF,MAAM2T,EAAuBhN,KAEvBtO,EAA2CwP,EAAAA,QAAQ,IAC9C8L,EAAqB,cAAc1iB,CAAI,EAC/C,CAACA,EAAM0iB,CAAoB,CAAC,EAMzBqK,EAAyBvW,cAAaxQ,GAA6B,CACjE,GAAA,CAAAqc,GAEA8+B,EAAqB,CACrB,MAAM99B,EAAYrd,EAASD,GAAiBC,CAAM,EAAI,KAChCm7C,IAAA,CAAE,UAAA99B,EAAW,OAAArd,CAAA,CAAQ,CAC/C,CAAA,EACD,CAACqc,EAAU8+B,CAAmB,CAAC,EAE5Bn0B,EAA6BxW,cAAaoD,GAA0B,CAClE,GAAA,CAAAyI,GAEA++B,EAA6B,CACvB,MAAAC,EAAaznC,EAAWA,EAAS,OAAS7T,GAAiBM,CAAC,CAAC,EAAI,KAC3C+6C,EAAA,CAAE,WAAAC,EAAY,SAAAznC,CAAA,CAAU,CACxD,CAAA,EACD,CAACyI,EAAU8+B,CAAmB,CAAC,EAE5Bj0B,EAA4BC,GAAmB,CAC7C,YAAAN,EACA,KAAA7sB,EACA,WAAAoH,EACA,uBAAA2lB,EACA,2BAAAC,EACA,YAAAF,CACJ,CAAA,EAGetW,EAAY,YAACnQ,GAAwB,CACpDA,EAAE,gBAAgB,EACdwmB,EACAG,EAA2B,CAAE,CAAA,EAE7BD,EAAuB,IAAI,CAC/B,EACD,CAACo0B,CAAmB,CAAC,EAEpB,IAAA30B,EAEJ,MAAMmf,EAAe,IAAM,CACnBtpB,GAEJ6K,EAA0B,KAAK,CAAA,EAG/B,OAAA,MAAM,QAAQxpB,CAAK,EACX8oB,EAAAttB,EAAA,IAAC,OAAI,UAAW,sBACnB,WAAM,IAAI,CAACyc,EAAK1S,IACN/J,EAAA,IAACkkB,GAAA,CAEJ,QAASuoB,EACT,UAAWhwB,EACX,SAAA0G,EACA,kBAAA5R,EACA,KAAAzD,CAAA,EALK,qBAAqB/D,CAAK,EAAA,CAMtC,CACL,CAAA,EACOvF,GAAO,mBAAqBA,GAAO,sBAClC8oB,EAAAttB,EAAA,IAACkkB,GAAA,CACL,UAAW1f,EACX,QAASioC,EACT,SAAAtpB,EACA,kBAAA5R,EACA,KAAAzD,CAAA,CAAA,GAGDyK,EAAA,KAAC,MAAA,CAAI,UAAWoK,EAAA,GAAG,oCACtB,+BACA,sEACAQ,EAAW,gBAAkB,sBAC7B,uDACAtT,CACJ,EAGK,SAAA,CAAAyd,EACA,CAAC9oB,GAAUxE,EAAAA,IAAA,MAAA,CAAI,UAAU,2BACtB,SAAAuY,EAAA,KAAC+V,EAAA,OAAA,CAAO,QAAQ,WACR,MAAM,UACN,SAAAnL,EACA,QAASspB,EAAc,SAAA,CAAA,QACrB7nB,CAAA,CAAA,CAAA,EAEd,CAAA,CAAA,CAAA,CAGR,CC3IA,MAAMw9B,GAA8B,IAEhC,QAAQ,IAAI,WAAa,cACzB,OAAO,KAAKhzC,EAAa,EAAE,QAASc,GAAiB,CAC5CX,EAAA,SAAS,SAASW,CAAI,GACf,QAAA,KAAK,YAAYA,CAAI,qDAAqD,CACtF,CACH,EAQE,SAASmyC,GAAgB,CACA,aAAAC,EAAe,GACf,eAAAC,CACJ,EAAqB,CAC7C,KAAM,CAACptB,EAAMqtB,CAAO,EAAIniD,EAAM,SAA0B,IAAI,EACtD,CAACoiD,EAAOC,CAAQ,EAAIriD,EAAM,SAAiB,EAAE,EAE7C+nC,EAAsB/nC,EAAM,QAAQ,IACtCsiD,EAAAA,SAAUn+C,GAAkB,CACpB,GAAA,CAACA,GAASA,IAAU,GACpBg+C,EAAQ,IAAI,MACT,CACG,MAAAna,EAAeh5B,GAAY,OAAO7K,CAAK,EAC7Cg+C,EAAQna,EAAa,IAAKlhC,GAAWA,EAAE,GAAG,CAAC,CAC/C,GACDi7C,EAA2B,EAAG,CAAC,CAAA,EAGtC/hD,EAAM,UAAU,KACZ+nC,EAAoBqa,CAAK,EAClB,IAAM,CACTra,EAAoB,MAAM,CAAA,GAE/B,CAACqa,EAAOra,CAAmB,CAAC,EAEzB,MAAAwa,EAAQztB,IAAS,KAAO9kB,EAAAA,aAAe8kB,EAE7C,OAEQ5c,EAAA,KAAAtI,WAAA,CAAA,SAAA,CAAAjQ,EAAA,IAAC00B,EAAA,UAAA,CACG,UAAS,GACT,eAAgB,2BAChB,aAAelwB,GAAmBk+C,EAASl+C,GAAS,EAAE,EACtD,YAAY,wBAAA,CAChB,QAEC,MAAI,CAAA,UAAW,iCACX,SAAMo+C,EAAA,IAAK1yC,GAEJlQ,EAAAA,IAACqe,EAAAA,QAAQ,CAAA,MAAOnO,EACZ,SAAAlQ,EAAA,IAACyf,EAAA,WAAA,CACG,MAAO,SACP,QAAS6iC,IAAiBpyC,EAC1B,QAASqyC,EAAiB,IAAMA,EAAeryC,CAAI,EAAI,OACvD,UAAU,kBAEV,SAAClQ,EAAA,IAAAkO,OAAA,CAAK,QAASgC,EAAM,KAAM,GAAG,CAAA,CAAA,GAPXA,CAS3B,CAEP,EACL,CACJ,CAAA,CAAA,CAER,CCxEO,SAAS2yC,GAAa,CACO,MAAAjoC,EACA,SAAA7a,CACJ,EAAoD,CAChF,OAAKA,EAEDC,EAAA,IAAC4e,EAAW,WAAA,CAAA,QAAS,UAAW,MAAOhE,EAAQ,QAAU,YAAa,UAAW,gBAC5E,SAAA7a,CACL,CAAA,EAJkB,IAM1B,CCGO,SAASkuB,GAAkD60B,EAGtB,CAExC,MAAM9pC,EAAaxC,KACbsC,EAAwBnC,KAExBU,EAAOC,EAAAA,YAAY,IAAM,CAC3B,GAAIwrC,EAAqB,KAAM,CAC3B,IAAIC,EAAiBD,EAAqB,WAG1C,GAFKC,IACgBA,EAAA/pC,EAAW,cAAc8pC,EAAqB,IAAI,GACnE,CAACC,EACK,MAAA,MAAM,0GAA4GD,EAAqB,IAAI,EACrJhqC,EAAsB,KAAK,CACvB,IAAK,aAAagqC,EAAqB,IAAI,GAC3C,UACI9iD,EAAA,IAACikC,GAAA,CACG,WAAY8e,EACX,GAAGD,CAAA,CAAwD,EACpE,MAAO,OACP,QAAS,IAAM,CACXA,EAAqB,UAAU,CACnC,CAAA,CACH,CAAA,KAED,OAAM,MAAM,iGAAiG,CAElH,EAAA,CAAC9pC,EAAY8pC,EAAsBhqC,CAAqB,CAAC,EAEtDrB,EAAQH,EAAAA,YAAY,IAAM,CAC5BwB,EAAsB,MAAM,CAAA,EAC7B,CAACA,CAAqB,CAAC,EAEnB,MAAA,CACH,KAAAzB,EACA,MAAAI,CAAA,CAGR,CCrDA,MAAMurC,GAAc;AAAA,EAOJ,SAAAC,GAAuBr+B,EAAcs+B,EAAe,CAChEntC,EAAAA,UAAU,IAAM,CACZ,GAAI,SAAU,CACD,SAAA,MAAQ,GAAG6O,CAAI,aACpB,IAAAu+B,EAAO,SAAS,cAAc,mBAAmB,EAChDA,IACMA,EAAA,SAAS,cAAc,MAAM,EAEpCA,EAAK,IAAM,OACX,SAAS,qBAAqB,MAAM,EAAE,CAAC,EAAE,YAAYA,CAAI,GAG7DA,EAAK,KAAOD,GAAQF,EACxB,CAAA,EACD,CAACp+B,EAAMs+B,CAAI,CAAC,CACnB,CCrBO,SAASE,GAA4Bj6C,EAIrB,CAEb,KAAA,CACF,KAAArI,EACA,YAAAa,EAAc,CAAC,EACf,gBAAA8I,CACA,EAAAtB,EAEEhI,EAAWX,GAAgCM,CAAI,EAAE,MAAM,GAAG,EAC1Dc,EAAsBC,GAA+BV,CAAQ,EAE7DW,EAA4B,CAAA,EAClC,QAASS,EAAI,EAAGA,EAAIX,EAAoB,OAAQW,IAAK,CAC3C,MAAAR,EAAqBH,EAAoBW,CAAC,EAE1C2F,EAAgDvG,GAAeA,EAAY,KAAMQ,GAAUA,EAAM,KAAOJ,GAAsBI,EAAM,OAASJ,CAAkB,EAErK,GAAImG,EAAY,CACN,MAAAxG,EAAcwG,EAAW,IAAMA,EAAW,KAC1CwC,EAAiBD,GAAmBA,EAAgB,OAAS,EAC5DA,EAAkB,IAAM/I,EACzBA,EAEAD,EAAgBjB,GAAgCA,GAAgCM,CAAI,EAAE,QAAQiB,EAAoB,EAAE,CAAC,EACrH4I,EAAelJ,EAAc,OAAS,EAAIA,EAAc,MAAM,GAAG,EAAI,GACvE,GAAAkJ,EAAa,OAAS,EAAG,CACnB,MAAAxC,EAAWwC,EAAa,CAAC,EACzBC,EAAWF,EAAiB,IAAMvC,EAEpC,GADJrG,EAAO,KAAK,IAAIU,GAAgB2F,EAAUuC,CAAc,CAAC,EACrDC,EAAa,OAAS,EAAG,CACzB,MAAMvI,EAAUuI,EAAa,MAAM,CAAC,EAAE,KAAK,GAAG,EAC9C,GAAI,CAACzC,EACK,MAAA,MAAM,wCAA0CA,CAAU,EAEhEA,EAAW,gBACJpG,EAAA,KAAK,GAAGshD,GAA4B,CACvC,KAAMhhD,EACN,YAAa8F,EAAW,eACxB,gBAAiB0C,CACpB,CAAA,CAAC,CAEV,CACJ,CACA,KACJ,CAEJ,CACO,OAAA9I,CACX,CC3BA,MAAMuhD,GAAoB,IACpBC,GAA0B,KAuBzB,SAASC,GAAiFp6C,EAAwE,CAC/J,KAAA,CACF,SAAAq6C,EAAWH,GACX,mBAAAI,EAAqBH,GACrB,eAAAv0C,EACA,YAAa20C,EACb,sBAAAC,EACA,MAAOC,EACP,WAAYC,EACZ,WAAAC,EACA,sBAAAz7C,EACA,mBAAA07C,EACA,kBAAAC,CACA,EAAA76C,EAEE86C,EAAiBnuC,EAAAA,SACjB,CAACnU,EAAauiD,CAAc,EAAIjsC,EAAyC,SAAA,EACzE,CAACksC,EAAOC,CAAQ,EAAInsC,EAAgC,SAAA,EACpD,CAACosC,EAAYC,CAAa,EAAIrsC,EAAgC,SAAA,EAC9D,CAACssC,EAAaC,CAAc,EAAIvsC,WAAkB,EAAK,EAEvD,CAACwsC,EAAoBC,CAAqB,EAAIzsC,EAAAA,SAA0C,MAAS,EACjG,CAAC0sC,EAAmBC,CAAoB,EAAI3sC,WAAkB,EAAI,EAClE,CAAC4sC,EAAwBC,CAAyB,EAAI7sC,EAAAA,SAA4B,MAAS,EAE3F8sC,EAAgBvkD,GAAgCgjD,CAAQ,EACxDwB,EAA0BxkD,GAAgCijD,CAAkB,EAE5EwB,EAAUF,EAAgB,IAAIA,CAAa,GAAK,IAEhDG,EAAqBH,EAAgB,IAAIA,CAAa,IAAIC,CAAuB,GAAK,IAAIA,CAAuB,GAEjHG,EAAkB7tC,EAAA,YAAaxW,GAAyBikD,EAAgB,IAAIA,CAAa,IAAIK,GAAWtkD,CAAI,CAAC,GAAK,IAAIskD,GAAWtkD,CAAI,CAAC,GACxI,CAACikD,CAAa,CAAA,EAEZM,EAAyB/tC,EAAA,YAAaxW,GAAyB,GAAGN,GAAgCijD,CAAkB,CAAC,IAAI2B,GAAWtkD,CAAI,CAAC,GAC3I,CAAC2iD,CAAkB,CAAA,EAEjB6B,EAAuBhuC,EAAAA,YAAY,CAAC3V,EAAiCwiD,EAAkBE,EAAuBP,IAA+C,CAC/J,IAAI/b,EAA0C,CAC1C,IAAIpmC,GAAe,IAAI,IAAmBuG,GAACA,EAAW,mBAUhD,OATC,CACC,IAAKm9C,EAAuBn9C,EAAW,IAAMA,EAAW,IAAI,EAC5D,KAAM,aACN,KAAMA,EAAW,KAAK,KAAK,EAC3B,KAAMA,EAAW,IAAMA,EAAW,KAClC,WAAAA,EACA,YAAaA,EAAW,aAAa,KAAK,EAC1C,MAAOA,EAAW,OAAO,KAAU,GAAA,OAErC,CAAU,EACX,OAAO,OAAO,EACnB,IAAIi8C,GAAS,IAAI,IACbne,GAACA,EAAK,mBAUA,OATC,CACC,IAAKmf,EAAgB,MAAM,QAAQnf,EAAK,IAAI,EAAIA,EAAK,KAAK,CAAC,EAAIA,EAAK,IAAI,EACxE,KAAMA,EAAK,KAAK,KAAK,EACrB,KAAM,OACN,KAAMA,EAAK,KACX,KAAAA,EACA,YAAaA,EAAK,aAAa,KAAK,EACpC,MAAOA,EAAK,OAAO,KAAU,GAAA,OAE/B,CAAS,EACd,OAAO,OAAO,EACnB,IAAIqe,GAAc,IAAI,IAClBre,GAACA,EAAK,mBAUA,OATC,CACC,IAAKmf,EAAgB,MAAM,QAAQnf,EAAK,IAAI,EAAIA,EAAK,KAAK,CAAC,EAAIA,EAAK,IAAI,EACxE,KAAMA,EAAK,KAAK,KAAK,EACrB,KAAM,QACN,KAAMA,EAAK,KACX,KAAAA,EACA,YAAaA,EAAK,aAAa,KAAK,EACpC,MAAO,OAET,CAAS,EACd,OAAO,OAAO,CAAA,EAGnB8d,IACA/b,EAAoBA,EAAkB,KAAK,CAAC9lC,EAAGC,IAAM,CACjD,MAAMqjD,GAASzB,EAAW,QAAQ7hD,EAAE,IAAI,EAClCujD,GAAS1B,EAAW,QAAQ5hD,EAAE,IAAI,EACpC,OAAAqjD,KAAW,IAAMC,KAAW,GACrB,EAEPD,KAAW,GACJ,EAEPC,KAAW,GACJ,GAEJD,GAASC,EAAA,CACnB,GAGC,MAAAxd,EAAmB,OAAO,OAAOD,CAAiB,EACnD,IAAI5gC,GAAKA,EAAE,KAAK,EAChB,OAAO,OAAO,EACd,OAAO,CAAC3C,EAAOuF,EAAOoI,KAAUA,GAAM,QAAQ3N,CAAK,IAAMuF,CAAK,EAE5D,MAAA,CACH,kBAAAg+B,EACA,OAAAC,CAAA,CACJ,EACD,CAACmd,EAAiBE,CAAsB,CAAC,EAEtCI,EAAoBnuC,EAAAA,YAAY,SAAY,CAE9C,GAAI,CAAAvI,EAAe,eAGf,IAAA,CACM,KAAA,CAAC22C,EAAsB,CAAA,EAAIC,EAAeC,EAAqB,EAAE,EAAI,MAAM,QAAQ,IAAI,CACrFC,GAAmBnC,EAAiBC,EAAuB50C,EAAgBg1C,EAAoBC,CAAiB,EAChH8B,GAAgBlC,EAAW70C,EAAgBg1C,CAAkB,EAC7D+B,GAAgBjC,EAAgB90C,EAAgBg1C,CAAkB,CACtE,CAAA,GAGA,CAACvzC,EAAMyzC,EAAe,QAASyB,CAAmB,GAClD,CAACl1C,EAAM2zC,EAAOwB,CAAa,GAC3B,CAACn1C,EAAM6zC,EAAYuB,CAAkB,GACrC,CAACp1C,EAAMi0C,EAAoBa,EAAqBI,EAAqBC,EAAeC,EAAoB9B,CAAU,CAAC,KAEnHG,EAAe,QAAUyB,EACzBxB,EAAewB,CAAmB,EAClCtB,EAASuB,CAAa,EACtBrB,EAAcsB,CAAkB,EAChClB,EAAsBY,EAAqBI,GAAuB,CAAA,EAAIC,EAAeC,EAAoB9B,CAAU,CAAC,SAEnH38C,EAAG,CACR,QAAQ,MAAMA,CAAC,EACf29C,EAA0B39C,CAAQ,CACtC,CAEAy9C,EAAqB,EAAK,EAC1BJ,EAAe,EAAI,EACpB,EAAA,CAACd,EAAiBC,EAAuB50C,EAAe,KAAMA,EAAe,eAAgB60C,EAAWC,EAAgByB,EAAsBtB,CAAiB,CAAC,EAEnKjuC,EAAAA,UAAU,IAAM,CACM0vC,GAAA,EACnB,CAACA,CAAiB,CAAC,EAEtB,MAAMM,EAAgBzuC,EAAAA,YAAY,CAC9B0uC,EACA79C,EACA89C,EAAsB,KACL,CAEjB,GAAI,CAACtkD,EACM,OAEX,MAAMukD,EAAiB1kD,GAAwBhB,GAAgCwlD,CAAQ,EAAGrkD,CAAW,EAE/Fy6C,EAAe6J,EAAsB59C,GAAuB,oBAAoB29C,CAAQ,EAAI,OAE5FG,EAAuBD,EAAiB9iD,GAAU8iD,EAAgB9J,CAAY,EAAI,OAExF,IAAIt6C,EAAgDqkD,EAEpD,GAAIA,EAAsB,CACtB,MAAMC,EAAiBD,EAAqB,eACtC/wC,GAAY+wC,EAAqB,UACjCE,GAAcF,EAAqB,YAChCrkD,EAAA,CACL,GAAGA,EACH,eAAgBA,GAAQ,gBAAkBskD,EAC1C,UAAWtkD,GAAQ,WAAasT,GAChC,YAAatT,GAAQ,aAAeukD,EAAA,CAE5C,CAEA,GAAKvkD,EAEL,MAAO,CAAE,GAAGqkD,EAAsB,GAAGrkD,EAAO,EAE7C,CACC0hD,EACAC,EACA9hD,CAAA,CACH,EAEK2kD,EAAyBhvC,cAA0C3T,GAA2C,CAChH,IAAI4iD,EAAqB5kD,EACzB,GAAI,CAAC4kD,EACD,MAAM,MAAM,2CAA2C,EAE3D,QAAShkD,EAAI,EAAGA,EAAIoB,EAAa,OAAQpB,IAAK,CACpC,MAAAikD,EAAc7iD,EAAapB,CAAC,EAC5B2F,EAA2Cq+C,EAAoB,KAAK3sB,GAAKA,EAAE,KAAO4sB,GAAe5sB,EAAE,OAAS4sB,CAAW,EAC7H,GAAI,CAACt+C,EACM,OAEP,GADJq+C,EAAqBr+C,EAAW,eAC5B3F,IAAMoB,EAAa,OAAS,EACrB,OAAAuE,CACf,CAEO,EAER,CAACvG,CAAW,CAAC,EAEV8kD,EAAuBnvC,cAA0CovC,GAAkC,CACrG,IAAIH,EAAqB5kD,EACzB,GAAI,CAAC4kD,EACD,MAAM,MAAM,2CAA2C,EAE3D,QAAShkD,EAAI,EAAGA,EAAImkD,EAAI,OAAQnkD,IAAK,CAC3B,MAAAE,EAAKikD,EAAInkD,CAAC,EACV2F,EAA2Cq+C,EAAoB,KAAU3sB,GAAAA,EAAE,KAAOn3B,CAAE,EAC1F,GAAI,CAACyF,EACM,OAEP,GADJq+C,EAAqBr+C,EAAW,eAC5B3F,IAAMmkD,EAAI,OAAS,EACZ,OAAAx+C,CACf,CAEO,EAER,CAACvG,CAAW,CAAC,EAEVglD,GAAsBrvC,EAAA,YACvBxW,GAA0BN,GAAgCM,EAAO,GAAG,EAAE,WAAWN,GAAgC0kD,CAAkB,EAAI,GAAG,EAC3I,CAACA,CAAkB,CAAA,EAEjB0B,EAAoBtvC,cAAaxW,GAAyB,CACxD,GAAAA,EAAK,WAAWokD,CAAkB,EAC3B,OAAApkD,EAAK,QAAQokD,EAAoB,EAAE,EACxC,MAAA,MAAM,+BAAiCA,CAAkB,CAAA,EAChE,CAACA,CAAkB,CAAC,EAEjB2B,GAA6BvvC,EAAA,YAAY,CAAC,CACI,KAAAxW,CAAA,IAIrC,UAAUskD,GAAWtkD,CAAI,CAAC,GAErC,CAAC,CAAA,EAECgmD,GAAqBxvC,cAAaxW,GAAyB,CAC7D,GAAI,CAACa,EACD,MAAM,MAAM,2CAA2C,EACpD,OAAAV,GAAyBH,EAAMa,CAAW,CAAA,EAClD,CAACA,CAAW,CAAC,EAEVolD,GAAgCzvC,cAAaxW,GACxCsiD,GAA4B,CAC/B,KAAAtiD,EACA,YAAAa,CAAA,CACH,EACF,CAACA,CAAW,CAAC,EAEVqlD,GAAyB1vC,cAAaxW,GAA2B,CAG7D,MAAAmmD,EADUnmD,EAAK,MAAM,GAAG,EACE,OAAO,CAACyD,EAAGhC,IAAMA,EAAI,IAAM,CAAC,EAC5D0kD,EAAgB,IAAI,EAEpB,MAAMnlD,EAAqB,CAAA,EAE3B,QAASS,EAAI,EAAGA,GAAK0kD,EAAgB,OAAQ1kD,IACzCT,EAAO,KAAKmlD,EAAgB,MAAM,EAAG1kD,CAAC,CAAC,EAIpC,OAAAT,EAAO,IAASolD,GAAAZ,EAAuBY,CAAC,GAAG,EAAE,EAAE,OAAO,OAAO,CAAA,EACrE,CAACH,EAA6B,CAAC,EAE5BI,GAAoB7vC,EAAA,YAAaovC,GAA4B,CAC3D,IAAIH,EAAqB5kD,EACzB,MAAMqL,EAAkB,CAAA,EACxB,QAASzK,EAAI,EAAGA,EAAImkD,EAAI,OAAQnkD,IAAK,CAC3B,MAAAE,EAAKikD,EAAInkD,CAAC,EACV2F,EAA2Cq+C,EAAoB,KAAU3sB,GAAAA,EAAE,KAAOn3B,CAAE,EAC1F,GAAI,CAACyF,EACK,MAAA,MAAM,sBAAsBzF,CAAE,YAAY,EAC9CuK,EAAA,KAAK9E,EAAW,IAAI,EAC1Bq+C,EAAqBr+C,EAAW,cACpC,CACO,OAAA8E,CACX,EACE,CAACy5C,CAAoB,CAAA,EAEpB,MAAA,CACH,YAAA9kD,EACA,MAAAwiD,EACA,WAAAE,EACA,QAAS,CAACE,GAAeI,EACzB,uBAAAE,EACA,QAAAI,EACA,SAAAzB,EACA,mBAAAC,EACA,YAAAc,EACA,cAAAwB,EACA,uBAAAO,EACA,qBAAAG,EACA,oBAAAE,GACA,kBAAAC,EACA,uBAAAvB,EACA,2BAAAwB,GACA,gBAAA1B,EACA,mBAAA2B,GACA,mBAAArC,EACA,kBAAAgB,EACA,4BAA6BsB,GAC7B,uBAAAC,GACA,kBAAAG,EAAA,CAER,CAEgB,SAAAC,GAAgBtmD,EAAcqH,EAAmB,CACzD,OAAAA,EACO,GAAG3H,GAAgCM,CAAI,CAAC,IAAIN,GAAgC2H,CAAQ,CAAC,GAErF3H,GAAgCM,CAAI,CACnD,CAEA,SAASskD,GAAWh7C,EAAe,CACxB,OAAA,mBAAmB5J,GAAgC4J,CAAK,CAAC,EAC3D,WAAW,MAAO,GAAG,EACrB,WAAW,MAAO,GAAG,CAC9B,CAEA,SAASi9C,GAA+B3B,EAAyC32C,EAA0D,CAChI,OAAA22C,EACF,OAAQ9rB,GACAA,EAAE,YACqB9qB,GAAmB8qB,EAAG7qB,EAAgB6qB,EAAE,KAAM,IAAI,GAClD,OAAS,GAFV,EAG9B,EACA,IAAKA,GACGA,EAAE,eACA,CACH,GAAGA,EACH,eAAgBytB,GAA+BztB,EAAE,eAAgB7qB,CAAc,CAAA,EAHrD6qB,CAKjC,CACT,CAEA,eAAeisB,GAAmBlkD,EACAgiD,EACA50C,EACAkK,EACA+qC,EAA6E,CAC3G,IAAI0B,EAA0C,CAAA,EAC1C,OAAA,OAAO/jD,GAAgB,WACvB+jD,EAAsB,MAAM/jD,EAAY,CACpC,KAAMoN,EAAe,KACrB,eAAAA,EACA,WAAAkK,CAAA,CACH,EACM,MAAM,QAAQtX,CAAW,IACV+jD,EAAA/jD,GAGJ+jD,EAAAr6C,GAAgCq6C,EAAqB/B,CAAqB,EAE1E+B,EAAA2B,GAA+B3B,EAAqB32C,CAAc,EAEpFi1C,IACsB0B,EAAA1B,EAAkB0B,GAAuB,CAAA,CAAE,GAG9DA,CACX,CAEA,eAAeI,GAAgBwB,EAAoDv4C,EAAgCkK,EAAgC,CAC/I,IAAI0sC,EAA2B,CAAA,EAC3B,OAAA,OAAO2B,GAAc,WACrB3B,EAAgB,MAAM2B,EAAU,CAC5B,KAAMv4C,EAAe,KACrB,eAAAA,EACA,WAAAkK,CAAA,CACH,EACM,MAAM,QAAQquC,CAAS,IACd3B,EAAA2B,GAEb3B,CACX,CC5aO,SAAS4B,IAAsE,CAElF,KAAM,CAACC,EAAaC,CAAc,EAAIxvC,EAAA,SAAkD,CAAE,CAAA,EAEpFyvC,EAA2BpwC,cAAaqwC,GAAuB,CAC3D,MAAAxkD,EAAO,aAAa,QAAQwkD,CAAU,EAC5C,OAAOxkD,EAAO,KAAK,MAAMA,CAAI,EAAI,CAAA,CACrC,EAAG,CAAE,CAAA,EAECykD,EAAsBtwC,cAA4CxW,GAA6C,CACjH,MAAM6mD,EAAa,sBAAsB96C,GAAoB/L,CAAI,CAAC,GAC9D,OAAA0mD,EAAYG,CAAU,EACfH,EAAYG,CAAU,EAE1BD,EAAyBC,CAAU,CAAA,EAC3C,CAACH,EAAaE,CAAwB,CAAC,EAEpCG,EAAuBvwC,EAAAA,YAAY,CAAgCxW,EAAcmZ,IAAqC,CACxH,MAAM0tC,EAAa,sBAAsB96C,GAAoB/L,CAAI,CAAC,GAClE,aAAa,QAAQ6mD,EAAY,KAAK,UAAU1tC,CAAI,CAAC,EACrDwtC,EAAgBK,GAAiB,CACvB,MAAAC,EAAeD,EAAaH,CAAU,EACtCK,EAAY5kD,GAAU2kD,GAAgBL,EAAyB5mD,CAAI,EAAGmZ,CAAI,EACxE,OAAA7W,GAAU0kD,EAAcE,CAAS,CAAA,CAC5C,CAAA,EACF,CAACN,CAAwB,CAAC,EAEvB,CAACO,EAAsBC,CAAwB,EAAIjwC,EAAA,SAAmB,CAAE,CAAA,EACxE,CAACkwC,EAAgBC,CAAkB,EAAInwC,EAAA,SAAmB,CAAE,CAAA,EAC5D,CAACowC,EAAiBC,CAAmB,EAAIrwC,EAAA,SAAmB,CAAE,CAAA,EAEpElC,EAAAA,UAAU,IAAM,CACZmyC,EAAyB,aAAa,QAAQ,wBAAwB,EAAI,KAAK,MAAM,aAAa,QAAQ,wBAAwB,CAAE,EAAI,CAAE,CAAA,EAC1IE,EAAmB,aAAa,QAAQ,iBAAiB,EAAI,KAAK,MAAM,aAAa,QAAQ,iBAAiB,CAAE,EAAI,CAAE,CAAA,EACtHE,EAAoB,aAAa,QAAQ,kBAAkB,EAAI,KAAK,MAAM,aAAa,QAAQ,kBAAkB,CAAE,EAAI,CAAE,CAAA,CAC7H,EAAG,CAAE,CAAA,EAEC,MAAAC,EAA0BjxC,cAAatK,GAAoB,CAC7D,aAAa,QAAQ,yBAA0B,KAAK,UAAUA,CAAK,CAAC,EACpEk7C,EAAyBl7C,CAAK,CAClC,EAAG,CAAE,CAAA,EAECw7C,EAAoBlxC,cAAatK,GAAoB,CACvD,aAAa,QAAQ,kBAAmB,KAAK,UAAUA,CAAK,CAAC,EAC7Do7C,EAAmBp7C,CAAK,CAC5B,EAAG,CAAE,CAAA,EAECy7C,EAAqBnxC,cAAatK,GAAoB,CACxD,aAAa,QAAQ,mBAAoB,KAAK,UAAUA,CAAK,CAAC,EAC9Ds7C,EAAoBt7C,CAAK,CAC7B,EAAG,CAAE,CAAA,EAEE,MAAA,CACH,qBAAA66C,EACA,oBAAAD,EACA,qBAAAK,EACA,wBAAAM,EACA,eAAAJ,EACA,kBAAAK,EACA,gBAAAH,EACA,mBAAAI,CAAA,CAER,CC1DO,SAASC,IAAyC,CAErD,MAAMC,EAAuB,OAAO,OAAW,KAC3C,OAAO,WAAW,8BAA8B,EAE9CC,GADyC,aAAa,QAAQ,mBAAmB,GAAK,KAAO,aAAa,QAAQ,mBAAmB,IAAM,OAAS,OACxGD,EAC5C,CAACxoD,EAAM0oD,CAAO,EAAI5wC,EAA2B,SAAA2wC,EAAkB,OAAS,OAAO,EAErF7yC,EAAAA,UAAU,IAAM,CACJ8yC,EAAAD,EAAkB,OAAS,OAAO,EAC1BE,EAAAF,EAAkB,OAAS,OAAO,CAAA,EACnD,CAACA,CAAe,CAAC,EAGd,MAAAG,EAAczxC,EAAAA,YAAY,IAAM,CAClCuxC,EAAQ,MAAM,EACdC,EAAgB,MAAM,CAAA,EACvB,CAACH,CAAoB,CAAC,EAEnBK,EAAe1xC,EAAAA,YAAY,IAAM,CACnCuxC,EAAQ,OAAO,EACfC,EAAgB,OAAO,CAC3B,EAAG,CAAE,CAAA,EAECA,EAAmB3oD,GAA2B,CAChD,SAAS,KAAK,MAAM,YAAY,eAAgBA,CAAI,EAC3C,SAAA,gBAAgB,QAAQ,MAAQA,CAAA,EAGvC6/C,EAAa1oC,EAAAA,YAAY,IAAM,CAE7BnX,IAAS,SACJwoD,EAGD,aAAa,WAAW,mBAAmB,EAF9B,aAAA,QAAQ,oBAAqB,MAAM,EAGxCI,MAERJ,EACa,aAAA,QAAQ,oBAAqB,OAAO,EAEjD,aAAa,WAAW,mBAAmB,EAClCK,IACjB,EACD,CAAC7oD,EAAMwoD,CAAoB,CAAC,EAExB,MAAA,CACH,KAAAxoD,EACA,QAAA0oD,EACA,WAAA7I,CAAA,CAER,CCvBA,MAAMiJ,GAAiB,kBAqBhB,SAASC,GAAqE,CACI,KAAApoD,EACA,SAAAqH,EACA,gBAAAghD,EACA,KAAA/rC,EACA,WAAAlV,EACA,oBAAA27B,EACA,oBAAAulB,EACA,UAAAC,EACA,SAAAC,EACA,QAAApU,CACJ,EAA2B,CAExGhtC,EAAW,UAAYA,EAAW,cAClC,QAAQ,KAAK,kBAAkBA,EAAW,IAAI,gGAAgG,EAGlJ,KAAM,CAACqhD,EAAQC,CAAS,EAAIvxC,WAAS,EAAK,EAKpC,CAACwxC,EAAiBC,CAAkB,EAAIzxC,EAAAA,SAAsC,MAAS,EAC7F5K,GAAqBo8C,EAAiB,IAAM,CACpCA,GACWE,EAAA,CACP,SAAUnlC,GAAY,GACtB,WAAAtc,EACA,KAAApH,EACA,OAAQ2oD,EACR,eAAgB,EAAA,CACnB,CAAA,EACN,GAAO,GAAI,EAOR,MAAAxwC,EAAa7C,GAAclO,CAAU,EACrCo8B,EAAoBC,KACpBxrB,EAAuBlC,KACvBsC,EAAqBlC,KACrBoC,EAA0BX,KAC1BsB,EAAUnB,KACV9J,EAAiB0H,KAEjB,CAACkjC,EAAaiQ,CAAc,EAAI3xC,EAAAA,SAAqC,MAAS,EAE9E,CAAC5R,EAAQwjD,CAAS,EAAI5xC,WAAuBmF,EAAO,OAAUjV,EAAW,WAAa,KAAM,EAE5F2hD,EAAoBh0C,EAAAA,OAAoC,MAAS,EACjEi0C,EAAiBD,EAAkB,QAEnC1D,GAAkBl+C,EAAW,gBAAkB,IAAI,OAAO0xB,GAAK,CAACA,EAAE,kBAAkB,EACpFowB,EAAsB5D,GAAgB,QAAU,EAChD6D,EAAc/hD,EAAW,YACzBgiD,EAAmBD,GAAa,QAAU,EAC1C1S,EAAWrvC,EAAW,cAAgB,CAACA,EAAW,SAElDiiD,EAAqBD,EAAmB,GAAKF,EAAsB,EAEnE7+C,EAAsBg+C,GAAmBj+C,GAC3ChD,EAAaA,EAAW,oBAAsB,OAC9C,CACI,OAAA7B,EACA,SAAA8B,CACJ,CAAA,EAGEiiD,EAAiBt0C,EAAAA,OAAe3K,GAAuB89C,EAAc,EAErEoB,EAAkBD,EAAe,UAAYnB,GAE7C,CACF,OAAAniD,EACA,YAAAqT,EAEA,iBAAAE,IACAS,GAA4B,CAC5B,KAAAha,EACA,SAAAqH,EACA,WAAAD,EACA,SAAU,EAAA,CACb,EAEK,CAACsc,EAAY8lC,EAAa,EAAIryC,WAAgCnR,CAAM,EACpE,CAACyjD,GAAUC,EAAW,EAAIvyC,EAAAA,SAA8B,MAAS,EAEvElC,EAAAA,UAAU,IAAM,CACRjP,GACAwjD,GAAcxjD,CAAM,CAAA,EACzB,CAACA,CAAM,CAAC,EAEXiP,EAAAA,UAAU,IAAM,CACZ,GAAI1P,IAAW,MACXmkD,GAAY,EAAK,MACd,CACG,MAAAC,EAAcjmC,EAAavV,GAAc/G,EAAY6G,EAAgBjO,EAAM0jB,GAAc,IAAI,EAAI,GACnGA,GACAgmC,GAAY,CAACC,CAAW,CAChC,CACD,EAAA,CAAC17C,EAAgByV,EAAYne,CAAM,CAAC,EAEjC,MAAAiV,GAAqBhE,cAAanQ,GAAa,CACjDqiD,EAAU,EAAK,EACfrwC,EAAmB,KAAK,CACpB,KAAM,QACN,QAAS,wBAA0BhS,GAAG,OAAA,CACzC,EACD,QAAQ,MAAMA,CAAC,CAAA,EAChB,CAACgS,CAAkB,CAAC,EAEjBoC,GAAyBjE,cAAanQ,GAAa,CACrDqiD,EAAU,EAAK,EACfrwC,EAAmB,KAAK,CACpB,KAAM,QACN,QAAS,yCAA2ChS,GAAG,OAAA,CAC1D,EACD,QAAQ,MAAMA,CAAC,CAAA,EAChB,CAACgS,CAAkB,CAAC,EAEjBiC,EAAgB,CAACF,EAA0BwvC,KAA4B,CAEzElB,EAAU,EAAK,EACVjS,GACDp+B,EAAmB,KAAK,CACpB,KAAM,UACN,QAAS,GAAGjR,EAAW,cAAgBA,EAAW,IAAI,mBAAA,CACzD,EAELoiD,GAAcpvC,CAAa,EAC3B2uC,EAAU,UAAU,EAEpBT,EAAoB,EAAK,EAErBE,GACSA,EAAA,CAAE,OAAQpuC,CAAA,CAAe,EAElCwvC,IACApmB,EAAkB,WAAW,EAAK,EAClCA,EAAkB,MAAM,EAAI,EAClB4Q,OACH7uC,IAAW,YAClB0S,EAAqB,QAAQ,CACzB,KAAAjY,EACA,SAAUoa,EAAc,GACxB,gBAAiBkvC,EAAe,QAChC,UAAW,GACX,WAAAliD,CAAA,CACH,CACL,EAIEmT,EAAgB/D,cAAanQ,GAAa,CAE5CqiD,EAAU,EAAK,EACfrwC,EAAmB,KAAK,CACpB,KAAM,QACN,QAAS,iBAAmBhS,GAAG,OAAA,CAClC,EAEO,QAAA,MAAM,sBAAuBrG,EAAMqH,CAAQ,EACnD,QAAQ,MAAMhB,CAAC,CAChB,EAAA,CAACgB,EAAUrH,EAAMqY,CAAkB,CAAC,EAEjCwwC,EAAa,CAAC,CACI,OAAA/iD,EACA,eAAAwB,GACA,eAAAsiD,GACA,SAAAviD,GACA,WAAAD,GACA,KAAApH,EAAA,IAQlB,CACF0oD,EAAU,EAAI,EACUruC,GAAA,CACpB,KAAAra,GACA,SAAAqH,GACA,OAAAvB,EACA,eAAAwB,GACA,WAAAF,GACA,OAAA7B,EACA,WAAA4S,EACA,QAAAe,EACA,cAAgBkB,GAA6BE,EAAcF,EAAewvC,EAAc,EACxF,cAAArvC,EACA,mBAAAC,GACA,uBAAAC,EAAA,CACH,EAAE,KAAK,CAAA,EAGNovC,EAAsB,MAAO,CACI,WAAAziD,EACA,KAAApH,GACA,SAAAqH,GACA,OAAAvB,GACA,eAAAwB,GACA,eAAAsiD,GACA,SAAAnT,CAAA,IAC0C,CACxElxC,IAGDkxC,EACAmS,EAAmB9iD,EAAM,EAEd+iD,EAAA,CACP,WAAAzhD,EACA,KAAApH,GACA,SAAAqH,GACA,OAAAvB,GACA,eAAAwB,GACA,eAAAsiD,EAAA,CACH,EACL,EAGEE,EAAsBX,EAAcA,EACjC,OAAS5/C,GAAkBlD,EAAGkS,EAAwB,WAAW,CAAC,EAClE,OAAO,OAAO,EACjB,CAAA,EAEAwxC,EAAiDZ,GAAeW,EACjE,IACG,CAAC9/C,EAAYggD,KAAa,CAGlB,GAFA,CAAChgD,GAEDs/C,EAAe,UAAYt/C,EAAW,IAC/B,OAAA,KACX,MAAM22B,GAAU32B,EAAW,QAC3B,OAAK22B,GAIEzhC,EAAA,IAAC,MAAA,CACJ,UAAW2iB,EAAA,GAAGI,EAAA,mBACV,iDAAiD,EAErD,KAAK,WACL,SAAA/iB,EAAAA,IAACyiB,IACI,SAAek3B,GAAA35C,EAAA,IAACyhC,GAAA,CACb,WAAAv5B,EACA,OAAQsc,EACR,eAAgBulC,GAAkBvlC,GAAY,OAC9C,YAAAm1B,CAAA,CAAA,EAER,CAAA,EATK,eAAe7uC,EAAW,GAAG,EAAA,GANlC,QAAQ,MAAM,mCAAmC,EAC1C,KAgBf,CAAA,EACF,OAAO,OAAO,EAEdigD,EAAiB5wC,GAAe,CAACqK,IACjC,CAACA,GAAc+lC,KAAa,UAAelkD,IAAW,YAAcA,IAAW,QAE/EigB,EAAUykC,GAAiBxB,EAE3ByB,GAAsB5E,GAAkBA,EAAe,IACzD,CAACrzC,EAAe+3C,KAAa,CACnB,MAAAG,GAAkBl4C,EAAc,IAAMA,EAAc,KACpDnI,GAAW4Z,EAAa,GAAG1jB,CAAI,IAAI0jB,GAAY,EAAE,IAAIhkB,GAAgCyqD,EAAe,CAAC,GAAK,OAChH,OAAIb,EAAe,UAAYa,GACpB,KAEP1yC,EAAA,KAAC,MAAA,CACG,UAAW,iDAEX,KAAK,WAEJ,SAAA,CAAA+N,SAAYgQ,GAAsB,EAAA,EAElC,CAACy0B,IACGvmC,GAAc5Z,GACT5K,EAAA,IAACk8C,GAAA,CACC,SAAAtxC,GACA,oBAAqB,CAAC,GAAGi5B,EAAqB37B,EAAW,EAAE,EAC3D,gBAAiB,GAChB,GAAG6K,CAAA,CAAA,EACN/S,EAAA,IAAC,MAAA,CACC,UAAU,qDACV,SAACA,EAAA,IAAA4e,aAAA,CAAW,QAAS,QAAS,SAG9B,oEAAA,CAAA,CAAA,EACJ,CAAA,EAlBH,UAAUqsC,EAAe,EAAA,CAuB1C,CAAA,EACF,OAAO,OAAO,EAEV/T,GAAY5/B,EAAAA,YAAY,IAAM,CAChC8xC,EAAoB,EAAK,CAC7B,EAAG,CAAE,CAAA,EAEC8B,GAAkB1mD,GAAkB,CACtC4lD,EAAe,QAAU5lD,EACzBuU,EAAqB,QAAQ,CACzB,KAAAjY,EACA,SAAAqH,EACA,gBAAiB3D,IAAUykD,GAAiB,OAAYzkD,EACxD,UAAW,GACX,WAAA0D,CAAA,CACH,CAAA,EAGCkvC,GAAkB9/B,cAAa1Q,GAA6B,CAC9DkjD,EAAkB,QAAUljD,CAChC,EAAG,CAAE,CAAA,EAGC4wC,GAAkBlgC,cAAasD,GAAe,CAChDzB,EAAmB,KAAK,CACpB,KAAM,QACN,QAAS,sCAAA,CACZ,CACL,EAAG,CAAE,CAAA,EAECk+B,GAAa//B,cAAa7U,GAAe,CAC7B6nD,GAACa,IAAeA,GACxB,CACE,GAAGA,GACH,GAAA1oD,CAAA,EAEF,MAAS,CACnB,EAAG,CAAE,CAAA,EAEC00C,GAAc8C,GAAmB,CAC9B1C,GACD6R,EAAoBnP,CAAK,CAAA,EAGjC,SAASmR,IAAY,CACjB,MAAMhiB,EAAU/vB,EAAwB,QACxC,IAAI0iC,GAAO/7C,EAAA,IAAC42C,GAAA,CACR,OAAAvwC,EACA,KAAAvF,EACA,WAAAoH,EACA,sBAAuByiD,EACvB,UAAAzT,GACA,gBAAAE,GACA,WAAAD,GACA,OAAQ3yB,EACR,WAAA6yB,GACA,oBAAqBuS,EACrB,OAAQ1hD,EAAW,eACnB,SAAAqvC,EACA,gBAAAC,EAAA,CAAA,EAEJ,OAAIpO,GACQA,EAAA,QAAS3C,IAA0B,CACnCA,GAAO,MAAM,WACbsV,GACI/7C,EAAA,IAACymC,GAAO,KAAK,SAAS,UAArB,CACG,OAAApgC,EACA,KAAAvF,EACA,WAAAoH,EACA,UAAAgvC,GACA,gBAAAE,GACA,WAAAD,GACA,OAAQ3yB,EACR,QAAAxK,EACA,YAAA2/B,EACC,GAAGlT,GAAO,KAAK,SAAS,MACxB,SAAAsV,EAAA,CAAA,EAGb,CACH,EAEE/7C,EAAA,IAACyiB,GAAe,CAAA,SAAAs5B,EAAK,CAAA,CAChC,CAEM,MAAAA,GAAQwO,KAAa,OACrBvqD,EAAAA,IAAAiQ,EAAAA,SAAA,CAAA,CAAE,EACAs6C,GAIQhyC,EAAA,KAAAtI,EAAA,SAAA,CAAA,SAAA,CAAAjQ,EAAA,IAAC4e,EAAA,WAAA,CACG,UAAW,kBACX,QAAS,KAAO,SAAA1W,EAAW,cAAgBA,EAAW,IAAA,CAC1D,EACAlI,EAAA,IAACymB,GAAA,CACG,UAAW,QACX,OAAQjC,EACR,KAAA1jB,EACA,WAAAoH,CAAA,CAAuB,CAC/B,CAAA,CAAA,EAZFkjD,GAAU,EAedC,GAAoBjF,GAAkBA,EAAe,IACtDrzC,GACG/S,EAAA,IAACsrD,EAAA,IAAA,CACG,UAAU,wBACV,MAAOv4C,EAAc,GAEpB,SAAcA,EAAA,IAAA,EADV,gCAAgCA,EAAc,IAAI,EAE3D,CAAA,EAGFw4C,GAAiBX,EAAoB,IACtC5kB,GAEGhmC,EAAA,IAACsrD,EAAA,IAAA,CACG,UAAU,wBACV,MAAOtlB,EAAK,IAEX,SAAKA,EAAA,IAAA,EADD,gCAAgCA,EAAK,IAAI,EAElD,CAAA,EAIJ,OAAAhmC,EAAA,IAAC,MAAA,CACG,UAAU,wEAEN,SAEIuY,EAAA,KAAAtI,WAAA,CAAA,SAAA,CAAAsI,EAAA,KAAC,MAAA,CACG,UAAWoK,EAAAA,GAAGI,EAAA,mBAAoB,iGAAiG,EAEnI,SAAA,CAAA/iB,EAAA,IAAC,MAAA,CACG,UAAU,mBACV,SAAAA,EAAA,IAACyf,EAAA,WAAA,CACG,QAAS,KACKy1B,MACH5Q,EAAkB,MAAM,EAAK,GAExC,KAAK,QACL,eAAC+H,EAAS,UAAA,EAAA,CAAA,CACd,CAAA,CACJ,EAEArsC,EAAAA,IAAC,MAAI,CAAA,UAAW,WAAY,CAAA,EAE3B+qD,GAAiB/qD,EAAA,IAAC,MAAA,CACf,UAAU,cACV,SAAAA,EAAAA,IAACy0B,EAAAA,iBAAiB,CAAA,KAAM,OAAQ,CAAA,CAAA,CACpC,EAEAlc,EAAA,KAACizC,EAAA,KAAA,CACG,MAAOpB,EAAe,QACtB,cAAgB5lD,GAAU,CACtB0mD,GAAe1mD,CAAK,CACxB,EACA,UAAU,iBAEV,SAAA,CAAAxE,EAAA,IAACsrD,EAAA,IAAA,CACG,SAAU,CAACnB,EACX,MAAOlB,GACP,UAAW,GACNkB,EAAgC,GAAX,QAC1B,yBACF,SAAAjiD,EAAW,cAAgBA,EAAW,IAAA,CAAK,EAE5CqjD,GAEAF,EAAA,CAAA,CACL,CAAA,CAAA,CAEJ,EAEA9yC,EAAA,KAAC,MAAA,CACG,UAAW,uDACX,MAAO,CAMP,EAEA,SAAA,CAAAvY,EAAA,IAAC,MAAA,CACG,KAAK,WACL,OAAQ,CAACqqD,EACT,GAAI,QAAQvpD,CAAI,GAChB,UAAW,UAEV,SAAAiqD,EACM/qD,EAAAA,IAAAs2B,GAAA,CAAA,CAAsB,EACvBylB,EAAA,CAEV,EAEC8O,EAEAG,EAAA,CAAA,CAEL,CAAA,EAEJ,CAAA,CAAA,CAKhB,CC3iBgB,SAAAS,GAAkCC,EAAepvC,EAK3D,CAEF,KAAM,CAACqvC,EAAcC,CAAe,EAAIvrD,EAAM,SAA0B,EAClE,CAAE,UAAAwrD,CAAc,EAAAxrD,EAAM,WAAWyrD,GAAwB,wBAAA,EAEzD5lB,EAAWC,GAAAA,cAEXuP,EAAe,IAAM,CACvBkW,EAAgB,MAAS,CAAA,EAGvBhW,EAAW,IAAM,CACTt5B,IACVsvC,EAAgB,MAAS,EACzB1lB,EAAS,EAAE,CAAA,EAGT6lB,EAAmBz0C,EAAAA,YAAY,CAAC,CACI,OAAA+F,EACA,SAAUsuC,EACV,MAAAK,CAAA,IACE,CACxC,OAAQ3uC,EAAQ,CACZ,IAAK,UAAW,CACN2uC,IACN,MACJ,CACA,IAAK,MACDJ,EAAgBD,CAAY,CAEpC,CACJ,EAAG,CAAE,CAAA,EAEL,OAAAtrD,EAAM,UAAU,IAAM,CAGlB,GAFI,CAACqrD,GACDC,GACA,EAAE,UAAWE,GAAY,OAC7B,MAAMI,EAAWJ,EAAkB,MAAOK,GAAmB,CACzD,MAAMC,EAAmB,CACrB,GAAGD,EACH,OAAQ,CACID,IACRC,EAAG,MAAM,CACb,CAAA,EAEJH,EAAQI,CAAgB,CAAA,CAC3B,EAEM,OAAAF,GACR,CAACJ,EAAWE,EAASL,EAAMC,CAAY,CAAC,EAEpC,CACH,qBAAsB,EAAQA,EAC9B,aAAAjW,EACA,SAAAE,CAAA,CAER,CAUO,SAASwW,GAAqB,CACI,KAAA/0C,EACA,SAAAu+B,EACA,aAAAF,EACA,KAAAh3B,EACA,MAAAH,CACJ,EAA8B,CAG3D,OAAAhG,EAAA,KAACy9B,EAAA,OAAA,CACG,KAAA3+B,EACA,aAAeA,GAASA,EAAOq+B,EAAA,EAAiBE,EAAS,EAEzD,SAAA,CAAAr9B,OAAC09B,EAAAA,cACG,CAAA,SAAA,CAACj2C,EAAA,IAAA4e,EAAA,WAAA,CAAW,QAAS,KAAO,SAAML,EAAA,EAEjCG,EAED1e,EAAAA,IAAC4e,cAAW,SAEZ,2CAAA,CAAA,CAAA,EAEJ,SACCimB,EAAAA,cACG,CAAA,SAAA,CAAA7kC,EAAAA,IAACsuB,UAAO,QAAQ,OAAO,QAASonB,EAAc,UAAS,GAAC,SAAQ,UAAA,CAAA,EAC/D11C,EAAA,IAAAsuB,EAAA,OAAA,CAAO,QAASsnB,EAAU,SAAI,OAAA,CAAA,EACnC,CAAA,CAAA,CAAA,CAGZ,CC1FA,MAAMyW,GAAoBhsD,EAAM,cAAsC,CAClE,MAAO,GACP,QAAS,GACT,WAAaisD,GAAqB,CAClC,EACA,4BAA8B/0C,GAA8B,CAC5D,EACA,MAAO,IAAM,CACb,CACJ,CAAC,EAOYgtB,GAAuB,IAAMjuB,EAAA,WAAmC+1C,EAAiB,EAUvF,SAASE,IAAc,CAI1B,MAAMC,EAFwB71C,KAEW,WAEnC81C,EAA+C,CAAC,GAAGD,CAAU,EACnE,OAAAC,EAAO,KAAK,MAAS,EAIbzsD,EAAA,IAAAiQ,EAAA,SAAA,CAAA,SAAAw8C,EAAO,IAAI,CAACC,EAAO3iD,IACf/J,EAAA,IAAC2sD,GAAA,CAEG,MAAAD,EACA,eAAgBF,EAAW,OAASziD,EAAQ,CAAA,EAFvC,eAAeA,CAAK,EAEuB,CAAA,CAEhE,CAAA,CACJ,CAEA,SAAS4iD,GAAe,CACI,eAAAC,EACA,MAAAF,CACJ,EAGrB,CAGC,KAAM,CAACG,EAAsBC,CAAuB,EAAI70C,WAAkB,EAAK,EACzE,CAACq0C,EAASS,CAAU,EAAI90C,WAAS,EAAK,EACtC,CAAC+0C,EAA0BC,CAA2B,EAAIh1C,EAAsC,SAAA,EAEhGi1C,EAAW7sD,EAAM,OAA2BqsD,GAAO,KAAK,EACxDxrC,EAAQgsC,EAAS,QAEjBp0C,EAAwBnC,KAExB,CACF,qBAAAw2C,EACA,SAAUC,EACV,aAAcC,CAAA,EACd5B,GACAa,GAAW,CAACO,EACZ,IAAME,EAAW,EAAK,CAAA,EAG1Bh3C,EAAAA,UAAU,IAAM,CACR22C,IACAQ,EAAS,QAAUR,EAAM,MAAA,EAC9B,CAACA,CAAK,CAAC,EAEV,MAAMY,EAAsB,IAAM,CAC9BP,EAAW,EAAK,EAChBD,EAAwB,EAAK,EAC7Bh0C,EAAsB,MAAM,EAC5B4zC,GAAO,UAAU,CAAA,EAGfa,EAA0B,IAAM,CAClCT,EAAwB,EAAK,CAAA,EAG3BU,EAAkBC,GAAoB,CACpCnB,GAAW,CAACmB,EACZX,EAAwB,EAAI,GAE5Bh0C,EAAsB,MAAM,EAC5B4zC,GAAO,UAAU,EACrB,EAMA,OAAAn0C,EAAA,KAAC8zC,GAAkB,SAAlB,CACG,MAAO,CACH,QAAAC,EACA,WAAAS,EACA,4BAAAE,EACA,MAAA/rC,EACA,MAAOssC,CACX,EAEA,SAAA,CAAAj1C,EAAA,KAACm1C,EAAA,MAAA,CACG,KAAM,EAAQhB,EACd,aAAer1C,GAAS,CAACA,GAAQm2C,EAAe,EAE/C,SAAA,CACGd,GAAA1sD,EAAA,IAAC,MAAA,CACG,UAAW,kIACX,MAAO,CACH,MAAO0sD,EAAM,MACb,UAAW,eAAeE,EAAiB,GAAG,KAClD,EAEA,SAAA5sD,EAAA,IAACyiB,GACI,CAAA,SAAAiqC,EAAM,UACX,CAAA,CACJ,EAEH,CAACA,GAAS1sD,EAAAA,IAAC,OAAI,MAAO,CAAE,MAAAkhB,GAAQ,CAAA,CAAA,CAErC,EAEAlhB,EAAA,IAACosD,GAAA,CACG,KAAMe,GAAwBN,EAC9B,SAAUA,EAAuBS,EAAsBF,EACvD,aAAcP,EAAuBU,EAA0BF,EAC/D,KAAML,CAAA,CAAyB,CAAA,CAAA,CAAA,CAK/C,CC1IO,SAASW,GAAgBxkD,EAA6B,CAEnD,KAAA,CACF,QAAAmjD,EACA,WAAAS,EACA,4BAAAE,GACA1oB,GAAqB,EAEnB/gB,EAAuBhN,KAEvBqtB,EAAsBnsB,EAAAA,QAAQ,IACzB8L,EAAqB,uBAAuBra,EAAM,IAAI,EAC9D,CAACqa,EAAsBra,EAAM,IAAI,CAAC,EAE/BjB,EAAawP,EAAAA,QAAQ,IAAM,CAC7B,GAAI,CAACvO,EAAc,OACnB,IAAI45C,EAAiB55C,EAAM,WAE3B,MAAMykD,EAAqBpqC,EAAqB,cAAcra,EAAM,KAAMA,EAAM,QAAQ,EAIxF,GAHIykD,IACiB7K,EAAA6K,GAEjB,CAAC7K,EACD,cAAQ,MAAM,uCAAwC55C,EAAM,KAAM,iBAAkBA,EAAM,QAAQ,EAC5F,MAAM,uCAAyCA,EAAM,KAAO,kFAAkF,EAGjJ,OAAA45C,CAAA,EACR,CAACv/B,EAAsBra,CAAK,CAAC,EAEhC4M,EAAAA,UAAU,IAAM,CACZ,SAAS83C,EAAa1mD,EAAQ,CACtBmlD,GAAWpkD,IACXf,EAAE,eAAe,EACfA,EAAA,YAAc,oCAAoCe,EAAW,IAAI,8CAE3E,CAEA,OAAI,OAAO,OAAW,KACX,OAAA,iBAAiB,eAAgB2lD,CAAY,EAEjD,IAAM,CACL,OAAO,OAAW,KACX,OAAA,oBAAoB,eAAgBA,CAAY,CAAA,CAC/D,EAED,CAACvB,EAASpkD,CAAU,CAAC,EAElB,MAAAkhD,EAAsB9xC,cAAa8iC,GAAsB,CAC3D2S,EAAW3S,CAAQ,EACnB6S,EAA4B7S,EACpB7hC,EAAAA,KAAAtI,EAAA,SAAA,CAAA,SAAA,CAAA,qCAAmCjQ,EAAA,IAAA,IAAA,CAAG,SAAYkI,GAAA,cAAgBA,GAAY,KAAK,EAAI,GAAA,EAAC,EAC1F,MAAS,GAChB,CAACA,GAAY,KAAM6kD,EAAYE,CAA2B,CAAC,EAE1D,MAAA,CAAC9jD,GAAS,CAACjB,EACJlI,EAAA,IAAC,MAAI,CAAA,UAAW,QAAS,CAAA,EAIhCA,EAAAA,IAAAiQ,EAAAA,SAAA,CACI,eAACwS,GACG,CAAA,SAAAziB,EAAA,IAACkpD,GAAA,CACI,GAAG//C,EACJ,UAAWA,EAAM,MACjB,WAAAjB,EACA,oBAAA27B,EACA,oBAAAulB,CAAA,CAAA,CAER,CAAA,CAEJ,CAAA,CAER,CC1EA,MAAM0E,GAAe,MAEL,SAAAC,GAAmB5kD,EAAkCoe,EAAwB,CACrF,GAAAA,EAAc,OAAAvR,GACZ,MAAAg4C,EAAmB,CAAC7kD,EAAM,gBAC1B8kD,EAAoC,OAAO9kD,EAAM,OAAU,SAAW,GAAGA,EAAM,KAAK,KAAOA,EAAM,MAChG,OAAC6kD,EAAgGC,GAAiB/3C,GAA9F,QAAQD,EAAoB,MAAMg4C,GAAiB/3C,EAAoB,GACtG,CAEa,MAAAg4C,GAA+B,CAACl1C,EACAF,IAAuE,CAEhH,MAAMmuB,EAAWC,GAAAA,cACXqd,EAAczuC,SAAgB,EAAK,EAEnCq4C,EAAc,CAACnwC,KAGrBjI,EAAAA,UAAU,IAAM,CACZ,GAAI,CAACiD,EAAW,SAAW,CAACurC,EAAY,QAAS,CAC7C,GAAIvrC,EAAW,oBAAoBiuB,EAAS,QAAQ,EAAG,CACnD,MAAMmnB,EAAUnnB,EAAS,OAAS,IAAI6mB,EAAY,GAC5CO,EAAyBr1C,EAAW,kBAAkBiuB,EAAS,QAAQ,EACvEqnB,EAAgBC,GAAuBF,EAAwBr1C,EAAW,aAAe,CAAA,EAAIo1C,CAAO,EAC1G,QAAS7rD,EAAI,EAAGA,EAAI+rD,EAAc,OAAQ/rD,IAAK,CACrC,MAAAmqD,EAAQ4B,EAAc/rD,CAAC,EAC7B,WAAW,IAAM,CACTA,IAAM,EACNuW,EAAsB,QAAQ01C,GAAiB9B,EAAO1zC,EAAYm1C,CAAW,CAAC,EAE9Er1C,EAAsB,KAAK01C,GAAiB9B,EAAO1zC,EAAYm1C,CAAW,CAAC,GAChF,CAAC,CACR,CACJ,CACA5J,EAAY,QAAU,EAC1B,GACD,CAACtd,EAAUjuB,EAAYF,EAAuBq1C,CAAW,CAAC,EAEvD,MAAA12C,EAAQH,EAAAA,YAAY,IAAM,CAC5BwB,EAAsB,MAAM,CAAA,EAC7B,CAACA,CAAqB,CAAC,EAEpBzB,EAAOC,cAAanO,GAAqC,CAE3D,GAAIA,EAAM,MAAQ,CAACA,EAAM,SACrB,MAAM,MAAM,+DAA+D,EAG/E,MAAMgC,EAAsBD,GACxB/B,EAAM,WAAaA,EAAM,WAAW,oBAAsB,OAC1D,CACI,OAAQA,EAAM,KAAO,OAAUA,EAAM,SAAW,WAAa,MAC7D,SAAUA,EAAM,QACpB,CAAA,EAGJ2P,EAAsB,KAAK01C,GAAiB,CACxC,gBAAiBrjD,EACjB,GAAGhC,CAAA,EACJ6P,EAAYm1C,CAAW,CAAC,CAE5B,EAAA,CAACr1C,EAAuBE,EAAYm1C,CAAW,CAAC,EAE7Cl9C,EAAUqG,cAAanO,GAAqC,CAE9D,GAAIA,EAAM,MAAQ,CAACA,EAAM,SACrB,MAAM,MAAM,+DAA+D,EAG/E2P,EAAsB,QAAQ01C,GAAiBrlD,EAAO6P,EAAYm1C,CAAW,CAAC,CAE/E,EAAA,CAACn1C,EAAYF,EAAuBq1C,CAAW,CAAC,EAE5C,MAAA,CACH,MAAA12C,EACA,KAAAJ,EACA,QAAApG,CAAA,CAER,EAEgB,SAAAs9C,GAAuBztD,EAAca,EAAiCysD,EAA+C,CAEjI,MAAMK,EAAwDjkD,GAAqC,CAC/F,KAAA1J,EACA,YAAAa,CAAA,CACH,EAEK6qD,EAA0C,CAAA,EAChD,IAAIkC,EAAqB,GACzB,QAASnsD,EAAI,EAAGA,EAAIksD,EAAuB,OAAQlsD,IAAK,CAC9C,MAAAP,EAAkBysD,EAAuBlsD,CAAC,EAMhD,GAJIP,EAAgB,OAAS,eACzB0sD,EAAqB1sD,EAAgB,MAGrCO,EAAI,EAAG,CACD,MAAAosD,EAAgBF,EAAuBlsD,EAAI,CAAC,EAC9C,GAAAP,EAAgB,OAAS,SACdwqD,EAAA,KAAK,CACR,KAAMxqD,EAAgB,KACtB,SAAUA,EAAgB,SAC1B,KAAM,EACV,CAAA,UAEGA,EAAgB,OAAS,eAC5B,GAAA2sD,EAAc,OAAS,SAAU,CACjC,MAAMC,EAA2CpC,EAAWA,EAAW,OAAS,CAAC,EAC7EoC,IACcA,EAAA,gBAAkB5sD,EAAgB,KAAK,IAC7D,UACOA,EAAgB,OAAS,cAC5B2sD,EAAc,OAAS,SAAU,CACjC,MAAMC,EAA2CpC,EAAWA,EAAW,OAAS,CAAC,EAC7EoC,IACAA,EAAc,gBAAkB5sD,EAAgB,WAAW,IAAMA,EAAgB,WAAW,KACpG,CAER,CAEJ,CAEA,OAAIosD,GACA5B,EAAW,KAAK,CACZ,KAAMkC,EACN,KAAM,EAAA,CACT,EAGElC,CACX,CAEA,MAAMgC,GAAmB,CAACrlD,EAAkC6P,EAAkCm1C,IAA+C,CAE/H,MAAAzjD,EAAiBlK,GAAgC2I,EAAM,IAAI,EAE3D/G,EAAU+G,EAAM,SAChB6P,EAAW,uBAAuB,GAAGtO,CAAc,IAAIvB,EAAM,QAAQ,IAAIA,EAAM,iBAAmB,EAAE,EAAE,EACtG6P,EAAW,uBAAuB,GAAGtO,CAAc,IAAIojD,EAAY,EAAE,EACrEtyC,EAAexC,EAAW,mBAAmB7P,EAAM,IAAI,EAEvD0lD,EAAgD,CAClD,GAAG1lD,EACH,KAAMqS,CAAA,EAGF,MAAA,CACJ,IAAK,GAAGrS,EAAM,IAAI,IAAIA,EAAM,QAAQ,GACpC,UAAWnJ,EAAAA,IAAC2tD,GAAiB,CAAA,GAAGkB,CAAmB,CAAA,EACnD,QAASzsD,EACT,cAAe4W,EAAW,uBAAuBtO,CAAc,EAC/D,MAAOqjD,GAAmB5kD,EAAOglD,CAAW,EAC5C,QAAShlD,EAAM,OAAA,CAEvB,ECrKG,SAAS2lD,IAAuD,CAEnE,MAAM7nB,EAAWC,GAAAA,cACXhB,EAAWC,GAAAA,cAEX,CAACqmB,EAAYuC,CAAa,EAAI92C,EAAA,SAAiC,CAAE,CAAA,EACjE+2C,EAAgBl5C,SAA+B02C,CAAU,EAEzDyC,EAAcn5C,SAA6C,CAAA,CAAE,EAC7Do5C,EAAcp5C,SAAe,CAAC,EAE9Bq5C,EAAoB/2C,GAAsC,CAC5D42C,EAAc,QAAU52C,EACxB22C,EAAc32C,CAAS,CAAA,EAG3BrC,EAAAA,UAAU,IAAM,CAGZ,MAAMqC,GAFQ6uB,EAAS,OACY,QAAU,IAExC,IAAIhkC,GAAOgsD,EAAY,QAAQhsD,CAAG,CAAC,EACnC,OAAY6G,GAAA,EAAQA,CAAE,EACtB0G,EAAMw+C,EAAc,QAAQ,IAASllD,GAAAA,EAAE,GAAG,EAAGsO,EAAU,IAAStO,GAAAA,EAAE,GAAG,CAAC,GACvEqlD,EAAiB/2C,CAAS,CAAA,EAC/B,CAAC6uB,CAAQ,CAAC,EAEP,MAAAxvB,EAAQH,EAAAA,YAAY,IAAM,CAE5B,GAAIk1C,EAAW,SAAW,EACtB,OAEJ,MAAMoC,EAAgBpC,EAAWA,EAAW,OAAS,CAAC,EAChDn0C,EAAgB,CAAC,GAAGm0C,EAAW,MAAM,EAAG,EAAE,CAAC,EAG7C,GAFJ2C,EAAiB92C,CAAa,EAE1B62C,EAAY,QAAU,EAClBN,EAAc,SACd1oB,EAAS,EAAE,EACHgpB,EAAA,kBACLN,EAAc,cAAe,CAC9B,MAAAQ,EAAgBnoB,EAAS,OAAe,eAAiBA,EAC/Df,EACI0oB,EAAc,cACd,CACI,QAAS,GACT,MAAO,CACH,cAAeQ,EACf,OAAQ/2C,EAAc,IAAIvO,GAAKA,EAAE,GAAG,CACxC,CACJ,CAAA,CAER,CACD,EAAA,CAAC0iD,EAAYtmB,EAAUe,CAAQ,CAAC,EAE7B5vB,EAAOC,cAAa+3C,GAA8D,CAEpF,MAAMj3C,EAAoC,MAAM,QAAQi3C,CAAU,EAAIA,EAAa,CAACA,CAAU,EAEpFj3C,EAAA,QAASs0C,GAAU,CACbuC,EAAA,QAAQvC,EAAM,GAAG,EAAIA,CAAA,CACpC,EACWwC,EAAA,QAAUA,EAAY,QAAU92C,EAAU,OAEhD,MAAAg3C,EAAgBnoB,EAAS,OAAe,eAAiBA,EAEzD5uB,EAAgB,CAAC,GAAGm0C,EAAY,GAAGp0C,CAAS,EAClD+2C,EAAiB92C,CAAa,EAEpBD,EAAA,QAASs0C,GAAU,CACrBA,EAAM,SACNxmB,EACIwmB,EAAM,QACN,CACI,MAAO,CACH,cAAe0C,EACf,OAAQ/2C,EAAc,IAAIvO,GAAKA,EAAE,GAAG,CACxC,CACJ,CAAA,CAER,CACH,CAEF,EAAA,CAACm9B,EAAUf,EAAUsmB,CAAU,CAAC,EAE7Bv7C,EAAUqG,cAAa+3C,GAA8D,CAEvF,MAAMj3C,EAAoC,MAAM,QAAQi3C,CAAU,EAAIA,EAAa,CAACA,CAAU,EACpFj3C,EAAA,QAASs0C,GAAU,CACbuC,EAAA,QAAQvC,EAAM,GAAG,EAAIA,CAAA,CACpC,EAEK,MAAA0C,EAAgBnoB,EAAS,OAAe,eAAiBA,EAEzD5uB,EAAgB,CAAC,GAAGm0C,EAAW,MAAM,EAAG,CAACp0C,EAAU,MAAM,EAAG,GAAGA,CAAS,EAC9E+2C,EAAiB92C,CAAa,EAEpBD,EAAA,QAASs0C,GAAU,CACrBA,EAAM,SACNxmB,EACIwmB,EAAM,QACN,CACI,QAAS,GACT,MAAO,CACH,cAAe0C,EACf,OAAQ/2C,EAAc,IAAIvO,GAAKA,EAAE,GAAG,CACxC,CACJ,CAAA,CAER,CACH,CAEF,EAAA,CAACm9B,EAAUf,EAAUsmB,CAAU,CAAC,EAE5B,MAAA,CACH,WAAAA,EACA,MAAA/0C,EACA,KAAAJ,EACA,QAAApG,CAAA,CAER,CCvHO,SAASq+C,GAAgB5mC,EAAiB,CAC7C3S,EAAAA,UAAU,IAAM,CACZ,GAAI,CAAC2S,EACD,OAGE,MAAA6mC,EAAgBhqC,GAAQmD,CAAM,EAChC6mC,IACAC,kBAAe9mC,EAAQ6mC,CAAa,EACpCE,GAAA,iBAAiB/mC,CAAM,EAC3B,EACD,CAACA,CAAM,CAAC,CACf,CCUO,SAASgnC,GAAmB,CACI,SAAAC,EACA,gBAAA/9C,EACA,qBAAA4R,CACJ,EAIpB,CAEJ,MAAA,CAgBH,gBAAiBlM,cAAY,CAAgC,CACI,KAAAxW,EACA,WAAYuiB,EACZ,OAAAyT,EACA,MAAAtlB,EACA,WAAAo+C,EACA,aAAA/1C,EACA,QAAAg2C,EACA,MAAAC,CAAA,IAGtDH,EAAS,gBAAmB,CAC/B,KAAA7uD,EACA,OAAAg2B,EACA,MAAAtlB,EACA,WAAAo+C,EACA,aAAA/1C,EACA,QAAAg2C,EACA,MAAAC,CAAA,CACH,EACF,CAACH,CAAQ,CAAC,EAkBb,iBAAkBA,EAAS,iBAErBr4C,EAAAA,YAAY,CACV,CACI,KAAAxW,EACA,WAAYuiB,EACZ,OAAAyT,EACA,MAAAtlB,EACA,WAAAo+C,EACA,aAAA/1C,EACA,QAAAg2C,EACA,MAAAC,EACA,SAAAxG,EACA,QAAA3uC,CAAA,IAES,CAEb,MAAMzS,EAAamb,GAAkBG,EAAqB,cAAc1iB,CAAI,EACtEivD,EAAoB,EAAQ7nD,GAAY,gBAC9C,GAAI,CAACynD,EAAS,iBACV,MAAM,MAAM,6CAA6C,EAE7D,OAAOA,EAAS,iBAAoB,CAChC,KAAA7uD,EACA,OAAAg2B,EACA,MAAAtlB,EACA,WAAAo+C,EACA,aAAA/1C,EACA,QAAAg2C,EACA,MAAAC,EACA,SAAAxG,EACA,QAAA3uC,EACA,kBAAAo1C,EACA,WAAA7nD,CAAA,CACH,GACF,CAACynD,EAAUnsC,EAAqB,aAAa,CAAC,EAC/C,OASN,YAAalM,cAAY,CAAgC,CACI,KAAAxW,EACA,SAAAqH,CAAA,IAExBwnD,EAAS,YAAY,CACtD,KAAA7uD,EACA,SAAAqH,CAAA,CACH,EAAG,CAACwnD,CAAQ,CAAC,EAYd,aAAcA,EAAS,aAEjBr4C,EAAAA,YAAY,CACV,CACI,KAAAxW,EACA,SAAAqH,EACA,WAAAD,EACA,SAAAohD,EACA,QAAA3uC,CAAA,IACoC,CACxC,GAAI,CAACg1C,EAAS,aACV,MAAM,MAAM,6CAA6C,EAE7D,OAAOA,EAAS,aAAgB,CAC5B,KAAA7uD,EACA,SAAAqH,EACA,SAAAmhD,EACA,QAAA3uC,CAAA,CACH,CACF,EAAA,CAACg1C,EAAS,YAAY,CAAC,EAAI,OAalC,WAAYr4C,cAAY,CACpB,CACI,KAAAxW,EACA,SAAAqH,EACA,OAAAvB,EACA,WAAYyc,EACZ,OAAAhd,CAAA,IAC0C,CAE9C,MAAM6B,EAAamb,GAAkBG,EAAqB,cAAc1iB,CAAI,EAWtEgF,GATqBoC,EACrBD,GAAqB,CACnB,WAAAC,EACA,KAAApH,EACA,SAAAqH,EACA,OAAQyJ,CAAA,CACX,EACC,SAEoE,WAEpEo+C,EAAkBC,GACpBrpD,EACA+oD,EAAS,eACTA,EAAS,cACTA,EAAS,UACTA,EAAS,qBAAA,EAEPO,EAA0CpqD,EAC1CK,GACE,CACI,YAAa6pD,EACb,WAAAlqD,EACA,OAAAO,EACA,kBAAmBspD,EAAS,YAAY,EACxC,kBAAmBA,EAAS,iBAChC,CACF,EAAAK,EAEN,OAAOL,EAAS,WAAW,CACvB,KAAA7uD,EACA,SAAAqH,EACA,OAAQ+nD,EACR,OAAA7pD,CAAA,CACH,EAAE,KAAMrD,IACE,CACH,GAAIA,EAAI,GACR,KAAMA,EAAI,KACV,OAAQ2sD,EAAS,mBAAmBO,CAAsB,CAAA,EAEjE,GACF,CAACP,EAAS,WAAYnsC,EAAqB,aAAa,CAAC,EAQ5D,aAAclM,cAAY,CACtB,CACI,OAAAxQ,CAAA,IAGG6oD,EAAS,aAAa,CAAE,OAAA7oD,CAAQ,CAAA,EACxC,CAAC6oD,EAAS,YAAY,CAAC,EAY1B,iBAAkBr4C,EAAY,YAAA,CAC1BxW,EACA8jB,EACApgB,EACA2D,IAEOwnD,EAAS,iBAAiB7uD,EAAM8jB,EAAMpgB,EAAO2D,CAAQ,EAC7D,CAACwnD,EAAS,gBAAgB,CAAC,EAE9B,iBAAkBr4C,EAAAA,YAAaxW,GACpB6uD,EAAS,iBAAiB7uD,CAAK,EACvC,CAAC6uD,EAAS,gBAAgB,CAAC,EAE9B,cAAeA,EAAS,cAAgB,MAAO,CACI,KAAA7uD,EACA,WAAAoH,EACA,OAAA4uB,EACA,MAAAg5B,EACA,QAAAD,CAAA,IAQxCF,EAAS,cAAe,CAC3B,KAAA7uD,EACA,OAAAg2B,EACA,QAAA+4B,EACA,MAAAC,EACA,kBAAmB,EAAQ5nD,EAAW,eAAoB,CAC7D,EACD,OAEJ,yBAA0BoP,cAAY,CAAC,CACI,KAAAxW,EACA,aAAA4Y,EACA,OAAAC,CAAA,IAMlCg2C,EAAS,yBAEPA,EAAS,yBACZ,CACI,KAAA7uD,EACA,aAAA4Y,EACA,OAAAC,CACJ,CAAA,EANO,GAQZ,CAACg2C,EAAS,wBAAwB,CAAC,CAAA,CAI9C,CAgBO,SAASM,GAAmBh2C,EACAk2C,EACAC,EACAC,EACAC,EAC5B,CACH,OAAIr2C,IAAS,OACFq2C,EAAY,EACZr2C,IAAS,KACT,KACA,MAAM,QAAQA,CAAI,EAClBA,EAAK,IAASxV,GAAAwrD,GAAmBxrD,EAAG0rD,EAAgBC,EAAeC,EAAWC,CAAW,CAAC,EAC1Fr2C,EAAK,mBAAqBA,EAAK,oBAC/Bk2C,EAAel2C,CAAI,EACnBA,aAAgBvX,GAChB0tD,EAAcn2C,CAAI,EAClBA,aAAgB,KAChBo2C,EAAUp2C,CAAI,EACdA,GAAQ,OAAOA,GAAS,SACxB,OAAO,QAAQA,CAAI,EACrB,IAAI,CAAC,CAAChX,EAAKwB,CAAC,KAAO,CAAE,CAACxB,CAAG,EAAGgtD,GAAmBxrD,EAAG0rD,EAAgBC,EAAeC,EAAWC,CAAW,CAAA,EAAI,EAC3G,OAAO,CAACruD,EAAGC,KAAO,CAAE,GAAGD,EAAG,GAAGC,CAAE,GAAI,CAAE,CAAA,EAEvC+X,CACX,CCxWO,SAASs2C,GAAgCC,EAA8D,CACnG,OAAAA,CACX,CCAO,MAAMC,GAAiB,sCAO9B,eAAeC,GAAY3hD,EAAgC,CACjD,MAAA4hD,EAAgB,MAAM5hD,EAAe,eACpC,OAAA,MAAM0hD,GAAiB,cAC1B,CAEI,OAAQ,OACR,QAAS,CACL,eAAgB,mBAChB,cAAe,SAASE,CAAa,EACzC,EACA,KAAM,KAAK,UAAU,EAAE,CAC3B,CAAA,EACC,KAAK,MAAO3tD,GACFA,EAAI,MACd,CACT,CAEO,SAAS4tD,GAAc7hD,EAAuD,CACjF,KAAM,CAAC8hD,EAAgBC,CAAiB,EAAI74C,WAAgC,IAAI,EAC1E84C,EAAkBj7C,SAAsB,IAAI,EAClDC,OAAAA,EAAAA,UAAU,IAAM,CACRhH,EAAe,MAAQA,EAAe,KAAK,MAAQgiD,EAAgB,SAAW,CAAChiD,EAAe,iBAClF2hD,GAAA3hD,CAAc,EAAE,KAAK+hD,CAAiB,EAClCC,EAAA,QAAUhiD,EAAe,KAAK,IAClD,EACD,CAACA,CAAc,CAAC,EACZ8hD,CACX,CCHO,SAASG,GAA4D7nD,EAAmC,CAE3G,MAAM8nD,EAAiB90C,KACjB,CACF,SAAApc,EACA,kBAAAmxD,EACA,sBAAA7oD,EACA,eAAA8oD,EACA,OAAAzoC,EACA,eAAA3Z,EACA,cAAAmK,EACA,mBAAA6qC,EACA,QAAA3a,EACA,iBAAAgoB,EACA,gBAAAx/C,EACA,YAAA/G,EACA,WAAAwmD,EACA,qBAAA7tC,CACA,EAAAra,EAEJmmD,GAAgB5mC,CAAM,EAKtB,MAAMzP,EAAay2C,GAAmB,CAClC,SAAU3L,EACV,gBAAAnyC,EACA,qBAAA4R,CAAA,CACH,EAEK1K,EAAwBg2C,KACxB/1C,EAAuBm1C,GAA6B1qC,EAAsB1K,CAAqB,EAE/Fw4C,EAAiBloB,GAAS,KAAUt/B,GAAAA,EAAE,OAAO,GAAK,GAElDwc,EAAUvX,EAAe,gBAAkByU,EAAqB,SAAW8tC,EAE3Ej4C,EAA0D,CAC5D,eAAA83C,EACA,OAAAzoC,EACA,kBAAAwoC,EACA,QAAA9nB,EACA,YAAav+B,GAAe,CAAC,EAC7B,gBAAiB+G,GAAmB,CAAC,EACrC,WAAAy/C,CAAA,EAGE/3C,EAAsB5B,EAAAA,QAAQ,KAAO,CACvC,iBAAA05C,CAAA,GACA,CAAE,CAAA,EAEAP,EAAiBD,GAAc7hD,CAAc,EAEnD,OAAIyU,EAAqB,uBAEjBxjB,EAAAA,IAACuxD,EAAAA,aAAa,CAAA,SAAU,KACpB,SAAAvxD,EAAA,IAACse,GAAA,CACG,MAAO,2BACP,MAAOkF,EAAqB,sBAAA,CACpC,CAAA,CAAA,EAIJzU,EAAe,UAEX/O,EAAAA,IAACuxD,EAAAA,aAAa,CAAA,SAAU,KACpB,SAAAvxD,EAAA,IAACse,GAAA,CACG,MAAO,qBACP,MAAOvP,EAAe,SAAA,CAC9B,CAAA,CAAA,EAIJ8hD,GAAgB,QAEXt4C,EAAAA,KAAAg5C,EAAAA,aAAA,CAAa,SAAU,KAAM,WAAY,GACtC,SAAA,CAACvxD,EAAA,IAAA4e,EAAA,WAAA,CAAW,QAAS,KAAM,SAE3B,iBAAA,SACCA,EAAAA,WAAW,CAAA,SAAA,CAAA,kDACuC5e,EAAA,IAAC,IAAA,CAChD,KAAM,0BAA2B,SAAA,kBAAA,CAAgB,EAAI,wBAAA,EACzD,EACC6wD,GAAgB,SACbt4C,EAAAA,KAACqG,EAAW,WAAA,CAAA,SAAA,CAAA,6BAA2BiyC,GAAgB,OAAA,EAAQ,CACvE,CAAA,CAAA,QAKHzwD,GAAsB,SAAtB,CAA+B,MAAO6wD,EACnC,SAACjxD,MAAA2Y,GAAiB,SAAjB,CAA0B,MAAOW,EAC9B,SAAAtZ,EAAAA,IAACyY,GAA+B,SAA/B,CAAwC,MAAOY,EAC5C,SAAArZ,EAAA,IAAC2X,GAAoC,SAApC,CACG,MAAOtP,EACP,SAAArI,EAAA,IAAC8W,GAAqB,SAArB,CACG,MAAOoC,EACP,SAAAlZ,EAAA,IAACmW,GAAkB,SAAlB,CACG,MAAO8C,EACP,SAAAjZ,EAAA,IAACO,GAAsB,SAAtB,CACG,MAAOwO,EACP,SAAA/O,EAAA,IAAC0W,GAA6B,SAA7B,CACG,MAAOoC,EACP,SAAA9Y,EAAA,IAAC4W,GAA4B,SAA5B,CACG,MAAOmC,EACP,SAAA/Y,EAAA,IAACuW,GAAkB,SAAlB,CACG,MAAOiN,EACP,eAAC1L,GACG,CAAA,SAAA9X,EAAA,IAACwxD,GAAA,CACG,QAAAlrC,EACC,SAAAvmB,CAAA,CAAA,EAET,CAAA,CACJ,CAAA,CACJ,CAAA,CACJ,CAAA,CACJ,CAAA,CACJ,CAAA,CACJ,CAAA,CAAA,EAER,EACJ,CACJ,CAAA,CAGR,CAEA,SAASyxD,GAAgB,CACI,QAAAlrC,EACA,SAAAvmB,CACJ,EAMtB,CAEC,MAAMia,EAAUnB,KACVQ,EAA0BX,KAEhC,IAAI+4C,EAAiB1xD,EAAS,CAC1B,QAAAia,EACA,QAAAsM,CAAA,CACH,EAED,MAAM8iB,EAAU/vB,EAAwB,QACpC,MAAA,CAACiN,GAAW8iB,GACJA,EAAA,QAAS3C,GAA0B,CACnCA,EAAO,WAEHgrB,EAAAzxD,EAAA,IAACymC,EAAO,SAAS,UAAhB,CAA2B,GAAGA,EAAO,SAAS,MACpB,QAAAzsB,EACtB,SAAAy3C,CAAA,CAAA,EAGb,CACH,oBAGK,SAAeA,CAAA,CAAA,CAC7B,CC7KO,SAASC,GAAO,CACI,QAAA/5B,EACA,WAAAioB,EACA,YAAA+R,CACJ,EAAgB,CAEnC,MAAMr4C,EAAsBV,KACtBI,EAAaxC,KAEbo7C,EAAej6B,GAAW,CAACioB,EAC3BnsB,EAAczV,KACdkoB,EAAWC,GAAAA,cAEX,CAAC0rB,EAAeC,CAAgB,EAAIzxD,EAAM,SAAS,EAAK,EAE9D,GAAI,CAAC2Y,EAAW,mBACZ,MAAM,MAAM,gCAAgC,EAE1C,KAAA,CACF,kBAAA+uB,EACA,OAAAC,CAAA,EACqBhvB,EAAW,mBAE9BqrC,EAAatc,EAAkB,OAAO5gC,GAAKA,EAAE,OAAS,OAAO,GAAK,GAClE4qD,EAAqB/pB,EAAO,OAAO1C,GAAKA,IAAM,OAAO,EAErD0sB,EAAmB16C,cAAa4tB,GAC7B0a,EACE5/C,EAAA,IAAC,MAAA,CACJ,UAAU,iDACV,SAAAA,EAAA,IAAC4e,EAAA,WAAA,CAAW,QAAS,UACT,MAAO,YACP,UAAU,qCACjB,SAAQsmB,EAAAA,EAAM,YAAY,EAAI,QAAQ,YAAY,CAAA,CACvD,CAAA,CAAA,EAPoBllC,EAAA,IAAC,MAAI,CAAA,UAAU,aAAa,CAAA,EAUrD,CAAC4/C,CAAU,CAAC,EAETt8B,EAAW0iB,GAA6B,CACpC,MAAAuS,EAA+BvS,EAAK,OAAS,aAC7C,gCACCA,EAAK,OAAS,OAAS,0BAA4B,iBAC1D1sB,EAAoB,mBAAmBi/B,EAAW,CAAE,IAAKvS,EAAK,IAAK,EAC9DvS,GACWk+B,GAAA,EAGpB,OAGQp5C,EAAA,KAAAtI,WAAA,CAAA,SAAA,CAAAjQ,MAAC,OAAI,UAAW,yCAEX,SAAmB+xD,EAAA,IAAK7sB,GACrB3sB,EAAA,KAAClY,EAAM,SAAN,CAEI,SAAA,CAAA2xD,EAAiB9sB,CAAK,EACtB,OAAO,OAAO6C,CAAiB,EAC3B,OAAO5gC,GAAKA,EAAE,QAAU+9B,CAAK,EAC7B,IAAI,CAACc,EAAMj8B,IACR/J,EAAA,IAACiyD,GAAA,CAEG,KAAOjyD,EAAAA,IAAA+P,GAAA,CAAY,iBAAkBi2B,EAAK,YAAcA,EAAK,KAAK,EAClE,aAAA4rB,EACA,WAAAhS,EACA,QAAS,IAAMt8B,EAAQ0iB,CAAI,EAC3B,IAAKA,EAAK,IACV,KAAMA,EAAK,IAAA,EANN,cAAcj8B,CAAK,EAAA,CAMN,CAAA,CAAA,EAZzB,gBAAgBm7B,CAAK,EAcjC,CAAA,EAEL,EAECmf,EAAW,OAAS,GAAKrkD,EAAA,IAACg0B,EAAA,KAAA,CACvB,KAAM69B,EACN,aAAcC,EACd,QACIv5C,EAAA,KAACkH,EAAA,WAAA,CACG,MAAO,SACP,UAAW,0CACX,SAAA,CAAAzf,EAAA,IAACqe,EAAA,QAAA,CAAQ,MAAO,QACP,KAAMuzC,EACN,KAAM,QAAS,WAAY,GAChC,eAAC39B,EAAY,aAAA,EAAA,CAAA,CACjB,EACC2rB,GAAc5/C,EAAA,IAAC,MAAA,CACZ,UAAW2iB,EAAA,GACPi9B,EAAa,cAAgB,mBAC7B,gCACJ,EAAG,SAAA,OAAA,CAEP,CAAA,CAAA,CACJ,EAEH,SAAWyE,EAAA,IAAI,CAACliD,EAAO4H,IACpBwO,EAAA,KAAC2b,EAAA,SAAA,CACG,QAAUjQ,GAAU,CAChBA,EAAM,eAAe,EACrBiiB,EAAS/jC,EAAM,IAAI,CACvB,EAEC,SAAA,CAACnC,EAAAA,IAAA+P,GAAA,CAAY,iBAAkB5N,EAAM,IAAK,CAAA,EAC1CA,EAAM,IAAA,CAAA,EAFF,cAAc4H,CAAK,EAAA,CAGjB,CAAA,CAEnB,CACJ,CAAA,CAAA,CAER,CAEO,SAASkoD,GAAqB,CACI,KAAArtC,EACA,KAAA1U,EACA,WAAA0vC,EACA,aAAAgS,EACA,IAAAxyC,EACA,QAAAkE,CACJ,EAOlC,CAEC,MAAM4uC,EAAWlyD,EAAA,IAAC,MAAA,CACd,UAAW,mCACV,SAAAkQ,CAAA,CAAA,EAGCiiD,EAAW55C,EAAA,KAAC65C,GAAA,QAAA,CACd,QAAA9uC,EACA,MAAO,CACH,MAAQs8B,EAAsB,QAAT,OACrB,WAAYA,EAAa,sBAAwB,MACrD,EACA,UAAW,CAAC,CAAE,SAAAyS,CAAA,IAAoB1vC,EAAA,GAAG,wBACjC,oKACA,kCAGAi9B,EAAa,YAAc,YAC3B,sBACAyS,EAAW,8CAAgD,EAC/D,EACA,GAAIjzC,EAGH,SAAA,CAAA8yC,EAEDlyD,EAAA,IAAC,MAAA,CACG,UAAW2iB,EAAA,GACPi9B,EAAa,cAAgB,mBAC7B,gCACJ,EACC,WAAK,YAAY,CAAA,CACtB,CAAA,CAAA,CAAA,EAGG,OAAA5/C,EAAA,IAACqe,EAAA,QAAA,CACJ,KAAMuhC,EAAa,GAAQgS,EAC3B,KAAK,QACL,MAAOhtC,EACN,SAAAutC,CAAA,CAAA,CAET,CCrLO,MAAMG,GAAe,IA8DfC,GAAWlyD,EAAM,KAC1B,SAAkB8I,EAAyC,CAEjD,KAAA,CACF,SAAApJ,EACA,KAAA6kB,EACA,KAAAs+B,EACA,cAAApD,EAAgB,GAChB,eAAA0S,EACAd,OAAAA,EAASe,GACT,YAAAC,EACAhT,cAAAA,EAAgBiT,GAChB,mBAAAC,CACA,EAAAzpD,EAEEsqB,EAAczV,KAEd,CAAC4hC,EAAYiT,CAAa,EAAIxyD,EAAM,SAAS,EAAK,EAClD,CAACgf,EAASC,CAAU,EAAIjf,EAAM,SAAS,EAAK,EAE5CmxB,EAAiBla,EAAAA,YAAY,IAAMgI,EAAW,EAAI,EAAG,CAAA,CAAE,EACvDmS,EAAkBna,EAAAA,YAAY,IAAMgI,EAAW,EAAK,EAAG,CAAA,CAAE,EAEzDwzC,EAAoBx7C,EAAAA,YAAY,IAAM,CACxCu7C,EAAc,EAAK,CACvB,EAAG,CAAE,CAAA,EAECE,EAA8BnT,GAAc,GAAQnsB,GAAe++B,GAAkBnzC,GAEvF,OAAA9G,EAAA,KAAC,MAAA,CACG,UAAU,mGACV,MAAO,CACH,WAAY,2BACZ,YAAa,4BACb,aAAc,6BACd,cAAe,8BACf,OAAQ,QAIZ,EAEA,SAAA,CAAAvY,EAAA,IAAC0/C,EAAA,CAAc,MAAO96B,EACE,cAAAk7B,EACA,WAAYiT,EACX,GAAGH,CAAA,CAAmB,EAE/C5yD,EAAA,IAACgzD,GAAA,CACG,UAAWlT,EACX,aAActuB,EACd,YAAaA,EACb,aAAcC,EACd,KAAMshC,EACN,KAAA7P,EACA,QAAS7jC,EACT,cAAAwzC,EACC,SACG/S,GAAA9/C,EAAA,IAAC0xD,EAAA,CACG,QAASryC,EACT,WAAY0zC,EACZ,YAAaD,EACZ,GAAGJ,CAAA,CAAY,CAAA,CAC5B,EAEAn6C,EAAA,KAAC,OAAA,CACG,UAAU,wCACV,SAAA,CAAAvY,EAAA,IAACizD,GAAY,EAAA,EACbjzD,EAAA,IAAC,MAAA,CACG,UAAW2iB,EAAAA,GAAGI,EAAA,mBAAoB,iGAAiG,EAEnI,SAAA/iB,EAAA,IAACyiB,IACI,SAAA1iB,CACL,CAAA,CAAA,CAEJ,CAAA,CAAA,CACJ,CAAA,CAAA,CAAA,CAGZ,EACAyQ,CACJ,EAEMyiD,GAAe,IAEbjzD,EAAA,IAAC,MAAI,CAAA,UAAU,4BAA6B,CAAA,EAIpD,SAASgzD,GAAa7pD,EAUnB,CAEC,MAAM6P,EAAaxC,KAEb0K,EAAS/X,EAAM,UAAiBA,EAAM,KAAOmpD,GAAe,GAAjC,EAC3BY,EAAc36C,EAAA,KAAC,MAAA,CACjB,UAAW,iEACX,MAAO,CACH,MAAA2I,EACA,WAAY,2IAChB,EAGC,SAAA,CAAC,CAAA/X,EAAM,MAAQA,EAAM,WAClBnJ,EAAA,IAACqe,EAAA,QAAA,CAAQ,MAAM,YACN,KAAK,QACL,WAAY,GACZ,UAAU,sEAEf,SAAAre,EAAA,IAACyf,EAAA,WAAA,CACG,MAAM,UACN,aAAW,YACX,UAAU,uBACV,QAAS,IAAMtW,EAAM,cAAc,EAAI,EACvC,KAAK,QAEL,eAACgqD,EAAQ,SAAA,EAAA,CAAA,CACb,CAAA,CACJ,EAGJ56C,EAAAA,KAAC,MAAI,CAAA,UAAW,uBACZ,SAAA,CAAAvY,EAAA,IAAC,MAAA,CACG,MAAO,CACH,WAAY,iDACZ,QAASmJ,EAAM,KAAO,sBAAwB,eAClD,EACA,UAAWwZ,KAAG,gBAAgB,EAE9B,SAAA3iB,EAAA,IAACqe,EAAA,QAAA,CAAQ,MAAO,OACP,WAAY,GACZ,KAAK,QACV,SAAAre,EAAA,IAACozD,GAAA,KAAA,CACG,GAAIp6C,EAAW,SACd,WAAM,KACDhZ,EAAA,IAAC,MAAA,CAAI,IAAKmJ,EAAM,KACX,IAAI,OACJ,UAAWwZ,EAAA,GAAG,wBACVxZ,EAAM,MAAQ,qBAAqB,CAAA,CAAA,QAC3Cs2C,GAAW,EAAA,CAAA,CAEtB,CAAA,CACJ,CAAA,CACJ,EAECt2C,EAAM,QAAA,EACX,CAAA,CAAA,CAAA,EAKJ,OADoB6U,KAyBhBzF,EAAA,KAAC,MAAA,CACG,UAAU,WACV,aAAcpP,EAAM,aACpB,YAAaA,EAAM,YACnB,aAAcA,EAAM,aACpB,MAAO,CACH,MAAA+X,EACA,WAAY,2IAChB,EAEC,SAAA,CAAAgyC,EAEDlzD,EAAA,IAAC,MAAA,CACG,UAAW,0BACPmJ,EAAM,KAAO,cAAgB,qBACjC,gDACA,SAAAnJ,EAAA,IAACyf,EAAA,WAAA,CACG,aAAW,eACX,QAAS,IAAMtW,EAAM,cAAc,EAAK,EAExC,eAACkqD,EAAe,gBAAA,EAAA,CAAA,CACpB,CAAA,CACJ,CAAA,CAAA,CAAA,EA7CClqD,EAAM,UAGPoP,EAAA,KAAAtI,WAAA,CAAA,SAAA,CAAAjQ,EAAA,IAACyf,EAAA,WAAA,CACG,MAAM,UACN,aAAW,cACX,QAAS,IAAMtW,EAAM,cAAc,EAAI,EACvC,KAAK,QACL,UAAU,wBAEV,eAACgqD,EAAQ,SAAA,EAAA,CAAA,CACb,EACAnzD,EAAA,IAAC0tD,EAAA,MAAA,CAAM,KAAM,OACN,YAAa,GACb,KAAMvkD,EAAM,KACZ,aAAcA,EAAM,cAEtB,SAAA+pD,CAAA,CACL,CACJ,CAAA,CAAA,EAlBW,IAgDnB,CC9OO,SAAS1pD,GAAuB/G,EAAY,CAC/C,OAAO,OAAO,KAAK6wD,EAAqB,EAAE,SAAS7wD,CAAE,CACzD,CAEO,MAAM6wD,GAA6D,CACtE,WAAY,CACR,IAAK,aACL,KAAM,aACN,YAAa,oBACb,KAAMC,EAAA,cACN,MAAO,UACP,SAAU,CACN,SAAU,SACV,MAAOplB,EACX,CACJ,EACA,UAAW,CACP,IAAK,YACL,KAAM,YACN,YAAa,2BACb,KAAMqlB,EAAA,YACN,MAAO,UACP,SAAU,CACN,SAAU,SACV,UAAW,GACX,MAAOrlB,EACX,CACJ,EACA,SAAU,CACN,IAAK,WACL,KAAM,WACN,YAAa,qCACb,KAAMslB,EAAA,gBACN,MAAO,UACP,SAAU,CACN,SAAU,SACV,SAAU,GACV,MAAOhgB,EACX,CACJ,EACA,IAAK,CACD,IAAK,MACL,KAAM,MACN,YAAa,2BACb,KAAMigB,EAAA,SACN,MAAO,UACP,SAAU,CACN,SAAU,SACV,IAAK,GACL,MAAOvlB,EACX,CACJ,EACA,MAAO,CACH,IAAK,QACL,KAAM,QACN,YAAa,6BACb,KAAMwlB,EAAA,UACN,MAAO,UACP,SAAU,CACN,SAAU,SACV,MAAO,GACP,MAAOxlB,EACX,CACJ,EACA,OAAQ,CACJ,IAAK,SACL,KAAM,SACN,YAAa,wDACb,KAAMylB,EAAA,SACN,MAAO,UACP,SAAU,CACN,SAAU,UACV,MAAOtlB,EACX,CACJ,EACA,OAAQ,CACJ,IAAK,SACL,KAAM,cACN,YAAa,mDACb,KAAMulB,EAAA,SACN,MAAO,UACP,SAAU,CACN,SAAU,SACV,WAAY,CAAC,EACb,MAAO9nB,EACX,CACJ,EACA,aAAc,CACV,IAAK,eACL,KAAM,eACN,YAAa,yDACb,KAAM+nB,EAAA,YACN,MAAO,UACP,SAAU,CACN,SAAU,QACV,GAAI,CACA,SAAU,SACV,WAAY,CAAC,CACjB,EACA,MAAO3nB,EACX,CACJ,EACA,aAAc,CACV,IAAK,eACL,KAAM,eACN,YAAa,sCACb,KAAM4nB,EAAA,YACN,MAAO,UACP,SAAU,CACN,SAAU,SACV,MAAO5lB,EACX,CACJ,EACA,cAAe,CACX,IAAK,gBACL,KAAM,gBACN,YAAa,mDACb,KAAM6lB,EAAA,uBACN,MAAO,UACP,SAAU,CACN,SAAU,SACV,WAAY,CAAC,EACb,MAAOjoB,EACX,CACJ,EACA,oBAAqB,CACjB,IAAK,sBACL,KAAM,yBACN,YAAa,2DACb,KAAMioB,EAAA,uBACN,MAAO,UACP,SAAU,CACN,SAAU,QACV,GAAI,CACA,SAAU,SACV,WAAY,CAAC,CACjB,EACA,MAAO7nB,EACX,CACJ,EACA,YAAa,CACT,IAAK,cACL,KAAM,cACN,YAAa,mCACb,KAAM8nB,EAAA,eACN,MAAO,UACP,SAAU,CACN,SAAU,SACV,QAAS,CACL,YAAa,QACjB,EACA,MAAO/mB,EACX,CACJ,EACA,kBAAmB,CACf,IAAK,oBACL,KAAM,uBACN,YAAa,qCACb,KAAMgnB,EAAA,sBACN,MAAO,UACP,SAAU,CACN,SAAU,QACV,GAAI,CACA,SAAU,SACV,QAAS,CACL,YAAa,QACjB,CACJ,EACA,MAAOhnB,EACX,CACJ,EACA,UAAW,CACP,IAAK,YACL,KAAM,YACN,YAAa,6CACb,KAAMinB,EAAA,SACN,MAAO,UACP,SAAU,CACN,SAAU,YACV,MAAO1lB,EACX,CACJ,EACA,iBAAkB,CACd,IAAK,mBACL,KAAM,sBACN,YAAa,uDACb,KAAM2lB,EAAA,YACN,MAAO,UACP,SAAU,CACN,SAAU,QACV,GAAI,CACA,SAAU,WACd,EACA,MAAO9nB,EACX,CACJ,EACA,UAAW,CACP,IAAK,YACL,KAAM,YACN,YAAa,2BACb,KAAM+nB,EAAA,aACN,MAAO,UACP,SAAU,CACN,SAAU,OACV,MAAO9lB,EACX,CACJ,EACA,MAAO,CACH,IAAK,QACL,KAAM,QACN,YAAa,2BACb,KAAM+lB,EAAA,WACN,MAAO,UACP,SAAU,CACN,SAAU,MACV,WAAY,CAAC,EACb,MAAOnkB,EACX,CACJ,EACA,UAAW,CACP,IAAK,YACL,KAAM,YACN,YAAa,sEACb,KAAMmkB,EAAA,WACN,MAAO,UACP,SAAU,CACN,SAAU,MACV,SAAU,GACV,MAAO/jB,EACX,CACJ,EACA,OAAQ,CACJ,IAAK,SACL,KAAM,cACN,YAAa,wEACb,KAAMgkB,EAAA,WACN,MAAO,UACP,SAAU,CACN,SAAU,QACV,GAAI,CACA,SAAU,QACd,EACA,MAAOpiB,EACX,CACJ,EACA,aAAc,CACV,IAAK,eACL,KAAM,eACN,YAAa,6DACb,KAAMoiB,EAAA,WACN,MAAO,UACP,SAAU,CACN,SAAU,QACV,GAAI,CAAC,EACL,MAAOvgB,EACX,CACJ,EACA,MAAO,CACH,IAAK,QACL,KAAM,QACN,YAAa,sGACb,KAAMwgB,EAAA,eACN,MAAO,UACP,SAAU,CACN,SAAU,QACV,MAAO,CACH,WAAY,CAAC,CACjB,EACA,MAAOjiB,EACX,CACJ,CACJ,EAEO,SAAS4M,GAAsB15C,EAAmE,CAC/F,MAAAuqC,EAAUykB,GAAkBhvD,CAAQ,EAC1C,GAAI,CAACuqC,EAAS,CACF,QAAA,MAAM,iCAAkCvqC,CAAQ,EACjD,MACX,CACA,OAAO6tD,GAAsBtjB,CAAO,CACxC,CAEgB,SAAA3hC,GAAe5I,EAAuCmM,EAAkF,CAC9I,MAAAo+B,EAAUC,GAAWxqC,CAAQ,EAC7BivD,EAAiBD,GAAkBhvD,CAAQ,EACjD,GAAI,CAACivD,EAAgB,CACT,QAAA,MAAM,iCAAkCjvD,CAAQ,EACjD,MACX,CACM,MAAAkvD,EAAqBrB,GAAsBoB,CAAc,EACzDhrD,EAAcsmC,EAAUp+B,EAAgBo+B,CAAO,EAAI,OACzD,OAAO5sC,GAAUuxD,GAAsB,CAAI,EAAAjrD,GAAe,CAAE,CAAA,CAChE,CAEO,SAAS+qD,GAAkBhvD,EAAuC,CACjE,GAAAA,EAAS,WAAa,SACtB,OAAIA,EAAS,UACF,YACAA,EAAS,SACT,WACAA,EAAS,QACT,cACAA,EAAS,IACT,MACAA,EAAS,MACT,QACAA,EAAS,WACT,SAEA,aAEf,GAAWA,EAAS,WAAa,SAC7B,OAAIA,EAAS,WACF,gBAEJ,eACX,GAAWA,EAAS,WAAa,MAAO,CACpC,GAAIA,EAAS,SACF,MAAA,YACX,GAAIA,EAAS,WACF,MAAA,OAAA,SACJA,EAAS,WAAa,QAAS,CACtC,MAAMuE,EAAMvE,EAA2B,GAEvC,OADeA,EAA2B,MAE/B,QACA,MAAM,QAAQuE,CAAE,EAChB,eACArE,GAAkBqE,CAAE,EACpB,SACAA,GAAI,WAAa,UAAYA,EAAG,WAChC,eACAA,GAAI,WAAa,UAAYA,EAAG,WAChC,sBACAA,GAAI,WAAa,UAAYA,EAAG,QAChC,oBACAA,GAAI,WAAa,YACjB,mBAEA,QACX,KACJ,IAAWvE,EAAS,WAAa,UACtB,MAAA,SACX,GAAWA,EAAS,WAAa,OACtB,MAAA,YACX,GAAWA,EAAS,WAAa,YACtB,MAAA,YAGH,QAAA,MAAM,mCAAoCA,CAAQ,CAE9D,CAEO,SAASwqC,GAAWxqC,EAA2D,CAClF,OAAIA,EAAS,eACFA,EAAS,eACbgvD,GAAkBhvD,CAAQ,CACrC,CChXO,MAAMmvD,GAAmBv0D,EAAM,KAClC,SAA0B,CACI,SAAAw0D,EAAWltB,GACX,aAAAmtB,CAAA,EACsB,CAEhD,MAAM7tB,EAAWC,GAAAA,cACXluB,EAAaxC,KAEnB,GAAI,CAACwC,EACD,OAAShZ,EAAA,IAAAiQ,WAAA,CAAA,CAAA,EAEb,MAAM8kD,EAAQ9tB,EAAS,MAOjBmoB,EAAe2F,GAASA,EAAM,cAAgBA,EAAM,cAAgB9tB,EAEpE+tB,EAA8B,CAAA,EAChCh8C,EAAW,OACAA,EAAA,MAAM,QAASi8C,GAAY,CAC9B,MAAM,QAAQA,EAAQ,IAAI,EACjBD,EAAA,KAAK,GAAGC,EAAQ,KAAK,OAAYC,GAAkBp0D,EAAMm0D,CAAO,CAAC,CAAC,EAE3ED,EAAS,KAAKE,GAAkBD,EAAQ,KAAMA,CAAO,CAAC,CAAA,CAC7D,EAEDj8C,EAAW,YACAA,EAAA,WAAW,QAASi8C,GAAY,CACnC,MAAM,QAAQA,EAAQ,IAAI,EACjBD,EAAA,KAAK,GAAGC,EAAQ,KAAK,OAAYC,GAAkBp0D,EAAMm0D,CAAO,CAAC,CAAC,EAE3ED,EAAS,KAAKE,GAAkBD,EAAQ,KAAMA,CAAO,CAAC,CAAA,CAC7D,EAOL,MAAME,EAHoB,CAAC,GAAIn8C,EAAW,aAAe,CAAA,CAAG,EACvD,KAAK,CAAC/W,EAAGC,IAAMA,EAAE,KAAK,OAASD,EAAE,KAAK,MAAM,EAG5C,IAAKiG,GAAe,CACb,MAAMktD,EAAUp8C,EAAW,uBAAuB9Q,EAAW,IAAMA,EAAW,IAAI,EAC3E,OAAAlI,EAAA,IAACq1D,GAAA,MAAA,CAAM,KAAMD,EAAU,KAEhB,cACK3yC,GACG,CAAA,SAAAziB,EAAA,IAACk8C,GAAA,CAEG,gBAAiB,GACjB,oBAAqB,CAAC,EACtB,SAAUh0C,EAAW,IAAMA,EAAW,KACrC,GAAGA,EACJ,QAAS88B,GAAQ98B,EAAW,OAAO,CAAA,EAL9B,mBAAmBA,EAAW,IAAMA,EAAW,IAAI,EAAA,EAMhE,CAAA,EAVC,cAAcA,EAAW,IAAMA,EAAW,IAAI,EAAA,CAYrE,CAAA,EAGFotD,EACFt1D,EAAA,IAACq1D,GAAA,MAAA,CAAM,KAAM,IACN,cAAUR,EAAQ,EAAA,CAAA,CAAA,EAGvBU,EAAgBv1D,EAAA,IAACq1D,GAAA,MAAA,CAAM,KAAM,IACN,cACKjW,GAAY,EAAA,CAAA,CAAA,EAI1C,OAAA7mC,EAAA,KAACi9C,GAAO,OAAA,CAAA,SAAUpG,EAEb,SAAA,CAAA+F,EAEAH,EAEAM,EAEAC,EAEAT,CAEL,CAAA,CAAA,CAER,CAAC,EAECI,GAAoB,CAACp0D,EAAcm0D,IAC9Bj1D,EAAA,IAACq1D,GAAA,MAAA,CAEJ,KAAAv0D,EACA,QAASm0D,EAAQ,IAAA,EAFZ,mBAAqBn0D,CAAA"}
|