Skip to main content

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.0 to angular-expanders:7.10.0

  • Updated angularProjects-validation:6.13.0 to angularProjects-validation:7.10.0

  • Updated net.democritus.angular:angular-querysearch-expanders:6.13.0 to net.democritus.angular.querysearch:angular-querysearch-expanders:1.1.1

  • Updated angular-svcapi-querysearch-expanders:2.6.0 to angular-svcapi-querysearch-expanders:3.6.1

  • Updated angular-stdapi-querysearch-expanders:2.5.0 to angular-stdapi-querysearch-expanders:3.6.2

Added

  • Added Filter support.

    • When the angular-finder-expanders or angular-query-expanders is present, every finder without the noViewLayer option and every querysearch will be supported on its associated list page component.
    • Added a FilterConnector element that implements the Connector element in the model and added a FinderConnector / QueryConnector that implements the abstract FilterConnector.
    • Added a FilterView element that implements the View element in the model and added a FinderView / QueryView that implements the abstract FilterView.
    • Added a new sidebar on the list page that will be expanded when a filter is present.
    • Added support for the hasSearchBar option 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 DataChild list pages and DataElements with the option hasSearchBar enabled.
    • Added new <...>FilterFormComponent that will expand a form for every querysearch (with the correct options relating to technologies used (stdapi / svcapi)) and finders (excluding findAll and with option noViewLayer) in the model.
    • Added new <...>FilterComponent that 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.
  • Made DataView default actions (add/edit) swappable:

    • Added tag #angular.data-view.action.add.custom to disable default add page.
    • Added tag #angular.data-view.action.edit.custom to disable default edit page.
    • Added tag #angular.data-view.action.delete.custom to disable default delete dialog.
    • Added tag #angular.data-view.routing.add.disable to disable the add route.
    • Added tag #angular.data-view.routing.edit.disable to disable the edit route.
    • Added feature anchors to remaining DataView actions (add, edit, delete, details, list).
  • Added DataProjection support.

    • Metamodel addition of DataProjectionConnector. Currently, this is automatically generated for details and info projections.
    • Metamodel addition of ListView. Currently, this is automatically generated linked to a DataProjectionConnector for the info projection. With the option angular.legacy.table.useModelProjection this can be changed back to details. This is a cascading option and can be set on AngularApp, FeatureModule or DataConnector.
    • 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.ts for backwards compatibility reasons.
    • The DataProjectionConnectorComposite has a helper method getModelName that can be used to get the right name of the connector. To not break backwards compatibility the name of DataConnector.model.ts should be kept. The decision has been made to make this the 'details' projection, however to not change the name. That is why a DataProjectionConnector with the same name as the linked DataConnector will return the name of the DataConnector. Other projections, e.g. Table will return the name of DataConnector + name of DataProjectionConnector.
    • Added TransmuteIsTableColumnOption transmuter to switch the option angular.isTableColumn to the info flag on a field.
  • 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.ts is expanded that handles

      • Http request methods
      • BaseUrl
      • Default headers (Authorization, content-type)
      • Default operators (handleUnauthorizedError)

      The rest is handled in the *-data-access.service.ts services.

    • To facilitate the removal of the use of interceptors a lot of operator functions that handled the logic of the interceptors have been created.

      • handleDataAccessError
      • handleAlertError
      • handleDataAccessFormError
      • notifyDataConnectorSuccessEvent
      • notifyDataConnectorFailureEvent

      These can be used to add this behaviour easily to custom endpoints.

    • This is still based on the angular HttpClient and all functionality of this client can still be used.

  • Added a new layerType ANGULAR_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 AuthorizationRights to make certain parts of the application not accessible (used in guards, directives, services). These rights can be accessed through the ACTION_AUTHORIZATION_SOURCE InjectionToken, 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 components

    • ButtonAuthorizationDirective
    • TableRowActionMenuAuthorizationDirective

    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 Connector and View.

    • A DataConnector now has a reference to connectors and these can be a DataProjectionConnector, FilterConnector, etc.
    • A DataView now has a reference to views and these can be a ListView, FilterView, etc.
  • The option angular.allowedFileTypes with 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 StorageKeys expander. Projects had this concept as well and now they can add their keys.

  • Added updateBadgeCount method to MenuService.

  • Added MENU_SERVICE injection token and an interface to enable custom implementations of the Menu using the angular.customization.hasCustomMenuService option

  • Added option angular.instance-hyper-link.disabled as cascading option on FieldComposite that 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 on name fields that link to the details page.

  • Added TapAlertErrorOperatorExpander that handles an AlertErrorModel but 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 <...>FilterOptionsSource that is provided on root. Wherever these filterOptions need to be updated you can inject the <...>FilterOptionsSource into your component and call the updateFilterOptions() function. The filterComponent will update accordingly. The previous feature and custom anchors have been removed from the <...>FilterFormComponent any 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.hasCustomTableViewOptions to disable default implementation.

  • Added StorageKeysTsExpander to 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 PackageJsonExpander to 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 the package.json5 file and provided in the app.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.
    • Updated ngx-translate to version 17. See also the migration guide.
    • Updated yarn: 4.7.0 -> 4.12.0
  • Breaking Changes: Related to the addition of Filter support, 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:

  1. 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()}});
  1. The token injecting the InfiniteDataSource used for populating the dropdowns in the forms has been changed from <...>FILTER_DATA_SOURCE to <...>FINDER_FILTER_DATA_SOURCE and <...>QUERY_FILTER_DATA_SOURCE for finders and queryssearches respectively.
  2. When upgrading from a previous version your previously defined querysearch model file used will have been renamed from <...>Filters to <...>Filter resulting in possible breaking code in custom anchors. You can safely assume that changing <...>Filters to <...>Filter wil fix most issues in custom code and custom imports.
  3. Some imports could have been removed/added from the expanded files resulting in missing/duplicate imports.
  4. 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.
  5. The FilterOptions have been moved from being calculated in their FilterOptionResolver to being calculated directly in their respective FilterFormComponent(s). If you have any custom code on the list page interacting with filterOptions this will have to be moved to the FilterFormComponent(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 angular httpClient the following will no longer occur
    1. Error mapping (check if error from svc-api and map it to internal error structure)
    2. Error handling (directly act on an error, e.g. 404)
    3. File download error handling
    4. 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 HttpClient is 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. The InjectionToken is called HTTP_CLIENT and is expanded as httpClient = inject(HTTP_CLIENT), which can give compile errors in custom code. Example: from .get(url, {headers: headers, params: params}) to get ({url: url, options: options}) where options are HttpClientOptions containing the default angular HttpClient parameters as well as API specific HttpClient options.
  • Breaking Change: Some imports are no longer default expanded in *-data-access.service.ts services:
    • catchError
    • AlertErrorModel
    • throwError
    • EMPTY
    • tap
    • filter
  • Breaking Change: When have defined a custom token for a DataSource, you should add the type now. This is necessary, otherwise the datasources cannot be used with multiple projections.
  • Changed HeaderButtonSorter to OrderSorter, 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 DataSource default to a certain projection, the InjectionToken for the DataSource needed to get a type. For this reason we moved the DataView related tokens to a different file DataView-view.tokens. To get the tokens back in the original place, you can use the option angular.legacy.tokens. This is a cascading option and can be set on AngularApp, FeatureModule or DataConnector. 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 MenuService to use new inject dependency 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_SIZE has been moved to StorageKeysTsExpander and renamed to <DATAVIEW>_LIST_PAGE_SIZE.
  • Changed TableExpander to use nativeTypes.
  • Made translation providing interchangeable.

Removed

  • Breaking Change: Removed the resolver that calculated the FilterOption object 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.isTableColumn option. 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 DataConnectorListModel expander. It was changed with a generic PaginatedList model 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-label attribute 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-label attribute to <mat-checkbox> components that have no label.

    WCAG: Form elements must have labels

  • Added extra validation inside the SegmentParametersSerializer and SegmentParameterDeserializer.
    • Empty strings will no longer be serialized.
    • Empty strings that were being serialized will no longer deserialize into '0'.
  • Clear AUTHORIZATION_CACHE_SOURCE when 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.0
  • angularProjects-validation:6.13.0
  • angular-querysearch-expanders:6.13.0
  • angular-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)