# Neo react changelog

This file details all new features and changes to functionality. If you only need to see changes that require updates to your project, see the [breaking changes](./Breaking.md) readme.

## Version 1.6.12 (8 October 2026)

- Routing
    - Fixed NavigateToView not updating the browser url display if navigating to a route with no segments (e.g. the home route).

## Version 1.6.11 (5 October 2026)

- Grid
    - Added `maxWidth` convenience prop.
    - Added `truncateText` prop to prevent text wrapping.
- AutoFocus:
    - Added `autoFocus` prop to Form component.
    - Added `autoFocus` to Modal component.
    - Added `Neo.AutoFocus` component.
- Changed FormGroup and Input components to pass `id` prop to editor.
- Sticky table headers
    - Fixed heading snapping within modal again.
    - Tables within a fixed element will no longer snap to the header.

## Version 1.6.9 (28 September 2026)

- Added HeaderPanel classes to allow parts of a view to render in the app header.
    - Allows other neo views (e.g. catalogue, reporting) to render content in the app header.
    - Requires implementation in each project. Examples will be added to the demo app.

## Version 1.6.8 (16 September 2026)

- Drop down
    - Fixed drop down not working correctly where the id of the selected item was a numeric string.

## Version 1.6.7 (4 September 2026)

- Drop down
    - Fixed issue where items with null value were not being filtered when the bound value is null.
    - Fixed default item detection not taking filterPredicate into account.

## Version 1.6.6 (20 August 2026)

- Number input
    - Can now suppress stepping the value up and down when pressing the arrow keys.
    - Set `suppressKeyDownStepping` per instance on `numProps`.
    - Stepping can be disabled globally using `Neo.NumberInput.suppressKeyDownStepping = true;`.

## Version 1.6.5 (3 August 2026)

- Routing fix
    - Fixed params not updating when a view is referenced by 2 different routes.
- Breadcrumb
    - Fixed breadcrumb item showing with blank description.
- Sticky table headers
    - Fixed heading snapping to app header when grid is in a modal.

## Version 1.6.4 (20 July 2026)

- Neo.Card
    - Added `description` prop to neo card.
    - Additional root classes will be rendered when description, or headerElements is specified for more styling options.
- Drop down
    - Added parent value to `onItemSelected`.
    - Added `nullValue` to better control when a blank item renders.
        - With this change, the basic `Neo.DropDown` component is more explicit with how it decides whether or not to show a blank item. 
    Previously if the items list contained an item with any falsy value, then a blank item would not be shown, and the item with the falsy value would be shown if the bound value was null. 
    This has changed so that only items with a value of `null` are considered blank items. 
    If you need a different value to be considered null, then set the `nullValue` prop.
- Grid
    - Added `headerProps` and `cellProps` to allow customisation at header / cell level.

## Version 1.6.3 (14 July 2026)

- Allow `ICardProps` to be referenced.

## Version 1.6.2 (10 July 2026)

- Routing fix
    - Fixed static routes not being preferred to parameterised routes.
- Grid Column
    - Added `invertSortIcon` prop to allow the sort icon to be inverted. Can be used on a computed property that is the inverse value of the underlying sort column.

## Version 1.6.1 (23 June 2026)

- Routing changes
    - Routes parameters can now be defined in the route path. E.g. `/products/:id/sales`.
    - Parameters not defined in the path will continue to be appended at the end of the path.
    - Internal overhaul of routing system to allow better unit testing.

## Version 1.5.0 (28 May 2026)

- Fixed routes with the same prefix, but different parameter counts not being registered.
    - E.g. a products list view with path `/products`, and product item view with path `/products/{itemId}` were previously seen as a duplicate route. 
    - A url of `/products/123` would have matched against the first route.
- ViewBase - allow `viewParamsUpdated` to be called on initialise even if all the parameters have default values.

## Version 1.4.3 (22 April 2026)

- Fix variable usage in neo-react styles.
    - Now uses bootstrap variable names instead of legacy custom variable names defined in end project.
    - This change is to allow simplification of the variables file in the end project.
    - Existing projects do not need to make changes to their variables files.

## Version 1.4.2 (20 April 2026)

- Navigation helper
    - Changed `openWindow` and `readOpenerState` to store state as string.

## Version 1.4.1 (17 April 2026)

- AutoCompleteDropDown
    - Fixed type issues when `valueMember` and `displayMember` were specified.

## Version 1.4.0 (16 April 2026)

- Button
    - Added an `isActive` prop to enable toggle buttons.
- Icons
    - Added `tooltip` and `className` props to the `Neo.Icon` component.
    - Added some missing material symbols mappings.
- Sticky table headers
    - Fixed column widths not being restored properly.

## Version 1.3.10 (19 March 2026)

- AutoCompleteDropDown
    - Fixed InputElement prop not being passed to underlying react-select component.

## Version 1.3.9 (4 March 2026)

- Dropdown
    - Added support for grouped drop downs by specifying `groupDisplayMember` and `childListMember` props.
- ValidationSummary
    - Fixed component not updating when invalid rules change.

## Version 1.3.8 (24 Nov 2025)

- Deserialiser
    - Fixed plain arrays not deserialising when marked with `ChildList` attribute.

## Version 1.3.7 (18 Nov 2025)

- Modals shown with ModalUtils will now preserve pre-formatted text if the provided content is a string.

## Version 1.3.6 (15 Oct 2025)

- Fixed type in auto complete drop down preventing use of string ids in multi select drop down.

## Version 1.3.5

- Fixed drop down to not add a blank item if the bound value is zero, and the items contains an item with id of zero.
- Minor changes to `IRoute` to allow `basePath` property.

## Version 1.3.4

- Added `PopupHost` component
    - Can be used to create popup controls like drop downs / search components.

## Version 1.3.3

- Minor type fixes.

## Version 1.3.2

- List - Added `activeItems` property which will return items that are not being deleted.
- DateUtils - Added `DateUtils.formatApi` for formatting dates to be used in a query string.
- Utils.getQueryString() - will now format dates passed in as the root object. Although using `DateUtils.formatApi` is preferred.
- TooltipHelper - Added overload for passing in a rectangle instead of an element.
- Deprecated `RowGroup.hideExpandButton`. This was broken, and is difficult to implement properly. Rather return null from the expand property.
- Added `FormContext.labelSizes` to set the label width on all inline form groups contained within the form context.

## Version 1.3.1

- Routing - Fixed an issue where the base route would take precedence over other routes if it had parameters, and was declared before other routes.

## Version 1.3.0

- ViewBase and ViewComponentBase now require that the linked view model has a `TaskRunner` as the first argument. See breaking changes for more info.
- GridLayout
    - Added `arrangeVertically` prop. Allows items to flow from top to bottom instead of left to right. Useful the height of each item differs.
- Neo.Card
    - Now has a `footerContent` prop. This allows a footer to be added to the card. The footer will be anchored to the bottom of the card, and will be collapsed if the card is collapsed.
- Settings
    - Added `buttons.backButton` setting to replace the `icons.backIcon` global setting. This allows more customisation of back buttons used in built in neo screens.
    - Added `icons.unDelete` to allow changing the undo delete icon in neo grids.
- Deferred deleting: see below.

### Deferred deleting

Previously when clicking the default delete button in a neo grid, the item would be removed from the bound list, and tracked under the `deletedList` property. When serialising the list (usually on clicking save), the deleted items would be included with a tracking state of "deleted" so that they could be deleted from the database.

This was slightly confusing for a user, since they might not know that a save is required to actually commit the delete. Additionally, if the save failed, the item would not re-appear in the grid and the user would be stuck, having to reload the screen.

In this version, a new option has been added to allow the grid to keep displaying the row being deleted, but displayed with ~~strikethrough~~ text and 50% transparency. The delete button will show a different icon when the item is marked as deleted, allowing the user to undo the delete before saving. A tooltip will also show when hovering over the row.

To make this work, 3 main changes were made to `ModelBase` and `List`. 
- `ModelBase` now has an `isSelfDeleting` property. 
    - This causes the grid to display the item differently. 
    - Models with this property set to true will be serialised with a tracking state of deleted.
    - This will cause `isDirty` to return true, however `isSelfDirty` will remain false.
- `List` has new methods: `beginRemove` and `toggleRemove`.
    - These new methods check whether the list is in "soft delete" mode (see below), and if so, sets `isSelfDeleting` to true on the item being removed.
    - The existing `remove` and `removeWithoutTracking` methods will always remove the item from the main list regardless of the delete mode.
- `List` now has an `activeLength` property.
    - Use this if you need to check if the list is required to have a certain amount of items. E.g. in validation rules.


#### Settings:

To control the behavior when removing an item, you use the global setting, or you can configure each list individually by passing in options to the list constructor. 

- To configure globally, set `Misc.Settings.list.removeItemBehavior` to `RemoveItemBehavior.MarkDeleted`.
- The tooltip to show that the item is being deleted can be customised by setting the `isDeletingTooltip` prop on the grid row, or by using the `Misc.Settings.grid.isDeletingTooltip` global setting.

By default this setting will be enabled for catalogue grids, but is not enabled globally.

To change the styling of deleted rows, target: `tr.neo-item-deleting`.