@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.
- package/esm2020/index.mjs +2 -1
- package/esm2020/lib/query/query.mjs +6 -6
- package/esm2020/lib/query/query.types.mjs +1 -1
- package/esm2020/lib/query/query.utils.mjs +33 -2
- package/esm2020/lib/query-form/query-form.mjs +36 -4
- package/esm2020/lib/query-form/query-form.types.mjs +1 -1
- package/esm2020/lib/symfony/index.mjs +3 -0
- package/esm2020/lib/symfony/symfony.types.mjs +2 -0
- package/esm2020/lib/symfony/symfony.utils.mjs +19 -0
- package/fesm2015/ethlete-query.mjs +90 -9
- package/fesm2015/ethlete-query.mjs.map +1 -1
- package/fesm2020/ethlete-query.mjs +89 -9
- package/fesm2020/ethlete-query.mjs.map +1 -1
- package/index.d.ts +1 -0
- package/lib/query/query.types.d.ts +12 -0
- package/lib/query/query.utils.d.ts +3 -1
- package/lib/query-form/query-form.d.ts +5 -4
- package/lib/query-form/query-form.types.d.ts +14 -0
- package/lib/query-form/query-form.utils.d.ts +1 -1
- package/lib/symfony/index.d.ts +2 -0
- package/lib/symfony/symfony.types.d.ts +19 -0
- package/lib/symfony/symfony.utils.d.ts +3 -0
- package/package.json +1 -1
|
@@ -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,
|
|
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
|