From ada8f5557464e3e4bf9c2734099c98297689bd7c Mon Sep 17 00:00:00 2001 From: Charles Bochet Date: Sat, 27 Jan 2024 23:42:39 +0100 Subject: [PATCH] Refactor Field Inputs (#3658) * Rename field to record-field folder * Simplify FieldInput * Fix perfs * Fixes * Fixes * Fix tests * Fix tests --- .../files/components/AttachmentRow.tsx | 4 +- .../components/ActivityTargetsInlineCell.tsx | 7 +- .../activities/notes/components/NoteCard.tsx | 2 +- .../companies/components/CompanyBoardCard.tsx | 10 +- ...pBoardFieldDefinitionsToViewFields.test.ts | 2 +- .../mapBoardFieldDefinitionsToViewFields.ts | 2 +- .../useColumnDefinitionsFromFieldMetadata.ts | 2 +- .../hooks/useCreateOneFieldMetadataItem.ts | 2 +- .../hooks/useFieldMetadataItem.ts | 2 +- .../useMapFieldMetadataToGraphQLQuery.ts | 2 +- ...rmatFieldMetadataItemAsColumnDefinition.ts | 2 +- .../utils/parseFieldRelationType.ts | 2 +- .../object-metadata/utils/parseFieldType.ts | 2 +- .../__tests__/useFieldInitialValue.test.tsx | 62 ---------- .../useIsFieldEditModeValueEmpty.test.tsx | 52 -------- .../useSaveFieldEditModeValue.test.tsx | 57 --------- .../field/hooks/useFieldInitialValue.ts | 18 --- .../hooks/useIsFieldEditModeValueEmpty.ts | 22 ---- .../field/hooks/useSaveFieldEditModeValue.ts | 112 ------------------ .../entityFieldInitialValueFamilyState.ts | 11 -- .../entityFieldsEditModeValueFamilyState.ts | 9 -- .../field/states/isFieldEmptyScopedState.ts | 6 - ...entityFieldsEditModeValueFamilySelector.ts | 18 --- ...sEntityFieldEditModeEmptyFamilySelector.ts | 31 ----- .../isEntityFieldEmptyFamilySelector.ts | 29 ----- .../field/types/FieldInitialValue.ts | 4 - .../field/utils/isFieldValueEmpty.ts | 73 ------------ .../object-record/hooks/useFieldContext.tsx | 4 +- .../RecordBoardDeprecatedEffect.tsx | 2 +- .../useRecordBoardCardFieldsInternal.test.tsx | 2 +- ...RecordBoardDeprecatedCardFieldsInternal.ts | 2 +- ...ordBoardDeprecatedCardFieldsScopedState.ts | 2 +- .../states/onFieldsChangeScopedState.ts | 2 +- ...ordBoardDeprecatedCardFieldsScopedState.ts | 2 +- ...ordBoardDeprecatedCardFieldsScopedState.ts | 2 +- ...BoardDeprecatedCardFieldsScopedSelector.ts | 4 +- ...DeprecatedCardFieldsByKeyScopedSelector.ts | 2 +- ...ordBoardDeprecatedCardIdsScopedSelector.ts | 4 +- ...BoardDeprecatedCardFieldsScopedSelector.ts | 4 +- .../types/BoardFieldDefinition.ts | 4 +- .../record-board/components/RecordBoard.tsx | 1 - .../hooks/internal/useRecordBoardStates.ts | 4 +- .../internal/useSetRecordBoardRecordIds.ts | 16 ++- .../components/RecordBoardCard.tsx | 3 +- .../record-board/scopes/RecordBoardScope.tsx | 4 +- .../RecordBoardScopeInternalContext.ts | 8 +- ...ecordBoardFieldDefinitionsStateScopeMap.ts | 2 +- ...rdVisibleFieldDefinitionsScopedSelector.ts | 4 +- .../types/RecordBoardFieldDefinition.ts | 4 +- .../__mocks__/fieldDefinitions.ts | 4 +- .../components/FieldDisplay.tsx | 0 .../components/FieldInput.tsx | 23 ++-- .../contexts/FieldContext.ts | 0 .../hooks/__tests__/useGetButtonIcon.test.tsx | 10 +- .../hooks/__tests__/useIsFieldEmpty.test.tsx | 6 +- .../__tests__/useIsFieldInputOnly.test.tsx | 10 +- .../hooks/__tests__/usePersistField.test.tsx | 12 +- .../__tests__/useToggleEditOnlyInput.test.tsx | 8 +- .../internal/useRecordFieldInputStates.ts | 22 ++++ .../hooks/useGetButtonIcon.ts | 2 +- .../hooks/useIsFieldEmpty.ts | 2 +- .../hooks/useIsFieldInputOnly.ts | 0 .../hooks/usePersistField.ts | 8 +- .../record-field/hooks/useRecordFieldInput.ts | 73 ++++++++++++ .../hooks/useToggleEditOnlyInput.ts | 0 .../__stories__/FieldContextProvider.tsx | 2 +- .../display/components/ChipFieldDisplay.tsx | 2 +- .../components/CurrencyFieldDisplay.tsx | 10 +- .../display/components/DateFieldDisplay.tsx | 0 .../display/components/EmailFieldDisplay.tsx | 0 .../components/FullNameFieldDisplay.tsx | 2 +- .../display/components/LinkFieldDisplay.tsx | 0 .../display/components/NumberFieldDisplay.tsx | 0 .../display/components/PhoneFieldDisplay.tsx | 0 .../components/RelationFieldDisplay.tsx | 0 .../display/components/SelectFieldDisplay.tsx | 0 .../display/components/TextFieldDisplay.tsx | 0 .../display/components/UuidFieldDisplay.tsx | 2 +- .../__stories__/ChipFieldDisplay.stories.tsx | 2 +- .../__stories__/DateFieldDisplay.stories.tsx | 0 .../__stories__/EmailFieldDisplay.stories.tsx | 0 .../NumberFieldDisplay.stories.tsx | 0 .../__stories__/PhoneFieldDisplay.stories.tsx | 0 .../__stories__/TextFieldDisplay.stories.tsx | 0 .../meta-types/hooks/useBooleanField.ts | 0 .../meta-types/hooks/useChipField.ts | 6 +- .../meta-types/hooks/useCurrencyField.ts | 47 ++------ .../meta-types/hooks/useDateTimeField.ts | 7 ++ .../meta-types/hooks/useEmailField.ts | 15 +-- .../meta-types/hooks/useFullNameField.ts | 14 +-- .../meta-types/hooks/useLinkField.ts | 16 ++- .../meta-types/hooks/useNumberField.ts | 17 ++- .../meta-types/hooks/usePhoneField.ts | 17 ++- .../meta-types/hooks/useRatingField.ts | 0 .../meta-types/hooks/useRelationField.ts | 21 ++-- .../meta-types/hooks/useSelectField.ts | 16 +-- .../meta-types/hooks/useTextField.ts | 17 +-- .../meta-types/hooks/useUuidField.ts | 13 +- .../input/components/BooleanFieldInput.tsx | 0 .../input/components/CurrencyFieldInput.tsx | 30 ++--- .../input/components/DateFieldInput.tsx | 7 +- .../input/components/EmailFieldInput.tsx | 9 +- .../input/components/FullNameFieldInput.tsx | 14 +-- .../input/components/LinkFieldInput.tsx | 10 +- .../input/components/NumberFieldInput.tsx | 16 +-- .../input/components/PhoneFieldInput.tsx | 16 +-- .../input/components/RatingFieldInput.tsx | 0 .../input/components/RelationFieldInput.tsx | 4 +- .../input/components/SelectFieldInput.tsx | 4 +- .../input/components/TextFieldInput.tsx | 9 +- .../__stories__/BooleanFieldInput.stories.tsx | 0 .../__stories__/DateFieldInput.stories.tsx | 0 .../__stories__/EmailFieldInput.stories.tsx | 0 .../__stories__/NumberFieldInput.stories.tsx | 0 .../__stories__/PhoneFieldInput.stories.tsx | 0 .../__stories__/RatingFieldInput.stories.tsx | 0 .../RelationFieldInput.stories.tsx | 10 +- .../__stories__/TextFieldInput.stories.tsx | 0 .../input/hooks/useRegisterInputEvents.ts | 0 .../scopes/RecordFieldInputScope.tsx | 23 ++++ .../RecordFieldInputScopeInternalContext.ts | 7 ++ ...recordFieldInputDraftValueStateScopeMap.ts | 8 ++ ...ordFieldInputDraftValueSelectorScopeMap.ts | 16 +++ .../types/CurrencyCode.ts | 0 .../types/FieldDefinition.ts | 1 + .../types/FieldDefinitionWithTypeOnly.ts | 0 .../types/FieldDoubleText.ts | 0 .../types/FieldInputDraftValue.ts | 58 +++++++++ .../types/FieldInputEvent.ts | 0 .../types/FieldMetadata.ts | 0 .../types/FieldType.ts | 0 .../types/guards/assertFieldMetadata.ts | 0 .../types/guards/isFieldBoolean.ts | 0 .../types/guards/isFieldBooleanValue.ts | 0 .../types/guards/isFieldCurrency.ts | 0 .../types/guards/isFieldCurrencyValue.ts | 0 .../types/guards/isFieldDateTime.ts | 0 .../types/guards/isFieldDateTimeValue.ts | 0 .../types/guards/isFieldEmail.ts | 0 .../types/guards/isFieldEmailValue.ts | 0 .../types/guards/isFieldFullName.ts | 0 .../types/guards/isFieldFullNameValue.ts | 0 .../types/guards/isFieldLink.ts | 0 .../types/guards/isFieldLinkValue.ts | 0 .../types/guards/isFieldNumber.ts | 0 .../types/guards/isFieldNumberValue.ts | 0 .../types/guards/isFieldPhone.ts | 0 .../types/guards/isFieldPhoneValue.ts | 0 .../types/guards/isFieldRating.ts | 0 .../types/guards/isFieldRatingValue.ts | 0 .../types/guards/isFieldRelation.ts | 0 .../types/guards/isFieldRelationValue.ts | 0 .../types/guards/isFieldSelect.ts | 0 .../types/guards/isFieldSelectValue.ts | 2 +- .../types/guards/isFieldText.ts | 0 .../types/guards/isFieldTextValue.ts | 0 .../types/guards/isFieldUuid.ts | 0 .../types/resolvers/DoubleTextTypeResolver.ts | 0 .../utils/__tests__/isFieldValueEmpty.test.ts | 6 +- .../utils/computeDraftValueFromFieldValue.ts | 39 ++++++ .../utils/computeDraftValueFromString.ts | 53 +++++++++ .../utils/computeEmptyDraftValue.ts | 51 ++++++++ .../record-field/utils/isFieldValueEmpty.ts | 73 ++++++++++++ .../components/RecordIndexTableContainer.tsx | 2 +- .../recordIndexFieldDefinitionsState.ts | 2 +- .../components/RecordInlineCell.tsx | 19 +-- .../components/RecordInlineCellContainer.tsx | 13 +- .../record-inline-cell/hooks/useInlineCell.ts | 14 ++- .../FieldRecoilScopeContext.ts | 3 - .../RecordRelationFieldCardContent.tsx | 8 +- .../RecordRelationFieldCardSection.tsx | 6 +- .../components/RecordShowContainer.tsx | 6 +- .../record-table/components/ColumnHead.tsx | 2 +- .../components/ColumnHeadWithDropdown.tsx | 5 +- .../components/RecordTableCellContainer.tsx | 19 ++- .../RecordTableColumnDropdownMenu.tsx | 2 +- .../components/RecordTableHeaderCell.tsx | 2 +- .../RecordTableHeaderPlusButtonContent.tsx | 7 +- .../record-table/contexts/ColumnContext.ts | 2 +- .../EntityUpdateMutationHookContext.ts | 2 +- .../hooks/internal/useRecordTableStates.ts | 14 +-- .../record-table/hooks/useRecordTable.ts | 2 +- .../record-table/hooks/useTableColumns.ts | 2 +- .../components/RecordTableCell.tsx | 40 ++----- .../components/RecordTableCellContainer.tsx | 6 +- .../components/RecordTableCellDisplayMode.tsx | 2 +- .../RecordTableCellSoftFocusMode.tsx | 14 +-- .../record-table-cell/hooks/useTableCell.ts | 37 +++--- .../record-table/scopes/RecordTableScope.tsx | 4 +- .../scopes/RecordTableScopeInitEffect.tsx | 5 +- .../RecordTableScopeInternalContext.ts | 2 +- .../availableTableColumnsStateScopeMap.ts | 2 +- .../states/onColumnsChangeStateScopeMap.ts | 5 +- .../allRowsSelectedStatusSelectorScopeMap.ts | 4 +- .../hiddenTableColumnsSelectorScopeMap.ts | 39 +++--- .../numberOfTableColumnsSelectorScopeMap.ts | 17 +-- .../selectedRowIdsSelectorScopeMap.ts | 6 +- .../tableColumnsByKeySelectorScopeMap.ts | 32 ++--- .../visibleTableColumnsSelectorScopeMap.ts | 39 +++--- .../states/tableColumnsStateScopeMap.ts | 2 +- .../record-table/types/ColumnDefinition.ts | 4 +- .../components/RelationPicker.tsx | 4 +- .../utils/filterAvailableTableColumns.ts | 4 +- .../SettingsObjectFieldCurrencyForm.tsx | 2 +- .../components/SettingsObjectFieldPreview.tsx | 8 +- .../constants/settingsFieldCurrencyCodes.ts | 2 +- .../constants/settingsFieldMetadataTypes.ts | 2 +- .../data-model/hooks/useFieldMetadataForm.ts | 2 +- .../field/display/components/LinkDisplay.tsx | 2 +- .../ui/field/input/components/DateInput.tsx | 3 +- .../input/components/DoubleTextInput.tsx | 2 +- .../ui/field/input/components/PhoneInput.tsx | 3 +- .../field/input/components/TextAreaInput.tsx | 2 +- .../ui/field/input/components/TextInput.tsx | 3 +- .../utils/createSelectorReadOnlyScopeMap.ts | 30 +++++ .../utils/createSelectorScopeMap.ts | 13 ++ .../recoil-scope/utils/getSelector.ts | 6 +- .../recoil-scope/utils/getSelectorReadOnly.ts | 12 ++ .../ViewFieldsVisibilityDropdownSection.tsx | 2 +- .../__tests__/useViewBar_ViewFields.test.tsx | 2 +- .../availableFieldDefinitionsScopedState.ts | 2 +- .../selectors/currentViewScopedSelector.ts | 4 +- .../src/modules/views/types/ViewField.ts | 2 +- .../utils/__tests__/viewMapFunctions.test.ts | 2 +- .../utils/mapColumnDefinitionToViewField.ts | 2 +- .../mapViewFieldsToBoardFieldDefinitions.ts | 2 +- .../utils/mapViewFieldsToColumnDefinitions.ts | 2 +- .../twenty-front/tsconfig.node.tsbuildinfo | 1 + 228 files changed, 975 insertions(+), 1037 deletions(-) delete mode 100644 packages/twenty-front/src/modules/object-record/field/hooks/__tests__/useFieldInitialValue.test.tsx delete mode 100644 packages/twenty-front/src/modules/object-record/field/hooks/__tests__/useIsFieldEditModeValueEmpty.test.tsx delete mode 100644 packages/twenty-front/src/modules/object-record/field/hooks/__tests__/useSaveFieldEditModeValue.test.tsx delete mode 100644 packages/twenty-front/src/modules/object-record/field/hooks/useFieldInitialValue.ts delete mode 100644 packages/twenty-front/src/modules/object-record/field/hooks/useIsFieldEditModeValueEmpty.ts delete mode 100644 packages/twenty-front/src/modules/object-record/field/hooks/useSaveFieldEditModeValue.ts delete mode 100644 packages/twenty-front/src/modules/object-record/field/states/entityFieldInitialValueFamilyState.ts delete mode 100644 packages/twenty-front/src/modules/object-record/field/states/entityFieldsEditModeValueFamilyState.ts delete mode 100644 packages/twenty-front/src/modules/object-record/field/states/isFieldEmptyScopedState.ts delete mode 100644 packages/twenty-front/src/modules/object-record/field/states/selectors/entityFieldsEditModeValueFamilySelector.ts delete mode 100644 packages/twenty-front/src/modules/object-record/field/states/selectors/isEntityFieldEditModeEmptyFamilySelector.ts delete mode 100644 packages/twenty-front/src/modules/object-record/field/states/selectors/isEntityFieldEmptyFamilySelector.ts delete mode 100644 packages/twenty-front/src/modules/object-record/field/types/FieldInitialValue.ts delete mode 100644 packages/twenty-front/src/modules/object-record/field/utils/isFieldValueEmpty.ts rename packages/twenty-front/src/modules/object-record/{field => record-field}/__mocks__/fieldDefinitions.ts (94%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/components/FieldDisplay.tsx (100%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/components/FieldInput.tsx (83%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/contexts/FieldContext.ts (100%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/hooks/__tests__/useGetButtonIcon.test.tsx (76%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/hooks/__tests__/useIsFieldEmpty.test.tsx (82%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/hooks/__tests__/useIsFieldInputOnly.test.tsx (72%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/hooks/__tests__/usePersistField.test.tsx (91%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/hooks/__tests__/useToggleEditOnlyInput.test.tsx (90%) create mode 100644 packages/twenty-front/src/modules/object-record/record-field/hooks/internal/useRecordFieldInputStates.ts rename packages/twenty-front/src/modules/object-record/{field => record-field}/hooks/useGetButtonIcon.ts (90%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/hooks/useIsFieldEmpty.ts (86%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/hooks/useIsFieldInputOnly.ts (100%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/hooks/usePersistField.ts (92%) create mode 100644 packages/twenty-front/src/modules/object-record/record-field/hooks/useRecordFieldInput.ts rename packages/twenty-front/src/modules/object-record/{field => record-field}/hooks/useToggleEditOnlyInput.ts (100%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/meta-types/__stories__/FieldContextProvider.tsx (91%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/meta-types/display/components/ChipFieldDisplay.tsx (76%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/meta-types/display/components/CurrencyFieldDisplay.tsx (51%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/meta-types/display/components/DateFieldDisplay.tsx (100%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/meta-types/display/components/EmailFieldDisplay.tsx (100%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/meta-types/display/components/FullNameFieldDisplay.tsx (75%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/meta-types/display/components/LinkFieldDisplay.tsx (100%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/meta-types/display/components/NumberFieldDisplay.tsx (100%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/meta-types/display/components/PhoneFieldDisplay.tsx (100%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/meta-types/display/components/RelationFieldDisplay.tsx (100%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/meta-types/display/components/SelectFieldDisplay.tsx (100%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/meta-types/display/components/TextFieldDisplay.tsx (100%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/meta-types/display/components/UuidFieldDisplay.tsx (69%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/meta-types/display/components/__stories__/ChipFieldDisplay.stories.tsx (94%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/meta-types/display/components/__stories__/DateFieldDisplay.stories.tsx (100%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/meta-types/display/components/__stories__/EmailFieldDisplay.stories.tsx (100%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/meta-types/display/components/__stories__/NumberFieldDisplay.stories.tsx (100%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/meta-types/display/components/__stories__/PhoneFieldDisplay.stories.tsx (100%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/meta-types/display/components/__stories__/TextFieldDisplay.stories.tsx (100%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/meta-types/hooks/useBooleanField.ts (100%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/meta-types/hooks/useChipField.ts (72%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/meta-types/hooks/useCurrencyField.ts (58%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/meta-types/hooks/useDateTimeField.ts (75%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/meta-types/hooks/useEmailField.ts (65%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/meta-types/hooks/useFullNameField.ts (78%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/meta-types/hooks/useLinkField.ts (76%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/meta-types/hooks/useNumberField.ts (74%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/meta-types/hooks/usePhoneField.ts (72%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/meta-types/hooks/useRatingField.ts (100%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/meta-types/hooks/useRelationField.ts (61%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/meta-types/hooks/useSelectField.ts (72%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/meta-types/hooks/useTextField.ts (65%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/meta-types/hooks/useUuidField.ts (70%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/meta-types/input/components/BooleanFieldInput.tsx (100%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/meta-types/input/components/CurrencyFieldInput.tsx (73%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/meta-types/input/components/DateFieldInput.tsx (85%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/meta-types/input/components/EmailFieldInput.tsx (85%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/meta-types/input/components/FullNameFieldInput.tsx (82%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/meta-types/input/components/LinkFieldInput.tsx (86%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/meta-types/input/components/NumberFieldInput.tsx (83%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/meta-types/input/components/PhoneFieldInput.tsx (83%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/meta-types/input/components/RatingFieldInput.tsx (100%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/meta-types/input/components/RelationFieldInput.tsx (92%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/meta-types/input/components/SelectFieldInput.tsx (85%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/meta-types/input/components/TextFieldInput.tsx (85%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/meta-types/input/components/__stories__/BooleanFieldInput.stories.tsx (100%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/meta-types/input/components/__stories__/DateFieldInput.stories.tsx (100%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/meta-types/input/components/__stories__/EmailFieldInput.stories.tsx (100%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/meta-types/input/components/__stories__/NumberFieldInput.stories.tsx (100%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/meta-types/input/components/__stories__/PhoneFieldInput.stories.tsx (100%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/meta-types/input/components/__stories__/RatingFieldInput.stories.tsx (100%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/meta-types/input/components/__stories__/RelationFieldInput.stories.tsx (92%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/meta-types/input/components/__stories__/TextFieldInput.stories.tsx (100%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/meta-types/input/hooks/useRegisterInputEvents.ts (100%) create mode 100644 packages/twenty-front/src/modules/object-record/record-field/scopes/RecordFieldInputScope.tsx create mode 100644 packages/twenty-front/src/modules/object-record/record-field/scopes/scope-internal-context/RecordFieldInputScopeInternalContext.ts create mode 100644 packages/twenty-front/src/modules/object-record/record-field/states/recordFieldInputDraftValueStateScopeMap.ts create mode 100644 packages/twenty-front/src/modules/object-record/record-field/states/selectors/recordFieldInputDraftValueSelectorScopeMap.ts rename packages/twenty-front/src/modules/object-record/{field => record-field}/types/CurrencyCode.ts (100%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/types/FieldDefinition.ts (94%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/types/FieldDefinitionWithTypeOnly.ts (100%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/types/FieldDoubleText.ts (100%) create mode 100644 packages/twenty-front/src/modules/object-record/record-field/types/FieldInputDraftValue.ts rename packages/twenty-front/src/modules/object-record/{field => record-field}/types/FieldInputEvent.ts (100%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/types/FieldMetadata.ts (100%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/types/FieldType.ts (100%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/types/guards/assertFieldMetadata.ts (100%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/types/guards/isFieldBoolean.ts (100%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/types/guards/isFieldBooleanValue.ts (100%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/types/guards/isFieldCurrency.ts (100%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/types/guards/isFieldCurrencyValue.ts (100%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/types/guards/isFieldDateTime.ts (100%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/types/guards/isFieldDateTimeValue.ts (100%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/types/guards/isFieldEmail.ts (100%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/types/guards/isFieldEmailValue.ts (100%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/types/guards/isFieldFullName.ts (100%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/types/guards/isFieldFullNameValue.ts (100%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/types/guards/isFieldLink.ts (100%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/types/guards/isFieldLinkValue.ts (100%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/types/guards/isFieldNumber.ts (100%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/types/guards/isFieldNumberValue.ts (100%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/types/guards/isFieldPhone.ts (100%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/types/guards/isFieldPhoneValue.ts (100%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/types/guards/isFieldRating.ts (100%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/types/guards/isFieldRatingValue.ts (100%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/types/guards/isFieldRelation.ts (100%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/types/guards/isFieldRelationValue.ts (100%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/types/guards/isFieldSelect.ts (100%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/types/guards/isFieldSelectValue.ts (65%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/types/guards/isFieldText.ts (100%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/types/guards/isFieldTextValue.ts (100%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/types/guards/isFieldUuid.ts (100%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/types/resolvers/DoubleTextTypeResolver.ts (100%) rename packages/twenty-front/src/modules/object-record/{field => record-field}/utils/__tests__/isFieldValueEmpty.test.ts (92%) create mode 100644 packages/twenty-front/src/modules/object-record/record-field/utils/computeDraftValueFromFieldValue.ts create mode 100644 packages/twenty-front/src/modules/object-record/record-field/utils/computeDraftValueFromString.ts create mode 100644 packages/twenty-front/src/modules/object-record/record-field/utils/computeEmptyDraftValue.ts create mode 100644 packages/twenty-front/src/modules/object-record/record-field/utils/isFieldValueEmpty.ts delete mode 100644 packages/twenty-front/src/modules/object-record/record-inline-cell/states/recoil-scope-contexts/FieldRecoilScopeContext.ts create mode 100644 packages/twenty-front/src/modules/ui/utilities/recoil-scope/utils/createSelectorReadOnlyScopeMap.ts create mode 100644 packages/twenty-front/src/modules/ui/utilities/recoil-scope/utils/getSelectorReadOnly.ts create mode 100644 packages/twenty-front/tsconfig.node.tsbuildinfo diff --git a/packages/twenty-front/src/modules/activities/files/components/AttachmentRow.tsx b/packages/twenty-front/src/modules/activities/files/components/AttachmentRow.tsx index fd69c39b1..4aac69cb7 100644 --- a/packages/twenty-front/src/modules/activities/files/components/AttachmentRow.tsx +++ b/packages/twenty-front/src/modules/activities/files/components/AttachmentRow.tsx @@ -7,11 +7,11 @@ import { AttachmentIcon } from '@/activities/files/components/AttachmentIcon'; import { Attachment } from '@/activities/files/types/Attachment'; import { downloadFile } from '@/activities/files/utils/downloadFile'; import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular'; +import { useDeleteOneRecord } from '@/object-record/hooks/useDeleteOneRecord'; import { FieldContext, GenericFieldContextType, -} from '@/object-record/field/contexts/FieldContext'; -import { useDeleteOneRecord } from '@/object-record/hooks/useDeleteOneRecord'; +} from '@/object-record/record-field/contexts/FieldContext'; import { IconCalendar } from '@/ui/display/icon'; import { REACT_APP_SERVER_BASE_URL } from '~/config'; import { formatToHumanReadableDate } from '~/utils'; diff --git a/packages/twenty-front/src/modules/activities/inline-cell/components/ActivityTargetsInlineCell.tsx b/packages/twenty-front/src/modules/activities/inline-cell/components/ActivityTargetsInlineCell.tsx index beb9930aa..284658934 100644 --- a/packages/twenty-front/src/modules/activities/inline-cell/components/ActivityTargetsInlineCell.tsx +++ b/packages/twenty-front/src/modules/activities/inline-cell/components/ActivityTargetsInlineCell.tsx @@ -3,11 +3,10 @@ import { useActivityTargetObjectRecords } from '@/activities/hooks/useActivityTa import { ActivityTargetInlineCellEditMode } from '@/activities/inline-cell/components/ActivityTargetInlineCellEditMode'; import { ActivityTarget } from '@/activities/types/ActivityTarget'; import { GraphQLActivity } from '@/activities/types/GraphQLActivity'; +import { RecordFieldInputScope } from '@/object-record/record-field/scopes/RecordFieldInputScope'; import { RecordInlineCellContainer } from '@/object-record/record-inline-cell/components/RecordInlineCellContainer'; -import { FieldRecoilScopeContext } from '@/object-record/record-inline-cell/states/recoil-scope-contexts/FieldRecoilScopeContext'; import { RelationPickerHotkeyScope } from '@/object-record/relation-picker/types/RelationPickerHotkeyScope'; import { IconArrowUpRight, IconPencil } from '@/ui/display/icon'; -import { RecoilScope } from '@/ui/utilities/recoil-scope/components/RecoilScope'; type ActivityTargetsInlineCellProps = { activity?: Pick & { @@ -27,7 +26,7 @@ export const ActivityTargetsInlineCell = ({ }); return ( - + - + ); }; diff --git a/packages/twenty-front/src/modules/activities/notes/components/NoteCard.tsx b/packages/twenty-front/src/modules/activities/notes/components/NoteCard.tsx index 3b63e6b12..7fb2abdd6 100644 --- a/packages/twenty-front/src/modules/activities/notes/components/NoteCard.tsx +++ b/packages/twenty-front/src/modules/activities/notes/components/NoteCard.tsx @@ -10,7 +10,7 @@ import { getActivityPreview } from '@/activities/utils/getActivityPreview'; import { FieldContext, GenericFieldContextType, -} from '@/object-record/field/contexts/FieldContext'; +} from '@/object-record/record-field/contexts/FieldContext'; import { IconComment } from '@/ui/display/icon'; const StyledCard = styled.div<{ isSingleNote: boolean }>` diff --git a/packages/twenty-front/src/modules/companies/components/CompanyBoardCard.tsx b/packages/twenty-front/src/modules/companies/components/CompanyBoardCard.tsx index 3352dd969..59e81cecf 100644 --- a/packages/twenty-front/src/modules/companies/components/CompanyBoardCard.tsx +++ b/packages/twenty-front/src/modules/companies/components/CompanyBoardCard.tsx @@ -3,16 +3,16 @@ import styled from '@emotion/styled'; import { useRecoilState, useRecoilValue } from 'recoil'; import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular'; -import { - FieldContext, - RecordUpdateHook, - RecordUpdateHookParams, -} from '@/object-record/field/contexts/FieldContext'; import { useUpdateOneRecord } from '@/object-record/hooks/useUpdateOneRecord'; import { BoardCardIdContext } from '@/object-record/record-board-deprecated/contexts/BoardCardIdContext'; import { useCurrentRecordBoardDeprecatedCardSelectedInternal } from '@/object-record/record-board-deprecated/hooks/internal/useCurrentRecordBoardDeprecatedCardSelectedInternal'; import { useRecordBoardDeprecatedScopedStates } from '@/object-record/record-board-deprecated/hooks/internal/useRecordBoardDeprecatedScopedStates'; import { isRecordBoardDeprecatedCardInCompactViewFamilyState } from '@/object-record/record-board-deprecated/states/isRecordBoardDeprecatedCardInCompactViewFamilyState'; +import { + FieldContext, + RecordUpdateHook, + RecordUpdateHookParams, +} from '@/object-record/record-field/contexts/FieldContext'; import { RecordInlineCell } from '@/object-record/record-inline-cell/components/RecordInlineCell'; import { InlineCellHotkeyScope } from '@/object-record/record-inline-cell/types/InlineCellHotkeyScope'; import { EntityChipVariant } from '@/ui/display/chip/components/EntityChip'; diff --git a/packages/twenty-front/src/modules/companies/utils/__tests__/mapBoardFieldDefinitionsToViewFields.test.ts b/packages/twenty-front/src/modules/companies/utils/__tests__/mapBoardFieldDefinitionsToViewFields.test.ts index 43c471610..b8a34352a 100644 --- a/packages/twenty-front/src/modules/companies/utils/__tests__/mapBoardFieldDefinitionsToViewFields.test.ts +++ b/packages/twenty-front/src/modules/companies/utils/__tests__/mapBoardFieldDefinitionsToViewFields.test.ts @@ -1,6 +1,6 @@ import { mapBoardFieldDefinitionsToViewFields } from '@/companies/utils/mapBoardFieldDefinitionsToViewFields'; -import { FieldMetadata } from '@/object-record/field/types/FieldMetadata'; import { BoardFieldDefinition } from '@/object-record/record-board-deprecated/types/BoardFieldDefinition'; +import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata'; describe('mapBoardFieldDefinitionsToViewFields', () => { it('should map board field definitions to view fields', () => { diff --git a/packages/twenty-front/src/modules/companies/utils/mapBoardFieldDefinitionsToViewFields.ts b/packages/twenty-front/src/modules/companies/utils/mapBoardFieldDefinitionsToViewFields.ts index 8010bee3c..3dd49c95c 100644 --- a/packages/twenty-front/src/modules/companies/utils/mapBoardFieldDefinitionsToViewFields.ts +++ b/packages/twenty-front/src/modules/companies/utils/mapBoardFieldDefinitionsToViewFields.ts @@ -1,5 +1,5 @@ -import { FieldMetadata } from '@/object-record/field/types/FieldMetadata'; import { BoardFieldDefinition } from '@/object-record/record-board-deprecated/types/BoardFieldDefinition'; +import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata'; import { ViewField } from '@/views/types/ViewField'; export const mapBoardFieldDefinitionsToViewFields = ( diff --git a/packages/twenty-front/src/modules/object-metadata/hooks/useColumnDefinitionsFromFieldMetadata.ts b/packages/twenty-front/src/modules/object-metadata/hooks/useColumnDefinitionsFromFieldMetadata.ts index 28d0e0ab3..b161fe418 100644 --- a/packages/twenty-front/src/modules/object-metadata/hooks/useColumnDefinitionsFromFieldMetadata.ts +++ b/packages/twenty-front/src/modules/object-metadata/hooks/useColumnDefinitionsFromFieldMetadata.ts @@ -1,7 +1,7 @@ import { useMemo } from 'react'; import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem'; -import { FieldMetadata } from '@/object-record/field/types/FieldMetadata'; +import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata'; import { ColumnDefinition } from '@/object-record/record-table/types/ColumnDefinition'; import { Nullable } from '~/types/Nullable'; diff --git a/packages/twenty-front/src/modules/object-metadata/hooks/useCreateOneFieldMetadataItem.ts b/packages/twenty-front/src/modules/object-metadata/hooks/useCreateOneFieldMetadataItem.ts index f0f604da1..e6a0dd894 100644 --- a/packages/twenty-front/src/modules/object-metadata/hooks/useCreateOneFieldMetadataItem.ts +++ b/packages/twenty-front/src/modules/object-metadata/hooks/useCreateOneFieldMetadataItem.ts @@ -1,7 +1,7 @@ import { ApolloClient, useMutation } from '@apollo/client'; import { getOperationName } from '@apollo/client/utilities'; -import { FieldType } from '@/object-record/field/types/FieldType'; +import { FieldType } from '@/object-record/record-field/types/FieldType'; import { CreateOneFieldMetadataItemMutation, CreateOneFieldMetadataItemMutationVariables, diff --git a/packages/twenty-front/src/modules/object-metadata/hooks/useFieldMetadataItem.ts b/packages/twenty-front/src/modules/object-metadata/hooks/useFieldMetadataItem.ts index 34f94996f..d2606ad92 100644 --- a/packages/twenty-front/src/modules/object-metadata/hooks/useFieldMetadataItem.ts +++ b/packages/twenty-front/src/modules/object-metadata/hooks/useFieldMetadataItem.ts @@ -1,6 +1,6 @@ import { v4 } from 'uuid'; -import { FieldType } from '@/object-record/field/types/FieldType'; +import { FieldType } from '@/object-record/record-field/types/FieldType'; import { Field } from '~/generated/graphql'; import { FieldMetadataType } from '~/generated-metadata/graphql'; diff --git a/packages/twenty-front/src/modules/object-metadata/hooks/useMapFieldMetadataToGraphQLQuery.ts b/packages/twenty-front/src/modules/object-metadata/hooks/useMapFieldMetadataToGraphQLQuery.ts index 5dced82b1..c1a30aad4 100644 --- a/packages/twenty-front/src/modules/object-metadata/hooks/useMapFieldMetadataToGraphQLQuery.ts +++ b/packages/twenty-front/src/modules/object-metadata/hooks/useMapFieldMetadataToGraphQLQuery.ts @@ -1,7 +1,7 @@ import { useRecoilValue } from 'recoil'; import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState'; -import { FieldType } from '@/object-record/field/types/FieldType'; +import { FieldType } from '@/object-record/record-field/types/FieldType'; import { FieldMetadataItem } from '../types/FieldMetadataItem'; diff --git a/packages/twenty-front/src/modules/object-metadata/utils/formatFieldMetadataItemAsColumnDefinition.ts b/packages/twenty-front/src/modules/object-metadata/utils/formatFieldMetadataItemAsColumnDefinition.ts index 9cae48681..750f12481 100644 --- a/packages/twenty-front/src/modules/object-metadata/utils/formatFieldMetadataItemAsColumnDefinition.ts +++ b/packages/twenty-front/src/modules/object-metadata/utils/formatFieldMetadataItemAsColumnDefinition.ts @@ -1,6 +1,6 @@ import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem'; import { parseFieldRelationType } from '@/object-metadata/utils/parseFieldRelationType'; -import { FieldMetadata } from '@/object-record/field/types/FieldMetadata'; +import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata'; import { ColumnDefinition } from '@/object-record/record-table/types/ColumnDefinition'; import { FieldMetadataItem } from '../types/FieldMetadataItem'; diff --git a/packages/twenty-front/src/modules/object-metadata/utils/parseFieldRelationType.ts b/packages/twenty-front/src/modules/object-metadata/utils/parseFieldRelationType.ts index 85996df0f..65a90c8fa 100644 --- a/packages/twenty-front/src/modules/object-metadata/utils/parseFieldRelationType.ts +++ b/packages/twenty-front/src/modules/object-metadata/utils/parseFieldRelationType.ts @@ -1,5 +1,5 @@ import { FieldMetadataItem } from '@/object-metadata/types/FieldMetadataItem'; -import { FieldDefinitionRelationType } from '@/object-record/field/types/FieldDefinition'; +import { FieldDefinitionRelationType } from '@/object-record/record-field/types/FieldDefinition'; import { FieldMetadataType, RelationMetadataType, diff --git a/packages/twenty-front/src/modules/object-metadata/utils/parseFieldType.ts b/packages/twenty-front/src/modules/object-metadata/utils/parseFieldType.ts index 6cdd79b76..84ac0e1a9 100644 --- a/packages/twenty-front/src/modules/object-metadata/utils/parseFieldType.ts +++ b/packages/twenty-front/src/modules/object-metadata/utils/parseFieldType.ts @@ -1,4 +1,4 @@ -import { FieldType } from '@/object-record/field/types/FieldType'; +import { FieldType } from '@/object-record/record-field/types/FieldType'; import { FieldMetadataType } from '~/generated-metadata/graphql'; export const parseFieldType = (fieldType: FieldMetadataType): FieldType => { diff --git a/packages/twenty-front/src/modules/object-record/field/hooks/__tests__/useFieldInitialValue.test.tsx b/packages/twenty-front/src/modules/object-record/field/hooks/__tests__/useFieldInitialValue.test.tsx deleted file mode 100644 index 46d9131d4..000000000 --- a/packages/twenty-front/src/modules/object-record/field/hooks/__tests__/useFieldInitialValue.test.tsx +++ /dev/null @@ -1,62 +0,0 @@ -import { ReactNode } from 'react'; -import { act, renderHook } from '@testing-library/react'; -import { RecoilRoot, useSetRecoilState } from 'recoil'; - -import { - fieldMetadataId, - textfieldDefinition, -} from '@/object-record/field/__mocks__/fieldDefinitions'; -import { FieldContext } from '@/object-record/field/contexts/FieldContext'; -import { entityFieldInitialValueFamilyState } from '@/object-record/field/states/entityFieldInitialValueFamilyState'; - -import { useFieldInitialValue } from '../useFieldInitialValue'; - -const entityId = 'entityId'; - -const wrapper = ({ children }: { children: ReactNode }) => ( - - - {children} - - -); - -describe('useFieldInitialValue', () => { - it('should work as expected', () => { - const { result } = renderHook( - () => { - const setFieldInitialValue = useSetRecoilState( - entityFieldInitialValueFamilyState({ - fieldMetadataId, - entityId, - }), - ); - - return { - setFieldInitialValue, - fieldInitialValue: useFieldInitialValue(), - }; - }, - { - wrapper, - }, - ); - - expect(result.current.fieldInitialValue).toBeUndefined(); - - const initialValue = { isEmpty: false, value: 'Sheldon Cooper' }; - - act(() => { - result.current.setFieldInitialValue(initialValue); - }); - - expect(result.current.fieldInitialValue).toEqual(initialValue); - }); -}); diff --git a/packages/twenty-front/src/modules/object-record/field/hooks/__tests__/useIsFieldEditModeValueEmpty.test.tsx b/packages/twenty-front/src/modules/object-record/field/hooks/__tests__/useIsFieldEditModeValueEmpty.test.tsx deleted file mode 100644 index ad359ae68..000000000 --- a/packages/twenty-front/src/modules/object-record/field/hooks/__tests__/useIsFieldEditModeValueEmpty.test.tsx +++ /dev/null @@ -1,52 +0,0 @@ -import { ReactNode } from 'react'; -import { act, renderHook } from '@testing-library/react'; -import { RecoilRoot, useSetRecoilState } from 'recoil'; - -import { phoneFieldDefinition } from '@/object-record/field/__mocks__/fieldDefinitions'; -import { FieldContext } from '@/object-record/field/contexts/FieldContext'; -import { useIsFieldEditModeValueEmpty } from '@/object-record/field/hooks/useIsFieldEditModeValueEmpty'; -import { entityFieldsEditModeValueFamilyState } from '@/object-record/field/states/entityFieldsEditModeValueFamilyState'; - -const entityId = 'entityId'; - -const Wrapper = ({ children }: { children: ReactNode }) => ( - - {children} - -); - -describe('useIsFieldEditModeValueEmpty', () => { - it('should work as expected', () => { - const { result } = renderHook( - () => { - const setFieldEditModeValue = useSetRecoilState( - entityFieldsEditModeValueFamilyState(entityId), - ); - return { - setFieldEditModeValue, - isFieldEditModeValueEmpty: useIsFieldEditModeValueEmpty(), - }; - }, - { - wrapper: Wrapper, - }, - ); - - expect(result.current.isFieldEditModeValueEmpty).toBe(true); - - act(() => { - result.current.setFieldEditModeValue({ - phone: '+1 233223', - }); - }); - - expect(result.current.isFieldEditModeValueEmpty).toBe(false); - }); -}); diff --git a/packages/twenty-front/src/modules/object-record/field/hooks/__tests__/useSaveFieldEditModeValue.test.tsx b/packages/twenty-front/src/modules/object-record/field/hooks/__tests__/useSaveFieldEditModeValue.test.tsx deleted file mode 100644 index 4b972f6f7..000000000 --- a/packages/twenty-front/src/modules/object-record/field/hooks/__tests__/useSaveFieldEditModeValue.test.tsx +++ /dev/null @@ -1,57 +0,0 @@ -import { ReactNode } from 'react'; -import { MockedProvider } from '@apollo/client/testing'; -import { act, renderHook } from '@testing-library/react'; -import { RecoilRoot, useRecoilValue } from 'recoil'; - -import { phoneFieldDefinition } from '@/object-record/field/__mocks__/fieldDefinitions'; -import { FieldContext } from '@/object-record/field/contexts/FieldContext'; -import { useSaveFieldEditModeValue } from '@/object-record/field/hooks/useSaveFieldEditModeValue'; -import { entityFieldsEditModeValueFamilySelector } from '@/object-record/field/states/selectors/entityFieldsEditModeValueFamilySelector'; - -const entityId = 'entityId'; -const fieldName = 'phone'; - -const Wrapper = ({ children }: { children: ReactNode }) => { - return ( - - - {children} - - - ); -}; - -describe('useSaveFieldEditModeValue', () => { - it('should work as expected', () => { - const { - result: { current }, - } = renderHook( - () => { - const entityFieldsEditModeValue = useRecoilValue( - entityFieldsEditModeValueFamilySelector({ entityId, fieldName }), - ); - return { - saveFieldEditModeValue: useSaveFieldEditModeValue(), - entityFieldsEditModeValue, - }; - }, - { wrapper: Wrapper }, - ); - - expect(current.entityFieldsEditModeValue).toBeUndefined(); - - act(() => { - current.saveFieldEditModeValue('test'); - }); - - // We expect `current.entityFieldsEditModeValue` to be updated - // but I think it's async - }); -}); diff --git a/packages/twenty-front/src/modules/object-record/field/hooks/useFieldInitialValue.ts b/packages/twenty-front/src/modules/object-record/field/hooks/useFieldInitialValue.ts deleted file mode 100644 index a99563a40..000000000 --- a/packages/twenty-front/src/modules/object-record/field/hooks/useFieldInitialValue.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { useContext } from 'react'; -import { useRecoilValue } from 'recoil'; - -import { FieldContext } from '../contexts/FieldContext'; -import { entityFieldInitialValueFamilyState } from '../states/entityFieldInitialValueFamilyState'; - -export const useFieldInitialValue = () => { - const { entityId, fieldDefinition } = useContext(FieldContext); - - const fieldInitialValue = useRecoilValue( - entityFieldInitialValueFamilyState({ - fieldMetadataId: fieldDefinition.fieldMetadataId, - entityId, - }), - ); - - return fieldInitialValue; -}; diff --git a/packages/twenty-front/src/modules/object-record/field/hooks/useIsFieldEditModeValueEmpty.ts b/packages/twenty-front/src/modules/object-record/field/hooks/useIsFieldEditModeValueEmpty.ts deleted file mode 100644 index 515c17140..000000000 --- a/packages/twenty-front/src/modules/object-record/field/hooks/useIsFieldEditModeValueEmpty.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { useContext } from 'react'; -import { useRecoilValue } from 'recoil'; - -import { isEntityFieldEditModeEmptyFamilySelector } from '@/object-record/field/states/selectors/isEntityFieldEditModeEmptyFamilySelector'; - -import { FieldContext } from '../contexts/FieldContext'; - -export const useIsFieldEditModeValueEmpty = () => { - const { entityId, fieldDefinition } = useContext(FieldContext); - - const isFieldEditModeValueEmpty = useRecoilValue( - isEntityFieldEditModeEmptyFamilySelector({ - fieldDefinition: { - type: fieldDefinition.type, - }, - fieldName: fieldDefinition.metadata.fieldName, - entityId, - }), - ); - - return isFieldEditModeValueEmpty; -}; diff --git a/packages/twenty-front/src/modules/object-record/field/hooks/useSaveFieldEditModeValue.ts b/packages/twenty-front/src/modules/object-record/field/hooks/useSaveFieldEditModeValue.ts deleted file mode 100644 index db9c8d870..000000000 --- a/packages/twenty-front/src/modules/object-record/field/hooks/useSaveFieldEditModeValue.ts +++ /dev/null @@ -1,112 +0,0 @@ -import { useContext } from 'react'; -import { useRecoilCallback } from 'recoil'; - -import { entityFieldsEditModeValueFamilySelector } from '@/object-record/field/states/selectors/entityFieldsEditModeValueFamilySelector'; -import { isFieldFullName } from '@/object-record/field/types/guards/isFieldFullName'; -import { isFieldFullNameValue } from '@/object-record/field/types/guards/isFieldFullNameValue'; - -import { FieldContext } from '../contexts/FieldContext'; -import { isFieldBoolean } from '../types/guards/isFieldBoolean'; -import { isFieldBooleanValue } from '../types/guards/isFieldBooleanValue'; -import { isFieldCurrency } from '../types/guards/isFieldCurrency'; -import { isFieldCurrencyValue } from '../types/guards/isFieldCurrencyValue'; -import { isFieldDateTime } from '../types/guards/isFieldDateTime'; -import { isFieldDateTimeValue } from '../types/guards/isFieldDateTimeValue'; -import { isFieldEmail } from '../types/guards/isFieldEmail'; -import { isFieldEmailValue } from '../types/guards/isFieldEmailValue'; -import { isFieldLink } from '../types/guards/isFieldLink'; -import { isFieldLinkValue } from '../types/guards/isFieldLinkValue'; -import { isFieldNumber } from '../types/guards/isFieldNumber'; -import { isFieldNumberValue } from '../types/guards/isFieldNumberValue'; -import { isFieldPhone } from '../types/guards/isFieldPhone'; -import { isFieldPhoneValue } from '../types/guards/isFieldPhoneValue'; -import { isFieldRating } from '../types/guards/isFieldRating'; -import { isFieldRatingValue } from '../types/guards/isFieldRatingValue'; -import { isFieldRelation } from '../types/guards/isFieldRelation'; -import { isFieldRelationValue } from '../types/guards/isFieldRelationValue'; -import { isFieldText } from '../types/guards/isFieldText'; -import { isFieldTextValue } from '../types/guards/isFieldTextValue'; - -export const useSaveFieldEditModeValue = () => { - const { entityId, fieldDefinition } = useContext(FieldContext); - - const saveFieldEditModeValue = useRecoilCallback( - ({ set }) => - (currentValue: unknown) => { - const fieldIsRelation = - isFieldRelation(fieldDefinition) && - isFieldRelationValue(currentValue); - - const fieldIsText = - isFieldText(fieldDefinition) && isFieldTextValue(currentValue); - - const fieldIsEmail = - isFieldEmail(fieldDefinition) && isFieldEmailValue(currentValue); - - const fieldIsDateTime = - isFieldDateTime(fieldDefinition) && - isFieldDateTimeValue(currentValue); - - const fieldIsLink = - isFieldLink(fieldDefinition) && isFieldLinkValue(currentValue); - - const fieldIsBoolean = - isFieldBoolean(fieldDefinition) && isFieldBooleanValue(currentValue); - - const fieldIsProbability = - isFieldRating(fieldDefinition) && isFieldRatingValue(currentValue); - - const fieldIsNumber = - isFieldNumber(fieldDefinition) && isFieldNumberValue(currentValue); - - const fieldIsCurrency = - isFieldCurrency(fieldDefinition) && - isFieldCurrencyValue(currentValue); - - const fieldIsFullName = - isFieldFullName(fieldDefinition) && - isFieldFullNameValue(currentValue); - - const fieldIsPhone = - isFieldPhone(fieldDefinition) && isFieldPhoneValue(currentValue); - - if (fieldIsRelation) { - const fieldName = fieldDefinition.metadata.fieldName; - - set( - entityFieldsEditModeValueFamilySelector({ entityId, fieldName }), - currentValue, - ); - } else if ( - fieldIsText || - fieldIsBoolean || - fieldIsEmail || - fieldIsProbability || - fieldIsNumber || - fieldIsDateTime || - fieldIsPhone || - fieldIsLink || - fieldIsCurrency || - fieldIsFullName - ) { - const fieldName = fieldDefinition.metadata.fieldName; - - set( - entityFieldsEditModeValueFamilySelector({ entityId, fieldName }), - currentValue, - ); - } else { - throw new Error( - `Invalid value to save: ${JSON.stringify( - currentValue, - )} for type : ${ - fieldDefinition.type - }, type may not be implemented in useSaveFieldEditModeValue.`, - ); - } - }, - [entityId, fieldDefinition], - ); - - return saveFieldEditModeValue; -}; diff --git a/packages/twenty-front/src/modules/object-record/field/states/entityFieldInitialValueFamilyState.ts b/packages/twenty-front/src/modules/object-record/field/states/entityFieldInitialValueFamilyState.ts deleted file mode 100644 index 6b08b4655..000000000 --- a/packages/twenty-front/src/modules/object-record/field/states/entityFieldInitialValueFamilyState.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { atomFamily } from 'recoil'; - -import { FieldInitialValue } from '../types/FieldInitialValue'; - -export const entityFieldInitialValueFamilyState = atomFamily< - FieldInitialValue | undefined, - { entityId: string; fieldMetadataId: string } ->({ - key: 'entityFieldInitialValueFamilyState', - default: undefined, -}); diff --git a/packages/twenty-front/src/modules/object-record/field/states/entityFieldsEditModeValueFamilyState.ts b/packages/twenty-front/src/modules/object-record/field/states/entityFieldsEditModeValueFamilyState.ts deleted file mode 100644 index 72d6def07..000000000 --- a/packages/twenty-front/src/modules/object-record/field/states/entityFieldsEditModeValueFamilyState.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { atomFamily } from 'recoil'; - -export const entityFieldsEditModeValueFamilyState = atomFamily< - Record | null, - string ->({ - key: 'entityFieldsEditModeValueFamilyState', - default: null, -}); diff --git a/packages/twenty-front/src/modules/object-record/field/states/isFieldEmptyScopedState.ts b/packages/twenty-front/src/modules/object-record/field/states/isFieldEmptyScopedState.ts deleted file mode 100644 index 8045f5cc9..000000000 --- a/packages/twenty-front/src/modules/object-record/field/states/isFieldEmptyScopedState.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { atomFamily } from 'recoil'; - -export const isFieldEmptyScopedState = atomFamily({ - key: 'isFieldEmptyScopedState', - default: false, -}); diff --git a/packages/twenty-front/src/modules/object-record/field/states/selectors/entityFieldsEditModeValueFamilySelector.ts b/packages/twenty-front/src/modules/object-record/field/states/selectors/entityFieldsEditModeValueFamilySelector.ts deleted file mode 100644 index c7478e544..000000000 --- a/packages/twenty-front/src/modules/object-record/field/states/selectors/entityFieldsEditModeValueFamilySelector.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { selectorFamily } from 'recoil'; - -import { entityFieldsEditModeValueFamilyState } from '@/object-record/field/states/entityFieldsEditModeValueFamilyState'; - -export const entityFieldsEditModeValueFamilySelector = selectorFamily({ - key: 'entityFieldsEditModeValueFamilySelector', - get: - ({ fieldName, entityId }: { fieldName: string; entityId: string }) => - ({ get }) => - get(entityFieldsEditModeValueFamilyState(entityId))?.[fieldName] as T, - set: - ({ fieldName, entityId }: { fieldName: string; entityId: string }) => - ({ set }, newValue: T) => - set(entityFieldsEditModeValueFamilyState(entityId), (prevState) => ({ - ...prevState, - [fieldName]: newValue, - })), -}); diff --git a/packages/twenty-front/src/modules/object-record/field/states/selectors/isEntityFieldEditModeEmptyFamilySelector.ts b/packages/twenty-front/src/modules/object-record/field/states/selectors/isEntityFieldEditModeEmptyFamilySelector.ts deleted file mode 100644 index 1421ab30a..000000000 --- a/packages/twenty-front/src/modules/object-record/field/states/selectors/isEntityFieldEditModeEmptyFamilySelector.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { selectorFamily } from 'recoil'; - -import { entityFieldsEditModeValueFamilyState } from '@/object-record/field/states/entityFieldsEditModeValueFamilyState'; -import { isFieldValueEmpty } from '@/object-record/field/utils/isFieldValueEmpty'; - -import { FieldDefinition } from '../../types/FieldDefinition'; -import { FieldMetadata } from '../../types/FieldMetadata'; - -export const isEntityFieldEditModeEmptyFamilySelector = selectorFamily({ - key: 'isEntityFieldEditModeEmptyFamilySelector', - get: ({ - fieldDefinition, - fieldName, - entityId, - }: { - fieldDefinition: Pick, 'type'>; - fieldName: string; - entityId: string; - }) => { - return ({ get }) => { - const fieldValue = get(entityFieldsEditModeValueFamilyState(entityId))?.[ - fieldName - ]; - - return isFieldValueEmpty({ - fieldDefinition, - fieldValue, - }); - }; - }, -}); diff --git a/packages/twenty-front/src/modules/object-record/field/states/selectors/isEntityFieldEmptyFamilySelector.ts b/packages/twenty-front/src/modules/object-record/field/states/selectors/isEntityFieldEmptyFamilySelector.ts deleted file mode 100644 index 2e5f3ad00..000000000 --- a/packages/twenty-front/src/modules/object-record/field/states/selectors/isEntityFieldEmptyFamilySelector.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { selectorFamily } from 'recoil'; - -import { isFieldValueEmpty } from '@/object-record/field/utils/isFieldValueEmpty'; -import { recordStoreFamilyState } from '@/object-record/record-store/states/recordStoreFamilyState'; - -import { FieldDefinition } from '../../types/FieldDefinition'; -import { FieldMetadata } from '../../types/FieldMetadata'; - -export const isEntityFieldEmptyFamilySelector = selectorFamily({ - key: 'isEntityFieldEmptyFamilySelector', - get: ({ - fieldDefinition, - fieldName, - entityId, - }: { - fieldDefinition: Pick, 'type'>; - fieldName: string; - entityId: string; - }) => { - return ({ get }) => { - const fieldValue = get(recordStoreFamilyState(entityId))?.[fieldName]; - - return isFieldValueEmpty({ - fieldDefinition, - fieldValue, - }); - }; - }, -}); diff --git a/packages/twenty-front/src/modules/object-record/field/types/FieldInitialValue.ts b/packages/twenty-front/src/modules/object-record/field/types/FieldInitialValue.ts deleted file mode 100644 index e6353e9c0..000000000 --- a/packages/twenty-front/src/modules/object-record/field/types/FieldInitialValue.ts +++ /dev/null @@ -1,4 +0,0 @@ -export type FieldInitialValue = { - isEmpty?: boolean; - value?: string; -}; diff --git a/packages/twenty-front/src/modules/object-record/field/utils/isFieldValueEmpty.ts b/packages/twenty-front/src/modules/object-record/field/utils/isFieldValueEmpty.ts deleted file mode 100644 index 0ef057221..000000000 --- a/packages/twenty-front/src/modules/object-record/field/utils/isFieldValueEmpty.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { FieldDefinition } from '@/object-record/field/types/FieldDefinition'; -import { FieldMetadata } from '@/object-record/field/types/FieldMetadata'; -import { isFieldBoolean } from '@/object-record/field/types/guards/isFieldBoolean'; -import { isFieldCurrency } from '@/object-record/field/types/guards/isFieldCurrency'; -import { isFieldCurrencyValue } from '@/object-record/field/types/guards/isFieldCurrencyValue'; -import { isFieldDateTime } from '@/object-record/field/types/guards/isFieldDateTime'; -import { isFieldEmail } from '@/object-record/field/types/guards/isFieldEmail'; -import { isFieldFullName } from '@/object-record/field/types/guards/isFieldFullName'; -import { isFieldFullNameValue } from '@/object-record/field/types/guards/isFieldFullNameValue'; -import { isFieldLink } from '@/object-record/field/types/guards/isFieldLink'; -import { isFieldLinkValue } from '@/object-record/field/types/guards/isFieldLinkValue'; -import { isFieldNumber } from '@/object-record/field/types/guards/isFieldNumber'; -import { isFieldRating } from '@/object-record/field/types/guards/isFieldRating'; -import { isFieldRelation } from '@/object-record/field/types/guards/isFieldRelation'; -import { isFieldRelationValue } from '@/object-record/field/types/guards/isFieldRelationValue'; -import { isFieldSelect } from '@/object-record/field/types/guards/isFieldSelect'; -import { isFieldSelectValue } from '@/object-record/field/types/guards/isFieldSelectValue'; -import { isFieldText } from '@/object-record/field/types/guards/isFieldText'; -import { isFieldUuid } from '@/object-record/field/types/guards/isFieldUuid'; -import { assertNotNull } from '~/utils/assert'; - -const isValueEmpty = (value: unknown) => !assertNotNull(value) || value === ''; - -export const isFieldValueEmpty = ({ - fieldDefinition, - fieldValue, -}: { - fieldDefinition: Pick, 'type'>; - fieldValue: unknown; -}) => { - if ( - isFieldUuid(fieldDefinition) || - isFieldText(fieldDefinition) || - isFieldDateTime(fieldDefinition) || - isFieldNumber(fieldDefinition) || - isFieldRating(fieldDefinition) || - isFieldEmail(fieldDefinition) || - isFieldBoolean(fieldDefinition) - //|| isFieldPhone(fieldDefinition) - ) { - return isValueEmpty(fieldValue); - } - - if (isFieldRelation(fieldDefinition)) { - return isFieldRelationValue(fieldValue) && isValueEmpty(fieldValue); - } - - if (isFieldSelect(fieldDefinition)) { - return isFieldSelectValue(fieldValue) && !assertNotNull(fieldValue); - } - - if (isFieldCurrency(fieldDefinition)) { - return ( - !isFieldCurrencyValue(fieldValue) || - isValueEmpty(fieldValue?.amountMicros) - ); - } - - if (isFieldFullName(fieldDefinition)) { - return ( - !isFieldFullNameValue(fieldValue) || - isValueEmpty(fieldValue?.firstName + fieldValue?.lastName) - ); - } - - if (isFieldLink(fieldDefinition)) { - return !isFieldLinkValue(fieldValue) || isValueEmpty(fieldValue?.url); - } - - throw new Error( - `Entity field type not supported in isEntityFieldEditModeEmptyFamilySelector : ${fieldDefinition.type}}`, - ); -}; diff --git a/packages/twenty-front/src/modules/object-record/hooks/useFieldContext.tsx b/packages/twenty-front/src/modules/object-record/hooks/useFieldContext.tsx index 930de356a..c3f6b68b1 100644 --- a/packages/twenty-front/src/modules/object-record/hooks/useFieldContext.tsx +++ b/packages/twenty-front/src/modules/object-record/hooks/useFieldContext.tsx @@ -2,12 +2,12 @@ import { ReactNode } from 'react'; import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem'; import { formatFieldMetadataItemAsColumnDefinition } from '@/object-metadata/utils/formatFieldMetadataItemAsColumnDefinition'; +import { useUpdateOneRecord } from '@/object-record/hooks/useUpdateOneRecord'; import { FieldContext, RecordUpdateHook, RecordUpdateHookParams, -} from '@/object-record/field/contexts/FieldContext'; -import { useUpdateOneRecord } from '@/object-record/hooks/useUpdateOneRecord'; +} from '@/object-record/record-field/contexts/FieldContext'; import { InlineCellHotkeyScope } from '@/object-record/record-inline-cell/types/InlineCellHotkeyScope'; export const useFieldContext = ({ diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/components/RecordBoardDeprecatedEffect.tsx b/packages/twenty-front/src/modules/object-record/record-board-deprecated/components/RecordBoardDeprecatedEffect.tsx index d94458453..1e73d9410 100644 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/components/RecordBoardDeprecatedEffect.tsx +++ b/packages/twenty-front/src/modules/object-record/record-board-deprecated/components/RecordBoardDeprecatedEffect.tsx @@ -1,8 +1,8 @@ import { useEffect } from 'react'; -import { FieldMetadata } from '@/object-record/field/types/FieldMetadata'; import { useRecordBoardDeprecated } from '@/object-record/record-board-deprecated/hooks/useRecordBoardDeprecated'; import { BoardFieldDefinition } from '@/object-record/record-board-deprecated/types/BoardFieldDefinition'; +import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata'; type RecordBoardDeprecatedEffectProps = { recordBoardId: string; diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/hooks/internal/__tests__/useRecordBoardCardFieldsInternal.test.tsx b/packages/twenty-front/src/modules/object-record/record-board-deprecated/hooks/internal/__tests__/useRecordBoardCardFieldsInternal.test.tsx index 600096d9e..175b5bc74 100644 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/hooks/internal/__tests__/useRecordBoardCardFieldsInternal.test.tsx +++ b/packages/twenty-front/src/modules/object-record/record-board-deprecated/hooks/internal/__tests__/useRecordBoardCardFieldsInternal.test.tsx @@ -2,11 +2,11 @@ import { act } from 'react-dom/test-utils'; import { renderHook, waitFor } from '@testing-library/react'; import { RecoilRoot, useRecoilState, useRecoilValue } from 'recoil'; -import { FieldType } from '@/object-record/field/types/FieldType'; import { useRecordBoardDeprecatedCardFieldsInternal } from '@/object-record/record-board-deprecated/hooks/internal/useRecordBoardDeprecatedCardFieldsInternal'; import { onFieldsChangeScopedState } from '@/object-record/record-board-deprecated/states/onFieldsChangeScopedState'; import { recordBoardCardFieldsScopedState } from '@/object-record/record-board-deprecated/states/recordBoardDeprecatedCardFieldsScopedState'; import { savedRecordBoardDeprecatedCardFieldsScopedState } from '@/object-record/record-board-deprecated/states/savedRecordBoardDeprecatedCardFieldsScopedState'; +import { FieldType } from '@/object-record/record-field/types/FieldType'; const recordBoardScopeId = 'recordBoardScopeId'; diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/hooks/internal/useRecordBoardDeprecatedCardFieldsInternal.ts b/packages/twenty-front/src/modules/object-record/record-board-deprecated/hooks/internal/useRecordBoardDeprecatedCardFieldsInternal.ts index 13cec33a7..6ee2c04f4 100644 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/hooks/internal/useRecordBoardDeprecatedCardFieldsInternal.ts +++ b/packages/twenty-front/src/modules/object-record/record-board-deprecated/hooks/internal/useRecordBoardDeprecatedCardFieldsInternal.ts @@ -1,12 +1,12 @@ import { useCallback } from 'react'; import { useRecoilCallback, useSetRecoilState } from 'recoil'; -import { FieldMetadata } from '@/object-record/field/types/FieldMetadata'; import { RecordBoardDeprecatedScopeInternalContext } from '@/object-record/record-board-deprecated/scopes/scope-internal-context/RecordBoardDeprecatedScopeInternalContext'; import { onFieldsChangeScopedState } from '@/object-record/record-board-deprecated/states/onFieldsChangeScopedState'; import { recordBoardCardFieldsScopedState } from '@/object-record/record-board-deprecated/states/recordBoardDeprecatedCardFieldsScopedState'; import { savedRecordBoardDeprecatedCardFieldsScopedState } from '@/object-record/record-board-deprecated/states/savedRecordBoardDeprecatedCardFieldsScopedState'; import { BoardFieldDefinition } from '@/object-record/record-board-deprecated/types/BoardFieldDefinition'; +import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata'; import { ColumnDefinition } from '@/object-record/record-table/types/ColumnDefinition'; import { useAvailableScopeIdOrThrow } from '@/ui/utilities/recoil-scope/scopes-internal/hooks/useAvailableScopeId'; diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/availableRecordBoardDeprecatedCardFieldsScopedState.ts b/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/availableRecordBoardDeprecatedCardFieldsScopedState.ts index 421c85a7e..3c397a042 100644 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/availableRecordBoardDeprecatedCardFieldsScopedState.ts +++ b/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/availableRecordBoardDeprecatedCardFieldsScopedState.ts @@ -1,4 +1,4 @@ -import { FieldMetadata } from '@/object-record/field/types/FieldMetadata'; +import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata'; import { createStateScopeMap } from '@/ui/utilities/recoil-scope/utils/createStateScopeMap'; import { BoardFieldDefinition } from '../types/BoardFieldDefinition'; diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/onFieldsChangeScopedState.ts b/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/onFieldsChangeScopedState.ts index fd5e886ca..d411b642a 100644 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/onFieldsChangeScopedState.ts +++ b/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/onFieldsChangeScopedState.ts @@ -1,5 +1,5 @@ -import { FieldMetadata } from '@/object-record/field/types/FieldMetadata'; import { BoardFieldDefinition } from '@/object-record/record-board-deprecated/types/BoardFieldDefinition'; +import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata'; import { createStateScopeMap } from '@/ui/utilities/recoil-scope/utils/createStateScopeMap'; export const onFieldsChangeScopedState = createStateScopeMap< diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/recordBoardDeprecatedCardFieldsScopedState.ts b/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/recordBoardDeprecatedCardFieldsScopedState.ts index 3aae12e9e..8bdefa0a2 100644 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/recordBoardDeprecatedCardFieldsScopedState.ts +++ b/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/recordBoardDeprecatedCardFieldsScopedState.ts @@ -1,4 +1,4 @@ -import { FieldMetadata } from '@/object-record/field/types/FieldMetadata'; +import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata'; import { createStateScopeMap } from '@/ui/utilities/recoil-scope/utils/createStateScopeMap'; import { BoardFieldDefinition } from '../types/BoardFieldDefinition'; diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/savedRecordBoardDeprecatedCardFieldsScopedState.ts b/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/savedRecordBoardDeprecatedCardFieldsScopedState.ts index 7a3882f17..5d129d2b8 100644 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/savedRecordBoardDeprecatedCardFieldsScopedState.ts +++ b/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/savedRecordBoardDeprecatedCardFieldsScopedState.ts @@ -1,4 +1,4 @@ -import { FieldMetadata } from '@/object-record/field/types/FieldMetadata'; +import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata'; import { createStateScopeMap } from '@/ui/utilities/recoil-scope/utils/createStateScopeMap'; import { BoardFieldDefinition } from '../types/BoardFieldDefinition'; diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/selectors/hiddenRecordBoardDeprecatedCardFieldsScopedSelector.ts b/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/selectors/hiddenRecordBoardDeprecatedCardFieldsScopedSelector.ts index d3fa538a8..d78a2c834 100644 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/selectors/hiddenRecordBoardDeprecatedCardFieldsScopedSelector.ts +++ b/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/selectors/hiddenRecordBoardDeprecatedCardFieldsScopedSelector.ts @@ -1,10 +1,10 @@ -import { createSelectorScopeMap } from '@/ui/utilities/recoil-scope/utils/createSelectorScopeMap'; +import { createSelectorReadOnlyScopeMap } from '@/ui/utilities/recoil-scope/utils/createSelectorReadOnlyScopeMap'; import { availableRecordBoardDeprecatedCardFieldsScopedState } from '../availableRecordBoardDeprecatedCardFieldsScopedState'; import { recordBoardCardFieldsScopedState } from '../recordBoardDeprecatedCardFieldsScopedState'; export const hiddenRecordBoardDeprecatedCardFieldsScopedSelector = - createSelectorScopeMap({ + createSelectorReadOnlyScopeMap({ key: 'hiddenRecordBoardDeprecatedCardFieldsScopedSelector', get: ({ scopeId }) => diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/selectors/recordBoardDeprecatedCardFieldsByKeyScopedSelector.ts b/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/selectors/recordBoardDeprecatedCardFieldsByKeyScopedSelector.ts index 8374f7126..63808d878 100644 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/selectors/recordBoardDeprecatedCardFieldsByKeyScopedSelector.ts +++ b/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/selectors/recordBoardDeprecatedCardFieldsByKeyScopedSelector.ts @@ -1,6 +1,6 @@ import { selectorFamily } from 'recoil'; -import { FieldMetadata } from '@/object-record/field/types/FieldMetadata'; +import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata'; import { BoardFieldDefinition } from '../../types/BoardFieldDefinition'; import { recordBoardCardFieldsScopedState } from '../recordBoardDeprecatedCardFieldsScopedState'; diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/selectors/selectedRecordBoardDeprecatedCardIdsScopedSelector.ts b/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/selectors/selectedRecordBoardDeprecatedCardIdsScopedSelector.ts index 381b31686..b4f65e584 100644 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/selectors/selectedRecordBoardDeprecatedCardIdsScopedSelector.ts +++ b/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/selectors/selectedRecordBoardDeprecatedCardIdsScopedSelector.ts @@ -1,11 +1,11 @@ -import { createSelectorScopeMap } from '@/ui/utilities/recoil-scope/utils/createSelectorScopeMap'; +import { createSelectorReadOnlyScopeMap } from '@/ui/utilities/recoil-scope/utils/createSelectorReadOnlyScopeMap'; import { isRecordBoardDeprecatedCardSelectedFamilyState } from '../isRecordBoardDeprecatedCardSelectedFamilyState'; import { recordBoardCardIdsByColumnIdFamilyState } from '../recordBoardCardIdsByColumnIdFamilyState'; import { recordBoardColumnsScopedState } from '../recordBoardColumnsScopedState'; export const selectedRecordBoardDeprecatedCardIdsScopedSelector = - createSelectorScopeMap({ + createSelectorReadOnlyScopeMap({ key: 'selectedRecordBoardDeprecatedCardIdsScopedSelector', get: ({ scopeId }) => diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/selectors/visibleRecordBoardDeprecatedCardFieldsScopedSelector.ts b/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/selectors/visibleRecordBoardDeprecatedCardFieldsScopedSelector.ts index 9a9e683b2..de9e1cba1 100644 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/selectors/visibleRecordBoardDeprecatedCardFieldsScopedSelector.ts +++ b/packages/twenty-front/src/modules/object-record/record-board-deprecated/states/selectors/visibleRecordBoardDeprecatedCardFieldsScopedSelector.ts @@ -1,9 +1,9 @@ -import { createSelectorScopeMap } from '@/ui/utilities/recoil-scope/utils/createSelectorScopeMap'; +import { createSelectorReadOnlyScopeMap } from '@/ui/utilities/recoil-scope/utils/createSelectorReadOnlyScopeMap'; import { recordBoardCardFieldsScopedState } from '../recordBoardDeprecatedCardFieldsScopedState'; export const visibleRecordBoardDeprecatedCardFieldsScopedSelector = - createSelectorScopeMap({ + createSelectorReadOnlyScopeMap({ key: 'visibleRecordBoardDeprecatedCardFieldsScopedSelector', get: ({ scopeId }) => diff --git a/packages/twenty-front/src/modules/object-record/record-board-deprecated/types/BoardFieldDefinition.ts b/packages/twenty-front/src/modules/object-record/record-board-deprecated/types/BoardFieldDefinition.ts index a2132cead..fc4c1e25b 100644 --- a/packages/twenty-front/src/modules/object-record/record-board-deprecated/types/BoardFieldDefinition.ts +++ b/packages/twenty-front/src/modules/object-record/record-board-deprecated/types/BoardFieldDefinition.ts @@ -1,5 +1,5 @@ -import { FieldDefinition } from '@/object-record/field/types/FieldDefinition'; -import { FieldMetadata } from '@/object-record/field/types/FieldMetadata'; +import { FieldDefinition } from '@/object-record/record-field/types/FieldDefinition'; +import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata'; export type BoardFieldDefinition = FieldDefinition & { diff --git a/packages/twenty-front/src/modules/object-record/record-board/components/RecordBoard.tsx b/packages/twenty-front/src/modules/object-record/record-board/components/RecordBoard.tsx index 7faaaa17e..ef3c3ab22 100644 --- a/packages/twenty-front/src/modules/object-record/record-board/components/RecordBoard.tsx +++ b/packages/twenty-front/src/modules/object-record/record-board/components/RecordBoard.tsx @@ -41,7 +41,6 @@ export const RecordBoard = ({ recordBoardId }: RecordBoardProps) => { const boardRef = useRef(null); const { getColumnIdsState } = useRecordBoardStates(recordBoardId); - const columnIds = useRecoilValue(getColumnIdsState()); return ( diff --git a/packages/twenty-front/src/modules/object-record/record-board/hooks/internal/useRecordBoardStates.ts b/packages/twenty-front/src/modules/object-record/record-board/hooks/internal/useRecordBoardStates.ts index 7e53b5ab0..18c63b269 100644 --- a/packages/twenty-front/src/modules/object-record/record-board/hooks/internal/useRecordBoardStates.ts +++ b/packages/twenty-front/src/modules/object-record/record-board/hooks/internal/useRecordBoardStates.ts @@ -14,7 +14,7 @@ import { recordBoardVisibleFieldDefinitionsScopedSelector } from '@/object-recor import { useAvailableScopeIdOrThrow } from '@/ui/utilities/recoil-scope/scopes-internal/hooks/useAvailableScopeId'; import { getFamilyState } from '@/ui/utilities/recoil-scope/utils/getFamilyState'; import { getScopeIdOrUndefinedFromComponentId } from '@/ui/utilities/recoil-scope/utils/getScopeIdOrUndefinedFromComponentId'; -import { getSelector } from '@/ui/utilities/recoil-scope/utils/getSelector'; +import { getSelectorReadOnly } from '@/ui/utilities/recoil-scope/utils/getSelectorReadOnly'; import { getState } from '@/ui/utilities/recoil-scope/utils/getState'; export const useRecordBoardStates = (recordBoardId?: string) => { @@ -49,7 +49,7 @@ export const useRecordBoardStates = (recordBoardId?: string) => { recordBoardFieldDefinitionsStateScopeMap, scopeId, ), - getVisibleFieldDefinitionsState: getSelector( + getVisibleFieldDefinitionsState: getSelectorReadOnly( recordBoardVisibleFieldDefinitionsScopedSelector, scopeId, ), diff --git a/packages/twenty-front/src/modules/object-record/record-board/hooks/internal/useSetRecordBoardRecordIds.ts b/packages/twenty-front/src/modules/object-record/record-board/hooks/internal/useSetRecordBoardRecordIds.ts index b0fa4fb17..aa40b3377 100644 --- a/packages/twenty-front/src/modules/object-record/record-board/hooks/internal/useSetRecordBoardRecordIds.ts +++ b/packages/twenty-front/src/modules/object-record/record-board/hooks/internal/useSetRecordBoardRecordIds.ts @@ -2,6 +2,7 @@ import { useRecoilCallback } from 'recoil'; import { useRecordBoardStates } from '@/object-record/record-board/hooks/internal/useRecordBoardStates'; import { ObjectRecord } from '@/object-record/types/ObjectRecord'; +import { isDeeplyEqual } from '~/utils/isDeeplyEqual'; export const useSetRecordBoardRecordIds = (recordBoardId?: string) => { const { @@ -21,13 +22,20 @@ export const useSetRecordBoardRecordIds = (recordBoardId?: string) => { .getLoadable(columnsFamilySelector(columnId)) .getValue(); + const existingColumnRecordIds = snapshot + .getLoadable(recordBoardRecordIdsByColumnIdFamilyState(columnId)) + .getValue(); + const columnRecordIds = records .filter((record) => record.stage === column?.value) .map((record) => record.id); - set( - recordBoardRecordIdsByColumnIdFamilyState(columnId), - columnRecordIds, - ); + + if (!isDeeplyEqual(existingColumnRecordIds, columnRecordIds)) { + set( + recordBoardRecordIdsByColumnIdFamilyState(columnId), + columnRecordIds, + ); + } }); }, [ diff --git a/packages/twenty-front/src/modules/object-record/record-board/record-board-card/components/RecordBoardCard.tsx b/packages/twenty-front/src/modules/object-record/record-board/record-board-card/components/RecordBoardCard.tsx index c0edfd533..14e8af122 100644 --- a/packages/twenty-front/src/modules/object-record/record-board/record-board-card/components/RecordBoardCard.tsx +++ b/packages/twenty-front/src/modules/object-record/record-board/record-board-card/components/RecordBoardCard.tsx @@ -3,9 +3,9 @@ import styled from '@emotion/styled'; import { useRecoilState, useRecoilValue } from 'recoil'; import { RecordChip } from '@/object-record/components/RecordChip'; -import { FieldContext } from '@/object-record/field/contexts/FieldContext'; import { useRecordBoardStates } from '@/object-record/record-board/hooks/internal/useRecordBoardStates'; import { RecordBoardCardContext } from '@/object-record/record-board/record-board-card/contexts/RecordBoardCardContext'; +import { FieldContext } from '@/object-record/record-field/contexts/FieldContext'; import { RecordInlineCell } from '@/object-record/record-inline-cell/components/RecordInlineCell'; import { InlineCellHotkeyScope } from '@/object-record/record-inline-cell/types/InlineCellHotkeyScope'; import { recordStoreFamilyState } from '@/object-record/record-store/states/recordStoreFamilyState'; @@ -205,6 +205,7 @@ export const RecordBoardCard = () => { recoilScopeId: recordId + fieldDefinition.fieldMetadataId, isLabelIdentifier: false, fieldDefinition: { + disableTooltip: true, fieldMetadataId: fieldDefinition.fieldMetadataId, label: fieldDefinition.label, iconName: fieldDefinition.iconName, diff --git a/packages/twenty-front/src/modules/object-record/record-board/scopes/RecordBoardScope.tsx b/packages/twenty-front/src/modules/object-record/record-board/scopes/RecordBoardScope.tsx index 58ab59ec0..0de4d6025 100644 --- a/packages/twenty-front/src/modules/object-record/record-board/scopes/RecordBoardScope.tsx +++ b/packages/twenty-front/src/modules/object-record/record-board/scopes/RecordBoardScope.tsx @@ -1,9 +1,9 @@ import { ReactNode } from 'react'; -import { FieldDefinition } from '@/object-record/field/types/FieldDefinition'; -import { FieldMetadata } from '@/object-record/field/types/FieldMetadata'; import { RecordBoardScopeInternalContext } from '@/object-record/record-board/scopes/scope-internal-context/RecordBoardScopeInternalContext'; import { RecordBoardColumnDefinition } from '@/object-record/record-board/types/RecordBoardColumnDefinition'; +import { FieldDefinition } from '@/object-record/record-field/types/FieldDefinition'; +import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata'; type RecordBoardScopeProps = { children: ReactNode; diff --git a/packages/twenty-front/src/modules/object-record/record-board/scopes/scope-internal-context/RecordBoardScopeInternalContext.ts b/packages/twenty-front/src/modules/object-record/record-board/scopes/scope-internal-context/RecordBoardScopeInternalContext.ts index 7b5b10dc6..03da78cce 100644 --- a/packages/twenty-front/src/modules/object-record/record-board/scopes/scope-internal-context/RecordBoardScopeInternalContext.ts +++ b/packages/twenty-front/src/modules/object-record/record-board/scopes/scope-internal-context/RecordBoardScopeInternalContext.ts @@ -1,13 +1,13 @@ -import { FieldDefinition } from '@/object-record/field/types/FieldDefinition'; -import { FieldMetadata } from '@/object-record/field/types/FieldMetadata'; import { RecordBoardColumnDefinition } from '@/object-record/record-board/types/RecordBoardColumnDefinition'; +import { FieldDefinition } from '@/object-record/record-field/types/FieldDefinition'; +import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata'; import { StateScopeMapKey } from '@/ui/utilities/recoil-scope/scopes-internal/types/StateScopeMapKey'; import { createScopeInternalContext } from '@/ui/utilities/recoil-scope/scopes-internal/utils/createScopeInternalContext'; -type RecordBoardDeprecatedScopeInternalContextProps = StateScopeMapKey & { +type RecordBoardScopeInternalContextProps = StateScopeMapKey & { onFieldsChange: (fields: FieldDefinition[]) => void; onColumnsChange: (column: RecordBoardColumnDefinition[]) => void; }; export const RecordBoardScopeInternalContext = - createScopeInternalContext(); + createScopeInternalContext(); diff --git a/packages/twenty-front/src/modules/object-record/record-board/states/recordBoardFieldDefinitionsStateScopeMap.ts b/packages/twenty-front/src/modules/object-record/record-board/states/recordBoardFieldDefinitionsStateScopeMap.ts index db00cd8fd..4248350bc 100644 --- a/packages/twenty-front/src/modules/object-record/record-board/states/recordBoardFieldDefinitionsStateScopeMap.ts +++ b/packages/twenty-front/src/modules/object-record/record-board/states/recordBoardFieldDefinitionsStateScopeMap.ts @@ -1,5 +1,5 @@ -import { FieldMetadata } from '@/object-record/field/types/FieldMetadata'; import { RecordBoardFieldDefinition } from '@/object-record/record-board/types/RecordBoardFieldDefinition'; +import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata'; import { createStateScopeMap } from '@/ui/utilities/recoil-scope/utils/createStateScopeMap'; export const recordBoardFieldDefinitionsStateScopeMap = createStateScopeMap< diff --git a/packages/twenty-front/src/modules/object-record/record-board/states/selectors/recordBoardVisibleFieldDefinitionsScopedSelector.ts b/packages/twenty-front/src/modules/object-record/record-board/states/selectors/recordBoardVisibleFieldDefinitionsScopedSelector.ts index fbcbeba7d..edae8d879 100644 --- a/packages/twenty-front/src/modules/object-record/record-board/states/selectors/recordBoardVisibleFieldDefinitionsScopedSelector.ts +++ b/packages/twenty-front/src/modules/object-record/record-board/states/selectors/recordBoardVisibleFieldDefinitionsScopedSelector.ts @@ -1,8 +1,8 @@ import { recordBoardFieldDefinitionsStateScopeMap } from '@/object-record/record-board/states/recordBoardFieldDefinitionsStateScopeMap'; -import { createSelectorScopeMap } from '@/ui/utilities/recoil-scope/utils/createSelectorScopeMap'; +import { createSelectorReadOnlyScopeMap } from '@/ui/utilities/recoil-scope/utils/createSelectorReadOnlyScopeMap'; export const recordBoardVisibleFieldDefinitionsScopedSelector = - createSelectorScopeMap({ + createSelectorReadOnlyScopeMap({ key: 'recordBoardVisibleFieldDefinitionsScopedSelector', get: ({ scopeId }) => diff --git a/packages/twenty-front/src/modules/object-record/record-board/types/RecordBoardFieldDefinition.ts b/packages/twenty-front/src/modules/object-record/record-board/types/RecordBoardFieldDefinition.ts index bd7bef44d..779c73243 100644 --- a/packages/twenty-front/src/modules/object-record/record-board/types/RecordBoardFieldDefinition.ts +++ b/packages/twenty-front/src/modules/object-record/record-board/types/RecordBoardFieldDefinition.ts @@ -1,5 +1,5 @@ -import { FieldDefinition } from '@/object-record/field/types/FieldDefinition'; -import { FieldMetadata } from '@/object-record/field/types/FieldMetadata'; +import { FieldDefinition } from '@/object-record/record-field/types/FieldDefinition'; +import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata'; export type RecordBoardFieldDefinition = FieldDefinition & { diff --git a/packages/twenty-front/src/modules/object-record/field/__mocks__/fieldDefinitions.ts b/packages/twenty-front/src/modules/object-record/record-field/__mocks__/fieldDefinitions.ts similarity index 94% rename from packages/twenty-front/src/modules/object-record/field/__mocks__/fieldDefinitions.ts rename to packages/twenty-front/src/modules/object-record/record-field/__mocks__/fieldDefinitions.ts index 5adb123ae..443a0ac1d 100644 --- a/packages/twenty-front/src/modules/object-record/field/__mocks__/fieldDefinitions.ts +++ b/packages/twenty-front/src/modules/object-record/record-field/__mocks__/fieldDefinitions.ts @@ -1,4 +1,4 @@ -import { FieldDefinition } from '@/object-record/field/types/FieldDefinition'; +import { FieldDefinition } from '@/object-record/record-field/types/FieldDefinition'; import { FieldBooleanMetadata, FieldFullNameMetadata, @@ -8,7 +8,7 @@ import { FieldRelationMetadata, FieldSelectMetadata, FieldTextMetadata, -} from '@/object-record/field/types/FieldMetadata'; +} from '@/object-record/record-field/types/FieldMetadata'; export const fieldMetadataId = 'fieldMetadataId'; diff --git a/packages/twenty-front/src/modules/object-record/field/components/FieldDisplay.tsx b/packages/twenty-front/src/modules/object-record/record-field/components/FieldDisplay.tsx similarity index 100% rename from packages/twenty-front/src/modules/object-record/field/components/FieldDisplay.tsx rename to packages/twenty-front/src/modules/object-record/record-field/components/FieldDisplay.tsx diff --git a/packages/twenty-front/src/modules/object-record/field/components/FieldInput.tsx b/packages/twenty-front/src/modules/object-record/record-field/components/FieldInput.tsx similarity index 83% rename from packages/twenty-front/src/modules/object-record/field/components/FieldInput.tsx rename to packages/twenty-front/src/modules/object-record/record-field/components/FieldInput.tsx index c9505d357..40c59eacd 100644 --- a/packages/twenty-front/src/modules/object-record/field/components/FieldInput.tsx +++ b/packages/twenty-front/src/modules/object-record/record-field/components/FieldInput.tsx @@ -1,10 +1,11 @@ import { useContext } from 'react'; -import { FullNameFieldInput } from '@/object-record/field/meta-types/input/components/FullNameFieldInput'; -import { SelectFieldInput } from '@/object-record/field/meta-types/input/components/SelectFieldInput'; -import { isFieldFullName } from '@/object-record/field/types/guards/isFieldFullName'; -import { isFieldSelect } from '@/object-record/field/types/guards/isFieldSelect'; -import { RecoilScope } from '@/ui/utilities/recoil-scope/components/RecoilScope'; +import { FullNameFieldInput } from '@/object-record/record-field/meta-types/input/components/FullNameFieldInput'; +import { SelectFieldInput } from '@/object-record/record-field/meta-types/input/components/SelectFieldInput'; +import { RecordFieldInputScope } from '@/object-record/record-field/scopes/RecordFieldInputScope'; +import { isFieldFullName } from '@/object-record/record-field/types/guards/isFieldFullName'; +import { isFieldSelect } from '@/object-record/record-field/types/guards/isFieldSelect'; +import { getScopeIdFromComponentId } from '@/ui/utilities/recoil-scope/utils/getScopeIdFromComponentId'; import { FieldContext } from '../contexts/FieldContext'; import { BooleanFieldInput } from '../meta-types/input/components/BooleanFieldInput'; @@ -30,6 +31,7 @@ import { isFieldRelation } from '../types/guards/isFieldRelation'; import { isFieldText } from '../types/guards/isFieldText'; type FieldInputProps = { + recordFieldInputdId: string; onSubmit?: FieldInputEvent; onCancel?: () => void; onClickOutside?: FieldInputEvent; @@ -40,6 +42,7 @@ type FieldInputProps = { }; export const FieldInput = ({ + recordFieldInputdId, onCancel, onSubmit, onEnter, @@ -51,11 +54,11 @@ export const FieldInput = ({ const { fieldDefinition } = useContext(FieldContext); return ( - <> + {isFieldRelation(fieldDefinition) ? ( - - - + ) : isFieldPhone(fieldDefinition) ? ( )} - + ); }; diff --git a/packages/twenty-front/src/modules/object-record/field/contexts/FieldContext.ts b/packages/twenty-front/src/modules/object-record/record-field/contexts/FieldContext.ts similarity index 100% rename from packages/twenty-front/src/modules/object-record/field/contexts/FieldContext.ts rename to packages/twenty-front/src/modules/object-record/record-field/contexts/FieldContext.ts diff --git a/packages/twenty-front/src/modules/object-record/field/hooks/__tests__/useGetButtonIcon.test.tsx b/packages/twenty-front/src/modules/object-record/record-field/hooks/__tests__/useGetButtonIcon.test.tsx similarity index 76% rename from packages/twenty-front/src/modules/object-record/field/hooks/__tests__/useGetButtonIcon.test.tsx rename to packages/twenty-front/src/modules/object-record/record-field/hooks/__tests__/useGetButtonIcon.test.tsx index 7b5e711be..6e8266aee 100644 --- a/packages/twenty-front/src/modules/object-record/field/hooks/__tests__/useGetButtonIcon.test.tsx +++ b/packages/twenty-front/src/modules/object-record/record-field/hooks/__tests__/useGetButtonIcon.test.tsx @@ -5,11 +5,11 @@ import { RecoilRoot } from 'recoil'; import { phoneFieldDefinition, relationFieldDefinition, -} from '@/object-record/field/__mocks__/fieldDefinitions'; -import { FieldContext } from '@/object-record/field/contexts/FieldContext'; -import { useGetButtonIcon } from '@/object-record/field/hooks/useGetButtonIcon'; -import { FieldDefinition } from '@/object-record/field/types/FieldDefinition'; -import { FieldMetadata } from '@/object-record/field/types/FieldMetadata'; +} from '@/object-record/record-field/__mocks__/fieldDefinitions'; +import { FieldContext } from '@/object-record/record-field/contexts/FieldContext'; +import { useGetButtonIcon } from '@/object-record/record-field/hooks/useGetButtonIcon'; +import { FieldDefinition } from '@/object-record/record-field/types/FieldDefinition'; +import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata'; import { IconPencil } from '@/ui/display/icon'; const entityId = 'entityId'; diff --git a/packages/twenty-front/src/modules/object-record/field/hooks/__tests__/useIsFieldEmpty.test.tsx b/packages/twenty-front/src/modules/object-record/record-field/hooks/__tests__/useIsFieldEmpty.test.tsx similarity index 82% rename from packages/twenty-front/src/modules/object-record/field/hooks/__tests__/useIsFieldEmpty.test.tsx rename to packages/twenty-front/src/modules/object-record/record-field/hooks/__tests__/useIsFieldEmpty.test.tsx index 033505424..821891c84 100644 --- a/packages/twenty-front/src/modules/object-record/field/hooks/__tests__/useIsFieldEmpty.test.tsx +++ b/packages/twenty-front/src/modules/object-record/record-field/hooks/__tests__/useIsFieldEmpty.test.tsx @@ -2,9 +2,9 @@ import { ReactNode } from 'react'; import { act, renderHook } from '@testing-library/react'; import { RecoilRoot, useSetRecoilState } from 'recoil'; -import { phoneFieldDefinition } from '@/object-record/field/__mocks__/fieldDefinitions'; -import { FieldContext } from '@/object-record/field/contexts/FieldContext'; -import { useIsFieldEmpty } from '@/object-record/field/hooks/useIsFieldEmpty'; +import { phoneFieldDefinition } from '@/object-record/record-field/__mocks__/fieldDefinitions'; +import { FieldContext } from '@/object-record/record-field/contexts/FieldContext'; +import { useIsFieldEmpty } from '@/object-record/record-field/hooks/useIsFieldEmpty'; import { recordStoreFamilyState } from '@/object-record/record-store/states/recordStoreFamilyState'; const entityId = 'entityId'; diff --git a/packages/twenty-front/src/modules/object-record/field/hooks/__tests__/useIsFieldInputOnly.test.tsx b/packages/twenty-front/src/modules/object-record/record-field/hooks/__tests__/useIsFieldInputOnly.test.tsx similarity index 72% rename from packages/twenty-front/src/modules/object-record/field/hooks/__tests__/useIsFieldInputOnly.test.tsx rename to packages/twenty-front/src/modules/object-record/record-field/hooks/__tests__/useIsFieldInputOnly.test.tsx index a59a2b3fb..35fa4d13c 100644 --- a/packages/twenty-front/src/modules/object-record/field/hooks/__tests__/useIsFieldInputOnly.test.tsx +++ b/packages/twenty-front/src/modules/object-record/record-field/hooks/__tests__/useIsFieldInputOnly.test.tsx @@ -5,11 +5,11 @@ import { RecoilRoot } from 'recoil'; import { phoneFieldDefinition, ratingfieldDefinition, -} from '@/object-record/field/__mocks__/fieldDefinitions'; -import { FieldContext } from '@/object-record/field/contexts/FieldContext'; -import { useIsFieldInputOnly } from '@/object-record/field/hooks/useIsFieldInputOnly'; -import { FieldDefinition } from '@/object-record/field/types/FieldDefinition'; -import { FieldMetadata } from '@/object-record/field/types/FieldMetadata'; +} from '@/object-record/record-field/__mocks__/fieldDefinitions'; +import { FieldContext } from '@/object-record/record-field/contexts/FieldContext'; +import { useIsFieldInputOnly } from '@/object-record/record-field/hooks/useIsFieldInputOnly'; +import { FieldDefinition } from '@/object-record/record-field/types/FieldDefinition'; +import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata'; const entityId = 'entityId'; diff --git a/packages/twenty-front/src/modules/object-record/field/hooks/__tests__/usePersistField.test.tsx b/packages/twenty-front/src/modules/object-record/record-field/hooks/__tests__/usePersistField.test.tsx similarity index 91% rename from packages/twenty-front/src/modules/object-record/field/hooks/__tests__/usePersistField.test.tsx rename to packages/twenty-front/src/modules/object-record/record-field/hooks/__tests__/usePersistField.test.tsx index c627add01..698364b1d 100644 --- a/packages/twenty-front/src/modules/object-record/field/hooks/__tests__/usePersistField.test.tsx +++ b/packages/twenty-front/src/modules/object-record/record-field/hooks/__tests__/usePersistField.test.tsx @@ -5,19 +5,19 @@ import { act, renderHook, waitFor } from '@testing-library/react'; import { RecoilRoot, useRecoilValue } from 'recoil'; import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular'; +import { useUpdateOneRecord } from '@/object-record/hooks/useUpdateOneRecord'; import { phoneFieldDefinition, relationFieldDefinition, -} from '@/object-record/field/__mocks__/fieldDefinitions'; +} from '@/object-record/record-field/__mocks__/fieldDefinitions'; import { FieldContext, RecordUpdateHook, RecordUpdateHookParams, -} from '@/object-record/field/contexts/FieldContext'; -import { usePersistField } from '@/object-record/field/hooks/usePersistField'; -import { FieldDefinition } from '@/object-record/field/types/FieldDefinition'; -import { FieldMetadata } from '@/object-record/field/types/FieldMetadata'; -import { useUpdateOneRecord } from '@/object-record/hooks/useUpdateOneRecord'; +} from '@/object-record/record-field/contexts/FieldContext'; +import { usePersistField } from '@/object-record/record-field/hooks/usePersistField'; +import { FieldDefinition } from '@/object-record/record-field/types/FieldDefinition'; +import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata'; import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector'; jest.mock('@/object-metadata/hooks/useMapFieldMetadataToGraphQLQuery', () => ({ diff --git a/packages/twenty-front/src/modules/object-record/field/hooks/__tests__/useToggleEditOnlyInput.test.tsx b/packages/twenty-front/src/modules/object-record/record-field/hooks/__tests__/useToggleEditOnlyInput.test.tsx similarity index 90% rename from packages/twenty-front/src/modules/object-record/field/hooks/__tests__/useToggleEditOnlyInput.test.tsx rename to packages/twenty-front/src/modules/object-record/record-field/hooks/__tests__/useToggleEditOnlyInput.test.tsx index 3bbd662d9..878b7a16b 100644 --- a/packages/twenty-front/src/modules/object-record/field/hooks/__tests__/useToggleEditOnlyInput.test.tsx +++ b/packages/twenty-front/src/modules/object-record/record-field/hooks/__tests__/useToggleEditOnlyInput.test.tsx @@ -5,14 +5,14 @@ import { act, renderHook, waitFor } from '@testing-library/react'; import { RecoilRoot } from 'recoil'; import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular'; -import { booleanFieldDefinition } from '@/object-record/field/__mocks__/fieldDefinitions'; +import { useUpdateOneRecord } from '@/object-record/hooks/useUpdateOneRecord'; +import { booleanFieldDefinition } from '@/object-record/record-field/__mocks__/fieldDefinitions'; import { FieldContext, RecordUpdateHook, RecordUpdateHookParams, -} from '@/object-record/field/contexts/FieldContext'; -import { useToggleEditOnlyInput } from '@/object-record/field/hooks/useToggleEditOnlyInput'; -import { useUpdateOneRecord } from '@/object-record/hooks/useUpdateOneRecord'; +} from '@/object-record/record-field/contexts/FieldContext'; +import { useToggleEditOnlyInput } from '@/object-record/record-field/hooks/useToggleEditOnlyInput'; jest.mock('@/object-metadata/hooks/useMapFieldMetadataToGraphQLQuery', () => ({ useMapFieldMetadataToGraphQLQuery: () => () => '\n', diff --git a/packages/twenty-front/src/modules/object-record/record-field/hooks/internal/useRecordFieldInputStates.ts b/packages/twenty-front/src/modules/object-record/record-field/hooks/internal/useRecordFieldInputStates.ts new file mode 100644 index 000000000..8efcb745d --- /dev/null +++ b/packages/twenty-front/src/modules/object-record/record-field/hooks/internal/useRecordFieldInputStates.ts @@ -0,0 +1,22 @@ +import { RecordFieldInputScopeInternalContext } from '@/object-record/record-field/scopes/scope-internal-context/RecordFieldInputScopeInternalContext'; +import { recordFieldInputDraftValueSelectorScopeMap } from '@/object-record/record-field/states/selectors/recordFieldInputDraftValueSelectorScopeMap'; +import { FieldInputDraftValue } from '@/object-record/record-field/types/FieldInputDraftValue'; +import { useAvailableScopeIdOrThrow } from '@/ui/utilities/recoil-scope/scopes-internal/hooks/useAvailableScopeId'; +import { getScopeIdOrUndefinedFromComponentId } from '@/ui/utilities/recoil-scope/utils/getScopeIdOrUndefinedFromComponentId'; +import { getSelector } from '@/ui/utilities/recoil-scope/utils/getSelector'; + +export const useRecordFieldInputStates = ( + recordFieldInputId?: string, +) => { + const scopeId = useAvailableScopeIdOrThrow( + RecordFieldInputScopeInternalContext, + getScopeIdOrUndefinedFromComponentId(recordFieldInputId), + ); + + return { + scopeId, + getDraftValueSelector: getSelector< + FieldInputDraftValue | undefined + >(recordFieldInputDraftValueSelectorScopeMap, scopeId), + }; +}; diff --git a/packages/twenty-front/src/modules/object-record/field/hooks/useGetButtonIcon.ts b/packages/twenty-front/src/modules/object-record/record-field/hooks/useGetButtonIcon.ts similarity index 90% rename from packages/twenty-front/src/modules/object-record/field/hooks/useGetButtonIcon.ts rename to packages/twenty-front/src/modules/object-record/record-field/hooks/useGetButtonIcon.ts index b0405bb56..18ca7ecb3 100644 --- a/packages/twenty-front/src/modules/object-record/field/hooks/useGetButtonIcon.ts +++ b/packages/twenty-front/src/modules/object-record/record-field/hooks/useGetButtonIcon.ts @@ -1,6 +1,6 @@ import { useContext } from 'react'; -import { isFieldRelation } from '@/object-record/field/types/guards/isFieldRelation'; +import { isFieldRelation } from '@/object-record/record-field/types/guards/isFieldRelation'; import { IconPencil } from '@/ui/display/icon'; import { IconComponent } from '@/ui/display/icon/types/IconComponent'; diff --git a/packages/twenty-front/src/modules/object-record/field/hooks/useIsFieldEmpty.ts b/packages/twenty-front/src/modules/object-record/record-field/hooks/useIsFieldEmpty.ts similarity index 86% rename from packages/twenty-front/src/modules/object-record/field/hooks/useIsFieldEmpty.ts rename to packages/twenty-front/src/modules/object-record/record-field/hooks/useIsFieldEmpty.ts index 975d9c5a9..793cd53f4 100644 --- a/packages/twenty-front/src/modules/object-record/field/hooks/useIsFieldEmpty.ts +++ b/packages/twenty-front/src/modules/object-record/record-field/hooks/useIsFieldEmpty.ts @@ -1,7 +1,7 @@ import { useContext } from 'react'; import { useRecoilValue } from 'recoil'; -import { isFieldValueEmpty } from '@/object-record/field/utils/isFieldValueEmpty'; +import { isFieldValueEmpty } from '@/object-record/record-field/utils/isFieldValueEmpty'; import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector'; import { FieldContext } from '../contexts/FieldContext'; diff --git a/packages/twenty-front/src/modules/object-record/field/hooks/useIsFieldInputOnly.ts b/packages/twenty-front/src/modules/object-record/record-field/hooks/useIsFieldInputOnly.ts similarity index 100% rename from packages/twenty-front/src/modules/object-record/field/hooks/useIsFieldInputOnly.ts rename to packages/twenty-front/src/modules/object-record/record-field/hooks/useIsFieldInputOnly.ts diff --git a/packages/twenty-front/src/modules/object-record/field/hooks/usePersistField.ts b/packages/twenty-front/src/modules/object-record/record-field/hooks/usePersistField.ts similarity index 92% rename from packages/twenty-front/src/modules/object-record/field/hooks/usePersistField.ts rename to packages/twenty-front/src/modules/object-record/record-field/hooks/usePersistField.ts index e95447aed..13433d552 100644 --- a/packages/twenty-front/src/modules/object-record/field/hooks/usePersistField.ts +++ b/packages/twenty-front/src/modules/object-record/record-field/hooks/usePersistField.ts @@ -1,10 +1,10 @@ import { useContext } from 'react'; import { useRecoilCallback } from 'recoil'; -import { isFieldFullName } from '@/object-record/field/types/guards/isFieldFullName'; -import { isFieldFullNameValue } from '@/object-record/field/types/guards/isFieldFullNameValue'; -import { isFieldSelect } from '@/object-record/field/types/guards/isFieldSelect'; -import { isFieldSelectValue } from '@/object-record/field/types/guards/isFieldSelectValue'; +import { isFieldFullName } from '@/object-record/record-field/types/guards/isFieldFullName'; +import { isFieldFullNameValue } from '@/object-record/record-field/types/guards/isFieldFullNameValue'; +import { isFieldSelect } from '@/object-record/record-field/types/guards/isFieldSelect'; +import { isFieldSelectValue } from '@/object-record/record-field/types/guards/isFieldSelectValue'; import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector'; import { FieldContext } from '../contexts/FieldContext'; diff --git a/packages/twenty-front/src/modules/object-record/record-field/hooks/useRecordFieldInput.ts b/packages/twenty-front/src/modules/object-record/record-field/hooks/useRecordFieldInput.ts new file mode 100644 index 000000000..0aefcca7e --- /dev/null +++ b/packages/twenty-front/src/modules/object-record/record-field/hooks/useRecordFieldInput.ts @@ -0,0 +1,73 @@ +import { useContext } from 'react'; +import { isUndefined } from '@sniptt/guards'; +import { useRecoilCallback, useSetRecoilState } from 'recoil'; + +import { FieldContext } from '@/object-record/record-field/contexts/FieldContext'; +import { useRecordFieldInputStates } from '@/object-record/record-field/hooks/internal/useRecordFieldInputStates'; +import { FieldInputDraftValue } from '@/object-record/record-field/types/FieldInputDraftValue'; +import { computeDraftValueFromFieldValue } from '@/object-record/record-field/utils/computeDraftValueFromFieldValue'; +import { computeDraftValueFromString } from '@/object-record/record-field/utils/computeDraftValueFromString'; +import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector'; + +export const useRecordFieldInput = ( + recordFieldInputId?: string, +) => { + const { scopeId, getDraftValueSelector } = + useRecordFieldInputStates(recordFieldInputId); + + const { entityId, fieldDefinition } = useContext(FieldContext); + + const setDraftValue = useSetRecoilState(getDraftValueSelector()); + + const initDraftValue = useRecoilCallback( + ({ set, snapshot }) => + (value?: string) => { + const recordFieldValue = snapshot + .getLoadable( + recordStoreFamilySelector({ + recordId: entityId, + fieldName: fieldDefinition.metadata.fieldName, + }), + ) + .getValue(); + + if (isUndefined(value)) { + set( + getDraftValueSelector(), + computeDraftValueFromFieldValue({ + fieldValue: recordFieldValue, + fieldDefinition, + }), + ); + } else { + set( + getDraftValueSelector(), + computeDraftValueFromString({ value, fieldDefinition }), + ); + } + }, + [entityId, fieldDefinition, getDraftValueSelector], + ); + + const isDraftValueEmpty = ( + value: FieldInputDraftValue | undefined, + ) => { + if (value === null || value === undefined) { + return true; + } + + if (typeof value === 'string' && value === '') { + return true; + } + + return false; + }; + + return { + scopeId, + setDraftValue, + getDraftValueSelector, + initDraftValue, + isDraftValueEmpty, + }; +}; diff --git a/packages/twenty-front/src/modules/object-record/field/hooks/useToggleEditOnlyInput.ts b/packages/twenty-front/src/modules/object-record/record-field/hooks/useToggleEditOnlyInput.ts similarity index 100% rename from packages/twenty-front/src/modules/object-record/field/hooks/useToggleEditOnlyInput.ts rename to packages/twenty-front/src/modules/object-record/record-field/hooks/useToggleEditOnlyInput.ts diff --git a/packages/twenty-front/src/modules/object-record/field/meta-types/__stories__/FieldContextProvider.tsx b/packages/twenty-front/src/modules/object-record/record-field/meta-types/__stories__/FieldContextProvider.tsx similarity index 91% rename from packages/twenty-front/src/modules/object-record/field/meta-types/__stories__/FieldContextProvider.tsx rename to packages/twenty-front/src/modules/object-record/record-field/meta-types/__stories__/FieldContextProvider.tsx index fe0ba66c7..7a7fb2a47 100644 --- a/packages/twenty-front/src/modules/object-record/field/meta-types/__stories__/FieldContextProvider.tsx +++ b/packages/twenty-front/src/modules/object-record/record-field/meta-types/__stories__/FieldContextProvider.tsx @@ -1,7 +1,7 @@ import { FieldContext, GenericFieldContextType, -} from '@/object-record/field/contexts/FieldContext'; +} from '@/object-record/record-field/contexts/FieldContext'; type FieldContextProviderProps = { children: React.ReactNode; diff --git a/packages/twenty-front/src/modules/object-record/field/meta-types/display/components/ChipFieldDisplay.tsx b/packages/twenty-front/src/modules/object-record/record-field/meta-types/display/components/ChipFieldDisplay.tsx similarity index 76% rename from packages/twenty-front/src/modules/object-record/field/meta-types/display/components/ChipFieldDisplay.tsx rename to packages/twenty-front/src/modules/object-record/record-field/meta-types/display/components/ChipFieldDisplay.tsx index 1fbc34038..f81059005 100644 --- a/packages/twenty-front/src/modules/object-record/field/meta-types/display/components/ChipFieldDisplay.tsx +++ b/packages/twenty-front/src/modules/object-record/record-field/meta-types/display/components/ChipFieldDisplay.tsx @@ -1,5 +1,5 @@ import { RecordChip } from '@/object-record/components/RecordChip'; -import { useChipField } from '@/object-record/field/meta-types/hooks/useChipField'; +import { useChipField } from '@/object-record/record-field/meta-types/hooks/useChipField'; export const ChipFieldDisplay = () => { const { objectNameSingular, record } = useChipField(); diff --git a/packages/twenty-front/src/modules/object-record/field/meta-types/display/components/CurrencyFieldDisplay.tsx b/packages/twenty-front/src/modules/object-record/record-field/meta-types/display/components/CurrencyFieldDisplay.tsx similarity index 51% rename from packages/twenty-front/src/modules/object-record/field/meta-types/display/components/CurrencyFieldDisplay.tsx rename to packages/twenty-front/src/modules/object-record/record-field/meta-types/display/components/CurrencyFieldDisplay.tsx index 000127ce7..c7988a1d4 100644 --- a/packages/twenty-front/src/modules/object-record/field/meta-types/display/components/CurrencyFieldDisplay.tsx +++ b/packages/twenty-front/src/modules/object-record/record-field/meta-types/display/components/CurrencyFieldDisplay.tsx @@ -3,7 +3,13 @@ import { CurrencyDisplay } from '@/ui/field/display/components/CurrencyDisplay'; import { useCurrencyField } from '../../hooks/useCurrencyField'; export const CurrencyFieldDisplay = () => { - const { initialAmount } = useCurrencyField(); + const { fieldValue } = useCurrencyField(); - return ; + return ( + + ); }; diff --git a/packages/twenty-front/src/modules/object-record/field/meta-types/display/components/DateFieldDisplay.tsx b/packages/twenty-front/src/modules/object-record/record-field/meta-types/display/components/DateFieldDisplay.tsx similarity index 100% rename from packages/twenty-front/src/modules/object-record/field/meta-types/display/components/DateFieldDisplay.tsx rename to packages/twenty-front/src/modules/object-record/record-field/meta-types/display/components/DateFieldDisplay.tsx diff --git a/packages/twenty-front/src/modules/object-record/field/meta-types/display/components/EmailFieldDisplay.tsx b/packages/twenty-front/src/modules/object-record/record-field/meta-types/display/components/EmailFieldDisplay.tsx similarity index 100% rename from packages/twenty-front/src/modules/object-record/field/meta-types/display/components/EmailFieldDisplay.tsx rename to packages/twenty-front/src/modules/object-record/record-field/meta-types/display/components/EmailFieldDisplay.tsx diff --git a/packages/twenty-front/src/modules/object-record/field/meta-types/display/components/FullNameFieldDisplay.tsx b/packages/twenty-front/src/modules/object-record/record-field/meta-types/display/components/FullNameFieldDisplay.tsx similarity index 75% rename from packages/twenty-front/src/modules/object-record/field/meta-types/display/components/FullNameFieldDisplay.tsx rename to packages/twenty-front/src/modules/object-record/record-field/meta-types/display/components/FullNameFieldDisplay.tsx index c18ea5ab8..e98d43ea7 100644 --- a/packages/twenty-front/src/modules/object-record/field/meta-types/display/components/FullNameFieldDisplay.tsx +++ b/packages/twenty-front/src/modules/object-record/record-field/meta-types/display/components/FullNameFieldDisplay.tsx @@ -1,4 +1,4 @@ -import { useFullNameField } from '@/object-record/field/meta-types/hooks/useFullNameField'; +import { useFullNameField } from '@/object-record/record-field/meta-types/hooks/useFullNameField'; import { TextDisplay } from '@/ui/field/display/components/TextDisplay'; export const FullNameFieldDisplay = () => { diff --git a/packages/twenty-front/src/modules/object-record/field/meta-types/display/components/LinkFieldDisplay.tsx b/packages/twenty-front/src/modules/object-record/record-field/meta-types/display/components/LinkFieldDisplay.tsx similarity index 100% rename from packages/twenty-front/src/modules/object-record/field/meta-types/display/components/LinkFieldDisplay.tsx rename to packages/twenty-front/src/modules/object-record/record-field/meta-types/display/components/LinkFieldDisplay.tsx diff --git a/packages/twenty-front/src/modules/object-record/field/meta-types/display/components/NumberFieldDisplay.tsx b/packages/twenty-front/src/modules/object-record/record-field/meta-types/display/components/NumberFieldDisplay.tsx similarity index 100% rename from packages/twenty-front/src/modules/object-record/field/meta-types/display/components/NumberFieldDisplay.tsx rename to packages/twenty-front/src/modules/object-record/record-field/meta-types/display/components/NumberFieldDisplay.tsx diff --git a/packages/twenty-front/src/modules/object-record/field/meta-types/display/components/PhoneFieldDisplay.tsx b/packages/twenty-front/src/modules/object-record/record-field/meta-types/display/components/PhoneFieldDisplay.tsx similarity index 100% rename from packages/twenty-front/src/modules/object-record/field/meta-types/display/components/PhoneFieldDisplay.tsx rename to packages/twenty-front/src/modules/object-record/record-field/meta-types/display/components/PhoneFieldDisplay.tsx diff --git a/packages/twenty-front/src/modules/object-record/field/meta-types/display/components/RelationFieldDisplay.tsx b/packages/twenty-front/src/modules/object-record/record-field/meta-types/display/components/RelationFieldDisplay.tsx similarity index 100% rename from packages/twenty-front/src/modules/object-record/field/meta-types/display/components/RelationFieldDisplay.tsx rename to packages/twenty-front/src/modules/object-record/record-field/meta-types/display/components/RelationFieldDisplay.tsx diff --git a/packages/twenty-front/src/modules/object-record/field/meta-types/display/components/SelectFieldDisplay.tsx b/packages/twenty-front/src/modules/object-record/record-field/meta-types/display/components/SelectFieldDisplay.tsx similarity index 100% rename from packages/twenty-front/src/modules/object-record/field/meta-types/display/components/SelectFieldDisplay.tsx rename to packages/twenty-front/src/modules/object-record/record-field/meta-types/display/components/SelectFieldDisplay.tsx diff --git a/packages/twenty-front/src/modules/object-record/field/meta-types/display/components/TextFieldDisplay.tsx b/packages/twenty-front/src/modules/object-record/record-field/meta-types/display/components/TextFieldDisplay.tsx similarity index 100% rename from packages/twenty-front/src/modules/object-record/field/meta-types/display/components/TextFieldDisplay.tsx rename to packages/twenty-front/src/modules/object-record/record-field/meta-types/display/components/TextFieldDisplay.tsx diff --git a/packages/twenty-front/src/modules/object-record/field/meta-types/display/components/UuidFieldDisplay.tsx b/packages/twenty-front/src/modules/object-record/record-field/meta-types/display/components/UuidFieldDisplay.tsx similarity index 69% rename from packages/twenty-front/src/modules/object-record/field/meta-types/display/components/UuidFieldDisplay.tsx rename to packages/twenty-front/src/modules/object-record/record-field/meta-types/display/components/UuidFieldDisplay.tsx index 9d88964ff..5c6932483 100644 --- a/packages/twenty-front/src/modules/object-record/field/meta-types/display/components/UuidFieldDisplay.tsx +++ b/packages/twenty-front/src/modules/object-record/record-field/meta-types/display/components/UuidFieldDisplay.tsx @@ -1,4 +1,4 @@ -import { useUuidField } from '@/object-record/field/meta-types/hooks/useUuidField'; +import { useUuidField } from '@/object-record/record-field/meta-types/hooks/useUuidField'; import { TextDisplay } from '@/ui/field/display/components/TextDisplay'; export const UuidFieldDisplay = () => { diff --git a/packages/twenty-front/src/modules/object-record/field/meta-types/display/components/__stories__/ChipFieldDisplay.stories.tsx b/packages/twenty-front/src/modules/object-record/record-field/meta-types/display/components/__stories__/ChipFieldDisplay.stories.tsx similarity index 94% rename from packages/twenty-front/src/modules/object-record/field/meta-types/display/components/__stories__/ChipFieldDisplay.stories.tsx rename to packages/twenty-front/src/modules/object-record/record-field/meta-types/display/components/__stories__/ChipFieldDisplay.stories.tsx index 7ab2febf8..09dd62aa2 100644 --- a/packages/twenty-front/src/modules/object-record/field/meta-types/display/components/__stories__/ChipFieldDisplay.stories.tsx +++ b/packages/twenty-front/src/modules/object-record/record-field/meta-types/display/components/__stories__/ChipFieldDisplay.stories.tsx @@ -3,7 +3,7 @@ import { MemoryRouter } from 'react-router-dom'; import { Meta, StoryObj } from '@storybook/react'; import { useSetRecoilState } from 'recoil'; -import { ChipFieldDisplay } from '@/object-record/field/meta-types/display/components/ChipFieldDisplay'; +import { ChipFieldDisplay } from '@/object-record/record-field/meta-types/display/components/ChipFieldDisplay'; import { recordStoreFamilyState } from '@/object-record/record-store/states/recordStoreFamilyState'; import { ComponentDecorator } from '~/testing/decorators/ComponentDecorator'; diff --git a/packages/twenty-front/src/modules/object-record/field/meta-types/display/components/__stories__/DateFieldDisplay.stories.tsx b/packages/twenty-front/src/modules/object-record/record-field/meta-types/display/components/__stories__/DateFieldDisplay.stories.tsx similarity index 100% rename from packages/twenty-front/src/modules/object-record/field/meta-types/display/components/__stories__/DateFieldDisplay.stories.tsx rename to packages/twenty-front/src/modules/object-record/record-field/meta-types/display/components/__stories__/DateFieldDisplay.stories.tsx diff --git a/packages/twenty-front/src/modules/object-record/field/meta-types/display/components/__stories__/EmailFieldDisplay.stories.tsx b/packages/twenty-front/src/modules/object-record/record-field/meta-types/display/components/__stories__/EmailFieldDisplay.stories.tsx similarity index 100% rename from packages/twenty-front/src/modules/object-record/field/meta-types/display/components/__stories__/EmailFieldDisplay.stories.tsx rename to packages/twenty-front/src/modules/object-record/record-field/meta-types/display/components/__stories__/EmailFieldDisplay.stories.tsx diff --git a/packages/twenty-front/src/modules/object-record/field/meta-types/display/components/__stories__/NumberFieldDisplay.stories.tsx b/packages/twenty-front/src/modules/object-record/record-field/meta-types/display/components/__stories__/NumberFieldDisplay.stories.tsx similarity index 100% rename from packages/twenty-front/src/modules/object-record/field/meta-types/display/components/__stories__/NumberFieldDisplay.stories.tsx rename to packages/twenty-front/src/modules/object-record/record-field/meta-types/display/components/__stories__/NumberFieldDisplay.stories.tsx diff --git a/packages/twenty-front/src/modules/object-record/field/meta-types/display/components/__stories__/PhoneFieldDisplay.stories.tsx b/packages/twenty-front/src/modules/object-record/record-field/meta-types/display/components/__stories__/PhoneFieldDisplay.stories.tsx similarity index 100% rename from packages/twenty-front/src/modules/object-record/field/meta-types/display/components/__stories__/PhoneFieldDisplay.stories.tsx rename to packages/twenty-front/src/modules/object-record/record-field/meta-types/display/components/__stories__/PhoneFieldDisplay.stories.tsx diff --git a/packages/twenty-front/src/modules/object-record/field/meta-types/display/components/__stories__/TextFieldDisplay.stories.tsx b/packages/twenty-front/src/modules/object-record/record-field/meta-types/display/components/__stories__/TextFieldDisplay.stories.tsx similarity index 100% rename from packages/twenty-front/src/modules/object-record/field/meta-types/display/components/__stories__/TextFieldDisplay.stories.tsx rename to packages/twenty-front/src/modules/object-record/record-field/meta-types/display/components/__stories__/TextFieldDisplay.stories.tsx diff --git a/packages/twenty-front/src/modules/object-record/field/meta-types/hooks/useBooleanField.ts b/packages/twenty-front/src/modules/object-record/record-field/meta-types/hooks/useBooleanField.ts similarity index 100% rename from packages/twenty-front/src/modules/object-record/field/meta-types/hooks/useBooleanField.ts rename to packages/twenty-front/src/modules/object-record/record-field/meta-types/hooks/useBooleanField.ts diff --git a/packages/twenty-front/src/modules/object-record/field/meta-types/hooks/useChipField.ts b/packages/twenty-front/src/modules/object-record/record-field/meta-types/hooks/useChipField.ts similarity index 72% rename from packages/twenty-front/src/modules/object-record/field/meta-types/hooks/useChipField.ts rename to packages/twenty-front/src/modules/object-record/record-field/meta-types/hooks/useChipField.ts index c1a2d0359..b5dcd36a6 100644 --- a/packages/twenty-front/src/modules/object-record/field/meta-types/hooks/useChipField.ts +++ b/packages/twenty-front/src/modules/object-record/record-field/meta-types/hooks/useChipField.ts @@ -1,9 +1,9 @@ import { useContext } from 'react'; import { useRecoilValue } from 'recoil'; -import { isFieldFullName } from '@/object-record/field/types/guards/isFieldFullName'; -import { isFieldNumber } from '@/object-record/field/types/guards/isFieldNumber'; -import { isFieldText } from '@/object-record/field/types/guards/isFieldText'; +import { isFieldFullName } from '@/object-record/record-field/types/guards/isFieldFullName'; +import { isFieldNumber } from '@/object-record/record-field/types/guards/isFieldNumber'; +import { isFieldText } from '@/object-record/record-field/types/guards/isFieldText'; import { recordStoreFamilyState } from '@/object-record/record-store/states/recordStoreFamilyState'; import { FieldContext } from '../../contexts/FieldContext'; diff --git a/packages/twenty-front/src/modules/object-record/field/meta-types/hooks/useCurrencyField.ts b/packages/twenty-front/src/modules/object-record/record-field/meta-types/hooks/useCurrencyField.ts similarity index 58% rename from packages/twenty-front/src/modules/object-record/field/meta-types/hooks/useCurrencyField.ts rename to packages/twenty-front/src/modules/object-record/record-field/meta-types/hooks/useCurrencyField.ts index 6306c11d0..998904de6 100644 --- a/packages/twenty-front/src/modules/object-record/field/meta-types/hooks/useCurrencyField.ts +++ b/packages/twenty-front/src/modules/object-record/record-field/meta-types/hooks/useCurrencyField.ts @@ -1,47 +1,18 @@ import { useContext } from 'react'; -import { useRecoilState } from 'recoil'; +import { useRecoilState, useRecoilValue } from 'recoil'; -import { CurrencyCode } from '@/object-record/field/types/CurrencyCode'; -import { FieldInitialValue } from '@/object-record/field/types/FieldInitialValue'; +import { useRecordFieldInput } from '@/object-record/record-field/hooks/useRecordFieldInput'; import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector'; import { canBeCastAsIntegerOrNull } from '~/utils/cast-as-integer-or-null'; -import { - convertCurrencyMicrosToCurrency, - convertCurrencyToCurrencyMicros, -} from '~/utils/convert-currency-amount'; +import { convertCurrencyToCurrencyMicros } from '~/utils/convert-currency-amount'; import { FieldContext } from '../../contexts/FieldContext'; -import { useFieldInitialValue } from '../../hooks/useFieldInitialValue'; import { usePersistField } from '../../hooks/usePersistField'; import { FieldCurrencyValue } from '../../types/FieldMetadata'; import { assertFieldMetadata } from '../../types/guards/assertFieldMetadata'; import { isFieldCurrency } from '../../types/guards/isFieldCurrency'; import { isFieldCurrencyValue } from '../../types/guards/isFieldCurrencyValue'; -const initializeValue = ( - fieldInitialValue: FieldInitialValue | undefined, - fieldValue: FieldCurrencyValue, -) => { - if (fieldInitialValue?.isEmpty) { - return { amount: null, currencyCode: CurrencyCode.USD }; - } - if (!isNaN(Number(fieldInitialValue?.value))) { - return { - amount: Number(fieldInitialValue?.value), - currencyCode: CurrencyCode.USD, - }; - } - - if (!fieldValue) { - return { amount: null, currencyCode: CurrencyCode.USD }; - } - - return { - amount: convertCurrencyMicrosToCurrency(fieldValue.amountMicros), - currencyCode: CurrencyCode.USD, - }; -}; - export const useCurrencyField = () => { const { entityId, fieldDefinition, hotkeyScope } = useContext(FieldContext); @@ -83,18 +54,16 @@ export const useCurrencyField = () => { persistField(newCurrencyValue); }; - const fieldInitialValue = useFieldInitialValue(); + const { setDraftValue, getDraftValueSelector } = + useRecordFieldInput(`${entityId}-${fieldName}`); - const initialValue = initializeValue(fieldInitialValue, fieldValue); - - const initialAmount = initialValue.amount; - const initialCurrencyCode = initialValue.currencyCode; + const draftValue = useRecoilValue(getDraftValueSelector()); return { fieldDefinition, fieldValue, - initialAmount, - initialCurrencyCode, + draftValue, + setDraftValue, setFieldValue, hotkeyScope, persistCurrencyField, diff --git a/packages/twenty-front/src/modules/object-record/field/meta-types/hooks/useDateTimeField.ts b/packages/twenty-front/src/modules/object-record/record-field/meta-types/hooks/useDateTimeField.ts similarity index 75% rename from packages/twenty-front/src/modules/object-record/field/meta-types/hooks/useDateTimeField.ts rename to packages/twenty-front/src/modules/object-record/record-field/meta-types/hooks/useDateTimeField.ts index 936980a18..ebc85c116 100644 --- a/packages/twenty-front/src/modules/object-record/field/meta-types/hooks/useDateTimeField.ts +++ b/packages/twenty-front/src/modules/object-record/record-field/meta-types/hooks/useDateTimeField.ts @@ -1,6 +1,8 @@ import { useContext } from 'react'; import { useRecoilState } from 'recoil'; +import { useRecordFieldInput } from '@/object-record/record-field/hooks/useRecordFieldInput'; +import { FieldDateTimeValue } from '@/object-record/record-field/types/FieldMetadata'; import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector'; import { FieldContext } from '../../contexts/FieldContext'; @@ -22,9 +24,14 @@ export const useDateTimeField = () => { }), ); + const { setDraftValue } = useRecordFieldInput( + `${entityId}-${fieldName}`, + ); + return { fieldDefinition, fieldValue, + setDraftValue, setFieldValue, hotkeyScope, clearable, diff --git a/packages/twenty-front/src/modules/object-record/field/meta-types/hooks/useEmailField.ts b/packages/twenty-front/src/modules/object-record/record-field/meta-types/hooks/useEmailField.ts similarity index 65% rename from packages/twenty-front/src/modules/object-record/field/meta-types/hooks/useEmailField.ts rename to packages/twenty-front/src/modules/object-record/record-field/meta-types/hooks/useEmailField.ts index 8aa01aff7..4b0b6dd2c 100644 --- a/packages/twenty-front/src/modules/object-record/field/meta-types/hooks/useEmailField.ts +++ b/packages/twenty-front/src/modules/object-record/record-field/meta-types/hooks/useEmailField.ts @@ -1,10 +1,11 @@ import { useContext } from 'react'; -import { useRecoilState } from 'recoil'; +import { useRecoilState, useRecoilValue } from 'recoil'; +import { useRecordFieldInput } from '@/object-record/record-field/hooks/useRecordFieldInput'; +import { FieldEmailValue } from '@/object-record/record-field/types/FieldMetadata'; import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector'; import { FieldContext } from '../../contexts/FieldContext'; -import { useFieldInitialValue } from '../../hooks/useFieldInitialValue'; import { assertFieldMetadata } from '../../types/guards/assertFieldMetadata'; import { isFieldEmail } from '../../types/guards/isFieldEmail'; @@ -22,16 +23,16 @@ export const useEmailField = () => { }), ); - const fieldInitialValue = useFieldInitialValue(); + const { setDraftValue, getDraftValueSelector } = + useRecordFieldInput(`${entityId}-${fieldName}`); - const initialValue = fieldInitialValue?.isEmpty - ? '' - : fieldInitialValue?.value ?? fieldValue; + const draftValue = useRecoilValue(getDraftValueSelector()); return { fieldDefinition, + draftValue, + setDraftValue, fieldValue, - initialValue, setFieldValue, hotkeyScope, }; diff --git a/packages/twenty-front/src/modules/object-record/field/meta-types/hooks/useFullNameField.ts b/packages/twenty-front/src/modules/object-record/record-field/meta-types/hooks/useFullNameField.ts similarity index 78% rename from packages/twenty-front/src/modules/object-record/field/meta-types/hooks/useFullNameField.ts rename to packages/twenty-front/src/modules/object-record/record-field/meta-types/hooks/useFullNameField.ts index 958d5d8ca..77a0c0b39 100644 --- a/packages/twenty-front/src/modules/object-record/field/meta-types/hooks/useFullNameField.ts +++ b/packages/twenty-front/src/modules/object-record/record-field/meta-types/hooks/useFullNameField.ts @@ -1,10 +1,10 @@ import { useContext } from 'react'; -import { useRecoilState } from 'recoil'; +import { useRecoilState, useRecoilValue } from 'recoil'; +import { useRecordFieldInput } from '@/object-record/record-field/hooks/useRecordFieldInput'; import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector'; import { FieldContext } from '../../contexts/FieldContext'; -import { useFieldInitialValue } from '../../hooks/useFieldInitialValue'; import { usePersistField } from '../../hooks/usePersistField'; import { FieldFullNameValue } from '../../types/FieldMetadata'; import { assertFieldMetadata } from '../../types/guards/assertFieldMetadata'; @@ -35,17 +35,17 @@ export const useFullNameField = () => { persistField(newValue); }; - const fieldInitialValue = useFieldInitialValue(); + const { setDraftValue, getDraftValueSelector } = + useRecordFieldInput(`${entityId}-${fieldName}`); - const initialValue: FieldFullNameValue = fieldInitialValue?.isEmpty - ? { firstName: '', lastName: '' } - : fieldValue; + const draftValue = useRecoilValue(getDraftValueSelector()); return { fieldDefinition, fieldValue, - initialValue, setFieldValue, + draftValue, + setDraftValue, hotkeyScope, persistFullNameField, }; diff --git a/packages/twenty-front/src/modules/object-record/field/meta-types/hooks/useLinkField.ts b/packages/twenty-front/src/modules/object-record/record-field/meta-types/hooks/useLinkField.ts similarity index 76% rename from packages/twenty-front/src/modules/object-record/field/meta-types/hooks/useLinkField.ts rename to packages/twenty-front/src/modules/object-record/record-field/meta-types/hooks/useLinkField.ts index 7bdddd35a..0af2a0d10 100644 --- a/packages/twenty-front/src/modules/object-record/field/meta-types/hooks/useLinkField.ts +++ b/packages/twenty-front/src/modules/object-record/record-field/meta-types/hooks/useLinkField.ts @@ -1,10 +1,10 @@ import { useContext } from 'react'; -import { useRecoilState } from 'recoil'; +import { useRecoilState, useRecoilValue } from 'recoil'; +import { useRecordFieldInput } from '@/object-record/record-field/hooks/useRecordFieldInput'; import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector'; import { FieldContext } from '../../contexts/FieldContext'; -import { useFieldInitialValue } from '../../hooks/useFieldInitialValue'; import { usePersistField } from '../../hooks/usePersistField'; import { FieldLinkValue } from '../../types/FieldMetadata'; import { assertFieldMetadata } from '../../types/guards/assertFieldMetadata'; @@ -25,13 +25,10 @@ export const useLinkField = () => { }), ); - const fieldInitialValue = useFieldInitialValue(); + const { setDraftValue, getDraftValueSelector } = + useRecordFieldInput(`${entityId}-${fieldName}`); - const initialValue: FieldLinkValue = fieldInitialValue?.isEmpty - ? { url: '', label: '' } - : fieldInitialValue?.value - ? { url: fieldInitialValue.value, label: '' } - : fieldValue; + const draftValue = useRecoilValue(getDraftValueSelector()); const persistField = usePersistField(); @@ -46,7 +43,8 @@ export const useLinkField = () => { return { fieldDefinition, fieldValue, - initialValue, + draftValue, + setDraftValue, setFieldValue, hotkeyScope, persistLinkField, diff --git a/packages/twenty-front/src/modules/object-record/field/meta-types/hooks/useNumberField.ts b/packages/twenty-front/src/modules/object-record/record-field/meta-types/hooks/useNumberField.ts similarity index 74% rename from packages/twenty-front/src/modules/object-record/field/meta-types/hooks/useNumberField.ts rename to packages/twenty-front/src/modules/object-record/record-field/meta-types/hooks/useNumberField.ts index 2bb62d85e..1ddaf7385 100644 --- a/packages/twenty-front/src/modules/object-record/field/meta-types/hooks/useNumberField.ts +++ b/packages/twenty-front/src/modules/object-record/record-field/meta-types/hooks/useNumberField.ts @@ -1,6 +1,8 @@ import { useContext } from 'react'; -import { useRecoilState } from 'recoil'; +import { useRecoilState, useRecoilValue } from 'recoil'; +import { useRecordFieldInput } from '@/object-record/record-field/hooks/useRecordFieldInput'; +import { FieldNumberValue } from '@/object-record/record-field/types/FieldMetadata'; import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector'; import { canBeCastAsIntegerOrNull, @@ -8,7 +10,6 @@ import { } from '~/utils/cast-as-integer-or-null'; import { FieldContext } from '../../contexts/FieldContext'; -import { useFieldInitialValue } from '../../hooks/useFieldInitialValue'; import { usePersistField } from '../../hooks/usePersistField'; import { assertFieldMetadata } from '../../types/guards/assertFieldMetadata'; import { isFieldNumber } from '../../types/guards/isFieldNumber'; @@ -39,18 +40,16 @@ export const useNumberField = () => { persistField(castedValue); }; - const fieldInitialValue = useFieldInitialValue(); + const { setDraftValue, getDraftValueSelector } = + useRecordFieldInput(`${entityId}-${fieldName}`); - const initialValue = fieldInitialValue?.isEmpty - ? null - : !isNaN(Number(fieldInitialValue?.value)) - ? Number(fieldInitialValue?.value) - : null ?? fieldValue; + const draftValue = useRecoilValue(getDraftValueSelector()); return { fieldDefinition, fieldValue, - initialValue, + draftValue, + setDraftValue, setFieldValue, hotkeyScope, persistNumberField, diff --git a/packages/twenty-front/src/modules/object-record/field/meta-types/hooks/usePhoneField.ts b/packages/twenty-front/src/modules/object-record/record-field/meta-types/hooks/usePhoneField.ts similarity index 72% rename from packages/twenty-front/src/modules/object-record/field/meta-types/hooks/usePhoneField.ts rename to packages/twenty-front/src/modules/object-record/record-field/meta-types/hooks/usePhoneField.ts index d8526b367..5e343d1f8 100644 --- a/packages/twenty-front/src/modules/object-record/field/meta-types/hooks/usePhoneField.ts +++ b/packages/twenty-front/src/modules/object-record/record-field/meta-types/hooks/usePhoneField.ts @@ -1,11 +1,12 @@ import { useContext } from 'react'; import { isPossiblePhoneNumber } from 'libphonenumber-js'; -import { useRecoilState } from 'recoil'; +import { useRecoilState, useRecoilValue } from 'recoil'; +import { useRecordFieldInput } from '@/object-record/record-field/hooks/useRecordFieldInput'; +import { FieldPhoneValue } from '@/object-record/record-field/types/FieldMetadata'; import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector'; import { FieldContext } from '../../contexts/FieldContext'; -import { useFieldInitialValue } from '../../hooks/useFieldInitialValue'; import { usePersistField } from '../../hooks/usePersistField'; import { assertFieldMetadata } from '../../types/guards/assertFieldMetadata'; import { isFieldPhone } from '../../types/guards/isFieldPhone'; @@ -13,7 +14,6 @@ import { isFieldPhone } from '../../types/guards/isFieldPhone'; export const usePhoneField = () => { const { entityId, fieldDefinition, hotkeyScope } = useContext(FieldContext); - //assertFieldMetadata('PHONE', isFieldPhone, fieldDefinition); assertFieldMetadata('TEXT', isFieldPhone, fieldDefinition); const fieldName = fieldDefinition.metadata.fieldName; @@ -32,18 +32,17 @@ export const usePhoneField = () => { persistField(newPhoneValue); }; + const { setDraftValue, getDraftValueSelector } = + useRecordFieldInput(`${entityId}-${fieldName}`); - const fieldInitialValue = useFieldInitialValue(); - - const initialValue = fieldInitialValue?.isEmpty - ? '' - : fieldInitialValue?.value ?? fieldValue; + const draftValue = useRecoilValue(getDraftValueSelector()); return { fieldDefinition, fieldValue, - initialValue, setFieldValue, + draftValue, + setDraftValue, hotkeyScope, persistPhoneField, }; diff --git a/packages/twenty-front/src/modules/object-record/field/meta-types/hooks/useRatingField.ts b/packages/twenty-front/src/modules/object-record/record-field/meta-types/hooks/useRatingField.ts similarity index 100% rename from packages/twenty-front/src/modules/object-record/field/meta-types/hooks/useRatingField.ts rename to packages/twenty-front/src/modules/object-record/record-field/meta-types/hooks/useRatingField.ts diff --git a/packages/twenty-front/src/modules/object-record/field/meta-types/hooks/useRelationField.ts b/packages/twenty-front/src/modules/object-record/record-field/meta-types/hooks/useRelationField.ts similarity index 61% rename from packages/twenty-front/src/modules/object-record/field/meta-types/hooks/useRelationField.ts rename to packages/twenty-front/src/modules/object-record/record-field/meta-types/hooks/useRelationField.ts index 680602a40..bd8355b80 100644 --- a/packages/twenty-front/src/modules/object-record/field/meta-types/hooks/useRelationField.ts +++ b/packages/twenty-front/src/modules/object-record/record-field/meta-types/hooks/useRelationField.ts @@ -1,11 +1,12 @@ import { useContext } from 'react'; -import { useRecoilState } from 'recoil'; +import { useRecoilState, useRecoilValue } from 'recoil'; -import { useGetButtonIcon } from '@/object-record/field/hooks/useGetButtonIcon'; +import { useGetButtonIcon } from '@/object-record/record-field/hooks/useGetButtonIcon'; +import { useRecordFieldInput } from '@/object-record/record-field/hooks/useRecordFieldInput'; +import { FieldRelationValue } from '@/object-record/record-field/types/FieldMetadata'; import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector'; import { FieldContext } from '../../contexts/FieldContext'; -import { useFieldInitialValue } from '../../hooks/useFieldInitialValue'; import { assertFieldMetadata } from '../../types/guards/assertFieldMetadata'; import { isFieldRelation } from '../../types/guards/isFieldRelation'; @@ -17,22 +18,20 @@ export const useRelationField = () => { const fieldName = fieldDefinition.metadata.fieldName; - const [fieldValue, setFieldValue] = useRecoilState( + const [fieldValue, setFieldValue] = useRecoilState( recordStoreFamilySelector({ recordId: entityId, fieldName }), ); - const fieldInitialValue = useFieldInitialValue(); + const { getDraftValueSelector } = useRecordFieldInput( + `${entityId}-${fieldName}`, + ); + const draftValue = useRecoilValue(getDraftValueSelector()); - const initialSearchValue = fieldInitialValue?.isEmpty - ? null - : fieldInitialValue?.value; - - const initialValue = fieldInitialValue?.isEmpty ? null : fieldValue; + const initialSearchValue = draftValue; return { fieldDefinition, fieldValue, - initialValue, initialSearchValue, setFieldValue, maxWidth: button && maxWidth ? maxWidth - 28 : maxWidth, diff --git a/packages/twenty-front/src/modules/object-record/field/meta-types/hooks/useSelectField.ts b/packages/twenty-front/src/modules/object-record/record-field/meta-types/hooks/useSelectField.ts similarity index 72% rename from packages/twenty-front/src/modules/object-record/field/meta-types/hooks/useSelectField.ts rename to packages/twenty-front/src/modules/object-record/record-field/meta-types/hooks/useSelectField.ts index aa93d7336..545bf2b9f 100644 --- a/packages/twenty-front/src/modules/object-record/field/meta-types/hooks/useSelectField.ts +++ b/packages/twenty-front/src/modules/object-record/record-field/meta-types/hooks/useSelectField.ts @@ -1,12 +1,12 @@ import { useContext } from 'react'; -import { useRecoilState } from 'recoil'; +import { useRecoilState, useRecoilValue } from 'recoil'; -import { usePersistField } from '@/object-record/field/hooks/usePersistField'; +import { usePersistField } from '@/object-record/record-field/hooks/usePersistField'; +import { useRecordFieldInput } from '@/object-record/record-field/hooks/useRecordFieldInput'; import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector'; import { FieldMetadataType } from '~/generated/graphql'; import { FieldContext } from '../../contexts/FieldContext'; -import { useFieldInitialValue } from '../../hooks/useFieldInitialValue'; import { FieldSelectValue } from '../../types/FieldMetadata'; import { assertFieldMetadata } from '../../types/guards/assertFieldMetadata'; import { isFieldSelect } from '../../types/guards/isFieldSelect'; @@ -27,16 +27,18 @@ export const useSelectField = () => { ); const fieldSelectValue = isFieldSelectValue(fieldValue) ? fieldValue : null; - - const fieldInitialValue = useFieldInitialValue(); - const persistField = usePersistField(); + const { setDraftValue, getDraftValueSelector } = + useRecordFieldInput(`${entityId}-${fieldName}`); + const draftValue = useRecoilValue(getDraftValueSelector()); + return { fieldDefinition, persistField, fieldValue: fieldSelectValue, - initialValue: fieldInitialValue, + draftValue, + setDraftValue, setFieldValue, hotkeyScope, }; diff --git a/packages/twenty-front/src/modules/object-record/field/meta-types/hooks/useTextField.ts b/packages/twenty-front/src/modules/object-record/record-field/meta-types/hooks/useTextField.ts similarity index 65% rename from packages/twenty-front/src/modules/object-record/field/meta-types/hooks/useTextField.ts rename to packages/twenty-front/src/modules/object-record/record-field/meta-types/hooks/useTextField.ts index c560baa5e..c3222dda7 100644 --- a/packages/twenty-front/src/modules/object-record/field/meta-types/hooks/useTextField.ts +++ b/packages/twenty-front/src/modules/object-record/record-field/meta-types/hooks/useTextField.ts @@ -1,10 +1,11 @@ import { useContext } from 'react'; -import { useRecoilState } from 'recoil'; +import { useRecoilState, useRecoilValue } from 'recoil'; +import { useRecordFieldInput } from '@/object-record/record-field/hooks/useRecordFieldInput'; +import { FieldTextValue } from '@/object-record/record-field/types/FieldMetadata'; import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector'; import { FieldContext } from '../../contexts/FieldContext'; -import { useFieldInitialValue } from '../../hooks/useFieldInitialValue'; import { assertFieldMetadata } from '../../types/guards/assertFieldMetadata'; import { isFieldText } from '../../types/guards/isFieldText'; import { isFieldTextValue } from '../../types/guards/isFieldTextValue'; @@ -17,7 +18,7 @@ export const useTextField = () => { const fieldName = fieldDefinition.metadata.fieldName; - const [fieldValue, setFieldValue] = useRecoilState( + const [fieldValue, setFieldValue] = useRecoilState( recordStoreFamilySelector({ recordId: entityId, fieldName: fieldName, @@ -25,17 +26,17 @@ export const useTextField = () => { ); const fieldTextValue = isFieldTextValue(fieldValue) ? fieldValue : ''; - const fieldInitialValue = useFieldInitialValue(); + const { setDraftValue, getDraftValueSelector } = + useRecordFieldInput(`${entityId}-${fieldName}`); - const initialValue = fieldInitialValue?.isEmpty - ? '' - : fieldInitialValue?.value ?? fieldTextValue; + const draftValue = useRecoilValue(getDraftValueSelector()); return { + draftValue, + setDraftValue, maxWidth, fieldDefinition, fieldValue: fieldTextValue, - initialValue, setFieldValue, hotkeyScope, }; diff --git a/packages/twenty-front/src/modules/object-record/field/meta-types/hooks/useUuidField.ts b/packages/twenty-front/src/modules/object-record/record-field/meta-types/hooks/useUuidField.ts similarity index 70% rename from packages/twenty-front/src/modules/object-record/field/meta-types/hooks/useUuidField.ts rename to packages/twenty-front/src/modules/object-record/record-field/meta-types/hooks/useUuidField.ts index d20963cc2..8e258ff09 100644 --- a/packages/twenty-front/src/modules/object-record/field/meta-types/hooks/useUuidField.ts +++ b/packages/twenty-front/src/modules/object-record/record-field/meta-types/hooks/useUuidField.ts @@ -1,11 +1,11 @@ import { useContext } from 'react'; import { useRecoilState } from 'recoil'; -import { isFieldUuid } from '@/object-record/field/types/guards/isFieldUuid'; +import { FieldUUidValue } from '@/object-record/record-field/types/FieldMetadata'; +import { isFieldUuid } from '@/object-record/record-field/types/guards/isFieldUuid'; import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector'; import { FieldContext } from '../../contexts/FieldContext'; -import { useFieldInitialValue } from '../../hooks/useFieldInitialValue'; import { assertFieldMetadata } from '../../types/guards/assertFieldMetadata'; import { isFieldTextValue } from '../../types/guards/isFieldTextValue'; @@ -16,7 +16,7 @@ export const useUuidField = () => { const fieldName = fieldDefinition.metadata.fieldName; - const [fieldValue, setFieldValue] = useRecoilState( + const [fieldValue, setFieldValue] = useRecoilState( recordStoreFamilySelector({ recordId: entityId, fieldName: fieldName, @@ -24,16 +24,9 @@ export const useUuidField = () => { ); const fieldTextValue = isFieldTextValue(fieldValue) ? fieldValue : ''; - const fieldInitialValue = useFieldInitialValue(); - - const initialValue = fieldInitialValue?.isEmpty - ? '' - : fieldInitialValue?.value ?? fieldTextValue; - return { fieldDefinition, fieldValue: fieldTextValue, - initialValue, setFieldValue, hotkeyScope, }; diff --git a/packages/twenty-front/src/modules/object-record/field/meta-types/input/components/BooleanFieldInput.tsx b/packages/twenty-front/src/modules/object-record/record-field/meta-types/input/components/BooleanFieldInput.tsx similarity index 100% rename from packages/twenty-front/src/modules/object-record/field/meta-types/input/components/BooleanFieldInput.tsx rename to packages/twenty-front/src/modules/object-record/record-field/meta-types/input/components/BooleanFieldInput.tsx diff --git a/packages/twenty-front/src/modules/object-record/field/meta-types/input/components/CurrencyFieldInput.tsx b/packages/twenty-front/src/modules/object-record/record-field/meta-types/input/components/CurrencyFieldInput.tsx similarity index 73% rename from packages/twenty-front/src/modules/object-record/field/meta-types/input/components/CurrencyFieldInput.tsx rename to packages/twenty-front/src/modules/object-record/record-field/meta-types/input/components/CurrencyFieldInput.tsx index cdaa4b18a..5ab4617ed 100644 --- a/packages/twenty-front/src/modules/object-record/field/meta-types/input/components/CurrencyFieldInput.tsx +++ b/packages/twenty-front/src/modules/object-record/record-field/meta-types/input/components/CurrencyFieldInput.tsx @@ -1,4 +1,4 @@ -import { useSaveFieldEditModeValue } from '@/object-record/field/hooks/useSaveFieldEditModeValue'; +import { CurrencyCode } from '@/object-record/record-field/types/CurrencyCode'; import { TextInput } from '@/ui/field/input/components/TextInput'; import { FieldInputOverlay } from '../../../../../ui/field/input/components/FieldInputOverlay'; @@ -21,20 +21,14 @@ export const CurrencyFieldInput = ({ onTab, onShiftTab, }: CurrencyFieldInputProps) => { - const { - hotkeyScope, - initialAmount, - initialCurrencyCode, - persistCurrencyField, - } = useCurrencyField(); - - const saveEditModeValue = useSaveFieldEditModeValue(); + const { hotkeyScope, draftValue, persistCurrencyField, setDraftValue } = + useCurrencyField(); const handleEnter = (newValue: string) => { onEnter?.(() => { persistCurrencyField({ amountText: newValue, - currencyCode: initialCurrencyCode, + currencyCode: draftValue?.currencyCode ?? CurrencyCode.USD, }); }); }; @@ -43,7 +37,7 @@ export const CurrencyFieldInput = ({ onEscape?.(() => { persistCurrencyField({ amountText: newValue, - currencyCode: initialCurrencyCode, + currencyCode: draftValue?.currencyCode ?? CurrencyCode.USD, }); }); }; @@ -55,7 +49,7 @@ export const CurrencyFieldInput = ({ onClickOutside?.(() => { persistCurrencyField({ amountText: newValue, - currencyCode: initialCurrencyCode, + currencyCode: draftValue?.currencyCode ?? CurrencyCode.USD, }); }); }; @@ -64,7 +58,7 @@ export const CurrencyFieldInput = ({ onTab?.(() => { persistCurrencyField({ amountText: newValue, - currencyCode: initialCurrencyCode, + currencyCode: draftValue?.currencyCode ?? CurrencyCode.USD, }); }); }; @@ -73,22 +67,22 @@ export const CurrencyFieldInput = ({ onShiftTab?.(() => persistCurrencyField({ amountText: newValue, - currencyCode: initialCurrencyCode, + currencyCode: draftValue?.currencyCode ?? CurrencyCode.USD, }), ); }; const handleChange = (newValue: string) => { - saveEditModeValue({ - amountText: newValue, - currencyCode: initialCurrencyCode, + setDraftValue({ + amount: newValue, + currencyCode: draftValue?.currencyCode ?? CurrencyCode.USD, }); }; return ( { - const { fieldValue, hotkeyScope, clearable } = useDateTimeField(); + const { fieldValue, hotkeyScope, clearable, setDraftValue } = + useDateTimeField(); const persistField = usePersistField(); - const saveEditModeValue = useSaveFieldEditModeValue(); const persistDate = (newDate: Nullable) => { if (!newDate) { @@ -49,7 +48,7 @@ export const DateFieldInput = ({ }; const handleChange = (newDate: Nullable) => { - saveEditModeValue(newDate); + setDraftValue(newDate?.toDateString() ?? ''); }; const dateValue = fieldValue ? new Date(fieldValue) : null; diff --git a/packages/twenty-front/src/modules/object-record/field/meta-types/input/components/EmailFieldInput.tsx b/packages/twenty-front/src/modules/object-record/record-field/meta-types/input/components/EmailFieldInput.tsx similarity index 85% rename from packages/twenty-front/src/modules/object-record/field/meta-types/input/components/EmailFieldInput.tsx rename to packages/twenty-front/src/modules/object-record/record-field/meta-types/input/components/EmailFieldInput.tsx index c5e1ee5fe..4d6bb3862 100644 --- a/packages/twenty-front/src/modules/object-record/field/meta-types/input/components/EmailFieldInput.tsx +++ b/packages/twenty-front/src/modules/object-record/record-field/meta-types/input/components/EmailFieldInput.tsx @@ -1,4 +1,3 @@ -import { useSaveFieldEditModeValue } from '@/object-record/field/hooks/useSaveFieldEditModeValue'; import { TextInput } from '@/ui/field/input/components/TextInput'; import { FieldInputOverlay } from '../../../../../ui/field/input/components/FieldInputOverlay'; @@ -22,10 +21,10 @@ export const EmailFieldInput = ({ onTab, onShiftTab, }: EmailFieldInputProps) => { - const { fieldDefinition, initialValue, hotkeyScope } = useEmailField(); + const { fieldDefinition, draftValue, setDraftValue, hotkeyScope } = + useEmailField(); const persistField = usePersistField(); - const saveEditModeValue = useSaveFieldEditModeValue(); const handleEnter = (newText: string) => { onEnter?.(() => persistField(newText)); @@ -51,7 +50,7 @@ export const EmailFieldInput = ({ }; const handleChange = (newText: string) => { - saveEditModeValue(newText); + setDraftValue(newText); }; return ( @@ -59,7 +58,7 @@ export const EmailFieldInput = ({ { - const { hotkeyScope, initialValue } = useFullNameField(); + const { hotkeyScope, draftValue, setDraftValue } = useFullNameField(); const persistField = usePersistField(); - const saveEditModeValue = useSaveFieldEditModeValue(); const convertToFullName = (newDoubleText: FieldDoubleText) => { return { @@ -65,14 +63,14 @@ export const FullNameFieldInput = ({ }; const handleChange = (newDoubleText: FieldDoubleText) => { - saveEditModeValue(convertToFullName(newDoubleText)); + setDraftValue(convertToFullName(newDoubleText)); }; return ( { - const { initialValue, hotkeyScope, persistLinkField } = useLinkField(); - - const saveEditModeValue = useSaveFieldEditModeValue(); + const { draftValue, setDraftValue, hotkeyScope, persistLinkField } = + useLinkField(); const handleEnter = (newURL: string) => { onEnter?.(() => @@ -74,7 +72,7 @@ export const LinkFieldInput = ({ }; const handleChange = (newURL: string) => { - saveEditModeValue({ + setDraftValue({ url: newURL, label: newURL, }); @@ -83,7 +81,7 @@ export const LinkFieldInput = ({ return ( { - const { fieldDefinition, initialValue, hotkeyScope, persistNumberField } = - useNumberField(); - - const saveEditModeValue = useSaveFieldEditModeValue(); + const { + fieldDefinition, + draftValue, + setDraftValue, + hotkeyScope, + persistNumberField, + } = useNumberField(); const handleEnter = (newText: string) => { onEnter?.(() => persistNumberField(newText)); @@ -50,7 +52,7 @@ export const NumberFieldInput = ({ }; const handleChange = (newText: string) => { - saveEditModeValue(newText); + setDraftValue(newText); }; return ( @@ -58,7 +60,7 @@ export const NumberFieldInput = ({ { - const { fieldDefinition, initialValue, hotkeyScope, persistPhoneField } = - usePhoneField(); - - const saveEditModeValue = useSaveFieldEditModeValue(); + const { + fieldDefinition, + draftValue, + setDraftValue, + hotkeyScope, + persistPhoneField, + } = usePhoneField(); const handleEnter = (newText: string) => { onEnter?.(() => persistPhoneField(newText)); @@ -50,7 +52,7 @@ export const PhoneFieldInput = ({ }; const handleChange = (newText: string) => { - saveEditModeValue(newText ?? ''); + setDraftValue(newText); }; return ( @@ -58,7 +60,7 @@ export const PhoneFieldInput = ({ { - const { fieldDefinition, initialValue, initialSearchValue } = + const { fieldDefinition, initialSearchValue, fieldValue } = useRelationField(); const persistField = usePersistField(); @@ -39,7 +39,7 @@ export const RelationFieldInput = ({ { - const { fieldDefinition, initialValue, hotkeyScope } = useTextField(); + const { fieldDefinition, draftValue, hotkeyScope, setDraftValue } = + useTextField(); const persistField = usePersistField(); - const saveEditModeValue = useSaveFieldEditModeValue(); const handleEnter = (newText: string) => { onEnter?.(() => persistField(newText)); @@ -51,7 +50,7 @@ export const TextFieldInput = ({ }; const handleChange = (newText: string) => { - saveEditModeValue(newText); + setDraftValue(newText); }; return ( @@ -59,7 +58,7 @@ export const TextFieldInput = ({ { +const RelationWorkspaceSetterEffect = () => { const setCurrentWorkspace = useSetRecoilState(currentWorkspaceState); - const { setFieldValue } = useRelationField(); useEffect(() => { setCurrentWorkspace(mockDefaultWorkspace); - setFieldValue(value); - }, [setCurrentWorkspace, setFieldValue, value]); + }, [setCurrentWorkspace]); return <>; }; @@ -45,7 +42,6 @@ type RelationFieldInputWithContextProps = RelationFieldInputProps & { const RelationFieldInputWithContext = ({ entityId, - value, onSubmit, onCancel, }: RelationFieldInputWithContextProps) => { @@ -73,7 +69,7 @@ const RelationFieldInputWithContext = ({ }} entityId={entityId} > - + diff --git a/packages/twenty-front/src/modules/object-record/field/meta-types/input/components/__stories__/TextFieldInput.stories.tsx b/packages/twenty-front/src/modules/object-record/record-field/meta-types/input/components/__stories__/TextFieldInput.stories.tsx similarity index 100% rename from packages/twenty-front/src/modules/object-record/field/meta-types/input/components/__stories__/TextFieldInput.stories.tsx rename to packages/twenty-front/src/modules/object-record/record-field/meta-types/input/components/__stories__/TextFieldInput.stories.tsx diff --git a/packages/twenty-front/src/modules/object-record/field/meta-types/input/hooks/useRegisterInputEvents.ts b/packages/twenty-front/src/modules/object-record/record-field/meta-types/input/hooks/useRegisterInputEvents.ts similarity index 100% rename from packages/twenty-front/src/modules/object-record/field/meta-types/input/hooks/useRegisterInputEvents.ts rename to packages/twenty-front/src/modules/object-record/record-field/meta-types/input/hooks/useRegisterInputEvents.ts diff --git a/packages/twenty-front/src/modules/object-record/record-field/scopes/RecordFieldInputScope.tsx b/packages/twenty-front/src/modules/object-record/record-field/scopes/RecordFieldInputScope.tsx new file mode 100644 index 000000000..ce2fcfc9f --- /dev/null +++ b/packages/twenty-front/src/modules/object-record/record-field/scopes/RecordFieldInputScope.tsx @@ -0,0 +1,23 @@ +import { ReactNode } from 'react'; + +import { RecordFieldInputScopeInternalContext } from '@/object-record/record-field/scopes/scope-internal-context/RecordFieldInputScopeInternalContext'; + +type RecordFieldInputScopeProps = { + children: ReactNode; + recordFieldInputScopeId: string; +}; + +export const RecordFieldInputScope = ({ + children, + recordFieldInputScopeId, +}: RecordFieldInputScopeProps) => { + return ( + + {children} + + ); +}; diff --git a/packages/twenty-front/src/modules/object-record/record-field/scopes/scope-internal-context/RecordFieldInputScopeInternalContext.ts b/packages/twenty-front/src/modules/object-record/record-field/scopes/scope-internal-context/RecordFieldInputScopeInternalContext.ts new file mode 100644 index 000000000..240470e52 --- /dev/null +++ b/packages/twenty-front/src/modules/object-record/record-field/scopes/scope-internal-context/RecordFieldInputScopeInternalContext.ts @@ -0,0 +1,7 @@ +import { StateScopeMapKey } from '@/ui/utilities/recoil-scope/scopes-internal/types/StateScopeMapKey'; +import { createScopeInternalContext } from '@/ui/utilities/recoil-scope/scopes-internal/utils/createScopeInternalContext'; + +type RecordFieldInputScopeInternalContextProps = StateScopeMapKey; + +export const RecordFieldInputScopeInternalContext = + createScopeInternalContext(); diff --git a/packages/twenty-front/src/modules/object-record/record-field/states/recordFieldInputDraftValueStateScopeMap.ts b/packages/twenty-front/src/modules/object-record/record-field/states/recordFieldInputDraftValueStateScopeMap.ts new file mode 100644 index 000000000..1d0720c43 --- /dev/null +++ b/packages/twenty-front/src/modules/object-record/record-field/states/recordFieldInputDraftValueStateScopeMap.ts @@ -0,0 +1,8 @@ +import { createStateScopeMap } from '@/ui/utilities/recoil-scope/utils/createStateScopeMap'; + +export const recordFieldInputDraftValueStateScopeMap = createStateScopeMap( + { + key: 'recordFieldInputDraftValueStateScopeMap', + defaultValue: undefined, + }, +); diff --git a/packages/twenty-front/src/modules/object-record/record-field/states/selectors/recordFieldInputDraftValueSelectorScopeMap.ts b/packages/twenty-front/src/modules/object-record/record-field/states/selectors/recordFieldInputDraftValueSelectorScopeMap.ts new file mode 100644 index 000000000..e785ec313 --- /dev/null +++ b/packages/twenty-front/src/modules/object-record/record-field/states/selectors/recordFieldInputDraftValueSelectorScopeMap.ts @@ -0,0 +1,16 @@ +import { recordFieldInputDraftValueStateScopeMap } from '@/object-record/record-field/states/recordFieldInputDraftValueStateScopeMap'; +import { createSelectorScopeMap } from '@/ui/utilities/recoil-scope/utils/createSelectorScopeMap'; + +export const recordFieldInputDraftValueSelectorScopeMap = + createSelectorScopeMap({ + key: 'recordFieldInputDraftValueSelectorScopeMap', + get: + ({ scopeId }: { scopeId: string }) => + ({ get }) => + get(recordFieldInputDraftValueStateScopeMap({ scopeId })) as T, + set: + ({ scopeId }: { scopeId: string }) => + ({ set }, newValue: T) => { + set(recordFieldInputDraftValueStateScopeMap({ scopeId }), newValue); + }, + }); diff --git a/packages/twenty-front/src/modules/object-record/field/types/CurrencyCode.ts b/packages/twenty-front/src/modules/object-record/record-field/types/CurrencyCode.ts similarity index 100% rename from packages/twenty-front/src/modules/object-record/field/types/CurrencyCode.ts rename to packages/twenty-front/src/modules/object-record/record-field/types/CurrencyCode.ts diff --git a/packages/twenty-front/src/modules/object-record/field/types/FieldDefinition.ts b/packages/twenty-front/src/modules/object-record/record-field/types/FieldDefinition.ts similarity index 94% rename from packages/twenty-front/src/modules/object-record/field/types/FieldDefinition.ts rename to packages/twenty-front/src/modules/object-record/record-field/types/FieldDefinition.ts index 191d7ecb0..a6611458e 100644 --- a/packages/twenty-front/src/modules/object-record/field/types/FieldDefinition.ts +++ b/packages/twenty-front/src/modules/object-record/record-field/types/FieldDefinition.ts @@ -11,6 +11,7 @@ export type FieldDefinition = { fieldMetadataId: string; label: string; showLabel?: boolean; + disableTooltip?: boolean; labelWidth?: number; iconName: string; type: FieldType; diff --git a/packages/twenty-front/src/modules/object-record/field/types/FieldDefinitionWithTypeOnly.ts b/packages/twenty-front/src/modules/object-record/record-field/types/FieldDefinitionWithTypeOnly.ts similarity index 100% rename from packages/twenty-front/src/modules/object-record/field/types/FieldDefinitionWithTypeOnly.ts rename to packages/twenty-front/src/modules/object-record/record-field/types/FieldDefinitionWithTypeOnly.ts diff --git a/packages/twenty-front/src/modules/object-record/field/types/FieldDoubleText.ts b/packages/twenty-front/src/modules/object-record/record-field/types/FieldDoubleText.ts similarity index 100% rename from packages/twenty-front/src/modules/object-record/field/types/FieldDoubleText.ts rename to packages/twenty-front/src/modules/object-record/record-field/types/FieldDoubleText.ts diff --git a/packages/twenty-front/src/modules/object-record/record-field/types/FieldInputDraftValue.ts b/packages/twenty-front/src/modules/object-record/record-field/types/FieldInputDraftValue.ts new file mode 100644 index 000000000..6aea22052 --- /dev/null +++ b/packages/twenty-front/src/modules/object-record/record-field/types/FieldInputDraftValue.ts @@ -0,0 +1,58 @@ +import { CurrencyCode } from '@/object-record/record-field/types/CurrencyCode'; +import { + FieldBooleanValue, + FieldCurrencyValue, + FieldDateTimeValue, + FieldEmailValue, + FieldFullNameValue, + FieldLinkValue, + FieldNumberValue, + FieldPhoneValue, + FieldRatingValue, + FieldRelationValue, + FieldSelectValue, + FieldTextValue, + FieldUUidValue, +} from '@/object-record/record-field/types/FieldMetadata'; + +export type FieldTextDraftValue = string; +export type FieldNumberDraftValue = string; +export type FieldDateTimeDraftValue = string; +export type FieldPhoneDraftValue = string; +export type FieldEmailDraftValue = string; +export type FieldSelectDraftValue = string; +export type FieldRelationDraftValue = string; +export type FieldLinkDraftValue = { url: string; label: string }; +export type FieldCurrencyDraftValue = { + currencyCode: CurrencyCode; + amount: string; +}; +export type FieldFullNameDraftValue = { firstName: string; lastName: string }; + +export type FieldInputDraftValue = FieldValue extends FieldTextValue + ? FieldTextDraftValue + : FieldValue extends FieldUUidValue + ? FieldUUidValue + : FieldValue extends FieldDateTimeValue + ? FieldDateTimeDraftValue + : FieldValue extends FieldNumberValue + ? FieldNumberDraftValue + : FieldValue extends FieldBooleanValue + ? FieldBooleanValue + : FieldValue extends FieldPhoneValue + ? FieldPhoneDraftValue + : FieldValue extends FieldEmailValue + ? FieldEmailDraftValue + : FieldValue extends FieldLinkValue + ? FieldLinkDraftValue + : FieldValue extends FieldCurrencyValue + ? FieldCurrencyDraftValue + : FieldValue extends FieldFullNameValue + ? FieldFullNameDraftValue + : FieldValue extends FieldRatingValue + ? FieldRatingValue + : FieldValue extends FieldSelectValue + ? FieldSelectDraftValue + : FieldValue extends FieldRelationValue + ? FieldRelationDraftValue + : never; diff --git a/packages/twenty-front/src/modules/object-record/field/types/FieldInputEvent.ts b/packages/twenty-front/src/modules/object-record/record-field/types/FieldInputEvent.ts similarity index 100% rename from packages/twenty-front/src/modules/object-record/field/types/FieldInputEvent.ts rename to packages/twenty-front/src/modules/object-record/record-field/types/FieldInputEvent.ts diff --git a/packages/twenty-front/src/modules/object-record/field/types/FieldMetadata.ts b/packages/twenty-front/src/modules/object-record/record-field/types/FieldMetadata.ts similarity index 100% rename from packages/twenty-front/src/modules/object-record/field/types/FieldMetadata.ts rename to packages/twenty-front/src/modules/object-record/record-field/types/FieldMetadata.ts diff --git a/packages/twenty-front/src/modules/object-record/field/types/FieldType.ts b/packages/twenty-front/src/modules/object-record/record-field/types/FieldType.ts similarity index 100% rename from packages/twenty-front/src/modules/object-record/field/types/FieldType.ts rename to packages/twenty-front/src/modules/object-record/record-field/types/FieldType.ts diff --git a/packages/twenty-front/src/modules/object-record/field/types/guards/assertFieldMetadata.ts b/packages/twenty-front/src/modules/object-record/record-field/types/guards/assertFieldMetadata.ts similarity index 100% rename from packages/twenty-front/src/modules/object-record/field/types/guards/assertFieldMetadata.ts rename to packages/twenty-front/src/modules/object-record/record-field/types/guards/assertFieldMetadata.ts diff --git a/packages/twenty-front/src/modules/object-record/field/types/guards/isFieldBoolean.ts b/packages/twenty-front/src/modules/object-record/record-field/types/guards/isFieldBoolean.ts similarity index 100% rename from packages/twenty-front/src/modules/object-record/field/types/guards/isFieldBoolean.ts rename to packages/twenty-front/src/modules/object-record/record-field/types/guards/isFieldBoolean.ts diff --git a/packages/twenty-front/src/modules/object-record/field/types/guards/isFieldBooleanValue.ts b/packages/twenty-front/src/modules/object-record/record-field/types/guards/isFieldBooleanValue.ts similarity index 100% rename from packages/twenty-front/src/modules/object-record/field/types/guards/isFieldBooleanValue.ts rename to packages/twenty-front/src/modules/object-record/record-field/types/guards/isFieldBooleanValue.ts diff --git a/packages/twenty-front/src/modules/object-record/field/types/guards/isFieldCurrency.ts b/packages/twenty-front/src/modules/object-record/record-field/types/guards/isFieldCurrency.ts similarity index 100% rename from packages/twenty-front/src/modules/object-record/field/types/guards/isFieldCurrency.ts rename to packages/twenty-front/src/modules/object-record/record-field/types/guards/isFieldCurrency.ts diff --git a/packages/twenty-front/src/modules/object-record/field/types/guards/isFieldCurrencyValue.ts b/packages/twenty-front/src/modules/object-record/record-field/types/guards/isFieldCurrencyValue.ts similarity index 100% rename from packages/twenty-front/src/modules/object-record/field/types/guards/isFieldCurrencyValue.ts rename to packages/twenty-front/src/modules/object-record/record-field/types/guards/isFieldCurrencyValue.ts diff --git a/packages/twenty-front/src/modules/object-record/field/types/guards/isFieldDateTime.ts b/packages/twenty-front/src/modules/object-record/record-field/types/guards/isFieldDateTime.ts similarity index 100% rename from packages/twenty-front/src/modules/object-record/field/types/guards/isFieldDateTime.ts rename to packages/twenty-front/src/modules/object-record/record-field/types/guards/isFieldDateTime.ts diff --git a/packages/twenty-front/src/modules/object-record/field/types/guards/isFieldDateTimeValue.ts b/packages/twenty-front/src/modules/object-record/record-field/types/guards/isFieldDateTimeValue.ts similarity index 100% rename from packages/twenty-front/src/modules/object-record/field/types/guards/isFieldDateTimeValue.ts rename to packages/twenty-front/src/modules/object-record/record-field/types/guards/isFieldDateTimeValue.ts diff --git a/packages/twenty-front/src/modules/object-record/field/types/guards/isFieldEmail.ts b/packages/twenty-front/src/modules/object-record/record-field/types/guards/isFieldEmail.ts similarity index 100% rename from packages/twenty-front/src/modules/object-record/field/types/guards/isFieldEmail.ts rename to packages/twenty-front/src/modules/object-record/record-field/types/guards/isFieldEmail.ts diff --git a/packages/twenty-front/src/modules/object-record/field/types/guards/isFieldEmailValue.ts b/packages/twenty-front/src/modules/object-record/record-field/types/guards/isFieldEmailValue.ts similarity index 100% rename from packages/twenty-front/src/modules/object-record/field/types/guards/isFieldEmailValue.ts rename to packages/twenty-front/src/modules/object-record/record-field/types/guards/isFieldEmailValue.ts diff --git a/packages/twenty-front/src/modules/object-record/field/types/guards/isFieldFullName.ts b/packages/twenty-front/src/modules/object-record/record-field/types/guards/isFieldFullName.ts similarity index 100% rename from packages/twenty-front/src/modules/object-record/field/types/guards/isFieldFullName.ts rename to packages/twenty-front/src/modules/object-record/record-field/types/guards/isFieldFullName.ts diff --git a/packages/twenty-front/src/modules/object-record/field/types/guards/isFieldFullNameValue.ts b/packages/twenty-front/src/modules/object-record/record-field/types/guards/isFieldFullNameValue.ts similarity index 100% rename from packages/twenty-front/src/modules/object-record/field/types/guards/isFieldFullNameValue.ts rename to packages/twenty-front/src/modules/object-record/record-field/types/guards/isFieldFullNameValue.ts diff --git a/packages/twenty-front/src/modules/object-record/field/types/guards/isFieldLink.ts b/packages/twenty-front/src/modules/object-record/record-field/types/guards/isFieldLink.ts similarity index 100% rename from packages/twenty-front/src/modules/object-record/field/types/guards/isFieldLink.ts rename to packages/twenty-front/src/modules/object-record/record-field/types/guards/isFieldLink.ts diff --git a/packages/twenty-front/src/modules/object-record/field/types/guards/isFieldLinkValue.ts b/packages/twenty-front/src/modules/object-record/record-field/types/guards/isFieldLinkValue.ts similarity index 100% rename from packages/twenty-front/src/modules/object-record/field/types/guards/isFieldLinkValue.ts rename to packages/twenty-front/src/modules/object-record/record-field/types/guards/isFieldLinkValue.ts diff --git a/packages/twenty-front/src/modules/object-record/field/types/guards/isFieldNumber.ts b/packages/twenty-front/src/modules/object-record/record-field/types/guards/isFieldNumber.ts similarity index 100% rename from packages/twenty-front/src/modules/object-record/field/types/guards/isFieldNumber.ts rename to packages/twenty-front/src/modules/object-record/record-field/types/guards/isFieldNumber.ts diff --git a/packages/twenty-front/src/modules/object-record/field/types/guards/isFieldNumberValue.ts b/packages/twenty-front/src/modules/object-record/record-field/types/guards/isFieldNumberValue.ts similarity index 100% rename from packages/twenty-front/src/modules/object-record/field/types/guards/isFieldNumberValue.ts rename to packages/twenty-front/src/modules/object-record/record-field/types/guards/isFieldNumberValue.ts diff --git a/packages/twenty-front/src/modules/object-record/field/types/guards/isFieldPhone.ts b/packages/twenty-front/src/modules/object-record/record-field/types/guards/isFieldPhone.ts similarity index 100% rename from packages/twenty-front/src/modules/object-record/field/types/guards/isFieldPhone.ts rename to packages/twenty-front/src/modules/object-record/record-field/types/guards/isFieldPhone.ts diff --git a/packages/twenty-front/src/modules/object-record/field/types/guards/isFieldPhoneValue.ts b/packages/twenty-front/src/modules/object-record/record-field/types/guards/isFieldPhoneValue.ts similarity index 100% rename from packages/twenty-front/src/modules/object-record/field/types/guards/isFieldPhoneValue.ts rename to packages/twenty-front/src/modules/object-record/record-field/types/guards/isFieldPhoneValue.ts diff --git a/packages/twenty-front/src/modules/object-record/field/types/guards/isFieldRating.ts b/packages/twenty-front/src/modules/object-record/record-field/types/guards/isFieldRating.ts similarity index 100% rename from packages/twenty-front/src/modules/object-record/field/types/guards/isFieldRating.ts rename to packages/twenty-front/src/modules/object-record/record-field/types/guards/isFieldRating.ts diff --git a/packages/twenty-front/src/modules/object-record/field/types/guards/isFieldRatingValue.ts b/packages/twenty-front/src/modules/object-record/record-field/types/guards/isFieldRatingValue.ts similarity index 100% rename from packages/twenty-front/src/modules/object-record/field/types/guards/isFieldRatingValue.ts rename to packages/twenty-front/src/modules/object-record/record-field/types/guards/isFieldRatingValue.ts diff --git a/packages/twenty-front/src/modules/object-record/field/types/guards/isFieldRelation.ts b/packages/twenty-front/src/modules/object-record/record-field/types/guards/isFieldRelation.ts similarity index 100% rename from packages/twenty-front/src/modules/object-record/field/types/guards/isFieldRelation.ts rename to packages/twenty-front/src/modules/object-record/record-field/types/guards/isFieldRelation.ts diff --git a/packages/twenty-front/src/modules/object-record/field/types/guards/isFieldRelationValue.ts b/packages/twenty-front/src/modules/object-record/record-field/types/guards/isFieldRelationValue.ts similarity index 100% rename from packages/twenty-front/src/modules/object-record/field/types/guards/isFieldRelationValue.ts rename to packages/twenty-front/src/modules/object-record/record-field/types/guards/isFieldRelationValue.ts diff --git a/packages/twenty-front/src/modules/object-record/field/types/guards/isFieldSelect.ts b/packages/twenty-front/src/modules/object-record/record-field/types/guards/isFieldSelect.ts similarity index 100% rename from packages/twenty-front/src/modules/object-record/field/types/guards/isFieldSelect.ts rename to packages/twenty-front/src/modules/object-record/record-field/types/guards/isFieldSelect.ts diff --git a/packages/twenty-front/src/modules/object-record/field/types/guards/isFieldSelectValue.ts b/packages/twenty-front/src/modules/object-record/record-field/types/guards/isFieldSelectValue.ts similarity index 65% rename from packages/twenty-front/src/modules/object-record/field/types/guards/isFieldSelectValue.ts rename to packages/twenty-front/src/modules/object-record/record-field/types/guards/isFieldSelectValue.ts index b3b256228..55dbaa4a6 100644 --- a/packages/twenty-front/src/modules/object-record/field/types/guards/isFieldSelectValue.ts +++ b/packages/twenty-front/src/modules/object-record/record-field/types/guards/isFieldSelectValue.ts @@ -1,6 +1,6 @@ import { isString } from '@sniptt/guards'; -import { FieldSelectValue } from '@/object-record/field/types/FieldMetadata'; +import { FieldSelectValue } from '@/object-record/record-field/types/FieldMetadata'; export const isFieldSelectValue = ( fieldValue: unknown, diff --git a/packages/twenty-front/src/modules/object-record/field/types/guards/isFieldText.ts b/packages/twenty-front/src/modules/object-record/record-field/types/guards/isFieldText.ts similarity index 100% rename from packages/twenty-front/src/modules/object-record/field/types/guards/isFieldText.ts rename to packages/twenty-front/src/modules/object-record/record-field/types/guards/isFieldText.ts diff --git a/packages/twenty-front/src/modules/object-record/field/types/guards/isFieldTextValue.ts b/packages/twenty-front/src/modules/object-record/record-field/types/guards/isFieldTextValue.ts similarity index 100% rename from packages/twenty-front/src/modules/object-record/field/types/guards/isFieldTextValue.ts rename to packages/twenty-front/src/modules/object-record/record-field/types/guards/isFieldTextValue.ts diff --git a/packages/twenty-front/src/modules/object-record/field/types/guards/isFieldUuid.ts b/packages/twenty-front/src/modules/object-record/record-field/types/guards/isFieldUuid.ts similarity index 100% rename from packages/twenty-front/src/modules/object-record/field/types/guards/isFieldUuid.ts rename to packages/twenty-front/src/modules/object-record/record-field/types/guards/isFieldUuid.ts diff --git a/packages/twenty-front/src/modules/object-record/field/types/resolvers/DoubleTextTypeResolver.ts b/packages/twenty-front/src/modules/object-record/record-field/types/resolvers/DoubleTextTypeResolver.ts similarity index 100% rename from packages/twenty-front/src/modules/object-record/field/types/resolvers/DoubleTextTypeResolver.ts rename to packages/twenty-front/src/modules/object-record/record-field/types/resolvers/DoubleTextTypeResolver.ts diff --git a/packages/twenty-front/src/modules/object-record/field/utils/__tests__/isFieldValueEmpty.test.ts b/packages/twenty-front/src/modules/object-record/record-field/utils/__tests__/isFieldValueEmpty.test.ts similarity index 92% rename from packages/twenty-front/src/modules/object-record/field/utils/__tests__/isFieldValueEmpty.test.ts rename to packages/twenty-front/src/modules/object-record/record-field/utils/__tests__/isFieldValueEmpty.test.ts index 205fdbc06..f70cdf855 100644 --- a/packages/twenty-front/src/modules/object-record/field/utils/__tests__/isFieldValueEmpty.test.ts +++ b/packages/twenty-front/src/modules/object-record/record-field/utils/__tests__/isFieldValueEmpty.test.ts @@ -5,9 +5,9 @@ import { linkFieldDefinition, relationFieldDefinition, selectFieldDefinition, -} from '@/object-record/field/__mocks__/fieldDefinitions'; -import { FieldDefinition } from '@/object-record/field/types/FieldDefinition'; -import { FieldCurrencyMetadata } from '@/object-record/field/types/FieldMetadata'; +} from '@/object-record/record-field/__mocks__/fieldDefinitions'; +import { FieldDefinition } from '@/object-record/record-field/types/FieldDefinition'; +import { FieldCurrencyMetadata } from '@/object-record/record-field/types/FieldMetadata'; import { isFieldValueEmpty } from '../isFieldValueEmpty'; diff --git a/packages/twenty-front/src/modules/object-record/record-field/utils/computeDraftValueFromFieldValue.ts b/packages/twenty-front/src/modules/object-record/record-field/utils/computeDraftValueFromFieldValue.ts new file mode 100644 index 000000000..bca25224d --- /dev/null +++ b/packages/twenty-front/src/modules/object-record/record-field/utils/computeDraftValueFromFieldValue.ts @@ -0,0 +1,39 @@ +import { CurrencyCode } from '@/object-record/record-field/types/CurrencyCode'; +import { FieldDefinition } from '@/object-record/record-field/types/FieldDefinition'; +import { FieldInputDraftValue } from '@/object-record/record-field/types/FieldInputDraftValue'; +import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata'; +import { isFieldCurrency } from '@/object-record/record-field/types/guards/isFieldCurrency'; +import { isFieldCurrencyValue } from '@/object-record/record-field/types/guards/isFieldCurrencyValue'; +import { computeEmptyDraftValue } from '@/object-record/record-field/utils/computeEmptyDraftValue'; +import { isFieldValueEmpty } from '@/object-record/record-field/utils/isFieldValueEmpty'; + +type computeDraftValueFromFieldValueParams = { + fieldDefinition: Pick, 'type'>; + fieldValue: FieldValue; +}; + +export const computeDraftValueFromFieldValue = ({ + fieldValue, + fieldDefinition, +}: computeDraftValueFromFieldValueParams): FieldInputDraftValue => { + // Todo: implement type guards at runtime here + // The idea is that fieldValue type is more restricted + // than the intputDraftValue type as string can be typed anywhere + + if (isFieldCurrency(fieldDefinition)) { + if (isFieldValueEmpty({ fieldValue, fieldDefinition })) { + return computeEmptyDraftValue({ fieldDefinition }); + } + + if (isFieldCurrencyValue(fieldValue)) { + return { + amount: fieldValue?.amountMicros + ? fieldValue.amountMicros / 1000000 + : '', + currenyCode: CurrencyCode.USD, + } as unknown as FieldInputDraftValue; + } + } + + return fieldValue as FieldInputDraftValue; +}; diff --git a/packages/twenty-front/src/modules/object-record/record-field/utils/computeDraftValueFromString.ts b/packages/twenty-front/src/modules/object-record/record-field/utils/computeDraftValueFromString.ts new file mode 100644 index 000000000..dcb00de6f --- /dev/null +++ b/packages/twenty-front/src/modules/object-record/record-field/utils/computeDraftValueFromString.ts @@ -0,0 +1,53 @@ +import { CurrencyCode } from '@/object-record/record-field/types/CurrencyCode'; +import { FieldDefinition } from '@/object-record/record-field/types/FieldDefinition'; +import { FieldInputDraftValue } from '@/object-record/record-field/types/FieldInputDraftValue'; +import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata'; +import { isFieldCurrency } from '@/object-record/record-field/types/guards/isFieldCurrency'; +import { isFieldDateTime } from '@/object-record/record-field/types/guards/isFieldDateTime'; +import { isFieldEmail } from '@/object-record/record-field/types/guards/isFieldEmail'; +import { isFieldFullName } from '@/object-record/record-field/types/guards/isFieldFullName'; +import { isFieldLink } from '@/object-record/record-field/types/guards/isFieldLink'; +import { isFieldNumber } from '@/object-record/record-field/types/guards/isFieldNumber'; +import { isFieldText } from '@/object-record/record-field/types/guards/isFieldText'; +import { isFieldUuid } from '@/object-record/record-field/types/guards/isFieldUuid'; + +type computeDraftValueFromStringParams = { + fieldDefinition: Pick, 'type'>; + value: string; +}; + +export const computeDraftValueFromString = ({ + fieldDefinition, + value, +}: computeDraftValueFromStringParams): FieldInputDraftValue => { + // Todo: improve typing + if ( + isFieldUuid(fieldDefinition) || + isFieldText(fieldDefinition) || + isFieldDateTime(fieldDefinition) || + isFieldNumber(fieldDefinition) || + isFieldEmail(fieldDefinition) + ) { + return value as FieldInputDraftValue; + } + + if (isFieldLink(fieldDefinition)) { + return { url: value, label: value } as FieldInputDraftValue; + } + + if (isFieldCurrency(fieldDefinition)) { + return { + amount: value, + currenyCode: CurrencyCode.USD, + } as unknown as FieldInputDraftValue; + } + + if (isFieldFullName(fieldDefinition)) { + return { + firstName: value, + lastName: '', + } as FieldInputDraftValue; + } + + throw new Error(`Record field type not supported : ${fieldDefinition.type}}`); +}; diff --git a/packages/twenty-front/src/modules/object-record/record-field/utils/computeEmptyDraftValue.ts b/packages/twenty-front/src/modules/object-record/record-field/utils/computeEmptyDraftValue.ts new file mode 100644 index 000000000..5a680ff13 --- /dev/null +++ b/packages/twenty-front/src/modules/object-record/record-field/utils/computeEmptyDraftValue.ts @@ -0,0 +1,51 @@ +import { CurrencyCode } from '@/object-record/record-field/types/CurrencyCode'; +import { FieldDefinition } from '@/object-record/record-field/types/FieldDefinition'; +import { FieldInputDraftValue } from '@/object-record/record-field/types/FieldInputDraftValue'; +import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata'; +import { isFieldCurrency } from '@/object-record/record-field/types/guards/isFieldCurrency'; +import { isFieldDateTime } from '@/object-record/record-field/types/guards/isFieldDateTime'; +import { isFieldEmail } from '@/object-record/record-field/types/guards/isFieldEmail'; +import { isFieldFullName } from '@/object-record/record-field/types/guards/isFieldFullName'; +import { isFieldLink } from '@/object-record/record-field/types/guards/isFieldLink'; +import { isFieldNumber } from '@/object-record/record-field/types/guards/isFieldNumber'; +import { isFieldText } from '@/object-record/record-field/types/guards/isFieldText'; +import { isFieldUuid } from '@/object-record/record-field/types/guards/isFieldUuid'; + +type computeEmptyDraftValueParams = { + fieldDefinition: Pick, 'type'>; +}; + +export const computeEmptyDraftValue = ({ + fieldDefinition, +}: computeEmptyDraftValueParams): FieldInputDraftValue => { + // Todo: improve typing + if ( + isFieldUuid(fieldDefinition) || + isFieldText(fieldDefinition) || + isFieldDateTime(fieldDefinition) || + isFieldNumber(fieldDefinition) || + isFieldEmail(fieldDefinition) + ) { + return '' as FieldInputDraftValue; + } + + if (isFieldLink(fieldDefinition)) { + return { url: '', label: '' } as FieldInputDraftValue; + } + + if (isFieldCurrency(fieldDefinition)) { + return { + amount: '', + currenyCode: CurrencyCode.USD, + } as unknown as FieldInputDraftValue; + } + + if (isFieldFullName(fieldDefinition)) { + return { + firstName: '', + lastName: '', + } as FieldInputDraftValue; + } + + throw new Error(`Record field type not supported : ${fieldDefinition.type}}`); +}; diff --git a/packages/twenty-front/src/modules/object-record/record-field/utils/isFieldValueEmpty.ts b/packages/twenty-front/src/modules/object-record/record-field/utils/isFieldValueEmpty.ts new file mode 100644 index 000000000..c9e4d04a8 --- /dev/null +++ b/packages/twenty-front/src/modules/object-record/record-field/utils/isFieldValueEmpty.ts @@ -0,0 +1,73 @@ +import { FieldDefinition } from '@/object-record/record-field/types/FieldDefinition'; +import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata'; +import { isFieldBoolean } from '@/object-record/record-field/types/guards/isFieldBoolean'; +import { isFieldCurrency } from '@/object-record/record-field/types/guards/isFieldCurrency'; +import { isFieldCurrencyValue } from '@/object-record/record-field/types/guards/isFieldCurrencyValue'; +import { isFieldDateTime } from '@/object-record/record-field/types/guards/isFieldDateTime'; +import { isFieldEmail } from '@/object-record/record-field/types/guards/isFieldEmail'; +import { isFieldFullName } from '@/object-record/record-field/types/guards/isFieldFullName'; +import { isFieldFullNameValue } from '@/object-record/record-field/types/guards/isFieldFullNameValue'; +import { isFieldLink } from '@/object-record/record-field/types/guards/isFieldLink'; +import { isFieldLinkValue } from '@/object-record/record-field/types/guards/isFieldLinkValue'; +import { isFieldNumber } from '@/object-record/record-field/types/guards/isFieldNumber'; +import { isFieldRating } from '@/object-record/record-field/types/guards/isFieldRating'; +import { isFieldRelation } from '@/object-record/record-field/types/guards/isFieldRelation'; +import { isFieldRelationValue } from '@/object-record/record-field/types/guards/isFieldRelationValue'; +import { isFieldSelect } from '@/object-record/record-field/types/guards/isFieldSelect'; +import { isFieldSelectValue } from '@/object-record/record-field/types/guards/isFieldSelectValue'; +import { isFieldText } from '@/object-record/record-field/types/guards/isFieldText'; +import { isFieldUuid } from '@/object-record/record-field/types/guards/isFieldUuid'; +import { assertNotNull } from '~/utils/assert'; + +const isValueEmpty = (value: unknown) => !assertNotNull(value) || value === ''; + +export const isFieldValueEmpty = ({ + fieldDefinition, + fieldValue, +}: { + fieldDefinition: Pick, 'type'>; + fieldValue: unknown; +}) => { + if ( + isFieldUuid(fieldDefinition) || + isFieldText(fieldDefinition) || + isFieldDateTime(fieldDefinition) || + isFieldNumber(fieldDefinition) || + isFieldRating(fieldDefinition) || + isFieldEmail(fieldDefinition) || + isFieldBoolean(fieldDefinition) + //|| isFieldPhone(fieldDefinition) + ) { + return isValueEmpty(fieldValue); + } + + if (isFieldRelation(fieldDefinition)) { + return isFieldRelationValue(fieldValue) && isValueEmpty(fieldValue); + } + + if (isFieldSelect(fieldDefinition)) { + return isFieldSelectValue(fieldValue) && !assertNotNull(fieldValue); + } + + if (isFieldCurrency(fieldDefinition)) { + return ( + !isFieldCurrencyValue(fieldValue) || + isValueEmpty(fieldValue?.amountMicros) + ); + } + + if (isFieldFullName(fieldDefinition)) { + return ( + !isFieldFullNameValue(fieldValue) || + isValueEmpty(fieldValue?.firstName + fieldValue?.lastName) + ); + } + + if (isFieldLink(fieldDefinition)) { + return !isFieldLinkValue(fieldValue) || isValueEmpty(fieldValue?.url); + } + + throw new Error( + `Entity field type not supported in isEntityFieldEditModeEmptyFamilySelector : ${fieldDefinition.type}}`, + ); +}; diff --git a/packages/twenty-front/src/modules/object-record/record-index/components/RecordIndexTableContainer.tsx b/packages/twenty-front/src/modules/object-record/record-index/components/RecordIndexTableContainer.tsx index 8d40bd874..6b6b0e18a 100644 --- a/packages/twenty-front/src/modules/object-record/record-index/components/RecordIndexTableContainer.tsx +++ b/packages/twenty-front/src/modules/object-record/record-index/components/RecordIndexTableContainer.tsx @@ -1,6 +1,6 @@ import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem'; -import { RecordUpdateHookParams } from '@/object-record/field/contexts/FieldContext'; import { useUpdateOneRecord } from '@/object-record/hooks/useUpdateOneRecord'; +import { RecordUpdateHookParams } from '@/object-record/record-field/contexts/FieldContext'; import { RecordTableActionBar } from '@/object-record/record-table/action-bar/components/RecordTableActionBar'; import { RecordTableWithWrappers } from '@/object-record/record-table/components/RecordTableWithWrappers'; import { RecordTableContextMenu } from '@/object-record/record-table/context-menu/components/RecordTableContextMenu'; diff --git a/packages/twenty-front/src/modules/object-record/record-index/states/recordIndexFieldDefinitionsState.ts b/packages/twenty-front/src/modules/object-record/record-index/states/recordIndexFieldDefinitionsState.ts index 439c55e4e..9fccbe7ab 100644 --- a/packages/twenty-front/src/modules/object-record/record-index/states/recordIndexFieldDefinitionsState.ts +++ b/packages/twenty-front/src/modules/object-record/record-index/states/recordIndexFieldDefinitionsState.ts @@ -1,6 +1,6 @@ import { atom } from 'recoil'; -import { FieldMetadata } from '@/object-record/field/types/FieldMetadata'; +import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata'; import { ColumnDefinition } from '@/object-record/record-table/types/ColumnDefinition'; export const recordIndexFieldDefinitionsState = atom< diff --git a/packages/twenty-front/src/modules/object-record/record-inline-cell/components/RecordInlineCell.tsx b/packages/twenty-front/src/modules/object-record/record-inline-cell/components/RecordInlineCell.tsx index ddf4d6080..fd677eecd 100644 --- a/packages/twenty-front/src/modules/object-record/record-inline-cell/components/RecordInlineCell.tsx +++ b/packages/twenty-front/src/modules/object-record/record-inline-cell/components/RecordInlineCell.tsx @@ -1,22 +1,22 @@ import { useContext } from 'react'; +import { FieldDisplay } from '@/object-record/record-field/components/FieldDisplay'; +import { FieldInput } from '@/object-record/record-field/components/FieldInput'; +import { FieldContext } from '@/object-record/record-field/contexts/FieldContext'; +import { useGetButtonIcon } from '@/object-record/record-field/hooks/useGetButtonIcon'; +import { useIsFieldEmpty } from '@/object-record/record-field/hooks/useIsFieldEmpty'; +import { useIsFieldInputOnly } from '@/object-record/record-field/hooks/useIsFieldInputOnly'; +import { FieldInputEvent } from '@/object-record/record-field/types/FieldInputEvent'; +import { isFieldRelation } from '@/object-record/record-field/types/guards/isFieldRelation'; import { RelationPickerHotkeyScope } from '@/object-record/relation-picker/types/RelationPickerHotkeyScope'; import { useIcons } from '@/ui/display/icon/hooks/useIcons'; -import { FieldDisplay } from '../../field/components/FieldDisplay'; -import { FieldInput } from '../../field/components/FieldInput'; -import { FieldContext } from '../../field/contexts/FieldContext'; -import { useGetButtonIcon } from '../../field/hooks/useGetButtonIcon'; -import { useIsFieldEmpty } from '../../field/hooks/useIsFieldEmpty'; -import { useIsFieldInputOnly } from '../../field/hooks/useIsFieldInputOnly'; -import { FieldInputEvent } from '../../field/types/FieldInputEvent'; -import { isFieldRelation } from '../../field/types/guards/isFieldRelation'; import { useInlineCell } from '../hooks/useInlineCell'; import { RecordInlineCellContainer } from './RecordInlineCellContainer'; export const RecordInlineCell = () => { - const { fieldDefinition } = useContext(FieldContext); + const { fieldDefinition, entityId } = useContext(FieldContext); const buttonIcon = useGetButtonIcon(); @@ -79,6 +79,7 @@ export const RecordInlineCell = () => { showLabel={fieldDefinition.showLabel} editModeContent={ { + const { entityId, fieldDefinition } = useContext(FieldContext); const [isHovered, setIsHovered] = useState(false); const handleContainerMouseEnter = () => { @@ -133,6 +134,7 @@ export const RecordInlineCellContainer = ({ buttonIcon && !isInlineCellInEditMode && isHovered && !editModeContentOnly; const theme = useTheme(); + const labelId = `label-${entityId}-${fieldDefinition?.metadata?.fieldName}`; return ( {(!!IconLabel || !!label) && ( - + {IconLabel && ( @@ -151,9 +153,10 @@ export const RecordInlineCellContainer = ({ {label} )} - {!showLabel && ( + {/* TODO: Displaying Tooltips on the board is causing performance issues https://react-tooltip.com/docs/examples/render */} + {!showLabel && !fieldDefinition?.disableTooltip && ( { - const { recoilScopeId = '' } = useContext(FieldContext); + const { + recoilScopeId = '', + entityId, + fieldDefinition, + } = useContext(FieldContext); const [isInlineCellInEditMode, setIsInlineCellInEditMode] = useRecoilState( isInlineCellInEditModeScopedState(recoilScopeId), @@ -20,6 +25,10 @@ export const useInlineCell = () => { goBackToPreviousHotkeyScope, } = usePreviousHotkeyScope(); + const { initDraftValue: initFieldInputDraftValue } = useRecordFieldInput( + `${entityId}-${fieldDefinition?.metadata?.fieldName}`, + ); + const closeInlineCell = () => { setIsInlineCellInEditMode(false); @@ -28,6 +37,7 @@ export const useInlineCell = () => { const openInlineCell = (customEditHotkeyScopeForField?: HotkeyScope) => { setIsInlineCellInEditMode(true); + initFieldInputDraftValue(); if (customEditHotkeyScopeForField) { setHotkeyScopeAndMemorizePreviousScope( diff --git a/packages/twenty-front/src/modules/object-record/record-inline-cell/states/recoil-scope-contexts/FieldRecoilScopeContext.ts b/packages/twenty-front/src/modules/object-record/record-inline-cell/states/recoil-scope-contexts/FieldRecoilScopeContext.ts deleted file mode 100644 index 8e6f18bc4..000000000 --- a/packages/twenty-front/src/modules/object-record/record-inline-cell/states/recoil-scope-contexts/FieldRecoilScopeContext.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { createContext } from 'react'; - -export const FieldRecoilScopeContext = createContext(null); diff --git a/packages/twenty-front/src/modules/object-record/record-relation-card/components/RecordRelationFieldCardContent.tsx b/packages/twenty-front/src/modules/object-record/record-relation-card/components/RecordRelationFieldCardContent.tsx index 34f034f07..8ba1d0cfe 100644 --- a/packages/twenty-front/src/modules/object-record/record-relation-card/components/RecordRelationFieldCardContent.tsx +++ b/packages/twenty-front/src/modules/object-record/record-relation-card/components/RecordRelationFieldCardContent.tsx @@ -7,12 +7,12 @@ import { LightIconButton, MenuItem } from 'tsup.ui.index'; import { CachedObjectRecordEdge } from '@/apollo/types/CachedObjectRecordEdge'; import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem'; import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular'; -import { FieldDisplay } from '@/object-record/field/components/FieldDisplay'; -import { FieldContext } from '@/object-record/field/contexts/FieldContext'; -import { usePersistField } from '@/object-record/field/hooks/usePersistField'; -import { FieldRelationMetadata } from '@/object-record/field/types/FieldMetadata'; import { useFieldContext } from '@/object-record/hooks/useFieldContext'; import { useUpdateOneRecord } from '@/object-record/hooks/useUpdateOneRecord'; +import { FieldDisplay } from '@/object-record/record-field/components/FieldDisplay'; +import { FieldContext } from '@/object-record/record-field/contexts/FieldContext'; +import { usePersistField } from '@/object-record/record-field/hooks/usePersistField'; +import { FieldRelationMetadata } from '@/object-record/record-field/types/FieldMetadata'; import { recordStoreFamilyState } from '@/object-record/record-store/states/recordStoreFamilyState'; import { ObjectRecord } from '@/object-record/types/ObjectRecord'; import { IconDotsVertical, IconUnlink } from '@/ui/display/icon'; diff --git a/packages/twenty-front/src/modules/object-record/record-relation-card/components/RecordRelationFieldCardSection.tsx b/packages/twenty-front/src/modules/object-record/record-relation-card/components/RecordRelationFieldCardSection.tsx index 025d56b78..9137a28b8 100644 --- a/packages/twenty-front/src/modules/object-record/record-relation-card/components/RecordRelationFieldCardSection.tsx +++ b/packages/twenty-front/src/modules/object-record/record-relation-card/components/RecordRelationFieldCardSection.tsx @@ -8,11 +8,11 @@ import { useRecoilValue } from 'recoil'; import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem'; import { parseFieldRelationType } from '@/object-metadata/utils/parseFieldRelationType'; -import { FieldContext } from '@/object-record/field/contexts/FieldContext'; -import { usePersistField } from '@/object-record/field/hooks/usePersistField'; -import { FieldRelationMetadata } from '@/object-record/field/types/FieldMetadata'; import { useModifyRecordFromCache } from '@/object-record/hooks/useModifyRecordFromCache'; import { useUpdateOneRecord } from '@/object-record/hooks/useUpdateOneRecord'; +import { FieldContext } from '@/object-record/record-field/contexts/FieldContext'; +import { usePersistField } from '@/object-record/record-field/hooks/usePersistField'; +import { FieldRelationMetadata } from '@/object-record/record-field/types/FieldMetadata'; import { RecordRelationFieldCardContent } from '@/object-record/record-relation-card/components/RecordRelationFieldCardContent'; import { recordStoreFamilyState } from '@/object-record/record-store/states/recordStoreFamilyState'; import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector'; diff --git a/packages/twenty-front/src/modules/object-record/record-show/components/RecordShowContainer.tsx b/packages/twenty-front/src/modules/object-record/record-show/components/RecordShowContainer.tsx index 4703f9604..8ead4b22d 100644 --- a/packages/twenty-front/src/modules/object-record/record-show/components/RecordShowContainer.tsx +++ b/packages/twenty-front/src/modules/object-record/record-show/components/RecordShowContainer.tsx @@ -5,13 +5,13 @@ import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadata import { formatFieldMetadataItemAsColumnDefinition } from '@/object-metadata/utils/formatFieldMetadataItemAsColumnDefinition'; import { isObjectMetadataAvailableForRelation } from '@/object-metadata/utils/isObjectMetadataAvailableForRelation'; import { parseFieldType } from '@/object-metadata/utils/parseFieldType'; +import { useFindOneRecord } from '@/object-record/hooks/useFindOneRecord'; +import { useUpdateOneRecord } from '@/object-record/hooks/useUpdateOneRecord'; import { FieldContext, RecordUpdateHook, RecordUpdateHookParams, -} from '@/object-record/field/contexts/FieldContext'; -import { useFindOneRecord } from '@/object-record/hooks/useFindOneRecord'; -import { useUpdateOneRecord } from '@/object-record/hooks/useUpdateOneRecord'; +} from '@/object-record/record-field/contexts/FieldContext'; import { RecordInlineCell } from '@/object-record/record-inline-cell/components/RecordInlineCell'; import { PropertyBox } from '@/object-record/record-inline-cell/property-box/components/PropertyBox'; import { InlineCellHotkeyScope } from '@/object-record/record-inline-cell/types/InlineCellHotkeyScope'; diff --git a/packages/twenty-front/src/modules/object-record/record-table/components/ColumnHead.tsx b/packages/twenty-front/src/modules/object-record/record-table/components/ColumnHead.tsx index c3f61d898..f9678b411 100644 --- a/packages/twenty-front/src/modules/object-record/record-table/components/ColumnHead.tsx +++ b/packages/twenty-front/src/modules/object-record/record-table/components/ColumnHead.tsx @@ -1,7 +1,7 @@ import { useTheme } from '@emotion/react'; import styled from '@emotion/styled'; -import { FieldMetadata } from '@/object-record/field/types/FieldMetadata'; +import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata'; import { useIcons } from '@/ui/display/icon/hooks/useIcons'; import { ColumnDefinition } from '../types/ColumnDefinition'; diff --git a/packages/twenty-front/src/modules/object-record/record-table/components/ColumnHeadWithDropdown.tsx b/packages/twenty-front/src/modules/object-record/record-table/components/ColumnHeadWithDropdown.tsx index a90a85d3b..d33e652fa 100644 --- a/packages/twenty-front/src/modules/object-record/record-table/components/ColumnHeadWithDropdown.tsx +++ b/packages/twenty-front/src/modules/object-record/record-table/components/ColumnHeadWithDropdown.tsx @@ -1,10 +1,9 @@ import styled from '@emotion/styled'; +import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata'; +import { ColumnDefinition } from '@/object-record/record-table/types/ColumnDefinition'; import { Dropdown } from '@/ui/layout/dropdown/components/Dropdown'; -import { FieldMetadata } from '../../field/types/FieldMetadata'; -import { ColumnDefinition } from '../types/ColumnDefinition'; - import { ColumnHead } from './ColumnHead'; import { RecordTableColumnDropdownMenu } from './RecordTableColumnDropdownMenu'; diff --git a/packages/twenty-front/src/modules/object-record/record-table/components/RecordTableCellContainer.tsx b/packages/twenty-front/src/modules/object-record/record-table/components/RecordTableCellContainer.tsx index 26d2a52e4..144afa7f4 100644 --- a/packages/twenty-front/src/modules/object-record/record-table/components/RecordTableCellContainer.tsx +++ b/packages/twenty-front/src/modules/object-record/record-table/components/RecordTableCellContainer.tsx @@ -3,21 +3,20 @@ import { useSetRecoilState } from 'recoil'; import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem'; import { isLabelIdentifierField } from '@/object-metadata/utils/isLabelIdentifierField'; +import { FieldContext } from '@/object-record/record-field/contexts/FieldContext'; +import { isFieldRelation } from '@/object-record/record-field/types/guards/isFieldRelation'; +import { ColumnContext } from '@/object-record/record-table/contexts/ColumnContext'; +import { ColumnIndexContext } from '@/object-record/record-table/contexts/ColumnIndexContext'; +import { RecordUpdateContext } from '@/object-record/record-table/contexts/EntityUpdateMutationHookContext'; +import { RowIdContext } from '@/object-record/record-table/contexts/RowIdContext'; +import { RecordTableCell } from '@/object-record/record-table/record-table-cell/components/RecordTableCell'; +import { useCurrentRowSelected } from '@/object-record/record-table/record-table-row/hooks/useCurrentRowSelected'; +import { TableHotkeyScope } from '@/object-record/record-table/types/TableHotkeyScope'; import { RelationPickerHotkeyScope } from '@/object-record/relation-picker/types/RelationPickerHotkeyScope'; import { contextMenuIsOpenState } from '@/ui/navigation/context-menu/states/contextMenuIsOpenState'; import { contextMenuPositionState } from '@/ui/navigation/context-menu/states/contextMenuPositionState'; import { RecoilScope } from '@/ui/utilities/recoil-scope/components/RecoilScope'; -import { FieldContext } from '../../field/contexts/FieldContext'; -import { isFieldRelation } from '../../field/types/guards/isFieldRelation'; -import { ColumnContext } from '../contexts/ColumnContext'; -import { ColumnIndexContext } from '../contexts/ColumnIndexContext'; -import { RecordUpdateContext } from '../contexts/EntityUpdateMutationHookContext'; -import { RowIdContext } from '../contexts/RowIdContext'; -import { RecordTableCell } from '../record-table-cell/components/RecordTableCell'; -import { useCurrentRowSelected } from '../record-table-row/hooks/useCurrentRowSelected'; -import { TableHotkeyScope } from '../types/TableHotkeyScope'; - export const RecordTableCellContainer = ({ cellIndex, }: { diff --git a/packages/twenty-front/src/modules/object-record/record-table/components/RecordTableColumnDropdownMenu.tsx b/packages/twenty-front/src/modules/object-record/record-table/components/RecordTableColumnDropdownMenu.tsx index 0b0fa1bc4..c92f4da5d 100644 --- a/packages/twenty-front/src/modules/object-record/record-table/components/RecordTableColumnDropdownMenu.tsx +++ b/packages/twenty-front/src/modules/object-record/record-table/components/RecordTableColumnDropdownMenu.tsx @@ -1,4 +1,4 @@ -import { FieldMetadata } from '@/object-record/field/types/FieldMetadata'; +import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata'; import { IconArrowLeft, IconArrowRight, IconEyeOff } from '@/ui/display/icon'; import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer'; import { useDropdown } from '@/ui/layout/dropdown/hooks/useDropdown'; diff --git a/packages/twenty-front/src/modules/object-record/record-table/components/RecordTableHeaderCell.tsx b/packages/twenty-front/src/modules/object-record/record-table/components/RecordTableHeaderCell.tsx index 08ccfbb85..8e5712fd2 100644 --- a/packages/twenty-front/src/modules/object-record/record-table/components/RecordTableHeaderCell.tsx +++ b/packages/twenty-front/src/modules/object-record/record-table/components/RecordTableHeaderCell.tsx @@ -2,7 +2,7 @@ import { useCallback, useState } from 'react'; import styled from '@emotion/styled'; import { useRecoilCallback, useRecoilState, useRecoilValue } from 'recoil'; -import { FieldMetadata } from '@/object-record/field/types/FieldMetadata'; +import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata'; import { useRecordTableStates } from '@/object-record/record-table/hooks/internal/useRecordTableStates'; import { useTableColumns } from '@/object-record/record-table/hooks/useTableColumns'; import { ColumnDefinition } from '@/object-record/record-table/types/ColumnDefinition'; diff --git a/packages/twenty-front/src/modules/object-record/record-table/components/RecordTableHeaderPlusButtonContent.tsx b/packages/twenty-front/src/modules/object-record/record-table/components/RecordTableHeaderPlusButtonContent.tsx index 0bec78be9..b08140cea 100644 --- a/packages/twenty-front/src/modules/object-record/record-table/components/RecordTableHeaderPlusButtonContent.tsx +++ b/packages/twenty-front/src/modules/object-record/record-table/components/RecordTableHeaderPlusButtonContent.tsx @@ -3,7 +3,10 @@ import { Link } from 'react-router-dom'; import styled from '@emotion/styled'; import { useRecoilValue } from 'recoil'; +import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata'; import { useRecordTableStates } from '@/object-record/record-table/hooks/internal/useRecordTableStates'; +import { useTableColumns } from '@/object-record/record-table/hooks/useTableColumns'; +import { ColumnDefinition } from '@/object-record/record-table/types/ColumnDefinition'; import { IconSettings } from '@/ui/display/icon'; import { useIcons } from '@/ui/display/icon/hooks/useIcons'; import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer'; @@ -11,10 +14,6 @@ import { DropdownMenuSeparator } from '@/ui/layout/dropdown/components/DropdownM import { useDropdown } from '@/ui/layout/dropdown/hooks/useDropdown'; import { MenuItem } from '@/ui/navigation/menu-item/components/MenuItem'; -import { FieldMetadata } from '../../field/types/FieldMetadata'; -import { useTableColumns } from '../hooks/useTableColumns'; -import { ColumnDefinition } from '../types/ColumnDefinition'; - export const RecordTableHeaderPlusButtonContent = () => { const { closeDropdown } = useDropdown(); diff --git a/packages/twenty-front/src/modules/object-record/record-table/contexts/ColumnContext.ts b/packages/twenty-front/src/modules/object-record/record-table/contexts/ColumnContext.ts index 30fbaa2bc..2cd8eb0c5 100644 --- a/packages/twenty-front/src/modules/object-record/record-table/contexts/ColumnContext.ts +++ b/packages/twenty-front/src/modules/object-record/record-table/contexts/ColumnContext.ts @@ -1,6 +1,6 @@ import { createContext } from 'react'; -import { FieldMetadata } from '@/object-record/field/types/FieldMetadata'; +import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata'; import { ColumnDefinition } from '../types/ColumnDefinition'; diff --git a/packages/twenty-front/src/modules/object-record/record-table/contexts/EntityUpdateMutationHookContext.ts b/packages/twenty-front/src/modules/object-record/record-table/contexts/EntityUpdateMutationHookContext.ts index 89f2d9908..caa046168 100644 --- a/packages/twenty-front/src/modules/object-record/record-table/contexts/EntityUpdateMutationHookContext.ts +++ b/packages/twenty-front/src/modules/object-record/record-table/contexts/EntityUpdateMutationHookContext.ts @@ -1,6 +1,6 @@ import { createContext } from 'react'; -import { RecordUpdateHookParams } from '@/object-record/field/contexts/FieldContext'; +import { RecordUpdateHookParams } from '@/object-record/record-field/contexts/FieldContext'; export const RecordUpdateContext = createContext< (params: RecordUpdateHookParams) => void diff --git a/packages/twenty-front/src/modules/object-record/record-table/hooks/internal/useRecordTableStates.ts b/packages/twenty-front/src/modules/object-record/record-table/hooks/internal/useRecordTableStates.ts index 684099b4b..d1916df48 100644 --- a/packages/twenty-front/src/modules/object-record/record-table/hooks/internal/useRecordTableStates.ts +++ b/packages/twenty-front/src/modules/object-record/record-table/hooks/internal/useRecordTableStates.ts @@ -26,7 +26,7 @@ import { tableSortsStateScopeMap } from '@/object-record/record-table/states/tab import { useAvailableScopeIdOrThrow } from '@/ui/utilities/recoil-scope/scopes-internal/hooks/useAvailableScopeId'; import { getFamilyState } from '@/ui/utilities/recoil-scope/utils/getFamilyState'; import { getScopeIdOrUndefinedFromComponentId } from '@/ui/utilities/recoil-scope/utils/getScopeIdOrUndefinedFromComponentId'; -import { getSelector } from '@/ui/utilities/recoil-scope/utils/getSelector'; +import { getSelectorReadOnly } from '@/ui/utilities/recoil-scope/utils/getSelectorReadOnly'; import { getState } from '@/ui/utilities/recoil-scope/utils/getState'; export const useRecordTableStates = (recordTableId?: string) => { @@ -94,27 +94,27 @@ export const useRecordTableStates = (recordTableId?: string) => { isRowSelectedFamilyStateScopeMap, scopeId, ), - getAllRowsSelectedStatusSelector: getSelector( + getAllRowsSelectedStatusSelector: getSelectorReadOnly( allRowsSelectedStatusSelectorScopeMap, scopeId, ), - getHiddenTableColumnsSelector: getSelector( + getHiddenTableColumnsSelector: getSelectorReadOnly( hiddenTableColumnsSelectorScopeMap, scopeId, ), - getNumberOfTableColumnsSelector: getSelector( + getNumberOfTableColumnsSelector: getSelectorReadOnly( numberOfTableColumnsSelectorScopeMap, scopeId, ), - getSelectedRowIdsSelector: getSelector( + getSelectedRowIdsSelector: getSelectorReadOnly( selectedRowIdsSelectorScopeMap, scopeId, ), - getTableColumnsByKeySelector: getSelector( + getTableColumnsByKeySelector: getSelectorReadOnly( tableColumnsByKeySelectorScopeMap, scopeId, ), - getVisibleTableColumnsSelector: getSelector( + getVisibleTableColumnsSelector: getSelectorReadOnly( visibleTableColumnsSelectorScopeMap, scopeId, ), diff --git a/packages/twenty-front/src/modules/object-record/record-table/hooks/useRecordTable.ts b/packages/twenty-front/src/modules/object-record/record-table/hooks/useRecordTable.ts index 381b97258..d9c3c9baf 100644 --- a/packages/twenty-front/src/modules/object-record/record-table/hooks/useRecordTable.ts +++ b/packages/twenty-front/src/modules/object-record/record-table/hooks/useRecordTable.ts @@ -1,13 +1,13 @@ import { useRecoilCallback, useSetRecoilState } from 'recoil'; import { Key } from 'ts-key-enum'; +import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata'; import { useGetIsSomeCellInEditModeState } from '@/object-record/record-table/hooks/internal/useGetIsSomeCellInEditMode'; import { useRecordTableStates } from '@/object-record/record-table/hooks/internal/useRecordTableStates'; import { useScopedHotkeys } from '@/ui/utilities/hotkey/hooks/useScopedHotkeys'; import { useSetHotkeyScope } from '@/ui/utilities/hotkey/hooks/useSetHotkeyScope'; import { getSnapshotValue } from '@/ui/utilities/recoil-scope/utils/getSnapshotValue'; -import { FieldMetadata } from '../../field/types/FieldMetadata'; import { useUpsertRecordFromState } from '../../hooks/useUpsertRecordFromState'; import { ColumnDefinition } from '../types/ColumnDefinition'; import { TableHotkeyScope } from '../types/TableHotkeyScope'; diff --git a/packages/twenty-front/src/modules/object-record/record-table/hooks/useTableColumns.ts b/packages/twenty-front/src/modules/object-record/record-table/hooks/useTableColumns.ts index 0fa267ba6..1cc9fa344 100644 --- a/packages/twenty-front/src/modules/object-record/record-table/hooks/useTableColumns.ts +++ b/packages/twenty-front/src/modules/object-record/record-table/hooks/useTableColumns.ts @@ -1,7 +1,7 @@ import { useCallback } from 'react'; import { useRecoilValue } from 'recoil'; -import { FieldMetadata } from '@/object-record/field/types/FieldMetadata'; +import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata'; import { useRecordTableStates } from '@/object-record/record-table/hooks/internal/useRecordTableStates'; import { useRecordTable } from '@/object-record/record-table/hooks/useRecordTable'; import { useMoveViewColumns } from '@/views/hooks/useMoveViewColumns'; diff --git a/packages/twenty-front/src/modules/object-record/record-table/record-table-cell/components/RecordTableCell.tsx b/packages/twenty-front/src/modules/object-record/record-table/record-table-cell/components/RecordTableCell.tsx index 635f565f9..0308849f0 100644 --- a/packages/twenty-front/src/modules/object-record/record-table/record-table-cell/components/RecordTableCell.tsx +++ b/packages/twenty-front/src/modules/object-record/record-table/record-table-cell/components/RecordTableCell.tsx @@ -1,10 +1,9 @@ import { useContext } from 'react'; -import { FieldDisplay } from '@/object-record/field/components/FieldDisplay'; -import { FieldInput } from '@/object-record/field/components/FieldInput'; -import { useIsFieldEditModeValueEmpty } from '@/object-record/field/hooks/useIsFieldEditModeValueEmpty'; -import { FieldInputEvent } from '@/object-record/field/types/FieldInputEvent'; -import { ColumnIndexContext } from '@/object-record/record-table/contexts/ColumnIndexContext'; +import { FieldDisplay } from '@/object-record/record-field/components/FieldDisplay'; +import { FieldInput } from '@/object-record/record-field/components/FieldInput'; +import { FieldContext } from '@/object-record/record-field/contexts/FieldContext'; +import { FieldInputEvent } from '@/object-record/record-field/types/FieldInputEvent'; import { HotkeyScope } from '@/ui/utilities/hotkey/types/HotkeyScope'; import { useRecordTable } from '../../hooks/useRecordTable'; @@ -18,27 +17,19 @@ export const RecordTableCell = ({ customHotkeyScope: HotkeyScope; }) => { const { closeTableCell } = useTableCell(); + const { entityId, fieldDefinition } = useContext(FieldContext); const { moveLeft, moveRight, moveDown } = useRecordTable(); - const isFirstColumnCell = useContext(ColumnIndexContext) === 0; - const isEditModeValueEmpty = useIsFieldEditModeValueEmpty(); - - const skipFieldPersist = isFirstColumnCell && isEditModeValueEmpty; - const handleEnter: FieldInputEvent = (persistField) => { - if (!skipFieldPersist) { - persistField(); - } + persistField(); closeTableCell(); moveDown(); }; const handleSubmit: FieldInputEvent = (persistField) => { - if (!skipFieldPersist) { - persistField(); - } + persistField(); closeTableCell(); }; @@ -48,34 +39,26 @@ export const RecordTableCell = ({ }; const handleClickOutside: FieldInputEvent = (persistField) => { - if (!skipFieldPersist) { - persistField(); - } + persistField(); closeTableCell(); }; const handleEscape: FieldInputEvent = (persistField) => { - if (!skipFieldPersist) { - persistField(); - } + persistField(); closeTableCell(); }; const handleTab: FieldInputEvent = (persistField) => { - if (!skipFieldPersist) { - persistField(); - } + persistField(); closeTableCell(); moveRight(); }; const handleShiftTab: FieldInputEvent = (persistField) => { - if (!skipFieldPersist) { - persistField(); - } + persistField(); closeTableCell(); moveLeft(); @@ -86,6 +69,7 @@ export const RecordTableCell = ({ editHotkeyScope={customHotkeyScope} editModeContent={ { if (!isFieldInputOnly) { - openTableCell({ - initialValue: { - isEmpty: true, - }, - }); + openTableCell(); } }, TableHotkeyScope.TableSoftFocus, @@ -75,9 +71,7 @@ export const RecordTableCellSoftFocusMode = ({ keyboardEvent.stopImmediatePropagation(); openTableCell({ - initialValue: { - value: keyboardEvent.key, - }, + initialValue: keyboardEvent.key, }); } }, diff --git a/packages/twenty-front/src/modules/object-record/record-table/record-table-cell/hooks/useTableCell.ts b/packages/twenty-front/src/modules/object-record/record-table/record-table-cell/hooks/useTableCell.ts index 534bbbd35..105350a9c 100644 --- a/packages/twenty-front/src/modules/object-record/record-table/record-table-cell/hooks/useTableCell.ts +++ b/packages/twenty-front/src/modules/object-record/record-table/record-table-cell/hooks/useTableCell.ts @@ -1,12 +1,10 @@ import { useContext } from 'react'; import { useNavigate } from 'react-router-dom'; -import { useRecoilCallback, useRecoilState, useRecoilValue } from 'recoil'; +import { useRecoilCallback, useRecoilValue } from 'recoil'; -import { FieldContext } from '@/object-record/field/contexts/FieldContext'; -import { useIsFieldEditModeValueEmpty } from '@/object-record/field/hooks/useIsFieldEditModeValueEmpty'; -import { useIsFieldEmpty } from '@/object-record/field/hooks/useIsFieldEmpty'; -import { entityFieldInitialValueFamilyState } from '@/object-record/field/states/entityFieldInitialValueFamilyState'; -import { FieldInitialValue } from '@/object-record/field/types/FieldInitialValue'; +import { FieldContext } from '@/object-record/record-field/contexts/FieldContext'; +import { useIsFieldEmpty } from '@/object-record/record-field/hooks/useIsFieldEmpty'; +import { useRecordFieldInput } from '@/object-record/record-field/hooks/useRecordFieldInput'; import { EntityDeleteContext } from '@/object-record/record-table/contexts/EntityDeleteHookContext'; import { useRecordTableStates } from '@/object-record/record-table/hooks/internal/useRecordTableStates'; import { useRecordTable } from '@/object-record/record-table/hooks/useRecordTable'; @@ -49,17 +47,20 @@ export const useTableCell = () => { const isFirstColumnCell = useContext(ColumnIndexContext) === 0; const isEmpty = useIsFieldEmpty(); - const isEditModeValueEmpty = useIsFieldEditModeValueEmpty(); const { entityId, fieldDefinition } = useContext(FieldContext); const deleteOneRecord = useContext(EntityDeleteContext); + const { + initDraftValue: initFieldInputDraftValue, + getDraftValueSelector: getFieldInputDraftValueSelector, + isDraftValueEmpty: isCurrentFieldInputValueEmpty, + } = useRecordFieldInput( + `${entityId}-${fieldDefinition?.metadata?.fieldName}`, + ); - const [, setFieldInitialValue] = useRecoilState( - entityFieldInitialValueFamilyState({ - entityId, - fieldMetadataId: fieldDefinition.fieldMetadataId, - }), + const currentFieldInputDraftValue = useRecoilValue( + getFieldInputDraftValueSelector(), ); const deleteRow = useRecoilCallback(({ snapshot }) => async () => { @@ -68,7 +69,7 @@ export const useTableCell = () => { await deleteOneRecord(tableRowIds[0]); }); - const openTableCell = (options?: { initialValue?: FieldInitialValue }) => { + const openTableCell = (options?: { initialValue?: string }) => { if (isFirstColumnCell && !isEmpty && basePathToShowPage) { leaveTableFocus(); navigate(`${basePathToShowPage}${entityId}`); @@ -78,9 +79,7 @@ export const useTableCell = () => { setDragSelectionStartEnabled(false); setCurrentTableCellInEditMode(); - if (options?.initialValue) { - setFieldInitialValue(options.initialValue); - } + initFieldInputDraftValue(options?.initialValue); if (customCellHotkeyScope) { setHotkeyScope( @@ -95,10 +94,12 @@ export const useTableCell = () => { const closeTableCell = async () => { setDragSelectionStartEnabled(true); closeCurrentTableCellInEditMode(); - setFieldInitialValue(undefined); setHotkeyScope(TableHotkeyScope.TableSoftFocus); - if (isFirstColumnCell && isEditModeValueEmpty) { + if ( + isFirstColumnCell && + isCurrentFieldInputValueEmpty(currentFieldInputDraftValue) + ) { await deleteRow(); } }; diff --git a/packages/twenty-front/src/modules/object-record/record-table/scopes/RecordTableScope.tsx b/packages/twenty-front/src/modules/object-record/record-table/scopes/RecordTableScope.tsx index 9bb0ce825..63ead4b8a 100644 --- a/packages/twenty-front/src/modules/object-record/record-table/scopes/RecordTableScope.tsx +++ b/packages/twenty-front/src/modules/object-record/record-table/scopes/RecordTableScope.tsx @@ -1,7 +1,7 @@ import { ReactNode } from 'react'; -import { FieldMetadata } from '../../field/types/FieldMetadata'; -import { ColumnDefinition } from '../types/ColumnDefinition'; +import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata'; +import { ColumnDefinition } from '@/object-record/record-table/types/ColumnDefinition'; import { RecordTableScopeInternalContext } from './scope-internal-context/RecordTableScopeInternalContext'; import { RecordTableScopeInitEffect } from './RecordTableScopeInitEffect'; diff --git a/packages/twenty-front/src/modules/object-record/record-table/scopes/RecordTableScopeInitEffect.tsx b/packages/twenty-front/src/modules/object-record/record-table/scopes/RecordTableScopeInitEffect.tsx index 0e12971a0..7daa68882 100644 --- a/packages/twenty-front/src/modules/object-record/record-table/scopes/RecordTableScopeInitEffect.tsx +++ b/packages/twenty-front/src/modules/object-record/record-table/scopes/RecordTableScopeInitEffect.tsx @@ -1,9 +1,8 @@ import { useEffect } from 'react'; +import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata'; import { useRecordTable } from '@/object-record/record-table/hooks/useRecordTable'; - -import { FieldMetadata } from '../../field/types/FieldMetadata'; -import { ColumnDefinition } from '../types/ColumnDefinition'; +import { ColumnDefinition } from '@/object-record/record-table/types/ColumnDefinition'; type RecordTableScopeInitEffectProps = { onColumnsChange: (columns: ColumnDefinition[]) => void; diff --git a/packages/twenty-front/src/modules/object-record/record-table/scopes/scope-internal-context/RecordTableScopeInternalContext.ts b/packages/twenty-front/src/modules/object-record/record-table/scopes/scope-internal-context/RecordTableScopeInternalContext.ts index b621b6777..e25882196 100644 --- a/packages/twenty-front/src/modules/object-record/record-table/scopes/scope-internal-context/RecordTableScopeInternalContext.ts +++ b/packages/twenty-front/src/modules/object-record/record-table/scopes/scope-internal-context/RecordTableScopeInternalContext.ts @@ -1,4 +1,4 @@ -import { FieldMetadata } from '@/object-record/field/types/FieldMetadata'; +import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata'; import { StateScopeMapKey } from '@/ui/utilities/recoil-scope/scopes-internal/types/StateScopeMapKey'; import { createScopeInternalContext } from '@/ui/utilities/recoil-scope/scopes-internal/utils/createScopeInternalContext'; diff --git a/packages/twenty-front/src/modules/object-record/record-table/states/availableTableColumnsStateScopeMap.ts b/packages/twenty-front/src/modules/object-record/record-table/states/availableTableColumnsStateScopeMap.ts index 045e22a1c..f60d3afb1 100644 --- a/packages/twenty-front/src/modules/object-record/record-table/states/availableTableColumnsStateScopeMap.ts +++ b/packages/twenty-front/src/modules/object-record/record-table/states/availableTableColumnsStateScopeMap.ts @@ -1,4 +1,4 @@ -import { FieldMetadata } from '@/object-record/field/types/FieldMetadata'; +import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata'; import { createStateScopeMap } from '@/ui/utilities/recoil-scope/utils/createStateScopeMap'; import { ColumnDefinition } from '../types/ColumnDefinition'; diff --git a/packages/twenty-front/src/modules/object-record/record-table/states/onColumnsChangeStateScopeMap.ts b/packages/twenty-front/src/modules/object-record/record-table/states/onColumnsChangeStateScopeMap.ts index fa5cb8261..9253e2443 100644 --- a/packages/twenty-front/src/modules/object-record/record-table/states/onColumnsChangeStateScopeMap.ts +++ b/packages/twenty-front/src/modules/object-record/record-table/states/onColumnsChangeStateScopeMap.ts @@ -1,8 +1,7 @@ +import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata'; +import { ColumnDefinition } from '@/object-record/record-table/types/ColumnDefinition'; import { createStateScopeMap } from '@/ui/utilities/recoil-scope/utils/createStateScopeMap'; -import { FieldMetadata } from '../../field/types/FieldMetadata'; -import { ColumnDefinition } from '../types/ColumnDefinition'; - export const onColumnsChangeStateScopeMap = createStateScopeMap< ((columns: ColumnDefinition[]) => void) | undefined >({ diff --git a/packages/twenty-front/src/modules/object-record/record-table/states/selectors/allRowsSelectedStatusSelectorScopeMap.ts b/packages/twenty-front/src/modules/object-record/record-table/states/selectors/allRowsSelectedStatusSelectorScopeMap.ts index ab376e36f..ee0a66e80 100644 --- a/packages/twenty-front/src/modules/object-record/record-table/states/selectors/allRowsSelectedStatusSelectorScopeMap.ts +++ b/packages/twenty-front/src/modules/object-record/record-table/states/selectors/allRowsSelectedStatusSelectorScopeMap.ts @@ -1,4 +1,4 @@ -import { createSelectorScopeMap } from '@/ui/utilities/recoil-scope/utils/createSelectorScopeMap'; +import { createSelectorReadOnlyScopeMap } from '@/ui/utilities/recoil-scope/utils/createSelectorReadOnlyScopeMap'; import { AllRowsSelectedStatus } from '../../types/AllRowSelectedStatus'; import { numberOfTableRowsStateScopeMap } from '../numberOfTableRowsStateScopeMap'; @@ -6,7 +6,7 @@ import { numberOfTableRowsStateScopeMap } from '../numberOfTableRowsStateScopeMa import { selectedRowIdsSelectorScopeMap } from './selectedRowIdsSelectorScopeMap'; export const allRowsSelectedStatusSelectorScopeMap = - createSelectorScopeMap({ + createSelectorReadOnlyScopeMap({ key: 'allRowsSelectedStatusSelectorScopeMap', get: ({ scopeId }) => diff --git a/packages/twenty-front/src/modules/object-record/record-table/states/selectors/hiddenTableColumnsSelectorScopeMap.ts b/packages/twenty-front/src/modules/object-record/record-table/states/selectors/hiddenTableColumnsSelectorScopeMap.ts index f2a3aa467..221ffb2cd 100644 --- a/packages/twenty-front/src/modules/object-record/record-table/states/selectors/hiddenTableColumnsSelectorScopeMap.ts +++ b/packages/twenty-front/src/modules/object-record/record-table/states/selectors/hiddenTableColumnsSelectorScopeMap.ts @@ -1,22 +1,27 @@ -import { createSelectorScopeMap } from '@/ui/utilities/recoil-scope/utils/createSelectorScopeMap'; +import { createSelectorReadOnlyScopeMap } from '@/ui/utilities/recoil-scope/utils/createSelectorReadOnlyScopeMap'; import { availableTableColumnsStateScopeMap } from '../availableTableColumnsStateScopeMap'; import { tableColumnsStateScopeMap } from '../tableColumnsStateScopeMap'; -export const hiddenTableColumnsSelectorScopeMap = createSelectorScopeMap({ - key: 'hiddenTableColumnsSelectorScopeMap', - get: - ({ scopeId }) => - ({ get }) => { - const columns = get(tableColumnsStateScopeMap({ scopeId })); - const columnKeys = columns.map(({ fieldMetadataId }) => fieldMetadataId); - const otherAvailableColumns = get( - availableTableColumnsStateScopeMap({ scopeId }), - ).filter(({ fieldMetadataId }) => !columnKeys.includes(fieldMetadataId)); +export const hiddenTableColumnsSelectorScopeMap = + createSelectorReadOnlyScopeMap({ + key: 'hiddenTableColumnsSelectorScopeMap', + get: + ({ scopeId }) => + ({ get }) => { + const columns = get(tableColumnsStateScopeMap({ scopeId })); + const columnKeys = columns.map( + ({ fieldMetadataId }) => fieldMetadataId, + ); + const otherAvailableColumns = get( + availableTableColumnsStateScopeMap({ scopeId }), + ).filter( + ({ fieldMetadataId }) => !columnKeys.includes(fieldMetadataId), + ); - return [ - ...columns.filter((column) => !column.isVisible), - ...otherAvailableColumns, - ]; - }, -}); + return [ + ...columns.filter((column) => !column.isVisible), + ...otherAvailableColumns, + ]; + }, + }); diff --git a/packages/twenty-front/src/modules/object-record/record-table/states/selectors/numberOfTableColumnsSelectorScopeMap.ts b/packages/twenty-front/src/modules/object-record/record-table/states/selectors/numberOfTableColumnsSelectorScopeMap.ts index 3fcf050db..a4afd9ccb 100644 --- a/packages/twenty-front/src/modules/object-record/record-table/states/selectors/numberOfTableColumnsSelectorScopeMap.ts +++ b/packages/twenty-front/src/modules/object-record/record-table/states/selectors/numberOfTableColumnsSelectorScopeMap.ts @@ -1,11 +1,12 @@ -import { createSelectorScopeMap } from '@/ui/utilities/recoil-scope/utils/createSelectorScopeMap'; +import { createSelectorReadOnlyScopeMap } from '@/ui/utilities/recoil-scope/utils/createSelectorReadOnlyScopeMap'; import { tableColumnsStateScopeMap } from '../tableColumnsStateScopeMap'; -export const numberOfTableColumnsSelectorScopeMap = createSelectorScopeMap({ - key: 'numberOfTableColumnsSelectorScopeMap', - get: - ({ scopeId }) => - ({ get }) => - get(tableColumnsStateScopeMap({ scopeId })).length, -}); +export const numberOfTableColumnsSelectorScopeMap = + createSelectorReadOnlyScopeMap({ + key: 'numberOfTableColumnsSelectorScopeMap', + get: + ({ scopeId }) => + ({ get }) => + get(tableColumnsStateScopeMap({ scopeId })).length, + }); diff --git a/packages/twenty-front/src/modules/object-record/record-table/states/selectors/selectedRowIdsSelectorScopeMap.ts b/packages/twenty-front/src/modules/object-record/record-table/states/selectors/selectedRowIdsSelectorScopeMap.ts index 144f02942..b395c54d3 100644 --- a/packages/twenty-front/src/modules/object-record/record-table/states/selectors/selectedRowIdsSelectorScopeMap.ts +++ b/packages/twenty-front/src/modules/object-record/record-table/states/selectors/selectedRowIdsSelectorScopeMap.ts @@ -1,9 +1,11 @@ -import { createSelectorScopeMap } from '@/ui/utilities/recoil-scope/utils/createSelectorScopeMap'; +import { createSelectorReadOnlyScopeMap } from '@/ui/utilities/recoil-scope/utils/createSelectorReadOnlyScopeMap'; import { isRowSelectedFamilyStateScopeMap } from '../../record-table-row/states/isRowSelectedFamilyStateScopeMap'; import { tableRowIdsStateScopeMap } from '../tableRowIdsStateScopeMap'; -export const selectedRowIdsSelectorScopeMap = createSelectorScopeMap({ +export const selectedRowIdsSelectorScopeMap = createSelectorReadOnlyScopeMap< + string[] +>({ key: 'selectedRowIdsSelectorScopeMap', get: ({ scopeId }) => diff --git a/packages/twenty-front/src/modules/object-record/record-table/states/selectors/tableColumnsByKeySelectorScopeMap.ts b/packages/twenty-front/src/modules/object-record/record-table/states/selectors/tableColumnsByKeySelectorScopeMap.ts index 1beb4c634..6fdd93aa2 100644 --- a/packages/twenty-front/src/modules/object-record/record-table/states/selectors/tableColumnsByKeySelectorScopeMap.ts +++ b/packages/twenty-front/src/modules/object-record/record-table/states/selectors/tableColumnsByKeySelectorScopeMap.ts @@ -1,18 +1,20 @@ -import { FieldMetadata } from '@/object-record/field/types/FieldMetadata'; -import { createSelectorScopeMap } from '@/ui/utilities/recoil-scope/utils/createSelectorScopeMap'; +import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata'; +import { ColumnDefinition } from '@/object-record/record-table/types/ColumnDefinition'; +import { createSelectorReadOnlyScopeMap } from '@/ui/utilities/recoil-scope/utils/createSelectorReadOnlyScopeMap'; -import { ColumnDefinition } from '../../types/ColumnDefinition'; import { tableColumnsStateScopeMap } from '../tableColumnsStateScopeMap'; -export const tableColumnsByKeySelectorScopeMap = createSelectorScopeMap({ - key: 'tableColumnsByKeySelectorScopeMap', - get: - ({ scopeId }) => - ({ get }) => - get(tableColumnsStateScopeMap({ scopeId })).reduce< - Record> - >( - (result, column) => ({ ...result, [column.fieldMetadataId]: column }), - {}, - ), -}); +export const tableColumnsByKeySelectorScopeMap = createSelectorReadOnlyScopeMap( + { + key: 'tableColumnsByKeySelectorScopeMap', + get: + ({ scopeId }) => + ({ get }) => + get(tableColumnsStateScopeMap({ scopeId })).reduce< + Record> + >( + (result, column) => ({ ...result, [column.fieldMetadataId]: column }), + {}, + ), + }, +); diff --git a/packages/twenty-front/src/modules/object-record/record-table/states/selectors/visibleTableColumnsSelectorScopeMap.ts b/packages/twenty-front/src/modules/object-record/record-table/states/selectors/visibleTableColumnsSelectorScopeMap.ts index d27227304..770c67676 100644 --- a/packages/twenty-front/src/modules/object-record/record-table/states/selectors/visibleTableColumnsSelectorScopeMap.ts +++ b/packages/twenty-front/src/modules/object-record/record-table/states/selectors/visibleTableColumnsSelectorScopeMap.ts @@ -1,24 +1,25 @@ -import { createSelectorScopeMap } from '@/ui/utilities/recoil-scope/utils/createSelectorScopeMap'; +import { createSelectorReadOnlyScopeMap } from '@/ui/utilities/recoil-scope/utils/createSelectorReadOnlyScopeMap'; import { availableTableColumnsStateScopeMap } from '../availableTableColumnsStateScopeMap'; import { tableColumnsStateScopeMap } from '../tableColumnsStateScopeMap'; -export const visibleTableColumnsSelectorScopeMap = createSelectorScopeMap({ - key: 'visibleTableColumnsSelectorScopeMap', - get: - ({ scopeId }) => - ({ get }) => { - const columns = get(tableColumnsStateScopeMap({ scopeId })); - const availableColumnKeys = get( - availableTableColumnsStateScopeMap({ scopeId }), - ).map(({ fieldMetadataId }) => fieldMetadataId); +export const visibleTableColumnsSelectorScopeMap = + createSelectorReadOnlyScopeMap({ + key: 'visibleTableColumnsSelectorScopeMap', + get: + ({ scopeId }) => + ({ get }) => { + const columns = get(tableColumnsStateScopeMap({ scopeId })); + const availableColumnKeys = get( + availableTableColumnsStateScopeMap({ scopeId }), + ).map(({ fieldMetadataId }) => fieldMetadataId); - return [...columns] - .filter( - (column) => - column.isVisible && - availableColumnKeys.includes(column.fieldMetadataId), - ) - .sort((a, b) => a.position - b.position); - }, -}); + return [...columns] + .filter( + (column) => + column.isVisible && + availableColumnKeys.includes(column.fieldMetadataId), + ) + .sort((a, b) => a.position - b.position); + }, + }); diff --git a/packages/twenty-front/src/modules/object-record/record-table/states/tableColumnsStateScopeMap.ts b/packages/twenty-front/src/modules/object-record/record-table/states/tableColumnsStateScopeMap.ts index ec052e6b3..d04192bb6 100644 --- a/packages/twenty-front/src/modules/object-record/record-table/states/tableColumnsStateScopeMap.ts +++ b/packages/twenty-front/src/modules/object-record/record-table/states/tableColumnsStateScopeMap.ts @@ -1,4 +1,4 @@ -import { FieldMetadata } from '@/object-record/field/types/FieldMetadata'; +import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata'; import { createStateScopeMap } from '@/ui/utilities/recoil-scope/utils/createStateScopeMap'; import { ColumnDefinition } from '../types/ColumnDefinition'; diff --git a/packages/twenty-front/src/modules/object-record/record-table/types/ColumnDefinition.ts b/packages/twenty-front/src/modules/object-record/record-table/types/ColumnDefinition.ts index 077a5c4c9..902ba38d8 100644 --- a/packages/twenty-front/src/modules/object-record/record-table/types/ColumnDefinition.ts +++ b/packages/twenty-front/src/modules/object-record/record-table/types/ColumnDefinition.ts @@ -1,5 +1,5 @@ -import { FieldDefinition } from '@/object-record/field/types/FieldDefinition'; -import { FieldMetadata } from '@/object-record/field/types/FieldMetadata'; +import { FieldDefinition } from '@/object-record/record-field/types/FieldDefinition'; +import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata'; export type ColumnDefinition = FieldDefinition & { size: number; diff --git a/packages/twenty-front/src/modules/object-record/relation-picker/components/RelationPicker.tsx b/packages/twenty-front/src/modules/object-record/relation-picker/components/RelationPicker.tsx index 552f9e4d0..3424cb7e6 100644 --- a/packages/twenty-front/src/modules/object-record/relation-picker/components/RelationPicker.tsx +++ b/packages/twenty-front/src/modules/object-record/relation-picker/components/RelationPicker.tsx @@ -1,7 +1,7 @@ import { useEffect } from 'react'; -import { FieldDefinition } from '@/object-record/field/types/FieldDefinition'; -import { FieldRelationMetadata } from '@/object-record/field/types/FieldMetadata'; +import { FieldDefinition } from '@/object-record/record-field/types/FieldDefinition'; +import { FieldRelationMetadata } from '@/object-record/record-field/types/FieldMetadata'; import { SingleEntitySelect } from '@/object-record/relation-picker/components/SingleEntitySelect'; import { useRelationPicker } from '@/object-record/relation-picker/hooks/useRelationPicker'; import { EntityForSelect } from '@/object-record/relation-picker/types/EntityForSelect'; diff --git a/packages/twenty-front/src/modules/object-record/utils/filterAvailableTableColumns.ts b/packages/twenty-front/src/modules/object-record/utils/filterAvailableTableColumns.ts index c5797d118..176ccbad2 100644 --- a/packages/twenty-front/src/modules/object-record/utils/filterAvailableTableColumns.ts +++ b/packages/twenty-front/src/modules/object-record/utils/filterAvailableTableColumns.ts @@ -1,5 +1,5 @@ -import { FieldMetadata } from '@/object-record/field/types/FieldMetadata'; -import { isFieldRelation } from '@/object-record/field/types/guards/isFieldRelation'; +import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata'; +import { isFieldRelation } from '@/object-record/record-field/types/guards/isFieldRelation'; import { ColumnDefinition } from '@/object-record/record-table/types/ColumnDefinition'; export const filterAvailableTableColumns = ( diff --git a/packages/twenty-front/src/modules/settings/data-model/components/SettingsObjectFieldCurrencyForm.tsx b/packages/twenty-front/src/modules/settings/data-model/components/SettingsObjectFieldCurrencyForm.tsx index 0c680d788..7c38adc47 100644 --- a/packages/twenty-front/src/modules/settings/data-model/components/SettingsObjectFieldCurrencyForm.tsx +++ b/packages/twenty-front/src/modules/settings/data-model/components/SettingsObjectFieldCurrencyForm.tsx @@ -1,4 +1,4 @@ -import { CurrencyCode } from '@/object-record/field/types/CurrencyCode'; +import { CurrencyCode } from '@/object-record/record-field/types/CurrencyCode'; import { Select } from '@/ui/input/components/Select'; import { CardContent } from '@/ui/layout/card/components/CardContent'; diff --git a/packages/twenty-front/src/modules/settings/data-model/components/SettingsObjectFieldPreview.tsx b/packages/twenty-front/src/modules/settings/data-model/components/SettingsObjectFieldPreview.tsx index 12ce75b4b..7c13d9841 100644 --- a/packages/twenty-front/src/modules/settings/data-model/components/SettingsObjectFieldPreview.tsx +++ b/packages/twenty-front/src/modules/settings/data-model/components/SettingsObjectFieldPreview.tsx @@ -2,10 +2,10 @@ import { useTheme } from '@emotion/react'; import styled from '@emotion/styled'; import { parseFieldType } from '@/object-metadata/utils/parseFieldType'; -import { FieldDisplay } from '@/object-record/field/components/FieldDisplay'; -import { FieldContext } from '@/object-record/field/contexts/FieldContext'; -import { BooleanFieldInput } from '@/object-record/field/meta-types/input/components/BooleanFieldInput'; -import { RatingFieldInput } from '@/object-record/field/meta-types/input/components/RatingFieldInput'; +import { FieldDisplay } from '@/object-record/record-field/components/FieldDisplay'; +import { FieldContext } from '@/object-record/record-field/contexts/FieldContext'; +import { BooleanFieldInput } from '@/object-record/record-field/meta-types/input/components/BooleanFieldInput'; +import { RatingFieldInput } from '@/object-record/record-field/meta-types/input/components/RatingFieldInput'; import { Tag } from '@/ui/display/tag/components/Tag'; import { Card } from '@/ui/layout/card/components/Card'; import { CardContent } from '@/ui/layout/card/components/CardContent'; diff --git a/packages/twenty-front/src/modules/settings/data-model/constants/settingsFieldCurrencyCodes.ts b/packages/twenty-front/src/modules/settings/data-model/constants/settingsFieldCurrencyCodes.ts index bb6edc2ba..82c74ed91 100644 --- a/packages/twenty-front/src/modules/settings/data-model/constants/settingsFieldCurrencyCodes.ts +++ b/packages/twenty-front/src/modules/settings/data-model/constants/settingsFieldCurrencyCodes.ts @@ -1,4 +1,4 @@ -import { CurrencyCode } from '@/object-record/field/types/CurrencyCode'; +import { CurrencyCode } from '@/object-record/record-field/types/CurrencyCode'; import { IconCurrencyDollar, IconCurrencyEuro, diff --git a/packages/twenty-front/src/modules/settings/data-model/constants/settingsFieldMetadataTypes.ts b/packages/twenty-front/src/modules/settings/data-model/constants/settingsFieldMetadataTypes.ts index 461173047..27f52e848 100644 --- a/packages/twenty-front/src/modules/settings/data-model/constants/settingsFieldMetadataTypes.ts +++ b/packages/twenty-front/src/modules/settings/data-model/constants/settingsFieldMetadataTypes.ts @@ -1,4 +1,4 @@ -import { CurrencyCode } from '@/object-record/field/types/CurrencyCode'; +import { CurrencyCode } from '@/object-record/record-field/types/CurrencyCode'; import { IconCalendarEvent, IconCheck, diff --git a/packages/twenty-front/src/modules/settings/data-model/hooks/useFieldMetadataForm.ts b/packages/twenty-front/src/modules/settings/data-model/hooks/useFieldMetadataForm.ts index fc63267ea..66d5cddd0 100644 --- a/packages/twenty-front/src/modules/settings/data-model/hooks/useFieldMetadataForm.ts +++ b/packages/twenty-front/src/modules/settings/data-model/hooks/useFieldMetadataForm.ts @@ -3,7 +3,7 @@ import { DeepPartial } from 'react-hook-form'; import { v4 } from 'uuid'; import { z } from 'zod'; -import { CurrencyCode } from '@/object-record/field/types/CurrencyCode'; +import { CurrencyCode } from '@/object-record/record-field/types/CurrencyCode'; import { themeColorSchema } from '@/ui/theme/utils/themeColorSchema'; import { FieldMetadataType, diff --git a/packages/twenty-front/src/modules/ui/field/display/components/LinkDisplay.tsx b/packages/twenty-front/src/modules/ui/field/display/components/LinkDisplay.tsx index 77973a604..fb8315319 100644 --- a/packages/twenty-front/src/modules/ui/field/display/components/LinkDisplay.tsx +++ b/packages/twenty-front/src/modules/ui/field/display/components/LinkDisplay.tsx @@ -1,7 +1,7 @@ import { MouseEvent } from 'react'; import styled from '@emotion/styled'; -import { FieldLinkValue } from '@/object-record/field/types/FieldMetadata'; +import { FieldLinkValue } from '@/object-record/record-field/types/FieldMetadata'; import { RoundedLink } from '@/ui/navigation/link/components/RoundedLink'; import { LinkType, diff --git a/packages/twenty-front/src/modules/ui/field/input/components/DateInput.tsx b/packages/twenty-front/src/modules/ui/field/input/components/DateInput.tsx index eafeea016..d680a07b9 100644 --- a/packages/twenty-front/src/modules/ui/field/input/components/DateInput.tsx +++ b/packages/twenty-front/src/modules/ui/field/input/components/DateInput.tsx @@ -3,12 +3,11 @@ import { useTheme } from '@emotion/react'; import styled from '@emotion/styled'; import { flip, offset, useFloating } from '@floating-ui/react'; +import { useRegisterInputEvents } from '@/object-record/record-field/meta-types/input/hooks/useRegisterInputEvents'; import { DateDisplay } from '@/ui/field/display/components/DateDisplay'; import { InternalDatePicker } from '@/ui/input/components/internal/date/components/InternalDatePicker'; import { Nullable } from '~/types/Nullable'; -import { useRegisterInputEvents } from '../../../../object-record/field/meta-types/input/hooks/useRegisterInputEvents'; - const StyledCalendarContainer = styled.div` background: ${({ theme }) => theme.background.secondary}; border: 1px solid ${({ theme }) => theme.border.color.light}; diff --git a/packages/twenty-front/src/modules/ui/field/input/components/DoubleTextInput.tsx b/packages/twenty-front/src/modules/ui/field/input/components/DoubleTextInput.tsx index ecd18422c..933340395 100644 --- a/packages/twenty-front/src/modules/ui/field/input/components/DoubleTextInput.tsx +++ b/packages/twenty-front/src/modules/ui/field/input/components/DoubleTextInput.tsx @@ -2,7 +2,7 @@ import { ChangeEvent, useEffect, useRef, useState } from 'react'; import styled from '@emotion/styled'; import { Key } from 'ts-key-enum'; -import { FieldDoubleText } from '@/object-record/field/types/FieldDoubleText'; +import { FieldDoubleText } from '@/object-record/record-field/types/FieldDoubleText'; import { useScopedHotkeys } from '@/ui/utilities/hotkey/hooks/useScopedHotkeys'; import { useListenClickOutside } from '@/ui/utilities/pointer-event/hooks/useListenClickOutside'; import { isDefined } from '~/utils/isDefined'; diff --git a/packages/twenty-front/src/modules/ui/field/input/components/PhoneInput.tsx b/packages/twenty-front/src/modules/ui/field/input/components/PhoneInput.tsx index 7b3687665..4b232637b 100644 --- a/packages/twenty-front/src/modules/ui/field/input/components/PhoneInput.tsx +++ b/packages/twenty-front/src/modules/ui/field/input/components/PhoneInput.tsx @@ -2,10 +2,9 @@ import { useEffect, useRef, useState } from 'react'; import ReactPhoneNumberInput from 'react-phone-number-input'; import styled from '@emotion/styled'; +import { useRegisterInputEvents } from '@/object-record/record-field/meta-types/input/hooks/useRegisterInputEvents'; import { CountryPickerDropdownButton } from '@/ui/input/components/internal/phone/components/CountryPickerDropdownButton'; -import { useRegisterInputEvents } from '../../../../object-record/field/meta-types/input/hooks/useRegisterInputEvents'; - import 'react-phone-number-input/style.css'; const StyledContainer = styled.div` diff --git a/packages/twenty-front/src/modules/ui/field/input/components/TextAreaInput.tsx b/packages/twenty-front/src/modules/ui/field/input/components/TextAreaInput.tsx index 4cf3821b6..dd14285bb 100644 --- a/packages/twenty-front/src/modules/ui/field/input/components/TextAreaInput.tsx +++ b/packages/twenty-front/src/modules/ui/field/input/components/TextAreaInput.tsx @@ -2,7 +2,7 @@ import { ChangeEvent, useRef, useState } from 'react'; import TextareaAutosize from 'react-textarea-autosize'; import styled from '@emotion/styled'; -import { useRegisterInputEvents } from '@/object-record/field/meta-types/input/hooks/useRegisterInputEvents'; +import { useRegisterInputEvents } from '@/object-record/record-field/meta-types/input/hooks/useRegisterInputEvents'; import { textInputStyle } from '@/ui/theme/constants/effects'; export type TextAreaInputProps = { diff --git a/packages/twenty-front/src/modules/ui/field/input/components/TextInput.tsx b/packages/twenty-front/src/modules/ui/field/input/components/TextInput.tsx index 2dfa193ed..845a92446 100644 --- a/packages/twenty-front/src/modules/ui/field/input/components/TextInput.tsx +++ b/packages/twenty-front/src/modules/ui/field/input/components/TextInput.tsx @@ -1,10 +1,9 @@ import { ChangeEvent, useEffect, useRef, useState } from 'react'; import styled from '@emotion/styled'; +import { useRegisterInputEvents } from '@/object-record/record-field/meta-types/input/hooks/useRegisterInputEvents'; import { textInputStyle } from '@/ui/theme/constants/effects'; -import { useRegisterInputEvents } from '../../../../object-record/field/meta-types/input/hooks/useRegisterInputEvents'; - export const StyledInput = styled.input` margin: 0; ${textInputStyle} diff --git a/packages/twenty-front/src/modules/ui/utilities/recoil-scope/utils/createSelectorReadOnlyScopeMap.ts b/packages/twenty-front/src/modules/ui/utilities/recoil-scope/utils/createSelectorReadOnlyScopeMap.ts new file mode 100644 index 000000000..8b537fdf9 --- /dev/null +++ b/packages/twenty-front/src/modules/ui/utilities/recoil-scope/utils/createSelectorReadOnlyScopeMap.ts @@ -0,0 +1,30 @@ +import { + GetCallback, + GetRecoilValue, + Loadable, + RecoilValue, + selectorFamily, + WrappedValue, +} from 'recoil'; + +import { StateScopeMapKey } from '@/ui/utilities/recoil-scope/scopes-internal/types/StateScopeMapKey'; + +type SelectorGetter = ( + param: P, +) => (opts: { + get: GetRecoilValue; + getCallback: GetCallback; +}) => Promise | RecoilValue | Loadable | WrappedValue | T; + +export const createSelectorReadOnlyScopeMap = ({ + key, + get, +}: { + key: string; + get: SelectorGetter; +}) => { + return selectorFamily({ + key, + get, + }); +}; diff --git a/packages/twenty-front/src/modules/ui/utilities/recoil-scope/utils/createSelectorScopeMap.ts b/packages/twenty-front/src/modules/ui/utilities/recoil-scope/utils/createSelectorScopeMap.ts index 5f8db8343..81e34b8af 100644 --- a/packages/twenty-front/src/modules/ui/utilities/recoil-scope/utils/createSelectorScopeMap.ts +++ b/packages/twenty-front/src/modules/ui/utilities/recoil-scope/utils/createSelectorScopeMap.ts @@ -1,9 +1,12 @@ import { + DefaultValue, GetCallback, GetRecoilValue, Loadable, RecoilValue, + ResetRecoilState, selectorFamily, + SetRecoilState, WrappedValue, } from 'recoil'; @@ -16,15 +19,25 @@ type SelectorGetter = ( getCallback: GetCallback; }) => Promise | RecoilValue | Loadable | WrappedValue | T; +type SelectorSetter = ( + param: P, +) => ( + opts: { set: SetRecoilState; get: GetRecoilValue; reset: ResetRecoilState }, + newValue: T | DefaultValue, +) => void; + export const createSelectorScopeMap = ({ key, get, + set, }: { key: string; get: SelectorGetter; + set: SelectorSetter; }) => { return selectorFamily({ key, get, + set, }); }; diff --git a/packages/twenty-front/src/modules/ui/utilities/recoil-scope/utils/getSelector.ts b/packages/twenty-front/src/modules/ui/utilities/recoil-scope/utils/getSelector.ts index 38cd43e12..e81a0c600 100644 --- a/packages/twenty-front/src/modules/ui/utilities/recoil-scope/utils/getSelector.ts +++ b/packages/twenty-front/src/modules/ui/utilities/recoil-scope/utils/getSelector.ts @@ -1,11 +1,9 @@ -import { RecoilValueReadOnly } from 'recoil'; +import { RecoilState } from 'recoil'; import { StateScopeMapKey } from '@/ui/utilities/recoil-scope/scopes-internal/types/StateScopeMapKey'; export const getSelector = ( - stateScopeMap: ( - stateScopeMapKey: StateScopeMapKey, - ) => RecoilValueReadOnly, + stateScopeMap: (stateScopeMapKey: StateScopeMapKey) => RecoilState, scopeId: string, ) => { return () => stateScopeMap({ scopeId }); diff --git a/packages/twenty-front/src/modules/ui/utilities/recoil-scope/utils/getSelectorReadOnly.ts b/packages/twenty-front/src/modules/ui/utilities/recoil-scope/utils/getSelectorReadOnly.ts new file mode 100644 index 000000000..ff40618a3 --- /dev/null +++ b/packages/twenty-front/src/modules/ui/utilities/recoil-scope/utils/getSelectorReadOnly.ts @@ -0,0 +1,12 @@ +import { RecoilValueReadOnly } from 'recoil'; + +import { StateScopeMapKey } from '@/ui/utilities/recoil-scope/scopes-internal/types/StateScopeMapKey'; + +export const getSelectorReadOnly = ( + stateScopeMap: ( + stateScopeMapKey: StateScopeMapKey, + ) => RecoilValueReadOnly, + scopeId: string, +) => { + return () => stateScopeMap({ scopeId }); +}; diff --git a/packages/twenty-front/src/modules/views/components/ViewFieldsVisibilityDropdownSection.tsx b/packages/twenty-front/src/modules/views/components/ViewFieldsVisibilityDropdownSection.tsx index c63713ab3..9e8c6d0ee 100644 --- a/packages/twenty-front/src/modules/views/components/ViewFieldsVisibilityDropdownSection.tsx +++ b/packages/twenty-front/src/modules/views/components/ViewFieldsVisibilityDropdownSection.tsx @@ -6,7 +6,7 @@ import { ResponderProvided, } from '@hello-pangea/dnd'; -import { FieldMetadata } from '@/object-record/field/types/FieldMetadata'; +import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata'; import { ColumnDefinition } from '@/object-record/record-table/types/ColumnDefinition'; import { IconMinus, IconPlus } from '@/ui/display/icon'; import { IconInfoCircle } from '@/ui/display/icon'; diff --git a/packages/twenty-front/src/modules/views/hooks/__tests__/useViewBar_ViewFields.test.tsx b/packages/twenty-front/src/modules/views/hooks/__tests__/useViewBar_ViewFields.test.tsx index 5820ea5ad..357ebd9db 100644 --- a/packages/twenty-front/src/modules/views/hooks/__tests__/useViewBar_ViewFields.test.tsx +++ b/packages/twenty-front/src/modules/views/hooks/__tests__/useViewBar_ViewFields.test.tsx @@ -5,7 +5,7 @@ import { MockedProvider } from '@apollo/client/testing'; import { renderHook, waitFor } from '@testing-library/react'; import { RecoilRoot, useRecoilState, useRecoilValue } from 'recoil'; -import { FieldMetadata } from '@/object-record/field/types/FieldMetadata'; +import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata'; import { ColumnDefinition } from '@/object-record/record-table/types/ColumnDefinition'; import { getScopedFamilyStateDeprecated } from '@/ui/utilities/recoil-scope/utils/getScopedFamilyStateDeprecated'; import { useViewScopedStates } from '@/views/hooks/internal/useViewScopedStates'; diff --git a/packages/twenty-front/src/modules/views/states/availableFieldDefinitionsScopedState.ts b/packages/twenty-front/src/modules/views/states/availableFieldDefinitionsScopedState.ts index c91b8bb82..cf7744d4f 100644 --- a/packages/twenty-front/src/modules/views/states/availableFieldDefinitionsScopedState.ts +++ b/packages/twenty-front/src/modules/views/states/availableFieldDefinitionsScopedState.ts @@ -1,4 +1,4 @@ -import { FieldMetadata } from '@/object-record/field/types/FieldMetadata'; +import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata'; import { ColumnDefinition } from '@/object-record/record-table/types/ColumnDefinition'; import { createStateScopeMap } from '@/ui/utilities/recoil-scope/utils/createStateScopeMap'; diff --git a/packages/twenty-front/src/modules/views/states/selectors/currentViewScopedSelector.ts b/packages/twenty-front/src/modules/views/states/selectors/currentViewScopedSelector.ts index a40f83125..3719da07f 100644 --- a/packages/twenty-front/src/modules/views/states/selectors/currentViewScopedSelector.ts +++ b/packages/twenty-front/src/modules/views/states/selectors/currentViewScopedSelector.ts @@ -1,11 +1,11 @@ -import { createSelectorScopeMap } from '@/ui/utilities/recoil-scope/utils/createSelectorScopeMap'; +import { createSelectorReadOnlyScopeMap } from '@/ui/utilities/recoil-scope/utils/createSelectorReadOnlyScopeMap'; import { GraphQLView } from '@/views/types/GraphQLView'; import { currentViewIdScopedState } from '../currentViewIdScopedState'; import { viewsByIdScopedSelector } from './viewsByIdScopedSelector'; -export const currentViewScopedSelector = createSelectorScopeMap< +export const currentViewScopedSelector = createSelectorReadOnlyScopeMap< GraphQLView | undefined >({ key: 'currentViewScopedSelector', diff --git a/packages/twenty-front/src/modules/views/types/ViewField.ts b/packages/twenty-front/src/modules/views/types/ViewField.ts index e5e14a7b1..0703b00bf 100644 --- a/packages/twenty-front/src/modules/views/types/ViewField.ts +++ b/packages/twenty-front/src/modules/views/types/ViewField.ts @@ -1,5 +1,5 @@ -import { FieldMetadata } from '@/object-record/field/types/FieldMetadata'; import { BoardFieldDefinition } from '@/object-record/record-board-deprecated/types/BoardFieldDefinition'; +import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata'; import { ColumnDefinition } from '@/object-record/record-table/types/ColumnDefinition'; export type ViewField = { diff --git a/packages/twenty-front/src/modules/views/utils/__tests__/viewMapFunctions.test.ts b/packages/twenty-front/src/modules/views/utils/__tests__/viewMapFunctions.test.ts index 9e4afc169..b003b324e 100644 --- a/packages/twenty-front/src/modules/views/utils/__tests__/viewMapFunctions.test.ts +++ b/packages/twenty-front/src/modules/views/utils/__tests__/viewMapFunctions.test.ts @@ -1,7 +1,7 @@ -import { FieldMetadata } from '@/object-record/field/types/FieldMetadata'; import { Filter } from '@/object-record/object-filter-dropdown/types/Filter'; import { Sort } from '@/object-record/object-sort-dropdown/types/Sort'; import { BoardFieldDefinition } from '@/object-record/record-board-deprecated/types/BoardFieldDefinition'; +import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata'; import { ColumnDefinition } from '@/object-record/record-table/types/ColumnDefinition'; import { ViewField } from '@/views/types/ViewField'; import { ViewFilter } from '@/views/types/ViewFilter'; diff --git a/packages/twenty-front/src/modules/views/utils/mapColumnDefinitionToViewField.ts b/packages/twenty-front/src/modules/views/utils/mapColumnDefinitionToViewField.ts index 515a374f1..833c1a65b 100644 --- a/packages/twenty-front/src/modules/views/utils/mapColumnDefinitionToViewField.ts +++ b/packages/twenty-front/src/modules/views/utils/mapColumnDefinitionToViewField.ts @@ -1,4 +1,4 @@ -import { FieldMetadata } from '@/object-record/field/types/FieldMetadata'; +import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata'; import { ColumnDefinition } from '@/object-record/record-table/types/ColumnDefinition'; import { ViewField } from '../types/ViewField'; diff --git a/packages/twenty-front/src/modules/views/utils/mapViewFieldsToBoardFieldDefinitions.ts b/packages/twenty-front/src/modules/views/utils/mapViewFieldsToBoardFieldDefinitions.ts index 12983b6a8..5802aae1b 100644 --- a/packages/twenty-front/src/modules/views/utils/mapViewFieldsToBoardFieldDefinitions.ts +++ b/packages/twenty-front/src/modules/views/utils/mapViewFieldsToBoardFieldDefinitions.ts @@ -1,5 +1,5 @@ -import { FieldMetadata } from '@/object-record/field/types/FieldMetadata'; import { BoardFieldDefinition } from '@/object-record/record-board-deprecated/types/BoardFieldDefinition'; +import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata'; import { assertNotNull } from '~/utils/assert'; import { ViewField } from '../types/ViewField'; diff --git a/packages/twenty-front/src/modules/views/utils/mapViewFieldsToColumnDefinitions.ts b/packages/twenty-front/src/modules/views/utils/mapViewFieldsToColumnDefinitions.ts index 86d4585ba..638574dc9 100644 --- a/packages/twenty-front/src/modules/views/utils/mapViewFieldsToColumnDefinitions.ts +++ b/packages/twenty-front/src/modules/views/utils/mapViewFieldsToColumnDefinitions.ts @@ -1,4 +1,4 @@ -import { FieldMetadata } from '@/object-record/field/types/FieldMetadata'; +import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata'; import { ColumnDefinition } from '@/object-record/record-table/types/ColumnDefinition'; import { assertNotNull } from '~/utils/assert'; diff --git a/packages/twenty-front/tsconfig.node.tsbuildinfo b/packages/twenty-front/tsconfig.node.tsbuildinfo new file mode 100644 index 000000000..10cef65ce --- /dev/null +++ b/packages/twenty-front/tsconfig.node.tsbuildinfo @@ -0,0 +1 @@ +{"program":{"fileNames":["../../node_modules/typescript/lib/lib.d.ts","../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/typescript/lib/lib.dom.iterable.d.ts","../../node_modules/typescript/lib/lib.webworker.importscripts.d.ts","../../node_modules/typescript/lib/lib.scripthost.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.esnext.intl.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../node_modules/@swc/types/index.ts","../../node_modules/@vitejs/plugin-react-swc/node_modules/@swc/core/spack.d.ts","../../node_modules/@vitejs/plugin-react-swc/node_modules/@swc/core/index.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/buffer/index.d.ts","../../node_modules/undici-types/header.d.ts","../../node_modules/undici-types/readable.d.ts","../../node_modules/undici-types/file.d.ts","../../node_modules/undici-types/fetch.d.ts","../../node_modules/undici-types/formdata.d.ts","../../node_modules/undici-types/connector.d.ts","../../node_modules/undici-types/client.d.ts","../../node_modules/undici-types/errors.d.ts","../../node_modules/undici-types/dispatcher.d.ts","../../node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/undici-types/global-origin.d.ts","../../node_modules/undici-types/pool-stats.d.ts","../../node_modules/undici-types/pool.d.ts","../../node_modules/undici-types/handlers.d.ts","../../node_modules/undici-types/balanced-pool.d.ts","../../node_modules/undici-types/agent.d.ts","../../node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/undici-types/mock-agent.d.ts","../../node_modules/undici-types/mock-client.d.ts","../../node_modules/undici-types/mock-pool.d.ts","../../node_modules/undici-types/mock-errors.d.ts","../../node_modules/undici-types/proxy-agent.d.ts","../../node_modules/undici-types/api.d.ts","../../node_modules/undici-types/cookies.d.ts","../../node_modules/undici-types/patch.d.ts","../../node_modules/undici-types/filereader.d.ts","../../node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/undici-types/websocket.d.ts","../../node_modules/undici-types/content-type.d.ts","../../node_modules/undici-types/cache.d.ts","../../node_modules/undici-types/interceptors.d.ts","../../node_modules/undici-types/index.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/dom-events.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/globals.global.d.ts","../../node_modules/@types/node/index.d.ts","../../node_modules/vite/node_modules/rollup/dist/rollup.d.ts","../../node_modules/vite/node_modules/rollup/dist/parseast.d.ts","../../node_modules/vite/types/hmrpayload.d.ts","../../node_modules/vite/types/customevent.d.ts","../../node_modules/vite/node_modules/esbuild/lib/main.d.ts","../../node_modules/source-map-js/source-map.d.ts","../../node_modules/postcss/lib/previous-map.d.ts","../../node_modules/postcss/lib/input.d.ts","../../node_modules/postcss/lib/css-syntax-error.d.ts","../../node_modules/postcss/lib/declaration.d.ts","../../node_modules/postcss/lib/root.d.ts","../../node_modules/postcss/lib/warning.d.ts","../../node_modules/postcss/lib/lazy-result.d.ts","../../node_modules/postcss/lib/no-work-result.d.ts","../../node_modules/postcss/lib/processor.d.ts","../../node_modules/postcss/lib/result.d.ts","../../node_modules/postcss/lib/document.d.ts","../../node_modules/postcss/lib/rule.d.ts","../../node_modules/postcss/lib/node.d.ts","../../node_modules/postcss/lib/comment.d.ts","../../node_modules/postcss/lib/container.d.ts","../../node_modules/postcss/lib/at-rule.d.ts","../../node_modules/postcss/lib/list.d.ts","../../node_modules/postcss/lib/postcss.d.ts","../../node_modules/postcss/lib/postcss.d.mts","../../node_modules/vite/types/importglob.d.ts","../../node_modules/vite/types/metadata.d.ts","../../node_modules/vite/dist/node/index.d.ts","../../node_modules/@vitejs/plugin-react-swc/index.d.ts","../../node_modules/@types/eslint/helpers.d.ts","../../node_modules/@types/estree/index.d.ts","../../node_modules/@types/json-schema/index.d.ts","../../node_modules/@types/eslint/index.d.ts","../../node_modules/vscode-uri/lib/umd/uri.d.ts","../../node_modules/vscode-uri/lib/umd/utils.d.ts","../../node_modules/vscode-uri/lib/umd/index.d.ts","../../node_modules/vscode-languageserver/typings/thenable.d.ts","../../node_modules/vscode-languageserver-protocol/node_modules/vscode-languageserver-types/lib/umd/main.d.ts","../../node_modules/vscode-jsonrpc/typings/thenable.d.ts","../../node_modules/vscode-jsonrpc/lib/common/messages.d.ts","../../node_modules/vscode-jsonrpc/lib/common/disposable.d.ts","../../node_modules/vscode-jsonrpc/lib/common/events.d.ts","../../node_modules/vscode-jsonrpc/lib/common/cancellation.d.ts","../../node_modules/vscode-jsonrpc/lib/common/encoding.d.ts","../../node_modules/vscode-jsonrpc/lib/common/ral.d.ts","../../node_modules/vscode-jsonrpc/lib/common/messagereader.d.ts","../../node_modules/vscode-jsonrpc/lib/common/messagewriter.d.ts","../../node_modules/vscode-jsonrpc/lib/common/connection.d.ts","../../node_modules/vscode-jsonrpc/lib/common/api.d.ts","../../node_modules/vscode-languageserver-protocol/lib/common/messages.d.ts","../../node_modules/vscode-languageserver-protocol/lib/common/protocol.implementation.d.ts","../../node_modules/vscode-languageserver-protocol/lib/common/protocol.typedefinition.d.ts","../../node_modules/vscode-languageserver-protocol/lib/common/protocol.workspacefolders.d.ts","../../node_modules/vscode-languageserver-protocol/lib/common/protocol.configuration.d.ts","../../node_modules/vscode-languageserver-protocol/lib/common/protocol.colorprovider.d.ts","../../node_modules/vscode-languageserver-protocol/lib/common/protocol.foldingrange.d.ts","../../node_modules/vscode-languageserver-protocol/lib/common/protocol.declaration.d.ts","../../node_modules/vscode-languageserver-protocol/lib/common/protocol.selectionrange.d.ts","../../node_modules/vscode-languageserver-protocol/lib/common/protocol.progress.d.ts","../../node_modules/vscode-languageserver-protocol/lib/common/protocol.callhierarchy.d.ts","../../node_modules/vscode-languageserver-protocol/lib/common/protocol.semantictokens.d.ts","../../node_modules/vscode-languageserver-protocol/lib/common/protocol.showdocument.d.ts","../../node_modules/vscode-languageserver-protocol/lib/common/protocol.linkededitingrange.d.ts","../../node_modules/vscode-languageserver-protocol/lib/common/protocol.fileoperations.d.ts","../../node_modules/vscode-languageserver-protocol/lib/common/protocol.moniker.d.ts","../../node_modules/vscode-languageserver-protocol/lib/common/protocol.d.ts","../../node_modules/vscode-languageserver-protocol/lib/common/connection.d.ts","../../node_modules/vscode-languageserver-protocol/lib/common/api.d.ts","../../node_modules/vscode-languageserver/lib/common/progress.d.ts","../../node_modules/vscode-languageserver/lib/common/configuration.d.ts","../../node_modules/vscode-languageserver/lib/common/workspacefolders.d.ts","../../node_modules/vscode-languageserver/lib/common/callhierarchy.d.ts","../../node_modules/vscode-languageserver/lib/common/semantictokens.d.ts","../../node_modules/vscode-languageserver/lib/common/showdocument.d.ts","../../node_modules/vscode-languageserver/lib/common/fileoperations.d.ts","../../node_modules/vscode-languageserver/lib/common/linkededitingrange.d.ts","../../node_modules/vscode-languageserver/lib/common/moniker.d.ts","../../node_modules/vscode-languageserver/lib/common/server.d.ts","../../node_modules/vscode-languageserver/lib/node/files.d.ts","../../node_modules/vscode-jsonrpc/lib/node/main.d.ts","../../node_modules/vscode-jsonrpc/node.d.ts","../../node_modules/vscode-languageserver-protocol/lib/node/main.d.ts","../../node_modules/vscode-languageserver-protocol/node.d.ts","../../node_modules/vscode-languageserver/lib/common/api.d.ts","../../node_modules/vscode-languageserver/lib/node/main.d.ts","../../node_modules/vscode-languageserver/node.d.ts","../../node_modules/vite-plugin-checker/dist/esm/checkers/vls/initparams.d.ts","../../node_modules/vite-plugin-checker/dist/esm/types.d.ts","../../node_modules/vite-plugin-checker/dist/esm/main.d.ts","../../node_modules/@rollup/pluginutils/types/index.d.ts","../../node_modules/prettier/doc.d.ts","../../node_modules/prettier/index.d.ts","../../node_modules/@babel/types/lib/index.d.ts","../../node_modules/@types/babel__generator/index.d.ts","../../node_modules/@babel/parser/typings/babel-parser.d.ts","../../node_modules/@types/babel__template/index.d.ts","../../node_modules/@types/babel__traverse/index.d.ts","../../node_modules/@types/babel__core/index.d.ts","../../node_modules/vite-plugin-svgr/node_modules/@svgr/babel-plugin-transform-svg-component/dist/index.d.ts","../../node_modules/vite-plugin-svgr/node_modules/@svgr/babel-preset/dist/index.d.ts","../../node_modules/vite-plugin-svgr/node_modules/@svgr/core/dist/index.d.ts","../../node_modules/vite-plugin-svgr/dist/index.d.ts","../../node_modules/vite-tsconfig-paths/dist/index.d.ts","../../node_modules/vite-tsconfig-paths/dist/index.d.mts","./vite.config.ts","../../node_modules/@types/accepts/index.d.ts","../../node_modules/@types/acorn/index.d.ts","../../node_modules/graphql/version.d.ts","../../node_modules/graphql/jsutils/maybe.d.ts","../../node_modules/graphql/language/source.d.ts","../../node_modules/graphql/jsutils/objmap.d.ts","../../node_modules/graphql/jsutils/path.d.ts","../../node_modules/graphql/jsutils/promiseorvalue.d.ts","../../node_modules/graphql/language/kinds.d.ts","../../node_modules/graphql/language/tokenkind.d.ts","../../node_modules/graphql/language/ast.d.ts","../../node_modules/graphql/language/location.d.ts","../../node_modules/graphql/error/graphqlerror.d.ts","../../node_modules/graphql/language/directivelocation.d.ts","../../node_modules/graphql/type/directives.d.ts","../../node_modules/graphql/type/schema.d.ts","../../node_modules/graphql/type/definition.d.ts","../../node_modules/graphql/execution/execute.d.ts","../../node_modules/graphql/graphql.d.ts","../../node_modules/graphql/type/scalars.d.ts","../../node_modules/graphql/type/introspection.d.ts","../../node_modules/graphql/type/validate.d.ts","../../node_modules/graphql/type/assertname.d.ts","../../node_modules/graphql/type/index.d.ts","../../node_modules/graphql/language/printlocation.d.ts","../../node_modules/graphql/language/lexer.d.ts","../../node_modules/graphql/language/parser.d.ts","../../node_modules/graphql/language/printer.d.ts","../../node_modules/graphql/language/visitor.d.ts","../../node_modules/graphql/language/predicates.d.ts","../../node_modules/graphql/language/index.d.ts","../../node_modules/graphql/execution/subscribe.d.ts","../../node_modules/graphql/execution/values.d.ts","../../node_modules/graphql/execution/index.d.ts","../../node_modules/graphql/subscription/index.d.ts","../../node_modules/graphql/utilities/typeinfo.d.ts","../../node_modules/graphql/validation/validationcontext.d.ts","../../node_modules/graphql/validation/validate.d.ts","../../node_modules/graphql/validation/specifiedrules.d.ts","../../node_modules/graphql/validation/rules/executabledefinitionsrule.d.ts","../../node_modules/graphql/validation/rules/fieldsoncorrecttyperule.d.ts","../../node_modules/graphql/validation/rules/fragmentsoncompositetypesrule.d.ts","../../node_modules/graphql/validation/rules/knownargumentnamesrule.d.ts","../../node_modules/graphql/validation/rules/knowndirectivesrule.d.ts","../../node_modules/graphql/validation/rules/knownfragmentnamesrule.d.ts","../../node_modules/graphql/validation/rules/knowntypenamesrule.d.ts","../../node_modules/graphql/validation/rules/loneanonymousoperationrule.d.ts","../../node_modules/graphql/validation/rules/nofragmentcyclesrule.d.ts","../../node_modules/graphql/validation/rules/noundefinedvariablesrule.d.ts","../../node_modules/graphql/validation/rules/nounusedfragmentsrule.d.ts","../../node_modules/graphql/validation/rules/nounusedvariablesrule.d.ts","../../node_modules/graphql/validation/rules/overlappingfieldscanbemergedrule.d.ts","../../node_modules/graphql/validation/rules/possiblefragmentspreadsrule.d.ts","../../node_modules/graphql/validation/rules/providedrequiredargumentsrule.d.ts","../../node_modules/graphql/validation/rules/scalarleafsrule.d.ts","../../node_modules/graphql/validation/rules/singlefieldsubscriptionsrule.d.ts","../../node_modules/graphql/validation/rules/uniqueargumentnamesrule.d.ts","../../node_modules/graphql/validation/rules/uniquedirectivesperlocationrule.d.ts","../../node_modules/graphql/validation/rules/uniquefragmentnamesrule.d.ts","../../node_modules/graphql/validation/rules/uniqueinputfieldnamesrule.d.ts","../../node_modules/graphql/validation/rules/uniqueoperationnamesrule.d.ts","../../node_modules/graphql/validation/rules/uniquevariablenamesrule.d.ts","../../node_modules/graphql/validation/rules/valuesofcorrecttyperule.d.ts","../../node_modules/graphql/validation/rules/variablesareinputtypesrule.d.ts","../../node_modules/graphql/validation/rules/variablesinallowedpositionrule.d.ts","../../node_modules/graphql/validation/rules/loneschemadefinitionrule.d.ts","../../node_modules/graphql/validation/rules/uniqueoperationtypesrule.d.ts","../../node_modules/graphql/validation/rules/uniquetypenamesrule.d.ts","../../node_modules/graphql/validation/rules/uniqueenumvaluenamesrule.d.ts","../../node_modules/graphql/validation/rules/uniquefielddefinitionnamesrule.d.ts","../../node_modules/graphql/validation/rules/uniqueargumentdefinitionnamesrule.d.ts","../../node_modules/graphql/validation/rules/uniquedirectivenamesrule.d.ts","../../node_modules/graphql/validation/rules/possibletypeextensionsrule.d.ts","../../node_modules/graphql/validation/rules/custom/nodeprecatedcustomrule.d.ts","../../node_modules/graphql/validation/rules/custom/noschemaintrospectioncustomrule.d.ts","../../node_modules/graphql/validation/index.d.ts","../../node_modules/graphql/error/syntaxerror.d.ts","../../node_modules/graphql/error/locatederror.d.ts","../../node_modules/graphql/error/index.d.ts","../../node_modules/graphql/utilities/getintrospectionquery.d.ts","../../node_modules/graphql/utilities/getoperationast.d.ts","../../node_modules/graphql/utilities/getoperationroottype.d.ts","../../node_modules/graphql/utilities/introspectionfromschema.d.ts","../../node_modules/graphql/utilities/buildclientschema.d.ts","../../node_modules/graphql/utilities/buildastschema.d.ts","../../node_modules/graphql/utilities/extendschema.d.ts","../../node_modules/graphql/utilities/lexicographicsortschema.d.ts","../../node_modules/graphql/utilities/printschema.d.ts","../../node_modules/graphql/utilities/typefromast.d.ts","../../node_modules/graphql/utilities/valuefromast.d.ts","../../node_modules/graphql/utilities/valuefromastuntyped.d.ts","../../node_modules/graphql/utilities/astfromvalue.d.ts","../../node_modules/graphql/utilities/coerceinputvalue.d.ts","../../node_modules/graphql/utilities/concatast.d.ts","../../node_modules/graphql/utilities/separateoperations.d.ts","../../node_modules/graphql/utilities/stripignoredcharacters.d.ts","../../node_modules/graphql/utilities/typecomparators.d.ts","../../node_modules/graphql/utilities/assertvalidname.d.ts","../../node_modules/graphql/utilities/findbreakingchanges.d.ts","../../node_modules/graphql/utilities/typedquerydocumentnode.d.ts","../../node_modules/graphql/utilities/index.d.ts","../../node_modules/graphql/index.d.ts","../../node_modules/ts-invariant/lib/invariant.d.ts","../../node_modules/@apollo/client/invarianterrorcodes.d.ts","../../node_modules/@apollo/client/utilities/globals/invariantwrappers.d.ts","../../node_modules/@apollo/client/utilities/globals/maybe.d.ts","../../node_modules/@apollo/client/utilities/globals/global.d.ts","../../node_modules/@apollo/client/utilities/globals/index.d.ts","../../node_modules/@apollo/client/utilities/graphql/directives.d.ts","../../node_modules/@apollo/client/utilities/graphql/documenttransform.d.ts","../../node_modules/@apollo/client/utilities/graphql/fragments.d.ts","../../node_modules/@apollo/client/utilities/graphql/getfromast.d.ts","../../node_modules/@apollo/client/utilities/graphql/print.d.ts","../../node_modules/@apollo/client/utilities/graphql/storeutils.d.ts","../../node_modules/@apollo/client/utilities/graphql/transform.d.ts","../../node_modules/@apollo/client/utilities/graphql/operations.d.ts","../../node_modules/@graphql-typed-document-node/core/typings/index.d.ts","../../node_modules/@wry/trie/lib/index.d.ts","../../node_modules/@apollo/client/cache/core/types/cache.d.ts","../../node_modules/@apollo/client/cache/inmemory/entitystore.d.ts","../../node_modules/@apollo/client/cache/inmemory/fragmentregistry.d.ts","../../node_modules/@apollo/client/cache/inmemory/types.d.ts","../../node_modules/@apollo/client/cache/inmemory/fixpolyfills.d.ts","../../node_modules/@apollo/client/cache/inmemory/reactivevars.d.ts","../../node_modules/@apollo/client/cache/inmemory/inmemorycache.d.ts","../../node_modules/@apollo/client/cache/inmemory/object-canon.d.ts","../../node_modules/@apollo/client/cache/inmemory/readfromstore.d.ts","../../node_modules/@apollo/client/cache/inmemory/writetostore.d.ts","../../node_modules/@apollo/client/cache/inmemory/policies.d.ts","../../node_modules/@apollo/client/cache/core/types/common.d.ts","../../node_modules/@apollo/client/cache/core/types/dataproxy.d.ts","../../node_modules/@apollo/client/cache/core/cache.d.ts","../../node_modules/@apollo/client/cache/inmemory/helpers.d.ts","../../node_modules/@apollo/client/cache/index.d.ts","../../node_modules/@apollo/client/utilities/policies/pagination.d.ts","../../node_modules/zen-observable-ts/module.d.ts","../../node_modules/symbol-observable/index.d.ts","../../node_modules/@apollo/client/utilities/observables/observable.d.ts","../../node_modules/@apollo/client/utilities/promises/decoration.d.ts","../../node_modules/@apollo/client/utilities/common/objects.d.ts","../../node_modules/@apollo/client/utilities/common/mergedeep.d.ts","../../node_modules/@apollo/client/utilities/common/clonedeep.d.ts","../../node_modules/@apollo/client/utilities/common/maybedeepfreeze.d.ts","../../node_modules/@apollo/client/utilities/observables/iteration.d.ts","../../node_modules/@apollo/client/utilities/observables/asyncmap.d.ts","../../node_modules/@apollo/client/utilities/observables/concast.d.ts","../../node_modules/@apollo/client/utilities/observables/subclassing.d.ts","../../node_modules/@apollo/client/utilities/common/arrays.d.ts","../../node_modules/@apollo/client/utilities/common/errorhandling.d.ts","../../node_modules/@apollo/client/utilities/common/canuse.d.ts","../../node_modules/@apollo/client/utilities/common/compact.d.ts","../../node_modules/@apollo/client/utilities/common/makeuniqueid.d.ts","../../node_modules/@apollo/client/utilities/common/stringifyfordisplay.d.ts","../../node_modules/@apollo/client/utilities/common/mergeoptions.d.ts","../../node_modules/@apollo/client/utilities/common/incrementalresult.d.ts","../../node_modules/@apollo/client/utilities/types/primitive.d.ts","../../node_modules/@apollo/client/utilities/types/deepomit.d.ts","../../node_modules/@apollo/client/utilities/common/omitdeep.d.ts","../../node_modules/@apollo/client/utilities/common/striptypename.d.ts","../../node_modules/@apollo/client/utilities/types/isstrictlyany.d.ts","../../node_modules/@apollo/client/utilities/types/deeppartial.d.ts","../../node_modules/@apollo/client/utilities/index.d.ts","../../node_modules/@apollo/client/link/core/types.d.ts","../../node_modules/@apollo/client/link/core/apollolink.d.ts","../../node_modules/@apollo/client/link/core/empty.d.ts","../../node_modules/@apollo/client/link/core/from.d.ts","../../node_modules/@apollo/client/link/core/split.d.ts","../../node_modules/@apollo/client/link/core/concat.d.ts","../../node_modules/@apollo/client/link/core/execute.d.ts","../../node_modules/@apollo/client/link/core/index.d.ts","../../node_modules/@apollo/client/link/http/parseandcheckhttpresponse.d.ts","../../node_modules/@apollo/client/link/http/serializefetchparameter.d.ts","../../node_modules/@apollo/client/link/http/selecthttpoptionsandbody.d.ts","../../node_modules/@apollo/client/link/http/checkfetcher.d.ts","../../node_modules/@apollo/client/link/http/createsignalifsupported.d.ts","../../node_modules/@apollo/client/link/http/selecturi.d.ts","../../node_modules/@apollo/client/link/http/createhttplink.d.ts","../../node_modules/@apollo/client/link/http/httplink.d.ts","../../node_modules/@apollo/client/link/http/rewriteuriforget.d.ts","../../node_modules/@apollo/client/link/http/index.d.ts","../../node_modules/@apollo/client/core/networkstatus.d.ts","../../node_modules/@apollo/client/link/utils/fromerror.d.ts","../../node_modules/@apollo/client/link/utils/topromise.d.ts","../../node_modules/@apollo/client/link/utils/frompromise.d.ts","../../node_modules/@apollo/client/link/utils/throwservererror.d.ts","../../node_modules/@apollo/client/link/utils/validateoperation.d.ts","../../node_modules/@apollo/client/link/utils/createoperation.d.ts","../../node_modules/@apollo/client/link/utils/transformoperation.d.ts","../../node_modules/@apollo/client/link/utils/filteroperationvariables.d.ts","../../node_modules/@apollo/client/link/utils/index.d.ts","../../node_modules/@apollo/client/errors/index.d.ts","../../node_modules/@apollo/client/core/queryinfo.d.ts","../../node_modules/@apollo/client/core/localstate.d.ts","../../node_modules/@apollo/client/core/types.d.ts","../../node_modules/@apollo/client/core/watchqueryoptions.d.ts","../../node_modules/@apollo/client/core/querymanager.d.ts","../../node_modules/@apollo/client/core/observablequery.d.ts","../../node_modules/@apollo/client/core/apolloclient.d.ts","../../node_modules/graphql-tag/lib/index.d.ts","../../node_modules/@apollo/client/core/index.d.ts","../../node_modules/@types/apollo-upload-client/public/formdataappendfile.d.ts","../../node_modules/@types/apollo-upload-client/public/isextractablefile.d.ts","../../node_modules/@types/apollo-upload-client/public/createuploadlink.d.ts","../../node_modules/@types/apollo-upload-client/public/reactnativefile.d.ts","../../node_modules/@types/apollo-upload-client/index.d.ts","../../node_modules/@types/aria-query/index.d.ts","../../node_modules/@types/bcrypt/index.d.ts","../../node_modules/@types/better-sqlite3/index.d.ts","../../node_modules/@types/connect/index.d.ts","../../node_modules/@types/body-parser/index.d.ts","../../node_modules/@types/bonjour/index.d.ts","../../node_modules/@types/bytes/index.d.ts","../../node_modules/keyv/src/index.d.ts","../../node_modules/@types/http-cache-semantics/index.d.ts","../../node_modules/@types/responselike/index.d.ts","../../node_modules/@types/cacheable-request/index.d.ts","../../node_modules/@types/chai/index.d.ts","../../node_modules/@types/codemirror/index.d.ts","../../node_modules/@types/mime/index.d.ts","../../node_modules/@types/send/index.d.ts","../../node_modules/@types/qs/index.d.ts","../../node_modules/@types/range-parser/index.d.ts","../../node_modules/@types/express-serve-static-core/index.d.ts","../../node_modules/@types/connect-history-api-fallback/index.d.ts","../../node_modules/@types/content-disposition/index.d.ts","../../node_modules/@types/cookie/index.d.ts","../../node_modules/@types/cookiejar/index.d.ts","../../node_modules/@types/http-errors/index.d.ts","../../node_modules/@types/serve-static/node_modules/@types/mime/mime.d.ts","../../node_modules/@types/serve-static/node_modules/@types/mime/index.d.ts","../../node_modules/@types/serve-static/index.d.ts","../../node_modules/@types/express/index.d.ts","../../node_modules/@types/keygrip/index.d.ts","../../node_modules/@types/cookies/index.d.ts","../../node_modules/@types/cors/index.d.ts","../../node_modules/@types/cross-spawn/index.d.ts","../../node_modules/@types/d3-color/index.d.ts","../../node_modules/@types/d3-path/index.d.ts","../../node_modules/@types/d3-time/index.d.ts","../../node_modules/@types/d3-scale/index.d.ts","../../node_modules/@types/d3-scale-chromatic/index.d.ts","../../node_modules/@types/d3-shape/index.d.ts","../../node_modules/@types/d3-time-format/index.d.ts","../../node_modules/@types/ms/index.d.ts","../../node_modules/@types/debug/index.d.ts","../../node_modules/@types/deep-equal/index.d.ts","../../node_modules/@types/detect-port/index.d.ts","../../node_modules/@types/doctrine/index.d.ts","../../node_modules/@types/ejs/index.d.ts","../../node_modules/@types/emscripten/index.d.ts","../../node_modules/@types/escodegen/index.d.ts","../../node_modules/@types/eslint-scope/index.d.ts","../../node_modules/@types/estree-jsx/index.d.ts","../../node_modules/@types/extend/index.d.ts","../../node_modules/@types/extract-files/index.d.ts","../../node_modules/@types/find-cache-dir/index.d.ts","../../node_modules/@types/minimatch/index.d.ts","../../node_modules/@types/glob/index.d.ts","../../node_modules/@types/graceful-fs/index.d.ts","../../node_modules/@types/graphql-fields/index.d.ts","../../node_modules/@types/http-assert/index.d.ts","../../node_modules/@types/koa-compose/index.d.ts","../../node_modules/@types/koa/index.d.ts","../../node_modules/fs-capacitor/dist/index.d.ts","../../node_modules/@types/graphql-upload/index.d.ts","../../node_modules/@types/gtag.js/index.d.ts","../../node_modules/@types/har-format/index.d.ts","../../node_modules/@types/hast/node_modules/@types/unist/index.d.ts","../../node_modules/@types/hast/index.d.ts","../../node_modules/@types/history/domutils.d.ts","../../node_modules/@types/history/createbrowserhistory.d.ts","../../node_modules/@types/history/createhashhistory.d.ts","../../node_modules/@types/history/creatememoryhistory.d.ts","../../node_modules/@types/history/locationutils.d.ts","../../node_modules/@types/history/pathutils.d.ts","../../node_modules/@types/history/index.d.ts","../../node_modules/@types/react/global.d.ts","../../node_modules/csstype/index.d.ts","../../node_modules/@types/prop-types/index.d.ts","../../node_modules/@types/scheduler/tracing.d.ts","../../node_modules/@types/react/index.d.ts","../../node_modules/@types/hoist-non-react-statics/index.d.ts","../../node_modules/@types/html-minifier-terser/index.d.ts","../../node_modules/@types/http-proxy/index.d.ts","../../node_modules/@types/istanbul-lib-coverage/index.d.ts","../../node_modules/@types/istanbul-lib-report/index.d.ts","../../node_modules/@types/istanbul-reports/index.d.ts","../../node_modules/@jest/expect-utils/build/index.d.ts","../../node_modules/chalk/index.d.ts","../../node_modules/@sinclair/typebox/typebox.d.ts","../../node_modules/@jest/schemas/build/index.d.ts","../../node_modules/pretty-format/build/index.d.ts","../../node_modules/jest-diff/build/index.d.ts","../../node_modules/jest-matcher-utils/build/index.d.ts","../../node_modules/expect/build/index.d.ts","../../node_modules/@types/jest/index.d.ts","../../node_modules/@types/js-cookie/index.d.ts","../../node_modules/@types/js-levenshtein/index.d.ts","../../node_modules/@types/js-yaml/index.d.ts","../../node_modules/parse5/dist/common/html.d.ts","../../node_modules/parse5/dist/common/token.d.ts","../../node_modules/parse5/dist/common/error-codes.d.ts","../../node_modules/parse5/dist/tokenizer/preprocessor.d.ts","../../node_modules/parse5/dist/tokenizer/index.d.ts","../../node_modules/parse5/dist/tree-adapters/interface.d.ts","../../node_modules/parse5/dist/parser/open-element-stack.d.ts","../../node_modules/parse5/dist/parser/formatting-element-list.d.ts","../../node_modules/parse5/dist/parser/index.d.ts","../../node_modules/parse5/dist/tree-adapters/default.d.ts","../../node_modules/parse5/dist/serializer/index.d.ts","../../node_modules/parse5/dist/common/foreign-content.d.ts","../../node_modules/parse5/dist/index.d.ts","../../node_modules/@types/tough-cookie/index.d.ts","../../node_modules/@types/jsdom/base.d.ts","../../node_modules/@types/jsdom/index.d.ts","../../node_modules/@types/json-stable-stringify/index.d.ts","../../node_modules/@types/json5/index.d.ts","../../node_modules/@types/jsonwebtoken/index.d.ts","../../node_modules/@types/keyv/index.d.ts","../../node_modules/@types/lodash/common/common.d.ts","../../node_modules/@types/lodash/common/array.d.ts","../../node_modules/@types/lodash/common/collection.d.ts","../../node_modules/@types/lodash/common/date.d.ts","../../node_modules/@types/lodash/common/function.d.ts","../../node_modules/@types/lodash/common/lang.d.ts","../../node_modules/@types/lodash/common/math.d.ts","../../node_modules/@types/lodash/common/number.d.ts","../../node_modules/@types/lodash/common/object.d.ts","../../node_modules/@types/lodash/common/seq.d.ts","../../node_modules/@types/lodash/common/string.d.ts","../../node_modules/@types/lodash/common/util.d.ts","../../node_modules/@types/lodash/index.d.ts","../../node_modules/@types/lodash.camelcase/index.d.ts","../../node_modules/@types/lodash.debounce/index.d.ts","../../node_modules/@types/lodash.isempty/index.d.ts","../../node_modules/@types/lodash.isequal/index.d.ts","../../node_modules/@types/lodash.isobject/index.d.ts","../../node_modules/@types/lodash.kebabcase/index.d.ts","../../node_modules/@types/lodash.merge/index.d.ts","../../node_modules/@types/lodash.mergewith/index.d.ts","../../node_modules/@types/lodash.snakecase/index.d.ts","../../node_modules/@types/lodash.upperfirst/index.d.ts","../../node_modules/@types/long/index.d.ts","../../node_modules/@types/luxon/src/zone.d.ts","../../node_modules/@types/luxon/src/settings.d.ts","../../node_modules/@types/luxon/src/_util.d.ts","../../node_modules/@types/luxon/src/misc.d.ts","../../node_modules/@types/luxon/src/duration.d.ts","../../node_modules/@types/luxon/src/interval.d.ts","../../node_modules/@types/luxon/src/datetime.d.ts","../../node_modules/@types/luxon/src/info.d.ts","../../node_modules/@types/luxon/src/luxon.d.ts","../../node_modules/@types/luxon/index.d.ts","../../node_modules/iconv-lite/lib/index.d.ts","../../node_modules/@types/mailparser/index.d.ts","../../node_modules/@types/unist/index.d.ts","../../node_modules/@types/mdast/index.d.ts","../../node_modules/@types/mdurl/encode.d.ts","../../node_modules/@types/mdurl/decode.d.ts","../../node_modules/@types/mdurl/parse.d.ts","../../node_modules/@types/mdurl/format.d.ts","../../node_modules/@types/mdurl/index.d.ts","../../node_modules/@types/mdx/types.d.ts","../../node_modules/@types/mdx/index.d.ts","../../node_modules/@types/methods/index.d.ts","../../node_modules/@types/mime-types/index.d.ts","../../node_modules/form-data/index.d.ts","../../node_modules/@types/node-fetch/externals.d.ts","../../node_modules/@types/node-fetch/index.d.ts","../../node_modules/@types/node-forge/index.d.ts","../../node_modules/@types/nodemailer/lib/dkim/index.d.ts","../../node_modules/@types/nodemailer/lib/mailer/mail-message.d.ts","../../node_modules/@types/nodemailer/lib/xoauth2/index.d.ts","../../node_modules/@types/nodemailer/lib/mailer/index.d.ts","../../node_modules/@types/nodemailer/lib/mime-node/index.d.ts","../../node_modules/@types/nodemailer/lib/smtp-connection/index.d.ts","../../node_modules/@types/nodemailer/lib/shared/index.d.ts","../../node_modules/@types/nodemailer/lib/json-transport/index.d.ts","../../node_modules/@types/nodemailer/lib/sendmail-transport/index.d.ts","../../node_modules/@types/nodemailer/lib/ses-transport/index.d.ts","../../node_modules/@types/nodemailer/lib/smtp-pool/index.d.ts","../../node_modules/@types/nodemailer/lib/smtp-transport/index.d.ts","../../node_modules/@types/nodemailer/lib/stream-transport/index.d.ts","../../node_modules/@types/nodemailer/index.d.ts","../../node_modules/@types/normalize-package-data/index.d.ts","../../node_modules/@types/oauth/index.d.ts","../../node_modules/@types/object.omit/index.d.ts","../../node_modules/@types/object.pick/index.d.ts","../../node_modules/@types/parse-json/index.d.ts","../../node_modules/@types/parse5/lib/tree-adapters/default.d.ts","../../node_modules/@types/parse5/index.d.ts","../../node_modules/@types/passport/index.d.ts","../../node_modules/@types/passport-oauth2/index.d.ts","../../node_modules/@types/passport-google-oauth20/index.d.ts","../../node_modules/@types/passport-strategy/index.d.ts","../../node_modules/@types/passport-jwt/index.d.ts","../../node_modules/@types/pretty-hrtime/index.d.ts","../../node_modules/@types/prismjs/index.d.ts","../../node_modules/@popperjs/core/lib/enums.d.ts","../../node_modules/@popperjs/core/lib/modifiers/popperoffsets.d.ts","../../node_modules/@popperjs/core/lib/modifiers/flip.d.ts","../../node_modules/@popperjs/core/lib/modifiers/hide.d.ts","../../node_modules/@popperjs/core/lib/modifiers/offset.d.ts","../../node_modules/@popperjs/core/lib/modifiers/eventlisteners.d.ts","../../node_modules/@popperjs/core/lib/modifiers/computestyles.d.ts","../../node_modules/@popperjs/core/lib/modifiers/arrow.d.ts","../../node_modules/@popperjs/core/lib/modifiers/preventoverflow.d.ts","../../node_modules/@popperjs/core/lib/modifiers/applystyles.d.ts","../../node_modules/@popperjs/core/lib/types.d.ts","../../node_modules/@popperjs/core/lib/modifiers/index.d.ts","../../node_modules/@popperjs/core/lib/utils/detectoverflow.d.ts","../../node_modules/@popperjs/core/lib/createpopper.d.ts","../../node_modules/@popperjs/core/lib/popper-lite.d.ts","../../node_modules/@popperjs/core/lib/popper.d.ts","../../node_modules/@popperjs/core/lib/index.d.ts","../../node_modules/@popperjs/core/index.d.ts","../../node_modules/date-fns/typings.d.ts","../../node_modules/react-popper/typings/react-popper.d.ts","../../node_modules/@types/react-datepicker/index.d.ts","../../node_modules/@types/react-dom/index.d.ts","../../node_modules/@types/react-lifecycles-compat/index.d.ts","../../node_modules/@types/react-router/index.d.ts","../../node_modules/@types/react-router-config/index.d.ts","../../node_modules/@types/react-router-dom/index.d.ts","../../node_modules/@types/resolve/index.d.ts","../../node_modules/@types/retry/index.d.ts","../../node_modules/@types/sax/index.d.ts","../../node_modules/@types/scheduler/index.d.ts","../../node_modules/@types/scroll-into-view/index.d.ts","../../node_modules/@types/semver/classes/semver.d.ts","../../node_modules/@types/semver/functions/parse.d.ts","../../node_modules/@types/semver/functions/valid.d.ts","../../node_modules/@types/semver/functions/clean.d.ts","../../node_modules/@types/semver/functions/inc.d.ts","../../node_modules/@types/semver/functions/diff.d.ts","../../node_modules/@types/semver/functions/major.d.ts","../../node_modules/@types/semver/functions/minor.d.ts","../../node_modules/@types/semver/functions/patch.d.ts","../../node_modules/@types/semver/functions/prerelease.d.ts","../../node_modules/@types/semver/functions/compare.d.ts","../../node_modules/@types/semver/functions/rcompare.d.ts","../../node_modules/@types/semver/functions/compare-loose.d.ts","../../node_modules/@types/semver/functions/compare-build.d.ts","../../node_modules/@types/semver/functions/sort.d.ts","../../node_modules/@types/semver/functions/rsort.d.ts","../../node_modules/@types/semver/functions/gt.d.ts","../../node_modules/@types/semver/functions/lt.d.ts","../../node_modules/@types/semver/functions/eq.d.ts","../../node_modules/@types/semver/functions/neq.d.ts","../../node_modules/@types/semver/functions/gte.d.ts","../../node_modules/@types/semver/functions/lte.d.ts","../../node_modules/@types/semver/functions/cmp.d.ts","../../node_modules/@types/semver/functions/coerce.d.ts","../../node_modules/@types/semver/classes/comparator.d.ts","../../node_modules/@types/semver/classes/range.d.ts","../../node_modules/@types/semver/functions/satisfies.d.ts","../../node_modules/@types/semver/ranges/max-satisfying.d.ts","../../node_modules/@types/semver/ranges/min-satisfying.d.ts","../../node_modules/@types/semver/ranges/to-comparators.d.ts","../../node_modules/@types/semver/ranges/min-version.d.ts","../../node_modules/@types/semver/ranges/valid.d.ts","../../node_modules/@types/semver/ranges/outside.d.ts","../../node_modules/@types/semver/ranges/gtr.d.ts","../../node_modules/@types/semver/ranges/ltr.d.ts","../../node_modules/@types/semver/ranges/intersects.d.ts","../../node_modules/@types/semver/ranges/simplify.d.ts","../../node_modules/@types/semver/ranges/subset.d.ts","../../node_modules/@types/semver/internals/identifiers.d.ts","../../node_modules/@types/semver/index.d.ts","../../node_modules/@types/serve-index/index.d.ts","../../node_modules/@types/sockjs/index.d.ts","../../node_modules/@types/stack-utils/index.d.ts","../../node_modules/@types/statuses/index.d.ts","../../node_modules/@types/superagent/lib/agent-base.d.ts","../../node_modules/@types/superagent/lib/node/response.d.ts","../../node_modules/@types/superagent/types.d.ts","../../node_modules/@types/superagent/lib/node/agent.d.ts","../../node_modules/@types/superagent/lib/request-base.d.ts","../../node_modules/@types/superagent/lib/node/index.d.ts","../../node_modules/@types/superagent/index.d.ts","../../node_modules/@types/supertest/index.d.ts","../../node_modules/@types/swagger-schema-official/index.d.ts","../../node_modules/@types/tern/lib/tern/index.d.ts","../../node_modules/@types/tern/lib/infer/index.d.ts","../../node_modules/@types/tern/index.d.ts","../../node_modules/@types/throttle-debounce/index.d.ts","../../node_modules/@types/type-is/index.d.ts","../../node_modules/@types/use-sync-external-store/index.d.ts","../../node_modules/@types/uuid/index.d.ts","../../node_modules/@types/validator/lib/isboolean.d.ts","../../node_modules/@types/validator/lib/isemail.d.ts","../../node_modules/@types/validator/lib/isfqdn.d.ts","../../node_modules/@types/validator/lib/isiban.d.ts","../../node_modules/@types/validator/lib/isiso31661alpha2.d.ts","../../node_modules/@types/validator/lib/isiso4217.d.ts","../../node_modules/@types/validator/lib/isiso6391.d.ts","../../node_modules/@types/validator/lib/istaxid.d.ts","../../node_modules/@types/validator/lib/isurl.d.ts","../../node_modules/@types/validator/index.d.ts","../../node_modules/@types/wait-on/index.d.ts","../../node_modules/@types/ws/index.d.ts","../../node_modules/@types/yargs-parser/index.d.ts","../../node_modules/@types/yargs/index.d.ts"],"fileInfos":["a7297ff837fcdf174a9524925966429eb8e5feecc2cc55cc06574e6b092c1eaa",{"version":"f33e5332b24c3773e930e212cbb8b6867c8ba3ec4492064ea78e55a524d57450","affectsGlobalScope":true},"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","26f2f787e82c4222710f3b676b4d83eb5ad0a72fa7b746f03449e7a026ce5073","9a68c0c07ae2fa71b44384a839b7b8d81662a236d4b9ac30916718f7510b1b2d","5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4",{"version":"21e41a76098aa7a191028256e52a726baafd45a925ea5cf0222eb430c96c1d83","affectsGlobalScope":true},{"version":"35299ae4a62086698444a5aaee27fc7aa377c68cbb90b441c9ace246ffd05c97","affectsGlobalScope":true},{"version":"80e18897e5884b6723488d4f5652167e7bb5024f946743134ecc4aa4ee731f89","affectsGlobalScope":true},{"version":"cd034f499c6cdca722b60c04b5b1b78e058487a7085a8e0d6fb50809947ee573","affectsGlobalScope":true},{"version":"138fb588d26538783b78d1e3b2c2cc12d55840b97bf5e08bca7f7a174fbe2f17","affectsGlobalScope":true},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true},{"version":"4443e68b35f3332f753eacc66a04ac1d2053b8b035a0e0ac1d455392b5e243b3","affectsGlobalScope":true},{"version":"bc47685641087c015972a3f072480889f0d6c65515f12bd85222f49a98952ed7","affectsGlobalScope":true},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true},{"version":"93495ff27b8746f55d19fcbcdbaccc99fd95f19d057aed1bd2c0cafe1335fbf0","affectsGlobalScope":true},{"version":"6fc23bb8c3965964be8c597310a2878b53a0306edb71d4b5a4dfe760186bcc01","affectsGlobalScope":true},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true},{"version":"bb42a7797d996412ecdc5b2787720de477103a0b2e53058569069a0e2bae6c7e","affectsGlobalScope":true},{"version":"4738f2420687fd85629c9efb470793bb753709c2379e5f85bc1815d875ceadcd","affectsGlobalScope":true},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true},{"version":"9fc46429fbe091ac5ad2608c657201eb68b6f1b8341bd6d670047d32ed0a88fa","affectsGlobalScope":true},{"version":"61c37c1de663cf4171e1192466e52c7a382afa58da01b1dc75058f032ddf0839","affectsGlobalScope":true},{"version":"b541a838a13f9234aba650a825393ffc2292dc0fc87681a5d81ef0c96d281e7a","affectsGlobalScope":true},{"version":"e0275cd0e42990dc3a16f0b7c8bca3efe87f1c8ad404f80c6db1c7c0b828c59f","affectsGlobalScope":true},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true},{"version":"49ed889be54031e1044af0ad2c603d627b8bda8b50c1a68435fe85583901d072","affectsGlobalScope":true},{"version":"e93d098658ce4f0c8a0779e6cab91d0259efb88a318137f686ad76f8410ca270","affectsGlobalScope":true},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true},{"version":"bf14a426dbbf1022d11bd08d6b8e709a2e9d246f0c6c1032f3b2edb9a902adbe","affectsGlobalScope":true},{"version":"ec0104fee478075cb5171e5f4e3f23add8e02d845ae0165bfa3f1099241fa2aa","affectsGlobalScope":true},{"version":"2b72d528b2e2fe3c57889ca7baef5e13a56c957b946906d03767c642f386bbc3","affectsGlobalScope":true},{"version":"acae90d417bee324b1372813b5a00829d31c7eb670d299cd7f8f9a648ac05688","affectsGlobalScope":true},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true},{"version":"13f6e6380c78e15e140243dc4be2fa546c287c6d61f4729bc2dd7cf449605471","affectsGlobalScope":true},{"version":"33358442698bb565130f52ba79bfd3d4d484ac85fe33f3cb1759c54d18201393","affectsGlobalScope":true},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true},"8bffa969fa7e6e1d7f194c14f2f324265532a8fa6c046b3560cf9ee2c638fec1","8f44a78d1ad769dbc5f2668f2b7a02b43404724849e7afe0cda188957d47ccd0","485c95ea74479320db266f03fa702ad9b0823b8154a0a2b81e5a4c633bf9ac4a","efc7d584a33fe3422847783d228f315c4cd1afe74bd7cf8e3f0e4c1125129fef","7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","4967529644e391115ca5592184d4b63980569adf60ee685f968fd59ab1557188","5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","7180c03fd3cb6e22f911ce9ba0f8a7008b1a6ddbe88ccf16a9c8140ef9ac1686","25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","54cb85a47d760da1c13c00add10d26b5118280d44d58e6908d8e89abbd9d7725","3e4825171442666d31c845aeb47fcd34b62e14041bb353ae2b874285d78482aa","c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","a967bfe3ad4e62243eb604bf956101e4c740f5921277c60debaf325c1320bf88","e9775e97ac4877aebf963a0289c81abe76d1ec9a2a7778dbe637e5151f25c5f3","471e1da5a78350bc55ef8cef24eb3aca6174143c281b8b214ca2beda51f5e04a","cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","db3435f3525cd785bf21ec6769bf8da7e8a776be1a99e2e7efb5f244a2ef5fee","c3b170c45fc031db31f782e612adf7314b167e60439d304b49e704010e7bafe5","40383ebef22b943d503c6ce2cb2e060282936b952a01bea5f9f493d5fb487cc7","4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","3a84b7cb891141824bd00ef8a50b6a44596aded4075da937f180c90e362fe5f6","13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","33203609eba548914dc83ddf6cadbc0bcb6e8ef89f6d648ca0908ae887f9fcc5","0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","e53a3c2a9f624d90f24bf4588aacd223e7bec1b9d0d479b68d2f4a9e6011147f","339dc5265ee5ed92e536a93a04c4ebbc2128f45eeec6ed29f379e0085283542c","9f0a92164925aa37d4a5d9dd3e0134cff8177208dba55fd2310cd74beea40ee2","8bfdb79bf1a9d435ec48d9372dc93291161f152c0865b81fc0b2694aedb4578d","2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","d32275be3546f252e3ad33976caf8c5e842c09cb87d468cb40d5f4cf092d1acc","4a0c3504813a3289f7fb1115db13967c8e004aa8e4f8a9021b95285502221bd1",{"version":"a14ed46fa3f5ffc7a8336b497cd07b45c2084213aaca933a22443fcb2eef0d07","affectsGlobalScope":true},"cce1f5f86974c1e916ec4a8cab6eec9aa8e31e8148845bf07fbaa8e1d97b1a2c",{"version":"185282b122cbca820c297a02a57b89cf5967ab43e220e3e174d872d3f9a94d2c","affectsGlobalScope":true},"16d74fe4d8e183344d3beb15d48b123c5980ff32ff0cc8c3b96614ddcdf9b239","7b43160a49cf2c6082da0465876c4a0b164e160b81187caeb0a6ca7a281e85ba",{"version":"41fb2a1c108fbf46609ce5a451b7ec78eb9b5ada95fd5b94643e4b26397de0b3","affectsGlobalScope":true},"a40826e8476694e90da94aa008283a7de50d1dafd37beada623863f1901cb7fb","06f613ad82b49f264a12e30977e791d5b0addf9d8d1d18cd135c402928ff0607","285e512c7a0db217a0599e18c462d565fa35be4a5153dd7b80bee88c83e83ddf","b5b719a47968cd61a6f83f437236bb6fe22a39223b6620da81ef89f5d7a78fb7","8806ae97308ef26363bd7ec8071bca4d07fb575f905ee3d8a91aff226df6d618","af5bf1db6f1804fb0069039ae77a05d60133c77a2158d9635ea27b6bb2828a8f","b7fe70be794e13d1b7940e318b8770cd1fb3eced7707805318a2e3aaac2c3e9e",{"version":"2c71199d1fc83bf17636ad5bf63a945633406b7b94887612bba4ef027c662b3e","affectsGlobalScope":true},{"version":"7ae9dc7dbb58cd843065639707815df85c044babaa0947116f97bdb824d07204","affectsGlobalScope":true},"7aae1df2053572c2cfc2089a77847aadbb38eedbaa837a846c6a49fb37c6e5bd","313a0b063f5188037db113509de1b934a0e286f14e9479af24fada241435e707","1f758340b027b18ae8773ac3d33a60648a2af49eaae9e4fde18d0a0dd608642c","87ef1a23caa071b07157c72077fa42b86d30568f9dc9e31eed24d5d14fc30ba8","396a8939b5e177542bdf9b5262b4eee85d29851b2d57681fa9d7eae30e225830","21773f5ac69ddf5a05636ba1f50b5239f4f2d27e4420db147fc2f76a5ae598ac",{"version":"dea4c00820d4fac5e530d4842aed2fb20d6744d75a674b95502cbd433f88bcb0","affectsGlobalScope":true},"a5fe4cc622c3bf8e09ababde5f4096ceac53163eefcd95e9cd53f062ff9bb67a","45b1053e691c5af9bfe85060a3e1542835f8d84a7e6e2e77ca305251eda0cb3c","0f05c06ff6196958d76b865ae17245b52d8fe01773626ac3c43214a2458ea7b7",{"version":"0d832a0650a74aafc276cb3f7bb26bde2e2270a6f87e6c871a64122e9203079b","affectsGlobalScope":true},{"version":"c6f3869f12bb5c3bb8ecd0b050ea20342b89b944eae18d313cde6b0ccc0925d7","affectsGlobalScope":true},"8abd0566d2854c4bd1c5e48e05df5c74927187f1541e6770001d9637ac41542e","d742ed2db6d5425b3b6ac5fb1f2e4b1ed2ae74fbeee8d0030d852121a4b05d2f","d8dba11dc34d50cb4202de5effa9a1b296d7a2f4a029eec871f894bddfb6430d","8b71dd18e7e63b6f991b511a201fad7c3bf8d1e0dd98acb5e3d844f335a73634","01d8e1419c84affad359cc240b2b551fb9812b450b4d3d456b64cda8102d4f60","8221b00f271cf7f535a8eeec03b0f80f0929c7a16116e2d2df089b41066de69b","269929a24b2816343a178008ac9ae9248304d92a8ba8e233055e0ed6dbe6ef71","93452d394fdd1dc551ec62f5042366f011a00d342d36d50793b3529bfc9bd633","f8c87b19eae111f8720b0345ab301af8d81add39621b63614dfc2d15fd6f140a","831c22d257717bf2cbb03afe9c4bcffc5ccb8a2074344d4238bf16d3a857bb12",{"version":"2225100373ca3d63bcc7f206e1177152d2e2161285a0bd83c8374db1503a0d1f","affectsGlobalScope":true},{"version":"7052b7b0c3829df3b4985bab2fd74531074b4835d5a7b263b75c82f0916ad62f","affectsGlobalScope":true},"aa34c3aa493d1c699601027c441b9664547c3024f9dbab1639df7701d63d18fa","eefcdf86cefff36e5d87de36a3638ab5f7d16c2b68932be4a72c14bb924e43c1","7c651f8dce91a927ab62925e73f190763574c46098f2b11fb8ddc1b147a6709a","7440ab60f4cb031812940cc38166b8bb6fbf2540cfe599f87c41c08011f0c1df",{"version":"4d0405568cf6e0ff36a4861c4a77e641366feaefa751600b0a4d12a5e8f730a8","affectsGlobalScope":true},{"version":"f5b5dc128973498b75f52b1b8c2d5f8629869104899733ae485100c2309b4c12","affectsGlobalScope":true},"e393915d3dc385e69c0e2390739c87b2d296a610662eb0b1cb85224e55992250","79bad8541d5779c85e82a9fb119c1fe06af77a71cc40f869d62ad379473d4b75","4a34b074b11c3597fb2ff890bc8f1484375b3b80793ab01f974534808d5777c7",{"version":"629d20681ca284d9e38c0a019f647108f5fe02f9c59ac164d56f5694fc3faf4d","affectsGlobalScope":true},"e7dbf5716d76846c7522e910896c5747b6df1abd538fee8f5291bdc843461795",{"version":"ab9b9a36e5284fd8d3bf2f7d5fcbc60052f25f27e4d20954782099282c60d23e","affectsGlobalScope":true},"b510d0a18e3db42ac9765d26711083ec1e8b4e21caaca6dc4d25ae6e8623f447",{"version":"0e4ca50408ca6a9ddb79bce2fa6e931eab379431ea7b2b6e1cce12669ca7c3bf","affectsGlobalScope":true},"a660aa95476042d3fdcc1343cf6bb8fdf24772d31712b1db321c5a4dcc325434","bcb6ea18f23dae2c48459d7b86d3adccd6898f824fcbf9da08b935f559896580","1363ba7d52f2353d0c4306d0ecdaf171bf4509c0148842f9fd8d3986c098a2eb","4ac282004b0038c107795523475e549e6b357a347831cc635eb08360d63c1468","858d0d831826c6eb563df02f7db71c90e26deadd0938652096bea3cc14899700","8885cf05f3e2abf117590bbb951dcf6359e3e5ac462af1c901cfd24c6a6472e2","18c04c22baee54d13b505fa6e8bcd4223f8ba32beee80ec70e6cac972d1cc9a6","5e92a2e8ba5cbcdfd9e51428f94f7bd0ab6e45c9805b1c9552b64abaffad3ce3","53ca39fe70232633759dd3006fc5f467ecda540252c0c819ab53e9f6ad97b226","e7174a839d4732630d904a8b488f22380e5bcf1d6405d1f59614e10795eca17d","7ec359bbc29b69d4063fe7dad0baaf35f1856f914db16b3f4f6e3e1bca4099fa","b9261ac3e9944d3d72c5ee4cf888ad35d9743a5563405c6963c4e43ee3708ca4","c84fd54e8400def0d1ef1569cafd02e9f39a622df9fa69b57ccc82128856b916","c7a38c1ef8d6ae4bf252be67bd9a8b012b2cdea65bd6225a3d1a726c4f0d52b6","e773630f8772a06e82d97046fc92da59ada8414c61689894fff0155dd08f102c","74f2815d9e1b8530120dcad409ed5f706df8513c4d93e99fc6213997aa4dd60e","9d1f36ccd354f2e286b909bf01d626a3a28dd6590770303a18afa7796fe50db9","c4bc6a572f9d763ac7fa0d839be3de80273a67660e2002e3225e00ef716b4f37","106e607866d6c3e9a497a696ac949c3e2ec46b6e7dda35aabe76100bf740833b","8a6c755dc994d16c4e072bba010830fa2500d98ff322c442c7c91488d160a10d","d4514d11e7d11c53da7d43b948654d6e608a3d93d666a36f8d01e18ece04c9bd","3d65182eff7bbb16de1a69e17651c51083f740af11a1a92359be6dab939e8bcf","670ddaf1f1b881abaa1cc28236430d86b691affbeaefd66b3ee1db31fdfb8dba","77926a706478940016e826b162f95f8e4077b1ad3184b2592dc03bd8b33e0384","21092de52736dc30f478fe5f1e88ad1b545ce4b276062999302aa65b30a6787a","8f07f2b6514744ac96e51d7cb8518c0f4de319471237ea10cf688b8d0e9d0225","304df321f3b710c2a0951f2c9cddfe34986e4aeb6994fa4f9d21efd06835abec","d294c49571f1b75f75479227e33d6f2fd2326302bce5f9f4dff0c719819dbfdc",{"version":"64d4b35c5456adf258d2cf56c341e203a073253f229ef3208fc0d5020253b241","affectsGlobalScope":true},"ee7d8894904b465b072be0d2e4b45cf6b887cdba16a467645c4e200982ece7ea","f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","90250f62d738c73d086da6f4b376067f74bcea7c0523db14d7ddf5af2ba31f8d","657e6dc684415721980e91e97785f1b8e6da4134e194de757d2d3733c54b4f06","bad1bc59cf9ba7f2b8efc0f7342b141843cbf3d3d791fa13df4ff9b86db26df9","a2ca9f3aee02a7fa0ec6f80afc09c5465191e5ca513be720bf858f5da275e66b",{"version":"65b9243c80068ec9696b1fbdd23c9acf80d51df02f97b2d7a0514312b0a9fe7d","affectsGlobalScope":true},"a337b9716b16c46e80a8810209cb162d32af16c6c93b331edcc01cdce5d82eba",{"version":"65b9243c80068ec9696b1fbdd23c9acf80d51df02f97b2d7a0514312b0a9fe7d","affectsGlobalScope":true},"58bdd5fd93f39bae19f34924ad304608ee37b6c6b357a57823ddfd2585a56d0f","f0745ab78e18a2befaf1d9951481973318722c4e2f33e859239f55fa999ff2b1","b61ebe734dabd3ca10247807bfa4585ed51c889282e5decd152eea86daea7383","41a35a21d3c9c0450229cf41be783285f3c01edd84039a41ffd162d42a93a576","ec9d55888e353f9b5cdda761308dffc7eeb6aa0b7b25d328c64d3776a1cf2a7e","9686c9ade71de53d81ee3e41ff7450d08bd08fff4f545af39e37eeda228745d6","78fbf5d1265bdca3b2e54323d63678e3f73fecf70c05d988966a683da4cdf2f8","37c0fd48eb043fdc395435716585587815f63afc66159588db8ed6c25a5f0636","7cd0faa5800c730d5e9387a5ad312732d95d0a3bd5a67e266721f36ae1068a91","03a931e4fb1e8b851a171b246a8aeba575fcdecde60c914b23f472af5beb29b0","f22230ec7c2b08a8f8dc110bacd30c910701cb7347b3129b9cf12f6e28130656","73623979b2b6f47b9af0efea985d91197a3c3303466ed786163757f0aa6b45bc","ad91f5cc45805d17ac94b01428f82b182c6ff0ebe6343d72fd298945478d203d","df4ba08679bfd850b787d662118aae3c4741dcaa661cf8689a768dab462cfd90","4acc4bccbdec774c58992a87f3ac2731f9d38c821520d06b4d53911898d0e3ec","94d6422d3c3faf923fbdff1ce7457a25f9b0b55e8a2fe0fefa8bfa7a89cf6676","1c775cb43c5edae0a7b4a5e543c07baab07f751e5cccc60a22c5bc3f6e38309c","0eef4cf077011e3d1839dfb93ab894cd611cf552c26eb995c822e8d9b71d93a1","f356e7999affebf5745d8ffdf0cb70426bc966da461166408099e4dac35e98c2","254265a792bdf31050dc2524733465d3ace0b179779e1ff8a97b2752a9b56656","1b85664bf562d2d216d71b940d8097600b4ed626f67528c868ced65dbe7288e6","7891c7290f213b63911a1391b3dfe08c9bfa54d401f28e167d0c57553eee80c0","707db20cf8a4ee166e63861c0a7d355b44595555e0248565479e745f6c1034d0","2a9788e7789f4ab603d4d3982fe5a98ff51b699b8ec4653fceb3192e147337dc","5bee6b675b1a0ece9d5082d438e923f112343685d4bc54b20a4dfbed09dbe323","ebd7209e5b648af7b6e3677280368b3c8ccef579a27c2386f7f5d376f1e14533","60f5fe888f5364424f9cdf43eef013cdcd6827cbec1d6d20fa191f5ebe827afd","aca0e55a2961b519f8857517e2cdf6085f024bb10c6961e120c80b76569fc4d7","26245b1b8452c300347a31b37a052c3244a36393dec03facfa4b31a8d8687184","f1f23acd4a8193453749f69d4432f5f122d6d572b793a8b630dd12fe80b0c3d3","7662d6994d28c9ebbe61b88cc35c3d705804351eedbf363df30ea9fe8c4961dc","1fb68106bddae35448e5279095461a4b54c4bbb42787cd629f70924b17e9a11e","9acd551d1b5fb8a4ea4bfd65e8fcc8beca89a4b98fc1a9321924308256383565","a7024322dc86e43685c5564b438decad7557de62baae80b062fee78752c3b2f4","351bbf43d585484825ee6c4b4805aac137ffc8e8a3b9812af99945a202db7c02","a0116a0ba37624acef486fba35bd5530c8c25415798c8908a35e5f72913d2365","3bd2fc1b877ba4f9c91fca3231333471f3ff0edf85e146eaafdff2bc42c9a44c","387a6dc0d57a9f602d0d7f2f4ba88b65540c1c19d84088157610ca0176793a03","7078f6149d25fa110b2bd24dece6754520e5984a2dd014875bef7ebe91016617","a58402dc75738c188a741ccca86ccf898b0af98d305ad075c428171f193a6cd5","ddccf0a48338cac642e93bfdb563494dad6e05b70ef0e6e3605a454db88ca57e","9c98df0145d99011af92c397fa787fc39d42cc04019614ab5581febe71fb32e1","d789022bf705385490fe89811bc7850225c207f37dd706ada2509eb1d8f31f12","9c98df0145d99011af92c397fa787fc39d42cc04019614ab5581febe71fb32e1","3b4ba8322f73cc571cd57e55199b909e04b5da79d00d58a3a20fd71463f8c081","cf1532b11d5ec78f63dc4d0c985353b281b4a09e91d35f63fb9aba42e36674ab","9c98df0145d99011af92c397fa787fc39d42cc04019614ab5581febe71fb32e1","3487a4c7100f4f6c08943047aaa34afe9a8dd130ecd0848b2212b5a11a02fb18","90f331fcd65f1a15de4eb297c01d05a7782097c6198bdfeb26123b27fa8f7937","611a9e2d52b509c65603e9f5c1f22c75b0b35e4c78e688943aa5aae6a7320009","77b55f8bfab90aa408704132d98b72f8762e2fe955eeda093ace44120d6adc1a","2f848b4e660b568651a6350565afc8ac5b0644853a2a863862807602cf244a05","a27020368bd27542780e1cf702dbb059dd1aba2220d233cdbb981ebd55c6c524","923c136dcbf20f140c369078a7eb56f6697889d104397d694f70e21dd08b1810","2c8e55457aaf4902941dfdba4061935922e8ee6e120539c9801cd7b400fae050","8041cfce439ff29d339742389de04c136e3029d6b1817f07b2d7fcbfb7534990","670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","9d38964b57191567a14b396422c87488cecd48f405c642daa734159875ee81d9","069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","3d922ac35e7bd201c09c71d0a3be9cab0ac41bdd0d5115f2734c8555629e5414","ae18a824baa6829b4b687f4e678d97c2b3f0ee75a82e2cff792180002f1e2a82","fe1baccba85e2af0fdaca57b32b34f3fd602609bb0b29aeb0609000dbcd75446","ae04fe1adb6d10414645db0d9c264ae06a48cd73fbb043053afe9c72849e5e44","f961eca7ae704d5b6d1e590ee6dafbd552700a2e4076480e613dadb55368835b","b943e4cfae007bf0e8b5aa9cbb979865505e89586fd1e45bb7aabf0f855ed1d5","c09540252e5a1e6924e539692cca6323f68486095a4b0f36f54bd2d12d3f9aae","87f287f296f3ff07dbd14ea7853c2400d995dccd7bd83206196d6c0974774e96","3777eb752cef9aa8dd35bb997145413310008aa54ec44766de81a7ad891526cd","78647004e18e4c16b8a2e8345fca9267573d1c5a29e11ddfee71858fd077ef6e","0804044cd0488cb7212ddbc1d0f8e1a5bd32970335dbfc613052304a1b0318f9","b725acb041d2a18fde8f46c48a1408418489c4aa222f559b1ef47bf267cb4be0","85084ae98c1d319e38ef99b1216d3372a9afd7a368022c01c3351b339d52cb58","898ec2410fae172e0a9416448b0838bed286322a5c0c8959e8e39400cd4c5697","692345a43bac37c507fa7065c554258435ab821bbe4fb44b513a70063e932b45","cddd50d7bd9d7fddda91a576db9f61655d1a55e2d870f154485812f6e39d4c15","0539583b089247b73a21eb4a5f7e43208a129df6300d6b829dc1039b79b6c8c4","7aba43bc7764fcd02232382c780c3e99ef8dbfdac3c58605a0b3781fab3d8044","522edc786ed48304671b935cf7d3ed63acc6636ab9888c6e130b97a6aea92b46","1e1ed5600d80406a10428e349af8b6f09949cd5054043ea8588903e8f9e8d705","de21641eb8edcbc08dd0db4ee70eea907cd07fe72267340b5571c92647f10a77","a53039ba614075aeb702271701981babbd0d4f4dcbf319ddee4c08fb8196cc7a","6758f7b72fa4d38f4f4b865516d3d031795c947a45cc24f2cfba43c91446d678","da679a5bb46df3c6d84f637f09e6689d6c2d07e907ea16adc161e4529a4954d6","dc1a664c33f6ddd2791569999db2b3a476e52c5eeb5474768ffa542b136d78c0","bdf7abbd7df4f29b3e0728684c790e80590b69d92ed8d3bf8e66d4bd713941fe","8decb32fc5d44b403b46c3bb4741188df4fbc3c66d6c65669000c5c9cd506523","4beaf337ee755b8c6115ff8a17e22ceab986b588722a52c776b8834af64e0f38","c26dd198f2793bbdcc55103823a2767d6223a7fdb92486c18b86deaf63208354","93551b302a808f226f0846ad8012354f2d53d6dedc33b540d6ca69836781a574","f0ff1c010d5046af3874d3b4df746c6f3921e4b3fbdec61dee0792fc0cb36ccd","778b684ebc6b006fcffeab77d25b34bf6e400100e0ec0c76056e165c6399ab05","463851fa993af55fb0296e0d6afa27407ef91bf6917098dd665aba1200d250c7","67c6de7a9c490bda48eb401bea93904b6bbfc60e47427e887e6a3da6195540be","be8f369f8d7e887eab87a3e4e41f1afcf61bf06056801383152aa83bda1f6a72","352bfb5f3a9d8a9c2464ad2dc0b2dc56a8212650a541fb550739c286dd341de1","a5aae636d9afdacb22d98e4242487436d8296e5a345348325ccc68481fe1b690","d007c769e33e72e51286b816d82cd7c3a280cba714e7f958691155068bd7150a","764150c107451d2fd5b6de305cff0a9dcecf799e08e6f14b5a6748724db46d8a","b04cf223c338c09285010f5308b980ee6d8bfa203824ed2537516f15e92e8c43","4b387f208d1e468193a45a51005b1ed5b666010fc22a15dc1baf4234078b636e","70441eda704feffd132be0c1541f2c7f6bbaafce25cb9b54b181e26af3068e79","d1addb12403afea87a1603121396261a45190886c486c88e1a5d456be17c2049","15d43873064dc8787ca1e4c39149be59183c404d48a8cd5a0ea019bb5fdf8d58","ea4b5d319625203a5a96897b057fddf6017d0f9a902c16060466fe69cc007243","3d06897c536b4aad2b2b015d529270439f2cadd89ca2ff7bd8898ee84898dd88","ab01d8fcb89fae8eda22075153053fefac69f7d9571a389632099e7a53f1922d","bac0ec1f4c61abc7c54ccebb0f739acb0cdbc22b1b19c91854dc142019492961","566b0806f9016fa067b7fecf3951fcc295c30127e5141223393bde16ad04aa4a","8e801abfeda45b1b93e599750a0a8d25074d30d4cc01e3563e56c0ff70edeb68","902997f91b09620835afd88e292eb217fbd55d01706b82b9a014ff408f357559","a3727a926e697919fb59407938bd8573964b3bf543413b685996a47df5645863","83f36c0792d352f641a213ee547d21ea02084a148355aa26b6ef82c4f61c1280","dce7d69c17a438554c11bbf930dec2bee5b62184c0494d74da336daee088ab69","1e8f2cda9735002728017933c54ccea7ebee94b9c68a59a4aac1c9a58aa7da7d","e327a2b222cf9e5c93d7c1ed6468ece2e7b9d738e5da04897f1a99f49d42cca1","65165246b59654ec4e1501dd87927a0ef95d57359709e00e95d1154ad8443bc7","f1bacba19e2fa2eb26c499e36b5ab93d6764f2dba44be3816f12d2bc9ac9a35b","bce38da5fd851520d0cb4d1e6c3c04968cec2faa674ed321c118e97e59872edc","3398f46037f21fb6c33560ceca257259bd6d2ea03737179b61ea9e17cbe07455","6e14fc6c27cb2cb203fe1727bb3a923588f0be8c2604673ad9f879182548daca","12b9bcf8395d33837f301a8e6d545a24dfff80db9e32f8e8e6cf4b11671bb442","04295cc38689e32a4ea194c954ea6604e6afb6f1c102104f74737cb8cf744422","7418f434c136734b23f634e711cf44613ca4c74e63a5ae7429acaee46c7024c8","27d40290b7caba1c04468f2b53cf7112f247f8acdd7c20589cd7decf9f762ad0","2608b8b83639baf3f07316df29202eead703102f1a7e32f74a1b18cf1eee54b5","c93657567a39bd589effe89e863aaadbc339675fca6805ae4d97eafbcce0a05d","909d5db5b3b19f03dfb4a8f1d00cf41d2f679857c28775faf1f10794cbbe9db9","e4504bffce13574bab83ab900b843590d85a0fd38faab7eff83d84ec55de4aff","8ab707f3c833fc1e8a51106b8746c8bc0ce125083ea6200ad881625ae35ce11e","730ddc2386276ac66312edbcc60853fedbb1608a99cb0b1ff82ebf26911dba1f","c1b3fa201aa037110c43c05ea97800eb66fea3f2ecc5f07c6fd47f2b6b5b21d2","636b44188dc6eb326fd566085e6c1c6035b71f839d62c343c299a35888c6f0a9","3b2105bf9823b53c269cabb38011c5a71360c8daabc618fec03102c9514d230c","f96e63eb56e736304c3aef6c745b9fe93db235ddd1fec10b45319c479de1a432","acb4f3cee79f38ceba975e7ee3114eb5cd96ccc02742b0a4c7478b4619f87cd6","cfc85d17c1493b6217bad9052a8edc332d1fde81a919228edab33c14aa762939","eebda441c4486c26de7a8a7343ebbc361d2b0109abff34c2471e45e34a93020a","727b4b8eb62dd98fa4e3a0937172c1a0041eb715b9071c3de96dad597deddcab","708e2a347a1b9868ccdb48f3e43647c6eccec47b8591b220afcafc9e7eeb3784","6bb598e2d45a170f302f113a5b68e518c8d7661ae3b59baf076be9120afa4813","c28e058db8fed2c81d324546f53d2a7aaefff380cbe70f924276dbad89acd7d1","ebe8f07bb402102c5a764b0f8e34bd92d6f50bd7ac61a2452e76b80e02f9bb4b","826a98cb79deab45ccc4e5a8b90fa64510b2169781a7cbb83c4a0a8867f4cc58","618189f94a473b7fdc5cb5ba8b94d146a0d58834cd77cd24d56995f41643ccd5","5baadaca408128671536b3cb77fea44330e169ada70ce50b902c8d992fe64cf1","a4cc469f3561ea3edc57e091f4c9dcaf7485a70d3836be23a6945db46f0acd0b","91b0965538a5eaafa8c09cf9f62b46d6125aa1b3c0e0629dce871f5f41413f90","2978e33a00b4b5fb98337c5e473ab7337030b2f69d1480eccef0290814af0d51","ba71e9777cb5460e3278f0934fd6354041cb25853feca542312807ce1f18e611","608dbaf8c8bb64f4024013e73d7107c16dba4664999a8c6e58f3e71545e48f66","61937cefd7f4d6fa76013d33d5a3c5f9b0fc382e90da34790764a0d17d6277fb","af7db74826f455bfef6a55a188eb6659fd85fdc16f720a89a515c48724ee4c42","d6ce98a960f1b99a72de771fb0ba773cb202c656b8483f22d47d01d68f59ea86","2a47dc4a362214f31689870f809c7d62024afb4297a37b22cb86f679c4d04088","42d907ac511459d7c4828ee4f3f81cc331a08dc98d7b3cb98e3ff5797c095d2e","63d010bff70619e0cdf7900e954a7e188d3175461182f887b869c312a77ecfbd","1452816d619e636de512ca98546aafb9a48382d570af1473f0432a9178c4b1ff","9e3e3932fe16b9288ec8c948048aef4edf1295b09a5412630d63f4a42265370e","8bdba132259883bac06056f7bacd29a4dcf07e3f14ce89edb022fe9b78dcf9b3","5a5406107d9949d83e1225273bcee1f559bb5588942907d923165d83251a0e37","ca0ca4ca5ad4772161ee2a99741d616fea780d777549ba9f05f4a24493ab44e1","e7ee7be996db0d7cce41a85e4cae3a5fc86cf26501ad94e0a20f8b6c1c55b2d4","72263ae386d6a49392a03bde2f88660625da1eca5df8d95120d8ccf507483d20","b498375d015f01585269588b6221008aae6f0c0dc53ead8796ace64bdfcf62ea","c37aa3657fa4d1e7d22565ae609b1370c6b92bafb8c92b914403d45f0e610ddc","34534c0ead52cc753bdfdd486430ef67f615ace54a4c0e5a3652b4116af84d6d","a1079b54643537f75fa4f4bb963d787a302bddbe3a6001c4b0a524b746e6a9de","7fc9b18b6aafa8a1fc1441670c6c9da63e3d7942c7f451300c48bafd988545e9","200a7b7eb3163da4327412c650e43fbe66c73604a23a694f95ede53c250bfc3b","b843e64cc56422a003f151f950c0b11dfc93e48d836c23d1de3ff9760ba66128",{"version":"05fe0a22611e537b8d36d14182dd587ac81692247592e495bed72201d739d537","affectsGlobalScope":true},"0d728b43672268b6358c183f58babb14b4d9133368d3a3d970a638e745a07946",{"version":"68b24afcc8f547f6f4e01a6438f693acf091679d1290f16ac3ff4281604d09c3","affectsGlobalScope":true},"be65d9c4b878135fd01ec9d627649b8f0ea042405d4238555bb1ed32ba4bc0d4","c24c21411a095cbe726d6ee0a45d219109d661371d60647abf0ec72ac356959d","318e94f954acb56c170dcce0954d83ec8e4f466a6272ab3cf2cfa1b669fbee98","f0b49e409996f4d3ddb54f71ec92f5413d004070f23ac1626d698502af028d80","178f27d07eb47715315586e6b93499134f9645a781dcee121809772319da2310","65f6810084ae57ebbfb592d9df09322c71bd1df5cc7881040472eb32c6574680","34d0f816cd414b27ac302c7f4cc5be0a8dc161acbac07fc752b1e8123f71aba8","1439e71e2196fcf0c998446c0a86cd45c1c0c3f872e2b5c96747b77b95626468","8c328b52f3f1a382fa838326757402ba3f89dc956a154a8d39b383ff9d561778","83b5f5f5bdbf7f37b8ffc003abf6afee35a318871c990ad4d69d822f38d77840","656e8a14a0af2822043ecc64532a6d82715811a9c13aececf0538d9851a257a2","99facf398964ea17e5561106b3efd571c3fbde7d5318b7fd38bb4a1654f36734","43ea3bdd488aad6a292d982b1a0935a5ed5f69f76b7f40bf589c2f5245195544","d9c11d0dae4e8d01c2ee92f939cddcc5157663c94ba38c84f9dcfea71314dca8","7a04b46d532a6189ad4c5e3271e27d9244e7f02d9f28574babe0f525ff18c372","b3dec0879e876086c6bd5d93b671bf3a034da7712ea60b6e815f1de987df060a","4c2dc62cf8ddea2c86bdb2cdcc152482639b455a9d073b8a637ca0871691e808","4f805ead8833643819cb95ba66fc084aa79903f6df7bccf2624be517de4faf98","ae2412e203650a5a739700dcd74dbfb6caebb3c756a0d0d5c93ede47ab70d91a","a023eb8a768d010cc6ca7bbd3d721f2131652ceaa58151021570f0c7275cbfa6","6148d07d0461a3dbf338f5f271ff8b887d8256817f5bacb7fc7bd3bca5b79796","e81622c94502d2b4f7787d7e2695c6e5376126f54f6b15a933aa118da1c639a5","78fc536a6e2a1e307537b306b3c3ff8552be40f21c7dacfe1e7542ca7324fcc7","cffaede6750b091b5a5538a425699f9513fe0fc5cebc9e027598a56d506fff2b","38ca64ed80b12454b03c0bb971541b881ebb0ab227b6236bd56bca89cb0306ab","1cc001b662ff2ac4881f501a88c5dbb6c02a7f87d6cbee79934fff95c1bbea30","e4d157796b14020f4aa8db74073b77652cbafbb02dc108408b5c99dc9d77dc0c","5b857d41d08971f63d54a050c5ba29504887f72e21e548e12e36428726941b11","9b51dd74a388c13e157c457cc39d59dc2aae2134f6a21cc6b695219932cb8817",{"version":"db06f4cdf70e3689f0cd5a96a6836f34024ad61e8dd01473560ebbcae09c532b","affectsGlobalScope":true},"7ff05fb50d37beb9bc6a5f93a3f09db2f959b0327f4f3b4221b2180e5b661322","3a4e80746c4007af4abc9b1263c4088b859cf4c1f7e2f03a074750bd03679e17","8772ee20ba975dd2411063d0d0c762588de75d65be11bfc96d17ff8375e7153a","bd08ee515c95bb5e3387f1c6e06b9b90a7023841c5c50cf8a3be0ccb98b423b6","7e45d0be6c684f8bd44a7c9e9b85866eadeefa8eafb4391a9a301275c35b4fcd","4b9fba069829653b17f331333ded3f88a2193139115ad48589b57542e0f1df5f","fa67c77380575031c13b4428fb04e817fe50540329c981c1a2b147ecb9327ef0","a60cb94351eec664cd5fd6c680ed608258d5ebc0e0a4b469c66ed5a3cef5efd8","9f9159a0e2266b44e522ca1c861e65644a330549201b75ddb4ab79dd85f10c8a","8d00ce6d5f41f222246ca4413da284f9b64c452ede594aaf0a368c804e8c58c1","da9a27a114bc110dfc2aa82ae2c2bca6c263e54e2fb715c88e871cd03b86165c","5845b996902c6abf5559e3795ada1dc5e5eaa3f48c2f893ec614c2aae7ad9155","79ad4eca59cf44701cd2b138b633efa003573521634b60eabf89f9228cd55809","638678c386beeb3793cc51759d9accb2a502c71eb08f453d6536636ef4593186","cc64f85b35f8d01b0355456652a3494c7533269fa47a68272d28fc042e30dfba","9b051f36a67f0e5813b355868f3d869c146b8045b3e143e821eb4d58a39f64be","435124778d845003fbc7f7d0a756cf5b8929365b22dfa9c6afb7b23178c6dc6c","948f93cf2016b2d75c53605a44397983dfb7ba736d5a75e9866413d6af4f5e59","584bb7dd00ffcc99918e3aca639ea6eed99256bef0b9c70f36de255212e086b0","d55df0c04f6b9b73a531aab649fca0e79b6bb6412ff3898d3e60e4e74a1acd6e","d35be9e4af129629c0ba2fc57fe80e94b8e464de3d3b0e8ed621873b9c28c2c4","667d1590f5ed02745949cf1b4532bbf80597c7cd15ef8be42b06f035487cee66","6336e7ae85e7bd0116777d6de86f34c881b89d81083547a8e7a3e9c9ce686b89","33fd57356804dd8d377aa08d6552b66068530b8875fbc8df6ea469953365ab5a","bbc76fb94e6165f8f498c0a72b842e23cd67aa00cde22b8313bd54b3d93af193","5232f93ba808fd18230f4e0fae516fc0ea0ca09386c93ef19dfdddd59d82194b","807128c9ccc1e7868ef217b7076d1fb078030cb5923c9a9da6a02c48d78e9e18","29d46805aba9bd70c3b64aea22a15589fcaa12b2bed2ac9310a7f02b02363bac","0358f51804975d70e83daa425709e472bfadb8ff6627402723881d3299599732","38106630e61f7dff328af03a2f1ac3b46cf57d611e8ea7ec9ec26dccb582bbf7","bf9085ad9469ad87d48e6b294c26e8ebc358a653e25b7c6976065df658ab3a47","cad94e8c96269a3f9c80f09a284e6839c5d01eddd85c90f9efa8e9556f1834e1","8d52b292046eaf7bc4565cadd1c61edc952d075ab2889f41f6d63f10ea59ccb0","38e1f988ca8a3fd0ee2fad611f7f982e9530ae6973151bcacde7c6e7fb04bea5","383f07a2a1fb51cb6fc8265a63eaade643135379374afa7166e3b84b063cd2fb","8e1ed0d99df8d05be264740e2121e574a174e1a60544ef669df3c8a6a4788290","21477f9ec750fb8f9b1fece228bfeeb17b85d767ae9168f71dfe3b574bc2c4b8","29ab9f8d2f84b5f84584ca6ec50535d5ebc34245d45cef32931ee8b4cced4ea3","e0066d0cec0f1194361302cf52abf2e71c0af898eed09ec687d4a34d7b89389c","d4b61bbee55cc1f91616b64937233522f29b6034304440a97344766e58d81224","484c61ffe28d13086dcbadc5371355a457e75a375a1f21649d87209c7da3f5ad","d6a5c17ef46bb6832efa4c7ed3fabf666bed91f7b1f913ef9f9437de72f9f45f","df51929c4b53d6f8740927d77f7bf415d026812a80ff4b03cfa24e9962aab30e","79d3f73e515450fb3e71721e13859666a2fd1dee8d2a4dbd51668eeceb0b5e1e","08a1d8e1474dd44bf89e4fd47ca3fd1c0f6e95d9e74413d95e360ac331915601","71257f1fd9c2606a8db9e614394e154d1b7175b1aab178ff7850cce0f383b0b7","dbf6e52d440f8495adf5f9d46f603ecf7e007b7032542e93a578748948d339cd","f5146fc906ed4a1ff094cf779c438cdb62699836ed52d35d68cdf8ffa33d4f17","c488375c6eddabce83a48132ae081c13ce049163694aee72205716070cdaf2d4","99471216f9a6bbdbd922ce5c3abab16a01f525c04b8565802ba7e2f741ed66ba","699f82d62f80defba3f24f8035fdd7848ce59819b7e92be1c21203784f989880","d6b416da43b620809c3802863ff9fc327fd93a27596b8297e3c11b5babee7c2d","54f654d70f99e22ab62bc368214dbffab229aaa05c0854844e092fc0249b941e","8dccc7b5bc97ef722f7cdc7a98052f604e97ce3d8e35ec3ef71ada72f8dde961","13d642fbe80631856021490bde7f51f7a3a3276e12c6d05c22f30d9cb0da0eff","60427cfa4f690de417382f75e3726d6afa5c539bff1a20f02f02d71a039c4583","06bf2eecd428a3686a630d89a8e79d2bdd1e4db12f8bcc494142fb5f1ceae713","df9310969cfc0d2ffee1c61f0a868c1c563b6238e38e87391dcd7a4a1252ed15","784bddc4118d0bd1a43f1ce8db89da23012b77d23ce54555c033925b146b979c","bfa0b14605126912c31bd10b294fc0af76f5af2a0278e899bb566a6897ad8559","2422d0d7402dc5982f9a813362f4670d03fbc20bf9c5e016cb0ad445b80e029d","07ca7906cd7ebb46a93f2216b2bf1ac94d43a35be2935804b5e346536c4f4cbe","2f6de3568f38b279d342e7a317e423fb8e5582c0ae68ee83bf8c3cb4ac4cf403","fa445158252924fc86902f4c0ad01a0fa4c3839146ab7b9c394e5b9e5e86c1c2","f91d90099c1d521d09f038a8d683400a99ba2b72ef837b3d41f97a7ddb981c8d","7b9b9606bc4ab60e04277fb97a7ce44757271aea1b7596adb82fe35e33d21bc3","713ea0db78827a08d797bd5ccec11686cca9e5831cbafe68a82e5ce908a292d6",{"version":"ad68d5ad990711f7828c681c2d94294957e774b8b305b171fe07403e95df8cc0","affectsGlobalScope":true},"ae77d81a5541a8abb938a0efedf9ac4bea36fb3a24cc28cfa11c598863aba571","160b24efb5a868df9c54f337656b4ef55fcbe0548fe15408e1c0630ec559c559","6e00a3409993b7ef8a7f0a1ba482012a00cb1361949593a265cc074399519f7c","104c67f0da1bdf0d94865419247e20eded83ce7f9911a1aa75fc675c077ca66e","cc0d0b339f31ce0ab3b7a5b714d8e578ce698f1e13d7f8c60bfb766baeb1d35c","f9e22729fa06ed20f8b1fe60670b7c74933fdfd44d869ddfb1919c15a5cf12fb","5fc5e4fbc31a98937983ddc7a0692a9d6559302695a4cc21d137519795bea096","42baf4ca38c38deaf411ea73f37bc39ff56c6e5c761a968b64ac1b25c92b5cd8","d7dbe0ad36bdca8a6ecf143422a48e72cc8927bab7b23a1a2485c2f78a7022c6","8718fa41d7cf4aa91de4e8f164c90f88e0bf343aa92a1b9b725a9c675c64e16b","f992cd6cc0bcbaa4e6c810468c90f2d8595f8c6c3cf050c806397d3de8585562",{"version":"4a2c144ea6f441e9616ec77fe9b1009b0cdf6db0cd9727b8d99623975cd6c693","affectsGlobalScope":true},"f4584e95c63371b5d507749924d94e324c7e041f964975a92e7c8a1abc840328","d3f2d715f57df3f04bf7b16dde01dec10366f64fce44503c92b8f78f614c1769","b78cd10245a90e27e62d0558564f5d9a16576294eee724a59ae21b91f9269e4a","dcc9081d68c2ade5c51ac7bf5f37cce630359408e713999269b77f611a30d871","2f5747b1508ccf83fad0c251ba1e5da2f5a30b78b09ffa1cfaf633045160afed",{"version":"50072f976cfa86af1a3044f55cd729d992abe39222d2f6cdf929266c77a42b0b","affectsGlobalScope":true},"689be50b735f145624c6f391042155ae2ff6b90a93bac11ca5712bc866f6010c","0504070e7eaba788f5d0d5926782ed177f1db01cee28363c488fae94950c0bbc","117ffeecf6c55e25b6446f449ad079029b5e7317399b0a693858faaaea5ca73e","0dc6940ff35d845686a118ee7384713a84024d60ef26f25a2f87992ec7ddbd64","b71c603a539078a5e3a039b20f2b0a0d1708967530cf97dec8850a9ca45baa2b","d2a38ad7bb4676e7fd5d058a08105d81ac232c363ee56be0b401fc277d50dbb1","2ac2e08e0d0ed266849cb9da521c3be170a8bc111d25eeeb668c7dbf0ac4171a","34118be360cdd3381bbebbfd4b093c394460c8fc5df40688d58f45d86ab1448b","5c45abf1e13e4463eacfd5dedda06855da8748a6a6cb3334f582b52e219acc04","6847334317c1bc1e6fc4b679b0095bbd2b6ee3b85fe3f26fc26bac462f68ef5e","2125380d127f602090671355ecc9f021caf3af71b79c7c9fbc8cfd9cfec45b10","6fbd58e4015b9ae31ea977d4d549eb24a1102cc798b57ec5d70868b542c06612","c269a12e83c5ffc0332b1f245008e4e621e483dd2f8b9b77fc6a664fcde4969d","2a7ad1b3e7a4d6d1f1553dbe7adc3a551fd9e89e9476be189cc7a4656434fcd0","f6e181e29e741335deaba1ee7725b870195530feb6473207cf7b113537f9f006","c5030b12bdf83822f84e9c75a72aa1e472ddeae31d601224682148e94ddbab79","e9cb1d36a841514dc4fb5467fc4877b7fe5a0028744f304579ca2ba5c9568a22","7b9073ff2479acee0f3a209b0347b1cdbba346f30e7a8b1bb6313efc0858d256",{"version":"62d672ea9241ab3ebf5fb5ccc2a7c7606afe21620a86e1fcb42cf0126f6de473","affectsGlobalScope":true},"59168b33ba10062538dfb2ffe2bf9a22db5efee87abc7496c25018561afa8835","68cc8d6fcc2f270d7108f02f3ebc59480a54615be3e09a47e14527f349e9d53e","3eb11dbf3489064a47a2e1cf9d261b1f100ef0b3b50ffca6c44dd99d6dd81ac1","9b792a2f6ce65a166cda560290a73583284d6eb74e8ee5d2c260f25b56fb2b1f","72dff7d18139f0d579db7e4b904fb39f5740423f656edc1f84e4baa936b1fac0","febcc45f9517827496659c229a21b058831eef4cf9b71b77fd9a364ae12c3b9e","f2a60d253f7206372203b736144906bf135762100a2b3d1b415776ebf6575d07",{"version":"fa4546e9b67dbdcc0fa8d8653c6b89d49b9e7b637b3340bea78107ca161595fa","affectsGlobalScope":true},"9dffc5c0859e5aeba5e40b079d2f5e8047bdff91d0b3477d77b6fb66ee76c99d","1f68ab0e055994eb337b67aa87d2a15e0200951e9664959b3866ee6f6b11a0fe","446b5dbbcbd8b9b1676f0ed77cb6bcd0d3adec82feddfd2f9d99ce9174126bd3","958a27d41459d5ddd063395939f3bb0d7ec572abb0910a7e08a78449c373a5e5","ec23015a76ece38b793e11e06076a845dc0fbd03aa0f17fbec6ee79c4132aa23","19f1159e1fa24300e2eaf72cb53f0815f5879ec53cad3c606802f0c55f0917e9","963d59066dd6742da1918a6213a209bcc205b8ee53b1876ee2b4e6d80f97c85e","fd326577c62145816fe1acc306c734c2396487f76719d3785d4e825b34540b33","afe73051ff6a03a9565cbd8ebb0e956ee3df5e913ad5c1ded64218aabfa3dcb5","d5cc62a1ea18ae21ed31be6d7ebd6e2d16c7d0d04230a77e3d6f297c1467d1b8","3f841292a135503a4cc1a9029af59dae135595810cfad5ca62ec1b2ad9846e8e","7e8d3f08435ad2cefe67f58182618bfc9a0a29db08cf2544b94cbcae754a9bd9","6ec1175abe593c70bccb98035b7f5949241624a27641f35665f2bf891a411c06","035b066d64d4d8de14908123f5e36a647688a428891748bf96b50312580d3049","32c82ad8bb67e92ab093e6fb20dbd84e3c3dcf1737645c9612035d41e17ce334",{"version":"fab7e642480027e174565250294ba8eeeacbf7faa31c565472384bbad2deba01","affectsGlobalScope":true},"9e4b070b543d91d0b321a481e1119e99bb8f136f4ef271d7b5ba264919fc32e2","89121c1bf2990f5219bfd802a3e7fc557de447c62058d6af68d6b6348d64499a","79b4369233a12c6fa4a07301ecb7085802c98f3a77cf9ab97eee27e1656f82e6",{"version":"271cde49dfd9b398ccc91bb3aaa43854cf76f4d14e10fed91cbac649aa6cbc63","affectsGlobalScope":true},"2bcecd31f1b4281710c666843fc55133a0ee25b143e59f35f49c62e168123f4b","a6273756fa05f794b64fe1aff45f4371d444f51ed0257f9364a8b25f3501915d","9c4e644fe9bf08d93c93bd892705842189fe345163f8896849d5964d21b56b78","25d91fb9ed77a828cc6c7a863236fb712dafcd52f816eec481bd0c1f589f4404","4cd14cea22eed1bfb0dc76183e56989f897ac5b14c0e2a819e5162eafdcfe243","8d32432f68ca4ce93ad717823976f2db2add94c70c19602bf87ee67fe51df48b",{"version":"0bd5e7096c7bc02bf70b2cc017fc45ef489cb19bd2f32a71af39ff5787f1b56a","affectsGlobalScope":true},"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","9ed09d4538e25fc79cefc5e7b5bfbae0464f06d2984f19da009f85d13656c211","b1bf87add0ccfb88472cd4c6013853d823a7efb791c10bb7a11679526be91eda",{"version":"b59234a9a1f790bb32f382fa1e22789983e85d724d6d569dca68d0bd42032803","affectsGlobalScope":true},"a7ca2a9e61286d74bc37fe64e5dcd7da04607f7f5432f7c651b47b573fc76cef","ee65fe452abe1309389c5f50710f24114e08a302d40708101c4aa950a2a7d044","8b32d4ac53ebe9c98c51593282052b2d9ad589788b254d573ed357faec6c8b5a","035a5df183489c2e22f3cf59fc1ed2b043d27f357eecc0eb8d8e840059d44245","a4809f4d92317535e6b22b01019437030077a76fec1d93b9881c9ed4738fcc54","5f53fa0bd22096d2a78533f94e02c899143b8f0f9891a46965294ee8b91a9434","cdcc132f207d097d7d3aa75615ab9a2e71d6a478162dde8b67f88ea19f3e54de","0d14fa22c41fdc7277e6f71473b20ebc07f40f00e38875142335d5b63cdfc9d2","c085e9aa62d1ae1375794c1fb927a445fa105fed891a7e24edbb1c3300f7384a","f315e1e65a1f80992f0509e84e4ae2df15ecd9ef73df975f7c98813b71e4c8da","5b9586e9b0b6322e5bfbd2c29bd3b8e21ab9d871f82346cb71020e3d84bae73e","3e70a7e67c2cb16f8cd49097360c0309fe9d1e3210ff9222e9dac1f8df9d4fb6","ab68d2a3e3e8767c3fba8f80de099a1cfc18c0de79e42cb02ae66e22dfe14a66","d96cc6598148bf1a98fb2e8dcf01c63a4b3558bdaec6ef35e087fd0562eb40ec",{"version":"46894b2a21a60f8449ca6b2b7223b7179bba846a61b1434bed77b34b2902c306","affectsGlobalScope":true},"117816592ad26d78651f5e8322ea571fd8d413d8d3b7d79944d27468e2636989","a8d630427635fa316e57fa4949132acde9cf23aa067220bffea30612497824cc","7a1dd1e9c8bf5e23129495b10718b280340c7500570e0cfe5cffcdee51e13e48","3411c785dbe8fd42f7d644d1e05a7e72b624774a08a9356479754999419c3c5a","8fb8fdda477cd7382477ffda92c2bb7d9f7ef583b1aa531eb6b2dc2f0a206c10","66995b0c991b5c5d42eff1d950733f85482c7419f7296ab8952e03718169e379","33f3795a4617f98b1bb8dac36312119d02f31897ae75436a1e109ce042b48ee8","2850c9c5dc28d34ad5f354117d0419f325fc8932d2a62eadc4dc52c018cd569b","c753948f7e0febe7aa1a5b71a714001a127a68861309b2c4127775aa9b6d4f24","3e7a40e023e1d4a9eef1a6f08a3ded8edacb67ae5fce072014205d730f717ba5","a77be6fc44c876bc10c897107f84eaba10790913ebdcad40fcda7e47469b2160","382100b010774614310d994bbf16cc9cd291c14f0d417126c7a7cfad1dc1d3f8","91f5dbcdb25d145a56cffe957ec665256827892d779ef108eb2f3864faff523b","4fdf56315340bd1770eb52e1601c3a98e45b1d207202831357e99ce29c35b55c","927955a3de5857e0a1c575ced5a4245e74e6821d720ed213141347dd1870197f","be6fd74528b32986fbf0cd2cfa9192a5ed7f369060b32a7adcb0c8d055708e61","03c258e060b7da220973f84b89615e4e9850e9b5d30b3a8e4840b3e3268ae8eb","fd0589ca571ad090b531d8c095e26caa53d4825c64d3ff2b2b1ab95d72294175",{"version":"669843ecafb89ae1e944df06360e8966219e4c1c34c0d28aa2503272cdd444a7","affectsGlobalScope":true},"01874fd864224a92c6e93a431f432ee6a2bb30c9da41bbb9b3030fd6891fa032","96d14f21b7652903852eef49379d04dbda28c16ed36468f8c9fa08f7c14c9538","0bf811dcbddc95e2551f704cfd2afc267bf619f8b8f2b7bdbb94df96ec3cbfe3","fec943fdb3275eb6e006b35e04a8e2e99e9adf3f4b969ddf15315ac7575a93e4","b8442e9db28157344d1bc5d8a5a256f1692de213f0c0ddeb84359834015a008c","458111fc89d11d2151277c822dfdc1a28fa5b6b2493cf942e37d4cd0a6ee5f22","da2b6356b84a40111aaecb18304ea4e4fcb43d70efb1c13ca7d7a906445ee0d3","187119ff4f9553676a884e296089e131e8cc01691c546273b1d0089c3533ce42","febf0b2de54781102b00f61653b21377390a048fbf5262718c91860d11ff34a6","6f294731b495c65ecf46a5694f0082954b961cf05463bea823f8014098eaffa0","0aaef8cded245bf5036a7a40b65622dd6c4da71f7a35343112edbe112b348a1e","00baffbe8a2f2e4875367479489b5d43b5fc1429ecb4a4cc98cfc3009095f52a","68a0d0c508e1b6d8d23a519a8a0a3303dc5baa4849ca049f21e5bad41945e3fc","3c92b6dfd43cc1c2485d9eba5ff0b74a19bb8725b692773ef1d66dac48cda4bd","b03afe4bec768ae333582915146f48b161e567a81b5ebc31c4d78af089770ac9","df996e25faa505f85aeb294d15ebe61b399cf1d1e49959cdfaf2cc0815c203f9","4f6a12044ee6f458db11964153830abbc499e73d065c51c329ec97407f4b13dd","9f5facc676e5b68d245c6cc8dde362af523b72a1c48322ae074572281dbedcf5","7605dd065ecbd2d8ff5f80a0b3813fc163ed593f4f24f3b6f6a7e98ac0e2157f","e94978cb99bbc9a309e8a983551bd1c5980b360a4cc0232e5a8c3eed66fb4359","5c50a61c09fa0ddd49c51d7d5dbb8b538f6afec86572ec8cb31c3d176f073f13","5f38875f76655b0854a2aae14366917ce964465e04a03549196acca471708569","34c9586a50d2caca5c57c5b9e802a46b25b97e8e45a450c19974eed661664713","1463e5003d2aa04b7ca10995b449907988d193a5461b2c240fbe15c41b2356ba","9beb1014927166017e49ed264a564350d28e8bc48b84044efc763b7e213709cb","d20ce755a4a75cf7817a2132b7d0eb69d22cc6d094fe89389d8601f48fcb1ba9","804ac921610cb59549fb70a25a60d6e074fa14f3c0b6fdfa1abe32db71889e40","0e60e0cbf2283adfd5a15430ae548cd2f662d581b5da6ecd98220203e7067c70","5339f84dfcb7b04aa1c2b4d7713d6128039381447f07abc2e48d36685e2eef44","fb35a61a39c933d31b5b2549d906b2c932a1486622958586f662dbd4b2fe72e6","24e2728268be1ad2407bab004549d2753a49b2acb0f117a04c4e28ffb3ecdd4f","aff159b14eba59afe98a88fe6f57881ba02895fb9763512dda9083497bdcd0e6","6eb0f0a3e3774e1bde7e234eb8f4df875d1588de267ed91dce7aff84c4e5cf1e","1a83b9666a25134feb225c42a615f47518c073546e5338e8a1b49fd982c4c7d6","865c35f7d1a47be9b9cc3f807b01996bbd357d54f04179fb6b2517a47c6aee4e","dbca55391ae7dc370e10e2b5367af19a376267d8e7abf9eddcadb19293711396","46afbf46c3d62eac2afead3a2011d506637bf4f2c05e1fd64bbf7e2bb2947b7c","02f634f868780eaaff5e2d3fb4570dac8e7f018a8650bb9a0ac1deb4915df8d1","85d3aa95b0086752d2f7784d2bdaeb38f99c3cf6c35bee861702beb68556cb9e","fbed01082a956f6da070f76245a7838c0de90032e75cc1568d76c834df6eacb1","6d09838b65c3c780513878793fc394ae29b8595d9e4729246d14ce69abc71140","202f8582ee3cd89e06c4a17d8aabb925ff8550370559c771d1cc3ec3934071c2","f313731860257325f13351575f381fef333d4dfe30daf5a2e72f894208feea08","951b37f7d86f6012f09e6b35f1de57c69d75f16908cb0adaa56b93675ea0b853","a45efe8e9134ef64a5e3825944bc16fffaf130b82943844523d7a7f7c1fd91b2","969aa6509a994f4f3b09b99d5d29484d8d52a2522e133ef9b4e54af9a3e9feaf","f1ceb4cbff7fc122b13f8a43e4d60e279a174c93420b2d2f76a6c8ce87934d7f","45b6a651b5e502cdfa93dc2f23779752def4ada323ebcfc34e4a4d22e9589971","54f1d17f9f484650cd49b53d9a6ba75593955a9ead093628888a37407b6ecd51","b0f9ef6423d6b29dde29fd60d83d215796b2c1b76bfca28ac374ae18702cfb8e","169cc96316cacf8b489aaab4ac6bcef7b33e8779a8902bce57c737b4aa372d16","736097ddbb2903bef918bb3b5811ef1c9c5656f2a73bd39b22a91b9cc2525e50","4340936f4e937c452ae783514e7c7bbb7fc06d0c97993ff4865370d0962bb9cf","61c8bc34c74a36193673b422d2f405db71d653335e7a59b9225dc1fec6fa6ef5","8b5402ae709d042c3530ed3506c135a967159f42aed3221267e70c5b7240b577","6825eb4d1c8beb77e9ed6681c830326a15ebf52b171f83ffbca1b1574c90a3b0","1741975791f9be7f803a826457273094096e8bba7a50f8fa960d5ed2328cdbcc","6ec0d1c15d14d63d08ccb10d09d839bf8a724f6b4b9ed134a3ab5042c54a7721","75dabc9afdb451a85e6d46e9ca65ec82ead2256476c0686f671f3421923667a7","ddfc215bfbddf5854d80ab8fb0256bd802f2a8acb6be62f9e630041266d56cd5","2c3bcb8a4ea2fcb4208a06672af7540dd65bf08298d742f041ffa6cbe487cf80","1cce0460d75645fc40044c729da9a16c2e0dabe11a58b5e4bfd62ac840a1835d","c784a9f75a6f27cf8c43cc9a12c66d68d3beb2e7376e1babfae5ae4998ffbc4a","feb4c51948d875fdbbaa402dad77ee40cf1752b179574094b613d8ad98921ce1","a6d3984b706cefe5f4a83c1d3f0918ff603475a2a3afa9d247e4114f18b1f1ef","b457d606cabde6ea3b0bc32c23dc0de1c84bb5cb06d9e101f7076440fc244727","9d59919309a2d462b249abdefba8ca36b06e8e480a77b36c0d657f83a63af465","9faa2661daa32d2369ec31e583df91fd556f74bcbd036dab54184303dee4f311","b08de5693ec0119e033ced692f3ad0c0449c7331fd1d84033ea9b4b22e7f269c","22293bd6fa12747929f8dfca3ec1684a3fe08638aa18023dd286ab337e88a592","e8ea5b1af91c43d23ef9725a5f811c57baea20eebb42a7ff0c711a8aec93916f","8964d95b7c508c9f81172453adfe5b5ebde521dce7db81ea93c4085e1bd9d44c","ea49c58e2baeb4e47a099f58d0277425c6dccafd2ae8f10a5f6d58abd341e035","916be7d770b0ae0406be9486ac12eb9825f21514961dd050594c4b250617d5a8","fc37aca06f6b8b296c42412a2e75ab53d30cd1fa8a340a3bb328a723fd678377","5f2c582b9ef260cb9559a64221b38606378c1fabe17694592cdfe5975a6d7efa",{"version":"fbb0e0702158969fb0c0d8b919686026b8a1ee88a4c1bd085aedb7a59ae83908","affectsGlobalScope":true},"5c501070be863bf1e02a000b308c350c4179a59b429f83380fc82c817e7e413f","9c4b25ca99b905f11599dd30dc7f20819cd8a71618c06a4e6db58f74fb775879","03c92769f389dbd9e45232f7eb01c3e0f482b62555aaf2029dcbf380d5cee9e4","feac0f8faa1eee576584b1a20fae6d5ac254ffd4ac1227fab5da2f44a97068a6","d7c30ea636d7d7cbeba0795baa8ec1bbd06274bd19a23ec0d7c84d0610a5f0c7","c271193e426325d9acab2f99997bb9f5f2dff850ec8c7c011c5abafe5af83b5f","70a29119482d358ab4f28d28ee2dcd05d6cbf8e678068855d016e10a9256ec12","869ac759ae8f304536d609082732cb025a08dcc38237fe619caf3fcdd41dde6f","0ea900fe6565f9133e06bce92e3e9a4b5a69234e83d40b7df2e1752b8d2b5002","e5408f95ca9ac5997c0fea772d68b1bf390e16c2a8cad62858553409f2b12412","3c1332a48695617fc5c8a1aead8f09758c2e73018bd139882283fb5a5b8536a6","9260b03453970e98ce9b1ad851275acd9c7d213c26c7d86bae096e8e9db4e62b","083838d2f5fea0c28f02ce67087101f43bd6e8697c51fd48029261653095080c","969132719f0f5822e669f6da7bd58ea0eb47f7899c1db854f8f06379f753b365","94ca5d43ff6f9dc8b1812b0770b761392e6eac1948d99d2da443dc63c32b2ec1","2cbc88cf54c50e74ee5642c12217e6fd5415e1b35232d5666d53418bae210b3b","ccb226557417c606f8b1bba85d178f4bcea3f8ae67b0e86292709a634a1d389d","5ea98f44cc9de1fe05d037afe4813f3dcd3a8c5de43bdd7db24624a364fad8e6","5260a62a7d326565c7b42293ed427e4186b9d43d6f160f50e134a18385970d02","0b3fc2d2d41ad187962c43cb38117d0aee0d3d515c8a6750aaea467da76b42aa","ed219f328224100dad91505388453a8c24a97367d1bc13dcec82c72ab13012b7","6847b17c96eb44634daa112849db0c9ade344fe23e6ced190b7eeb862beca9f4","d479a5128f27f63b58d57a61e062bd68fa43b684271449a73a4d3e3666a599a7","6f308b141358ac799edc3e83e887441852205dc1348310d30b62c69438b93ca0",{"version":"d204bd5d20ca52a553f7ba993dc2a422e9d1fce0b8178ce2bfe55fbd027c11ae","affectsGlobalScope":true},"7ed8a817989d55241e710dd80af79d02004ca675ad73d92894c0d61248ad423d","e96bf049eddf63afdeb475f9fcad4f87e43a400a53ec7dfba3fe62911878e821","7ac7ef12f7ece6464d83d2d56fea727260fb954fdd51a967e94f97b8595b714b","14517e48b73c838782284d6a55b9966df57cccf8c257e70ee6eb382984ee598c","1d4bc73751d6ec6285331d1ca378904f55d9e5e8aeaa69bc45b675c3df83e778","1cfafc077fd4b420e5e1c5f3e0e6b086f6ea424bf96a6c7af0d6d2ef2b008a81","8017277c3843df85296d8730f9edf097d68d7d5f9bc9d8124fcacf17ecfd487e","5aca5a3bc07d2e16b6824a76c30378d6fb1b92e915d854315e1d1bd2d00974c9","199f9ead0daf25ae4c5632e3d1f42570af59685294a38123eef457407e13f365","c73834a2aee5e08dea83bd8d347f131bc52f9ec5b06959165c55ef7a544cae82","4ef960df4f672e93b479f88211ed8b5cfa8a598b97aafa3396cacdc3341e3504",{"version":"4765f14e110016c2e09d6e9f507503f815dca4adcb67b5b47bb7a7938874691e","affectsGlobalScope":true},"5b5337f28573ffdbc95c3653c4a7961d0f02fdf4788888253bf74a3b5a05443e","9871b7ee672bc16c78833bdab3052615834b08375cb144e4d2cba74473f4a589","c863198dae89420f3c552b5a03da6ed6d0acfa3807a64772b895db624b0de707","8b03a5e327d7db67112ebbc93b4f744133eda2c1743dbb0a990c61a8007823ef","86c73f2ee1752bac8eeeece234fd05dfcf0637a4fbd8032e4f5f43102faa8eec","42fad1f540271e35ca37cecda12c4ce2eef27f0f5cf0f8dd761d723c744d3159","ff3743a5de32bee10906aff63d1de726f6a7fd6ee2da4b8229054dfa69de2c34","83acd370f7f84f203e71ebba33ba61b7f1291ca027d7f9a662c6307d74e4ac22","1445cec898f90bdd18b2949b9590b3c012f5b7e1804e6e329fb0fe053946d5ec","0e5318ec2275d8da858b541920d9306650ae6ac8012f0e872fe66eb50321a669","cf530297c3fb3a92ec9591dd4fa229d58b5981e45fe6702a0bd2bea53a5e59be","c1f6f7d08d42148ddfe164d36d7aba91f467dbcb3caa715966ff95f55048b3a4","f4e9bf9103191ef3b3612d3ec0044ca4044ca5be27711fe648ada06fad4bcc85","0c1ee27b8f6a00097c2d6d91a21ee4d096ab52c1e28350f6362542b55380059a","7677d5b0db9e020d3017720f853ba18f415219fb3a9597343b1b1012cfd699f7","bc1c6bc119c1784b1a2be6d9c47addec0d83ef0d52c8fbe1f14a51b4dfffc675","52cf2ce99c2a23de70225e252e9822a22b4e0adb82643ab0b710858810e00bf1","770625067bb27a20b9826255a8d47b6b5b0a2d3dfcbd21f89904c731f671ba77","d1ed6765f4d7906a05968fb5cd6d1db8afa14dbe512a4884e8ea5c0f5e142c80","799c0f1b07c092626cf1efd71d459997635911bb5f7fc1196efe449bba87e965","2a184e4462b9914a30b1b5c41cf80c6d3428f17b20d3afb711fff3f0644001fd","9eabde32a3aa5d80de34af2c2206cdc3ee094c6504a8d0c2d6d20c7c179503cc","397c8051b6cfcb48aa22656f0faca2553c5f56187262135162ee79d2b2f6c966","a8ead142e0c87dcd5dc130eba1f8eeed506b08952d905c47621dc2f583b1bff9","a02f10ea5f73130efca046429254a4e3c06b5475baecc8f7b99a0014731be8b3","c2576a4083232b0e2d9bd06875dd43d371dee2e090325a9eac0133fd5650c1cb","4c9a0564bb317349de6a24eb4efea8bb79898fa72ad63a1809165f5bd42970dd","f40ac11d8859092d20f953aae14ba967282c3bb056431a37fced1866ec7a2681","cc11e9e79d4746cc59e0e17473a59d6f104692fd0eeea1bdb2e206eabed83b03","b444a410d34fb5e98aa5ee2b381362044f4884652e8bc8a11c8fe14bbd85518e","c35808c1f5e16d2c571aa65067e3cb95afeff843b259ecfa2fc107a9519b5392","14d5dc055143e941c8743c6a21fa459f961cbc3deedf1bfe47b11587ca4b3ef5","a3ad4e1fc542751005267d50a6298e6765928c0c3a8dce1572f2ba6ca518661c","f237e7c97a3a89f4591afd49ecb3bd8d14f51a1c4adc8fcae3430febedff5eb6","3ffdfbec93b7aed71082af62b8c3e0cc71261cc68d796665faa1e91604fbae8f","662201f943ed45b1ad600d03a90dffe20841e725203ced8b708c91fcd7f9379a","c9ef74c64ed051ea5b958621e7fb853fe3b56e8787c1587aefc6ea988b3c7e79","2462ccfac5f3375794b861abaa81da380f1bbd9401de59ffa43119a0b644253d","34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","85f8ebd7f245e8bf29da270e8b53dcdd17528826ffd27176c5fc7e426213ef5a","ddef25f825320de051dcb0e62ffce621b41c67712b5b4105740c32fd83f4c449","1b3dffaa4ca8e38ac434856843505af767a614d187fb3a5ef4fcebb023c355aa","ab82804a14454734010dcdcd43f564ff7b0389bee4c5692eec76ff5b30d4cf66","1f4ae755492a669b317903a6b1664cb7af3fe0c3d1eec6447f4e95a80616d15a","6dd20f5b39d29f0dabf7798cdbf772c03c5d6721e60a09e7706afddf5599fad9","a0371a3673b043959143ecba86874ad0d53b5241189c4321cafb0b7f0cb8198d","966e5379af55eb4be9366a43b5e589e82a77de5b4ee2eaf5dff84318b32546b6","24bd01a91f187b22456c7171c07dbf44f3ad57ebd50735aab5c13fa23d7114b4","4738eefeaaba4d4288a08c1c226a76086095a4d5bcc7826d2564e7c29da47671","306ddef3b9b2b1607fd3b093a3b169f19c704c6451a42a7245995c37652935aa","8f75e211a2e83ff216eb66330790fb6412dcda2feb60c4f165c903cf375633ee","dbe69644ab6e699ad2ef740056c637c34f3348af61d3764ff555d623703525db","2c2a746435ff3d3ec4ef1006d51922ed71d969e16a8c949ab3251e3f7db5f19d","1b096ca6b209d1fed9ce68edd110ff6de8bec4fab2689d2adc481ffc1b1dc20b","9c02f12da30d30dd5f5ccaeedfb9b925ed4e5114059e9be6ed2ecf87a492fd16","8c8f8e816a38f1a0cc2dd3813d3bede2d773df36e72f4cb55d9daabd22016925","4e22b9ea2805fec5f3c120146a690e5604a3117dbdee648c85393f58422eec16","ee9ac9f006589ed36c7229b3c1614bd339d1fe009cb20a85d16b4f60f0c5cddf","61f41da9aaa809e5142b1d849d4e70f3e09913a5cb32c629bf6e61ef27967ff7","7d2b7fe4adb76d8253f20e4dbdce044f1cdfab4902ec33c3604585f553883f7d","9eb48a18d9d78d2dc2683bfb79d083954d13cf066d9579cbdb8652b86601fbd7","2f4f96af192dc44a12bf238bcc08ebac498c9073f459740f6497fe0f8e1a432c","c5b3da7e2ecd5968f723282aba49d8d1a2e178d0afe48998dad93f81e2724091","efd2860dc74358ffa01d3de4c8fa2f966ae52c13c12b41ad931c078151b36601","09acacae732e3cc67a6415026cfae979ebe900905500147a629837b790a366b3","72154a9d896b0a0aed69fd2a58aa5aa8ab526078a65ff92f0d3c2237e9992610","99236ea5c4c583082975823fd19bcce6a44963c5c894e20384bc72e7eccf9b03","f6688a02946a3f7490aa9e26d76d1c97a388e42e77388cbab010b69982c86e9e","b027979b9e4e83be23db2d81e01d973b91fefe677feb93823486a83762f65012","346599d03c24e6a35ae9e25b639e63c351dc8c7146019648f0ced0e710924073","2667c74200427135a2ff0a5f4f7cb6044bf483318a5c30e5d9eccdbfe372a529","f7163a5d37d21f636f6a5cd1c064ce95fada21917859a64b6cc49a8b6fd5c1a8","bae8d023ef6b23df7da26f51cea44321f95817c190342a36882e93b80d07a960","5d30d04a14ed8527ac5d654dc345a4db11b593334c11a65efb6e4facc5484a0e"],"root":[244],"options":{"allowSyntheticDefaultImports":true,"composite":true,"module":99,"skipLibCheck":true},"fileIdsList":[[346,363,375,406,661],[374,375,376,661],[346,373,406,661],[346,361,374,406,661],[352,363,364,365,366,368,369,370,373,374,375,376,377,406,661],[362,363,366,373,374,406,661],[661],[346,661],[346,365,366,373,406,661],[346,363,366,368,373,376,406,444,661],[346,366,369,372,374,406,661],[444,661],[346,363,366,369,370,374,406,661],[346,364,365,373,374,376,406,661],[346,365,366,369,371,406,444,661],[346,378,406,414,424,437,438,439,441,661],[347,366,378,406,414,424,425,434,435,437,438,439,441,442,443,661],[346,378,406,414,438,442,661],[374,378,406,425,435,436,438,439,440,661],[346,378,414,425,435,438,439,440,441,661],[346,378,406,414,425,436,437,438,439,441,442,661],[346,361,378,406,414,425,435,436,437,439,441,661],[346,361,378,414,438,441,661],[346,352,414,424,434,661],[406,407,661],[408,661],[352,407,408,409,410,411,412,413,661],[346,406,444,661],[414,417,661],[352,415,416,417,418,419,420,421,422,423,661],[380,414,661],[417,661],[346,406,414,661],[414,661],[352,661],[406,661],[352,426,427,428,429,430,431,432,433,661],[385,661],[346,414,661],[384,661],[401,661],[349,350,351,661],[347,348,661],[346,355,661],[352,353,354,355,356,357,358,359,360,379,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,401,402,403,404,405,661],[382,661],[380,381,661],[378,661],[400,661],[232,661],[534,661],[659,661],[653,655,661],[643,653,654,656,657,658,661],[653,661],[643,653,661],[644,645,646,647,648,649,650,651,652,661],[644,648,649,652,653,656,661],[644,645,646,647,648,649,650,651,652,653,654,656,657,661],[643,644,645,646,647,648,649,650,651,652,661],[170,497,661],[105,139,661],[445,446,447,448,661],[424,444,445,446,661],[232,233,234,235,236,661],[232,234,661],[139,661],[105,139,453,661],[96,139,661],[102,105,131,139,457,458,459,661],[131,139,467,661],[105,139,453,476,477,661],[105,661],[91,139,661],[483,661],[482,661],[488,661],[170,172,497,661],[169,170,171,497,661],[102,105,139,464,465,466,661],[454,465,467,475,661],[102,103,139,501,661],[103,139,661],[105,346,476,507,508,661],[512,661],[514,520,661],[515,516,517,518,519,661],[520,661],[525,661],[102,105,107,110,120,131,139,661],[529,661],[530,661],[536,539,661],[102,134,139,556,557,559,661],[558,661],[95,139,661],[102,139,661],[507,661],[102,105,106,110,116,131,139,245,469,472,477,478,505,506,661],[576,661],[564,566,567,568,569,570,571,572,573,574,575,576,661],[564,565,567,568,569,570,571,572,573,574,575,576,661],[565,566,567,568,569,570,571,572,573,574,575,576,661],[564,565,566,568,569,570,571,572,573,574,575,576,661],[564,565,566,567,569,570,571,572,573,574,575,576,661],[564,565,566,567,568,570,571,572,573,574,575,576,661],[564,565,566,567,568,569,571,572,573,574,575,576,661],[564,565,566,567,568,569,570,572,573,574,575,576,661],[564,565,566,567,568,569,570,571,573,574,575,576,661],[564,565,566,567,568,569,570,571,572,574,575,576,661],[564,565,566,567,568,569,570,571,572,573,575,576,661],[564,565,566,567,568,569,570,571,572,573,574,576,661],[564,565,566,567,568,569,570,571,572,573,574,575,661],[596,661],[589,661],[588,590,592,593,597,661],[590,591,594,661],[588,591,661],[590,592,594,661],[588,589,591,592,593,594,595,661],[588,594,661],[590,661],[120,139,598,661],[600,661],[606,661],[602,603,604,605,661],[607,608,661],[105,131,139,611,612,661],[53,661],[89,661],[90,95,123,661],[91,102,103,110,120,131,661],[91,92,102,110,661],[93,132,661],[94,95,103,111,661],[95,120,128,661],[96,98,102,110,661],[97,661],[98,99,661],[102,661],[100,102,661],[89,102,661],[102,103,104,120,131,661],[102,103,104,117,120,123,661],[87,90,136,661],[98,102,105,110,120,131,661],[102,103,105,106,110,120,128,131,661],[105,107,120,128,131,661],[53,54,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,661],[102,108,661],[109,131,136,661],[98,102,110,120,661],[111,661],[112,661],[89,113,661],[114,130,136,661],[115,661],[116,661],[102,117,118,661],[117,119,132,134,661],[90,102,120,121,122,123,661],[90,120,122,661],[120,121,661],[123,661],[124,661],[89,120,661],[102,126,127,661],[126,127,661],[95,110,120,128,661],[129,661],[110,130,661],[90,105,116,131,661],[95,132,661],[120,133,661],[109,134,661],[135,661],[90,95,102,104,113,120,131,134,136,661],[120,137,661],[139,616,618,622,623,624,625,626,627,661],[120,139,661],[102,139,616,618,619,621,628,661],[102,110,120,131,139,615,616,617,619,620,621,628,661],[120,139,618,619,661],[120,139,618,620,661],[139,616,618,619,621,628,661],[120,139,620,661],[102,110,120,128,139,617,619,621,661],[102,139,616,618,619,620,621,628,661],[102,120,139,616,617,618,619,620,621,628,661],[102,120,139,616,618,619,621,628,661],[105,120,139,621,661],[105,131,139,661],[634,661],[635,661],[476,636,637,661],[476,562,639,661],[105,476,630,636,661],[476,636,661],[105,476,661],[525,660,661,662],[520,525,661,666],[520,525,661],[521,522,523,524,661],[105,120,139,661],[661,674,713],[661,674,698,713],[661,713],[661,674],[661,674,699,713],[661,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712],[661,699,713],[103,120,139,463,661],[103,476,661],[105,139,472,474,661],[473,661],[474,661],[661,723],[471,609,661,718,720,724],[90,103,105,106,107,110,120,131,609,661,719,720,721,722],[90,103,661,719,720],[661,719],[661,724],[661,727,728],[170,497,661,727],[170,497,661,728],[661,734,735,736,737,738,739,740,741,742],[661,743],[128,139,661],[102,105,107,120,128,131,137,139,661],[661,746],[52,167,661],[50,51,661],[50,661],[532,538,661],[255,443,661],[248,249,255,256,661],[257,321,322,661],[248,255,257,661],[249,257,661],[248,250,251,252,255,257,260,261,661],[251,262,276,277,661],[248,255,260,261,262,661],[248,250,255,257,259,260,261,661],[248,249,260,261,262,661],[247,263,268,275,278,279,320,323,345,661],[248,661],[249,253,254,661],[249,253,254,255,256,258,269,270,271,272,273,274,661],[249,254,255,661],[249,661],[248,249,254,255,257,270,661],[255,661],[249,255,256,661],[253,255,661],[262,276,661],[248,250,251,252,255,260,661],[248,255,258,261,661],[251,259,260,261,264,265,266,267,661],[261,661],[248,250,255,257,259,261,661],[257,260,661],[257,661],[248,255,261,661],[249,255,260,271,661],[260,324,661],[257,261,661],[255,260,661],[260,661],[248,258,661],[248,255,661],[255,260,261,661],[280,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,661],[260,261,661],[250,255,661],[248,255,259,260,261,273,661],[248,250,255,261,661],[248,250,255,661],[281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,661],[273,281,661],[281,661],[248,255,257,260,280,281,661],[248,255,257,259,260,261,273,280,661],[536,661],[533,537,661],[545,661],[544,545,661],[544,661],[544,545,546,548,549,552,553,554,555,661],[545,549,661],[544,545,546,548,549,550,551,661],[544,549,661],[549,553,661],[545,546,547,661],[546,661],[544,545,549,661],[160,661],[158,160,661],[149,157,158,159,161,661],[147,661],[150,155,160,163,661],[146,163,661],[150,151,154,155,156,163,661],[150,151,152,154,155,163,661],[147,148,149,150,151,155,156,157,159,160,161,163,661],[163,661],[145,147,148,149,150,151,152,154,155,156,157,158,159,160,161,162,661],[145,163,661],[150,152,153,155,156,163,661],[154,163,661],[155,156,160,163,661],[148,158,661],[230,661],[535,661],[525,660,661],[145,661],[64,68,131,661],[64,120,131,661],[59,661],[61,64,128,131,661],[110,128,661],[59,139,661],[61,64,110,131,661],[56,57,60,63,90,102,120,131,661],[56,62,661],[60,64,90,123,131,139,661],[90,139,661],[80,90,139,661],[58,59,139,661],[64,661],[58,59,60,61,62,63,64,65,66,68,69,70,71,72,73,74,75,76,77,78,79,81,82,83,84,85,86,661],[64,71,72,661],[62,64,72,73,661],[63,661],[56,59,64,661],[64,68,72,73,661],[68,661],[62,64,67,131,661],[56,61,62,64,68,71,661],[90,120,661],[59,64,80,90,136,139,661],[175,225,661],[136,167,172,175,225,226,227,661],[136,167,172,175,225,226,661],[167,229,240,661],[235,237,661],[237,238,661],[231,237,239,661],[167,242,661],[167,661],[102,103,105,106,107,110,120,128,131,137,139,140,141,142,143,144,164,165,166,661],[140,166,661],[142,661],[140,661],[178,179,180,181,182,184,185,186,187,661],[180,181,661],[179,180,181,182,185,186,661],[179,184,661],[180,661],[179,181,183,184,188,661],[179,181,183,184,661],[180,183,661],[91,110,139,184,188,661],[219,661],[177,188,189,205,206,661],[188,189,661],[188,661],[177,188,189,205,661],[188,189,205,661],[177,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,661],[177,188,189,661],[189,205,661],[139,207,220,661],[221,661],[207,208,212,217,661],[207,217,661],[207,208,209,210,211,212,213,214,215,216,661],[139,176,217,218,222,223,661],[224,661],[173,174,661],[173,661],[167,168,228,241,243,661]],"referencedMap":[[376,1],[363,2],[374,3],[375,4],[378,5],[364,6],[367,7],[365,8],[377,9],[369,10],[370,7],[373,11],[368,12],[371,13],[366,14],[372,15],[442,16],[444,17],[437,18],[425,7],[441,19],[436,20],[440,21],[438,22],[439,23],[435,24],[348,7],[408,25],[412,26],[409,26],[413,26],[410,26],[414,27],[411,26],[407,28],[418,7],[421,29],[419,7],[422,29],[424,30],[415,31],[423,32],[417,33],[420,34],[416,35],[431,34],[433,8],[426,36],[428,36],[434,37],[429,7],[427,36],[432,34],[430,34],[392,7],[394,7],[386,7],[395,38],[393,39],[399,34],[396,7],[387,7],[385,40],[398,12],[384,7],[402,41],[397,7],[403,36],[351,7],[352,42],[349,43],[350,7],[353,8],[354,8],[355,8],[356,8],[360,12],[357,8],[358,44],[359,8],[406,45],[389,46],[390,46],[388,46],[382,47],[391,46],[379,48],[383,7],[401,49],[405,49],[404,7],[400,7],[234,50],[232,7],[361,8],[532,7],[535,51],[660,52],[656,53],[643,7],[659,54],[652,55],[650,56],[649,56],[648,55],[645,56],[646,55],[654,57],[647,56],[644,55],[651,56],[657,58],[658,59],[653,60],[655,56],[229,61],[534,7],[50,7],[245,62],[246,61],[449,63],[447,64],[445,7],[446,7],[448,7],[450,7],[237,65],[233,50],[235,66],[236,50],[451,67],[452,67],[454,68],[455,69],[456,7],[460,70],[461,7],[462,7],[468,71],[453,62],[469,7],[470,7],[471,7],[478,72],[479,73],[480,74],[481,7],[482,7],[485,7],[484,75],[486,76],[487,7],[483,7],[489,77],[490,7],[491,7],[492,7],[493,7],[494,7],[495,7],[496,78],[169,7],[172,79],[497,61],[170,7],[467,80],[476,81],[498,7],[499,7],[500,7],[502,82],[503,83],[504,8],[509,84],[510,7],[511,7],[513,85],[512,7],[515,86],[516,86],[517,86],[514,7],[520,87],[518,88],[519,88],[526,89],[527,7],[505,7],[458,7],[472,7],[528,90],[529,7],[530,91],[531,92],[540,93],[541,7],[542,7],[543,7],[558,94],[559,95],[171,7],[560,7],[561,7],[562,96],[477,7],[563,97],[506,98],[507,99],[577,100],[578,100],[579,100],[580,100],[581,100],[582,100],[583,100],[584,100],[585,100],[586,100],[565,101],[566,102],[564,103],[567,104],[568,105],[569,106],[570,107],[571,108],[572,109],[573,110],[574,111],[575,112],[576,113],[587,7],[597,114],[590,115],[594,116],[592,117],[595,118],[593,119],[596,120],[591,7],[589,121],[588,122],[599,123],[601,124],[603,7],[602,7],[605,125],[606,126],[604,125],[608,127],[607,7],[609,7],[610,7],[463,7],[501,7],[488,7],[612,7],[613,128],[614,67],[53,129],[54,129],[89,130],[90,131],[91,132],[92,133],[93,134],[94,135],[95,136],[96,137],[97,138],[98,139],[99,139],[101,140],[100,141],[102,142],[103,143],[104,144],[88,145],[138,7],[105,146],[106,147],[107,148],[139,149],[108,150],[109,151],[110,152],[111,153],[112,154],[113,155],[114,156],[115,157],[116,158],[117,159],[118,159],[119,160],[120,161],[122,162],[121,163],[123,164],[124,165],[125,166],[126,167],[127,168],[128,169],[129,170],[130,171],[131,172],[132,173],[133,174],[134,175],[135,176],[136,177],[137,178],[628,179],[615,180],[622,181],[618,182],[616,183],[619,184],[623,185],[624,181],[621,186],[620,187],[625,188],[626,189],[627,190],[617,191],[629,7],[630,192],[631,7],[632,7],[633,7],[635,193],[634,194],[638,195],[640,196],[637,197],[639,198],[636,199],[641,7],[642,7],[523,7],[465,7],[466,7],[663,200],[664,89],[665,89],[667,201],[668,201],[666,202],[521,7],[525,203],[669,7],[459,204],[670,7],[671,180],[672,7],[524,7],[673,7],[698,205],[699,206],[674,207],[677,207],[696,205],[697,205],[687,205],[686,208],[684,205],[679,205],[692,205],[690,205],[694,205],[678,205],[691,205],[695,205],[680,205],[681,205],[693,205],[675,205],[682,205],[683,205],[685,205],[689,205],[700,209],[688,205],[676,205],[713,210],[712,7],[707,209],[709,211],[708,209],[701,209],[702,209],[704,209],[706,209],[710,211],[711,211],[703,211],[705,211],[464,212],[714,213],[475,214],[474,215],[473,216],[715,62],[716,7],[717,7],[724,217],[718,7],[721,218],[723,219],[719,204],[722,220],[720,221],[725,222],[726,7],[729,223],[728,224],[727,225],[730,7],[557,7],[731,62],[600,7],[732,7],[733,7],[743,226],[734,227],[735,7],[736,7],[737,7],[738,7],[739,7],[740,7],[741,7],[742,7],[744,228],[745,229],[746,7],[747,230],[168,231],[52,232],[51,233],[362,7],[55,7],[533,7],[522,7],[661,7],[539,234],[611,204],[508,180],[443,235],[257,236],[323,237],[322,238],[321,239],[262,240],[278,241],[276,242],[277,243],[263,244],[346,245],[248,7],[250,7],[251,246],[252,7],[255,247],[258,7],[275,248],[253,7],[270,249],[256,250],[271,251],[274,252],[272,252],[269,253],[249,7],[254,7],[273,254],[279,255],[267,7],[261,256],[259,257],[268,258],[265,259],[264,259],[260,260],[266,261],[342,262],[336,263],[329,264],[328,265],[337,266],[338,252],[330,267],[343,268],[324,269],[325,270],[326,271],[345,272],[327,265],[331,268],[332,273],[339,274],[340,250],[341,273],[344,252],[333,271],[280,275],[334,276],[335,277],[320,278],[318,279],[319,279],[284,279],[285,279],[286,279],[287,279],[288,279],[289,279],[290,279],[291,279],[310,279],[292,279],[293,279],[294,279],[295,279],[296,279],[297,279],[317,279],[298,279],[299,279],[300,279],[315,279],[301,279],[316,279],[302,279],[313,279],[314,279],[303,279],[304,279],[305,279],[311,279],[312,279],[306,279],[307,279],[308,279],[309,279],[283,280],[282,281],[281,282],[247,7],[598,7],[537,283],[538,284],[457,140],[546,285],[555,286],[544,7],[545,287],[556,288],[551,289],[552,290],[550,291],[554,292],[548,293],[547,294],[553,295],[549,286],[161,296],[159,297],[160,298],[148,299],[149,297],[156,300],[147,301],[152,302],[162,7],[153,303],[158,304],[164,305],[163,306],[146,307],[154,308],[155,309],[150,310],[157,296],[151,311],[230,7],[231,312],[536,313],[662,314],[145,315],[381,7],[347,7],[1,7],[48,7],[49,7],[9,7],[10,7],[14,7],[13,7],[3,7],[15,7],[16,7],[17,7],[18,7],[19,7],[20,7],[21,7],[22,7],[4,7],[5,7],[23,7],[27,7],[24,7],[25,7],[26,7],[28,7],[29,7],[30,7],[6,7],[31,7],[32,7],[33,7],[34,7],[7,7],[38,7],[35,7],[36,7],[37,7],[39,7],[8,7],[40,7],[45,7],[46,7],[41,7],[42,7],[43,7],[44,7],[2,7],[47,7],[12,7],[11,7],[71,316],[78,317],[70,316],[85,318],[62,319],[61,320],[84,67],[79,321],[82,322],[64,323],[63,324],[59,325],[58,326],[81,327],[60,328],[65,329],[66,7],[69,329],[56,7],[87,330],[86,329],[73,331],[74,332],[76,333],[72,334],[75,335],[80,67],[67,336],[68,337],[77,338],[57,339],[83,340],[226,341],[228,342],[227,343],[241,344],[238,345],[239,346],[240,347],[243,348],[242,349],[167,350],[144,7],[141,351],[140,7],[143,352],[142,7],[165,7],[166,353],[188,354],[182,355],[187,356],[180,7],[183,357],[181,358],[185,359],[179,7],[186,360],[184,361],[219,362],[220,363],[178,7],[207,364],[206,365],[189,366],[199,367],[194,367],[193,368],[205,369],[196,367],[203,370],[195,367],[190,367],[202,367],[204,371],[198,370],[197,367],[200,367],[201,370],[191,367],[192,365],[221,372],[222,373],[177,7],[223,374],[211,375],[209,375],[214,375],[215,375],[216,375],[208,375],[212,375],[217,376],[213,375],[210,375],[218,7],[224,377],[225,378],[176,7],[175,379],[173,7],[174,380],[380,7],[244,381]],"exportedModulesMap":[[376,1],[363,2],[374,3],[375,4],[378,5],[364,6],[367,7],[365,8],[377,9],[369,10],[370,7],[373,11],[368,12],[371,13],[366,14],[372,15],[442,16],[444,17],[437,18],[425,7],[441,19],[436,20],[440,21],[438,22],[439,23],[435,24],[348,7],[408,25],[412,26],[409,26],[413,26],[410,26],[414,27],[411,26],[407,28],[418,7],[421,29],[419,7],[422,29],[424,30],[415,31],[423,32],[417,33],[420,34],[416,35],[431,34],[433,8],[426,36],[428,36],[434,37],[429,7],[427,36],[432,34],[430,34],[392,7],[394,7],[386,7],[395,38],[393,39],[399,34],[396,7],[387,7],[385,40],[398,12],[384,7],[402,41],[397,7],[403,36],[351,7],[352,42],[349,43],[350,7],[353,8],[354,8],[355,8],[356,8],[360,12],[357,8],[358,44],[359,8],[406,45],[389,46],[390,46],[388,46],[382,47],[391,46],[379,48],[383,7],[401,49],[405,49],[404,7],[400,7],[234,50],[232,7],[361,8],[532,7],[535,51],[660,52],[656,53],[643,7],[659,54],[652,55],[650,56],[649,56],[648,55],[645,56],[646,55],[654,57],[647,56],[644,55],[651,56],[657,58],[658,59],[653,60],[655,56],[229,61],[534,7],[50,7],[245,62],[246,61],[449,63],[447,64],[445,7],[446,7],[448,7],[450,7],[237,65],[233,50],[235,66],[236,50],[451,67],[452,67],[454,68],[455,69],[456,7],[460,70],[461,7],[462,7],[468,71],[453,62],[469,7],[470,7],[471,7],[478,72],[479,73],[480,74],[481,7],[482,7],[485,7],[484,75],[486,76],[487,7],[483,7],[489,77],[490,7],[491,7],[492,7],[493,7],[494,7],[495,7],[496,78],[169,7],[172,79],[497,61],[170,7],[467,80],[476,81],[498,7],[499,7],[500,7],[502,82],[503,83],[504,8],[509,84],[510,7],[511,7],[513,85],[512,7],[515,86],[516,86],[517,86],[514,7],[520,87],[518,88],[519,88],[526,89],[527,7],[505,7],[458,7],[472,7],[528,90],[529,7],[530,91],[531,92],[540,93],[541,7],[542,7],[543,7],[558,94],[559,95],[171,7],[560,7],[561,7],[562,96],[477,7],[563,97],[506,98],[507,99],[577,100],[578,100],[579,100],[580,100],[581,100],[582,100],[583,100],[584,100],[585,100],[586,100],[565,101],[566,102],[564,103],[567,104],[568,105],[569,106],[570,107],[571,108],[572,109],[573,110],[574,111],[575,112],[576,113],[587,7],[597,114],[590,115],[594,116],[592,117],[595,118],[593,119],[596,120],[591,7],[589,121],[588,122],[599,123],[601,124],[603,7],[602,7],[605,125],[606,126],[604,125],[608,127],[607,7],[609,7],[610,7],[463,7],[501,7],[488,7],[612,7],[613,128],[614,67],[53,129],[54,129],[89,130],[90,131],[91,132],[92,133],[93,134],[94,135],[95,136],[96,137],[97,138],[98,139],[99,139],[101,140],[100,141],[102,142],[103,143],[104,144],[88,145],[138,7],[105,146],[106,147],[107,148],[139,149],[108,150],[109,151],[110,152],[111,153],[112,154],[113,155],[114,156],[115,157],[116,158],[117,159],[118,159],[119,160],[120,161],[122,162],[121,163],[123,164],[124,165],[125,166],[126,167],[127,168],[128,169],[129,170],[130,171],[131,172],[132,173],[133,174],[134,175],[135,176],[136,177],[137,178],[628,179],[615,180],[622,181],[618,182],[616,183],[619,184],[623,185],[624,181],[621,186],[620,187],[625,188],[626,189],[627,190],[617,191],[629,7],[630,192],[631,7],[632,7],[633,7],[635,193],[634,194],[638,195],[640,196],[637,197],[639,198],[636,199],[641,7],[642,7],[523,7],[465,7],[466,7],[663,200],[664,89],[665,89],[667,201],[668,201],[666,202],[521,7],[525,203],[669,7],[459,204],[670,7],[671,180],[672,7],[524,7],[673,7],[698,205],[699,206],[674,207],[677,207],[696,205],[697,205],[687,205],[686,208],[684,205],[679,205],[692,205],[690,205],[694,205],[678,205],[691,205],[695,205],[680,205],[681,205],[693,205],[675,205],[682,205],[683,205],[685,205],[689,205],[700,209],[688,205],[676,205],[713,210],[712,7],[707,209],[709,211],[708,209],[701,209],[702,209],[704,209],[706,209],[710,211],[711,211],[703,211],[705,211],[464,212],[714,213],[475,214],[474,215],[473,216],[715,62],[716,7],[717,7],[724,217],[718,7],[721,218],[723,219],[719,204],[722,220],[720,221],[725,222],[726,7],[729,223],[728,224],[727,225],[730,7],[557,7],[731,62],[600,7],[732,7],[733,7],[743,226],[734,227],[735,7],[736,7],[737,7],[738,7],[739,7],[740,7],[741,7],[742,7],[744,228],[745,229],[746,7],[747,230],[168,231],[52,232],[51,233],[362,7],[55,7],[533,7],[522,7],[661,7],[539,234],[611,204],[508,180],[443,235],[257,236],[323,237],[322,238],[321,239],[262,240],[278,241],[276,242],[277,243],[263,244],[346,245],[248,7],[250,7],[251,246],[252,7],[255,247],[258,7],[275,248],[253,7],[270,249],[256,250],[271,251],[274,252],[272,252],[269,253],[249,7],[254,7],[273,254],[279,255],[267,7],[261,256],[259,257],[268,258],[265,259],[264,259],[260,260],[266,261],[342,262],[336,263],[329,264],[328,265],[337,266],[338,252],[330,267],[343,268],[324,269],[325,270],[326,271],[345,272],[327,265],[331,268],[332,273],[339,274],[340,250],[341,273],[344,252],[333,271],[280,275],[334,276],[335,277],[320,278],[318,279],[319,279],[284,279],[285,279],[286,279],[287,279],[288,279],[289,279],[290,279],[291,279],[310,279],[292,279],[293,279],[294,279],[295,279],[296,279],[297,279],[317,279],[298,279],[299,279],[300,279],[315,279],[301,279],[316,279],[302,279],[313,279],[314,279],[303,279],[304,279],[305,279],[311,279],[312,279],[306,279],[307,279],[308,279],[309,279],[283,280],[282,281],[281,282],[247,7],[598,7],[537,283],[538,284],[457,140],[546,285],[555,286],[544,7],[545,287],[556,288],[551,289],[552,290],[550,291],[554,292],[548,293],[547,294],[553,295],[549,286],[161,296],[159,297],[160,298],[148,299],[149,297],[156,300],[147,301],[152,302],[162,7],[153,303],[158,304],[164,305],[163,306],[146,307],[154,308],[155,309],[150,310],[157,296],[151,311],[230,7],[231,312],[536,313],[662,314],[145,315],[381,7],[347,7],[1,7],[48,7],[49,7],[9,7],[10,7],[14,7],[13,7],[3,7],[15,7],[16,7],[17,7],[18,7],[19,7],[20,7],[21,7],[22,7],[4,7],[5,7],[23,7],[27,7],[24,7],[25,7],[26,7],[28,7],[29,7],[30,7],[6,7],[31,7],[32,7],[33,7],[34,7],[7,7],[38,7],[35,7],[36,7],[37,7],[39,7],[8,7],[40,7],[45,7],[46,7],[41,7],[42,7],[43,7],[44,7],[2,7],[47,7],[12,7],[11,7],[71,316],[78,317],[70,316],[85,318],[62,319],[61,320],[84,67],[79,321],[82,322],[64,323],[63,324],[59,325],[58,326],[81,327],[60,328],[65,329],[66,7],[69,329],[56,7],[87,330],[86,329],[73,331],[74,332],[76,333],[72,334],[75,335],[80,67],[67,336],[68,337],[77,338],[57,339],[83,340],[226,341],[228,342],[227,343],[241,344],[238,345],[239,346],[240,347],[243,348],[242,349],[167,350],[144,7],[141,351],[140,7],[143,352],[142,7],[165,7],[166,353],[188,354],[182,355],[187,356],[180,7],[183,357],[181,358],[185,359],[179,7],[186,360],[184,361],[219,362],[220,363],[178,7],[207,364],[206,365],[189,366],[199,367],[194,367],[193,368],[205,369],[196,367],[203,370],[195,367],[190,367],[202,367],[204,371],[198,370],[197,367],[200,367],[201,370],[191,367],[192,365],[221,372],[222,373],[177,7],[223,374],[211,375],[209,375],[214,375],[215,375],[216,375],[208,375],[212,375],[217,376],[213,375],[210,375],[218,7],[224,377],[225,378],[176,7],[175,379],[173,7],[174,380],[380,7],[244,381]],"semanticDiagnosticsPerFile":[376,363,374,375,378,364,367,365,377,369,370,373,368,371,366,372,442,444,437,425,441,436,440,438,439,435,348,408,412,409,413,410,414,411,407,418,421,419,422,424,415,423,417,420,416,431,433,426,428,434,429,427,432,430,392,394,386,395,393,399,396,387,385,398,384,402,397,403,351,352,349,350,353,354,355,356,360,357,358,359,406,389,390,388,382,391,379,383,401,405,404,400,234,232,361,532,535,660,656,643,659,652,650,649,648,645,646,654,647,644,651,657,658,653,655,229,534,50,245,246,449,447,445,446,448,450,237,233,235,236,451,452,454,455,456,460,461,462,468,453,469,470,471,478,479,480,481,482,485,484,486,487,483,489,490,491,492,493,494,495,496,169,172,497,170,467,476,498,499,500,502,503,504,509,510,511,513,512,515,516,517,514,520,518,519,526,527,505,458,472,528,529,530,531,540,541,542,543,558,559,171,560,561,562,477,563,506,507,577,578,579,580,581,582,583,584,585,586,565,566,564,567,568,569,570,571,572,573,574,575,576,587,597,590,594,592,595,593,596,591,589,588,599,601,603,602,605,606,604,608,607,609,610,463,501,488,612,613,614,53,54,89,90,91,92,93,94,95,96,97,98,99,101,100,102,103,104,88,138,105,106,107,139,108,109,110,111,112,113,114,115,116,117,118,119,120,122,121,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,628,615,622,618,616,619,623,624,621,620,625,626,627,617,629,630,631,632,633,635,634,638,640,637,639,636,641,642,523,465,466,663,664,665,667,668,666,521,525,669,459,670,671,672,524,673,698,699,674,677,696,697,687,686,684,679,692,690,694,678,691,695,680,681,693,675,682,683,685,689,700,688,676,713,712,707,709,708,701,702,704,706,710,711,703,705,464,714,475,474,473,715,716,717,724,718,721,723,719,722,720,725,726,729,728,727,730,557,731,600,732,733,743,734,735,736,737,738,739,740,741,742,744,745,746,747,168,52,51,362,55,533,522,661,539,611,508,443,257,323,322,321,262,278,276,277,263,346,248,250,251,252,255,258,275,253,270,256,271,274,272,269,249,254,273,279,267,261,259,268,265,264,260,266,342,336,329,328,337,338,330,343,324,325,326,345,327,331,332,339,340,341,344,333,280,334,335,320,318,319,284,285,286,287,288,289,290,291,310,292,293,294,295,296,297,317,298,299,300,315,301,316,302,313,314,303,304,305,311,312,306,307,308,309,283,282,281,247,598,537,538,457,546,555,544,545,556,551,552,550,554,548,547,553,549,161,159,160,148,149,156,147,152,162,153,158,164,163,146,154,155,150,157,151,230,231,536,662,145,381,347,1,48,49,9,10,14,13,3,15,16,17,18,19,20,21,22,4,5,23,27,24,25,26,28,29,30,6,31,32,33,34,7,38,35,36,37,39,8,40,45,46,41,42,43,44,2,47,12,11,71,78,70,85,62,61,84,79,82,64,63,59,58,81,60,65,66,69,56,87,86,73,74,76,72,75,80,67,68,77,57,83,226,228,227,241,238,239,240,243,242,167,144,141,140,143,142,165,166,188,182,187,180,183,181,185,179,186,184,219,220,178,207,206,189,199,194,193,205,196,203,195,190,202,204,198,197,200,201,191,192,221,222,177,223,211,209,214,215,216,208,212,217,213,210,218,224,225,176,175,173,174,380,244],"affectedFilesPendingEmit":[244],"emitSignatures":[244]},"version":"5.3.3"} \ No newline at end of file