@steroidsjs/core 3.0.68 → 3.0.70

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/actions/list.d.ts CHANGED
@@ -110,9 +110,10 @@ export declare const LIST_TOGGLE_ITEM = "@list/toggle_item";
110
110
  export declare const LIST_TOGGLE_ALL = "@list/toggle_all";
111
111
  export declare const LIST_SET_LAYOUT = "@list/set_layout";
112
112
  export declare const LIST_CHANGE_ACTION = "@list/change_action";
113
+ export declare const LIST_SELECT_ITEM = "@list/select_item";
113
114
  export declare const httpFetchHandler: (list: IList, query: any, { http }: {
114
115
  http: any;
115
- }) => any;
116
+ }, options?: any) => any;
116
117
  export declare const localFetchHandler: (list: IList, query: Record<string, unknown>) => {
117
118
  items: any[];
118
119
  total: number;
@@ -192,3 +193,8 @@ export declare const toggleAll: (listId: any) => {
192
193
  listId: any;
193
194
  type: string;
194
195
  };
196
+ export declare const selectItem: (listId: any, itemId: any) => {
197
+ listId: any;
198
+ itemId: any;
199
+ type: string;
200
+ };
package/actions/list.js CHANGED
@@ -14,7 +14,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
14
14
  return (mod && mod.__esModule) ? mod : { "default": mod };
15
15
  };
16
16
  exports.__esModule = true;
17
- exports.toggleAll = exports.toggleItem = exports.deleteItem = exports.update = exports.add = exports.listDestroy = exports.listRefresh = exports.listLazyFetch = exports.listFetch = exports.listChangeAction = exports.listSetLayout = exports.listSetItems = exports.listInit = exports.localFetchHandler = exports.httpFetchHandler = exports.LIST_CHANGE_ACTION = exports.LIST_SET_LAYOUT = exports.LIST_TOGGLE_ALL = exports.LIST_TOGGLE_ITEM = exports.LIST_DESTROY = exports.LIST_ITEM_DELETE = exports.LIST_ITEM_UPDATE = exports.LIST_ITEM_ADD = exports.LIST_AFTER_FETCH = exports.LIST_BEFORE_FETCH = exports.LIST_SET_ITEMS = exports.LIST_INIT = void 0;
17
+ exports.selectItem = exports.toggleAll = exports.toggleItem = exports.deleteItem = exports.update = exports.add = exports.listDestroy = exports.listRefresh = exports.listLazyFetch = exports.listFetch = exports.listChangeAction = exports.listSetLayout = exports.listSetItems = exports.listInit = exports.localFetchHandler = exports.httpFetchHandler = exports.LIST_SELECT_ITEM = exports.LIST_CHANGE_ACTION = exports.LIST_SET_LAYOUT = exports.LIST_TOGGLE_ALL = exports.LIST_TOGGLE_ITEM = exports.LIST_DESTROY = exports.LIST_ITEM_DELETE = exports.LIST_ITEM_UPDATE = exports.LIST_ITEM_ADD = exports.LIST_AFTER_FETCH = exports.LIST_BEFORE_FETCH = exports.LIST_SET_ITEMS = exports.LIST_INIT = void 0;
18
18
  var get_1 = __importDefault(require("lodash-es/get"));
19
19
  var isArray_1 = __importDefault(require("lodash-es/isArray"));
20
20
  var isEmpty_1 = __importDefault(require("lodash-es/isEmpty"));
@@ -23,6 +23,7 @@ var trimStart_1 = __importDefault(require("lodash-es/trimStart"));
23
23
  var isFunction_1 = __importDefault(require("lodash-es/isFunction"));
24
24
  var isEqual_1 = __importDefault(require("lodash-es/isEqual"));
25
25
  var isNil_1 = __importDefault(require("lodash-es/isNil"));
26
+ var axios_1 = __importDefault(require("axios"));
26
27
  var form_1 = require("../reducers/form");
27
28
  var form_2 = require("../actions/form");
28
29
  var data_1 = require("../utils/data");
@@ -38,6 +39,7 @@ exports.LIST_TOGGLE_ITEM = '@list/toggle_item';
38
39
  exports.LIST_TOGGLE_ALL = '@list/toggle_all';
39
40
  exports.LIST_SET_LAYOUT = '@list/set_layout';
40
41
  exports.LIST_CHANGE_ACTION = '@list/change_action';
42
+ exports.LIST_SELECT_ITEM = '@list/select_item';
41
43
  //const STORAGE_LAYOUT_KEY_PREFIX = 'listLayout_';
42
44
  var lazyTimers = {};
43
45
  var createList = function (listId, props) { return ({
@@ -60,19 +62,22 @@ var createList = function (listId, props) { return ({
60
62
  sortAttribute: (0, get_1["default"])(props, '_sort.attribute') || null,
61
63
  layoutAttribute: (0, get_1["default"])(props, '_layout.attribute') || null
62
64
  }); };
63
- var httpFetchHandler = function (list, query, _a) {
65
+ var httpFetchHandler = function (list, query, _a, options) {
64
66
  var http = _a.http;
67
+ if (options === void 0) { options = {}; }
65
68
  var url = list.action;
66
69
  if (list.scope) {
67
- url
68
- += (url.indexOf('?') !== -1 ? '&' : '?') + 'scope=' + list.scope.join(',');
70
+ url += (url.indexOf('?') !== -1 ? '&' : '?') + 'scope=' + list.scope.join(',');
69
71
  }
72
+ // options поддерживает { cancelToken } или { signal } (если использовать AbortController)
70
73
  return http
71
- .send(list.actionMethod, url || window.location.pathname, query)
74
+ .send(list.actionMethod, url || window.location.pathname, query, options)
72
75
  .then(function (response) { return response.data; })["catch"](function (error) {
73
76
  if (typeof list.onError === 'function') {
74
77
  list.onError(error);
75
78
  }
79
+ // rethrow чтобы внешняя логика могла отловить отмену/ошибку
80
+ throw error;
76
81
  });
77
82
  };
78
83
  exports.httpFetchHandler = httpFetchHandler;
@@ -149,31 +154,6 @@ var listChangeAction = function (listId, action) { return ({
149
154
  action: action
150
155
  }); };
151
156
  exports.listChangeAction = listChangeAction;
152
- /*export const initSSR = (listId, props) => (dispatch, getState, {http, clientStorage}) => {
153
- const state = getState()
154
- const stateList = _get(state, ['list', 'lists', listId]);
155
- const list = {
156
- ...createList(listId, props, clientStorage),
157
- ...stateList
158
- };
159
- if ((!list.action && list.action !== '') || list.items) {
160
- if (!stateList) {
161
- return dispatch({
162
- ...list,
163
- type: LIST_INIT
164
- });
165
- }
166
- return;
167
- }
168
- const onFetch = list.onFetch || httpFetchHandler;
169
- return dispatch(
170
- onFetch(list, VALUES, http).then(data => ({
171
- ...list,
172
- ...data,
173
- type: LIST_INIT
174
- }))
175
- );
176
- };*/
177
157
  /**
178
158
  * Update query values and send request
179
159
  * @param listId
@@ -198,53 +178,91 @@ var listFetch = function (listId, query) {
198
178
  formValues[key] = query[key];
199
179
  toDispatch.push((0, form_2.formChange)(list.formId, key, query[key]));
200
180
  });
181
+ // Отменяем предыдущий запрос для этого listId (если есть)
182
+ components.http._promises = components.http._promises || {};
183
+ var prev = components.http._promises[listId];
184
+ if (prev && typeof prev.cancel === 'function') {
185
+ // для axios.CancelToken.source()
186
+ prev.cancel('Cancelled by new request for list ' + listId);
187
+ }
188
+ else if (prev && typeof prev.abort === 'function') {
189
+ // для AbortController
190
+ prev.abort();
191
+ }
192
+ // Создаем новый источник отмены
193
+ var source = axios_1["default"].CancelToken.source();
194
+ components.http._promises[listId] = source;
195
+ var options = { cancelToken: source.token };
196
+ // Set `Loading...`
201
197
  if (list.isRemote) {
202
- // Set `Loading...`
203
198
  toDispatch.push({
204
199
  listId: listId,
205
200
  type: exports.LIST_BEFORE_FETCH
206
201
  });
207
202
  }
208
- // Send request
209
- toDispatch.push(Promise.resolve(onFetch(list, formValues, components)).then(function (data) {
210
- var _a;
211
- // Skip on empty
212
- if (!data) {
213
- return [];
214
- }
215
- // Check list is not destroy
216
- if (!getState().list.lists[listId]) {
203
+ toDispatch.push([
204
+ Promise.resolve(onFetch(list, formValues, components, options))
205
+ .then(function (data) {
206
+ var _a;
207
+ // Skip on empty
208
+ if (!data) {
209
+ return [];
210
+ }
211
+ // Check list is not destroy
212
+ if (!getState().list.lists[listId]) {
213
+ return [];
214
+ }
215
+ if ((0, isArray_1["default"])(data)) {
216
+ data = {
217
+ items: data,
218
+ total: data.length,
219
+ meta: null
220
+ };
221
+ }
222
+ var items = data.items || [];
223
+ var total = data.total || items.length || null;
224
+ var page = formValues[list.pageAttribute];
225
+ var pageSize = formValues[list.pageSizeAttribute];
226
+ var totalPages = Math.ceil(((list === null || list === void 0 ? void 0 : list.total) || 0) / (pageSize || 1));
227
+ var hasNextPage = (_a = data === null || data === void 0 ? void 0 : data.hasNextPage) !== null && _a !== void 0 ? _a : (page !== totalPages || null);
228
+ return [
229
+ (0, form_2.formSetErrors)(list.formId, data.errors || null),
230
+ {
231
+ items: items,
232
+ total: total,
233
+ hasNextPage: hasNextPage,
234
+ meta: data.meta || null,
235
+ page: page,
236
+ pageSize: pageSize,
237
+ listId: listId,
238
+ defaultPageValue: list.defaultPageValue,
239
+ type: exports.LIST_AFTER_FETCH
240
+ },
241
+ ];
242
+ })["catch"](function (error) {
243
+ // Если это отмена — просто игнорируем ошибку
244
+ if (axios_1["default"].isCancel && axios_1["default"].isCancel(error)) {
245
+ return [];
246
+ }
247
+ // Handle cancellation quietly
248
+ // axios v0.x: axios.isCancel(error)
249
+ var isAxiosCancel = typeof axios_1["default"].isCancel === 'function' && axios_1["default"].isCancel(error);
250
+ if (isAxiosCancel) {
251
+ // игнорируем, это отмена запроса
252
+ return [];
253
+ }
254
+ // прочие ошибки — можно пробросить или обработать
255
+ if (typeof list.onError === 'function') {
256
+ list.onError(error);
257
+ }
217
258
  return [];
218
- }
219
- if ((0, isArray_1["default"])(data)) {
220
- data = {
221
- items: data,
222
- total: data.length,
223
- meta: null
224
- };
225
- }
226
- var items = data.items || [];
227
- var total = data.total || items.length || null;
228
- var page = formValues[list.pageAttribute];
229
- var pageSize = formValues[list.pageSizeAttribute];
230
- var totalPages = Math.ceil(((list === null || list === void 0 ? void 0 : list.total) || 0) / (pageSize || 1));
231
- var hasNextPage = (_a = data === null || data === void 0 ? void 0 : data.hasNextPage) !== null && _a !== void 0 ? _a : (page !== totalPages || null);
232
- return [
233
- // Check has errors
234
- (0, form_2.formSetErrors)(list.formId, data.errors || null),
235
- {
236
- items: items,
237
- total: total,
238
- hasNextPage: hasNextPage,
239
- meta: data.meta || null,
240
- page: page,
241
- pageSize: pageSize,
242
- listId: listId,
243
- defaultPageValue: list.defaultPageValue,
244
- type: exports.LIST_AFTER_FETCH
245
- },
246
- ];
247
- }));
259
+ })["finally"](function () {
260
+ // убрать сохранённый источник если он тот же
261
+ if (components.http._promises[listId] === source) {
262
+ delete components.http._promises[listId];
263
+ }
264
+ }),
265
+ ]);
248
266
  return dispatch(toDispatch);
249
267
  };
250
268
  };
@@ -318,6 +336,12 @@ var toggleAll = function (listId) { return ({
318
336
  type: exports.LIST_TOGGLE_ALL
319
337
  }); };
320
338
  exports.toggleAll = toggleAll;
339
+ var selectItem = function (listId, itemId) { return ({
340
+ listId: listId,
341
+ itemId: itemId,
342
+ type: exports.LIST_SELECT_ITEM
343
+ }); };
344
+ exports.selectItem = selectItem;
321
345
  // TODO local storage save?
322
346
  /*export const setLayoutName = (listId, layoutName) => (
323
347
  dispatch,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@steroidsjs/core",
3
- "version": "3.0.68",
3
+ "version": "3.0.70",
4
4
  "description": "",
5
5
  "author": "Vladimir Kozhin <hello@kozhindev.com>",
6
6
  "repository": {
package/reducers/list.js CHANGED
@@ -129,6 +129,10 @@ var reducerMap = (_a = {},
129
129
  }
130
130
  return [];
131
131
  },
132
+ _a[list_1.LIST_SELECT_ITEM] = function (state, action) {
133
+ var _a;
134
+ return (__assign(__assign({}, state), { selectedIds: __assign(__assign({}, state.selectedIds), (_a = {}, _a[action.listId] = action.itemId ? [action.itemId] : [], _a)) }));
135
+ },
132
136
  _a[list_1.LIST_SET_LAYOUT] = function (state, action) {
133
137
  var _a;
134
138
  return (__assign(__assign({}, state), { lists: __assign(__assign({}, state.lists), (_a = {}, _a[action.listId] = __assign(__assign({}, state.lists[action.listId]), { layoutName: action.layoutName }), _a)) }));