angular-beam
0.2.0 (2026-04-09)
Migration
To migrate to this version, follow the migration guide. It can be found in the blogposts on foundation here
Beam composition changed
-
Removed
angular-svcapi-expanders -
Removed
angular-stdapi-expanders -
Added
angularProjects-core:7.10.0 -
Added
angularFinder-core:1.1.2(Symbiotic) -
Added
angular-finder-expanders:1.1.2(Symbiotic) -
Added
angularFinder-validation:1.1.2(Symbiotic) -
Added
angularQuerysearch-core:1.1.1 -
Added
angular-svcapi-account-integration-expanders:3.6.1(Symbiotic) -
Added
angular-svcapi-authorization-expanders:3.6.1(Symbiotic) -
Added
angular-stdapi-account-integration-expanders:3.6.2(Symbiotic) -
Added
angular-stdapi-authorization-expanders:3.6.2(Symbiotic) -
Added
angular-stdapi-finder-expanders:3.6.2(Symbiotic) -
Updated
angular-expanders:6.13.0toangular-expanders:7.10.0 -
Updated
angularProjects-validation:6.13.0toangularProjects-validation:7.10.0 -
Updated
net.democritus.angular:angular-querysearch-expanders:6.13.0tonet.democritus.angular.querysearch:angular-querysearch-expanders:1.1.1 -
Updated
angular-svcapi-querysearch-expanders:2.6.0toangular-svcapi-querysearch-expanders:3.6.1 -
Updated
angular-stdapi-querysearch-expanders:2.5.0toangular-stdapi-querysearch-expanders:3.6.2
Added
-
Added
Filtersupport.- When the angular-finder-expanders or angular-query-expanders is present, every finder without the
noViewLayeroption and every querysearch will be supported on its associated list page component. - Added a
FilterConnectorelement that implements theConnectorelement in the model and added aFinderConnector/QueryConnectorthat implements the abstractFilterConnector. - Added a
FilterViewelement that implements theViewelement in the model and added aFinderView/QueryViewthat implements the abstractFilterView. - Added a new sidebar on the list page that will be expanded when a filter is present.
- Added support for the
hasSearchBaroption on DataElement, this will expand a form in the header of the list page.- The form will use the simplest (the least amount of OperatorPairs) finder in the model that contains the field and operator passed as the value of the option to filter the list.
- Added multiple model validations to check if all finders are present for
DataChildlist pages and DataElements with the optionhasSearchBarenabled. - Added new
<...>FilterFormComponentthat will expand a form for every querysearch (with the correct options relating to technologies used (stdapi / svcapi)) and finders (excluding findAll and with optionnoViewLayer) in the model. - Added new
<...>FilterComponentthat handles all possible filtering on a list page. - Added new option on finder
angular.defaultFinderFilter. This will allow any dropdowns in the edit/add and filter forms to be searchable using the chosen finder. What field of the finder needs to be used must be set as the option value. - Added new option on querysearch
angular.defaultQueryFilter. This will allow any dropdowns in the edit/add and filter forms to be searchable using the chosen querysearch. What field of the querysearch needs to be used must be set as the option value.
- When the angular-finder-expanders or angular-query-expanders is present, every finder without the
-
Made
DataViewdefault actions (add/edit) swappable:- Added tag
#angular.data-view.action.add.customto disable default add page. - Added tag
#angular.data-view.action.edit.customto disable default edit page. - Added tag
#angular.data-view.action.delete.customto disable default delete dialog. - Added tag
#angular.data-view.routing.add.disableto disable the add route. - Added tag
#angular.data-view.routing.edit.disableto disable the edit route. - Added feature anchors to remaining DataView actions (add, edit, delete, details, list).
- Added tag
-
Added
DataProjectionsupport.- Metamodel addition of
DataProjectionConnector. Currently, this is automatically generated fordetailsandinfoprojections. - Metamodel addition of
ListView. Currently, this is automatically generated linked to aDataProjectionConnectorfor the info projection. With the optionangular.legacy.table.useModelProjectionthis can be changed back to details. This is a cascading option and can be set onAngularApp,FeatureModuleorDataConnector. - Expanded data sources now work with projections.
- Interface change
getSingle({ id }: { id: string }): Observable<%dataConnector%Model>;->getSingle<T extends keyof %dataConnector%Projection = '%dataConnector%'>({ id, projection }: { id: string, projection?: T }): Observable<%dataConnector%Projection[T]>;getList({ segmentParameters }: { segmentParameters?: %dataConnector%SegmentParameters }): Observable<%dataConnector%ListModel>;->getList<T extends keyof %dataConnector%Projection = '%dataConnector%'>({ segmentParameters, projection }: { segmentParameters?: %dataConnector%SegmentParameters, projection?: T }): Observable<PaginatedList<%dataConnector%Projection[T]\>>;
- Default projection is the details projection which corresponds with
DataConnector.model.tsfor backwards compatibility reasons. - The
DataProjectionConnectorCompositehas a helper methodgetModelNamethat can be used to get the right name of the connector. To not break backwards compatibility the name ofDataConnector.model.tsshould be kept. The decision has been made to make this the 'details' projection, however to not change the name. That is why aDataProjectionConnectorwith the same name as the linkedDataConnectorwill return the name of theDataConnector. Other projections, e.g.Tablewill return the name ofDataConnector+ name ofDataProjectionConnector. - Added
TransmuteIsTableColumnOptiontransmuter to switch the optionangular.isTableColumnto theinfoflag on a field.
- Metamodel addition of
-
Added an API specific
HttpClient. This allows for easy changing of authentication headers, error handling etc. per different API implemented.-
An
AngularApp-http-client.service.tsis expanded that handles- Http request methods
- BaseUrl
- Default headers (
Authorization,content-type) - Default operators (
handleUnauthorizedError)
The rest is handled in the
*-data-access.service.tsservices. -
To facilitate the removal of the use of interceptors a lot of operator functions that handled the logic of the interceptors have been created.
handleDataAccessErrorhandleAlertErrorhandleDataAccessFormErrornotifyDataConnectorSuccessEventnotifyDataConnectorFailureEvent
These can be used to add this behaviour easily to custom endpoints.
-
This is still based on the angular
HttpClientand all functionality of this client can still be used.
-
-
Added a new
layerTypeANGULAR_FUNCTIONS. This will expand a new folder for every angular module where functions can reside. All the newly expanded operator functions can be found here. -
Added authorization support. Added
AuthorizationRightsto make certain parts of the application not accessible (used in guards, directives, services). These rights can be accessed through theACTION_AUTHORIZATION_SOURCEInjectionToken, the interface can be provided by a control layer specific implementation, or you can provide your own. Some directives have been added to handle authorization on the most common used componentsButtonAuthorizationDirectiveTableRowActionMenuAuthorizationDirective
These directives handle disabling components as well as showing tooltips on why it is disabled. You can look at these as examples when wanting to use the authorization feature somewhere else.
-
Metamodel additions of abstract
ConnectorandView.- A
DataConnectornow has a reference toconnectorsand these can be aDataProjectionConnector,FilterConnector, etc. - A
DataViewnow has a reference toviewsand these can be aListView,FilterView, etc.
- A
-
The option
angular.allowedFileTypeswith a comma separated list of file extension types (eg..jpeg,.png) as its value. This option restricts file upload fields to only allow the defined file types for the add and edit form. -
Added custom anchors to
StorageKeysexpander. Projects had this concept as well and now they can add their keys. -
Added
updateBadgeCountmethod toMenuService. -
Added
MENU_SERVICEinjection token and an interface to enable custom implementations of theMenuusing theangular.customization.hasCustomMenuServiceoption -
Added option
angular.instance-hyper-link.disabledas cascading option onFieldCompositethat expands link fields as regular texts instead of a hyperlink for table and detail components. This option can also be used to disable the hyperlink onnamefields that link to the details page. -
Added
TapAlertErrorOperatorExpanderthat handles anAlertErrorModelbut does not swallow the error. -
Added support for option
cruds.table.pageSize, which determines the available options in the table paginator. -
Breaking Changes: The filterOptions have been refactored to classes and the filter forms now subscribe to a new injectable
<...>FilterOptionsSourcethat is provided on root. Wherever these filterOptions need to be updated you can inject the<...>FilterOptionsSourceinto your component and call theupdateFilterOptions()function. The filterComponent will update accordingly. The previous feature and custom anchors have been removed from the<...>FilterFormComponentany lost customization can be re-added as explained before. -
Added support for the following options, these will hide/disable fields on the expanded create or edit forms:
- cruds.form.hide
- cruds.form.hideOnCreate
- cruds.form.hideOnModify
- cruds.form.disable
- cruds.form.disableOnCreate
- cruds.form.disableOnModify
-
Added option
angular.data-view.hasCustomTableViewOptionsto disable default implementation. -
Added
StorageKeysTsExpanderto centralize key names used in local storage. -
Added min/max date validation to
FormFieldErrorParserExpander.
Changed
-
Updated dependencies:
@nsx/ngx-ns-core:1.11.0 -> 2.3.1
-
Upgrade
PackageJsonExpanderto latest versions:- Updated to angular 21. See also the migration guide
- Changes:
- Removed
@angular/animations, this is being deprecated. However, if necessary it can be re-added custom in thepackage.json5file and provided in theapp.config. ts. - Control flow syntax migration, Angular is planning
on removing the
ngIf,ngFor, ... directives in Angular 22. They deprecated them a while ago, so it is best to start switching to the control flow syntax.
- Removed
- Changes:
- Updated
ngx-translateto version 17. See also the migration guide. - Updated
yarn:4.7.0 -> 4.12.0
- Updated to angular 21. See also the migration guide
-
Breaking Changes: Related to the addition of
Filtersupport, previously only one querysearch was supported to be used as a filter. This has been changed to any amount of querysearches and finders. The following breaking changes could be present in your project when upgrading:
- The previous standard querysearch model (now filter) has been changed from an interface to a class. Any places in the code where object instancing is used to create a filter object needs to be changed to a new class instance using:
const filter = new FooBarFilter();
filter.foo = this.barService.getBarValue();
or wrapping the object in the fromObject() function expanded in the new class:
const filter = FooBarFilter.fromObject({obj: {foo: this.barService.getBarValue()}});
- The token injecting the InfiniteDataSource used for populating the dropdowns in the forms has been changed from
<...>FILTER_DATA_SOURCEto<...>FINDER_FILTER_DATA_SOURCEand<...>QUERY_FILTER_DATA_SOURCEfor finders and queryssearches respectively. - When upgrading from a previous version your previously defined querysearch model file used will have been renamed from
<...>Filtersto<...>Filterresulting in possible breaking code in custom anchors. You can safely assume that changing<...>Filtersto<...>Filterwil fix most issues in custom code and custom imports. - Some imports could have been removed/added from the expanded files resulting in missing/duplicate imports.
- It could be possible that when a DataChild is defined in the model, and you do not have a valid field in the filter of the child pointing to the parent that code will be expanded that will not compile. If you run into this problem, add a field to your filter pointing to the parent.
- The
FilterOptionshave been moved from being calculated in theirFilterOptionResolverto being calculated directly in their respectiveFilterFormComponent(s). If you have any custom code on the list page interacting withfilterOptionsthis will have to be moved to theFilterFormComponent(s)
The above changes can be quite jarring for a mature project to go through, especially if a lot of custom code interacts with the previous filtering. Because of this, a legacy root tag was added:
#angular.filters.legacy
This will attempt to keep the code and visuals as close as possible to the previous querysearch filtering implementation. However, the new classes and names for the filter models will still be used resulting in possible breaking changes as explained above.
- Breaking Change: Related to the addition of the API specific
HttpClient. The use of angular interceptors have been removed and moved to the specific clients. When you use the generic angularhttpClientthe following will no longer occur- Error mapping (check if error from svc-api and map it to internal error structure)
- Error handling (directly act on an error, e.g. 404)
- File download error handling
- Authentication header addition
Either change to the new expanded api specific
HttpClient(preferred) or add these interceptors again as custom code while awaiting the refactor.
- Breaking Change: The interface of the expanded
HttpClientis slightly different from the one from Angular, due to following the NS theorems. This means that it is not possible to just swap the client around, however it is not difficult to refactor the code. TheInjectionTokenis calledHTTP_CLIENTand is expanded ashttpClient = inject(HTTP_CLIENT), which can give compile errors in custom code. Example: from.get(url, {headers: headers, params: params})toget ({url: url, options: options})where options areHttpClientOptionscontaining the default angularHttpClientparameters as well as API specificHttpClientoptions. - Breaking Change: Some imports are no longer default expanded in
*-data-access.service.tsservices:catchErrorAlertErrorModelthrowErrorEMPTYtapfilter
- Breaking Change: When have defined a custom token for a
DataSource, you should add the type now. This is necessary, otherwise thedatasourcescannot be used with multiple projections. - Changed
HeaderButtonSortertoOrderSorter, because it did not only apply to header buttons. This feature anchor comparator class can be used to sort features from low to high, with a lower number being injected earlier. - Breaking Change: Made MenuItems a signal, enabling dynamic sidebar items.
- Updated import anchors of MenuService.
- Breaking Change: To make the
DataSourcedefault to a certain projection, theInjectionTokenfor theDataSourceneeded to get a type. For this reason we moved theDataViewrelated tokens to a different fileDataView-view.tokens. To get the tokens back in the original place, you can use the optionangular.legacy.tokens. This is a cascading option and can be set onAngularApp,FeatureModuleorDataConnector. In the future we will start combining the token in the interface file, instead of using a separate token file. - Changed behavior of column sorting when column has been removed from view. This now resets the sorting to the initial sorting if the columns of the initial sorting are still visible.
- Changed searchDisabled attribute to no longer be added by default and removed by a feature, the attribute is now added when needed.
- Updated
MenuServiceto use newinjectdependency injection instead of constructor arguments. - Moved all default implementations of table-view-options behind a tag
#angular.data-view.view.table.default - Breaking change:
LIST_PAGE_SIZEhas been moved toStorageKeysTsExpanderand renamed to<DATAVIEW>_LIST_PAGE_SIZE. - Changed
TableExpanderto usenativeTypes. - Made translation providing interchangeable.
Removed
- Breaking Change: Removed the resolver that calculated the
FilterOptionobject when navigating to a data child list page. - Removed the guard that executed when routing to a data child list page. This was no longer needed.
- Removed the
angular.isTableColumnoption. This is no longer used, because the logic is now based on projections. A transmuter has been added to convert to the new implementation. - Breaking Change: Removed
DataConnectorListModelexpander. It was changed with a genericPaginatedListmodel from the ns-core runtime library.
Fixed
- Delayed and re-ordered initial filtering setup / data-source initialization in list-page component. No more double fetch calls are being done. For data children this will also correctly do one call now with a parent filter. Reloading on a data children page will also respect the saved filter now.
- Added
aria-labelattribute to icon only buttons.list-page: The filter, refresh and add button.details-page: The edit and delete button.inspect-component: The edit, delete and close button.
WCAG: Buttons must have discernible text
- Added
aria-labelattribute to<mat-checkbox>components that have no label.WCAG: Form elements must have labels
- Added extra validation inside the
SegmentParametersSerializerandSegmentParameterDeserializer.- Empty strings will no longer be serialized.
- Empty strings that were being serialized will no longer deserialize into '0'.
- Clear
AUTHORIZATION_CACHE_SOURCEwhen user logs out. - Lossy deserialization of segment parameters that could be parsed as a float, but could not be accurately represented as a float.
0.1.0 (2025-08-14)
- Created angular-beam project.
Added
angular-expanders:6.13.0angularProjects-validation:6.13.0angular-querysearch-expanders:6.13.0angular-svcapi-querysearch-expanders:2.6.0(Symbiotic)angular-stdapi-querysearch-expanders:2.5.0(Symbiotic)angular-svcapi-expanders:2.6.0(Symbiotic)angular-stdapi-expanders:2.5.0(Symbiotic)