@tellescope/react-components 1.183.0 → 1.185.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/lib/cjs/Forms/hooks.d.ts.map +1 -1
- package/lib/cjs/Forms/hooks.js +6 -5
- package/lib/cjs/Forms/hooks.js.map +1 -1
- package/lib/cjs/inputs_shared.d.ts +43 -0
- package/lib/cjs/inputs_shared.d.ts.map +1 -1
- package/lib/cjs/inputs_shared.js +433 -2
- package/lib/cjs/inputs_shared.js.map +1 -1
- package/lib/cjs/layout.d.ts.map +1 -1
- package/lib/cjs/layout.js +4 -2
- package/lib/cjs/layout.js.map +1 -1
- package/lib/cjs/state.d.ts +9 -2
- package/lib/cjs/state.d.ts.map +1 -1
- package/lib/cjs/state.js +117 -68
- package/lib/cjs/state.js.map +1 -1
- package/lib/cjs/table.d.ts +8 -3
- package/lib/cjs/table.d.ts.map +1 -1
- package/lib/cjs/table.js +17 -13
- package/lib/cjs/table.js.map +1 -1
- package/lib/esm/Forms/hooks.d.ts.map +1 -1
- package/lib/esm/Forms/hooks.js +6 -5
- package/lib/esm/Forms/hooks.js.map +1 -1
- package/lib/esm/inputs_shared.d.ts +43 -0
- package/lib/esm/inputs_shared.d.ts.map +1 -1
- package/lib/esm/inputs_shared.js +427 -3
- package/lib/esm/inputs_shared.js.map +1 -1
- package/lib/esm/layout.d.ts.map +1 -1
- package/lib/esm/layout.js +4 -2
- package/lib/esm/layout.js.map +1 -1
- package/lib/esm/state.d.ts +9 -2
- package/lib/esm/state.d.ts.map +1 -1
- package/lib/esm/state.js +117 -68
- package/lib/esm/state.js.map +1 -1
- package/lib/esm/table.d.ts +8 -3
- package/lib/esm/table.d.ts.map +1 -1
- package/lib/esm/table.js +17 -13
- package/lib/esm/table.js.map +1 -1
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +9 -9
- package/src/Forms/hooks.tsx +3 -2
- package/src/inputs_shared.tsx +444 -5
- package/src/layout.tsx +10 -1
- package/src/state.tsx +89 -51
- package/src/table.tsx +32 -5
package/lib/esm/state.js
CHANGED
|
@@ -45,17 +45,6 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
|
45
45
|
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
46
46
|
}
|
|
47
47
|
};
|
|
48
|
-
var __rest = (this && this.__rest) || function (s, e) {
|
|
49
|
-
var t = {};
|
|
50
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
51
|
-
t[p] = s[p];
|
|
52
|
-
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
53
|
-
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
54
|
-
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
55
|
-
t[p[i]] = s[p[i]];
|
|
56
|
-
}
|
|
57
|
-
return t;
|
|
58
|
-
};
|
|
59
48
|
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
60
49
|
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
61
50
|
if (ar || !(i in from)) {
|
|
@@ -110,7 +99,7 @@ export var WithFetchContext = function (_a) {
|
|
|
110
99
|
} }, { children: children })));
|
|
111
100
|
};
|
|
112
101
|
// doesn't throw
|
|
113
|
-
export var toLoadedData = function (p) { return __awaiter(void 0, void 0, void 0, function () {
|
|
102
|
+
export var toLoadedData = function (p, o) { return __awaiter(void 0, void 0, void 0, function () {
|
|
114
103
|
var err_1;
|
|
115
104
|
var _a;
|
|
116
105
|
return __generator(this, function (_b) {
|
|
@@ -122,6 +111,9 @@ export var toLoadedData = function (p) { return __awaiter(void 0, void 0, void 0
|
|
|
122
111
|
case 1: return [2 /*return*/, (_a.value = _b.sent(), _a)];
|
|
123
112
|
case 2:
|
|
124
113
|
err_1 = _b.sent();
|
|
114
|
+
if (o === null || o === void 0 ? void 0 : o.valueOnError) {
|
|
115
|
+
return [2 /*return*/, { status: LoadingStatus.Loaded, value: o.valueOnError }];
|
|
116
|
+
}
|
|
125
117
|
return [2 /*return*/, { status: LoadingStatus.Error, value: err_1 }];
|
|
126
118
|
case 3: return [2 /*return*/];
|
|
127
119
|
}
|
|
@@ -845,30 +837,35 @@ export var useListStateHook = function (modelName, state, session, slice, apiCal
|
|
|
845
837
|
}, [state]);
|
|
846
838
|
var cantRead = (session.type === 'user' && !((_d = (_c = (_b = session === null || session === void 0 ? void 0 : session.userInfo) === null || _b === void 0 ? void 0 : _b.access) === null || _c === void 0 ? void 0 : _c[modelName]) === null || _d === void 0 ? void 0 : _d.read));
|
|
847
839
|
var load = useCallback(function (force, loadOptions) {
|
|
848
|
-
var _a, _b, _c;
|
|
840
|
+
var _a, _b, _c, _d;
|
|
849
841
|
if (cantRead)
|
|
850
842
|
return;
|
|
851
843
|
var _loadFilter = (_a = loadOptions === null || loadOptions === void 0 ? void 0 : loadOptions.loadFilter) !== null && _a !== void 0 ? _a : options === null || options === void 0 ? void 0 : options.loadFilter;
|
|
852
844
|
var loadFilter = (_loadFilter && object_is_empty(_loadFilter)) ? undefined : _loadFilter;
|
|
853
845
|
var sort = (_b = loadOptions === null || loadOptions === void 0 ? void 0 : loadOptions.sort) !== null && _b !== void 0 ? _b : options === null || options === void 0 ? void 0 : options.sort;
|
|
854
846
|
var sortBy = (_c = loadOptions === null || loadOptions === void 0 ? void 0 : loadOptions.sortBy) !== null && _c !== void 0 ? _c : options === null || options === void 0 ? void 0 : options.sortBy;
|
|
847
|
+
var _mdbFilter = (loadOptions === null || loadOptions === void 0 ? void 0 : loadOptions.mdbFilter) || (options === null || options === void 0 ? void 0 : options.mdbFilter);
|
|
848
|
+
var mdbFilter = (_mdbFilter && ((_d = _mdbFilter === null || _mdbFilter === void 0 ? void 0 : _mdbFilter.$and) === null || _d === void 0 ? void 0 : _d.length)) ? _mdbFilter : undefined;
|
|
855
849
|
if (!loadQuery)
|
|
856
850
|
return;
|
|
857
851
|
if ((options === null || options === void 0 ? void 0 : options.dontFetch) && !force)
|
|
858
852
|
return;
|
|
859
|
-
var fetchKey = (loadFilter || sort || sortBy) ? JSON.stringify(__assign(__assign({}, loadFilter), { sort: sort, sortBy: sortBy })) + modelName : modelName;
|
|
853
|
+
var fetchKey = (mdbFilter || loadFilter || sort || sortBy) ? JSON.stringify(__assign(__assign(__assign({}, mdbFilter), loadFilter), { sort: sort, sortBy: sortBy })) + modelName : modelName;
|
|
860
854
|
if (didFetch(fetchKey, force, options === null || options === void 0 ? void 0 : options.refetchInMS))
|
|
861
855
|
return;
|
|
862
856
|
setFetched(fetchKey, true);
|
|
863
857
|
var limit = (options === null || options === void 0 ? void 0 : options.limit) || DEFAULT_FETCH_LIMIT;
|
|
864
|
-
toLoadedData(function () { return loadQuery({ filter: loadFilter, limit: limit, sort: sort, sortBy: sortBy }); }).then(function (es) {
|
|
858
|
+
toLoadedData(function () { return loadQuery({ mdbFilter: mdbFilter, filter: loadFilter, limit: limit, sort: sort, sortBy: sortBy }); }, { valueOnError: mdbFilter ? [] : undefined }).then(function (es) {
|
|
865
859
|
var _a, _b;
|
|
866
860
|
if (es.status === LoadingStatus.Loaded) {
|
|
867
|
-
if (es.value.length < limit && !loadFilter) {
|
|
861
|
+
if (es.value.length < limit && !loadFilter && !mdbFilter) {
|
|
868
862
|
setFetched('id' + modelName + DONE_LOADING_TOKEN, true);
|
|
869
863
|
}
|
|
864
|
+
else if (es.value.length < limit) {
|
|
865
|
+
setFetched(fetchKey + DONE_LOADING_TOKEN, true);
|
|
866
|
+
}
|
|
870
867
|
if (es.value.length) { // don't store oldest record from a filter, may skip some pages
|
|
871
|
-
setLastId(
|
|
868
|
+
setLastId(fetchKey, (_b = (_a = es.value[es.value.length - 1]) === null || _a === void 0 ? void 0 : _a.id) === null || _b === void 0 ? void 0 : _b.toString());
|
|
872
869
|
var createdAt = es.value[es.value.length - 1].createdAt;
|
|
873
870
|
if (typeof createdAt === 'string' || createdAt instanceof Date) {
|
|
874
871
|
setLastDate(modelName, new Date(createdAt));
|
|
@@ -891,70 +888,75 @@ export var useListStateHook = function (modelName, state, session, slice, apiCal
|
|
|
891
888
|
var getOldestLoadedDate = function () { return getLastDate(modelName); };
|
|
892
889
|
var reload = useCallback(function (options) { return load(true, __assign(__assign({}, options), { reloading: true })); }, [load]);
|
|
893
890
|
useEffect(function () {
|
|
891
|
+
if (options === null || options === void 0 ? void 0 : options.unbounceMS) {
|
|
892
|
+
var i_1 = setTimeout(function () { return load(false); }, options.unbounceMS);
|
|
893
|
+
return function () { clearTimeout(i_1); };
|
|
894
|
+
}
|
|
894
895
|
load(false);
|
|
895
|
-
}, [load]);
|
|
896
|
-
useEffect(function () {
|
|
897
|
-
var _a;
|
|
898
|
-
if (didFetch(modelName + 'socket'))
|
|
899
|
-
return;
|
|
900
|
-
setFetched(modelName + 'socket', true, false);
|
|
901
|
-
session.handle_events((_a = {},
|
|
902
|
-
// create, update, and delete must go in this order
|
|
903
|
-
// e.g. to ensure delete events are processed last, so deleted records don't appear as created
|
|
904
|
-
_a["created-".concat(modelName)] = addLocalElements,
|
|
905
|
-
_a["updated-".concat(modelName)] = function (es) {
|
|
906
|
-
var idToUpdates = {};
|
|
907
|
-
for (var _i = 0, es_1 = es; _i < es_1.length; _i++) {
|
|
908
|
-
var _a = es_1[_i];
|
|
909
|
-
var id = _a.id, e = __rest(_a, ["id"]);
|
|
910
|
-
idToUpdates[id] = e;
|
|
911
|
-
}
|
|
912
|
-
updateLocalElements(idToUpdates);
|
|
913
|
-
},
|
|
914
|
-
_a["deleted-".concat(modelName)] = removeLocalElements,
|
|
915
|
-
_a));
|
|
916
|
-
return function () {
|
|
917
|
-
setFetched(modelName + 'socket', false, false);
|
|
918
|
-
session.removeListenersForEvent("created-".concat(modelName));
|
|
919
|
-
session.removeListenersForEvent("updated-".concat(modelName));
|
|
920
|
-
session.removeListenersForEvent("deleted-".concat(modelName));
|
|
921
|
-
};
|
|
922
|
-
}, [session, addLocalElement, updateLocalElements, removeLocalElements, modelName, didFetch]);
|
|
896
|
+
}, [load, options === null || options === void 0 ? void 0 : options.unbounceMS]);
|
|
923
897
|
var doneLoading = useCallback(function (key) {
|
|
898
|
+
var _a;
|
|
924
899
|
if (key === void 0) { key = "id"; }
|
|
925
|
-
|
|
926
|
-
|
|
900
|
+
var unfileteredCase = didFetch(key + modelName + DONE_LOADING_TOKEN);
|
|
901
|
+
if (unfileteredCase)
|
|
902
|
+
return true;
|
|
903
|
+
var sort = options === null || options === void 0 ? void 0 : options.sort;
|
|
904
|
+
var sortBy = options === null || options === void 0 ? void 0 : options.sortBy;
|
|
905
|
+
var _filter = options === null || options === void 0 ? void 0 : options.loadFilter;
|
|
906
|
+
var filter = (_filter && object_is_empty(_filter)) ? undefined : _filter;
|
|
907
|
+
var _mdbFilter = options === null || options === void 0 ? void 0 : options.mdbFilter;
|
|
908
|
+
var mdbFilter = (_mdbFilter && ((_a = _mdbFilter === null || _mdbFilter === void 0 ? void 0 : _mdbFilter.$and) === null || _a === void 0 ? void 0 : _a.length)) ? _mdbFilter : undefined;
|
|
909
|
+
var filterKey = ((mdbFilter || filter || sort || sortBy)
|
|
910
|
+
? JSON.stringify(__assign(__assign(__assign({}, mdbFilter), filter), { sort: sort, sortBy: sortBy })) + modelName
|
|
911
|
+
: modelName);
|
|
912
|
+
if (didFetch(filterKey + DONE_LOADING_TOKEN))
|
|
913
|
+
return true;
|
|
914
|
+
return false;
|
|
915
|
+
}, [didFetch, modelName, options === null || options === void 0 ? void 0 : options.loadFilter, options === null || options === void 0 ? void 0 : options.mdbFilter, options === null || options === void 0 ? void 0 : options.sort, options === null || options === void 0 ? void 0 : options.sortBy]);
|
|
927
916
|
var loadMore = useCallback(function (loadOptions) { return __awaiter(void 0, void 0, void 0, function () {
|
|
928
|
-
var filter, lastId, key, limit;
|
|
929
|
-
var _a, _b, _c, _d;
|
|
930
|
-
return __generator(this, function (
|
|
931
|
-
|
|
932
|
-
|
|
917
|
+
var sort, sortBy, _filter, filter, _mdbFilter, mdbFilter, mdbFilterIsActive, filterKey, lastId, key, limit;
|
|
918
|
+
var _a, _b, _c, _d, _e, _f;
|
|
919
|
+
return __generator(this, function (_g) {
|
|
920
|
+
sort = options === null || options === void 0 ? void 0 : options.sort;
|
|
921
|
+
sortBy = options === null || options === void 0 ? void 0 : options.sortBy;
|
|
922
|
+
_filter = (_a = loadOptions === null || loadOptions === void 0 ? void 0 : loadOptions.filter) !== null && _a !== void 0 ? _a : options === null || options === void 0 ? void 0 : options.loadFilter;
|
|
923
|
+
filter = (_filter && object_is_empty(_filter)) ? undefined : _filter;
|
|
924
|
+
_mdbFilter = (loadOptions === null || loadOptions === void 0 ? void 0 : loadOptions.mdbFilter) || (options === null || options === void 0 ? void 0 : options.mdbFilter);
|
|
925
|
+
mdbFilter = (_mdbFilter && ((_b = _mdbFilter === null || _mdbFilter === void 0 ? void 0 : _mdbFilter.$and) === null || _b === void 0 ? void 0 : _b.length)) ? _mdbFilter : undefined;
|
|
926
|
+
mdbFilterIsActive = (mdbFilter && ((_c = mdbFilter === null || mdbFilter === void 0 ? void 0 : mdbFilter.$and) === null || _c === void 0 ? void 0 : _c.length));
|
|
927
|
+
filterKey = ((mdbFilter || filter || sort || sortBy)
|
|
928
|
+
? JSON.stringify(__assign(__assign(__assign({}, mdbFilter), filter), { sort: sort, sortBy: sortBy })) + modelName
|
|
929
|
+
: modelName);
|
|
930
|
+
lastId = getLastId(filterKey);
|
|
933
931
|
if (!lastId)
|
|
934
932
|
return [2 /*return*/];
|
|
935
933
|
if (!loadQuery)
|
|
936
934
|
return [2 /*return*/];
|
|
937
|
-
if (didFetch(
|
|
935
|
+
if (didFetch(filterKey + 'lastId' + lastId))
|
|
938
936
|
return [2 /*return*/];
|
|
939
|
-
setFetched(
|
|
940
|
-
key = (
|
|
937
|
+
setFetched(filterKey + 'lastId' + lastId, true);
|
|
938
|
+
key = (_d = loadOptions === null || loadOptions === void 0 ? void 0 : loadOptions.key) !== null && _d !== void 0 ? _d : 'id';
|
|
941
939
|
if (key !== 'id')
|
|
942
940
|
console.warn("Unrecognized key provided");
|
|
943
|
-
limit = (
|
|
941
|
+
limit = (_f = (_e = loadOptions === null || loadOptions === void 0 ? void 0 : loadOptions.limit) !== null && _e !== void 0 ? _e : options === null || options === void 0 ? void 0 : options.limit) !== null && _f !== void 0 ? _f : DEFAULT_FETCH_LIMIT;
|
|
944
942
|
return [2 /*return*/, toLoadedData(function () { return loadQuery({
|
|
945
943
|
// lastId: !options?.filter ? oldestRecord?.id?.toString() : undefined, // don't provide a lastId when there's a filter, filter could include that on its own
|
|
946
944
|
lastId: lastId,
|
|
947
945
|
limit: limit,
|
|
948
946
|
filter: filter,
|
|
947
|
+
mdbFilter: mdbFilterIsActive ? mdbFilter : undefined,
|
|
949
948
|
}); }).then(function (es) {
|
|
950
949
|
var _a, _b;
|
|
951
950
|
if (es.status === LoadingStatus.Loaded) {
|
|
952
|
-
if (es.value.length < limit) {
|
|
951
|
+
if (es.value.length < limit && !mdbFilter && (!filter || object_is_empty(filter))) {
|
|
953
952
|
setFetched(key + modelName + DONE_LOADING_TOKEN, true);
|
|
954
953
|
}
|
|
954
|
+
else if (es.value.length < limit) {
|
|
955
|
+
setFetched(filterKey + DONE_LOADING_TOKEN, true);
|
|
956
|
+
}
|
|
955
957
|
var newLastId = (_b = (_a = es.value[es.value.length - 1]) === null || _a === void 0 ? void 0 : _a.id) === null || _b === void 0 ? void 0 : _b.toString();
|
|
956
958
|
if (newLastId) {
|
|
957
|
-
setLastId(
|
|
959
|
+
setLastId(filterKey, newLastId);
|
|
958
960
|
}
|
|
959
961
|
dispatch(slice.actions.addSome({ value: es.value, options: { replaceIfMatch: true, addTo: 'end' } }));
|
|
960
962
|
}
|
|
@@ -963,7 +965,7 @@ export var useListStateHook = function (modelName, state, session, slice, apiCal
|
|
|
963
965
|
}
|
|
964
966
|
})];
|
|
965
967
|
});
|
|
966
|
-
}); }, [getLastId, modelName, loadQuery, didFetch, setFetched]);
|
|
968
|
+
}); }, [getLastId, modelName, loadQuery, didFetch, setFetched, options === null || options === void 0 ? void 0 : options.mdbFilter, options === null || options === void 0 ? void 0 : options.loadFilter, options === null || options === void 0 ? void 0 : options.sort, options === null || options === void 0 ? void 0 : options.sortBy, options === null || options === void 0 ? void 0 : options.limit, dispatch]);
|
|
967
969
|
var loadRecentlyCreated = React.useCallback(function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
968
970
|
var from, created, err_2;
|
|
969
971
|
return __generator(this, function (_a) {
|
|
@@ -2278,15 +2280,62 @@ export var useCalendarEventsForUser = function (options) {
|
|
|
2278
2280
|
});
|
|
2279
2281
|
}); }, [options, session]);
|
|
2280
2282
|
var _a = useCalendarEvents(), eventsLoading = _a[0], _b = _a[1], addLocalElements = _b.addLocalElements, filtered = _b.filtered;
|
|
2281
|
-
var loadEvents = useCallback(function (options) {
|
|
2282
|
-
var key
|
|
2283
|
-
|
|
2284
|
-
|
|
2285
|
-
|
|
2286
|
-
|
|
2287
|
-
|
|
2288
|
-
|
|
2289
|
-
|
|
2283
|
+
var loadEvents = useCallback(function (options) { return __awaiter(void 0, void 0, void 0, function () {
|
|
2284
|
+
var key, load, i, from, _loop_1, state_1;
|
|
2285
|
+
return __generator(this, function (_a) {
|
|
2286
|
+
switch (_a.label) {
|
|
2287
|
+
case 0:
|
|
2288
|
+
key = JSON.stringify(options !== null && options !== void 0 ? options : {});
|
|
2289
|
+
if (loadedRef.current[key])
|
|
2290
|
+
return [2 /*return*/];
|
|
2291
|
+
loadedRef.current[key] = Date.now();
|
|
2292
|
+
load = function (from) { return (console.log('Loading events from', from, 'to', options === null || options === void 0 ? void 0 : options.to),
|
|
2293
|
+
fetchEvents(__assign(__assign({}, options), { from: from }))
|
|
2294
|
+
.then(function (es) { return addLocalElements(es, { replaceIfMatch: true }); })
|
|
2295
|
+
.catch(console.error)); };
|
|
2296
|
+
i = 0;
|
|
2297
|
+
from = options === null || options === void 0 ? void 0 : options.from;
|
|
2298
|
+
_loop_1 = function () {
|
|
2299
|
+
var loaded, to;
|
|
2300
|
+
return __generator(this, function (_b) {
|
|
2301
|
+
switch (_b.label) {
|
|
2302
|
+
case 0:
|
|
2303
|
+
i++;
|
|
2304
|
+
return [4 /*yield*/, load(from)];
|
|
2305
|
+
case 1:
|
|
2306
|
+
loaded = _b.sent();
|
|
2307
|
+
to = options === null || options === void 0 ? void 0 : options.to;
|
|
2308
|
+
if (!to) {
|
|
2309
|
+
return [2 /*return*/, "break"];
|
|
2310
|
+
}
|
|
2311
|
+
if (!loaded) {
|
|
2312
|
+
return [2 /*return*/, "break"];
|
|
2313
|
+
}
|
|
2314
|
+
if (loaded.length === 0) {
|
|
2315
|
+
return [2 /*return*/, "break"];
|
|
2316
|
+
}
|
|
2317
|
+
if (loaded.find(function (e) { return new Date(e.startTimeInMS).getTime() > to.getTime(); })) {
|
|
2318
|
+
return [2 /*return*/, "break"];
|
|
2319
|
+
}
|
|
2320
|
+
// else continue to loop (up to 10 times) until we find events after the to date
|
|
2321
|
+
from = new Date(Math.max.apply(Math, loaded.map(function (e) { return e.startTimeInMS; })));
|
|
2322
|
+
return [2 /*return*/];
|
|
2323
|
+
}
|
|
2324
|
+
});
|
|
2325
|
+
};
|
|
2326
|
+
_a.label = 1;
|
|
2327
|
+
case 1:
|
|
2328
|
+
if (!(i < 10)) return [3 /*break*/, 3];
|
|
2329
|
+
return [5 /*yield**/, _loop_1()];
|
|
2330
|
+
case 2:
|
|
2331
|
+
state_1 = _a.sent();
|
|
2332
|
+
if (state_1 === "break")
|
|
2333
|
+
return [3 /*break*/, 3];
|
|
2334
|
+
return [3 /*break*/, 1];
|
|
2335
|
+
case 3: return [2 /*return*/];
|
|
2336
|
+
}
|
|
2337
|
+
});
|
|
2338
|
+
}); }, [session, loadedRef, fetchEvents, addLocalElements]);
|
|
2290
2339
|
return [eventsLoading, { loadEvents: loadEvents, filtered: filtered }];
|
|
2291
2340
|
};
|
|
2292
2341
|
export var useWaitlists = function (options) {
|