@ethlete/query 3.0.3 → 4.0.0

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.
@@ -1,8 +1,8 @@
1
1
  import * as i1 from '@ethlete/core';
2
2
  import { BehaviorSubjectWithSubscriberCount, getCookie, setCookie, deleteCookie, DestroyService, DelayableDirective, equal, clone } from '@ethlete/core';
3
- import { Observable, filter, takeWhile, switchMap, of, BehaviorSubject, shareReplay, Subject, takeUntil, tap, interval, skip, map, timer, combineLatest, withLatestFrom, fromEvent, startWith, take, concat, debounceTime, distinctUntilChanged } from 'rxjs';
3
+ import { Observable, filter, takeWhile, switchMap, of, tap, BehaviorSubject, shareReplay, Subject, takeUntil, interval, skip, map, timer, combineLatest, withLatestFrom, fromEvent, startWith, take, concat, debounceTime, distinctUntilChanged, pairwise } from 'rxjs';
4
4
  import * as i0 from '@angular/core';
5
- import { Directive, Input, InjectionToken, inject, ChangeDetectorRef, ViewContainerRef, TemplateRef, ErrorHandler, ElementRef } from '@angular/core';
5
+ import { isDevMode, Directive, Input, InjectionToken, inject, ChangeDetectorRef, ViewContainerRef, TemplateRef, ErrorHandler, ElementRef } from '@angular/core';
6
6
  import { FormGroup } from '@angular/forms';
7
7
  import { Router, ActivatedRoute } from '@angular/router';
8
8
 
@@ -508,6 +508,26 @@ const gql = (strings, ...values) => {
508
508
  return str;
509
509
  };
510
510
 
511
+ const isSymfonyError = (error) => {
512
+ if (!error || typeof error !== 'object') {
513
+ return false;
514
+ }
515
+ const symfonyError = error;
516
+ return (symfonyError.class !== undefined &&
517
+ symfonyError.detail !== undefined &&
518
+ symfonyError.status !== undefined &&
519
+ symfonyError.title !== undefined &&
520
+ symfonyError.trace !== undefined &&
521
+ symfonyError.type !== undefined);
522
+ };
523
+ const isSymfonyPagerfantaOutOfRangeError = (error) => {
524
+ if (!isSymfonyError(error)) {
525
+ return false;
526
+ }
527
+ return error.class.startsWith('Pagerfanta') && error.class.endsWith('OutOfRangeCurrentPageException');
528
+ };
529
+
530
+ /* eslint-disable @typescript-eslint/no-explicit-any */
511
531
  function filterSuccess() {
512
532
  return function (source) {
513
533
  return source.pipe(filter((value) => isQueryStateSuccess(value)));
@@ -553,6 +573,35 @@ function switchQueryCollectionState() {
553
573
  return source.pipe(switchMap((value) => { var _a; return (_a = value === null || value === void 0 ? void 0 : value.query.state$) !== null && _a !== void 0 ? _a : of(null); }));
554
574
  };
555
575
  }
576
+ const resetPageOnError = (config) => (source) => {
577
+ const { queryForm, pageControlKey = 'page' } = config;
578
+ if (isDevMode() && !queryForm.form.controls[pageControlKey]) {
579
+ console.warn(`resetPageOnError: queryForm.form.controls["${pageControlKey}"] is undefined`);
580
+ }
581
+ return source.pipe(switchMap((q) => {
582
+ if (!q) {
583
+ return of(q);
584
+ }
585
+ return q.state$.pipe(tap((state) => {
586
+ var _a;
587
+ if (!isQueryStateFailure(state)) {
588
+ return;
589
+ }
590
+ switch (state.error.status) {
591
+ // The page is invalid (in prod mode, code is 416)
592
+ case 416 /* HttpStatusCode.RangeNotSatisfiable */:
593
+ (_a = queryForm.form.controls[pageControlKey]) === null || _a === void 0 ? void 0 : _a.patchValue(1);
594
+ break;
595
+ // The page might be invalid (in dev mode, code is 500)
596
+ case 500 /* HttpStatusCode.InternalServerError */:
597
+ if (isSymfonyPagerfantaOutOfRangeError(state.error.detail)) {
598
+ queryForm.form.controls[pageControlKey].patchValue(1);
599
+ }
600
+ break;
601
+ }
602
+ }), takeUntilResponse());
603
+ }));
604
+ };
556
605
  const isQueryStateLoading = (state) => (state === null || state === void 0 ? void 0 : state.type) === "LOADING" /* QueryStateType.Loading */;
557
606
  const isQueryStateSuccess = (state) => (state === null || state === void 0 ? void 0 : state.type) === "SUCCESS" /* QueryStateType.Success */;
558
607
  const isQueryStateFailure = (state) => (state === null || state === void 0 ? void 0 : state.type) === "FAILURE" /* QueryStateType.Failure */;
@@ -885,11 +934,6 @@ class Query {
885
934
  const responseData = isGql && typeof response === 'object' && !!response && 'data' in response
886
935
  ? response['data']
887
936
  : response;
888
- this._state$.next({
889
- type: "SUCCESS" /* QueryStateType.Success */,
890
- response: responseData,
891
- meta: Object.assign(Object.assign({}, meta), { expiresAt: expiresInTimestamp }),
892
- });
893
937
  if (this._queryConfig.entity && this._queryConfig.entity.set) {
894
938
  const id = (_a = this._queryConfig.entity) === null || _a === void 0 ? void 0 : _a.id({ args: this._args, response: responseData });
895
939
  (_b = this._queryConfig.entity) === null || _b === void 0 ? void 0 : _b.set({
@@ -899,6 +943,11 @@ class Query {
899
943
  store: this._queryConfig.entity.store,
900
944
  });
901
945
  }
946
+ this._state$.next({
947
+ type: "SUCCESS" /* QueryStateType.Success */,
948
+ response: responseData,
949
+ meta: Object.assign(Object.assign({}, meta), { expiresAt: expiresInTimestamp }),
950
+ });
902
951
  break;
903
952
  }
904
953
  case 'failure': {
@@ -1969,7 +2018,39 @@ class QueryForm {
1969
2018
  if ((options === null || options === void 0 ? void 0 : options.syncViaUrlQueryParams) !== false) {
1970
2019
  this._syncViaUrlQueryParams(values);
1971
2020
  }
1972
- }));
2021
+ }), pairwise(), startWith([null, this.form.getRawValue()]), map(([previousValue, currentValue]) => ({ previousValue, currentValue })), map(({ previousValue, currentValue }) => {
2022
+ let didResetValues = false;
2023
+ for (const formFieldKey in this._fields) {
2024
+ const resets = this._fields[formFieldKey].data.isResetBy;
2025
+ if (!resets)
2026
+ continue;
2027
+ const resetConditionKeys = Array.isArray(resets) ? resets : [resets];
2028
+ for (const resetConditionKey of resetConditionKeys) {
2029
+ if (!(resetConditionKey in this._fields)) {
2030
+ if (isDevMode()) {
2031
+ console.warn(`The field "${resetConditionKey}" is not defined in the QueryForm. Is it a typo?`, this);
2032
+ }
2033
+ continue;
2034
+ }
2035
+ if (previousValue &&
2036
+ currentValue &&
2037
+ !equal(previousValue[resetConditionKey], currentValue[resetConditionKey])) {
2038
+ const defaultValueForKeyToReset = this._defaultValues[formFieldKey];
2039
+ const currentValueForKeyToReset = currentValue[formFieldKey];
2040
+ if (equal(defaultValueForKeyToReset, currentValueForKeyToReset)) {
2041
+ continue;
2042
+ }
2043
+ this.form.controls[formFieldKey].setValue(defaultValueForKeyToReset);
2044
+ didResetValues = true;
2045
+ break;
2046
+ }
2047
+ }
2048
+ }
2049
+ return (didResetValues || {
2050
+ previousValue,
2051
+ currentValue,
2052
+ });
2053
+ }), filter((value) => value !== true));
1973
2054
  }
1974
2055
  setFormValueFromUrlQueryParams(options) {
1975
2056
  var _a, _b, _c, _d;
@@ -2169,5 +2250,5 @@ const def = () => null;
2169
2250
  * Generated bundle index. Do not edit.
2170
2251
  */
2171
2252
 
2172
- export { BasicAuthProvider, BearerAuthProvider, CustomHeaderAuthProvider, EntityStore, INFINITY_QUERY_TOKEN, InfinityQuery, InfinityQueryDirective, InfinityQueryTriggerDirective, Query, QueryClient, QueryCreator, QueryDirective, QueryError, QueryField, QueryForm, QueryStore, buildErrorMessage, buildGqlCacheKey, buildQueryArrayString, buildQueryObjectString, buildQueryString, buildRoute, buildTimestampFromSeconds, castQueryCreatorTypes, computeQueryAuthHeader, computeQueryBody, computeQueryHeaders, computeQueryMethod, computeQueryQueryParams, createInfinityQueryConfig, createQueryCollection, decryptBearer, deepFreeze, def, detectContentTypeHeader, extractExpiresInSeconds, extractQuery, filterFailure, filterInvalidParams, filterNull, filterQueryStates, filterSuccess, forEachHeader, getDefaultHeaders, getResponseUrl, gql, hasHeader, ignoreAutoRefresh, invalidBaseRouteError, invalidBodyError, invalidRouteError, isAutoRefresh, isBasicAuthProvider, isBearerAuthProvider, isCustomHeaderAuthProvider, isGqlQueryConfig, isParamValid, isQuery, isQueryStateCancelled, isQueryStateFailure, isQueryStateLoading, isQueryStatePrepared, isQueryStateSuccess, isRequestError, mapToPaginated, mergeHeaders, paginatedEntityValueUpdater, parseAllXhrResponseHeaders, pathParamsMissingInRouteFunctionError, queryStateAlreadyHasKeyError, queryStateCannotTransformError, queryStateDoesNotContainKeyError, request, serializeBody, shouldCacheQuery, shouldRetryRequest, skipPaginationPageParamCalculator, switchQueryCollectionState, switchQueryState, takeUntilResponse, transformGql, transformMethod, transformToBoolean, transformToBooleanArray, transformToDate, transformToDateArray, transformToNumber, transformToNumberArray, transformToSort, transformToSortQueryParam, transformToString, transformToStringArray };
2253
+ export { BasicAuthProvider, BearerAuthProvider, CustomHeaderAuthProvider, EntityStore, INFINITY_QUERY_TOKEN, InfinityQuery, InfinityQueryDirective, InfinityQueryTriggerDirective, Query, QueryClient, QueryCreator, QueryDirective, QueryError, QueryField, QueryForm, QueryStore, buildErrorMessage, buildGqlCacheKey, buildQueryArrayString, buildQueryObjectString, buildQueryString, buildRoute, buildTimestampFromSeconds, castQueryCreatorTypes, computeQueryAuthHeader, computeQueryBody, computeQueryHeaders, computeQueryMethod, computeQueryQueryParams, createInfinityQueryConfig, createQueryCollection, decryptBearer, deepFreeze, def, detectContentTypeHeader, extractExpiresInSeconds, extractQuery, filterFailure, filterInvalidParams, filterNull, filterQueryStates, filterSuccess, forEachHeader, getDefaultHeaders, getResponseUrl, gql, hasHeader, ignoreAutoRefresh, invalidBaseRouteError, invalidBodyError, invalidRouteError, isAutoRefresh, isBasicAuthProvider, isBearerAuthProvider, isCustomHeaderAuthProvider, isGqlQueryConfig, isParamValid, isQuery, isQueryStateCancelled, isQueryStateFailure, isQueryStateLoading, isQueryStatePrepared, isQueryStateSuccess, isRequestError, isSymfonyError, isSymfonyPagerfantaOutOfRangeError, mapToPaginated, mergeHeaders, paginatedEntityValueUpdater, parseAllXhrResponseHeaders, pathParamsMissingInRouteFunctionError, queryStateAlreadyHasKeyError, queryStateCannotTransformError, queryStateDoesNotContainKeyError, request, resetPageOnError, serializeBody, shouldCacheQuery, shouldRetryRequest, skipPaginationPageParamCalculator, switchQueryCollectionState, switchQueryState, takeUntilResponse, transformGql, transformMethod, transformToBoolean, transformToBooleanArray, transformToDate, transformToDateArray, transformToNumber, transformToNumberArray, transformToSort, transformToSortQueryParam, transformToString, transformToStringArray };
2173
2254
  //# sourceMappingURL=ethlete-query.mjs.map