@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 +7 -1
- package/actions/list.js +94 -70
- package/package.json +1 -1
- package/reducers/list.js +4 -0
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
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
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
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
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
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)) }));
|