@webiny/app-admin 6.6.0-alpha.1 → 6.6.0-alpha.10
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/base/Admin.js +19 -2
- package/base/Admin.js.map +1 -1
- package/base/Base/DefaultFieldRenderers.js +4 -0
- package/base/Base/DefaultFieldRenderers.js.map +1 -1
- package/base/Base/FieldRenderers/AutoCompleteRenderer.js +1 -0
- package/base/Base/FieldRenderers/AutoCompleteRenderer.js.map +1 -1
- package/base/Base/FieldRenderers/BirthdayInputRenderer.d.ts +21 -0
- package/base/Base/FieldRenderers/BirthdayInputRenderer.js +39 -0
- package/base/Base/FieldRenderers/BirthdayInputRenderer.js.map +1 -0
- package/base/Base/FieldRenderers/BirthdayInputRenderer.test.d.ts +1 -0
- package/base/Base/FieldRenderers/BirthdayInputRenderer.test.js +123 -0
- package/base/Base/FieldRenderers/BirthdayInputRenderer.test.js.map +1 -0
- package/base/Base/FieldRenderers/ObjectRenderer/MultiValueDynamicZone/MultiValueDynamicZone.js +21 -4
- package/base/Base/FieldRenderers/ObjectRenderer/MultiValueDynamicZone/MultiValueDynamicZone.js.map +1 -1
- package/base/Base/FieldRenderers/ObjectRenderer/ObjectAccordionMultipleRenderer.js +11 -2
- package/base/Base/FieldRenderers/ObjectRenderer/ObjectAccordionMultipleRenderer.js.map +1 -1
- package/base/Base/FieldRenderers/ObjectRenderer/ObjectFieldComponents.d.ts +2 -0
- package/base/Base/FieldRenderers/ObjectRenderer/ObjectFieldComponents.js +14 -5
- package/base/Base/FieldRenderers/ObjectRenderer/ObjectFieldComponents.js.map +1 -1
- package/base/Base/FieldRenderers/ObjectRenderer/ObjectRenderer.js +16 -25
- package/base/Base/FieldRenderers/ObjectRenderer/ObjectRenderer.js.map +1 -1
- package/base/Base/FieldRenderers/ObjectRenderer/SingleValueDynamicZone.js +18 -3
- package/base/Base/FieldRenderers/ObjectRenderer/SingleValueDynamicZone.js.map +1 -1
- package/base/Base/FieldRenderers/ObjectRenderer/{TemplatePicker.d.ts → TemplatePicker/AddTemplateButton.d.ts} +1 -1
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/AddTemplateButton.js +24 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/AddTemplateButton.js.map +1 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/SelectableTemplate.d.ts +13 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/SelectableTemplate.js +21 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/SelectableTemplate.js.map +1 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateCard.d.ts +3 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateCard.js +35 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateCard.js.map +1 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateGallery.d.ts +8 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateGallery.js +22 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateGallery.js.map +1 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateGalleryToolbar.d.ts +10 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateGalleryToolbar.js +52 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateGalleryToolbar.js.map +1 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateIcon.d.ts +8 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateIcon.js +16 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateIcon.js.map +1 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateList.d.ts +10 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateList.js +22 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateList.js.map +1 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateListItem.d.ts +3 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateListItem.js +35 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateListItem.js.map +1 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/index.d.ts +1 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/index.js +1 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/types.d.ts +6 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/types.js +0 -0
- package/base/Base/FieldRenderers/ObjectRenderer/resolveItemTitle.d.ts +8 -3
- package/base/Base/FieldRenderers/ObjectRenderer/resolveItemTitle.js +25 -17
- package/base/Base/FieldRenderers/ObjectRenderer/resolveItemTitle.js.map +1 -1
- package/base/Base/FieldRenderers/ObjectRenderer/resolveItemTitle.test.d.ts +1 -0
- package/base/Base/FieldRenderers/ObjectRenderer/resolveItemTitle.test.js +106 -0
- package/base/Base/FieldRenderers/ObjectRenderer/resolveItemTitle.test.js.map +1 -0
- package/base/Base/FieldRenderers/RadioButtonsRenderer.js +3 -2
- package/base/Base/FieldRenderers/RadioButtonsRenderer.js.map +1 -1
- package/base/Base/FieldRenderers/SelectRenderer.js +4 -2
- package/base/Base/FieldRenderers/SelectRenderer.js.map +1 -1
- package/base/Base.js +2 -1
- package/base/Base.js.map +1 -1
- package/base/createRootContainer.js +4 -0
- package/base/createRootContainer.js.map +1 -1
- package/base/resolveApiUrl.d.ts +10 -0
- package/base/resolveApiUrl.js +11 -3
- package/base/resolveApiUrl.js.map +1 -1
- package/base/ui/AssumedPermissionsSelector.d.ts +47 -0
- package/base/ui/AssumedPermissionsSelector.js +7 -0
- package/base/ui/AssumedPermissionsSelector.js.map +1 -0
- package/base/ui/DebuggerIndicator.d.ts +23 -0
- package/base/ui/DebuggerIndicator.js +5 -0
- package/base/ui/DebuggerIndicator.js.map +1 -0
- package/base/ui/Layout.d.ts +20 -0
- package/base/ui/Layout.js +2 -1
- package/base/ui/Layout.js.map +1 -1
- package/components/DeveloperMode/DeveloperMode.d.ts +1 -3
- package/components/DeveloperMode/DeveloperMode.js.map +1 -1
- package/components/Filters/Filters.js +7 -1
- package/components/Filters/Filters.js.map +1 -1
- package/components/IconPicker/IconPickerComponent.js +1 -1
- package/components/IconPicker/IconPickerComponent.js.map +1 -1
- package/components/SplitView/SplitView.d.ts +2 -2
- package/components/SplitView/SplitView.js +7 -7
- package/components/SplitView/SplitView.js.map +1 -1
- package/config/AdminConfig/Widget.d.ts +9 -1
- package/config/AdminConfig/Widget.js +6 -2
- package/config/AdminConfig/Widget.js.map +1 -1
- package/domain/Identity.js +1 -1
- package/domain/Identity.js.map +1 -1
- package/exports/admin/ui.d.ts +4 -0
- package/exports/admin/ui.js +4 -1
- package/exports/admin.d.ts +4 -0
- package/exports/admin.js +2 -0
- package/features/{aiChat/AiChatGateway.d.ts → adminAssistant/AdminAssistantGateway.d.ts} +7 -7
- package/features/{aiChat/AiChatGateway.js → adminAssistant/AdminAssistantGateway.js} +8 -8
- package/features/adminAssistant/AdminAssistantGateway.js.map +1 -0
- package/features/adminAssistant/AdminAssistantPresenter.d.ts +60 -0
- package/features/adminAssistant/AdminAssistantPresenter.js +377 -0
- package/features/adminAssistant/AdminAssistantPresenter.js.map +1 -0
- package/features/adminAssistant/abstractions.d.ts +176 -0
- package/features/adminAssistant/abstractions.js +6 -0
- package/features/adminAssistant/abstractions.js.map +1 -0
- package/features/adminAssistant/feature.d.ts +3 -0
- package/features/adminAssistant/feature.js +19 -0
- package/features/adminAssistant/feature.js.map +1 -0
- package/features/adminAssistant/index.d.ts +6 -0
- package/features/adminAssistant/index.js +3 -0
- package/features/adminAssistant/turnsFromMessages.d.ts +15 -0
- package/features/adminAssistant/turnsFromMessages.js +77 -0
- package/features/adminAssistant/turnsFromMessages.js.map +1 -0
- package/features/adminUsers/account/getCurrentUser/GetCurrentUserGateway.d.ts +11 -0
- package/features/adminUsers/account/getCurrentUser/GetCurrentUserGateway.js +44 -0
- package/features/adminUsers/account/getCurrentUser/GetCurrentUserGateway.js.map +1 -0
- package/features/adminUsers/account/getCurrentUser/GetCurrentUserUseCase.d.ts +10 -0
- package/features/adminUsers/account/getCurrentUser/GetCurrentUserUseCase.js +19 -0
- package/features/adminUsers/account/getCurrentUser/GetCurrentUserUseCase.js.map +1 -0
- package/features/adminUsers/account/getCurrentUser/abstractions/GetCurrentUserGateway.d.ts +16 -0
- package/features/adminUsers/account/getCurrentUser/abstractions/GetCurrentUserGateway.js +5 -0
- package/features/adminUsers/account/getCurrentUser/abstractions/GetCurrentUserGateway.js.map +1 -0
- package/features/adminUsers/account/getCurrentUser/abstractions/GetCurrentUserUseCase.d.ts +10 -0
- package/features/adminUsers/account/getCurrentUser/abstractions/GetCurrentUserUseCase.js +5 -0
- package/features/adminUsers/account/getCurrentUser/abstractions/GetCurrentUserUseCase.js.map +1 -0
- package/features/adminUsers/account/getCurrentUser/abstractions/index.d.ts +6 -0
- package/features/adminUsers/account/getCurrentUser/abstractions/index.js +2 -0
- package/features/adminUsers/account/getCurrentUser/feature.d.ts +3 -0
- package/features/adminUsers/account/getCurrentUser/feature.js +19 -0
- package/features/adminUsers/account/getCurrentUser/feature.js.map +1 -0
- package/features/adminUsers/account/getCurrentUser/index.d.ts +1 -0
- package/features/adminUsers/account/getCurrentUser/index.js +1 -0
- package/features/adminUsers/account/updateCurrentUser/UpdateCurrentUserGateway.d.ts +11 -0
- package/features/adminUsers/account/updateCurrentUser/UpdateCurrentUserGateway.js +48 -0
- package/features/adminUsers/account/updateCurrentUser/UpdateCurrentUserGateway.js.map +1 -0
- package/features/adminUsers/account/updateCurrentUser/UpdateCurrentUserUseCase.d.ts +10 -0
- package/features/adminUsers/account/updateCurrentUser/UpdateCurrentUserUseCase.js +19 -0
- package/features/adminUsers/account/updateCurrentUser/UpdateCurrentUserUseCase.js.map +1 -0
- package/features/adminUsers/account/updateCurrentUser/abstractions/UpdateCurrentUserGateway.d.ts +26 -0
- package/features/adminUsers/account/updateCurrentUser/abstractions/UpdateCurrentUserGateway.js +5 -0
- package/features/adminUsers/account/updateCurrentUser/abstractions/UpdateCurrentUserGateway.js.map +1 -0
- package/features/adminUsers/account/updateCurrentUser/abstractions/UpdateCurrentUserUseCase.d.ts +13 -0
- package/features/adminUsers/account/updateCurrentUser/abstractions/UpdateCurrentUserUseCase.js +5 -0
- package/features/adminUsers/account/updateCurrentUser/abstractions/UpdateCurrentUserUseCase.js.map +1 -0
- package/features/adminUsers/account/updateCurrentUser/abstractions/index.d.ts +8 -0
- package/features/adminUsers/account/updateCurrentUser/abstractions/index.js +2 -0
- package/features/adminUsers/account/updateCurrentUser/feature.d.ts +3 -0
- package/features/adminUsers/account/updateCurrentUser/feature.js +19 -0
- package/features/adminUsers/account/updateCurrentUser/feature.js.map +1 -0
- package/features/adminUsers/account/updateCurrentUser/index.d.ts +1 -0
- package/features/adminUsers/account/updateCurrentUser/index.js +1 -0
- package/features/adminUsers/passwordPolicy/RulesPasswordPolicy.d.ts +6 -0
- package/features/adminUsers/passwordPolicy/RulesPasswordPolicy.js +22 -0
- package/features/adminUsers/passwordPolicy/RulesPasswordPolicy.js.map +1 -0
- package/features/adminUsers/passwordPolicy/abstractions.d.ts +20 -0
- package/features/adminUsers/passwordPolicy/abstractions.js +5 -0
- package/features/adminUsers/passwordPolicy/abstractions.js.map +1 -0
- package/features/adminUsers/passwordPolicy/feature.d.ts +8 -0
- package/features/adminUsers/passwordPolicy/feature.js +18 -0
- package/features/adminUsers/passwordPolicy/feature.js.map +1 -0
- package/features/adminUsers/passwordPolicy/index.d.ts +3 -0
- package/features/adminUsers/passwordPolicy/index.js +3 -0
- package/features/adminUsers/passwordPolicy/readPasswordPolicyRules.d.ts +10 -0
- package/features/adminUsers/passwordPolicy/readPasswordPolicyRules.js +11 -0
- package/features/adminUsers/passwordPolicy/readPasswordPolicyRules.js.map +1 -0
- package/features/adminUsers/permissions/abstractions.d.ts +17 -0
- package/features/adminUsers/permissions/abstractions.js +6 -0
- package/features/adminUsers/permissions/abstractions.js.map +1 -0
- package/features/adminUsers/permissions/feature.d.ts +14 -0
- package/features/adminUsers/permissions/feature.js +7 -0
- package/features/adminUsers/permissions/feature.js.map +1 -0
- package/features/adminUsers/permissionsSchema.d.ts +10 -0
- package/features/adminUsers/permissionsSchema.js +18 -0
- package/features/adminUsers/permissionsSchema.js.map +1 -0
- package/features/adminUsers/users/createUser/CreateUserGateway.d.ts +11 -0
- package/features/adminUsers/users/createUser/CreateUserGateway.js +49 -0
- package/features/adminUsers/users/createUser/CreateUserGateway.js.map +1 -0
- package/features/adminUsers/users/createUser/CreateUserUseCase.d.ts +10 -0
- package/features/adminUsers/users/createUser/CreateUserUseCase.js +18 -0
- package/features/adminUsers/users/createUser/CreateUserUseCase.js.map +1 -0
- package/features/adminUsers/users/createUser/abstractions/CreateUserGateway.d.ts +21 -0
- package/features/adminUsers/users/createUser/abstractions/CreateUserGateway.js +5 -0
- package/features/adminUsers/users/createUser/abstractions/CreateUserGateway.js.map +1 -0
- package/features/adminUsers/users/createUser/abstractions/CreateUserUseCase.d.ts +14 -0
- package/features/adminUsers/users/createUser/abstractions/CreateUserUseCase.js +5 -0
- package/features/adminUsers/users/createUser/abstractions/CreateUserUseCase.js.map +1 -0
- package/features/adminUsers/users/createUser/abstractions/index.d.ts +2 -0
- package/features/adminUsers/users/createUser/abstractions/index.js +2 -0
- package/features/adminUsers/users/createUser/feature.d.ts +3 -0
- package/features/adminUsers/users/createUser/feature.js +19 -0
- package/features/adminUsers/users/createUser/feature.js.map +1 -0
- package/features/adminUsers/users/createUser/index.d.ts +2 -0
- package/features/adminUsers/users/createUser/index.js +2 -0
- package/features/adminUsers/users/deleteUser/DeleteUserGateway.d.ts +11 -0
- package/features/adminUsers/users/deleteUser/DeleteUserGateway.js +40 -0
- package/features/adminUsers/users/deleteUser/DeleteUserGateway.js.map +1 -0
- package/features/adminUsers/users/deleteUser/DeleteUserUseCase.d.ts +10 -0
- package/features/adminUsers/users/deleteUser/DeleteUserUseCase.js +18 -0
- package/features/adminUsers/users/deleteUser/DeleteUserUseCase.js.map +1 -0
- package/features/adminUsers/users/deleteUser/abstractions/DeleteUserGateway.d.ts +11 -0
- package/features/adminUsers/users/deleteUser/abstractions/DeleteUserGateway.js +5 -0
- package/features/adminUsers/users/deleteUser/abstractions/DeleteUserGateway.js.map +1 -0
- package/features/adminUsers/users/deleteUser/abstractions/DeleteUserUseCase.d.ts +11 -0
- package/features/adminUsers/users/deleteUser/abstractions/DeleteUserUseCase.js +5 -0
- package/features/adminUsers/users/deleteUser/abstractions/DeleteUserUseCase.js.map +1 -0
- package/features/adminUsers/users/deleteUser/abstractions/index.d.ts +2 -0
- package/features/adminUsers/users/deleteUser/abstractions/index.js +2 -0
- package/features/adminUsers/users/deleteUser/feature.d.ts +3 -0
- package/features/adminUsers/users/deleteUser/feature.js +19 -0
- package/features/adminUsers/users/deleteUser/feature.js.map +1 -0
- package/features/adminUsers/users/deleteUser/index.d.ts +2 -0
- package/features/adminUsers/users/deleteUser/index.js +2 -0
- package/features/adminUsers/users/getUser/GetUserGateway.d.ts +11 -0
- package/features/adminUsers/users/getUser/GetUserGateway.js +57 -0
- package/features/adminUsers/users/getUser/GetUserGateway.js.map +1 -0
- package/features/adminUsers/users/getUser/GetUserUseCase.d.ts +10 -0
- package/features/adminUsers/users/getUser/GetUserUseCase.js +18 -0
- package/features/adminUsers/users/getUser/GetUserUseCase.js.map +1 -0
- package/features/adminUsers/users/getUser/abstractions/GetUserGateway.d.ts +32 -0
- package/features/adminUsers/users/getUser/abstractions/GetUserGateway.js +5 -0
- package/features/adminUsers/users/getUser/abstractions/GetUserGateway.js.map +1 -0
- package/features/adminUsers/users/getUser/abstractions/GetUserUseCase.d.ts +14 -0
- package/features/adminUsers/users/getUser/abstractions/GetUserUseCase.js +5 -0
- package/features/adminUsers/users/getUser/abstractions/GetUserUseCase.js.map +1 -0
- package/features/adminUsers/users/getUser/abstractions/index.d.ts +2 -0
- package/features/adminUsers/users/getUser/abstractions/index.js +2 -0
- package/features/adminUsers/users/getUser/feature.d.ts +3 -0
- package/features/adminUsers/users/getUser/feature.js +19 -0
- package/features/adminUsers/users/getUser/feature.js.map +1 -0
- package/features/adminUsers/users/getUser/index.d.ts +2 -0
- package/features/adminUsers/users/getUser/index.js +2 -0
- package/features/adminUsers/users/listUsers/ListUsersGateway.d.ts +11 -0
- package/features/adminUsers/users/listUsers/ListUsersGateway.js +39 -0
- package/features/adminUsers/users/listUsers/ListUsersGateway.js.map +1 -0
- package/features/adminUsers/users/listUsers/ListUsersUseCase.d.ts +10 -0
- package/features/adminUsers/users/listUsers/ListUsersUseCase.js +18 -0
- package/features/adminUsers/users/listUsers/ListUsersUseCase.js.map +1 -0
- package/features/adminUsers/users/listUsers/abstractions/ListUsersGateway.d.ts +17 -0
- package/features/adminUsers/users/listUsers/abstractions/ListUsersGateway.js +5 -0
- package/features/adminUsers/users/listUsers/abstractions/ListUsersGateway.js.map +1 -0
- package/features/adminUsers/users/listUsers/abstractions/ListUsersUseCase.d.ts +10 -0
- package/features/adminUsers/users/listUsers/abstractions/ListUsersUseCase.js +5 -0
- package/features/adminUsers/users/listUsers/abstractions/ListUsersUseCase.js.map +1 -0
- package/features/adminUsers/users/listUsers/abstractions/index.d.ts +2 -0
- package/features/adminUsers/users/listUsers/abstractions/index.js +2 -0
- package/features/adminUsers/users/listUsers/feature.d.ts +3 -0
- package/features/adminUsers/users/listUsers/feature.js +19 -0
- package/features/adminUsers/users/listUsers/feature.js.map +1 -0
- package/features/adminUsers/users/listUsers/index.d.ts +2 -0
- package/features/adminUsers/users/listUsers/index.js +2 -0
- package/features/adminUsers/users/updateUser/UpdateUserGateway.d.ts +11 -0
- package/features/adminUsers/users/updateUser/UpdateUserGateway.js +59 -0
- package/features/adminUsers/users/updateUser/UpdateUserGateway.js.map +1 -0
- package/features/adminUsers/users/updateUser/UpdateUserUseCase.d.ts +10 -0
- package/features/adminUsers/users/updateUser/UpdateUserUseCase.js +18 -0
- package/features/adminUsers/users/updateUser/UpdateUserUseCase.js.map +1 -0
- package/features/adminUsers/users/updateUser/abstractions/UpdateUserGateway.d.ts +33 -0
- package/features/adminUsers/users/updateUser/abstractions/UpdateUserGateway.js +5 -0
- package/features/adminUsers/users/updateUser/abstractions/UpdateUserGateway.js.map +1 -0
- package/features/adminUsers/users/updateUser/abstractions/UpdateUserUseCase.d.ts +15 -0
- package/features/adminUsers/users/updateUser/abstractions/UpdateUserUseCase.js +5 -0
- package/features/adminUsers/users/updateUser/abstractions/UpdateUserUseCase.js.map +1 -0
- package/features/adminUsers/users/updateUser/abstractions/index.d.ts +2 -0
- package/features/adminUsers/users/updateUser/abstractions/index.js +2 -0
- package/features/adminUsers/users/updateUser/feature.d.ts +3 -0
- package/features/adminUsers/users/updateUser/feature.js +19 -0
- package/features/adminUsers/users/updateUser/feature.js.map +1 -0
- package/features/adminUsers/users/updateUser/index.d.ts +2 -0
- package/features/adminUsers/users/updateUser/index.js +2 -0
- package/features/aiChats/AiChatSaveError.d.ts +6 -0
- package/features/aiChats/AiChatSaveError.js +8 -0
- package/features/aiChats/AiChatSaveError.js.map +1 -0
- package/features/aiChats/AiChatsGateway.d.ts +18 -0
- package/features/aiChats/AiChatsGateway.js +132 -0
- package/features/aiChats/AiChatsGateway.js.map +1 -0
- package/features/aiChats/AiChatsRepository.d.ts +36 -0
- package/features/aiChats/AiChatsRepository.js +110 -0
- package/features/aiChats/AiChatsRepository.js.map +1 -0
- package/features/aiChats/AiChatsRequestError.d.ts +9 -0
- package/features/aiChats/AiChatsRequestError.js +8 -0
- package/features/aiChats/AiChatsRequestError.js.map +1 -0
- package/features/aiChats/abstractions.d.ts +76 -0
- package/features/aiChats/abstractions.js +6 -0
- package/features/aiChats/abstractions.js.map +1 -0
- package/features/aiChats/feature.d.ts +3 -0
- package/features/aiChats/feature.js +19 -0
- package/features/aiChats/feature.js.map +1 -0
- package/features/aiChats/index.d.ts +9 -0
- package/features/aiChats/index.js +3 -0
- package/features/aiChats/messageOf.d.ts +2 -0
- package/features/aiChats/messageOf.js +7 -0
- package/features/aiChats/messageOf.js.map +1 -0
- package/features/aiSettings/abstractions.d.ts +16 -0
- package/features/aiSettings/abstractions.js +5 -0
- package/features/aiSettings/abstractions.js.map +1 -0
- package/features/aiSettings/index.d.ts +2 -0
- package/features/aiSettings/index.js +1 -0
- package/features/assumePermissions/ApiStreamClientDecorator.d.ts +16 -0
- package/features/assumePermissions/ApiStreamClientDecorator.js +29 -0
- package/features/assumePermissions/ApiStreamClientDecorator.js.map +1 -0
- package/features/assumePermissions/AssumePermissionsContext.d.ts +17 -0
- package/features/assumePermissions/AssumePermissionsContext.js +32 -0
- package/features/assumePermissions/AssumePermissionsContext.js.map +1 -0
- package/features/assumePermissions/AssumePermissionsUseCase.d.ts +33 -0
- package/features/assumePermissions/AssumePermissionsUseCase.js +48 -0
- package/features/assumePermissions/AssumePermissionsUseCase.js.map +1 -0
- package/features/assumePermissions/GraphQLClientDecorator.d.ts +16 -0
- package/features/assumePermissions/GraphQLClientDecorator.js +29 -0
- package/features/assumePermissions/GraphQLClientDecorator.js.map +1 -0
- package/features/assumePermissions/ListAssumableTargetsGateway.d.ts +13 -0
- package/features/assumePermissions/ListAssumableTargetsGateway.js +74 -0
- package/features/assumePermissions/ListAssumableTargetsGateway.js.map +1 -0
- package/features/assumePermissions/ListAssumableTargetsUseCase.d.ts +16 -0
- package/features/assumePermissions/ListAssumableTargetsUseCase.js +38 -0
- package/features/assumePermissions/ListAssumableTargetsUseCase.js.map +1 -0
- package/features/assumePermissions/LogInUseCaseDecorator.d.ts +33 -0
- package/features/assumePermissions/LogInUseCaseDecorator.js +36 -0
- package/features/assumePermissions/LogInUseCaseDecorator.js.map +1 -0
- package/features/assumePermissions/LogOutUseCaseDecorator.d.ts +16 -0
- package/features/assumePermissions/LogOutUseCaseDecorator.js +21 -0
- package/features/assumePermissions/LogOutUseCaseDecorator.js.map +1 -0
- package/features/assumePermissions/abstractions.d.ts +78 -0
- package/features/assumePermissions/abstractions.js +8 -0
- package/features/assumePermissions/abstractions.js.map +1 -0
- package/features/assumePermissions/assumePermissionsHeader.d.ts +3 -0
- package/features/assumePermissions/assumePermissionsHeader.js +7 -0
- package/features/assumePermissions/assumePermissionsHeader.js.map +1 -0
- package/features/assumePermissions/feature.d.ts +4 -0
- package/features/assumePermissions/feature.js +32 -0
- package/features/assumePermissions/feature.js.map +1 -0
- package/features/assumePermissions/index.d.ts +4 -0
- package/features/assumePermissions/index.js +2 -0
- package/features/banners/Banners.d.ts +15 -0
- package/features/banners/Banners.js +39 -0
- package/features/banners/Banners.js.map +1 -0
- package/features/banners/abstractions.d.ts +34 -0
- package/features/banners/abstractions.js +5 -0
- package/features/banners/abstractions.js.map +1 -0
- package/features/banners/feature.d.ts +3 -0
- package/features/banners/feature.js +17 -0
- package/features/banners/feature.js.map +1 -0
- package/features/banners/index.d.ts +2 -0
- package/features/banners/index.js +2 -0
- package/features/dateFormatter/formatUtcOffset.d.ts +1 -0
- package/features/dateFormatter/formatUtcOffset.js +11 -0
- package/features/dateFormatter/formatUtcOffset.js.map +1 -0
- package/features/debugger/DebugSessionsRepository.d.ts +35 -0
- package/features/debugger/DebugSessionsRepository.js +57 -0
- package/features/debugger/DebugSessionsRepository.js.map +1 -0
- package/features/debugger/GraphQLExtensionsDebugHandler.d.ts +17 -0
- package/features/debugger/GraphQLExtensionsDebugHandler.js +21 -0
- package/features/debugger/GraphQLExtensionsDebugHandler.js.map +1 -0
- package/features/debugger/GraphQLExtensionsDebugHandler.test.d.ts +1 -0
- package/features/debugger/GraphQLExtensionsDebugHandler.test.js +112 -0
- package/features/debugger/GraphQLExtensionsDebugHandler.test.js.map +1 -0
- package/features/debugger/abstractions.d.ts +50 -0
- package/features/debugger/abstractions.js +5 -0
- package/features/debugger/abstractions.js.map +1 -0
- package/features/debugger/constants.d.ts +1 -0
- package/features/debugger/constants.js +4 -0
- package/features/debugger/constants.js.map +1 -0
- package/features/debugger/feature.d.ts +3 -0
- package/features/debugger/feature.js +19 -0
- package/features/debugger/feature.js.map +1 -0
- package/features/debugger/index.d.ts +3 -0
- package/features/debugger/index.js +3 -0
- package/features/formModel/AccessControlRuleEvaluator.d.ts +12 -0
- package/features/formModel/AccessControlRuleEvaluator.js +30 -0
- package/features/formModel/AccessControlRuleEvaluator.js.map +1 -0
- package/features/formModel/AccessControlRuleEvaluator.test.d.ts +1 -0
- package/features/formModel/AccessControlRuleEvaluator.test.js +219 -0
- package/features/formModel/AccessControlRuleEvaluator.test.js.map +1 -0
- package/features/formModel/ConditionRuleEvaluator.js +34 -4
- package/features/formModel/ConditionRuleEvaluator.js.map +1 -1
- package/features/formModel/Field.d.ts +14 -1
- package/features/formModel/Field.js +41 -5
- package/features/formModel/Field.js.map +1 -1
- package/features/formModel/FieldBuilder.d.ts +3 -3
- package/features/formModel/FieldBuilder.js +2 -1
- package/features/formModel/FieldBuilder.js.map +1 -1
- package/features/formModel/FieldBuilder.test.js +158 -1
- package/features/formModel/FieldBuilder.test.js.map +1 -1
- package/features/formModel/FocusManager.js +10 -3
- package/features/formModel/FocusManager.js.map +1 -1
- package/features/formModel/FormErrors.js +1 -1
- package/features/formModel/FormErrors.js.map +1 -1
- package/features/formModel/FormModel.d.ts +2 -0
- package/features/formModel/FormModel.js +32 -9
- package/features/formModel/FormModel.js.map +1 -1
- package/features/formModel/FormModel.test.js +835 -4
- package/features/formModel/FormModel.test.js.map +1 -1
- package/features/formModel/ObjectField.d.ts +12 -1
- package/features/formModel/ObjectField.js +70 -20
- package/features/formModel/ObjectField.js.map +1 -1
- package/features/formModel/Rules.test.js +224 -16
- package/features/formModel/Rules.test.js.map +1 -1
- package/features/formModel/abstractions.d.ts +56 -4
- package/features/formModel/abstractions.js +2 -1
- package/features/formModel/abstractions.js.map +1 -1
- package/features/formModel/createFieldRenderer.d.ts +42 -0
- package/features/formModel/createFieldRenderer.js +33 -10
- package/features/formModel/createFieldRenderer.js.map +1 -1
- package/features/formModel/feature.js +2 -0
- package/features/formModel/feature.js.map +1 -1
- package/features/formModel/fieldTypes/DateTimeFieldType.d.ts +67 -4
- package/features/formModel/fieldTypes/DateTimeFieldType.js +88 -22
- package/features/formModel/fieldTypes/DateTimeFieldType.js.map +1 -1
- package/features/formModel/fieldTypes/ObjectFieldType.d.ts +3 -1
- package/features/formModel/fieldTypes/ObjectFieldType.js +23 -1
- package/features/formModel/fieldTypes/ObjectFieldType.js.map +1 -1
- package/features/formModel/fieldTypes/dateLimits.d.ts +37 -0
- package/features/formModel/fieldTypes/dateLimits.js +64 -0
- package/features/formModel/fieldTypes/dateLimits.js.map +1 -0
- package/features/formModel/fieldTypes/dateLimits.test.d.ts +1 -0
- package/features/formModel/fieldTypes/dateLimits.test.js +60 -0
- package/features/formModel/fieldTypes/dateLimits.test.js.map +1 -0
- package/features/formModel/hasSubtreeFocusRequest.d.ts +12 -0
- package/features/formModel/hasSubtreeFocusRequest.js +15 -0
- package/features/formModel/hasSubtreeFocusRequest.js.map +1 -0
- package/features/formModel/index.d.ts +3 -2
- package/features/formModel/index.js +2 -1
- package/features/formModel/jsonSchema/JsonSchema.d.ts +18 -0
- package/features/formModel/jsonSchema/JsonSchema.js +0 -0
- package/features/formModel/jsonSchema/JsonSchemaFieldOptions.d.ts +4 -0
- package/features/formModel/jsonSchema/JsonSchemaFieldOptions.js +0 -0
- package/features/formModel/jsonSchema/JsonSchemaIssue.d.ts +4 -0
- package/features/formModel/jsonSchema/JsonSchemaIssue.js +0 -0
- package/features/formModel/jsonSchema/JsonSchemaValidationResult.d.ts +5 -0
- package/features/formModel/jsonSchema/JsonSchemaValidationResult.js +0 -0
- package/features/formModel/jsonSchema/JsonSchemaValidator.d.ts +4 -0
- package/features/formModel/jsonSchema/JsonSchemaValidator.js +0 -0
- package/features/formModel/jsonSchema/PlainObject.d.ts +1 -0
- package/features/formModel/jsonSchema/PlainObject.js +0 -0
- package/features/formModel/jsonSchema/buildFieldsFromJsonSchema.d.ts +5 -0
- package/features/formModel/jsonSchema/buildFieldsFromJsonSchema.js +154 -0
- package/features/formModel/jsonSchema/buildFieldsFromJsonSchema.js.map +1 -0
- package/features/formModel/jsonSchema/buildFieldsFromJsonSchema.test.d.ts +1 -0
- package/features/formModel/jsonSchema/buildFieldsFromJsonSchema.test.js +643 -0
- package/features/formModel/jsonSchema/buildFieldsFromJsonSchema.test.js.map +1 -0
- package/features/formModel/jsonSchema/createJsonSchemaValidator.d.ts +3 -0
- package/features/formModel/jsonSchema/createJsonSchemaValidator.js +40 -0
- package/features/formModel/jsonSchema/createJsonSchemaValidator.js.map +1 -0
- package/features/formModel/jsonSchema/createJsonSchemaValidator.test.d.ts +1 -0
- package/features/formModel/jsonSchema/createJsonSchemaValidator.test.js +141 -0
- package/features/formModel/jsonSchema/createJsonSchemaValidator.test.js.map +1 -0
- package/features/formModel/jsonSchema/formDataToJsonSchemaValue.d.ts +3 -0
- package/features/formModel/jsonSchema/formDataToJsonSchemaValue.js +52 -0
- package/features/formModel/jsonSchema/formDataToJsonSchemaValue.js.map +1 -0
- package/features/formModel/jsonSchema/formDataToJsonSchemaValue.test.d.ts +1 -0
- package/features/formModel/jsonSchema/formDataToJsonSchemaValue.test.js +250 -0
- package/features/formModel/jsonSchema/formDataToJsonSchemaValue.test.js.map +1 -0
- package/features/formModel/jsonSchema/getJsonSchemaKind.d.ts +3 -0
- package/features/formModel/jsonSchema/getJsonSchemaKind.js +31 -0
- package/features/formModel/jsonSchema/getJsonSchemaKind.js.map +1 -0
- package/features/formModel/jsonSchema/getJsonSchemaKind.test.d.ts +1 -0
- package/features/formModel/jsonSchema/getJsonSchemaKind.test.js +123 -0
- package/features/formModel/jsonSchema/getJsonSchemaKind.test.js.map +1 -0
- package/features/formModel/jsonSchema/isPlainObject.d.ts +2 -0
- package/features/formModel/jsonSchema/isPlainObject.js +4 -0
- package/features/formModel/jsonSchema/isPlainObject.js.map +1 -0
- package/features/formModel/jsonSchema/jsonSchemaValueToFormData.d.ts +3 -0
- package/features/formModel/jsonSchema/jsonSchemaValueToFormData.js +30 -0
- package/features/formModel/jsonSchema/jsonSchemaValueToFormData.js.map +1 -0
- package/features/formModel/jsonSchema/jsonSchemaValueToFormData.test.d.ts +1 -0
- package/features/formModel/jsonSchema/jsonSchemaValueToFormData.test.js +207 -0
- package/features/formModel/jsonSchema/jsonSchemaValueToFormData.test.js.map +1 -0
- package/features/formModel/jsonSchema/normalizeJsonSchema.d.ts +2 -0
- package/features/formModel/jsonSchema/normalizeJsonSchema.js +10 -0
- package/features/formModel/jsonSchema/normalizeJsonSchema.js.map +1 -0
- package/features/formModel/renderers.d.ts +1 -0
- package/features/formModel/renderers.js +1 -0
- package/features/notifications/Notifications.d.ts +1 -0
- package/features/notifications/Notifications.js +3 -0
- package/features/notifications/Notifications.js.map +1 -1
- package/features/notifications/Notifications.test.d.ts +1 -0
- package/features/notifications/Notifications.test.js +106 -0
- package/features/notifications/Notifications.test.js.map +1 -0
- package/features/notifications/NotificationsRenderer.d.ts +2 -1
- package/features/notifications/NotificationsRenderer.js +23 -4
- package/features/notifications/NotificationsRenderer.js.map +1 -1
- package/features/notifications/NotificationsRenderer.test.d.ts +1 -0
- package/features/notifications/NotificationsRenderer.test.js +261 -0
- package/features/notifications/NotificationsRenderer.test.js.map +1 -0
- package/features/notifications/abstractions.d.ts +13 -2
- package/features/notifications/abstractions.js.map +1 -1
- package/features/security/LogIn/LogInUseCase.d.ts +0 -1
- package/features/security/LogIn/LogInUseCase.js +2 -5
- package/features/security/LogIn/LogInUseCase.js.map +1 -1
- package/features/security/LogIn/hasAppPermissions.d.ts +2 -0
- package/features/security/LogIn/hasAppPermissions.js +8 -0
- package/features/security/LogIn/hasAppPermissions.js.map +1 -0
- package/features/wcp/ReactLicense.d.ts +6 -1
- package/features/wcp/ReactLicense.js +17 -2
- package/features/wcp/ReactLicense.js.map +1 -1
- package/features/wcp/WcpGateway.js +4 -0
- package/features/wcp/WcpGateway.js.map +1 -1
- package/hooks/useHotkeys.js +6 -4
- package/hooks/useHotkeys.js.map +1 -1
- package/index.d.ts +27 -3
- package/index.js +23 -6
- package/modules/AccessManagementExtension.js +3 -1
- package/modules/AccessManagementExtension.js.map +1 -1
- package/modules/DebuggerExtension.d.ts +2 -0
- package/modules/DebuggerExtension.js +55 -0
- package/modules/DebuggerExtension.js.map +1 -0
- package/package.json +41 -41
- package/presentation/accessManagement/apiKeys/ApiKeysPresenter.js +1 -2
- package/presentation/accessManagement/apiKeys/ApiKeysPresenter.js.map +1 -1
- package/presentation/accessManagement/roles/RolesPresenter.js +1 -2
- package/presentation/accessManagement/roles/RolesPresenter.js.map +1 -1
- package/presentation/accessManagement/roles/components/RolesDataList.d.ts +10 -0
- package/presentation/accessManagement/roles/components/RolesDataList.js +146 -0
- package/presentation/accessManagement/roles/components/RolesDataList.js.map +1 -0
- package/presentation/accessManagement/roles/components/RolesForm.d.ts +13 -0
- package/presentation/accessManagement/roles/components/RolesForm.js +114 -0
- package/presentation/accessManagement/roles/components/RolesForm.js.map +1 -0
- package/presentation/accessManagement/roles/components/RolesView.js +6 -216
- package/presentation/accessManagement/roles/components/RolesView.js.map +1 -1
- package/presentation/accessManagement/teams/TeamsPresenter.js +1 -2
- package/presentation/accessManagement/teams/TeamsPresenter.js.map +1 -1
- package/presentation/accessManagement/teams/components/TeamsDataList.d.ts +10 -0
- package/presentation/accessManagement/teams/components/TeamsDataList.js +146 -0
- package/presentation/accessManagement/teams/components/TeamsDataList.js.map +1 -0
- package/presentation/accessManagement/teams/components/TeamsForm.d.ts +13 -0
- package/presentation/accessManagement/teams/components/TeamsForm.js +96 -0
- package/presentation/accessManagement/teams/components/TeamsForm.js.map +1 -0
- package/presentation/accessManagement/teams/components/TeamsView.js +6 -198
- package/presentation/accessManagement/teams/components/TeamsView.js.map +1 -1
- package/presentation/adminUsers/AdminUsers.d.ts +10 -0
- package/presentation/adminUsers/AdminUsers.js +77 -0
- package/presentation/adminUsers/AdminUsers.js.map +1 -0
- package/presentation/adminUsers/SecurityPermission.d.ts +2 -0
- package/presentation/adminUsers/SecurityPermission.js +15 -0
- package/presentation/adminUsers/SecurityPermission.js.map +1 -0
- package/presentation/adminUsers/UserItem.d.ts +10 -0
- package/presentation/adminUsers/UserItem.js +0 -0
- package/presentation/adminUsers/components/AvatarImage/AvatarImage.d.ts +3 -0
- package/presentation/adminUsers/components/AvatarImage/AvatarImage.js +31 -0
- package/presentation/adminUsers/components/AvatarImage/AvatarImage.js.map +1 -0
- package/presentation/adminUsers/components/AvatarImage/AvatarImagePreview.d.ts +10 -0
- package/presentation/adminUsers/components/AvatarImage/AvatarImagePreview.js +53 -0
- package/presentation/adminUsers/components/AvatarImage/AvatarImagePreview.js.map +1 -0
- package/presentation/adminUsers/components/AvatarImage/AvatarImageTrigger.d.ts +7 -0
- package/presentation/adminUsers/components/AvatarImage/AvatarImageTrigger.js +28 -0
- package/presentation/adminUsers/components/AvatarImage/AvatarImageTrigger.js.map +1 -0
- package/presentation/adminUsers/components/AvatarImage/index.d.ts +1 -0
- package/presentation/adminUsers/components/AvatarImage/index.js +1 -0
- package/presentation/adminUsers/routes.d.ts +10 -0
- package/presentation/adminUsers/routes.js +20 -0
- package/presentation/adminUsers/routes.js.map +1 -0
- package/presentation/adminUsers/userMenu/AccountDetails.d.ts +6 -0
- package/presentation/adminUsers/userMenu/AccountDetails.js +20 -0
- package/presentation/adminUsers/userMenu/AccountDetails.js.map +1 -0
- package/presentation/adminUsers/userMenu/useIsDefaultTenant.d.ts +1 -0
- package/presentation/adminUsers/userMenu/useIsDefaultTenant.js +9 -0
- package/presentation/adminUsers/userMenu/useIsDefaultTenant.js.map +1 -0
- package/presentation/adminUsers/views/Account/Account.d.ts +2 -0
- package/presentation/adminUsers/views/Account/Account.js +137 -0
- package/presentation/adminUsers/views/Account/Account.js.map +1 -0
- package/presentation/adminUsers/views/Account/index.d.ts +1 -0
- package/presentation/adminUsers/views/Account/index.js +1 -0
- package/presentation/adminUsers/views/Users/UsersDataList.d.ts +3 -0
- package/presentation/adminUsers/views/Users/UsersDataList.js +180 -0
- package/presentation/adminUsers/views/Users/UsersDataList.js.map +1 -0
- package/presentation/adminUsers/views/Users/UsersForm.d.ts +5 -0
- package/presentation/adminUsers/views/Users/UsersForm.js +175 -0
- package/presentation/adminUsers/views/Users/UsersForm.js.map +1 -0
- package/presentation/adminUsers/views/Users/UsersView.d.ts +2 -0
- package/presentation/adminUsers/views/Users/UsersView.js +15 -0
- package/presentation/adminUsers/views/Users/UsersView.js.map +1 -0
- package/presentation/adminUsers/views/Users/components/DeleteAction.d.ts +7 -0
- package/presentation/adminUsers/views/Users/components/DeleteAction.js +29 -0
- package/presentation/adminUsers/views/Users/components/DeleteAction.js.map +1 -0
- package/presentation/adminUsers/views/Users/hooks/useUserForm.d.ts +27 -0
- package/presentation/adminUsers/views/Users/hooks/useUserForm.js +101 -0
- package/presentation/adminUsers/views/Users/hooks/useUserForm.js.map +1 -0
- package/presentation/adminUsers/views/Users/search.js +21 -0
- package/presentation/adminUsers/views/Users/search.js.map +1 -0
- package/presentation/adminUsers/views/Users/search.svg +20 -0
- package/presentation/adminUsers/views/utils.d.ts +3 -0
- package/presentation/adminUsers/views/utils.js +12 -0
- package/presentation/adminUsers/views/utils.js.map +1 -0
- package/presentation/aiChats/AiChatsPanelPresenter.d.ts +28 -0
- package/presentation/aiChats/AiChatsPanelPresenter.js +132 -0
- package/presentation/aiChats/AiChatsPanelPresenter.js.map +1 -0
- package/presentation/aiChats/abstractions.d.ts +69 -0
- package/presentation/aiChats/abstractions.js +5 -0
- package/presentation/aiChats/abstractions.js.map +1 -0
- package/presentation/aiChats/feature.d.ts +3 -0
- package/presentation/aiChats/feature.js +17 -0
- package/presentation/aiChats/feature.js.map +1 -0
- package/presentation/aiChats/index.d.ts +2 -0
- package/presentation/aiChats/index.js +2 -0
- package/presentation/assumePermissions/AssumePermissionsPresenter.d.ts +36 -0
- package/presentation/assumePermissions/AssumePermissionsPresenter.js +153 -0
- package/presentation/assumePermissions/AssumePermissionsPresenter.js.map +1 -0
- package/presentation/assumePermissions/abstractions.d.ts +30 -0
- package/presentation/assumePermissions/abstractions.js +5 -0
- package/presentation/assumePermissions/abstractions.js.map +1 -0
- package/presentation/assumePermissions/components/AssumePermissionsButton.d.ts +14 -0
- package/presentation/assumePermissions/components/AssumePermissionsButton.js +42 -0
- package/presentation/assumePermissions/components/AssumePermissionsButton.js.map +1 -0
- package/presentation/assumePermissions/components/AssumedPermissionsBanner.d.ts +11 -0
- package/presentation/assumePermissions/components/AssumedPermissionsBanner.js +25 -0
- package/presentation/assumePermissions/components/AssumedPermissionsBanner.js.map +1 -0
- package/presentation/assumePermissions/components/AssumedPermissionsSelector.d.ts +2 -0
- package/presentation/assumePermissions/components/AssumedPermissionsSelector.js +68 -0
- package/presentation/assumePermissions/components/AssumedPermissionsSelector.js.map +1 -0
- package/presentation/assumePermissions/feature.d.ts +3 -0
- package/presentation/assumePermissions/feature.js +17 -0
- package/presentation/assumePermissions/feature.js.map +1 -0
- package/presentation/assumePermissions/index.d.ts +4 -0
- package/presentation/assumePermissions/index.js +4 -0
- package/presentation/banners/BannersPresenter.d.ts +14 -0
- package/presentation/banners/BannersPresenter.js +60 -0
- package/presentation/banners/BannersPresenter.js.map +1 -0
- package/presentation/banners/abstractions.d.ts +24 -0
- package/presentation/banners/abstractions.js +5 -0
- package/presentation/banners/abstractions.js.map +1 -0
- package/presentation/banners/components/Banner.d.ts +10 -0
- package/presentation/banners/components/Banner.js +32 -0
- package/presentation/banners/components/Banner.js.map +1 -0
- package/presentation/banners/components/BannerBar.d.ts +11 -0
- package/presentation/banners/components/BannerBar.js +51 -0
- package/presentation/banners/components/BannerBar.js.map +1 -0
- package/presentation/banners/feature.d.ts +3 -0
- package/presentation/banners/feature.js +17 -0
- package/presentation/banners/feature.js.map +1 -0
- package/presentation/banners/index.d.ts +6 -0
- package/presentation/banners/index.js +4 -0
- package/presentation/banners/useBanner.d.ts +10 -0
- package/presentation/banners/useBanner.js +15 -0
- package/presentation/banners/useBanner.js.map +1 -0
- package/presentation/commandPalette/CommandPalettePresenter.js +3 -1
- package/presentation/commandPalette/CommandPalettePresenter.js.map +1 -1
- package/presentation/commandPalette/abstractions.d.ts +5 -0
- package/presentation/commandPalette/abstractions.js.map +1 -1
- package/presentation/commandPalette/commands/AiChatsCommand.d.ts +24 -0
- package/presentation/commandPalette/commands/AiChatsCommand.js +41 -0
- package/presentation/commandPalette/commands/AiChatsCommand.js.map +1 -0
- package/presentation/commandPalette/commands/AskAiCommand.d.ts +1 -0
- package/presentation/commandPalette/commands/AskAiCommand.js +3 -2
- package/presentation/commandPalette/commands/AskAiCommand.js.map +1 -1
- package/presentation/commandPalette/commands/feature.js +2 -0
- package/presentation/commandPalette/commands/feature.js.map +1 -1
- package/presentation/createReactiveComponent.d.ts +1 -0
- package/presentation/createReactiveComponent.js +1 -0
- package/presentation/debugger/DebuggerPresenter.d.ts +14 -0
- package/presentation/debugger/DebuggerPresenter.js +45 -0
- package/presentation/debugger/DebuggerPresenter.js.map +1 -0
- package/presentation/debugger/abstractions.d.ts +17 -0
- package/presentation/debugger/abstractions.js +5 -0
- package/presentation/debugger/abstractions.js.map +1 -0
- package/presentation/debugger/components/DebuggerIndicator.d.ts +2 -0
- package/presentation/debugger/components/DebuggerIndicator.js +45 -0
- package/presentation/debugger/components/DebuggerIndicator.js.map +1 -0
- package/presentation/debugger/components/DebuggerView.d.ts +4 -0
- package/presentation/debugger/components/DebuggerView.js +44 -0
- package/presentation/debugger/components/DebuggerView.js.map +1 -0
- package/presentation/debugger/downloadJson.d.ts +7 -0
- package/presentation/debugger/downloadJson.js +17 -0
- package/presentation/debugger/downloadJson.js.map +1 -0
- package/presentation/debugger/feature.d.ts +3 -0
- package/presentation/debugger/feature.js +17 -0
- package/presentation/debugger/feature.js.map +1 -0
- package/presentation/debugger/routes.d.ts +4 -0
- package/presentation/debugger/routes.js +10 -0
- package/presentation/debugger/routes.js.map +1 -0
- package/presentation/installation/components/SystemInstaller/steps/AdminUserStep.js +4 -3
- package/presentation/installation/components/SystemInstaller/steps/AdminUserStep.js.map +1 -1
- package/presentation/installation/components/SystemInstaller/steps/FinishSetup/handleStartUsing.js.map +1 -1
- package/presentation/installation/presenters/SystemInstaller/SystemInstallerPresenter.js.map +1 -1
- package/presentation/listPresenter/FolderAwareDataSource.d.ts +5 -0
- package/presentation/listPresenter/FolderAwareDataSource.js +4 -3
- package/presentation/listPresenter/FolderAwareDataSource.js.map +1 -1
- package/presentation/listPresenter/QueryMatcher.d.ts +28 -5
- package/presentation/listPresenter/QueryMatcher.js +72 -2
- package/presentation/listPresenter/QueryMatcher.js.map +1 -1
- package/presentation/listPresenter/QueryMatcher.test.d.ts +1 -0
- package/presentation/listPresenter/QueryMatcher.test.js +345 -0
- package/presentation/listPresenter/QueryMatcher.test.js.map +1 -0
- package/presentation/trashBin/TrashBinPresenter.js +3 -1
- package/presentation/trashBin/TrashBinPresenter.js.map +1 -1
- package/presentation/trashBin/TrashBinPresenter.test.d.ts +1 -0
- package/presentation/trashBin/TrashBinPresenter.test.js +91 -0
- package/presentation/trashBin/TrashBinPresenter.test.js.map +1 -0
- package/presentation/trashBin/abstractions.d.ts +1 -1
- package/presentation/trashBin/abstractions.js.map +1 -1
- package/presentation/trashBin/components/BulkActions/DeleteItems.js +5 -1
- package/presentation/trashBin/components/BulkActions/DeleteItems.js.map +1 -1
- package/presentation/trashBin/components/BulkActions/DeleteItems.test.d.ts +1 -0
- package/presentation/trashBin/components/BulkActions/DeleteItems.test.js +100 -0
- package/presentation/trashBin/components/BulkActions/DeleteItems.test.js.map +1 -0
- package/presentation/trashBin/hooks/useDeleteTrashBinItem.js +2 -1
- package/presentation/trashBin/hooks/useDeleteTrashBinItem.js.map +1 -1
- package/presentation/trashBin/hooks/useDeleteTrashBinItem.test.d.ts +1 -0
- package/presentation/trashBin/hooks/useDeleteTrashBinItem.test.js +67 -0
- package/presentation/trashBin/hooks/useDeleteTrashBinItem.test.js.map +1 -0
- package/static/svg/search.43fa797c.svg +20 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker.js +0 -68
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker.js.map +0 -1
- package/features/aiChat/AiChatGateway.js.map +0 -1
- package/features/aiChat/AiChatPresenter.d.ts +0 -32
- package/features/aiChat/AiChatPresenter.js +0 -220
- package/features/aiChat/AiChatPresenter.js.map +0 -1
- package/features/aiChat/abstractions.d.ts +0 -124
- package/features/aiChat/abstractions.js +0 -6
- package/features/aiChat/abstractions.js.map +0 -1
- package/features/aiChat/feature.d.ts +0 -3
- package/features/aiChat/feature.js +0 -19
- package/features/aiChat/feature.js.map +0 -1
- package/features/aiChat/index.d.ts +0 -6
- package/features/aiChat/index.js +0 -3
- package/presentation/installation/components/SystemInstaller/steps/AdminUserStep/createPasswordValidator.d.ts +0 -8
- package/presentation/installation/components/SystemInstaller/steps/AdminUserStep/createPasswordValidator.js +0 -17
- package/presentation/installation/components/SystemInstaller/steps/AdminUserStep/createPasswordValidator.js.map +0 -1
- package/presentation/installation/components/SystemInstaller/steps/AdminUserStep/usePasswordValidator.d.ts +0 -1
- package/presentation/installation/components/SystemInstaller/steps/AdminUserStep/usePasswordValidator.js +0 -16
- package/presentation/installation/components/SystemInstaller/steps/AdminUserStep/usePasswordValidator.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"features/formModel/FieldBuilder.test.js","sources":["../../../src/features/formModel/FieldBuilder.test.ts"],"sourcesContent":["import { describe, it, expect } from \"vitest\";\nimport { z } from \"zod\";\nimport { Container } from \"@webiny/di\";\nimport { FormModelFeature } from \"./feature.js\";\nimport { FieldBuilderRegistry, type IFieldBuilderRegistry } from \"./abstractions.js\";\nimport { TextFieldBuilder } from \"./fieldTypes/TextFieldType.js\";\nimport { NumberFieldBuilder } from \"./fieldTypes/NumberFieldType.js\";\nimport { BooleanFieldBuilder } from \"./fieldTypes/BooleanFieldType.js\";\nimport { DateTimeFieldBuilder } from \"./fieldTypes/DateTimeFieldType.js\";\n\nfunction createRegistry(): IFieldBuilderRegistry {\n const container = new Container();\n FormModelFeature.register(container);\n return container.resolve(FieldBuilderRegistry);\n}\n\ndescribe(\"TextFieldBuilder\", () => {\n it(\"should build a text field config with all fluent methods\", () => {\n const builder = new TextFieldBuilder()\n .label(\"Title\")\n .placeholder(\"Enter title\")\n .required(\"Title is required\")\n .defaultValue(\"Untitled\")\n .renderer(\"custom-text\")\n .schema(z.string().min(1));\n\n const config = builder.build(\"title\");\n\n expect(config.name).toBe(\"title\");\n expect(config.type).toBe(\"text\");\n expect(config.label).toBe(\"Title\");\n expect(config.placeholder).toBe(\"Enter title\");\n expect(config.required).toBe(true);\n expect(config.requiredMessage).toBe(\"Title is required\");\n expect(config.defaultValue).toBe(\"Untitled\");\n expect(config.renderer).toBe(\"custom-text\");\n expect(config.hidden).toBe(false);\n expect(config.disabled).toBe(false);\n expect(config.schema).toBeDefined();\n });\n\n it(\"should support hidden() method\", () => {\n const config = new TextFieldBuilder().hidden().build(\"secret\");\n expect(config.hidden).toBe(true);\n });\n\n it(\"should support disabled() method\", () => {\n const config = new TextFieldBuilder().disabled().build(\"readonly\");\n expect(config.disabled).toBe(true);\n });\n\n it(\"should default disabled to false\", () => {\n const config = new TextFieldBuilder().build(\"field\");\n expect(config.disabled).toBe(false);\n });\n});\n\ndescribe(\"TextFieldBuilder - beforeChange / afterChange\", () => {\n it(\"should store beforeChange callbacks in config\", () => {\n const cb1 = (value: unknown) => value;\n const cb2 = (value: unknown) => value;\n\n const config = new TextFieldBuilder().beforeChange(cb1).beforeChange(cb2).build(\"field\");\n\n expect(config.beforeChangeCallbacks).toHaveLength(2);\n expect(config.beforeChangeCallbacks![0]).toBe(cb1);\n expect(config.beforeChangeCallbacks![1]).toBe(cb2);\n });\n\n it(\"should store afterChange callbacks in config\", () => {\n const cb = () => {};\n const config = new TextFieldBuilder().afterChange(cb).build(\"field\");\n\n expect(config.afterChangeCallbacks).toHaveLength(1);\n expect(config.afterChangeCallbacks![0]).toBe(cb);\n });\n\n it(\"should not have callback arrays when none are added\", () => {\n const config = new TextFieldBuilder().build(\"field\");\n expect(config.beforeChangeCallbacks).toBeUndefined();\n expect(config.afterChangeCallbacks).toBeUndefined();\n });\n\n it(\"should support chaining callbacks with other builder methods\", () => {\n const config = new TextFieldBuilder()\n .label(\"Title\")\n .beforeChange(value => value)\n .required(\"Required\")\n .afterChange(() => {})\n .build(\"title\");\n\n expect(config.label).toBe(\"Title\");\n expect(config.required).toBe(true);\n expect(config.beforeChangeCallbacks).toHaveLength(1);\n expect(config.afterChangeCallbacks).toHaveLength(1);\n });\n});\n\ndescribe(\"TextFieldBuilder - options\", () => {\n it(\"should build a text field config with static options\", () => {\n const options = [\n { label: \"English\", value: \"en\" },\n { label: \"German\", value: \"de\" }\n ];\n\n const config = new TextFieldBuilder()\n .label(\"Language\")\n .options(options)\n .required()\n .build(\"language\");\n\n expect(config.name).toBe(\"language\");\n expect(config.type).toBe(\"text\");\n expect(config.label).toBe(\"Language\");\n expect(config.required).toBe(true);\n expect(config.options).toEqual(options);\n expect(config.renderer).toBe(\"select\");\n });\n\n it(\"should support reactive options function\", () => {\n const optionsFn = () => [{ label: \"A\", value: \"a\" }];\n const config = new TextFieldBuilder().options(optionsFn).build(\"dynamic\");\n expect(typeof config.options).toBe(\"function\");\n });\n\n it(\"should auto-switch renderer to dropdown when options are set\", () => {\n const config = new TextFieldBuilder().options([{ label: \"A\", value: \"a\" }]).build(\"field\");\n expect(config.renderer).toBe(\"select\");\n });\n\n it(\"should not override an explicitly set renderer\", () => {\n const config = new TextFieldBuilder()\n .renderer(\"radioButtons\")\n .options([{ label: \"A\", value: \"a\" }])\n .build(\"field\");\n expect(config.renderer).toBe(\"radioButtons\");\n });\n});\n\ndescribe(\"NumberFieldBuilder - options\", () => {\n it(\"should build a number field config with options\", () => {\n const options = [\n { label: \"One\", value: \"1\" },\n { label: \"Two\", value: \"2\" }\n ];\n\n const config = new NumberFieldBuilder().label(\"Count\").options(options).build(\"count\");\n\n expect(config.type).toBe(\"number\");\n expect(config.options).toEqual(options);\n expect(config.renderer).toBe(\"select\");\n });\n\n it(\"should not override an explicitly set renderer\", () => {\n const config = new NumberFieldBuilder()\n .renderer(\"radioButtons\")\n .options([{ label: \"1\", value: \"1\" }])\n .build(\"field\");\n expect(config.renderer).toBe(\"radioButtons\");\n });\n});\n\ndescribe(\"DateTimeFieldBuilder\", () => {\n it(\"should build a datetime field with default renderer\", () => {\n const config = new DateTimeFieldBuilder().label(\"Created\").build(\"created\");\n expect(config.type).toBe(\"datetime\");\n expect(config.renderer).toBe(\"dateTimeInput\");\n expect(config.label).toBe(\"Created\");\n });\n});\n\ndescribe(\"FieldBuilderRegistry\", () => {\n it(\"should create text builders via registry.text()\", () => {\n const registry = createRegistry();\n const builder = registry.text();\n expect(builder).toBeInstanceOf(TextFieldBuilder);\n });\n\n it(\"should create number builders via registry.number()\", () => {\n const registry = createRegistry();\n const builder = registry.number();\n expect(builder).toBeInstanceOf(NumberFieldBuilder);\n });\n\n it(\"should create boolean builders via registry.boolean()\", () => {\n const registry = createRegistry();\n const builder = registry.boolean();\n expect(builder).toBeInstanceOf(BooleanFieldBuilder);\n });\n\n it(\"should create datetime builders via registry.datetime()\", () => {\n const registry = createRegistry();\n const builder = registry.datetime();\n expect(builder).toBeInstanceOf(DateTimeFieldBuilder);\n });\n\n it(\"should support chaining on registry-created builders\", () => {\n const registry = createRegistry();\n const config = registry.text().label(\"Name\").required().build(\"name\");\n expect(config.label).toBe(\"Name\");\n expect(config.required).toBe(true);\n });\n\n it(\"should support options on text builders from registry\", () => {\n const registry = createRegistry();\n const config = registry\n .text()\n .options([{ label: \"A\", value: \"a\" }])\n .build(\"field\");\n expect(config.options).toHaveLength(1);\n expect(config.renderer).toBe(\"select\");\n });\n});\n\ndescribe(\"normalizeValue\", () => {\n it(\"should be identity for TextFieldBuilder\", () => {\n const builder = new TextFieldBuilder();\n expect(builder.normalizeValue(\"hello\")).toBe(\"hello\");\n expect(builder.normalizeValue(42)).toBe(42);\n expect(builder.normalizeValue(null)).toBe(null);\n });\n\n it(\"should coerce string to number for NumberFieldBuilder\", () => {\n const builder = new NumberFieldBuilder();\n expect(builder.normalizeValue(\"42\")).toBe(42);\n expect(builder.normalizeValue(\"3.14\")).toBe(3.14);\n expect(builder.normalizeValue(\"0\")).toBe(0);\n });\n\n it(\"should return null for non-numeric values in NumberFieldBuilder\", () => {\n const builder = new NumberFieldBuilder();\n expect(builder.normalizeValue(null)).toBe(null);\n expect(builder.normalizeValue(undefined)).toBe(null);\n expect(builder.normalizeValue(\"\")).toBe(null);\n expect(builder.normalizeValue(\"abc\")).toBe(null);\n });\n\n it(\"should coerce to boolean for BooleanFieldBuilder\", () => {\n const builder = new BooleanFieldBuilder();\n expect(builder.normalizeValue(1)).toBe(true);\n expect(builder.normalizeValue(0)).toBe(false);\n expect(builder.normalizeValue(\"\")).toBe(false);\n expect(builder.normalizeValue(\"yes\")).toBe(true);\n expect(builder.normalizeValue(null)).toBe(false);\n });\n\n it(\"should be identity for DateTimeFieldBuilder\", () => {\n const builder = new DateTimeFieldBuilder();\n expect(builder.normalizeValue(\"2024-01-01\")).toBe(\"2024-01-01\");\n expect(builder.normalizeValue(null)).toBe(null);\n });\n\n it(\"should capture normalizeValue into config at build time\", () => {\n const config = new NumberFieldBuilder().label(\"Count\").build(\"count\");\n expect(config.normalizeValue).toBeDefined();\n expect(config.normalizeValue!(\"42\")).toBe(42);\n expect(config.normalizeValue!(null)).toBe(null);\n });\n});\n"],"names":["createRegistry","container","Container","FormModelFeature","FieldBuilderRegistry","describe","it","builder","TextFieldBuilder","z","config","expect","cb1","value","cb2","cb","options","optionsFn","NumberFieldBuilder","DateTimeFieldBuilder","registry","BooleanFieldBuilder","undefined"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"features/formModel/FieldBuilder.test.js","sources":["../../../src/features/formModel/FieldBuilder.test.ts"],"sourcesContent":["import { afterEach, describe, it, expect, vi } from \"vitest\";\nimport { z } from \"zod\";\nimport { Container } from \"@webiny/di\";\nimport { FormModelFeature } from \"./feature.js\";\nimport { IdentityContextFeature } from \"~/features/security/IdentityContext/feature.js\";\nimport { FieldBuilderRegistry, type IFieldBuilderRegistry } from \"./abstractions.js\";\nimport { TextFieldBuilder } from \"./fieldTypes/TextFieldType.js\";\nimport { NumberFieldBuilder } from \"./fieldTypes/NumberFieldType.js\";\nimport { BooleanFieldBuilder } from \"./fieldTypes/BooleanFieldType.js\";\nimport { DateTimeFieldBuilder } from \"./fieldTypes/DateTimeFieldType.js\";\nimport { DateFormatter } from \"~/features/dateFormatter/abstractions.js\";\n\nfunction createRegistry(): IFieldBuilderRegistry {\n const container = new Container();\n IdentityContextFeature.register(container);\n FormModelFeature.register(container);\n return container.resolve(FieldBuilderRegistry);\n}\n\ndescribe(\"TextFieldBuilder\", () => {\n it(\"should build a text field config with all fluent methods\", () => {\n const builder = new TextFieldBuilder()\n .label(\"Title\")\n .placeholder(\"Enter title\")\n .required(\"Title is required\")\n .defaultValue(\"Untitled\")\n .renderer(\"custom-text\")\n .schema(z.string().min(1));\n\n const config = builder.build(\"title\");\n\n expect(config.name).toBe(\"title\");\n expect(config.type).toBe(\"text\");\n expect(config.label).toBe(\"Title\");\n expect(config.placeholder).toBe(\"Enter title\");\n expect(config.required).toBe(true);\n expect(config.requiredMessage).toBe(\"Title is required\");\n expect(config.defaultValue).toBe(\"Untitled\");\n expect(config.renderer).toBe(\"custom-text\");\n expect(config.hidden).toBe(false);\n expect(config.disabled).toBe(false);\n expect(config.schema).toBeDefined();\n });\n\n it(\"builds the schema from a callback given zod\", async () => {\n const config = new TextFieldBuilder()\n .schema(zod => zod.string().email(\"Not a valid email\"))\n .build(\"email\");\n\n expect((await config.schema!.safeParseAsync(\"person@example.com\")).success).toBe(true);\n expect((await config.schema!.safeParseAsync(\"nope\")).error?.issues[0].message).toBe(\n \"Not a valid email\"\n );\n });\n\n it(\"should support hidden() method\", () => {\n const config = new TextFieldBuilder().hidden().build(\"secret\");\n expect(config.hidden).toBe(true);\n });\n\n it(\"should support disabled() method\", () => {\n const config = new TextFieldBuilder().disabled().build(\"readonly\");\n expect(config.disabled).toBe(true);\n });\n\n it(\"should default disabled to false\", () => {\n const config = new TextFieldBuilder().build(\"field\");\n expect(config.disabled).toBe(false);\n });\n});\n\ndescribe(\"TextFieldBuilder - beforeChange / afterChange\", () => {\n it(\"should store beforeChange callbacks in config\", () => {\n const cb1 = (value: unknown) => value;\n const cb2 = (value: unknown) => value;\n\n const config = new TextFieldBuilder().beforeChange(cb1).beforeChange(cb2).build(\"field\");\n\n expect(config.beforeChangeCallbacks).toHaveLength(2);\n expect(config.beforeChangeCallbacks![0]).toBe(cb1);\n expect(config.beforeChangeCallbacks![1]).toBe(cb2);\n });\n\n it(\"should store afterChange callbacks in config\", () => {\n const cb = () => {};\n const config = new TextFieldBuilder().afterChange(cb).build(\"field\");\n\n expect(config.afterChangeCallbacks).toHaveLength(1);\n expect(config.afterChangeCallbacks![0]).toBe(cb);\n });\n\n it(\"should not have callback arrays when none are added\", () => {\n const config = new TextFieldBuilder().build(\"field\");\n expect(config.beforeChangeCallbacks).toBeUndefined();\n expect(config.afterChangeCallbacks).toBeUndefined();\n });\n\n it(\"should support chaining callbacks with other builder methods\", () => {\n const config = new TextFieldBuilder()\n .label(\"Title\")\n .beforeChange(value => value)\n .required(\"Required\")\n .afterChange(() => {})\n .build(\"title\");\n\n expect(config.label).toBe(\"Title\");\n expect(config.required).toBe(true);\n expect(config.beforeChangeCallbacks).toHaveLength(1);\n expect(config.afterChangeCallbacks).toHaveLength(1);\n });\n});\n\ndescribe(\"TextFieldBuilder - options\", () => {\n it(\"should build a text field config with static options\", () => {\n const options = [\n { label: \"English\", value: \"en\" },\n { label: \"German\", value: \"de\" }\n ];\n\n const config = new TextFieldBuilder()\n .label(\"Language\")\n .options(options)\n .required()\n .build(\"language\");\n\n expect(config.name).toBe(\"language\");\n expect(config.type).toBe(\"text\");\n expect(config.label).toBe(\"Language\");\n expect(config.required).toBe(true);\n expect(config.options).toEqual(options);\n expect(config.renderer).toBe(\"select\");\n });\n\n it(\"should support reactive options function\", () => {\n const optionsFn = () => [{ label: \"A\", value: \"a\" }];\n const config = new TextFieldBuilder().options(optionsFn).build(\"dynamic\");\n expect(typeof config.options).toBe(\"function\");\n });\n\n it(\"should auto-switch renderer to dropdown when options are set\", () => {\n const config = new TextFieldBuilder().options([{ label: \"A\", value: \"a\" }]).build(\"field\");\n expect(config.renderer).toBe(\"select\");\n });\n\n it(\"should not override an explicitly set renderer\", () => {\n const config = new TextFieldBuilder()\n .renderer(\"radioButtons\")\n .options([{ label: \"A\", value: \"a\" }])\n .build(\"field\");\n expect(config.renderer).toBe(\"radioButtons\");\n });\n});\n\ndescribe(\"NumberFieldBuilder - options\", () => {\n it(\"should build a number field config with options\", () => {\n const options = [\n { label: \"One\", value: \"1\" },\n { label: \"Two\", value: \"2\" }\n ];\n\n const config = new NumberFieldBuilder().label(\"Count\").options(options).build(\"count\");\n\n expect(config.type).toBe(\"number\");\n expect(config.options).toEqual(options);\n expect(config.renderer).toBe(\"select\");\n });\n\n it(\"should not override an explicitly set renderer\", () => {\n const config = new NumberFieldBuilder()\n .renderer(\"radioButtons\")\n .options([{ label: \"1\", value: \"1\" }])\n .build(\"field\");\n expect(config.renderer).toBe(\"radioButtons\");\n });\n});\n\ndescribe(\"DateTimeFieldBuilder\", () => {\n it(\"should build a datetime field with default renderer\", () => {\n const config = new DateTimeFieldBuilder().label(\"Created\").build(\"created\");\n expect(config.type).toBe(\"datetime\");\n expect(config.renderer).toBe(\"dateTimeInput\");\n expect(config.label).toBe(\"Created\");\n });\n\n it(\"keeps the list renderer when a subtype is set after list()\", () => {\n const subtypes = [\n (b: DateTimeFieldBuilder) => b.dateOnly(),\n (b: DateTimeFieldBuilder) => b.timeOnly(),\n (b: DateTimeFieldBuilder) => b.withTimezone(),\n (b: DateTimeFieldBuilder) => b.withoutTimezone()\n ];\n for (const subtype of subtypes) {\n expect(subtype(new DateTimeFieldBuilder().list()).build(\"d\").renderer).toBe(\n \"dateTimeInputs\"\n );\n expect(subtype(new DateTimeFieldBuilder()).build(\"d\").renderer).toBe(\"dateTimeInput\");\n }\n });\n\n it(\"renders a date-only field with the birthday picker\", () => {\n const config = new DateTimeFieldBuilder().dateOnly().renderer(\"birthdayInput\").build(\"dob\");\n expect(config.renderer).toBe(\"birthdayInput\");\n expect(config.rendererSettings).toBeUndefined();\n });\n\n it(\"keeps a birthday picker set before dateOnly() and drops it for other subtypes\", () => {\n const birthday = () => new DateTimeFieldBuilder().renderer(\"birthdayInput\");\n const dateOnly = birthday().dateOnly().build(\"dob\");\n expect(dateOnly.renderer).toBe(\"birthdayInput\");\n expect(dateOnly.rendererSettings).toEqual({ type: \"date\" });\n\n expect(birthday().timeOnly().build(\"t\").renderer).toBe(\"dateTimeInput\");\n });\n\n describe(\"date limits\", () => {\n afterEach(() => {\n vi.useRealTimers();\n });\n\n const isValid = async (config: { schema?: z.ZodTypeAny }, value: unknown) =>\n (await config.schema!.safeParseAsync(value)).success;\n\n it(\"hands fixed and relative limits to the renderer, whatever the call order\", () => {\n const config = new DateTimeFieldBuilder()\n .dateOnly()\n .dateGte(\"1900-01-01\")\n .dateLte({ expression: \"today-18y\" })\n .renderer(\"birthdayInput\")\n .build(\"dob\");\n expect(config.rendererSettings).toEqual({\n dateLimits: { gte: [\"1900-01-01\"], lte: [{ expression: \"today-18y\" }] }\n });\n });\n\n it(\"checks a value against fixed limits with their messages\", async () => {\n const config = new DateTimeFieldBuilder()\n .dateOnly()\n .dateGte(\"1950-01-01\", \"Too early.\")\n .dateLte(\"2000-12-31\", \"Too late.\")\n .build(\"d\");\n expect(await isValid(config, \"1975-06-15\")).toBe(true);\n expect(await isValid(config, \"1950-01-01\")).toBe(true);\n expect(await isValid(config, \"2000-12-31\")).toBe(true);\n\n const late = await config.schema!.safeParseAsync(\"2005-01-01\");\n expect(late.success).toBe(false);\n expect(late.error?.issues[0].message).toBe(\"Too late.\");\n\n const early = await config.schema!.safeParseAsync(\"1949-12-31\");\n expect(early.error?.issues[0].message).toBe(\"Too early.\");\n });\n\n it(\"works out an expression against the local date at the moment of the check\", async () => {\n vi.useFakeTimers();\n vi.setSystemTime(new Date(2026, 9, 19, 12));\n const config = new DateTimeFieldBuilder()\n .dateOnly()\n .dateLte({ expression: \"today-18y\" })\n .build(\"dob\");\n expect(await isValid(config, \"2008-10-19\")).toBe(true);\n expect(await isValid(config, \"2008-10-20\")).toBe(false);\n\n const message = (await config.schema!.safeParseAsync(\"2008-10-20\")).error?.issues[0]\n .message;\n expect(message).toBe(\"Must be on or before 2008-10-19.\");\n\n // The next day, the same form allows the next birthday.\n vi.setSystemTime(new Date(2026, 9, 20, 12));\n expect(await isValid(config, \"2008-10-20\")).toBe(true);\n });\n\n it(\"puts the limit into a message's {date} in the admin's date format\", async () => {\n vi.useFakeTimers();\n vi.setSystemTime(new Date(2026, 9, 19, 12));\n const formatter = { format: vi.fn((date: unknown) => `formatted ${date}`) };\n const message = async (builder: DateTimeFieldBuilder, value: string) =>\n (await builder.build(\"d\").schema!.safeParseAsync(value)).error?.issues[0].message;\n\n expect(\n await message(\n new DateTimeFieldBuilder(formatter)\n .dateOnly()\n .dateLte({ expression: \"today-18y\" }, \"Born on or before {date}, please.\"),\n \"2010-01-01\"\n )\n ).toBe(\"Born on or before formatted 2008-10-19, please.\");\n // A date-only limit is shown without a time, and in UTC so it keeps its day.\n expect(formatter.format).toHaveBeenLastCalledWith(\"2008-10-19\", {\n hour: undefined,\n minute: undefined,\n timeZone: \"UTC\"\n });\n\n expect(\n await message(\n new DateTimeFieldBuilder(formatter).dateOnly().dateGte(\"1950-01-01\"),\n \"1949-12-31\"\n )\n ).toBe(\"Must be on or after formatted 1950-01-01.\");\n\n // A time has no date to format.\n expect(\n await message(\n new DateTimeFieldBuilder(formatter).timeOnly().dateLte(\"12:00:00\"),\n \"13:00:00\"\n )\n ).toBe(\"Must be on or before 12:00:00.\");\n });\n\n it(\"formats {date} with the registered DateFormatter\", async () => {\n const container = new Container();\n container.registerInstance(DateFormatter, {\n format: (date: unknown) => `formatted ${date}`\n });\n IdentityContextFeature.register(container);\n FormModelFeature.register(container);\n const registry = container.resolve(FieldBuilderRegistry);\n const config = registry.datetime().dateOnly().dateLte(\"2000-12-31\").build(\"d\");\n const result = await config.schema!.safeParseAsync(\"2005-01-01\");\n expect(result.error?.issues[0].message).toBe(\n \"Must be on or before formatted 2000-12-31.\"\n );\n });\n\n it(\"keeps the field's own schema\", async () => {\n const config = new DateTimeFieldBuilder()\n .dateOnly()\n .dateLte(\"2000-12-31\")\n .schema(z.string().regex(/^19/, \"Must be in the 1900s.\"))\n .build(\"d\");\n expect(await isValid(config, \"1990-01-01\")).toBe(true);\n const result = await config.schema!.safeParseAsync(\"2000-01-01\");\n expect(result.error?.issues[0].message).toBe(\"Must be in the 1900s.\");\n expect(await isValid(config, \"2005-01-01\")).toBe(false);\n });\n\n it(\"checks every value of a list and lets an empty value through\", async () => {\n const config = new DateTimeFieldBuilder()\n .list()\n .dateOnly()\n .dateGte(\"2000-01-01\")\n .build(\"d\");\n expect(await isValid(config, [\"2001-01-01\", \"2002-01-01\"])).toBe(true);\n expect(await isValid(config, [\"2001-01-01\", \"1999-01-01\"])).toBe(false);\n expect(await isValid(config, \"\")).toBe(true);\n });\n\n it(\"fails a value checked against an expression it can't read\", async () => {\n const config = new DateTimeFieldBuilder()\n .dateOnly()\n .dateLte({ expression: \"now-18y\" })\n .build(\"d\");\n const result = await config.schema!.safeParseAsync(\"2000-01-01\");\n expect(result.error?.issues[0].message).toBe('Invalid date limit \"now-18y\".');\n });\n\n it(\"leaves a field without limits as it was\", () => {\n const config = new DateTimeFieldBuilder().dateOnly().build(\"d\");\n expect(config.schema).toBeUndefined();\n expect(config.rendererSettings).toEqual({ type: \"date\" });\n });\n });\n\n it(\"normalizes withTimezone values\", () => {\n const builder = new DateTimeFieldBuilder().withTimezone();\n expect(builder.normalizeValue(\"2026-05-01T14:30:00+02:00\")).toBe(\n \"2026-05-01T14:30:00+02:00\"\n );\n expect(builder.normalizeValue(\"2026-05-01T14:30-05:30\")).toBe(\"2026-05-01T14:30:00-05:30\");\n expect(builder.normalizeValue(\"2026-05-01T09:00:00.000Z\")).toBe(\n \"2026-05-01T09:00:00.000+00:00\"\n );\n expect(builder.normalizeValue(\"2026-05-01T14:30:00\")).toBe(\"2026-05-01T14:30:00\");\n });\n\n it(\"normalizes withoutTimezone values to a stable UTC instant\", () => {\n const builder = new DateTimeFieldBuilder().withoutTimezone();\n const value = \"2026-05-01T12:30:00.000Z\";\n expect(builder.normalizeValue(value)).toBe(value);\n expect(builder.normalizeValue(builder.normalizeValue(value))).toBe(value);\n });\n});\n\ndescribe(\"FieldBuilderRegistry\", () => {\n it(\"should create text builders via registry.text()\", () => {\n const registry = createRegistry();\n const builder = registry.text();\n expect(builder).toBeInstanceOf(TextFieldBuilder);\n });\n\n it(\"should create number builders via registry.number()\", () => {\n const registry = createRegistry();\n const builder = registry.number();\n expect(builder).toBeInstanceOf(NumberFieldBuilder);\n });\n\n it(\"should create boolean builders via registry.boolean()\", () => {\n const registry = createRegistry();\n const builder = registry.boolean();\n expect(builder).toBeInstanceOf(BooleanFieldBuilder);\n });\n\n it(\"should create datetime builders via registry.datetime()\", () => {\n const registry = createRegistry();\n const builder = registry.datetime();\n expect(builder).toBeInstanceOf(DateTimeFieldBuilder);\n });\n\n it(\"should support chaining on registry-created builders\", () => {\n const registry = createRegistry();\n const config = registry.text().label(\"Name\").required().build(\"name\");\n expect(config.label).toBe(\"Name\");\n expect(config.required).toBe(true);\n });\n\n it(\"should support options on text builders from registry\", () => {\n const registry = createRegistry();\n const config = registry\n .text()\n .options([{ label: \"A\", value: \"a\" }])\n .build(\"field\");\n expect(config.options).toHaveLength(1);\n expect(config.renderer).toBe(\"select\");\n });\n});\n\ndescribe(\"normalizeValue\", () => {\n it(\"should be identity for TextFieldBuilder\", () => {\n const builder = new TextFieldBuilder();\n expect(builder.normalizeValue(\"hello\")).toBe(\"hello\");\n expect(builder.normalizeValue(42)).toBe(42);\n expect(builder.normalizeValue(null)).toBe(null);\n });\n\n it(\"should coerce string to number for NumberFieldBuilder\", () => {\n const builder = new NumberFieldBuilder();\n expect(builder.normalizeValue(\"42\")).toBe(42);\n expect(builder.normalizeValue(\"3.14\")).toBe(3.14);\n expect(builder.normalizeValue(\"0\")).toBe(0);\n });\n\n it(\"should return null for non-numeric values in NumberFieldBuilder\", () => {\n const builder = new NumberFieldBuilder();\n expect(builder.normalizeValue(null)).toBe(null);\n expect(builder.normalizeValue(undefined)).toBe(null);\n expect(builder.normalizeValue(\"\")).toBe(null);\n expect(builder.normalizeValue(\"abc\")).toBe(null);\n });\n\n it(\"should coerce to boolean for BooleanFieldBuilder\", () => {\n const builder = new BooleanFieldBuilder();\n expect(builder.normalizeValue(1)).toBe(true);\n expect(builder.normalizeValue(0)).toBe(false);\n expect(builder.normalizeValue(\"\")).toBe(false);\n expect(builder.normalizeValue(\"yes\")).toBe(true);\n expect(builder.normalizeValue(null)).toBe(false);\n });\n\n it(\"should be identity for DateTimeFieldBuilder\", () => {\n const builder = new DateTimeFieldBuilder();\n expect(builder.normalizeValue(\"2024-01-01\")).toBe(\"2024-01-01\");\n expect(builder.normalizeValue(null)).toBe(null);\n });\n\n it(\"should capture normalizeValue into config at build time\", () => {\n const config = new NumberFieldBuilder().label(\"Count\").build(\"count\");\n expect(config.normalizeValue).toBeDefined();\n expect(config.normalizeValue!(\"42\")).toBe(42);\n expect(config.normalizeValue!(null)).toBe(null);\n });\n});\n"],"names":["createRegistry","container","Container","IdentityContextFeature","FormModelFeature","FieldBuilderRegistry","describe","it","builder","TextFieldBuilder","z","config","expect","zod","cb1","value","cb2","cb","options","optionsFn","NumberFieldBuilder","DateTimeFieldBuilder","subtypes","b","subtype","birthday","dateOnly","afterEach","vi","isValid","late","early","Date","message","formatter","date","undefined","DateFormatter","registry","result","BooleanFieldBuilder"],"mappings":"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"}
|
|
@@ -62,15 +62,22 @@ class FocusManager {
|
|
|
62
62
|
resolveChildScope(field, segments) {
|
|
63
63
|
const nextSegment = segments[1];
|
|
64
64
|
if (field.isList) {
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
const item = field.items[index];
|
|
65
|
+
if (/^\d+$/.test(nextSegment)) {
|
|
66
|
+
const item = field.items[parseInt(nextSegment, 10)];
|
|
68
67
|
if (!item) return null;
|
|
69
68
|
return {
|
|
70
69
|
segments: segments.slice(2),
|
|
71
70
|
children: item.children
|
|
72
71
|
};
|
|
73
72
|
}
|
|
73
|
+
const item = field.items.find((candidate)=>{
|
|
74
|
+
const idField = candidate.children.get("_id");
|
|
75
|
+
return idField ? idField.getValue() === nextSegment : false;
|
|
76
|
+
});
|
|
77
|
+
if (item) return {
|
|
78
|
+
segments: segments.slice(2),
|
|
79
|
+
children: item.children
|
|
80
|
+
};
|
|
74
81
|
}
|
|
75
82
|
return {
|
|
76
83
|
segments: segments.slice(1),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"features/formModel/FocusManager.js","sources":["../../../src/features/formModel/FocusManager.ts"],"sourcesContent":["import { isObjectField } from \"./ObjectField.js\";\nimport { LayoutBuilderFactory } from \"./LayoutBuilderFactory.js\";\nimport type { IField, IObjectField, LayoutNode, IObjectNode } from \"./abstractions.js\";\n\nexport interface TabActivation {\n tabKey: string;\n tabId: string;\n}\n\nexport class FocusManager {\n constructor(private _fields: Map<string, IField>) {}\n\n buildFocusPath(name: string, layout: LayoutNode[]): TabActivation[] | null {\n const segments = name.split(\".\");\n return this.walkLayout(layout, segments, this._fields);\n }\n\n private walkLayout(\n layout: LayoutNode[],\n segments: string[],\n fieldScope: Map<string, IField>\n ): TabActivation[] | null {\n const target = segments[0];\n\n for (const node of layout) {\n switch (node.type) {\n case \"row\": {\n if (!node.fieldIds.includes(target)) {\n break;\n }\n return this.diveIntoField(target, segments, fieldScope);\n }\n case \"object\": {\n if (node.fieldName !== target) {\n break;\n }\n return this.diveIntoObjectNode(node, segments, fieldScope);\n }\n case \"tabs\": {\n const tabKey = node.id || LayoutBuilderFactory.tabsNodeKey(node);\n for (const tab of node.tabs) {\n const result = this.walkLayout(tab.layout, segments, fieldScope);\n if (result !== null) {\n return [{ tabKey, tabId: tab.id }, ...result];\n }\n }\n break;\n }\n }\n }\n return null;\n }\n\n private diveIntoField(\n fieldName: string,\n segments: string[],\n fieldScope: Map<string, IField>\n ): TabActivation[] | null {\n if (segments.length === 1) {\n return [];\n }\n const field = fieldScope.get(fieldName);\n if (!field || !isObjectField(field)) {\n return [];\n }\n const childScope = this.resolveChildScope(field, segments);\n if (!childScope) {\n return [];\n }\n const inner = field.getInnerLayout();\n if (!inner) {\n return [];\n }\n return this.walkLayout(inner, childScope.segments, childScope.children);\n }\n\n private diveIntoObjectNode(\n node: IObjectNode,\n segments: string[],\n fieldScope: Map<string, IField>\n ): TabActivation[] | null {\n if (segments.length === 1) {\n return [];\n }\n const field = fieldScope.get(node.fieldName);\n if (!field || !isObjectField(field)) {\n return [];\n }\n const childScope = this.resolveChildScope(field, segments);\n if (!childScope) {\n return [];\n }\n const inner = Array.isArray(node.inner)\n ? node.inner\n : field.activeTemplateId\n ? (node.inner[field.activeTemplateId] ?? null)\n : null;\n if (!inner) {\n const stored = field.getInnerLayout();\n if (!stored) {\n return [];\n }\n return this.walkLayout(stored, childScope.segments, childScope.children);\n }\n return this.walkLayout(inner, childScope.segments, childScope.children);\n }\n\n private resolveChildScope(\n field: IObjectField,\n segments: string[]\n ): { segments: string[]; children: Map<string, IField> } | null {\n const nextSegment = segments[1];\n if (field.isList) {\n
|
|
1
|
+
{"version":3,"file":"features/formModel/FocusManager.js","sources":["../../../src/features/formModel/FocusManager.ts"],"sourcesContent":["import { isObjectField } from \"./ObjectField.js\";\nimport { LayoutBuilderFactory } from \"./LayoutBuilderFactory.js\";\nimport type { IField, IObjectField, LayoutNode, IObjectNode } from \"./abstractions.js\";\n\nexport interface TabActivation {\n tabKey: string;\n tabId: string;\n}\n\nexport class FocusManager {\n constructor(private _fields: Map<string, IField>) {}\n\n buildFocusPath(name: string, layout: LayoutNode[]): TabActivation[] | null {\n const segments = name.split(\".\");\n return this.walkLayout(layout, segments, this._fields);\n }\n\n private walkLayout(\n layout: LayoutNode[],\n segments: string[],\n fieldScope: Map<string, IField>\n ): TabActivation[] | null {\n const target = segments[0];\n\n for (const node of layout) {\n switch (node.type) {\n case \"row\": {\n if (!node.fieldIds.includes(target)) {\n break;\n }\n return this.diveIntoField(target, segments, fieldScope);\n }\n case \"object\": {\n if (node.fieldName !== target) {\n break;\n }\n return this.diveIntoObjectNode(node, segments, fieldScope);\n }\n case \"tabs\": {\n const tabKey = node.id || LayoutBuilderFactory.tabsNodeKey(node);\n for (const tab of node.tabs) {\n const result = this.walkLayout(tab.layout, segments, fieldScope);\n if (result !== null) {\n return [{ tabKey, tabId: tab.id }, ...result];\n }\n }\n break;\n }\n }\n }\n return null;\n }\n\n private diveIntoField(\n fieldName: string,\n segments: string[],\n fieldScope: Map<string, IField>\n ): TabActivation[] | null {\n if (segments.length === 1) {\n return [];\n }\n const field = fieldScope.get(fieldName);\n if (!field || !isObjectField(field)) {\n return [];\n }\n const childScope = this.resolveChildScope(field, segments);\n if (!childScope) {\n return [];\n }\n const inner = field.getInnerLayout();\n if (!inner) {\n return [];\n }\n return this.walkLayout(inner, childScope.segments, childScope.children);\n }\n\n private diveIntoObjectNode(\n node: IObjectNode,\n segments: string[],\n fieldScope: Map<string, IField>\n ): TabActivation[] | null {\n if (segments.length === 1) {\n return [];\n }\n const field = fieldScope.get(node.fieldName);\n if (!field || !isObjectField(field)) {\n return [];\n }\n const childScope = this.resolveChildScope(field, segments);\n if (!childScope) {\n return [];\n }\n const inner = Array.isArray(node.inner)\n ? node.inner\n : field.activeTemplateId\n ? (node.inner[field.activeTemplateId] ?? null)\n : null;\n if (!inner) {\n const stored = field.getInnerLayout();\n if (!stored) {\n return [];\n }\n return this.walkLayout(stored, childScope.segments, childScope.children);\n }\n return this.walkLayout(inner, childScope.segments, childScope.children);\n }\n\n private resolveChildScope(\n field: IObjectField,\n segments: string[]\n ): { segments: string[]; children: Map<string, IField> } | null {\n const nextSegment = segments[1];\n if (field.isList) {\n // A list field is followed by an item selector: a numeric index, or a stable\n // alphanumeric `_id` (matched against each item's hidden `_id` child value).\n if (/^\\d+$/.test(nextSegment)) {\n const item = field.items[parseInt(nextSegment, 10)];\n if (!item) {\n return null;\n }\n return { segments: segments.slice(2), children: item.children };\n }\n const item = field.items.find(candidate => {\n const idField = candidate.children.get(\"_id\");\n return idField ? idField.getValue() === nextSegment : false;\n });\n if (item) {\n return { segments: segments.slice(2), children: item.children };\n }\n // No item matched — treat the segment as a child field name (legacy locators).\n }\n return { segments: segments.slice(1), children: field.children };\n }\n}\n"],"names":["FocusManager","_fields","name","layout","segments","fieldScope","target","node","tabKey","LayoutBuilderFactory","tab","result","fieldName","field","isObjectField","childScope","inner","Array","stored","nextSegment","item","parseInt","candidate","idField"],"mappings":"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"}
|
|
@@ -29,7 +29,7 @@ const FormErrors = observer(({ form, className })=>{
|
|
|
29
29
|
type: "button",
|
|
30
30
|
className: "underline cursor-pointer",
|
|
31
31
|
onClick: ()=>form.focusField(error.path)
|
|
32
|
-
}, error.breadcrumb ? error.breadcrumb.join(" › ") : error.label ?? error.path) : error.label, ": ", error.message)))));
|
|
32
|
+
}, error.breadcrumb ? error.breadcrumb.join(" › ") : error.label ?? error.path) : error.label, error.path || error.label ? ": " : "", error.message)))));
|
|
33
33
|
});
|
|
34
34
|
export { FormErrors };
|
|
35
35
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"features/formModel/FormErrors.js","sources":["../../../src/features/formModel/FormErrors.tsx"],"sourcesContent":["import React, { useEffect, useRef } from \"react\";\nimport { observer } from \"mobx-react-lite\";\nimport { Alert, Heading } from \"@webiny/admin-ui\";\nimport type { IFormVM } from \"./abstractions.js\";\n\ninterface FormErrorsProps {\n form: IFormVM;\n className?: string;\n}\n\nexport const FormErrors = observer(({ form, className }: FormErrorsProps) => {\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (form.submitCount > 0 && form.errors.length > 0 && ref.current) {\n ref.current.scrollIntoView({ behavior: \"smooth\", block: \"center\" });\n }\n }, [form.submitCount]);\n\n if (!form.hasErrors) {\n return null;\n }\n\n return (\n <div ref={ref} className={className}>\n <Alert type=\"danger\" variant=\"subtle\">\n <Heading level={6}>Some fields contain errors</Heading>\n <ul className=\"list-disc mt-sm\">\n {form.errors.map((error, index) => (\n <li key={index} className={\"my-xs\"}>\n {error.path ? (\n <button\n type=\"button\"\n className=\"underline cursor-pointer\"\n onClick={() => form.focusField(error.path)}\n >\n {error.breadcrumb\n ? error.breadcrumb.join(\" › \")\n : (error.label ?? error.path)}\n </button>\n ) : (\n error.label\n )}\n : {error.message}\n </li>\n ))}\n </ul>\n </Alert>\n </div>\n );\n});\n"],"names":["FormErrors","observer","form","className","ref","useRef","useEffect","Alert","Heading","error","index"],"mappings":";;;AAUO,MAAMA,aAAaC,SAAS,CAAC,EAAEC,IAAI,EAAEC,SAAS,EAAmB;IACpE,MAAMC,MAAMC,OAAuB;IAEnCC,UAAU;QACN,IAAIJ,KAAK,WAAW,GAAG,KAAKA,KAAK,MAAM,CAAC,MAAM,GAAG,KAAKE,IAAI,OAAO,EAC7DA,IAAI,OAAO,CAAC,cAAc,CAAC;YAAE,UAAU;YAAU,OAAO;QAAS;IAEzE,GAAG;QAACF,KAAK,WAAW;KAAC;IAErB,IAAI,CAACA,KAAK,SAAS,EACf,OAAO;IAGX,OAAO,WAAP,GACI,oBAAC;QAAI,KAAKE;QAAK,WAAWD;qBACtB,oBAACI,OAAKA;QAAC,MAAK;QAAS,SAAQ;qBACzB,oBAACC,SAAOA;QAAC,OAAO;OAAG,6CACnB,oBAAC;QAAG,WAAU;OACTN,KAAK,MAAM,CAAC,GAAG,CAAC,CAACO,OAAOC,QAAAA,WAAAA,GACrB,oBAAC;YAAG,KAAKA;YAAO,WAAW;WACtBD,MAAM,IAAI,GAAG,WAAH,GACP,oBAAC;YACG,MAAK;YACL,WAAU;YACV,SAAS,IAAMP,KAAK,UAAU,CAACO,MAAM,IAAI;WAExCA,MAAM,UAAU,GACXA,MAAM,UAAU,CAAC,IAAI,CAAC,SACrBA,MAAM,KAAK,IAAIA,MAAM,IAAI,IAGpCA,MAAM,KAAK,
|
|
1
|
+
{"version":3,"file":"features/formModel/FormErrors.js","sources":["../../../src/features/formModel/FormErrors.tsx"],"sourcesContent":["import React, { useEffect, useRef } from \"react\";\nimport { observer } from \"mobx-react-lite\";\nimport { Alert, Heading } from \"@webiny/admin-ui\";\nimport type { IFormVM } from \"./abstractions.js\";\n\ninterface FormErrorsProps {\n form: IFormVM;\n className?: string;\n}\n\nexport const FormErrors = observer(({ form, className }: FormErrorsProps) => {\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (form.submitCount > 0 && form.errors.length > 0 && ref.current) {\n ref.current.scrollIntoView({ behavior: \"smooth\", block: \"center\" });\n }\n }, [form.submitCount]);\n\n if (!form.hasErrors) {\n return null;\n }\n\n return (\n <div ref={ref} className={className}>\n <Alert type=\"danger\" variant=\"subtle\">\n <Heading level={6}>Some fields contain errors</Heading>\n <ul className=\"list-disc mt-sm\">\n {form.errors.map((error, index) => (\n <li key={index} className={\"my-xs\"}>\n {error.path ? (\n <button\n type=\"button\"\n className=\"underline cursor-pointer\"\n onClick={() => form.focusField(error.path)}\n >\n {error.breadcrumb\n ? error.breadcrumb.join(\" › \")\n : (error.label ?? error.path)}\n </button>\n ) : (\n error.label\n )}\n {error.path || error.label ? \": \" : \"\"}\n {error.message}\n </li>\n ))}\n </ul>\n </Alert>\n </div>\n );\n});\n"],"names":["FormErrors","observer","form","className","ref","useRef","useEffect","Alert","Heading","error","index"],"mappings":";;;AAUO,MAAMA,aAAaC,SAAS,CAAC,EAAEC,IAAI,EAAEC,SAAS,EAAmB;IACpE,MAAMC,MAAMC,OAAuB;IAEnCC,UAAU;QACN,IAAIJ,KAAK,WAAW,GAAG,KAAKA,KAAK,MAAM,CAAC,MAAM,GAAG,KAAKE,IAAI,OAAO,EAC7DA,IAAI,OAAO,CAAC,cAAc,CAAC;YAAE,UAAU;YAAU,OAAO;QAAS;IAEzE,GAAG;QAACF,KAAK,WAAW;KAAC;IAErB,IAAI,CAACA,KAAK,SAAS,EACf,OAAO;IAGX,OAAO,WAAP,GACI,oBAAC;QAAI,KAAKE;QAAK,WAAWD;qBACtB,oBAACI,OAAKA;QAAC,MAAK;QAAS,SAAQ;qBACzB,oBAACC,SAAOA;QAAC,OAAO;OAAG,6CACnB,oBAAC;QAAG,WAAU;OACTN,KAAK,MAAM,CAAC,GAAG,CAAC,CAACO,OAAOC,QAAAA,WAAAA,GACrB,oBAAC;YAAG,KAAKA;YAAO,WAAW;WACtBD,MAAM,IAAI,GAAG,WAAH,GACP,oBAAC;YACG,MAAK;YACL,WAAU;YACV,SAAS,IAAMP,KAAK,UAAU,CAACO,MAAM,IAAI;WAExCA,MAAM,UAAU,GACXA,MAAM,UAAU,CAAC,IAAI,CAAC,SACrBA,MAAM,KAAK,IAAIA,MAAM,IAAI,IAGpCA,MAAM,KAAK,EAEdA,MAAM,IAAI,IAAIA,MAAM,KAAK,GAAG,OAAO,IACnCA,MAAM,OAAO;AAO1C"}
|
|
@@ -9,6 +9,7 @@ export declare class FormModel implements IFormModel {
|
|
|
9
9
|
private _validateOnChange;
|
|
10
10
|
private _isValid;
|
|
11
11
|
private _formRuleErrors;
|
|
12
|
+
private _externalErrorFields;
|
|
12
13
|
private _activeTabs;
|
|
13
14
|
private _ruleEvaluators;
|
|
14
15
|
private _warnedRuleTypes;
|
|
@@ -42,6 +43,7 @@ export declare class FormModel implements IFormModel {
|
|
|
42
43
|
addRule(rule: FormRule): void;
|
|
43
44
|
setLayout(factory: (layout: ILayoutBuilder) => ILayoutNodeBuilder[]): void;
|
|
44
45
|
validate(): Promise<boolean>;
|
|
46
|
+
setErrors(errors: IFormError[]): void;
|
|
45
47
|
submit<T = Record<string, unknown>>(options?: {
|
|
46
48
|
skipValidation?: boolean;
|
|
47
49
|
}): Promise<T | false>;
|
|
@@ -16,6 +16,7 @@ class FormModel {
|
|
|
16
16
|
this._validateOnChange = false;
|
|
17
17
|
this._isValid = null;
|
|
18
18
|
this._formRuleErrors = [];
|
|
19
|
+
this._externalErrorFields = new Set();
|
|
19
20
|
this._activeTabs = observable.map();
|
|
20
21
|
this._ruleEvaluators = [];
|
|
21
22
|
this._warnedRuleTypes = new Set();
|
|
@@ -89,15 +90,13 @@ class FormModel {
|
|
|
89
90
|
let current = this._fields.get(parts[0]);
|
|
90
91
|
for(let i = 1; i < parts.length && current; i++)if (isObjectField(current)) {
|
|
91
92
|
if (current.isList) {
|
|
92
|
-
const
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
continue;
|
|
100
|
-
}
|
|
93
|
+
const selector = parts[i];
|
|
94
|
+
const item = /^\d+$/.test(selector) ? current.items[parseInt(selector, 10)] : current.items.find((candidate)=>candidate.children.get("_id")?.getValue() === selector);
|
|
95
|
+
if (item && i + 1 < parts.length) {
|
|
96
|
+
current = item.children.get(parts[i + 1]);
|
|
97
|
+
i++;
|
|
98
|
+
} else current = void 0;
|
|
99
|
+
continue;
|
|
101
100
|
}
|
|
102
101
|
current = current.getChild(parts[i]);
|
|
103
102
|
} else current = void 0;
|
|
@@ -168,6 +167,7 @@ class FormModel {
|
|
|
168
167
|
this._submitCount = 0;
|
|
169
168
|
this._isValid = null;
|
|
170
169
|
this._formRuleErrors = [];
|
|
170
|
+
this._externalErrorFields.clear();
|
|
171
171
|
}
|
|
172
172
|
reset() {
|
|
173
173
|
for (const [name, field] of this._fields){
|
|
@@ -179,6 +179,7 @@ class FormModel {
|
|
|
179
179
|
this._submitCount = 0;
|
|
180
180
|
this._isValid = null;
|
|
181
181
|
this._formRuleErrors = [];
|
|
182
|
+
this._externalErrorFields.clear();
|
|
182
183
|
}
|
|
183
184
|
get isDirty() {
|
|
184
185
|
for (const [name, field] of this._fields){
|
|
@@ -252,6 +253,7 @@ class FormModel {
|
|
|
252
253
|
this._propagateAncestorRules();
|
|
253
254
|
}
|
|
254
255
|
async validate() {
|
|
256
|
+
this._externalErrorFields.clear();
|
|
255
257
|
let allFieldsValid = true;
|
|
256
258
|
for (const [, field] of this._fields){
|
|
257
259
|
const valid = await field.validate({
|
|
@@ -282,6 +284,27 @@ class FormModel {
|
|
|
282
284
|
});
|
|
283
285
|
return isValid;
|
|
284
286
|
}
|
|
287
|
+
setErrors(errors) {
|
|
288
|
+
const formErrors = [];
|
|
289
|
+
runInAction(()=>{
|
|
290
|
+
for (const field of this._externalErrorFields)field.resetValidation();
|
|
291
|
+
this._externalErrorFields.clear();
|
|
292
|
+
for (const error of errors){
|
|
293
|
+
const field = error.path ? this._tryGetField(error.path) : void 0;
|
|
294
|
+
if (field?.visible) {
|
|
295
|
+
field.setValidation({
|
|
296
|
+
isValid: false,
|
|
297
|
+
message: error.message
|
|
298
|
+
});
|
|
299
|
+
this._externalErrorFields.add(field);
|
|
300
|
+
} else formErrors.push(error);
|
|
301
|
+
}
|
|
302
|
+
this._formRuleErrors = formErrors;
|
|
303
|
+
this._isValid = 0 === errors.length;
|
|
304
|
+
this._submitted = true;
|
|
305
|
+
this._submitCount++;
|
|
306
|
+
});
|
|
307
|
+
}
|
|
285
308
|
async submit(options) {
|
|
286
309
|
if (options?.skipValidation) return this.getData();
|
|
287
310
|
const valid = await this.validate();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"features/formModel/FormModel.js","sources":["../../../src/features/formModel/FormModel.ts"],"sourcesContent":["import { makeAutoObservable, computed, toJS, runInAction, observable } from \"mobx\";\nimport { Field } from \"./Field.js\";\nimport { ObjectField, isObjectField } from \"./ObjectField.js\";\nimport { LayoutBuilderFactory } from \"./LayoutBuilderFactory.js\";\nimport { LayoutMutator } from \"./LayoutMutator.js\";\nimport { LayoutResolver } from \"./LayoutResolver.js\";\nimport { FocusManager } from \"./FocusManager.js\";\nimport type {\n IFormModel,\n IField,\n IFieldBuilder,\n IFieldBuilderRegistry,\n IObjectFieldConfig,\n IFormVM,\n IFormError,\n IFormModelConfig,\n ILayoutBuilder,\n ILayoutNodeBuilder,\n ILayoutModifier,\n IPositionedLayoutNode,\n ILayoutNodeAccessHandle,\n IRule,\n IRuleEvaluator,\n LayoutNode,\n LayoutNodeVM,\n FormRule,\n FormRuleFn\n} from \"./abstractions.js\";\n\nexport class FormModel implements IFormModel {\n private _fields = new Map<string, IField>();\n private _builders = new Map<string, IFieldBuilder>();\n private _layout: LayoutNode[] = [];\n private _baseline = new Map<string, unknown>();\n private _submitted = false;\n private _submitCount = 0;\n private _validateOnChange = false;\n private _isValid: boolean | null = null;\n private _formRuleErrors: IFormError[] = [];\n private _activeTabs = observable.map<string, string>();\n private _ruleEvaluators: IRuleEvaluator[] = [];\n private _warnedRuleTypes = new Set<string>();\n private _formRules: FormRule[] = [];\n private _lastFocusedField: IField | null = null;\n private _registry: IFieldBuilderRegistry;\n\n private _layoutMutator = new LayoutMutator();\n private _layoutResolver: LayoutResolver = null!;\n private _focusManager: FocusManager = null!;\n\n constructor(config: IFormModelConfig, registry: IFieldBuilderRegistry) {\n this._registry = registry;\n this._ruleEvaluators = config.ruleEvaluators ?? [];\n\n const builders = config.fields(registry);\n\n for (const [name, builder] of Object.entries(builders)) {\n this._builders.set(name, builder);\n const fieldConfig = builder.build(name);\n const field = this._createField(fieldConfig);\n field.setForm(this);\n this._fields.set(name, field);\n }\n\n if (config.layout) {\n this._layout = LayoutBuilderFactory.buildNodes(\n config.layout(LayoutBuilderFactory.create())\n );\n this._warnOrphanFields();\n } else {\n this._layout = this._generateDefaultLayout();\n }\n\n this._registerObjectNodeLayouts(this._layout);\n this._propagateAncestorRules();\n\n this._validateOnChange = config.validateOnSubmit === false;\n this._snapshotBaseline();\n\n makeAutoObservable(\n this,\n {\n vm: computed,\n _builders: false,\n _layoutMutator: false,\n _layoutResolver: false,\n _focusManager: false\n } as any,\n { autoBind: true }\n );\n\n this._layoutResolver = new LayoutResolver(\n this._fields,\n this._activeTabs,\n this.evaluateRules.bind(this)\n );\n this._focusManager = new FocusManager(this._fields);\n }\n\n evaluateRules(rules: IRule[] | undefined): { visible: boolean; disabled: boolean } {\n let visible = true;\n let disabled = false;\n if (!rules || rules.length === 0) {\n return { visible, disabled };\n }\n\n for (const rule of rules) {\n const evaluator = this._ruleEvaluators.find(e => e.canEvaluate(rule));\n if (!evaluator) {\n if (\n process.env.NODE_ENV === \"development\" &&\n !this._warnedRuleTypes.has(rule.type)\n ) {\n this._warnedRuleTypes.add(rule.type);\n console.warn(\n `[FormModel] No evaluator registered for rule type \"${rule.type}\". Rule is ignored.`\n );\n }\n continue;\n }\n const matched = evaluator.evaluate(rule, this);\n if (!matched) {\n continue;\n }\n if (rule.action === \"hide\") {\n visible = false;\n } else if (rule.action === \"disable\") {\n disabled = true;\n }\n }\n\n return { visible, disabled };\n }\n\n field(name: string): IField {\n const field = this._fields.get(name);\n if (field) {\n return field;\n }\n\n const parts = name.split(\".\");\n if (parts.length > 1) {\n let current: IField | undefined = this._fields.get(parts[0]);\n for (let i = 1; i < parts.length && current; i++) {\n if (isObjectField(current)) {\n if (current.isList) {\n const index = parseInt(parts[i], 10);\n if (!isNaN(index)) {\n const item = current.items[index];\n if (item && i + 1 < parts.length) {\n current = item.children.get(parts[i + 1]);\n i++;\n } else {\n current = undefined;\n }\n continue;\n }\n }\n current = current.getChild(parts[i]);\n } else {\n current = undefined;\n }\n }\n if (current) {\n return current;\n }\n }\n\n throw new Error(`Field \"${name}\" not found.`);\n }\n\n focusField(name: string): void {\n if (this._lastFocusedField) {\n this._lastFocusedField.clearFocusRequest();\n this._lastFocusedField = null;\n }\n\n const activations = this._focusManager.buildFocusPath(name, this._layout);\n let field: IField | undefined;\n try {\n field = this.field(name);\n } catch {\n // Field not found — no-op.\n }\n\n runInAction(() => {\n if (activations) {\n for (const act of activations) {\n this._activeTabs.set(act.tabKey, act.tabId);\n }\n }\n if (field) {\n field.requestFocus();\n this._lastFocusedField = field;\n }\n });\n }\n\n fields(\n factory: (registry: IFieldBuilderRegistry) => Record<string, IFieldBuilder | undefined>\n ): void {\n const builders = factory(this._registry);\n\n for (const [name, builder] of Object.entries(builders)) {\n if (builder === undefined) {\n this._builders.delete(name);\n this.removeField(name);\n continue;\n }\n\n this._builders.set(name, builder);\n const fieldConfig = builder.build(name);\n const field = this._createField(fieldConfig);\n field.setForm(this);\n\n this._fields.set(name, field);\n }\n\n this._snapshotBaseline();\n this._propagateAncestorRules();\n }\n\n layout(factory: (layout: ILayoutModifier) => (LayoutNode | IPositionedLayoutNode)[]): void;\n layout(nodeId: string): ILayoutNodeAccessHandle;\n layout(\n factoryOrNodeId:\n | ((layout: ILayoutModifier) => (LayoutNode | IPositionedLayoutNode)[])\n | string\n ): void | ILayoutNodeAccessHandle {\n if (typeof factoryOrNodeId === \"string\") {\n return this._layoutMutator.accessNode(this._layout, factoryOrNodeId);\n }\n\n this._layout = this._layoutMutator.applyModifications(this._layout, factoryOrNodeId);\n this._registerObjectNodeLayouts(this._layout);\n this._propagateAncestorRules();\n }\n\n removeField(name: string): void {\n this._fields.delete(name);\n this._baseline.delete(name);\n this._layout = this._layoutMutator.removeFromLayout(this._layout, name);\n }\n\n getData(): Record<string, unknown> {\n const data: Record<string, unknown> = {};\n for (const [name, field] of this._fields) {\n if (isObjectField(field)) {\n data[name] = toJS(field.getData());\n } else {\n data[name] = toJS(field.getValue());\n }\n }\n return data;\n }\n\n setData(data: Record<string, unknown>, options?: { dirty?: boolean }): void {\n for (const [name, value] of Object.entries(data)) {\n const field = this._fields.get(name);\n if (field) {\n field.setValueSilent(value);\n }\n }\n if (!options?.dirty) {\n this._snapshotBaseline();\n }\n this._resetAllValidation();\n this._submitted = false;\n this._submitCount = 0;\n this._isValid = null;\n this._formRuleErrors = [];\n }\n\n reset(): void {\n for (const [name, field] of this._fields) {\n const baselineValue = this._baseline.get(name);\n field.setValueSilent(baselineValue ?? field.config.defaultValue ?? null);\n }\n this._resetAllValidation();\n this._submitted = false;\n this._submitCount = 0;\n this._isValid = null;\n this._formRuleErrors = [];\n }\n\n get isDirty(): boolean {\n for (const [name, field] of this._fields) {\n const baseline = this._baseline.get(name);\n const current = isObjectField(field) ? field.getData() : field.getValue();\n if (JSON.stringify(toJS(current)) !== JSON.stringify(toJS(baseline))) {\n return true;\n }\n }\n return false;\n }\n\n get isValid(): boolean | null {\n return this._isValid;\n }\n\n get submitted(): boolean {\n return this._submitted;\n }\n\n get submitCount(): number {\n return this._submitCount;\n }\n\n get errors(): IFormError[] {\n if (!this._submitted) {\n return [];\n }\n const ruleErrorPaths = new Set(this._formRuleErrors.filter(e => e.path).map(e => e.path));\n const errors: IFormError[] = [];\n\n const collectErrors = (\n fields: Map<string, IField>,\n pathPrefix: string,\n trail: string[]\n ) => {\n for (const [, field] of fields) {\n const path = pathPrefix ? `${pathPrefix}.${field.name}` : field.name;\n const segment = field.config.label || field.name;\n if (isObjectField(field)) {\n if (!field.visible) {\n continue;\n }\n if (\n field.vm.validation.isValid === false &&\n field.vm.validation.message &&\n !ruleErrorPaths.has(path)\n ) {\n errors.push({\n path,\n label: field.config.label,\n breadcrumb: [...trail, segment],\n message: field.vm.validation.message\n });\n }\n const skipBreadcrumb =\n field.config.renderer === \"passthrough\" && !field.config.label;\n const childTrail = skipBreadcrumb ? trail : [...trail, segment];\n\n if (field.config.isList) {\n for (const [index, item] of field.items.entries()) {\n collectErrors(item.children, `${path}.${index}`, [...childTrail]);\n }\n } else {\n collectErrors(field.children, path, childTrail);\n }\n } else if (\n field.visible &&\n field.vm.validation.isValid === false &&\n !ruleErrorPaths.has(path)\n ) {\n errors.push({\n path,\n label: field.config.label,\n breadcrumb: [...trail, segment],\n message: field.vm.validation.message || \"Invalid value.\"\n });\n }\n }\n };\n\n collectErrors(this._fields, \"\", []);\n return [...errors, ...this._formRuleErrors];\n }\n\n addRule(rule: FormRule): void {\n this._formRules.push(rule);\n }\n\n setLayout(factory: (layout: ILayoutBuilder) => ILayoutNodeBuilder[]): void {\n this._layout = LayoutBuilderFactory.buildNodes(factory(LayoutBuilderFactory.create()));\n this._warnOrphanFields();\n this._registerObjectNodeLayouts(this._layout);\n this._propagateAncestorRules();\n }\n\n async validate(): Promise<boolean> {\n let allFieldsValid = true;\n\n for (const [, field] of this._fields) {\n const valid = await field.validate({ force: true });\n if (!valid) {\n allFieldsValid = false;\n }\n }\n\n const ruleErrors: IFormError[] = [];\n for (const rule of this._formRules) {\n const errors = await this._runFormRule(rule);\n for (const err of errors) {\n ruleErrors.push(err);\n if (err.path) {\n const target = this._tryGetField(err.path);\n if (target) {\n target.setValidation({ isValid: false, message: err.message });\n }\n }\n }\n }\n\n const isValid = allFieldsValid && ruleErrors.length === 0;\n runInAction(() => {\n this._formRuleErrors = ruleErrors;\n this._isValid = isValid;\n this._submitted = true;\n this._submitCount++;\n });\n return isValid;\n }\n\n async submit<T = Record<string, unknown>>(options?: {\n skipValidation?: boolean;\n }): Promise<T | false> {\n if (options?.skipValidation) {\n return this.getData() as T;\n }\n\n const valid = await this.validate();\n if (!valid) {\n return false;\n }\n return this.getData() as T;\n }\n\n get vm(): IFormVM {\n return {\n layout: this._layoutResolver.resolve(this._layout),\n errors: this.errors,\n hasErrors: this.errors.length > 0,\n isDirty: this.isDirty,\n isValid: this._isValid,\n submitCount: this._submitCount,\n focusField: (path: string) => this.focusField(path),\n getData: () => this.getData() as Record<string, unknown>,\n setData: (data: Record<string, unknown>, options?: { dirty?: boolean }) =>\n this.setData(data, options)\n };\n }\n\n get registry(): IFieldBuilderRegistry {\n return this._registry;\n }\n\n public resolveChildLayout(layout: LayoutNode[], children: Map<string, IField>): LayoutNodeVM[] {\n return this._layoutResolver.resolveChildLayout(layout, children);\n }\n\n getField(name: string): IField | undefined {\n return this._fields.get(name);\n }\n\n getFields(): Map<string, IField> {\n return this._fields;\n }\n\n getFieldBuilders(predicate?: (builder: IFieldBuilder) => boolean): IFieldBuilder[] {\n const pred = predicate ?? (() => true);\n const result: IFieldBuilder[] = [];\n LayoutBuilderFactory.collectBuilders(this._fields, this._builders, pred, result);\n return result;\n }\n\n traverse(callback: (builder: IFieldBuilder) => void): void {\n this._traverseBuilders(this._fields, this._builders, callback);\n }\n\n private _traverseBuilders(\n fields: { get(name: string): IField | undefined },\n builders: Map<string, IFieldBuilder> | Record<string, IFieldBuilder>,\n callback: (builder: IFieldBuilder) => void\n ): void {\n const entries = builders instanceof Map ? builders.entries() : Object.entries(builders);\n for (const [name, builder] of entries) {\n if (!builder || typeof builder !== \"object\") {\n continue;\n }\n callback(builder);\n const field = fields.get(name);\n if (field && isObjectField(field)) {\n this._traverseBuilders(field.children, field.config.childBuilders, callback);\n const templates = (field.config as IObjectFieldConfig).templates;\n if (templates) {\n for (const tpl of templates) {\n for (const tplBuilder of Object.values(tpl.childBuilders)) {\n if (!tplBuilder || typeof tplBuilder !== \"object\") {\n continue;\n }\n callback(tplBuilder);\n }\n }\n }\n }\n }\n }\n\n private async _runFormRule(rule: FormRule): Promise<IFormError[]> {\n if (typeof rule === \"function\") {\n const fn = rule as FormRuleFn;\n const result = await fn(this);\n return Array.isArray(result) ? result : [];\n }\n const data = this.getData();\n const result = await rule.safeParseAsync(data);\n if (result.success) {\n return [];\n }\n return result.error.issues.map(issue => {\n const path = issue.path.map(String).join(\".\");\n const field = path ? this._tryGetField(path) : undefined;\n return {\n path,\n label: field?.config.label,\n message: issue.message || \"Invalid value.\"\n };\n });\n }\n\n private _tryGetField(path: string): IField | undefined {\n try {\n return this.field(path);\n } catch {\n return undefined;\n }\n }\n\n private _registerObjectNodeLayouts(layout: LayoutNode[]): void {\n for (const node of layout) {\n if (node.type === \"object\") {\n const field = this._fields.get(node.fieldName);\n if (field && isObjectField(field)) {\n field.setInnerLayout(node.inner);\n }\n } else if (node.type === \"tabs\") {\n for (const tab of node.tabs) {\n this._registerObjectNodeLayouts(tab.layout);\n }\n }\n }\n }\n\n private _propagateAncestorRules(): void {\n const ancestry = new Map<string, IRule[]>();\n const walk = (nodes: LayoutNode[], rules: IRule[]) => {\n for (const node of nodes) {\n if (node.type === \"row\") {\n for (const id of node.fieldIds) {\n const existing = ancestry.get(id) ?? [];\n ancestry.set(id, [...existing, ...rules]);\n }\n } else if (node.type === \"tabs\") {\n const containerRules = [...rules, ...(node.rules ?? [])];\n for (const tab of node.tabs) {\n const tabRules = [...containerRules, ...(tab.rules ?? [])];\n walk(tab.layout, tabRules);\n }\n } else if (node.type === \"object\") {\n const existing = ancestry.get(node.fieldName) ?? [];\n ancestry.set(node.fieldName, [...existing, ...rules]);\n }\n }\n };\n\n walk(this._layout, []);\n\n for (const [, field] of this._fields) {\n field.setAncestorRules(ancestry.get(field.name) ?? []);\n }\n }\n\n private _generateDefaultLayout(): LayoutNode[] {\n const layout: LayoutNode[] = [];\n for (const [name, field] of this._fields) {\n if (field.visible) {\n layout.push({ type: \"row\", fieldIds: [name] });\n }\n }\n return layout;\n }\n\n private _warnOrphanFields(): void {\n const layoutFieldIds = new Set(LayoutBuilderFactory.collectFieldIds(this._layout));\n\n for (const [name, field] of this._fields) {\n if (field.visible && !layoutFieldIds.has(name)) {\n console.warn(\n `[FormModel] Field \"${name}\" is not in the layout and not marked as .hidden(). ` +\n `Add it to the layout or mark it as .hidden() to suppress this warning.`\n );\n }\n }\n }\n\n private _snapshotBaseline(): void {\n this._baseline.clear();\n for (const [name, field] of this._fields) {\n this._baseline.set(name, toJS(field.getValue()));\n }\n }\n\n private _resetAllValidation(): void {\n for (const [, field] of this._fields) {\n field.resetValidation();\n }\n }\n\n private _createField(config: any): IField {\n if (config.childBuilders) {\n return new ObjectField(config as IObjectFieldConfig);\n }\n return new Field(config);\n }\n}\n"],"names":["FormModel","config","registry","Map","observable","Set","LayoutMutator","builders","name","builder","Object","fieldConfig","field","LayoutBuilderFactory","makeAutoObservable","computed","LayoutResolver","FocusManager","rules","visible","disabled","rule","evaluator","e","process","console","matched","parts","current","i","isObjectField","index","parseInt","isNaN","item","undefined","Error","activations","runInAction","act","factory","factoryOrNodeId","data","toJS","options","value","baselineValue","baseline","JSON","ruleErrorPaths","errors","collectErrors","fields","pathPrefix","trail","path","segment","skipBreadcrumb","childTrail","allFieldsValid","valid","ruleErrors","err","target","isValid","layout","children","predicate","pred","result","callback","entries","templates","tpl","tplBuilder","fn","Array","issue","String","node","tab","ancestry","walk","nodes","id","existing","containerRules","tabRules","layoutFieldIds","ObjectField","Field"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"features/formModel/FormModel.js","sources":["../../../src/features/formModel/FormModel.ts"],"sourcesContent":["import { makeAutoObservable, computed, toJS, runInAction, observable } from \"mobx\";\nimport { Field } from \"./Field.js\";\nimport { ObjectField, isObjectField } from \"./ObjectField.js\";\nimport { LayoutBuilderFactory } from \"./LayoutBuilderFactory.js\";\nimport { LayoutMutator } from \"./LayoutMutator.js\";\nimport { LayoutResolver } from \"./LayoutResolver.js\";\nimport { FocusManager } from \"./FocusManager.js\";\nimport type {\n IFormModel,\n IField,\n IFieldBuilder,\n IFieldBuilderRegistry,\n IObjectFieldConfig,\n IFormVM,\n IFormError,\n IFormModelConfig,\n ILayoutBuilder,\n ILayoutNodeBuilder,\n ILayoutModifier,\n IPositionedLayoutNode,\n ILayoutNodeAccessHandle,\n IRule,\n IRuleEvaluator,\n LayoutNode,\n LayoutNodeVM,\n FormRule,\n FormRuleFn\n} from \"./abstractions.js\";\n\nexport class FormModel implements IFormModel {\n private _fields = new Map<string, IField>();\n private _builders = new Map<string, IFieldBuilder>();\n private _layout: LayoutNode[] = [];\n private _baseline = new Map<string, unknown>();\n private _submitted = false;\n private _submitCount = 0;\n private _validateOnChange = false;\n private _isValid: boolean | null = null;\n private _formRuleErrors: IFormError[] = [];\n // Fields that the last `setErrors()` call marked invalid. The next call replaces them.\n private _externalErrorFields = new Set<IField>();\n private _activeTabs = observable.map<string, string>();\n private _ruleEvaluators: IRuleEvaluator[] = [];\n private _warnedRuleTypes = new Set<string>();\n private _formRules: FormRule[] = [];\n private _lastFocusedField: IField | null = null;\n private _registry: IFieldBuilderRegistry;\n\n private _layoutMutator = new LayoutMutator();\n private _layoutResolver: LayoutResolver = null!;\n private _focusManager: FocusManager = null!;\n\n constructor(config: IFormModelConfig, registry: IFieldBuilderRegistry) {\n this._registry = registry;\n this._ruleEvaluators = config.ruleEvaluators ?? [];\n\n const builders = config.fields(registry);\n\n for (const [name, builder] of Object.entries(builders)) {\n this._builders.set(name, builder);\n const fieldConfig = builder.build(name);\n const field = this._createField(fieldConfig);\n field.setForm(this);\n this._fields.set(name, field);\n }\n\n if (config.layout) {\n this._layout = LayoutBuilderFactory.buildNodes(\n config.layout(LayoutBuilderFactory.create())\n );\n this._warnOrphanFields();\n } else {\n this._layout = this._generateDefaultLayout();\n }\n\n this._registerObjectNodeLayouts(this._layout);\n this._propagateAncestorRules();\n\n this._validateOnChange = config.validateOnSubmit === false;\n this._snapshotBaseline();\n\n makeAutoObservable(\n this,\n {\n vm: computed,\n _builders: false,\n _layoutMutator: false,\n _layoutResolver: false,\n _focusManager: false\n } as any,\n { autoBind: true }\n );\n\n this._layoutResolver = new LayoutResolver(\n this._fields,\n this._activeTabs,\n this.evaluateRules.bind(this)\n );\n this._focusManager = new FocusManager(this._fields);\n }\n\n evaluateRules(rules: IRule[] | undefined): { visible: boolean; disabled: boolean } {\n let visible = true;\n let disabled = false;\n if (!rules || rules.length === 0) {\n return { visible, disabled };\n }\n\n for (const rule of rules) {\n const evaluator = this._ruleEvaluators.find(e => e.canEvaluate(rule));\n if (!evaluator) {\n if (\n process.env.NODE_ENV === \"development\" &&\n !this._warnedRuleTypes.has(rule.type)\n ) {\n this._warnedRuleTypes.add(rule.type);\n console.warn(\n `[FormModel] No evaluator registered for rule type \"${rule.type}\". Rule is ignored.`\n );\n }\n continue;\n }\n const matched = evaluator.evaluate(rule, this);\n if (!matched) {\n continue;\n }\n if (rule.action === \"hide\") {\n visible = false;\n } else if (rule.action === \"disable\") {\n disabled = true;\n }\n }\n\n return { visible, disabled };\n }\n\n field(name: string): IField {\n const field = this._fields.get(name);\n if (field) {\n return field;\n }\n\n const parts = name.split(\".\");\n if (parts.length > 1) {\n let current: IField | undefined = this._fields.get(parts[0]);\n for (let i = 1; i < parts.length && current; i++) {\n if (isObjectField(current)) {\n if (current.isList) {\n // A list field is followed by an item selector: a numeric index, or a\n // stable alphanumeric `_id` (matched against each item's hidden `_id`).\n const selector = parts[i];\n const item = /^\\d+$/.test(selector)\n ? current.items[parseInt(selector, 10)]\n : current.items.find(\n candidate =>\n candidate.children.get(\"_id\")?.getValue() === selector\n );\n if (item && i + 1 < parts.length) {\n current = item.children.get(parts[i + 1]);\n i++;\n } else {\n current = undefined;\n }\n continue;\n }\n current = current.getChild(parts[i]);\n } else {\n current = undefined;\n }\n }\n if (current) {\n return current;\n }\n }\n\n throw new Error(`Field \"${name}\" not found.`);\n }\n\n focusField(name: string): void {\n if (this._lastFocusedField) {\n this._lastFocusedField.clearFocusRequest();\n this._lastFocusedField = null;\n }\n\n const activations = this._focusManager.buildFocusPath(name, this._layout);\n let field: IField | undefined;\n try {\n field = this.field(name);\n } catch {\n // Field not found — no-op.\n }\n\n runInAction(() => {\n if (activations) {\n for (const act of activations) {\n this._activeTabs.set(act.tabKey, act.tabId);\n }\n }\n if (field) {\n field.requestFocus();\n this._lastFocusedField = field;\n }\n });\n }\n\n fields(\n factory: (registry: IFieldBuilderRegistry) => Record<string, IFieldBuilder | undefined>\n ): void {\n const builders = factory(this._registry);\n\n for (const [name, builder] of Object.entries(builders)) {\n if (builder === undefined) {\n this._builders.delete(name);\n this.removeField(name);\n continue;\n }\n\n this._builders.set(name, builder);\n const fieldConfig = builder.build(name);\n const field = this._createField(fieldConfig);\n field.setForm(this);\n\n this._fields.set(name, field);\n }\n\n this._snapshotBaseline();\n this._propagateAncestorRules();\n }\n\n layout(factory: (layout: ILayoutModifier) => (LayoutNode | IPositionedLayoutNode)[]): void;\n layout(nodeId: string): ILayoutNodeAccessHandle;\n layout(\n factoryOrNodeId:\n | ((layout: ILayoutModifier) => (LayoutNode | IPositionedLayoutNode)[])\n | string\n ): void | ILayoutNodeAccessHandle {\n if (typeof factoryOrNodeId === \"string\") {\n return this._layoutMutator.accessNode(this._layout, factoryOrNodeId);\n }\n\n this._layout = this._layoutMutator.applyModifications(this._layout, factoryOrNodeId);\n this._registerObjectNodeLayouts(this._layout);\n this._propagateAncestorRules();\n }\n\n removeField(name: string): void {\n this._fields.delete(name);\n this._baseline.delete(name);\n this._layout = this._layoutMutator.removeFromLayout(this._layout, name);\n }\n\n getData(): Record<string, unknown> {\n const data: Record<string, unknown> = {};\n for (const [name, field] of this._fields) {\n if (isObjectField(field)) {\n data[name] = toJS(field.getData());\n } else {\n data[name] = toJS(field.getValue());\n }\n }\n return data;\n }\n\n setData(data: Record<string, unknown>, options?: { dirty?: boolean }): void {\n for (const [name, value] of Object.entries(data)) {\n const field = this._fields.get(name);\n if (field) {\n field.setValueSilent(value);\n }\n }\n if (!options?.dirty) {\n this._snapshotBaseline();\n }\n this._resetAllValidation();\n this._submitted = false;\n this._submitCount = 0;\n this._isValid = null;\n this._formRuleErrors = [];\n this._externalErrorFields.clear();\n }\n\n reset(): void {\n for (const [name, field] of this._fields) {\n const baselineValue = this._baseline.get(name);\n field.setValueSilent(baselineValue ?? field.config.defaultValue ?? null);\n }\n this._resetAllValidation();\n this._submitted = false;\n this._submitCount = 0;\n this._isValid = null;\n this._formRuleErrors = [];\n this._externalErrorFields.clear();\n }\n\n get isDirty(): boolean {\n for (const [name, field] of this._fields) {\n const baseline = this._baseline.get(name);\n const current = isObjectField(field) ? field.getData() : field.getValue();\n if (JSON.stringify(toJS(current)) !== JSON.stringify(toJS(baseline))) {\n return true;\n }\n }\n return false;\n }\n\n get isValid(): boolean | null {\n return this._isValid;\n }\n\n get submitted(): boolean {\n return this._submitted;\n }\n\n get submitCount(): number {\n return this._submitCount;\n }\n\n get errors(): IFormError[] {\n if (!this._submitted) {\n return [];\n }\n const ruleErrorPaths = new Set(this._formRuleErrors.filter(e => e.path).map(e => e.path));\n const errors: IFormError[] = [];\n\n const collectErrors = (\n fields: Map<string, IField>,\n pathPrefix: string,\n trail: string[]\n ) => {\n for (const [, field] of fields) {\n const path = pathPrefix ? `${pathPrefix}.${field.name}` : field.name;\n const segment = field.config.label || field.name;\n if (isObjectField(field)) {\n if (!field.visible) {\n continue;\n }\n if (\n field.vm.validation.isValid === false &&\n field.vm.validation.message &&\n !ruleErrorPaths.has(path)\n ) {\n errors.push({\n path,\n label: field.config.label,\n breadcrumb: [...trail, segment],\n message: field.vm.validation.message\n });\n }\n const skipBreadcrumb =\n field.config.renderer === \"passthrough\" && !field.config.label;\n const childTrail = skipBreadcrumb ? trail : [...trail, segment];\n\n if (field.config.isList) {\n for (const [index, item] of field.items.entries()) {\n collectErrors(item.children, `${path}.${index}`, [...childTrail]);\n }\n } else {\n collectErrors(field.children, path, childTrail);\n }\n } else if (\n field.visible &&\n field.vm.validation.isValid === false &&\n !ruleErrorPaths.has(path)\n ) {\n errors.push({\n path,\n label: field.config.label,\n breadcrumb: [...trail, segment],\n message: field.vm.validation.message || \"Invalid value.\"\n });\n }\n }\n };\n\n collectErrors(this._fields, \"\", []);\n return [...errors, ...this._formRuleErrors];\n }\n\n addRule(rule: FormRule): void {\n this._formRules.push(rule);\n }\n\n setLayout(factory: (layout: ILayoutBuilder) => ILayoutNodeBuilder[]): void {\n this._layout = LayoutBuilderFactory.buildNodes(factory(LayoutBuilderFactory.create()));\n this._warnOrphanFields();\n this._registerObjectNodeLayouts(this._layout);\n this._propagateAncestorRules();\n }\n\n async validate(): Promise<boolean> {\n // Validation recomputes every field, so errors from an earlier `setErrors()` go too.\n this._externalErrorFields.clear();\n let allFieldsValid = true;\n\n for (const [, field] of this._fields) {\n const valid = await field.validate({ force: true });\n if (!valid) {\n allFieldsValid = false;\n }\n }\n\n const ruleErrors: IFormError[] = [];\n for (const rule of this._formRules) {\n const errors = await this._runFormRule(rule);\n for (const err of errors) {\n ruleErrors.push(err);\n if (err.path) {\n const target = this._tryGetField(err.path);\n if (target) {\n target.setValidation({ isValid: false, message: err.message });\n }\n }\n }\n }\n\n const isValid = allFieldsValid && ruleErrors.length === 0;\n runInAction(() => {\n this._formRuleErrors = ruleErrors;\n this._isValid = isValid;\n this._submitted = true;\n this._submitCount++;\n });\n return isValid;\n }\n\n setErrors(errors: IFormError[]): void {\n const formErrors: IFormError[] = [];\n runInAction(() => {\n // A new set of errors replaces the previous one, so a field that was rejected last\n // time and isn't this time goes back to valid.\n for (const field of this._externalErrorFields) {\n field.resetValidation();\n }\n this._externalErrorFields.clear();\n\n for (const error of errors) {\n const field = error.path ? this._tryGetField(error.path) : undefined;\n if (field?.visible) {\n // Collected by `errors` from the field, with its label and breadcrumb.\n field.setValidation({ isValid: false, message: error.message });\n this._externalErrorFields.add(field);\n } else {\n formErrors.push(error);\n }\n }\n // Form-level errors share the slot `validate()` replaces, so the next submit clears them.\n this._formRuleErrors = formErrors;\n this._isValid = errors.length === 0;\n this._submitted = true;\n this._submitCount++;\n });\n }\n\n async submit<T = Record<string, unknown>>(options?: {\n skipValidation?: boolean;\n }): Promise<T | false> {\n if (options?.skipValidation) {\n return this.getData() as T;\n }\n\n const valid = await this.validate();\n if (!valid) {\n return false;\n }\n return this.getData() as T;\n }\n\n get vm(): IFormVM {\n return {\n layout: this._layoutResolver.resolve(this._layout),\n errors: this.errors,\n hasErrors: this.errors.length > 0,\n isDirty: this.isDirty,\n isValid: this._isValid,\n submitCount: this._submitCount,\n focusField: (path: string) => this.focusField(path),\n getData: () => this.getData() as Record<string, unknown>,\n setData: (data: Record<string, unknown>, options?: { dirty?: boolean }) =>\n this.setData(data, options)\n };\n }\n\n get registry(): IFieldBuilderRegistry {\n return this._registry;\n }\n\n public resolveChildLayout(layout: LayoutNode[], children: Map<string, IField>): LayoutNodeVM[] {\n return this._layoutResolver.resolveChildLayout(layout, children);\n }\n\n getField(name: string): IField | undefined {\n return this._fields.get(name);\n }\n\n getFields(): Map<string, IField> {\n return this._fields;\n }\n\n getFieldBuilders(predicate?: (builder: IFieldBuilder) => boolean): IFieldBuilder[] {\n const pred = predicate ?? (() => true);\n const result: IFieldBuilder[] = [];\n LayoutBuilderFactory.collectBuilders(this._fields, this._builders, pred, result);\n return result;\n }\n\n traverse(callback: (builder: IFieldBuilder) => void): void {\n this._traverseBuilders(this._fields, this._builders, callback);\n }\n\n private _traverseBuilders(\n fields: { get(name: string): IField | undefined },\n builders: Map<string, IFieldBuilder> | Record<string, IFieldBuilder>,\n callback: (builder: IFieldBuilder) => void\n ): void {\n const entries = builders instanceof Map ? builders.entries() : Object.entries(builders);\n for (const [name, builder] of entries) {\n if (!builder || typeof builder !== \"object\") {\n continue;\n }\n callback(builder);\n const field = fields.get(name);\n if (field && isObjectField(field)) {\n this._traverseBuilders(field.children, field.config.childBuilders, callback);\n const templates = (field.config as IObjectFieldConfig).templates;\n if (templates) {\n for (const tpl of templates) {\n for (const tplBuilder of Object.values(tpl.childBuilders)) {\n if (!tplBuilder || typeof tplBuilder !== \"object\") {\n continue;\n }\n callback(tplBuilder);\n }\n }\n }\n }\n }\n }\n\n private async _runFormRule(rule: FormRule): Promise<IFormError[]> {\n if (typeof rule === \"function\") {\n const fn = rule as FormRuleFn;\n const result = await fn(this);\n return Array.isArray(result) ? result : [];\n }\n const data = this.getData();\n const result = await rule.safeParseAsync(data);\n if (result.success) {\n return [];\n }\n return result.error.issues.map(issue => {\n const path = issue.path.map(String).join(\".\");\n const field = path ? this._tryGetField(path) : undefined;\n return {\n path,\n label: field?.config.label,\n message: issue.message || \"Invalid value.\"\n };\n });\n }\n\n private _tryGetField(path: string): IField | undefined {\n try {\n return this.field(path);\n } catch {\n return undefined;\n }\n }\n\n private _registerObjectNodeLayouts(layout: LayoutNode[]): void {\n for (const node of layout) {\n if (node.type === \"object\") {\n const field = this._fields.get(node.fieldName);\n if (field && isObjectField(field)) {\n field.setInnerLayout(node.inner);\n }\n } else if (node.type === \"tabs\") {\n for (const tab of node.tabs) {\n this._registerObjectNodeLayouts(tab.layout);\n }\n }\n }\n }\n\n private _propagateAncestorRules(): void {\n const ancestry = new Map<string, IRule[]>();\n const walk = (nodes: LayoutNode[], rules: IRule[]) => {\n for (const node of nodes) {\n if (node.type === \"row\") {\n for (const id of node.fieldIds) {\n const existing = ancestry.get(id) ?? [];\n ancestry.set(id, [...existing, ...rules]);\n }\n } else if (node.type === \"tabs\") {\n const containerRules = [...rules, ...(node.rules ?? [])];\n for (const tab of node.tabs) {\n const tabRules = [...containerRules, ...(tab.rules ?? [])];\n walk(tab.layout, tabRules);\n }\n } else if (node.type === \"object\") {\n const existing = ancestry.get(node.fieldName) ?? [];\n ancestry.set(node.fieldName, [...existing, ...rules]);\n }\n }\n };\n\n walk(this._layout, []);\n\n for (const [, field] of this._fields) {\n field.setAncestorRules(ancestry.get(field.name) ?? []);\n }\n }\n\n private _generateDefaultLayout(): LayoutNode[] {\n const layout: LayoutNode[] = [];\n for (const [name, field] of this._fields) {\n if (field.visible) {\n layout.push({ type: \"row\", fieldIds: [name] });\n }\n }\n return layout;\n }\n\n private _warnOrphanFields(): void {\n const layoutFieldIds = new Set(LayoutBuilderFactory.collectFieldIds(this._layout));\n\n for (const [name, field] of this._fields) {\n if (field.visible && !layoutFieldIds.has(name)) {\n console.warn(\n `[FormModel] Field \"${name}\" is not in the layout and not marked as .hidden(). ` +\n `Add it to the layout or mark it as .hidden() to suppress this warning.`\n );\n }\n }\n }\n\n private _snapshotBaseline(): void {\n this._baseline.clear();\n for (const [name, field] of this._fields) {\n this._baseline.set(name, toJS(field.getValue()));\n }\n }\n\n private _resetAllValidation(): void {\n for (const [, field] of this._fields) {\n field.resetValidation();\n }\n }\n\n private _createField(config: any): IField {\n if (config.childBuilders) {\n return new ObjectField(config as IObjectFieldConfig);\n }\n return new Field(config);\n }\n}\n"],"names":["FormModel","config","registry","Map","Set","observable","LayoutMutator","builders","name","builder","Object","fieldConfig","field","LayoutBuilderFactory","makeAutoObservable","computed","LayoutResolver","FocusManager","rules","visible","disabled","rule","evaluator","e","process","console","matched","parts","current","i","isObjectField","selector","item","parseInt","candidate","undefined","Error","activations","runInAction","act","factory","factoryOrNodeId","data","toJS","options","value","baselineValue","baseline","JSON","ruleErrorPaths","errors","collectErrors","fields","pathPrefix","trail","path","segment","skipBreadcrumb","childTrail","index","allFieldsValid","valid","ruleErrors","err","target","isValid","formErrors","error","layout","children","predicate","pred","result","callback","entries","templates","tpl","tplBuilder","fn","Array","issue","String","node","tab","ancestry","walk","nodes","id","existing","containerRules","tabRules","layoutFieldIds","ObjectField","Field"],"mappings":"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"}
|