@axinom/mosaic-ui 0.69.0-rc.2 → 0.69.0-rc.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/Buttons/Button/Button.d.ts +3 -3
- package/dist/components/Buttons/Button/Button.d.ts.map +1 -1
- package/dist/components/Buttons/Button.model.d.ts +2 -1
- package/dist/components/Buttons/Button.model.d.ts.map +1 -1
- package/dist/components/ConfirmDialog/ConfirmDialog.d.ts.map +1 -1
- package/dist/components/ConfirmDialog/ConfirmDialog.models.d.ts +0 -1
- package/dist/components/ConfirmDialog/ConfirmDialog.models.d.ts.map +1 -1
- package/dist/components/DateTime/TimePicker/ScrollColumn/ScrollColumn.d.ts +2 -2
- package/dist/components/DateTime/TimePicker/ScrollColumn/ScrollColumn.d.ts.map +1 -1
- package/dist/components/DynamicDataList/DynamicDataList.d.ts +1 -1
- package/dist/components/DynamicDataList/DynamicDataList.d.ts.map +1 -1
- package/dist/components/DynamicDataList/DynamicDataList.model.d.ts +0 -1
- package/dist/components/DynamicDataList/DynamicDataList.model.d.ts.map +1 -1
- package/dist/components/DynamicDataList/DynamicListDataEntry/DynamicListDataEntry.d.ts +2 -2
- package/dist/components/DynamicDataList/DynamicListDataEntry/DynamicListDataEntry.d.ts.map +1 -1
- package/dist/components/DynamicDataList/DynamicListDataEntry/Renderers/createInputRenderer/createInputRenderer.d.ts +1 -1
- package/dist/components/DynamicDataList/DynamicListDataEntry/Renderers/createInputRenderer/createInputRenderer.d.ts.map +1 -1
- package/dist/components/DynamicDataList/DynamicListDataEntry/Renderers/createSelectRenderer/createSelectRenderer.d.ts +1 -1
- package/dist/components/DynamicDataList/DynamicListDataEntry/Renderers/createSelectRenderer/createSelectRenderer.d.ts.map +1 -1
- package/dist/components/DynamicDataList/DynamicListDataEntry/Renderers/renderers.model.d.ts +2 -0
- package/dist/components/DynamicDataList/DynamicListDataEntry/Renderers/renderers.model.d.ts.map +1 -1
- package/dist/components/DynamicDataList/DynamicListHeader/DynamicListHeader.d.ts +2 -2
- package/dist/components/DynamicDataList/DynamicListHeader/DynamicListHeader.d.ts.map +1 -1
- package/dist/components/DynamicDataList/DynamicListRow/DynamicListRow.d.ts +2 -2
- package/dist/components/DynamicDataList/DynamicListRow/DynamicListRow.d.ts.map +1 -1
- package/dist/components/DynamicDataList/helpers/DynamicListReducer/DynamicListReducer.actions.d.ts +2 -2
- package/dist/components/DynamicDataList/helpers/DynamicListReducer/DynamicListReducer.actions.d.ts.map +1 -1
- package/dist/components/DynamicDataList/helpers/DynamicListReducer/DynamicListReducer.d.ts.map +1 -1
- package/dist/components/DynamicDataList/helpers/DynamicListReducer/DynamicListReducer.init.d.ts.map +1 -1
- package/dist/components/DynamicDataList/helpers/useColumnDefs.d.ts +1 -1
- package/dist/components/DynamicDataList/helpers/useColumnDefs.d.ts.map +1 -1
- package/dist/components/DynamicDataList/helpers/useDataHandler.d.ts +1 -1
- package/dist/components/DynamicDataList/helpers/useDataHandler.d.ts.map +1 -1
- package/dist/components/DynamicDataList/helpers/useRowAnimation.d.ts.map +1 -1
- package/dist/components/DynamicDataList/helpers/useRowEditing.d.ts.map +1 -1
- package/dist/components/EmptyStation/EmptyStation.d.ts.map +1 -1
- package/dist/components/Explorer/BulkEdit/FormFieldsConfigConverter.d.ts.map +1 -1
- package/dist/components/Explorer/BulkEdit/GenerateMutation.d.ts.map +1 -1
- package/dist/components/Explorer/BulkEdit/helpers/FieldWrapper.d.ts.map +1 -1
- package/dist/components/Explorer/BulkEdit/useBulkEdit.d.ts.map +1 -1
- package/dist/components/Explorer/Explorer.d.ts +1 -1
- package/dist/components/Explorer/Explorer.d.ts.map +1 -1
- package/dist/components/Explorer/Explorer.model.d.ts +0 -1
- package/dist/components/Explorer/Explorer.model.d.ts.map +1 -1
- package/dist/components/Explorer/NavigationExplorer/NavigationExplorer.d.ts +1 -1
- package/dist/components/Explorer/NavigationExplorer/NavigationExplorer.d.ts.map +1 -1
- package/dist/components/Explorer/QuickEdit/useQuickEdit.d.ts.map +1 -1
- package/dist/components/Explorer/SelectionExplorer/SelectionExplorer.d.ts +1 -1
- package/dist/components/Explorer/SelectionExplorer/SelectionExplorer.d.ts.map +1 -1
- package/dist/components/Explorer/helpers/useActions.d.ts +0 -1
- package/dist/components/Explorer/helpers/useActions.d.ts.map +1 -1
- package/dist/components/Explorer/helpers/useDataProvider.d.ts +0 -1
- package/dist/components/Explorer/helpers/useDataProvider.d.ts.map +1 -1
- package/dist/components/Explorer/helpers/useFilters.d.ts +0 -1
- package/dist/components/Explorer/helpers/useFilters.d.ts.map +1 -1
- package/dist/components/FieldSelection/FieldSelection.d.ts +1 -0
- package/dist/components/FieldSelection/FieldSelection.d.ts.map +1 -1
- package/dist/components/Filters/Filter/Filter.d.ts +2 -2
- package/dist/components/Filters/Filter/Filter.d.ts.map +1 -1
- package/dist/components/Filters/Filters.d.ts +2 -2
- package/dist/components/Filters/Filters.d.ts.map +1 -1
- package/dist/components/Filters/Filters.model.d.ts +0 -1
- package/dist/components/Filters/Filters.model.d.ts.map +1 -1
- package/dist/components/Filters/Validators/DateRangeFilterValidator.d.ts.map +1 -1
- package/dist/components/Filters/Validators/NumberRangeFilterValidator.d.ts.map +1 -1
- package/dist/components/FormElements/DynamicDataListControl/DynamicDataListControl.d.ts +0 -1
- package/dist/components/FormElements/DynamicDataListControl/DynamicDataListControl.d.ts.map +1 -1
- package/dist/components/FormElements/DynamicDataListControl/DynamicDataListField.d.ts +2 -2
- package/dist/components/FormElements/DynamicDataListControl/DynamicDataListField.d.ts.map +1 -1
- package/dist/components/FormElements/FormGroup/FormGroup.d.ts +12 -0
- package/dist/components/FormElements/FormGroup/FormGroup.d.ts.map +1 -0
- package/dist/components/FormElements/FormGroupTitle/FormGroupTitle.d.ts +5 -0
- package/dist/components/FormElements/FormGroupTitle/FormGroupTitle.d.ts.map +1 -1
- package/dist/components/FormElements/FormikDebug/FormikDebug.d.ts +0 -1
- package/dist/components/FormElements/FormikDebug/FormikDebug.d.ts.map +1 -1
- package/dist/components/FormElements/ReadOnly/ReadOnlyField.d.ts +2 -2
- package/dist/components/FormElements/ReadOnly/ReadOnlyField.d.ts.map +1 -1
- package/dist/components/FormElements/ReadOnlyText/ReadOnlyTextField.d.ts +2 -2
- package/dist/components/FormElements/ReadOnlyText/ReadOnlyTextField.d.ts.map +1 -1
- package/dist/components/FormElements/Tags/Tags.d.ts +2 -2
- package/dist/components/FormElements/Tags/Tags.d.ts.map +1 -1
- package/dist/components/FormElements/Tags/TagsField.d.ts +2 -2
- package/dist/components/FormElements/Tags/TagsField.d.ts.map +1 -1
- package/dist/components/FormElements/formStoryHelper.d.ts.map +1 -1
- package/dist/components/FormElements/index.d.ts +1 -0
- package/dist/components/FormElements/index.d.ts.map +1 -1
- package/dist/components/FormElements/useFormikError.d.ts.map +1 -1
- package/dist/components/FormStation/Create/Create.d.ts +2 -2
- package/dist/components/FormStation/Create/Create.d.ts.map +1 -1
- package/dist/components/FormStation/Details/Details.d.ts +2 -2
- package/dist/components/FormStation/Details/Details.d.ts.map +1 -1
- package/dist/components/FormStation/FormStation.d.ts +2 -2
- package/dist/components/FormStation/FormStation.d.ts.map +1 -1
- package/dist/components/FormStation/FormStationActions/FormStationActions.d.ts +1 -1
- package/dist/components/FormStation/FormStationActions/FormStationActions.d.ts.map +1 -1
- package/dist/components/FormStation/FormStationHeader/FormStationHeader.d.ts.map +1 -1
- package/dist/components/FormStation/SaveOnDemand/SaveOnDemand.d.ts +0 -1
- package/dist/components/FormStation/SaveOnDemand/SaveOnDemand.d.ts.map +1 -1
- package/dist/components/FormStation/SaveOnNavigate/handleNavigationAttempt.d.ts.map +1 -1
- package/dist/components/FormStation/helpers/useTitle.d.ts.map +1 -1
- package/dist/components/InfoPanel/hooks/useCollapse.d.ts +0 -1
- package/dist/components/InfoPanel/hooks/useCollapse.d.ts.map +1 -1
- package/dist/components/InlineMenu/InlineMenu.d.ts.map +1 -1
- package/dist/components/List/List.d.ts +2 -2
- package/dist/components/List/List.d.ts.map +1 -1
- package/dist/components/List/List.model.d.ts +0 -1
- package/dist/components/List/List.model.d.ts.map +1 -1
- package/dist/components/List/List.stories.helper.d.ts.map +1 -1
- package/dist/components/List/ListHeader/ColumnLabel/ColumnLabel.d.ts +2 -2
- package/dist/components/List/ListHeader/ColumnLabel/ColumnLabel.d.ts.map +1 -1
- package/dist/components/List/ListHeader/ListHeader.d.ts +2 -2
- package/dist/components/List/ListHeader/ListHeader.d.ts.map +1 -1
- package/dist/components/List/ListRow/ListRow.d.ts +2 -4
- package/dist/components/List/ListRow/ListRow.d.ts.map +1 -1
- package/dist/components/List/ListRow/ListRowCell/ListRowCell.d.ts +0 -1
- package/dist/components/List/ListRow/ListRowCell/ListRowCell.d.ts.map +1 -1
- package/dist/components/List/ListRow/ListRowCell/renderData.d.ts.map +1 -1
- package/dist/components/List/ListRow/ListRowLoader.d.ts +2 -2
- package/dist/components/List/ListRow/ListRowLoader.d.ts.map +1 -1
- package/dist/components/List/ListRow/Renderers/BooleanDotRenderer/BooleanDotRenderer.d.ts +0 -1
- package/dist/components/List/ListRow/Renderers/BooleanDotRenderer/BooleanDotRenderer.d.ts.map +1 -1
- package/dist/components/List/ListRow/Renderers/DateRenderer/DateRenderer.d.ts.map +1 -1
- package/dist/components/List/ListRow/Renderers/ExternalLinkRenderer/ExternalLinkRenderer.d.ts.map +1 -1
- package/dist/components/List/ListRow/Renderers/StateRenderer/StateRenderer.d.ts +1 -1
- package/dist/components/List/ListRow/Renderers/StateRenderer/StateRenderer.d.ts.map +1 -1
- package/dist/components/List/ListRow/Renderers/TagsRenderer/TagsRenderer.d.ts +0 -1
- package/dist/components/List/ListRow/Renderers/TagsRenderer/TagsRenderer.d.ts.map +1 -1
- package/dist/components/List/ListRow/Renderers/TimestampRenderer/TimestampRenderer.d.ts.map +1 -1
- package/dist/components/List/ListRowRenderer/ListRowRenderer.d.ts.map +1 -1
- package/dist/components/List/helpers.d.ts.map +1 -1
- package/dist/components/List/useColumnsSize.d.ts +0 -2
- package/dist/components/List/useColumnsSize.d.ts.map +1 -1
- package/dist/components/Loaders/skeletons.d.ts +0 -1
- package/dist/components/Loaders/skeletons.d.ts.map +1 -1
- package/dist/components/Modal/useModal.d.ts.map +1 -1
- package/dist/components/PageHeader/PageHeaderActionsGroup/PageHeaderActionsGroupsContext.d.ts +0 -1
- package/dist/components/PageHeader/PageHeaderActionsGroup/PageHeaderActionsGroupsContext.d.ts.map +1 -1
- package/dist/components/PageHeader/helpers/useElementWidthObserver.d.ts +1 -2
- package/dist/components/PageHeader/helpers/useElementWidthObserver.d.ts.map +1 -1
- package/dist/components/Tabs/TabList/ScrollContainer/useScroll.d.ts.map +1 -1
- package/dist/components/Utils/Postgraphile/FilterTransformer.d.ts.map +1 -1
- package/dist/components/Utils/Postgraphile/SortTransformer.d.ts.map +1 -1
- package/dist/components/Utils/State/GlobalState.d.ts.map +1 -1
- package/dist/helpers/idleCallbackHelpers.d.ts +0 -1
- package/dist/helpers/idleCallbackHelpers.d.ts.map +1 -1
- package/dist/helpers/storybook.d.ts.map +1 -1
- package/dist/helpers/testing.d.ts +6 -21
- package/dist/helpers/testing.d.ts.map +1 -1
- package/dist/helpers/utils.d.ts +1 -2
- package/dist/helpers/utils.d.ts.map +1 -1
- package/dist/hooks/useDEBUGDetectChanges/useDEBUGDetectChanges.d.ts.map +1 -1
- package/dist/hooks/useDEBUGRenderCount/useDEBUGRenderCount.d.ts.map +1 -1
- package/dist/hooks/useDebounce/useDebounce.d.ts +1 -2
- package/dist/hooks/useDebounce/useDebounce.d.ts.map +1 -1
- package/dist/hooks/useExpand/useExpand.d.ts.map +1 -1
- package/dist/hooks/useReactRouterPause/utils.d.ts.map +1 -1
- package/dist/hooks/useResize/useResize.d.ts +0 -1
- package/dist/hooks/useResize/useResize.d.ts.map +1 -1
- package/dist/hooks/useTabTitle/useTabTitle.d.ts.map +1 -1
- package/dist/hooks/useValueOrOnDemand/useValueOrOnDemand.d.ts +1 -1
- package/dist/hooks/useValueOrOnDemand/useValueOrOnDemand.d.ts.map +1 -1
- package/dist/index.es.js +4 -4
- package/dist/index.es.js.map +1 -1
- package/dist/index.js +4 -4
- package/dist/index.js.map +1 -1
- package/dist/utils/ErrorMapper/ErrorMapper.d.ts.map +1 -1
- package/dist/utils/ErrorTypeToStationError.d.ts.map +1 -1
- package/dist/utils/ToolTipHelpers.d.ts.map +1 -1
- package/dist/validators/timestamp/timestamp.d.ts.map +1 -1
- package/package.json +11 -10
- package/src/components/Accordion/Accordion.spec.tsx +1 -1
- package/src/components/Accordion/AccordionItem/AccordionItem.spec.tsx +2 -2
- package/src/components/Actions/Action/Action.spec.tsx +189 -228
- package/src/components/Actions/Actions.spec.tsx +42 -32
- package/src/components/Buttons/Button/Button.spec.tsx +110 -115
- package/src/components/Buttons/Button/Button.tsx +4 -0
- package/src/components/Buttons/Button.model.ts +2 -0
- package/src/components/Buttons/CompositeButton/CompositeButton.spec.tsx +122 -121
- package/src/components/Buttons/TextButton/TextButton.spec.tsx +85 -90
- package/src/components/ConfirmDialog/ConfirmDialog.spec.tsx +75 -79
- package/src/components/DateTime/DatePicker/DatePicker.spec.tsx +8 -7
- package/src/components/DateTime/DateTimePicker.spec.tsx +43 -62
- package/src/components/DateTime/TimePicker/ScrollColumn/ScrollColumn.spec.tsx +19 -16
- package/src/components/DateTime/TimePicker/TimePicker.spec.tsx +44 -73
- package/src/components/DynamicDataList/DynamicDataList.spec.tsx +112 -107
- package/src/components/DynamicDataList/DynamicListDataEntry/DynamicListDataEntry.spec.tsx +91 -144
- package/src/components/DynamicDataList/DynamicListDataEntry/DynamicListDataEntry.tsx +38 -20
- package/src/components/DynamicDataList/DynamicListDataEntry/Renderers/createInputRenderer/createInputRenderer.spec.tsx +18 -15
- package/src/components/DynamicDataList/DynamicListDataEntry/Renderers/createInputRenderer/createInputRenderer.tsx +2 -0
- package/src/components/DynamicDataList/DynamicListDataEntry/Renderers/createSelectRenderer/createSelectRenderer.spec.tsx +53 -28
- package/src/components/DynamicDataList/DynamicListDataEntry/Renderers/createSelectRenderer/createSelectRenderer.tsx +2 -0
- package/src/components/DynamicDataList/DynamicListDataEntry/Renderers/renderers.model.ts +2 -0
- package/src/components/DynamicDataList/DynamicListHeader/DynamicListHeader.scss +19 -5
- package/src/components/DynamicDataList/DynamicListHeader/DynamicListHeader.spec.tsx +72 -76
- package/src/components/DynamicDataList/DynamicListRow/DynamicListRow.scss +9 -2
- package/src/components/DynamicDataList/DynamicListRow/DynamicListRow.spec.tsx +86 -113
- package/src/components/DynamicDataList/helpers/DynamicListReducer/DynamicListReducer.actions.spec.ts +1 -0
- package/src/components/DynamicDataList/helpers/DynamicListReducer/DynamicListReducer.init.spec.ts +1 -0
- package/src/components/DynamicDataList/helpers/DynamicListReducer/DynamicListReducer.spec.ts +6 -5
- package/src/components/EmptyStation/EmptyStation.spec.tsx +41 -37
- package/src/components/Explorer/BulkEdit/FormFieldsConfigConverter.spec.tsx +29 -28
- package/src/components/Explorer/BulkEdit/FormFieldsConfigConverter.tsx +1 -0
- package/src/components/Explorer/BulkEdit/GenerateMutation.spec.tsx +1 -0
- package/src/components/Explorer/BulkEdit/helpers/FieldWrapper.scss +1 -0
- package/src/components/Explorer/BulkEdit/helpers/FieldWrapper.tsx +1 -0
- package/src/components/Explorer/Explorer.spec.tsx +513 -825
- package/src/components/Explorer/NavigationExplorer/NavigationExplorer.spec.tsx +90 -131
- package/src/components/Explorer/QuickEdit/useQuickEdit.spec.tsx +36 -56
- package/src/components/Explorer/SelectionExplorer/SelectionExplorer.spec.tsx +59 -65
- package/src/components/Explorer/helpers/InMemoryDataProvider.spec.ts +1 -0
- package/src/components/Explorer/helpers/useFilters.spec.tsx +13 -11
- package/src/components/Explorer/helpers/useStationMessage.spec.tsx +4 -3
- package/src/components/Explorer/helpers/useSubtitle.spec.tsx +1 -0
- package/src/components/FieldSelection/FieldSelection.scss +1 -1
- package/src/components/FieldSelection/FieldSelection.spec.tsx +1 -1
- package/src/components/FieldSelection/FieldSelection.tsx +6 -2
- package/src/components/Filters/Filter/Filter.spec.tsx +78 -47
- package/src/components/Filters/Filters.spec.tsx +56 -58
- package/src/components/Filters/SelectionTypes/DateTimeFilter/DateTimeFilter.spec.tsx +45 -46
- package/src/components/Filters/SelectionTypes/FreeTextFilter/FreeTextFilter.spec.tsx +23 -23
- package/src/components/Filters/SelectionTypes/NumericTextFilter/NumericTextFilter.spec.tsx +37 -28
- package/src/components/Filters/SelectionTypes/OptionsFilter/OptionsFilter.spec.tsx +14 -12
- package/src/components/Filters/Validators/DateRangeFilterValidator.spec.ts +1 -0
- package/src/components/Filters/Validators/NumberRangeFilterValidator.spec.ts +1 -0
- package/src/components/FormElements/BooleanView/BooleanViewField.spec.tsx +34 -31
- package/src/components/FormElements/Checkbox/Checkbox.spec.tsx +129 -128
- package/src/components/FormElements/CustomTags/CustomTags.spec.tsx +312 -446
- package/src/components/FormElements/DateTimeField/DateTimeText.spec.tsx +61 -52
- package/src/components/FormElements/DynamicDataListControl/DynamicDataListControl.spec.tsx +19 -24
- package/src/components/FormElements/FileUploadControl/FileUploadControl.spec.tsx +67 -60
- package/src/components/FormElements/FormElementContainer/FormElementContainer.spec.tsx +13 -12
- package/src/components/FormElements/FormGroup/FormGroup.scss +62 -0
- package/src/components/FormElements/FormGroup/FormGroup.stories.tsx +25 -0
- package/src/components/FormElements/FormGroup/FormGroup.tsx +60 -0
- package/src/components/FormElements/FormGroupTitle/FormGroupTitle.tsx +5 -0
- package/src/components/FormElements/Link/LinkField.spec.tsx +24 -23
- package/src/components/FormElements/MaskedSingleLineText/MaskedSingleLineText.spec.tsx +4 -3
- package/src/components/FormElements/Radio/Radio.spec.tsx +170 -172
- package/src/components/FormElements/ReadOnly/ReadOnlyField.spec.tsx +23 -22
- package/src/components/FormElements/ReadOnlyText/ReadOnlyTextField.spec.tsx +23 -22
- package/src/components/FormElements/Select/Select.spec.tsx +30 -29
- package/src/components/FormElements/SingleLineText/SingleLineText.spec.tsx +46 -42
- package/src/components/FormElements/Tags/Tags.spec.tsx +59 -53
- package/src/components/FormElements/TextArea/TextArea.spec.tsx +44 -29
- package/src/components/FormElements/ToggleButton/ToggleButton.spec.tsx +188 -165
- package/src/components/FormElements/index.ts +1 -0
- package/src/components/FormStation/FormStation.spec.tsx +273 -198
- package/src/components/FormStation/FormStation.stories.tsx +15 -13
- package/src/components/FormStation/FormStationHeader/FormStationHeader.tsx +5 -3
- package/src/components/FormStation/SaveOnNavigate/SaveOnNavigate.spec.tsx +23 -20
- package/src/components/FormStation/SaveOnNavigate/handleNavigationAttempt.spec.ts +25 -24
- package/src/components/FormStation/helpers/useTitle.spec.ts +9 -7
- package/src/components/Hub/Hub.spec.tsx +13 -10
- package/src/components/Hub/Tile/Tile.spec.tsx +29 -25
- package/src/components/Icons/Icons.spec.tsx +25 -27
- package/src/components/Icons/Icons.tsx +1 -1
- package/src/components/InfoPanel/InfoImage/InfoImage.spec.tsx +4 -3
- package/src/components/InfoPanel/InfoPanel.scss +2 -0
- package/src/components/InfoPanel/InfoPanel.spec.tsx +4 -3
- package/src/components/InfoPanel/Paragraph/Paragraph.spec.tsx +4 -3
- package/src/components/InfoPanel/Section/Section.spec.tsx +39 -46
- package/src/components/InfoPanel/hooks/useCollapse.ts +9 -7
- package/src/components/InlineMenu/InlineMenu.spec.tsx +24 -23
- package/src/components/InlineMenu/InlineMenu.tsx +3 -0
- package/src/components/LandingPageHeader/LandingPageHeader.spec.tsx +9 -8
- package/src/components/LandingPageTiles/LandingPageTiles.spec.tsx +29 -28
- package/src/components/LandingPageTiles/TileLarge/TileLarge.spec.tsx +68 -61
- package/src/components/LandingPageTiles/TileSmall/TileSmall.spec.tsx +50 -32
- package/src/components/List/List.spec.tsx +337 -241
- package/src/components/List/ListCheckBox/ListCheckBox.spec.tsx +54 -48
- package/src/components/List/ListHeader/ColumnLabel/ColumnLabel.scss +4 -1
- package/src/components/List/ListHeader/ColumnLabel/ColumnLabel.spec.tsx +46 -43
- package/src/components/List/ListHeader/ListHeader.spec.tsx +82 -66
- package/src/components/List/ListRow/ListRow.spec.tsx +125 -130
- package/src/components/List/ListRow/ListRowCell/ListRowCell.spec.tsx +57 -100
- package/src/components/List/ListRow/ListRowLoader.spec.tsx +16 -12
- package/src/components/List/ListRow/Renderers/BooleanDotRenderer/BooleanDotRenderer.spec.tsx +12 -9
- package/src/components/List/ListRow/Renderers/ExternalLinkRenderer/ExternalLinkRenderer.spec.tsx +40 -35
- package/src/components/List/ListRow/Renderers/StateRenderer/StateRenderer.spec.tsx +14 -17
- package/src/components/List/ListRow/Renderers/TagsRenderer/TagsRenderer.spec.tsx +18 -17
- package/src/components/List/ListRow/Renderers/TagsRenderer/TagsRenderer.tsx +2 -2
- package/src/components/List/ListRowRenderer/ListRowRenderer.spec.tsx +82 -68
- package/src/components/Loaders/ImageLoader/ImageLoader.spec.tsx +88 -96
- package/src/components/Loaders/Loader/Loader.spec.tsx +51 -24
- package/src/components/Message/Message.spec.tsx +56 -44
- package/src/components/MessageBar/MessageBar.scss +3 -0
- package/src/components/MessageBar/MessageBar.spec.tsx +88 -85
- package/src/components/Modal/Modal.spec.tsx +92 -87
- package/src/components/NavigationAwareStation/NavigationAwareStation.spec.tsx +23 -22
- package/src/components/PageHeader/PageHeader.spec.tsx +22 -21
- package/src/components/PageHeader/PageHeaderAction/PageHeaderAction.spec.tsx +275 -193
- package/src/components/PageHeader/PageHeaderActionsGroup/PageHeaderActionsGroup.spec.tsx +39 -34
- package/src/components/ProgressBar/ProgressBar.spec.tsx +18 -15
- package/src/components/Utils/Postgraphile/CreateConnectionRenderer.spec.ts +1 -0
- package/src/components/Utils/Postgraphile/FilterTransformer.spec.ts +1 -0
- package/src/components/Utils/Postgraphile/RangeTransformer.spec.ts +1 -0
- package/src/components/Utils/Postgraphile/SortTransformer.spec.ts +1 -0
- package/src/components/Utils/Postgraphile/UpdateGQLFragmentGenerator.spec.ts +1 -0
- package/src/components/Utils/Postgraphile/generateArrayMutations.spec.ts +1 -0
- package/src/components/Utils/Postgraphile/getArrayDiff.spec.ts +1 -0
- package/src/components/Utils/Postgraphile/getFormDiff.spec.ts +1 -0
- package/src/components/Utils/State/GlobalState.spec.ts +4 -2
- package/src/components/Utils/Transformers/Boolean.spec.ts +1 -0
- package/src/components/Utils/Transformers/DateTime.spec.ts +2 -1
- package/src/components/Utils/Transformers/FileSize.spec.ts +1 -0
- package/src/components/Utils/Transformers/SortArray.spec.ts +1 -0
- package/src/components/Utils/Transformers/Timestamp.spec.ts +3 -2
- package/src/components/Utils/Transformers/TitleCase.spec.ts +1 -0
- package/src/components/VisualElements/ImgElement.spec.tsx +34 -35
- package/src/components/VisualElements/SvgElement.spec.tsx +72 -69
- package/src/helpers/testing.ts +9 -76
- package/src/hooks/useBusy/useBusy.spec.tsx +8 -9
- package/src/hooks/useClickOutside/useClickOutside.spec.tsx +19 -51
- package/src/hooks/useDebounce/useDebounce.spec.tsx +31 -26
- package/src/hooks/useExpand/useExpand.spec.tsx +30 -21
- package/src/hooks/useTabTitle/useTabTitle.spec.tsx +18 -18
- package/src/hooks/useValueOrOnDemand/useValueOrOnDemand.spec.tsx +31 -52
- package/src/styles/variables.scss +3 -1
- package/src/utils/ErrorMapper/ApolloClient/ApolloErrorMapper.spec.ts +1 -0
- package/src/utils/ErrorMapper/ErrorMapper.spec.ts +1 -0
- package/src/utils/ErrorTypeToStationError.spec.tsx +12 -11
- package/src/utils/ToolTipHelpers.spec.ts +1 -0
- package/src/validators/timestamp/timestamp.spec.ts +1 -0
- package/dist/helpers/hooksTestingHelpers.d.ts +0 -7
- package/dist/helpers/hooksTestingHelpers.d.ts.map +0 -1
- package/src/helpers/hooksTestingHelpers.tsx +0 -22
|
@@ -1,24 +1,22 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { fireEvent, render, waitFor } from '@testing-library/react';
|
|
2
2
|
import { useFormikContext } from 'formik';
|
|
3
3
|
import React, { useEffect } from 'react';
|
|
4
4
|
import { act } from 'react-dom/test-utils';
|
|
5
5
|
import { MemoryRouter, Route } from 'react-router-dom';
|
|
6
|
+
import type { Mock } from 'vitest';
|
|
7
|
+
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|
6
8
|
import * as Yup from 'yup';
|
|
7
9
|
import { noop } from '../../helpers/utils';
|
|
8
10
|
import { initializeUi } from '../../initialize';
|
|
9
|
-
import { ActionData
|
|
10
|
-
import { Action } from '../Actions/Action';
|
|
11
|
-
import { MessageBar } from '../MessageBar/MessageBar';
|
|
12
|
-
import { PageHeader, PageHeaderAction } from '../PageHeader';
|
|
11
|
+
import { ActionData } from '../Actions';
|
|
13
12
|
import { FormStation } from './FormStation';
|
|
14
13
|
import { ObjectSchemaDefinition } from './FormStation.models';
|
|
15
|
-
import { SaveOnNavigate } from './SaveOnNavigate/SaveOnNavigate';
|
|
16
14
|
|
|
17
|
-
|
|
15
|
+
vi.mock('../../initialize');
|
|
18
16
|
|
|
19
17
|
/* eslint-disable @typescript-eslint/no-non-null-assertion */
|
|
20
18
|
|
|
21
|
-
const mockActions = (onActionSelected:
|
|
19
|
+
const mockActions = (onActionSelected: Mock): ActionData[] => [
|
|
22
20
|
{
|
|
23
21
|
label: 'Action One',
|
|
24
22
|
onActionSelected: onActionSelected,
|
|
@@ -31,8 +29,8 @@ const defaultProps = {
|
|
|
31
29
|
};
|
|
32
30
|
|
|
33
31
|
// Temporarily disable console.log() from FormStation until proper error handling
|
|
34
|
-
//
|
|
35
|
-
|
|
32
|
+
// vi.spyOn(console, 'log').mockImplementation(() => null);
|
|
33
|
+
vi.spyOn(console, 'error').mockImplementation(() => null);
|
|
36
34
|
|
|
37
35
|
const MakeDirty: React.FC = () => {
|
|
38
36
|
const context = useFormikContext();
|
|
@@ -45,14 +43,12 @@ const MakeDirty: React.FC = () => {
|
|
|
45
43
|
};
|
|
46
44
|
|
|
47
45
|
describe('Details', () => {
|
|
48
|
-
global.ResizeObserver =
|
|
49
|
-
observe:
|
|
50
|
-
|
|
51
|
-
disconnect: jest.fn(),
|
|
52
|
-
}));
|
|
46
|
+
global.ResizeObserver = vi.fn().mockImplementation(function () {
|
|
47
|
+
return { observe: vi.fn(), unobserve: vi.fn(), disconnect: vi.fn() };
|
|
48
|
+
}) as unknown as typeof ResizeObserver;
|
|
53
49
|
|
|
54
50
|
beforeEach(() => {
|
|
55
|
-
|
|
51
|
+
vi.clearAllMocks();
|
|
56
52
|
|
|
57
53
|
initializeUi({
|
|
58
54
|
showNotification: () => {
|
|
@@ -70,74 +66,105 @@ describe('Details', () => {
|
|
|
70
66
|
});
|
|
71
67
|
|
|
72
68
|
it('renders the component without crashing', () => {
|
|
73
|
-
const
|
|
69
|
+
const { container } = render(<FormStation {...defaultProps} />);
|
|
74
70
|
|
|
75
|
-
expect(
|
|
71
|
+
expect(container).toBeTruthy();
|
|
76
72
|
});
|
|
77
73
|
|
|
78
74
|
describe('Actions', () => {
|
|
79
75
|
it('hides actions by default', () => {
|
|
80
|
-
const
|
|
76
|
+
const { container } = render(
|
|
81
77
|
<MemoryRouter>
|
|
82
78
|
<FormStation {...defaultProps} />
|
|
83
79
|
</MemoryRouter>,
|
|
84
80
|
);
|
|
85
81
|
|
|
86
|
-
const
|
|
82
|
+
const actionsPanel = container.querySelector('[data-test-id="actions"]');
|
|
87
83
|
|
|
88
|
-
expect(
|
|
84
|
+
expect(actionsPanel).not.toBeInTheDocument();
|
|
89
85
|
});
|
|
90
86
|
|
|
91
|
-
it
|
|
92
|
-
|
|
93
|
-
[false, false],
|
|
94
|
-
[undefined, false],
|
|
95
|
-
])('alwaysShowActionsPanel working correctly', (value, isVisible) => {
|
|
96
|
-
const wrapper = mount(
|
|
87
|
+
it('shows actions panel when alwaysShowActionsPanel is true', () => {
|
|
88
|
+
const { container } = render(
|
|
97
89
|
<MemoryRouter>
|
|
98
|
-
<FormStation {...defaultProps} alwaysShowActionsPanel={
|
|
90
|
+
<FormStation {...defaultProps} alwaysShowActionsPanel={true} />,
|
|
99
91
|
</MemoryRouter>,
|
|
100
92
|
);
|
|
101
93
|
|
|
102
|
-
const
|
|
94
|
+
const actionsPanel = container.querySelector('[data-test-id="actions"]');
|
|
103
95
|
|
|
104
|
-
expect(
|
|
96
|
+
expect(actionsPanel).toBeInTheDocument();
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
it('does not show actions panel when alwaysShowActionsPanel is false', () => {
|
|
100
|
+
const { container } = render(
|
|
101
|
+
<MemoryRouter>
|
|
102
|
+
<FormStation {...defaultProps} alwaysShowActionsPanel={false} />,
|
|
103
|
+
</MemoryRouter>,
|
|
104
|
+
);
|
|
105
|
+
|
|
106
|
+
const actionsPanel = container.querySelector('[data-test-id="actions"]');
|
|
107
|
+
|
|
108
|
+
expect(actionsPanel).not.toBeInTheDocument();
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
it('does not show actions panel when alwaysShowActionsPanel is undefined', () => {
|
|
112
|
+
const { container } = render(
|
|
113
|
+
<MemoryRouter>
|
|
114
|
+
<FormStation {...defaultProps} alwaysShowActionsPanel={undefined} />,
|
|
115
|
+
</MemoryRouter>,
|
|
116
|
+
);
|
|
117
|
+
|
|
118
|
+
const actionsPanel = container.querySelector('[data-test-id="actions"]');
|
|
119
|
+
|
|
120
|
+
expect(actionsPanel).not.toBeInTheDocument();
|
|
105
121
|
});
|
|
106
122
|
|
|
107
123
|
it('always shows Actions when at least one action is passed into prop "actions"', () => {
|
|
108
|
-
const sampleActions = mockActions(
|
|
109
|
-
const
|
|
124
|
+
const sampleActions = mockActions(vi.fn());
|
|
125
|
+
const { container } = render(
|
|
110
126
|
<MemoryRouter>
|
|
111
127
|
<FormStation {...defaultProps} actions={sampleActions} />
|
|
112
128
|
</MemoryRouter>,
|
|
113
129
|
);
|
|
114
|
-
const actions =
|
|
130
|
+
const actions = container.querySelector('.actions');
|
|
115
131
|
|
|
116
|
-
expect(actions
|
|
132
|
+
expect(actions).toBeInTheDocument();
|
|
117
133
|
});
|
|
118
134
|
|
|
119
135
|
describe('raising logic', () => {
|
|
120
136
|
it('raises the action selected event if form is valid', async () => {
|
|
121
|
-
const spy =
|
|
137
|
+
const spy = vi.fn();
|
|
122
138
|
const sampleActions = mockActions(spy);
|
|
123
|
-
const
|
|
139
|
+
const { container } = render(
|
|
124
140
|
<MemoryRouter>
|
|
125
141
|
<FormStation {...defaultProps} actions={sampleActions} />
|
|
126
142
|
</MemoryRouter>,
|
|
127
143
|
);
|
|
128
144
|
|
|
129
|
-
|
|
130
|
-
.
|
|
131
|
-
|
|
145
|
+
await waitFor(() => {
|
|
146
|
+
const actionsPanel = container.querySelector(
|
|
147
|
+
'[data-test-id="actions"]',
|
|
148
|
+
);
|
|
149
|
+
expect(actionsPanel).toBeInTheDocument();
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
const actionsPanel = container.querySelector(
|
|
153
|
+
'[data-test-id="actions"]',
|
|
154
|
+
);
|
|
155
|
+
const actionButton = actionsPanel?.querySelector(
|
|
156
|
+
'[data-test-id="action"]',
|
|
157
|
+
) as HTMLElement;
|
|
158
|
+
|
|
132
159
|
await act(async () => {
|
|
133
|
-
|
|
160
|
+
fireEvent.click(actionButton);
|
|
134
161
|
});
|
|
135
162
|
|
|
136
163
|
expect(spy).toHaveBeenCalledTimes(1);
|
|
137
164
|
});
|
|
138
165
|
|
|
139
166
|
it("doesn't raise the action selected event if the form is invalid", async () => {
|
|
140
|
-
const spy =
|
|
167
|
+
const spy = vi.fn();
|
|
141
168
|
const sampleActions = mockActions(spy);
|
|
142
169
|
const ForceValidation: React.FC = () => {
|
|
143
170
|
const context = useFormikContext();
|
|
@@ -148,7 +175,7 @@ describe('Details', () => {
|
|
|
148
175
|
return null;
|
|
149
176
|
};
|
|
150
177
|
|
|
151
|
-
const
|
|
178
|
+
const { container } = render(
|
|
152
179
|
<MemoryRouter>
|
|
153
180
|
<FormStation
|
|
154
181
|
{...defaultProps}
|
|
@@ -165,27 +192,35 @@ describe('Details', () => {
|
|
|
165
192
|
);
|
|
166
193
|
|
|
167
194
|
await act(async () => {
|
|
168
|
-
|
|
195
|
+
// Wait for validation
|
|
196
|
+
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
169
197
|
});
|
|
170
198
|
|
|
171
|
-
await
|
|
172
|
-
|
|
199
|
+
await waitFor(() => {
|
|
200
|
+
const actionsPanel = container.querySelector(
|
|
201
|
+
'[data-test-id="actions"]',
|
|
202
|
+
);
|
|
203
|
+
expect(actionsPanel).toBeInTheDocument();
|
|
173
204
|
});
|
|
174
205
|
|
|
175
|
-
const
|
|
176
|
-
|
|
177
|
-
|
|
206
|
+
const actionsPanel = container.querySelector(
|
|
207
|
+
'[data-test-id="actions"]',
|
|
208
|
+
);
|
|
209
|
+
const actionButton = actionsPanel?.querySelector(
|
|
210
|
+
'[data-test-id="action"]',
|
|
211
|
+
) as HTMLElement;
|
|
212
|
+
|
|
178
213
|
await act(async () => {
|
|
179
|
-
|
|
214
|
+
fireEvent.click(actionButton);
|
|
180
215
|
});
|
|
181
216
|
|
|
182
217
|
expect(spy).not.toHaveBeenCalled();
|
|
183
218
|
});
|
|
184
219
|
|
|
185
220
|
it('does not raise the action selected event if saveData throws', async () => {
|
|
186
|
-
const spy =
|
|
221
|
+
const spy = vi.fn();
|
|
187
222
|
const sampleActions = mockActions(spy);
|
|
188
|
-
const
|
|
223
|
+
const { container } = render(
|
|
189
224
|
<MemoryRouter>
|
|
190
225
|
<FormStation
|
|
191
226
|
{...defaultProps}
|
|
@@ -200,21 +235,32 @@ describe('Details', () => {
|
|
|
200
235
|
</MemoryRouter>,
|
|
201
236
|
);
|
|
202
237
|
|
|
203
|
-
|
|
204
|
-
.
|
|
205
|
-
|
|
238
|
+
await waitFor(() => {
|
|
239
|
+
const actionsPanel = container.querySelector(
|
|
240
|
+
'[data-test-id="actions"]',
|
|
241
|
+
);
|
|
242
|
+
expect(actionsPanel).toBeInTheDocument();
|
|
243
|
+
});
|
|
244
|
+
|
|
245
|
+
const actionsPanel = container.querySelector(
|
|
246
|
+
'[data-test-id="actions"]',
|
|
247
|
+
);
|
|
248
|
+
const actionButton = actionsPanel?.querySelector(
|
|
249
|
+
'[data-test-id="action"]',
|
|
250
|
+
) as HTMLElement;
|
|
251
|
+
|
|
206
252
|
await act(async () => {
|
|
207
|
-
|
|
253
|
+
fireEvent.click(actionButton);
|
|
208
254
|
});
|
|
209
255
|
|
|
210
256
|
expect(spy).not.toHaveBeenCalled();
|
|
211
257
|
});
|
|
212
258
|
|
|
213
259
|
it('does not attempt to save and call the action directly when form untouched', async () => {
|
|
214
|
-
const spy =
|
|
260
|
+
const spy = vi.fn();
|
|
215
261
|
const sampleActions = mockActions(spy);
|
|
216
|
-
const saveSpy =
|
|
217
|
-
const
|
|
262
|
+
const saveSpy = vi.fn();
|
|
263
|
+
const { container } = render(
|
|
218
264
|
<MemoryRouter>
|
|
219
265
|
<FormStation
|
|
220
266
|
{...defaultProps}
|
|
@@ -225,11 +271,19 @@ describe('Details', () => {
|
|
|
225
271
|
</MemoryRouter>,
|
|
226
272
|
);
|
|
227
273
|
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
.
|
|
274
|
+
let actionButton: HTMLElement | null = null;
|
|
275
|
+
await waitFor(() => {
|
|
276
|
+
const actionsPanel = container.querySelector(
|
|
277
|
+
'[data-test-id="actions"]',
|
|
278
|
+
);
|
|
279
|
+
actionButton = actionsPanel?.querySelector(
|
|
280
|
+
'[data-test-id="action"]',
|
|
281
|
+
) as HTMLElement;
|
|
282
|
+
expect(actionButton).toBeInTheDocument();
|
|
283
|
+
});
|
|
284
|
+
|
|
231
285
|
await act(async () => {
|
|
232
|
-
|
|
286
|
+
fireEvent.click(actionButton!);
|
|
233
287
|
});
|
|
234
288
|
|
|
235
289
|
expect(saveSpy).not.toHaveBeenCalled();
|
|
@@ -240,7 +294,7 @@ describe('Details', () => {
|
|
|
240
294
|
|
|
241
295
|
describe('Header', () => {
|
|
242
296
|
it('uses titleProperty as preferred header', () => {
|
|
243
|
-
const
|
|
297
|
+
const { container } = render(
|
|
244
298
|
<MemoryRouter>
|
|
245
299
|
<FormStation
|
|
246
300
|
{...defaultProps}
|
|
@@ -254,12 +308,14 @@ describe('Details', () => {
|
|
|
254
308
|
</MemoryRouter>,
|
|
255
309
|
);
|
|
256
310
|
|
|
257
|
-
const header =
|
|
258
|
-
|
|
311
|
+
const header = container.querySelector(
|
|
312
|
+
'[data-test-id="page-header-title"]',
|
|
313
|
+
);
|
|
314
|
+
expect(header?.textContent).toContain('Test title');
|
|
259
315
|
});
|
|
260
316
|
|
|
261
317
|
it('uses defaultTitle as fallback', () => {
|
|
262
|
-
const
|
|
318
|
+
const { container } = render(
|
|
263
319
|
<MemoryRouter>
|
|
264
320
|
<FormStation
|
|
265
321
|
{...defaultProps}
|
|
@@ -276,8 +332,10 @@ describe('Details', () => {
|
|
|
276
332
|
</MemoryRouter>,
|
|
277
333
|
);
|
|
278
334
|
|
|
279
|
-
const header =
|
|
280
|
-
|
|
335
|
+
const header = container.querySelector(
|
|
336
|
+
'[data-test-id="page-header-title"]',
|
|
337
|
+
);
|
|
338
|
+
expect(header?.textContent).toContain('default');
|
|
281
339
|
});
|
|
282
340
|
|
|
283
341
|
describe('Reset Save and Cancel operations', () => {
|
|
@@ -301,7 +359,7 @@ describe('Details', () => {
|
|
|
301
359
|
return null;
|
|
302
360
|
};
|
|
303
361
|
|
|
304
|
-
const
|
|
362
|
+
const { container } = render(
|
|
305
363
|
<MemoryRouter>
|
|
306
364
|
<FormStation
|
|
307
365
|
{...defaultProps}
|
|
@@ -314,13 +372,15 @@ describe('Details', () => {
|
|
|
314
372
|
);
|
|
315
373
|
|
|
316
374
|
await act(async () => {
|
|
317
|
-
|
|
375
|
+
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
318
376
|
});
|
|
319
377
|
|
|
320
|
-
const headerActions =
|
|
378
|
+
const headerActions = container.querySelectorAll(
|
|
379
|
+
'[data-test-id="page-header-actions"] [data-test-id="action"]',
|
|
380
|
+
);
|
|
321
381
|
expect(headerActions).toHaveLength(2);
|
|
322
382
|
|
|
323
|
-
|
|
383
|
+
fireEvent.click(headerActions[0]);
|
|
324
384
|
|
|
325
385
|
expect(value).toBe('initial');
|
|
326
386
|
});
|
|
@@ -328,7 +388,7 @@ describe('Details', () => {
|
|
|
328
388
|
it('allows saving of a dirty form', async () => {
|
|
329
389
|
let path: string;
|
|
330
390
|
|
|
331
|
-
const
|
|
391
|
+
const { container } = render(
|
|
332
392
|
<MemoryRouter>
|
|
333
393
|
<FormStation
|
|
334
394
|
{...defaultProps}
|
|
@@ -346,16 +406,18 @@ describe('Details', () => {
|
|
|
346
406
|
</MemoryRouter>,
|
|
347
407
|
);
|
|
348
408
|
await act(async () => {
|
|
349
|
-
|
|
409
|
+
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
350
410
|
});
|
|
351
411
|
|
|
352
|
-
const headerActions =
|
|
412
|
+
const headerActions = container.querySelectorAll(
|
|
413
|
+
'[data-test-id="page-header-actions"] [data-test-id="action"]',
|
|
414
|
+
);
|
|
353
415
|
expect(headerActions).toHaveLength(2);
|
|
354
416
|
|
|
355
|
-
|
|
417
|
+
fireEvent.click(headerActions[1]);
|
|
356
418
|
|
|
357
419
|
await act(async () => {
|
|
358
|
-
|
|
420
|
+
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
359
421
|
});
|
|
360
422
|
|
|
361
423
|
expect(path!).toBe('/');
|
|
@@ -364,7 +426,7 @@ describe('Details', () => {
|
|
|
364
426
|
it('allows cancellation if wanted', async () => {
|
|
365
427
|
let path: string;
|
|
366
428
|
|
|
367
|
-
const
|
|
429
|
+
const { container } = render(
|
|
368
430
|
<MemoryRouter>
|
|
369
431
|
<FormStation
|
|
370
432
|
{...defaultProps}
|
|
@@ -388,16 +450,18 @@ describe('Details', () => {
|
|
|
388
450
|
);
|
|
389
451
|
|
|
390
452
|
await act(async () => {
|
|
391
|
-
|
|
453
|
+
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
392
454
|
});
|
|
393
455
|
|
|
394
|
-
const headerActions =
|
|
456
|
+
const headerActions = container.querySelectorAll(
|
|
457
|
+
'[data-test-id="page-header-actions"] [data-test-id="action"]',
|
|
458
|
+
);
|
|
395
459
|
expect(headerActions).toHaveLength(3);
|
|
396
460
|
|
|
397
|
-
|
|
461
|
+
fireEvent.click(headerActions[2]);
|
|
398
462
|
|
|
399
463
|
await act(async () => {
|
|
400
|
-
|
|
464
|
+
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
401
465
|
});
|
|
402
466
|
|
|
403
467
|
expect(path!).toBe('/home');
|
|
@@ -407,15 +471,17 @@ describe('Details', () => {
|
|
|
407
471
|
|
|
408
472
|
describe('station message', () => {
|
|
409
473
|
it('station message is not rendered by default', () => {
|
|
410
|
-
const
|
|
474
|
+
const { container } = render(<FormStation {...defaultProps} />);
|
|
411
475
|
|
|
412
|
-
const messageBar =
|
|
476
|
+
const messageBar = container.querySelector(
|
|
477
|
+
'[data-test-id="message-bar"]',
|
|
478
|
+
);
|
|
413
479
|
|
|
414
|
-
expect(messageBar
|
|
480
|
+
expect(messageBar).not.toBeInTheDocument();
|
|
415
481
|
});
|
|
416
482
|
|
|
417
483
|
it('renders a MessageBar component if stationMessage is set', () => {
|
|
418
|
-
const
|
|
484
|
+
const { container } = render(
|
|
419
485
|
<MemoryRouter>
|
|
420
486
|
<FormStation
|
|
421
487
|
{...defaultProps}
|
|
@@ -428,14 +494,16 @@ describe('Details', () => {
|
|
|
428
494
|
</MemoryRouter>,
|
|
429
495
|
);
|
|
430
496
|
|
|
431
|
-
const messageBar =
|
|
497
|
+
const messageBar = container.querySelector(
|
|
498
|
+
'[data-test-id="message-bar"]',
|
|
499
|
+
);
|
|
432
500
|
|
|
433
|
-
expect(messageBar
|
|
501
|
+
expect(messageBar).toBeInTheDocument();
|
|
434
502
|
});
|
|
435
503
|
|
|
436
504
|
it(`raises MessageBar's 'onClose' callback`, () => {
|
|
437
|
-
const spy =
|
|
438
|
-
const
|
|
505
|
+
const spy = vi.fn();
|
|
506
|
+
const { container } = render(
|
|
439
507
|
<MemoryRouter>
|
|
440
508
|
<FormStation
|
|
441
509
|
{...defaultProps}
|
|
@@ -452,9 +520,11 @@ describe('Details', () => {
|
|
|
452
520
|
</MemoryRouter>,
|
|
453
521
|
);
|
|
454
522
|
|
|
455
|
-
const
|
|
523
|
+
const closeButton = container.querySelector(
|
|
524
|
+
'[data-test-id="message-bar-close-button"]',
|
|
525
|
+
) as HTMLButtonElement;
|
|
456
526
|
|
|
457
|
-
|
|
527
|
+
fireEvent.click(closeButton);
|
|
458
528
|
|
|
459
529
|
expect(spy).toHaveBeenCalledTimes(1);
|
|
460
530
|
});
|
|
@@ -463,10 +533,10 @@ describe('Details', () => {
|
|
|
463
533
|
describe('station error', () => {
|
|
464
534
|
it(`displays an error message when submitting throws an error and closes the message when 'X' is clicked`, async () => {
|
|
465
535
|
const formError = new Error('Error on saving, not executing action');
|
|
466
|
-
const spy =
|
|
536
|
+
const spy = vi.fn();
|
|
467
537
|
const sampleActions = mockActions(spy);
|
|
468
538
|
|
|
469
|
-
const
|
|
539
|
+
const { container } = render(
|
|
470
540
|
<MemoryRouter>
|
|
471
541
|
<FormStation
|
|
472
542
|
{...defaultProps}
|
|
@@ -481,44 +551,54 @@ describe('Details', () => {
|
|
|
481
551
|
</MemoryRouter>,
|
|
482
552
|
);
|
|
483
553
|
|
|
484
|
-
|
|
485
|
-
.
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
554
|
+
await waitFor(() => {
|
|
555
|
+
const actionsPanel = container.querySelector(
|
|
556
|
+
'[data-test-id="actions"]',
|
|
557
|
+
);
|
|
558
|
+
expect(actionsPanel).toBeInTheDocument();
|
|
489
559
|
});
|
|
490
560
|
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
expect(messageBar.exists()).toBe(true);
|
|
561
|
+
const actionsPanel = container.querySelector('[data-test-id="actions"]');
|
|
562
|
+
const actionButton = actionsPanel?.querySelector(
|
|
563
|
+
'[data-test-id="action"]',
|
|
564
|
+
) as HTMLElement;
|
|
496
565
|
|
|
497
|
-
|
|
566
|
+
await act(async () => {
|
|
567
|
+
fireEvent.click(actionButton);
|
|
568
|
+
});
|
|
498
569
|
|
|
499
|
-
|
|
570
|
+
let messageBar: Element | null = null;
|
|
571
|
+
await waitFor(() => {
|
|
572
|
+
messageBar = container.querySelector('[data-test-id="message-bar"]');
|
|
573
|
+
expect(messageBar).toBeInTheDocument();
|
|
574
|
+
});
|
|
500
575
|
|
|
501
|
-
|
|
576
|
+
const toggle = container.querySelector(
|
|
577
|
+
'[data-test-id="message-bar-details-button"]',
|
|
578
|
+
) as HTMLElement;
|
|
502
579
|
|
|
503
|
-
|
|
580
|
+
fireEvent.click(toggle);
|
|
504
581
|
|
|
505
|
-
|
|
582
|
+
const body = container.querySelector('.body') as HTMLElement;
|
|
506
583
|
|
|
507
|
-
|
|
584
|
+
expect(body.textContent).toContain(formError.message);
|
|
508
585
|
|
|
509
|
-
|
|
586
|
+
const closeButton = container.querySelector(
|
|
587
|
+
'[data-test-id="message-bar-close-button"]',
|
|
588
|
+
) as HTMLButtonElement;
|
|
589
|
+
fireEvent.click(closeButton);
|
|
510
590
|
|
|
511
|
-
messageBar =
|
|
591
|
+
messageBar = container.querySelector('.messageBar');
|
|
512
592
|
|
|
513
|
-
expect(messageBar
|
|
593
|
+
expect(messageBar).not.toBeInTheDocument();
|
|
514
594
|
});
|
|
515
595
|
|
|
516
596
|
it(`displays an error body when a body is attached to the error object`, async () => {
|
|
517
597
|
const formError = new Error('Submitting failed');
|
|
518
|
-
const spy =
|
|
598
|
+
const spy = vi.fn();
|
|
519
599
|
const sampleActions = mockActions(spy);
|
|
520
600
|
|
|
521
|
-
const
|
|
601
|
+
const { container } = render(
|
|
522
602
|
<MemoryRouter>
|
|
523
603
|
<FormStation
|
|
524
604
|
{...defaultProps}
|
|
@@ -533,31 +613,42 @@ describe('Details', () => {
|
|
|
533
613
|
</MemoryRouter>,
|
|
534
614
|
);
|
|
535
615
|
|
|
536
|
-
|
|
537
|
-
.
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
616
|
+
await waitFor(() => {
|
|
617
|
+
const actionsPanel = container.querySelector(
|
|
618
|
+
'[data-test-id="actions"]',
|
|
619
|
+
);
|
|
620
|
+
expect(actionsPanel).toBeInTheDocument();
|
|
541
621
|
});
|
|
542
622
|
|
|
543
|
-
|
|
623
|
+
const actionsPanel = container.querySelector('[data-test-id="actions"]');
|
|
624
|
+
const actionButton = actionsPanel?.querySelector(
|
|
625
|
+
'[data-test-id="action"]',
|
|
626
|
+
) as HTMLElement;
|
|
544
627
|
|
|
545
|
-
|
|
628
|
+
await act(async () => {
|
|
629
|
+
fireEvent.click(actionButton);
|
|
630
|
+
});
|
|
546
631
|
|
|
547
|
-
toggle
|
|
632
|
+
let toggle: HTMLElement | null = null;
|
|
633
|
+
await waitFor(() => {
|
|
634
|
+
toggle = container.querySelector(
|
|
635
|
+
'[data-test-id="message-bar-details-button"]',
|
|
636
|
+
) as HTMLElement;
|
|
637
|
+
expect(toggle).toBeInTheDocument();
|
|
638
|
+
});
|
|
548
639
|
|
|
549
|
-
|
|
640
|
+
fireEvent.click(toggle!);
|
|
550
641
|
|
|
551
|
-
const body =
|
|
642
|
+
const body = container.querySelector('.body') as HTMLElement;
|
|
552
643
|
|
|
553
|
-
expect(body.
|
|
644
|
+
expect(body.textContent).toContain(formError.message);
|
|
554
645
|
});
|
|
555
646
|
});
|
|
556
647
|
|
|
557
648
|
describe('Prevent multiple form submissions', () => {
|
|
558
649
|
it(`disables actions and 'SaveOnNavigate' while a form is being submitted`, async () => {
|
|
559
|
-
|
|
560
|
-
const spy =
|
|
650
|
+
vi.useFakeTimers();
|
|
651
|
+
const spy = vi.fn();
|
|
561
652
|
const sampleActions = mockActions(spy);
|
|
562
653
|
const onSubmit = (): Promise<{ id: number }> => {
|
|
563
654
|
return new Promise((resolve) => {
|
|
@@ -567,7 +658,7 @@ describe('Details', () => {
|
|
|
567
658
|
});
|
|
568
659
|
};
|
|
569
660
|
|
|
570
|
-
const
|
|
661
|
+
const { container } = render(
|
|
571
662
|
<MemoryRouter>
|
|
572
663
|
<FormStation
|
|
573
664
|
{...defaultProps}
|
|
@@ -580,61 +671,53 @@ describe('Details', () => {
|
|
|
580
671
|
</MemoryRouter>,
|
|
581
672
|
);
|
|
582
673
|
|
|
583
|
-
let saveOnNavigate = wrapper.find(SaveOnNavigate);
|
|
584
|
-
let action = wrapper.find(Action);
|
|
585
|
-
let isDisabled = action.prop('action').isDisabled;
|
|
586
|
-
|
|
587
|
-
// assert SaveOnNavigate is aware the form is not being submitted
|
|
588
|
-
saveOnNavigate = wrapper.find(SaveOnNavigate);
|
|
589
|
-
expect(saveOnNavigate.prop('isSubmitting')).toBe(false);
|
|
590
|
-
|
|
591
674
|
// assert form actions are initially enabled
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
675
|
+
await waitFor(() => {
|
|
676
|
+
const actionsPanel = container.querySelector(
|
|
677
|
+
'[data-test-id="actions"]',
|
|
678
|
+
);
|
|
679
|
+
expect(actionsPanel).toBeInTheDocument();
|
|
680
|
+
});
|
|
681
|
+
|
|
682
|
+
let actionsPanel = container.querySelector('[data-test-id="actions"]');
|
|
683
|
+
let actionButton = actionsPanel?.querySelector(
|
|
684
|
+
'[data-test-id="action"]',
|
|
685
|
+
) as HTMLElement;
|
|
686
|
+
expect(actionButton).toBeInTheDocument();
|
|
595
687
|
|
|
596
688
|
// submit form
|
|
597
|
-
const actionSelected = wrapper
|
|
598
|
-
.find(Action)
|
|
599
|
-
.prop('action').onActionSelected;
|
|
600
689
|
await act(async () => {
|
|
601
|
-
|
|
690
|
+
fireEvent.click(actionButton);
|
|
602
691
|
});
|
|
603
692
|
|
|
604
693
|
// place form into 'submitting' state
|
|
605
694
|
await act(async () => {
|
|
606
|
-
|
|
695
|
+
vi.advanceTimersByTime(500);
|
|
607
696
|
});
|
|
608
|
-
wrapper.update();
|
|
609
|
-
|
|
610
|
-
// assert SaveOnNavigate is aware the form is currently being submitted
|
|
611
|
-
saveOnNavigate = wrapper.find(SaveOnNavigate);
|
|
612
|
-
expect(saveOnNavigate.prop('isSubmitting')).toBe(true);
|
|
613
697
|
|
|
614
698
|
// assert form actions are disabled while form is being submitted
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
699
|
+
actionsPanel = container.querySelector('[data-test-id="actions"]');
|
|
700
|
+
actionButton = actionsPanel?.querySelector(
|
|
701
|
+
'[data-test-id="action"]',
|
|
702
|
+
) as HTMLElement;
|
|
703
|
+
expect(actionButton).toHaveClass('isDisabled');
|
|
618
704
|
|
|
619
705
|
// complete form submission
|
|
620
706
|
await act(async () => {
|
|
621
|
-
|
|
707
|
+
vi.runAllTimers();
|
|
622
708
|
});
|
|
623
|
-
wrapper.update();
|
|
624
|
-
|
|
625
|
-
// assert SaveOnNavigate is aware the form is no longer being submitted
|
|
626
|
-
saveOnNavigate = wrapper.find(SaveOnNavigate);
|
|
627
|
-
expect(saveOnNavigate.prop('isSubmitting')).toBe(false);
|
|
628
709
|
|
|
629
710
|
// assert form actions are enabled again after form is submitted
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
711
|
+
actionsPanel = container.querySelector('[data-test-id="actions"]');
|
|
712
|
+
actionButton = actionsPanel?.querySelector(
|
|
713
|
+
'[data-test-id="action"]',
|
|
714
|
+
) as HTMLElement;
|
|
715
|
+
expect(actionButton).not.toHaveClass('isDisabled');
|
|
633
716
|
});
|
|
634
717
|
|
|
635
718
|
it(`enables actions and 'SaveOnNavigate' if form submission fails`, async () => {
|
|
636
|
-
|
|
637
|
-
const spy =
|
|
719
|
+
vi.useFakeTimers();
|
|
720
|
+
const spy = vi.fn();
|
|
638
721
|
const sampleActions = mockActions(spy);
|
|
639
722
|
const onSubmit = (): Promise<{ id: number }> => {
|
|
640
723
|
return new Promise((_resolve, reject) => {
|
|
@@ -644,7 +727,7 @@ describe('Details', () => {
|
|
|
644
727
|
});
|
|
645
728
|
};
|
|
646
729
|
|
|
647
|
-
const
|
|
730
|
+
const { container } = render(
|
|
648
731
|
<MemoryRouter>
|
|
649
732
|
<FormStation
|
|
650
733
|
{...defaultProps}
|
|
@@ -657,56 +740,48 @@ describe('Details', () => {
|
|
|
657
740
|
</MemoryRouter>,
|
|
658
741
|
);
|
|
659
742
|
|
|
660
|
-
let saveOnNavigate = wrapper.find(SaveOnNavigate);
|
|
661
|
-
let action = wrapper.find(Action);
|
|
662
|
-
let isDisabled = action.prop('action').isDisabled;
|
|
663
|
-
|
|
664
|
-
// assert SaveOnNavigate is aware the form is not being submitted
|
|
665
|
-
saveOnNavigate = wrapper.find(SaveOnNavigate);
|
|
666
|
-
expect(saveOnNavigate.prop('isSubmitting')).toBe(false);
|
|
667
|
-
|
|
668
743
|
// assert form actions are initially enabled
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
744
|
+
let actionButton: HTMLElement | null = null;
|
|
745
|
+
await waitFor(() => {
|
|
746
|
+
const actionsPanel = container.querySelector(
|
|
747
|
+
'[data-test-id="actions"]',
|
|
748
|
+
);
|
|
749
|
+
actionButton = actionsPanel?.querySelector(
|
|
750
|
+
'[data-test-id="action"]',
|
|
751
|
+
) as HTMLElement;
|
|
752
|
+
expect(actionButton).toBeInTheDocument();
|
|
753
|
+
});
|
|
754
|
+
|
|
755
|
+
expect(actionButton).toBeInTheDocument();
|
|
672
756
|
|
|
673
757
|
// submit form
|
|
674
|
-
const actionSelected = wrapper
|
|
675
|
-
.find(Action)
|
|
676
|
-
.prop('action').onActionSelected;
|
|
677
758
|
await act(async () => {
|
|
678
|
-
|
|
759
|
+
fireEvent.click(actionButton!);
|
|
679
760
|
});
|
|
680
761
|
|
|
681
762
|
// place form into 'submitting' state
|
|
682
763
|
await act(async () => {
|
|
683
|
-
|
|
764
|
+
vi.advanceTimersByTime(500);
|
|
684
765
|
});
|
|
685
|
-
wrapper.update();
|
|
686
|
-
|
|
687
|
-
// assert SaveOnNavigate is aware the form is currently being submitted
|
|
688
|
-
saveOnNavigate = wrapper.find(SaveOnNavigate);
|
|
689
|
-
expect(saveOnNavigate.prop('isSubmitting')).toBe(true);
|
|
690
766
|
|
|
691
767
|
// assert form actions are disabled while form is being submitted
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
768
|
+
const actionsPanel2 = container.querySelector('[data-test-id="actions"]');
|
|
769
|
+
actionButton = actionsPanel2?.querySelector(
|
|
770
|
+
'[data-test-id="action"]',
|
|
771
|
+
) as HTMLElement;
|
|
772
|
+
expect(actionButton).toHaveClass('isDisabled');
|
|
695
773
|
|
|
696
774
|
// complete form submission
|
|
697
775
|
await act(async () => {
|
|
698
|
-
|
|
776
|
+
vi.runAllTimers();
|
|
699
777
|
});
|
|
700
|
-
wrapper.update();
|
|
701
|
-
|
|
702
|
-
// assert SaveOnNavigate is aware the form is no longer being submitted
|
|
703
|
-
saveOnNavigate = wrapper.find(SaveOnNavigate);
|
|
704
|
-
expect(saveOnNavigate.prop('isSubmitting')).toBe(false);
|
|
705
778
|
|
|
706
779
|
// assert form actions are enabled again after form is submitted
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
780
|
+
const actionsPanel3 = container.querySelector('[data-test-id="actions"]');
|
|
781
|
+
actionButton = actionsPanel3?.querySelector(
|
|
782
|
+
'[data-test-id="action"]',
|
|
783
|
+
) as HTMLElement;
|
|
784
|
+
expect(actionButton).not.toHaveClass('isDisabled');
|
|
710
785
|
});
|
|
711
786
|
});
|
|
712
787
|
});
|