Frui.ts base classes for data-oriented view models
npm install @frui.ts/datascreens@frui.ts/datascreensThis package contains base classes for data-centric view models.
- ListViewModel
- FilteredListViewModel
- DetailViewModel
ListViewModelBase class for master lists in master-detail scenarios.
- items - read currently displayed data rows from here. You can also manually put the data there.
- currentPaging - paging information related to the data in items, usually used by a pager control
- setData([items, paging]) - use this function to set items and currentPaging in one step.
#### Example
``ts
async loadData() {
const data = await this.someRepository.getSomeData();
this.setData(data);
}
// without async
loadData() {
return this.someRepository.getSomeData().then(this.setData);
}
`
This base class adds some filter-related logic on top of ListViewModel:
- pagingFilter - bind paging and sorting UI to this observable propertyfilter
- - bind filter UI controls to this observable property
- appliedFilter - a snapshot of filter that should be used for loading new dataapplyFilter()
- - validates the current filter and if valid, resets dirty flags on it and stores a snapshot into appliedFilterloadData()
- - implement this function to load actual data based on pagingFilter and appliedFilter properties. Call this function when the user changes paging/sorting.
- applyFilterAndLoad() - bind 'search / filter' UI button to this function. It calls applyFilter() and loadData().
- resetFilterValues(filter) - implement this function so that it applies default values to the filter passed as an argument. Note that this function should not have any side effects.resetFilter()
- - bind 'clear filter' UI button to this function. It calls resetFilterValues(filter) and applyFilter().resetFilterAndLoad()
- - bind 'reset filter' UI button to this function. It calls resetFilter() and loadData().
The reason for the two properties for a filter is that if a user changes a filter/search field without committing the filter by clicking a Load/Search button, changing the actual page should load the data with the original filter values, not the current work-in-progress one.
You don't need to initialize the filters manually. The constructor automatically creates default pagingFilter and calls resetFilterValues(filter).
If needed, you can attach a validator to filter in the constructor. There is no filter validation by default.
#### Example
`html
`
This base class updates the logic of setData to support appending the new data to the existing list of items.
TODO
- busyWatcher - already initialized instance of busyWatcher for long-running process indication. It is automatically picked when using the @watchBusy decorator on class functions.loadDetail()
- - implement this function and return the detail entity for the view model. It is automatically called during view model initialize stage, and the returned value is assigned to the item property
- item - bind UI to this property containing the entity loaded by loadDetail()setItem(item)
- - call this helper function to manually set item` later