@@ -16,6 +16,7 @@ import { ManagedData, XtTypeResolver } from 'xt-type';
1616import { XtStoreManager } from '../store-manager/xt-store-manager' ;
1717import { XtSortBy , XtStoreCriteria } from '../xt-store-parameters' ;
1818import { XtStoreProviderHelper } from '../store-provider/xt-store-provider-helper' ;
19+ import { XtStoreSortBy } from '../xt-reporting' ;
1920
2021export function selectId < T extends ManagedData = ManagedData > ( ) : SelectEntityId < T > { return ( data ) => {
2122 if ( data . _id == null ) throw new Error ( "ManagedData with no entity Id used in the store." , { cause : data } ) ;
@@ -62,9 +63,9 @@ export type XtSignalStore<T> = {
6263 * @param storeMgr
6364 * @param typeRegistry
6465 */
65- export function withXtStoreProvider < T extends ManagedData = ManagedData > ( entityName :string , storeProvider ?:XtStoreProvider < T > , storeMgr ?:XtStoreManager , typeRegistry ?: XtTypeResolver ) {
66+ export function withXtStoreProvider < T extends ManagedData = ManagedData > ( entityName :string , storeProvider ?:XtStoreProvider < T > , storeMgr ?:XtStoreManager , typeRegistry ?: XtTypeResolver , options ?: XtStoreEntityFeatureOptions ) {
6667 return signalStoreFeature (
67- withState ( { entityName, loading :false } as StoreState ) ,
68+ withState ( { entityName, loading :false , sort : options ?. sort , filter : options ?. filter } as StoreState ) ,
6869 withEntities ( xtStoreEntityConfig < T > ( ) ) ,
6970 withProps ( ( ) => ( {
7071 _storeProvider :storeProvider ?? storeMgr ! . getProviderSafe < T > ( entityName ) ,
@@ -100,21 +101,6 @@ export function withXtStoreProvider<T extends ManagedData = ManagedData> (entity
100101 } ) ) ) ;
101102 } ,
102103
103- _callProviderSearchEntities ( ) :Observable < T [ ] > {
104- const sort = this . _safeSort ( ) ;
105- if ( sort . length > 0 ) {
106- // We call the full function but only needs the sorted & filtered data (no need for grouping)
107- return store . _storeProvider . searchAndPrepareEntities ( entityName , this . _safeSort ( ) , undefined , undefined , ...this . _safeFilter ( ) ) . pipe (
108- map ( ( value ) => {
109- return value . sortedData ;
110- } )
111- )
112- } else {
113- // If we don't need sorting, then a simpler function can be called
114- return store . _storeProvider . searchEntities ( entityName , ...this . _safeFilter ( ) ) ;
115- }
116- } ,
117-
118104 /* listEntities (): Observable<ManagedData[]> {
119105 patchState(store, {loading:true});
120106 return store._storeProvider.searchEntities(entityName).pipe (map( (entities: ManagedData[]) => {
@@ -169,7 +155,7 @@ export function withXtStoreProvider<T extends ManagedData = ManagedData> (entity
169155 const listEntities = store . entities ( ) ;
170156 const ret = new Array < T > ( ) ;
171157 for ( const entity of listEntities ) {
172- if ( this . _isPassingFilter ( entity , criteria ) ) {
158+ if ( this . _isPassingFilter ( entity , false , criteria ) ) {
173159 ret . push ( entity ) ;
174160 }
175161 }
@@ -238,7 +224,7 @@ export function withXtStoreProvider<T extends ManagedData = ManagedData> (entity
238224
239225 _patchStateSetEntity ( stored :T ) {
240226 // Ensure the entity is still part of the list
241- if ( this . _isPassingFilter ( stored ) ) {
227+ if ( this . _isPassingFilter ( stored , true ) ) {
242228 // It's still in the list, now check if sort needs to be applied
243229 if ( this . _safeSort ( ) . length > 0 ) {
244230 // We remove it from the old sort
@@ -258,15 +244,20 @@ export function withXtStoreProvider<T extends ManagedData = ManagedData> (entity
258244 }
259245
260246 } ,
261- _isPassingFilter ( element :T , criteria ?:XtStoreCriteria < T > [ ] ) :boolean {
247+ _isPassingFilter ( element :T , applyFilters : boolean = false , criteria ?:XtStoreCriteria < T > [ ] ) :boolean {
262248 if ( criteria === undefined ) {
263249 criteria = this . _safeFilter ( ) ;
264250 }
265251 for ( const crit of criteria ) {
266252 if ( ! crit . filter ( element ) ) {
267- return false ;
253+ // One filter is not met, but we may be allowed to set it automatically
254+ if ( ( applyFilters ) && ( crit . operator == '=' ) && ( element [ crit . name ] == null ) ) {
255+ // We enforce the criteria
256+ element [ crit . name ] = crit . value ;
257+ } else {
258+ return false ;
259+ }
268260 }
269-
270261 }
271262 return true ;
272263 } ,
@@ -283,8 +274,27 @@ export function withXtStoreProvider<T extends ManagedData = ManagedData> (entity
283274 return ret ;
284275 }
285276 return [ ] ;
277+ } ,
278+ _callProviderSearchEntities ( ) :Observable < T [ ] > {
279+ const sort = this . _safeSort ( ) ;
280+ if ( sort . length > 0 ) {
281+ // We call the full function but only needs the sorted & filtered data (no need for grouping)
282+ return store . _storeProvider . searchAndPrepareEntities ( entityName , this . _safeSort ( ) , undefined , undefined , ...this . _safeFilter ( ) ) . pipe (
283+ map ( ( value ) => {
284+ return value . sortedData ;
285+ } )
286+ )
287+ } else {
288+ // If we don't need sorting, then a simpler function can be called
289+ return store . _storeProvider . searchEntities ( entityName , ...this . _safeFilter ( ) ) ;
290+ }
286291 }
287292 } )
288293 )
289294) ;
290295}
296+
297+ export type XtStoreEntityFeatureOptions < T extends ManagedData = ManagedData > = {
298+ sort ?:XtSortBy < T > [ ] ;
299+ filter ?:XtStoreCriteria < T > [ ] ;
300+ }
0 commit comments