redux-paginator-immutable 17.0.18 → 17.0.22
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/Info.d.ts +9 -0
- package/lib/Info.js +19 -0
- package/lib/Info.js.map +1 -0
- package/lib/LoadDataItem.d.ts +23 -0
- package/lib/LoadDataItem.js +59 -0
- package/lib/LoadDataItem.js.map +1 -0
- package/lib/LoadPaginator.d.ts +36 -0
- package/lib/LoadPaginator.js +116 -0
- package/lib/LoadPaginator.js.map +1 -0
- package/lib/LoadingButton.d.ts +11 -0
- package/lib/LoadingButton.js +22 -0
- package/lib/LoadingButton.js.map +1 -0
- package/lib/actionTypes.d.ts +9 -0
- package/lib/actionTypes.js +13 -0
- package/lib/actionTypes.js.map +1 -0
- package/lib/actions.d.ts +42 -0
- package/lib/actions.js +82 -0
- package/lib/actions.js.map +1 -0
- package/lib/agent.d.ts +8 -0
- package/lib/agent.js +37 -0
- package/lib/agent.js.map +1 -0
- package/lib/createDataReducer.d.ts +14 -0
- package/lib/createDataReducer.js +64 -0
- package/lib/createDataReducer.js.map +1 -0
- package/lib/createItemReducer.d.ts +9 -0
- package/lib/createItemReducer.js +18 -0
- package/lib/createItemReducer.js.map +1 -0
- package/lib/createPaginator.d.ts +14 -0
- package/lib/createPaginator.js +84 -0
- package/lib/createPaginator.js.map +1 -0
- package/lib/index.d.ts +11 -0
- package/lib/index.js +30 -0
- package/lib/index.js.map +1 -0
- package/lib/paginatorMiddleware.d.ts +5 -0
- package/lib/paginatorMiddleware.js +68 -0
- package/lib/paginatorMiddleware.js.map +1 -0
- package/lib/reducerItemData.d.ts +18 -0
- package/lib/reducerItemData.js +56 -0
- package/lib/reducerItemData.js.map +1 -0
- package/lib/reducerOperations.d.ts +3 -0
- package/lib/reducerOperations.js +69 -0
- package/lib/reducerOperations.js.map +1 -0
- package/lib/reducers.d.ts +4 -0
- package/lib/reducers.js +75 -0
- package/lib/reducers.js.map +1 -0
- package/lib/selectors.d.ts +58 -0
- package/lib/selectors.js +79 -0
- package/lib/selectors.js.map +1 -0
- package/lib/types/actions.d.ts +85 -0
- package/lib/types/actions.js +3 -0
- package/lib/types/actions.js.map +1 -0
- package/lib/types/index.d.ts +21 -0
- package/lib/types/index.js +16 -0
- package/lib/types/index.js.map +1 -0
- package/lib/types/state.d.ts +6 -0
- package/lib/types/state.js +3 -0
- package/lib/types/state.js.map +1 -0
- package/lib/util.d.ts +9 -0
- package/lib/util.js +49 -0
- package/lib/util.js.map +1 -0
- package/lib/words.d.ts +9 -0
- package/lib/words.js +12 -0
- package/lib/words.js.map +1 -0
- package/package.json +24 -17
- package/src/LoadPaginator.tsx +9 -7
- package/src/createDataReducer.ts +10 -17
- package/src/createItemReducer.ts +4 -4
- package/src/types/index.ts +5 -2
- package/lib/__tests__/actions.spec.js +0 -117
- package/lib/__tests__/agent.spec.js +0 -32
- package/lib/__tests__/createPaginator.spec.js +0 -39
- package/lib/__tests__/reducers.spec.js +0 -125
- package/lib/__tests__/selectors.spec.js +0 -160
- package/lib/__tests__/setup.js +0 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selectors.js","sourceRoot":"","sources":["../src/selectors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import type { EndPointCb } from "./index";
|
|
2
|
+
export declare type RequestPageAction = {
|
|
3
|
+
type: "@@redux-paginator-immutable/REQUEST_PAGE";
|
|
4
|
+
meta: {
|
|
5
|
+
endpoint: string;
|
|
6
|
+
endpointCb: EndPointCb;
|
|
7
|
+
manageEntity: any;
|
|
8
|
+
resultsKey: string;
|
|
9
|
+
totalKey: string;
|
|
10
|
+
pageArgName: string;
|
|
11
|
+
idKey: string;
|
|
12
|
+
};
|
|
13
|
+
payload: {
|
|
14
|
+
page: number;
|
|
15
|
+
token: string;
|
|
16
|
+
};
|
|
17
|
+
};
|
|
18
|
+
export declare type ReceivePageAction = {
|
|
19
|
+
type: "@@redux-paginator-immutable/RECEIVE_PAGE";
|
|
20
|
+
meta: {
|
|
21
|
+
endpoint: string;
|
|
22
|
+
endpointCb: EndPointCb;
|
|
23
|
+
manageEntity: any;
|
|
24
|
+
pageArgName: string;
|
|
25
|
+
idKey: string;
|
|
26
|
+
};
|
|
27
|
+
payload: {
|
|
28
|
+
page: number;
|
|
29
|
+
token: string;
|
|
30
|
+
items: Array<any>;
|
|
31
|
+
total: number;
|
|
32
|
+
error: boolean;
|
|
33
|
+
raw?: string;
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
export declare type ChangeViewAction = {
|
|
37
|
+
type: "@@redux-paginator-immutable/CHANGE_VIEW";
|
|
38
|
+
meta: {
|
|
39
|
+
endpoint: string;
|
|
40
|
+
};
|
|
41
|
+
payload: {
|
|
42
|
+
view: number;
|
|
43
|
+
token: string;
|
|
44
|
+
};
|
|
45
|
+
};
|
|
46
|
+
export declare type ResetViewAction = {
|
|
47
|
+
type: "@@redux-paginator-immutable/RESET_VIEW";
|
|
48
|
+
meta: {
|
|
49
|
+
endpoint: string;
|
|
50
|
+
};
|
|
51
|
+
payload: {
|
|
52
|
+
token: string;
|
|
53
|
+
};
|
|
54
|
+
};
|
|
55
|
+
export declare type ClearDataAction = {
|
|
56
|
+
type: "@@redux-paginator-immutable/CLEAR_DATA";
|
|
57
|
+
meta: {
|
|
58
|
+
endpoint: string;
|
|
59
|
+
};
|
|
60
|
+
};
|
|
61
|
+
export declare type FetchCurrentCompanyInfoPending = {
|
|
62
|
+
type: "FETCH_CURRENT_COMPANY_INFO_PENDING";
|
|
63
|
+
};
|
|
64
|
+
export declare type FetchItemDataPending = {
|
|
65
|
+
type: "@@redux-paginator-immutable/FETCH_ITEM_DATA_PENDING";
|
|
66
|
+
meta: {
|
|
67
|
+
id: string;
|
|
68
|
+
};
|
|
69
|
+
};
|
|
70
|
+
export declare type FetchItemDataRejected = {
|
|
71
|
+
type: "@@redux-paginator-immutable/FETCH_ITEM_DATA_REJECTED";
|
|
72
|
+
meta: {
|
|
73
|
+
id: string;
|
|
74
|
+
};
|
|
75
|
+
};
|
|
76
|
+
export declare type FetchItemDataFulFilled = {
|
|
77
|
+
type: "@@redux-paginator-immutable/FETCH_ITEM_DATA_FULFILLED";
|
|
78
|
+
payload: {
|
|
79
|
+
Data: any;
|
|
80
|
+
};
|
|
81
|
+
meta: {
|
|
82
|
+
id: string;
|
|
83
|
+
};
|
|
84
|
+
};
|
|
85
|
+
export declare type Action = RequestPageAction | ReceivePageAction | ResetViewAction | ChangeViewAction | ClearDataAction | FetchCurrentCompanyInfoPending | FetchItemDataPending | FetchItemDataRejected | FetchItemDataFulFilled;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"actions.js","sourceRoot":"","sources":["../../src/types/actions.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export * from "./actions";
|
|
2
|
+
export * from "./state";
|
|
3
|
+
import type { State } from "./state";
|
|
4
|
+
import type { Action } from "./actions";
|
|
5
|
+
export declare type GetState = () => State;
|
|
6
|
+
export declare type PromiseAction = Promise<Action>;
|
|
7
|
+
export declare type ThunkAction = (dispatch: Dispatch, getState: GetState) => any;
|
|
8
|
+
export declare type Dispatch = (action: Action | ThunkAction | PromiseAction | Array<Action>) => any;
|
|
9
|
+
export declare type EndPointCb = ((token?: string) => string) | null;
|
|
10
|
+
export declare type PaginatorSettings = {
|
|
11
|
+
key: string;
|
|
12
|
+
manageEntity: any;
|
|
13
|
+
resultsKey: string;
|
|
14
|
+
rowsPerLoad?: number;
|
|
15
|
+
manipulateItems?: (items: any) => any;
|
|
16
|
+
totalKey?: string;
|
|
17
|
+
pageArgName?: string;
|
|
18
|
+
idKey?: string;
|
|
19
|
+
dataItemURL?: string;
|
|
20
|
+
normalizeDataItem?: any;
|
|
21
|
+
};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
+
}) : (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
o[k2] = m[k];
|
|
8
|
+
}));
|
|
9
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
10
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
11
|
+
};
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
/* eslint-disable no-use-before-define */
|
|
14
|
+
__exportStar(require("./actions"), exports);
|
|
15
|
+
__exportStar(require("./state"), exports);
|
|
16
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,yCAAyC;AACzC,4CAA0B;AAC1B,0CAAwB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/types/state.ts"],"names":[],"mappings":""}
|
package/lib/util.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
declare type NormalizrEntity = (data: any) => any;
|
|
2
|
+
import type { Map as ImmutableMap } from "immutable";
|
|
3
|
+
declare type ManageDataEntity = ImmutableMap<string, any>;
|
|
4
|
+
declare const manageEntity: (normalizrEntity: NormalizrEntity) => (item: any, state: any, keyID: string) => ManageDataEntity, manipulateItems: (sortKey?: string) => ((state: {}) => any) & import("reselect").OutputSelectorFields<(args_0: any) => any> & {
|
|
5
|
+
clearCache: () => void;
|
|
6
|
+
}, manageDataEntity: (normalizrEntity: NormalizrEntity) => (item: any, state: any, keyID: string) => ManageDataEntity, manipulateDataItems: (sortKey?: string) => ((state: {}) => any) & import("reselect").OutputSelectorFields<(args_0: any) => any> & {
|
|
7
|
+
clearCache: () => void;
|
|
8
|
+
};
|
|
9
|
+
export { manageDataEntity, manipulateDataItems, manipulateItems, manageEntity };
|
package/lib/util.js
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
+
}) : (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
o[k2] = m[k];
|
|
8
|
+
}));
|
|
9
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
10
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
11
|
+
}) : function(o, v) {
|
|
12
|
+
o["default"] = v;
|
|
13
|
+
});
|
|
14
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
15
|
+
if (mod && mod.__esModule) return mod;
|
|
16
|
+
var result = {};
|
|
17
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
18
|
+
__setModuleDefault(result, mod);
|
|
19
|
+
return result;
|
|
20
|
+
};
|
|
21
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
|
+
exports.manageEntity = exports.manipulateItems = exports.manipulateDataItems = exports.manageDataEntity = void 0;
|
|
23
|
+
const Immutable = __importStar(require("immutable"));
|
|
24
|
+
const reselect_1 = require("reselect");
|
|
25
|
+
// simple item
|
|
26
|
+
const manageEntity = (normalizrEntity) => ((item, state, keyID) => {
|
|
27
|
+
// prevent rewrite
|
|
28
|
+
const old = state.get(String(item[keyID]));
|
|
29
|
+
if (typeof old === "undefined") {
|
|
30
|
+
return Immutable.Map(normalizrEntity(item));
|
|
31
|
+
}
|
|
32
|
+
return old;
|
|
33
|
+
}), manipulateItems = (sortKey = "ID") => (0, reselect_1.createSelector)((data) => data, (data) => data.sortBy((current) => -current.get(sortKey))),
|
|
34
|
+
// data item
|
|
35
|
+
manageDataEntity = (normalizrEntity) => ((item, state, keyID) => {
|
|
36
|
+
// prevent rewrite
|
|
37
|
+
const old = state.get(String(item[keyID]));
|
|
38
|
+
if (typeof old === "undefined") {
|
|
39
|
+
return Immutable.Map({
|
|
40
|
+
Data: normalizrEntity(item),
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
return old;
|
|
44
|
+
}), manipulateDataItems = (sortKey = "ID") => ((0, reselect_1.createSelector)((data) => data, (data) => data.sortBy((current) => -current.getIn(["Data", sortKey]))));
|
|
45
|
+
exports.manageEntity = manageEntity;
|
|
46
|
+
exports.manipulateItems = manipulateItems;
|
|
47
|
+
exports.manageDataEntity = manageDataEntity;
|
|
48
|
+
exports.manipulateDataItems = manipulateDataItems;
|
|
49
|
+
//# sourceMappingURL=util.js.map
|
package/lib/util.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAIA,qDAAuC;AACvC,uCAA0C;AAI1C,cAAc;AACd,MACE,YAAY,GAAG,CAAC,eAAgC,EAAE,EAAE,CAAC,CACnD,CAAC,IAAS,EAAE,KAAU,EAAE,KAAa,EAAoB,EAAE;IACzD,kBAAkB;IAClB,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAE3C,IAAI,OAAO,GAAG,KAAK,WAAW,EAAE;QAC9B,OAAO,SAAS,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC;KAC7C;IAED,OAAO,GAAG,CAAC;AACb,CAAC,CACF,EACD,eAAe,GAAG,CAAC,OAAO,GAAG,IAAI,EAAE,EAAE,CAAC,IAAA,yBAAc,EAClD,CAAC,IAAU,EAAE,EAAE,CAAC,IAAI,EACpB,CAAC,IAAU,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,OAAa,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CACtE;AAED,YAAY;AACZ,gBAAgB,GAAG,CAAC,eAAgC,EAAE,EAAE,CAAC,CACvD,CAAC,IAAS,EAAE,KAAU,EAAE,KAAa,EAAoB,EAAE;IACzD,kBAAkB;IAClB,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAE3C,IAAI,OAAO,GAAG,KAAK,WAAW,EAAE;QAC9B,OAAO,SAAS,CAAC,GAAG,CAAC;YACnB,IAAI,EAAE,eAAe,CAAC,IAAI,CAAC;SAC5B,CAAC,CAAC;KACJ;IAED,OAAO,GAAG,CAAC;AACb,CAAC,CACF,EACD,mBAAmB,GAAG,CAAC,OAAO,GAAG,IAAI,EAAE,EAAE,CAAC,CACxC,IAAA,yBAAc,EACZ,CAAC,IAAU,EAAE,EAAE,CAAC,IAAI,EACpB,CAAC,IAAU,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,OAAa,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAClF,CACF,CAAC;AAE6D,oCAAY;AAA7B,0CAAe;AAAtD,4CAAgB;AAAE,kDAAmB"}
|
package/lib/words.d.ts
ADDED
package/lib/words.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const words = {
|
|
4
|
+
ThereWasAProblem: "There was a problem. Try again",
|
|
5
|
+
Showing: "Showing",
|
|
6
|
+
All: "all",
|
|
7
|
+
Of: "of",
|
|
8
|
+
LoadingData: "Loading data...",
|
|
9
|
+
LoadMore: "Load more",
|
|
10
|
+
};
|
|
11
|
+
exports.default = words;
|
|
12
|
+
//# sourceMappingURL=words.js.map
|
package/lib/words.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"words.js","sourceRoot":"","sources":["../src/words.ts"],"names":[],"mappings":";;AAAA,MAAM,KAAK,GAAG;IACZ,gBAAgB,EAAG,gCAAgC;IACnD,OAAO,EAAY,SAAS;IAC5B,GAAG,EAAgB,KAAK;IACxB,EAAE,EAAiB,IAAI;IACvB,WAAW,EAAQ,iBAAiB;IACpC,QAAQ,EAAW,WAAW;CAC/B,CAAC;AAEF,kBAAe,KAAK,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,25 +1,30 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "redux-paginator-immutable",
|
|
3
|
-
"version": "17.0.
|
|
3
|
+
"version": "17.0.22",
|
|
4
|
+
"types": "./lib/index.d.ts",
|
|
4
5
|
"description": "redux-paginator-immutable helps you deal with paginated API by composing your existing reducers",
|
|
5
6
|
"main": "./lib/index.js",
|
|
6
7
|
"babel": {
|
|
8
|
+
"ignore": [
|
|
9
|
+
"**/__tests__",
|
|
10
|
+
"**/types"
|
|
11
|
+
],
|
|
7
12
|
"presets": [
|
|
8
|
-
"env",
|
|
9
|
-
"
|
|
10
|
-
"react"
|
|
13
|
+
"@babel/env",
|
|
14
|
+
"@babel/preset-typescript",
|
|
15
|
+
"@babel/preset-react"
|
|
11
16
|
],
|
|
12
17
|
"env": {
|
|
13
18
|
"production": {
|
|
14
19
|
"plugins": [
|
|
15
20
|
"@babel/plugin-syntax-dynamic-import",
|
|
16
|
-
"
|
|
17
|
-
"
|
|
18
|
-
"transform-
|
|
19
|
-
"transform-react-constant-elements",
|
|
20
|
-
"transform-react-inline-elements",
|
|
21
|
-
"transform-
|
|
22
|
-
"transform-
|
|
21
|
+
"@babel/plugin-proposal-class-properties",
|
|
22
|
+
"@babel/plugin-proposal-export-default-from",
|
|
23
|
+
"@babel/plugin-transform-modules-commonjs",
|
|
24
|
+
"@babel/plugin-transform-react-constant-elements",
|
|
25
|
+
"@babel/plugin-transform-react-inline-elements",
|
|
26
|
+
"@babel/plugin-transform-typescript",
|
|
27
|
+
"transform-react-remove-prop-types"
|
|
23
28
|
]
|
|
24
29
|
},
|
|
25
30
|
"developmentTime": {
|
|
@@ -31,19 +36,19 @@
|
|
|
31
36
|
}
|
|
32
37
|
},
|
|
33
38
|
"scripts": {
|
|
34
|
-
"build:lib": "babel src --out-dir lib",
|
|
39
|
+
"build:lib": "@babel src --extensions .ts,.tsx --out-dir lib",
|
|
35
40
|
"build:umd": "cross-env NODE_ENV=development webpack src/index.js dist/redux-paginator-immutable.js",
|
|
36
41
|
"build:umd:min": "cross-env NODE_ENV=production webpack src/index.js dist/redux-paginator-immutable.min.js",
|
|
37
42
|
"build": "npm run build:lib",
|
|
38
43
|
"clean": "rimraf dist lib",
|
|
39
44
|
"check": "npm-check -u -i babel-jest -i jest --specials=bin,eslint,babel,webpack",
|
|
40
45
|
"eslint": "eslint --ext .jsx,.js,.ts,.tsx src --fix",
|
|
41
|
-
"load": "npm run test && npm run
|
|
46
|
+
"load": "npm run test && npm run clean && npm run eslint && npm run ts && npm publish",
|
|
42
47
|
"test": "ts-mocha src/__tests__/*.spec.js",
|
|
43
48
|
"test:watch": "npm test -- --watch",
|
|
44
49
|
"test:cov": "babel-node ./node_modules/isparta/bin/isparta cover ./node_modules/mocha/bin/_mocha -- --recursive \"src/**/__tests__/*\" --require src/__tests__/setup.js",
|
|
45
50
|
"test:codecov": "cat ./coverage/coverage.json | ./node_modules/.bin/codecov",
|
|
46
|
-
"ts": "tsc
|
|
51
|
+
"ts": "tsc --declaration"
|
|
47
52
|
},
|
|
48
53
|
"repository": {
|
|
49
54
|
"type": "git",
|
|
@@ -71,10 +76,12 @@
|
|
|
71
76
|
},
|
|
72
77
|
"homepage": "https://github.com/cristian-sima/redux-paginator-immutable#readme",
|
|
73
78
|
"devDependencies": {
|
|
79
|
+
"@babel/cli": "^7.17.0",
|
|
80
|
+
"@babel/preset-env": "^7.16.11",
|
|
81
|
+
"@babel/preset-typescript": "^7.16.7",
|
|
74
82
|
"@types/superagent": "^4.1.15",
|
|
75
83
|
"@typescript-eslint/eslint-plugin": "^5.10.2",
|
|
76
84
|
"@typescript-eslint/parser": "^5.10.2",
|
|
77
|
-
"babel-cli": "^6.26.0",
|
|
78
85
|
"babel-eslint": "^10.1.0",
|
|
79
86
|
"babel-plugin-transform-decorators-legacy": "^1.3.5",
|
|
80
87
|
"babel-plugin-transform-flow-strip-types": "^6.22.0",
|
|
@@ -99,7 +106,7 @@
|
|
|
99
106
|
"rimraf": "^3.0.2",
|
|
100
107
|
"ts-mocha": "^9.0.2",
|
|
101
108
|
"typescript": "^4.5.5",
|
|
102
|
-
"webpack": "^
|
|
109
|
+
"webpack": "^5.68.0"
|
|
103
110
|
},
|
|
104
111
|
"dependencies": {
|
|
105
112
|
"create-subscription": "^17.0.0",
|
|
@@ -110,6 +117,6 @@
|
|
|
110
117
|
"redux": "^4.1.2",
|
|
111
118
|
"reselect": "^4.1.5",
|
|
112
119
|
"superagent": "^7.1.1",
|
|
113
|
-
"x25": "^17.0.
|
|
120
|
+
"x25": "^17.0.17"
|
|
114
121
|
}
|
|
115
122
|
}
|
package/src/LoadPaginator.tsx
CHANGED
|
@@ -22,7 +22,7 @@ type OwnProps = {
|
|
|
22
22
|
};
|
|
23
23
|
type LoadPaginatorPropTypes = {
|
|
24
24
|
token: string;
|
|
25
|
-
children: any
|
|
25
|
+
children: React.ReactElement<any>;
|
|
26
26
|
settings: Settings;
|
|
27
27
|
paginator: any;
|
|
28
28
|
changeView: (info: {
|
|
@@ -31,11 +31,6 @@ type LoadPaginatorPropTypes = {
|
|
|
31
31
|
}) => void;
|
|
32
32
|
resetView: (token: string) => void;
|
|
33
33
|
loadData: (page: number) => void;
|
|
34
|
-
changeFilter: (filter: string) => (event: {
|
|
35
|
-
target: {
|
|
36
|
-
value: string;
|
|
37
|
-
};
|
|
38
|
-
}) => void;
|
|
39
34
|
};
|
|
40
35
|
|
|
41
36
|
const
|
|
@@ -173,7 +168,14 @@ class LoadPaginator extends Component<LoadPaginatorPropTypes> {
|
|
|
173
168
|
|
|
174
169
|
return (
|
|
175
170
|
<>
|
|
176
|
-
{React.cloneElement(this.props.children
|
|
171
|
+
{React.cloneElement(this.props.children as React.ReactElement<any>, {
|
|
172
|
+
token: this.props.token,
|
|
173
|
+
settings: this.props.settings,
|
|
174
|
+
paginator: this.props.paginator,
|
|
175
|
+
changeView: this.props.changeView,
|
|
176
|
+
resetView: this.props.resetView,
|
|
177
|
+
loadData: this.props.loadData
|
|
178
|
+
})}
|
|
177
179
|
{
|
|
178
180
|
showLoading ? (
|
|
179
181
|
<LoadingButton
|
package/src/createDataReducer.ts
CHANGED
|
@@ -3,6 +3,9 @@ import { createSelector } from "reselect";
|
|
|
3
3
|
import * as Immutable from "immutable";
|
|
4
4
|
import type { PaginatorSettings } from "./types";
|
|
5
5
|
|
|
6
|
+
type Selector = (state : any, id : string) => any;
|
|
7
|
+
type ListSelector = (state : any) => any;
|
|
8
|
+
|
|
6
9
|
/*
|
|
7
10
|
Use to create a complex list where you need more information about
|
|
8
11
|
the item. For instance, if you DO need to fetch more data or to
|
|
@@ -14,16 +17,16 @@ const
|
|
|
14
17
|
getItems = (state: any) : any => (
|
|
15
18
|
state.getIn(["entities", key])
|
|
16
19
|
),
|
|
17
|
-
getItem = createSelector(
|
|
20
|
+
getItem : Selector = createSelector(
|
|
18
21
|
getItems,
|
|
19
22
|
(_state : any, id : string) => id,
|
|
20
23
|
(data : any, id : string) : any => data.get(id) || Immutable.Map(),
|
|
21
24
|
),
|
|
22
|
-
getItemsList = createSelector(
|
|
25
|
+
getItemsList : ListSelector = createSelector(
|
|
23
26
|
getItems,
|
|
24
27
|
(data : any) => data.map((current : any) => current.get("Data")).toList(),
|
|
25
28
|
),
|
|
26
|
-
getItemData = createSelector(
|
|
29
|
+
getItemData : Selector = createSelector(
|
|
27
30
|
getItems,
|
|
28
31
|
(_state : any, id : string) => id,
|
|
29
32
|
(data : any, id : string) : any => {
|
|
@@ -34,7 +37,7 @@ const
|
|
|
34
37
|
return data.getIn([id, "Data"]);
|
|
35
38
|
},
|
|
36
39
|
),
|
|
37
|
-
getItemHasError = createSelector(
|
|
40
|
+
getItemHasError : Selector = createSelector(
|
|
38
41
|
getItem,
|
|
39
42
|
(data : any) : boolean => {
|
|
40
43
|
if (typeof data === "undefined") {
|
|
@@ -44,7 +47,7 @@ const
|
|
|
44
47
|
return data.get("error") === true;
|
|
45
48
|
},
|
|
46
49
|
),
|
|
47
|
-
getIsFetchingItemInfo = createSelector(
|
|
50
|
+
getIsFetchingItemInfo : Selector = createSelector(
|
|
48
51
|
getItem,
|
|
49
52
|
(data : any) : boolean => {
|
|
50
53
|
if (typeof data === "undefined") {
|
|
@@ -54,7 +57,7 @@ const
|
|
|
54
57
|
return data.get("fetching");
|
|
55
58
|
},
|
|
56
59
|
),
|
|
57
|
-
getItemIsFetched = createSelector(
|
|
60
|
+
getItemIsFetched : Selector = createSelector(
|
|
58
61
|
getItem,
|
|
59
62
|
(data : any) : boolean => {
|
|
60
63
|
if (typeof data === "undefined") {
|
|
@@ -64,20 +67,10 @@ const
|
|
|
64
67
|
return data.get("fetched");
|
|
65
68
|
},
|
|
66
69
|
),
|
|
67
|
-
|
|
68
|
-
// @ts-ignore
|
|
69
|
-
getShouldFetchItemInfo = createSelector(
|
|
70
|
-
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
71
|
-
// @ts-ignore
|
|
70
|
+
getShouldFetchItemInfo : Selector = createSelector(
|
|
72
71
|
getIsFetchingItemInfo,
|
|
73
|
-
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
74
|
-
// @ts-ignore
|
|
75
72
|
getItemIsFetched,
|
|
76
|
-
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
77
|
-
// @ts-ignore
|
|
78
73
|
getItemHasError,
|
|
79
|
-
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
80
|
-
// @ts-ignore
|
|
81
74
|
(isFetching : boolean, isFetched : boolean, hasError : boolean) : boolean => (
|
|
82
75
|
!isFetched && !isFetching && !hasError
|
|
83
76
|
),
|
package/src/createItemReducer.ts
CHANGED
|
@@ -9,14 +9,14 @@ import type { PaginatorSettings } from "./types";
|
|
|
9
9
|
const createReducer = ({ key }: PaginatorSettings) => {
|
|
10
10
|
const
|
|
11
11
|
getItems = (state: any) => state.getIn(["entities", key]),
|
|
12
|
-
getItem = createSelector(
|
|
12
|
+
getItem : (state : any, id : string) => any = createSelector(
|
|
13
13
|
getItems,
|
|
14
|
-
(_state : any, id :
|
|
15
|
-
(data : any, id :
|
|
14
|
+
(_state : any, id : string) => id,
|
|
15
|
+
(data : any, id : string) => data.get(id),
|
|
16
16
|
),
|
|
17
17
|
getItemsList = createSelector(
|
|
18
18
|
getItems,
|
|
19
|
-
(data) => data.toList(),
|
|
19
|
+
(data : any) => data.toList(),
|
|
20
20
|
);
|
|
21
21
|
|
|
22
22
|
return {
|
package/src/types/index.ts
CHANGED
|
@@ -9,12 +9,12 @@ export type PromiseAction = Promise<Action>;
|
|
|
9
9
|
export type ThunkAction = (dispatch: Dispatch, getState: GetState) => any;
|
|
10
10
|
export type Dispatch = (action: Action | ThunkAction | PromiseAction | Array<Action>) => any;
|
|
11
11
|
export type EndPointCb = ((token?: string) => string) | null;
|
|
12
|
+
|
|
13
|
+
|
|
12
14
|
export type PaginatorSettings = {
|
|
13
15
|
key: string;
|
|
14
16
|
manageEntity: any;
|
|
15
17
|
resultsKey: string;
|
|
16
|
-
dataItemURL: string;
|
|
17
|
-
normalizeDataItem: any;
|
|
18
18
|
// by default "{rowsPerLoad} from x25/utility/others"
|
|
19
19
|
rowsPerLoad?: number;
|
|
20
20
|
// by default "(items) => items"
|
|
@@ -25,4 +25,7 @@ export type PaginatorSettings = {
|
|
|
25
25
|
pageArgName?: string;
|
|
26
26
|
// default "ID"
|
|
27
27
|
idKey?: string;
|
|
28
|
+
|
|
29
|
+
dataItemURL?: string;
|
|
30
|
+
normalizeDataItem?: any;
|
|
28
31
|
};
|
|
@@ -1,117 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _expect = require("expect");
|
|
4
|
-
|
|
5
|
-
var _expect2 = _interopRequireDefault(_expect);
|
|
6
|
-
|
|
7
|
-
var _fluxStandardAction = require("flux-standard-action");
|
|
8
|
-
|
|
9
|
-
var _actions = require("../actions");
|
|
10
|
-
|
|
11
|
-
var _actions2 = _interopRequireDefault(_actions);
|
|
12
|
-
|
|
13
|
-
var _actionTypes = require("../actionTypes");
|
|
14
|
-
|
|
15
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
16
|
-
|
|
17
|
-
var receivePage = _actions2.default.receivePage,
|
|
18
|
-
requestPage = _actions2.default.requestPage,
|
|
19
|
-
resetView = _actions2.default.resetView,
|
|
20
|
-
changeView = _actions2.default.changeView; /* eslint-disable no-undefined, max-lines-per-function, no-magic-numbers */
|
|
21
|
-
|
|
22
|
-
describe("actions", function () {
|
|
23
|
-
|
|
24
|
-
it("should create receive page action", function () {
|
|
25
|
-
var action = receivePage({
|
|
26
|
-
endpoint: "some/api/endpoint/",
|
|
27
|
-
pageArgName: "p",
|
|
28
|
-
idKey: "id",
|
|
29
|
-
page: 2,
|
|
30
|
-
token: "foo=bar",
|
|
31
|
-
items: ["foo", "bar", "baz"],
|
|
32
|
-
total: 42
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
(0, _expect2.default)(action).toEqual({
|
|
36
|
-
type: _actionTypes.RECEIVE_PAGE,
|
|
37
|
-
meta: {
|
|
38
|
-
endpoint: "some/api/endpoint/",
|
|
39
|
-
pageArgName: "p",
|
|
40
|
-
idKey: "id"
|
|
41
|
-
},
|
|
42
|
-
payload: {
|
|
43
|
-
token: "foo=bar",
|
|
44
|
-
page: 2,
|
|
45
|
-
items: ["foo", "bar", "baz"],
|
|
46
|
-
total: 42
|
|
47
|
-
}
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
(0, _expect2.default)((0, _fluxStandardAction.isFSA)(action)).toEqual(true);
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
it("should create request page action", function () {
|
|
54
|
-
var action = requestPage({
|
|
55
|
-
endpoint: "some/api/endpoint/",
|
|
56
|
-
resultsKey: "results",
|
|
57
|
-
totalKey: "total",
|
|
58
|
-
pageArgName: "p",
|
|
59
|
-
idKey: "id",
|
|
60
|
-
page: 2,
|
|
61
|
-
token: "foo=bar"
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
(0, _expect2.default)(action).toEqual({
|
|
65
|
-
type: _actionTypes.REQUEST_PAGE,
|
|
66
|
-
meta: {
|
|
67
|
-
endpoint: "some/api/endpoint/",
|
|
68
|
-
resultsKey: "results",
|
|
69
|
-
totalKey: "total",
|
|
70
|
-
pageArgName: "p",
|
|
71
|
-
idKey: "id"
|
|
72
|
-
},
|
|
73
|
-
payload: {
|
|
74
|
-
token: "foo=bar",
|
|
75
|
-
page: 2
|
|
76
|
-
}
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
(0, _expect2.default)((0, _fluxStandardAction.isFSA)(action)).toEqual(true);
|
|
80
|
-
});
|
|
81
|
-
|
|
82
|
-
it("should create reset view action", function () {
|
|
83
|
-
var action = resetView("some/api/endpoint/", "name");
|
|
84
|
-
|
|
85
|
-
(0, _expect2.default)(action).toEqual({
|
|
86
|
-
type: _actionTypes.RESET_VIEW,
|
|
87
|
-
meta: {
|
|
88
|
-
endpoint: "some/api/endpoint/"
|
|
89
|
-
},
|
|
90
|
-
payload: {
|
|
91
|
-
token: "name"
|
|
92
|
-
}
|
|
93
|
-
});
|
|
94
|
-
|
|
95
|
-
(0, _expect2.default)((0, _fluxStandardAction.isFSA)(action)).toEqual(true);
|
|
96
|
-
});
|
|
97
|
-
|
|
98
|
-
it("should create change view action", function () {
|
|
99
|
-
var action = changeView("some/api/endpoint/", {
|
|
100
|
-
token: "name",
|
|
101
|
-
view: 2
|
|
102
|
-
});
|
|
103
|
-
|
|
104
|
-
(0, _expect2.default)(action).toEqual({
|
|
105
|
-
type: _actionTypes.CHANGE_VIEW,
|
|
106
|
-
meta: {
|
|
107
|
-
endpoint: "some/api/endpoint/"
|
|
108
|
-
},
|
|
109
|
-
payload: {
|
|
110
|
-
view: 2,
|
|
111
|
-
token: "name"
|
|
112
|
-
}
|
|
113
|
-
});
|
|
114
|
-
|
|
115
|
-
(0, _expect2.default)((0, _fluxStandardAction.isFSA)(action)).toEqual(true);
|
|
116
|
-
});
|
|
117
|
-
});
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _expect = require("expect");
|
|
4
|
-
|
|
5
|
-
var _expect2 = _interopRequireDefault(_expect);
|
|
6
|
-
|
|
7
|
-
var _agent = require("../agent");
|
|
8
|
-
|
|
9
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
10
|
-
|
|
11
|
-
describe("buildSuffix", function () {
|
|
12
|
-
|
|
13
|
-
it("should correctly build the url suffix when simple params are provided", function () {
|
|
14
|
-
(0, _expect2.default)((0, _agent.buildSuffix)("p", 1, "foo=bar")).toEqual("?foo=bar&p=1");
|
|
15
|
-
});
|
|
16
|
-
|
|
17
|
-
it("should correctly build the url suffix when less simple params are provided", function () {
|
|
18
|
-
(0, _expect2.default)((0, _agent.buildSuffix)("p", 1, "foo=bar&baz=foo")).toEqual("?baz=foo&foo=bar&p=1");
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
it("should correctly build the url suffix when params contains no extractable query params", function () {
|
|
22
|
-
(0, _expect2.default)((0, _agent.buildSuffix)("p", 1, "foo/bar")).toEqual("foo/bar?p=1");
|
|
23
|
-
});
|
|
24
|
-
|
|
25
|
-
it('should correctly build the url suffix when "params" is not provided', function () {
|
|
26
|
-
(0, _expect2.default)((0, _agent.buildSuffix)("p", 1, "")).toEqual("?p=1");
|
|
27
|
-
});
|
|
28
|
-
|
|
29
|
-
it("should correctly build the url suffix when complex params are provided", function () {
|
|
30
|
-
(0, _expect2.default)((0, _agent.buildSuffix)("p", 1, "foo/bar?bar=biz&baz=foo")).toEqual("foo/bar?baz=foo&bar=biz&p=1");
|
|
31
|
-
});
|
|
32
|
-
});
|