@elderbyte/ngx-starter 22.2.1 → 22.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3319,11 +3319,19 @@ class FilterSpecConverter {
3319
3319
  return this.buildFiltersForObject(prefix, value);
3320
3320
  }
3321
3321
  else {
3322
- return [new Filter(prefix, String(value))];
3322
+ return [new Filter(prefix, this.serializeSingleValue(value))];
3323
+ }
3324
+ }
3325
+ serializeSingleValue(value) {
3326
+ if (value === null) {
3327
+ return null;
3328
+ }
3329
+ else {
3330
+ return String(value);
3323
3331
  }
3324
3332
  }
3325
3333
  isRelevantForFilter(value) {
3326
- return value != null;
3334
+ return value !== undefined;
3327
3335
  }
3328
3336
  }
3329
3337
 
@@ -5670,71 +5678,99 @@ class DataContextLifeCycleBinding {
5670
5678
  }
5671
5679
  }
5672
5680
 
5673
- class RequiredFilterContextChangedEvent {
5674
- constructor(requiredFilters, currentFilters, isValid) {
5675
- this.requiredFilters = requiredFilters;
5676
- this.currentFilters = currentFilters;
5677
- this.isValid = isValid;
5681
+ class RequiredFilterMatcher {
5682
+ /***************************************************************************
5683
+ * *
5684
+ * Constructor *
5685
+ * *
5686
+ **************************************************************************/
5687
+ constructor(requiredFilters) {
5688
+ this.requiredKeys = new Set(requiredFilters);
5678
5689
  }
5679
- }
5680
- class RequiredFilterEvaluator {
5681
5690
  /***************************************************************************
5682
5691
  * *
5683
- * Fields *
5692
+ * Public API *
5684
5693
  * *
5685
5694
  **************************************************************************/
5686
- constructor(filterContext, requiredFilters) {
5687
- this._requiredFilters = new BehaviorSubject([]);
5688
- if (filterContext == null) {
5689
- throw new Error('filterContext must not be null!');
5690
- }
5691
- this._filterContext = filterContext;
5692
- if (requiredFilters) {
5693
- this._requiredFilters.next(requiredFilters);
5695
+ matches(currentFilters) {
5696
+ const matchedRequiredFilters = new Set();
5697
+ for (const currentFilter of currentFilters) {
5698
+ const requiredKey = this.findMatchingRequiredKey(currentFilter.key);
5699
+ if (!requiredKey) {
5700
+ continue;
5701
+ }
5702
+ if (!Filter.hasValue(currentFilter)) {
5703
+ return false;
5704
+ }
5705
+ matchedRequiredFilters.add(requiredKey);
5694
5706
  }
5695
- this.context$ = combineLatest([this._requiredFilters, this._filterContext.filters]).pipe(map(([required, currentFilters]) => this.createEvent(requiredFilters, currentFilters)));
5707
+ return this.allRequiredFiltersMatched(matchedRequiredFilters);
5696
5708
  }
5697
5709
  /***************************************************************************
5698
5710
  * *
5699
- * Properties *
5711
+ * Private methods *
5700
5712
  * *
5701
5713
  **************************************************************************/
5702
- get filterContext() {
5703
- return this._filterContext;
5714
+ findMatchingRequiredKey(currentKey) {
5715
+ if (this.requiredKeys.has(currentKey)) {
5716
+ return currentKey;
5717
+ }
5718
+ const prefix = this.getPrefix(currentKey);
5719
+ return this.requiredKeys.has(prefix) ? prefix : undefined;
5720
+ }
5721
+ getPrefix(key) {
5722
+ const separatorIndex = key.indexOf('.');
5723
+ return separatorIndex === -1 ? key : key.slice(0, separatorIndex);
5704
5724
  }
5705
- get requiredFilters$() {
5706
- return this._requiredFilters.asObservable();
5725
+ allRequiredFiltersMatched(matchedRequiredFilters) {
5726
+ return matchedRequiredFilters.size === this.requiredKeys.size;
5727
+ }
5728
+ }
5729
+
5730
+ class RequiredFilterMatch {
5731
+ constructor(currentFilters, isValid) {
5732
+ this.currentFilters = currentFilters;
5733
+ this.isValid = isValid;
5734
+ }
5735
+ }
5736
+ class RequiredFilterEvaluator {
5737
+ /**
5738
+ * Observe the given filters and match them against the required filters.
5739
+ * @param filterContext
5740
+ * @param requiredFilters
5741
+ */
5742
+ static observeMatch(filterContext, requiredFilters) {
5743
+ if (filterContext == null) {
5744
+ throw new Error('filterContext must not be null!');
5745
+ }
5746
+ const evaluator = new RequiredFilterEvaluator(requiredFilters);
5747
+ return filterContext.filters.pipe(map((currentFilters) => evaluator.matchFilters(currentFilters)));
5707
5748
  }
5708
- get requiredFilters() {
5709
- return this._requiredFilters.getValue();
5749
+ /***************************************************************************
5750
+ * *
5751
+ * Fields *
5752
+ * *
5753
+ **************************************************************************/
5754
+ constructor(requiredFilters) {
5755
+ this.someMatchRequired = (requiredFilters ?? []).map((filterGroup) => new RequiredFilterMatcher(filterGroup));
5710
5756
  }
5711
5757
  /***************************************************************************
5712
5758
  * *
5713
5759
  * Public API *
5714
5760
  * *
5715
5761
  **************************************************************************/
5762
+ matchFilters(currentFilters) {
5763
+ return new RequiredFilterMatch(currentFilters, this.allRequiredFiltersPresent(currentFilters));
5764
+ }
5716
5765
  /***************************************************************************
5717
5766
  * *
5718
5767
  * Private methods *
5719
5768
  * *
5720
5769
  **************************************************************************/
5721
- createEvent(requiredFilters, currentFilters) {
5722
- return new RequiredFilterContextChangedEvent(requiredFilters, currentFilters, this.allRequiredFiltersPresent(requiredFilters, currentFilters));
5723
- }
5724
- allRequiredFiltersPresent(requiredFilters, currentFilters) {
5725
- if (requiredFilters) {
5726
- return requiredFilters.some((filterGroup) => this.hasAllFilters(filterGroup, currentFilters));
5727
- }
5728
- return true;
5729
- }
5730
- hasAllFilters(requiredFilters, currentFilters) {
5731
- const requiredFilterSet = new Set(requiredFilters);
5732
- const currentFilterKeySet = new Set(currentFilters.map((f) => f.key));
5733
- const areAllRequiredFiltersPresent = requiredFilters.every((required) => currentFilterKeySet.has(required));
5734
- const areAllRequiredFiltersHaveValue = currentFilters
5735
- .filter((f) => requiredFilterSet.has(f.key))
5736
- .every((currentFilter) => Filter.hasValue(currentFilter));
5737
- return areAllRequiredFiltersPresent && areAllRequiredFiltersHaveValue;
5770
+ allRequiredFiltersPresent(currentFilters) {
5771
+ if (this.someMatchRequired.length === 0)
5772
+ return true;
5773
+ return this.someMatchRequired.some((groupMatcher) => groupMatcher.matches(currentFilters));
5738
5774
  }
5739
5775
  }
5740
5776
 
@@ -5804,7 +5840,7 @@ class DataContextAutoStarter extends DataContextLifeCycleBinding {
5804
5840
  * *
5805
5841
  **************************************************************************/
5806
5842
  buildRequiredFilterConditionObservable() {
5807
- return new RequiredFilterEvaluator(this._dataContext.filter, this._autoStartSpec.requiredFilters).context$.pipe(map((event) => event.isValid));
5843
+ return RequiredFilterEvaluator.observeMatch(this._dataContext.filter, this._autoStartSpec.requiredFilters).pipe(map((event) => event.isValid));
5808
5844
  }
5809
5845
  startDataContext() {
5810
5846
  this.logger.debug(this._dataContext.id + ': Auto starting ...');