flowerbi-react 1.21.0 → 3.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/README.md +1 -1
- package/dist/FlowerBITable.d.ts +0 -1
- package/dist/FlowerBITable.js +1 -0
- package/dist/FlowerBITable.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +17 -6
- package/dist/index.js.map +1 -1
- package/dist/{useQuery.d.ts → useFlowerBI.d.ts} +5 -1
- package/dist/useFlowerBI.js +82 -0
- package/dist/useFlowerBI.js.map +1 -0
- package/dist/usePageFilters.js +14 -2
- package/dist/usePageFilters.js.map +1 -1
- package/package.json +9 -9
- package/src/index.ts +1 -1
- package/src/{useQuery.ts → useFlowerBI.ts} +34 -45
- package/src/usePageFilters.ts +12 -1
- package/dist/useQuery.js +0 -90
- package/dist/useQuery.js.map +0 -1
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Defines hooks for working with FlowerBI from React applications:
|
|
4
4
|
|
|
5
|
-
- `
|
|
5
|
+
- `useFlowerBI` - the state of a query and the data it produces
|
|
6
6
|
- `usePageFilters` - a shared set of filters that chart components can interact via
|
|
7
7
|
|
|
8
8
|
Also some components:
|
package/dist/FlowerBITable.d.ts
CHANGED
package/dist/FlowerBITable.js
CHANGED
|
@@ -3,6 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.FlowerBITable = void 0;
|
|
6
7
|
var react_1 = __importDefault(require("react"));
|
|
7
8
|
var flowerbi_1 = require("flowerbi");
|
|
8
9
|
function renderCell(key, def) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FlowerBITable.js","sourceRoot":"","sources":["../src/FlowerBITable.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"FlowerBITable.js","sourceRoot":"","sources":["../src/FlowerBITable.tsx"],"names":[],"mappings":";;;;;;AAAA,gDAA0B;AAC1B,qCAA2G;AAI3G,SAAS,UAAU,CAAC,GAAW,EAAE,GAAqB;IAClD,IAAM,KAAK,GAAG,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACrD,IAAM,KAAK,GAAG,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAExD,OAAO,CACH,sCAAI,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,IACzB,KAAK,CACL,CACR,CAAC;AACN,CAAC;AASD,SAAgB,aAAa,CAAwB,EAAsC;QAArC,IAAI,UAAA,EAAE,OAAO,aAAA;IAC/D,OAAO,CACH;QACI;YACI,0CACK,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,UAAC,MAAM,IAAK,OAAA,CAClC,sCAAI,GAAG,EAAE,MAAM,IAAG,MAAM,CAAM,CACjC,EAFqC,CAErC,CAAC,CACD,CACD;QACR,6CACK,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAC,MAAM,EAAE,CAAC;;YAAK,OAAA,CAC7B,sCAAI,GAAG,EAAE,MAAA,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,mCAAI,CAAC,IAEzC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,UAAC,MAAM,IAAK,OAAA,UAAU,CAC3C,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,yBAAc,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EADhC,CACgC,CAAC,CAErE,CACR,CAAA;SAAA,CAAC,CACE;QACP,IAAI,CAAC,MAAM,IAAI,CACZ;YACI,0CAEI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,UAAC,MAAM,IAAK,OAAA,UAAU,CAC3C,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,2BAAgB,CAAC,IAAI,CAAC,MAAO,CAAC,CAAC,CAAC,EAD3B,CAC2B,CAAC,CAEhE,CACD,CACX,CACG,CACX,CAAC;AACN,CAAC;AAhCD,sCAgCC"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -1,9 +1,20 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
function
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
5
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
17
|
+
__exportStar(require("./FlowerBITable"), exports);
|
|
18
|
+
__exportStar(require("./usePageFilters"), exports);
|
|
19
|
+
__exportStar(require("./useFlowerBI"), exports);
|
|
9
20
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,kDAAgC;AAChC,mDAAiC;AACjC,gDAA8B"}
|
|
@@ -43,4 +43,8 @@ export declare type QueryDependency = {
|
|
|
43
43
|
* results are used to build this query, so we wait for them before executing,
|
|
44
44
|
* and optionally short-circuit to an empty result if the dependency is empty.
|
|
45
45
|
*/
|
|
46
|
-
export declare function
|
|
46
|
+
export declare function useFlowerBI<S extends QuerySelect>(fetch: QueryFetch, query: Query<S>, dependencies?: QueryDependency[]): UseQueryResult<S>;
|
|
47
|
+
/**
|
|
48
|
+
* Alias of useFlowerBI for backward compatibility.
|
|
49
|
+
*/
|
|
50
|
+
export declare const useQuery: typeof useFlowerBI;
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __assign = (this && this.__assign) || function () {
|
|
3
|
+
__assign = Object.assign || function(t) {
|
|
4
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
+
s = arguments[i];
|
|
6
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
+
t[p] = s[p];
|
|
8
|
+
}
|
|
9
|
+
return t;
|
|
10
|
+
};
|
|
11
|
+
return __assign.apply(this, arguments);
|
|
12
|
+
};
|
|
13
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
14
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.useQuery = exports.useFlowerBI = void 0;
|
|
18
|
+
var react_1 = require("react");
|
|
19
|
+
var flowerbi_1 = require("flowerbi");
|
|
20
|
+
var json_stable_stringify_1 = __importDefault(require("json-stable-stringify"));
|
|
21
|
+
/**
|
|
22
|
+
* A custom React hook that evaluates to the result of a
|
|
23
|
+
* [Query](../flowerbi/interfaces/query.html), making it easy to perform a
|
|
24
|
+
* query from within a component.
|
|
25
|
+
*
|
|
26
|
+
* The returned object has a strongly-typed `records` array, and optionally
|
|
27
|
+
* a `totals` object. It has a `state` of type {@link UseQueryState} that
|
|
28
|
+
* can be used to show a loading indicator.
|
|
29
|
+
*
|
|
30
|
+
* @param fetch The fetch function to use.
|
|
31
|
+
* @param query The [Query](../flowerbi/interfaces/query.html) specification.
|
|
32
|
+
* @param dependencies Optionally, a list of one or more other queries whose
|
|
33
|
+
* results are used to build this query, so we wait for them before executing,
|
|
34
|
+
* and optionally short-circuit to an empty result if the dependency is empty.
|
|
35
|
+
*/
|
|
36
|
+
function useFlowerBI(fetch, query, dependencies) {
|
|
37
|
+
var queryJson = (0, flowerbi_1.jsonifyQuery)(query);
|
|
38
|
+
var _a = (0, react_1.useState)("init"), state = _a[0], setState = _a[1];
|
|
39
|
+
var _b = (0, react_1.useState)({ records: [] }), result = _b[0], setResult = _b[1];
|
|
40
|
+
(0, react_1.useEffect)(function () {
|
|
41
|
+
var disposed = false; // discard stale results
|
|
42
|
+
if (dependencies === null || dependencies === void 0 ? void 0 : dependencies.length) {
|
|
43
|
+
// if any not ready, neither are we
|
|
44
|
+
if (dependencies.some(function (x) { return x.dependency.state !== "ready"; })) {
|
|
45
|
+
if (state !== "init") {
|
|
46
|
+
setState("refresh");
|
|
47
|
+
}
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
// if any with option nonEmpty produced empty result, so do we
|
|
51
|
+
if (dependencies.filter(function (x) { return !!x.nonEmpty; }).some(function (x) { return !x.dependency.records.length; })) {
|
|
52
|
+
setState("ready");
|
|
53
|
+
setResult({ records: [] });
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
if (state !== "init") {
|
|
58
|
+
setState("refresh");
|
|
59
|
+
}
|
|
60
|
+
fetch(queryJson).then(function (x) {
|
|
61
|
+
if (!disposed) {
|
|
62
|
+
setState("ready");
|
|
63
|
+
setResult(x);
|
|
64
|
+
}
|
|
65
|
+
}, function () {
|
|
66
|
+
if (!disposed) {
|
|
67
|
+
setState("error");
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
return function () {
|
|
71
|
+
disposed = true;
|
|
72
|
+
};
|
|
73
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
74
|
+
}, [fetch, (0, json_stable_stringify_1.default)(queryJson)]);
|
|
75
|
+
return __assign(__assign({}, (0, flowerbi_1.expandQueryResult)(query.select, result)), { state: state });
|
|
76
|
+
}
|
|
77
|
+
exports.useFlowerBI = useFlowerBI;
|
|
78
|
+
/**
|
|
79
|
+
* Alias of useFlowerBI for backward compatibility.
|
|
80
|
+
*/
|
|
81
|
+
exports.useQuery = useFlowerBI;
|
|
82
|
+
//# sourceMappingURL=useFlowerBI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useFlowerBI.js","sourceRoot":"","sources":["../src/useFlowerBI.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,+BAAoD;AACpD,qCAAiI;AACjI,gFAAoD;AAkCpD;;;;;;;;;;;;;;GAcG;AACH,SAAgB,WAAW,CAAwB,KAAiB,EAAE,KAAe,EAAE,YAAgC;IACnH,IAAM,SAAS,GAAG,IAAA,uBAAY,EAAC,KAAK,CAAC,CAAC;IAEhC,IAAA,KAAoB,IAAA,gBAAQ,EAAgB,MAAM,CAAC,EAAlD,KAAK,QAAA,EAAE,QAAQ,QAAmC,CAAC;IACpD,IAAA,KAAsB,IAAA,gBAAQ,EAAkB,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,EAA/D,MAAM,QAAA,EAAE,SAAS,QAA8C,CAAC;IAEvE,IAAA,iBAAS,EAAC;QACN,IAAI,QAAQ,GAAG,KAAK,CAAC,CAAC,wBAAwB;QAE9C,IAAI,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,MAAM,EAAE;YACtB,mCAAmC;YACnC,IAAI,YAAY,CAAC,IAAI,CAAC,UAAA,CAAC,IAAI,OAAA,CAAC,CAAC,UAAU,CAAC,KAAK,KAAK,OAAO,EAA9B,CAA8B,CAAC,EAAE;gBACxD,IAAI,KAAK,KAAK,MAAM,EAAE;oBAClB,QAAQ,CAAC,SAAS,CAAC,CAAC;iBACvB;gBACD,OAAO;aACV;YAED,8DAA8D;YAC9D,IAAI,YAAY,CAAC,MAAM,CAAC,UAAA,CAAC,IAAI,OAAA,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAZ,CAAY,CAAC,CAAC,IAAI,CAAC,UAAA,CAAC,IAAI,OAAA,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,EAA5B,CAA4B,CAAC,EAAE;gBAChF,QAAQ,CAAC,OAAO,CAAC,CAAC;gBAClB,SAAS,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;gBAC3B,OAAO;aACV;SACJ;QAED,IAAI,KAAK,KAAK,MAAM,EAAE;YAClB,QAAQ,CAAC,SAAS,CAAC,CAAC;SACvB;QAED,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CACjB,UAAA,CAAC;YACG,IAAI,CAAC,QAAQ,EAAE;gBACX,QAAQ,CAAC,OAAO,CAAC,CAAC;gBAClB,SAAS,CAAC,CAAC,CAAC,CAAC;aAChB;QACL,CAAC,EACD;YACI,IAAI,CAAC,QAAQ,EAAE;gBACX,QAAQ,CAAC,OAAO,CAAC,CAAC;aACrB;QACL,CAAC,CACJ,CAAC;QAEF,OAAO;YACH,QAAQ,GAAG,IAAI,CAAC;QACpB,CAAC,CAAC;QACF,uDAAuD;IAC3D,CAAC,EAAE,CAAC,KAAK,EAAE,IAAA,+BAAe,EAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAExC,6BAAY,IAAA,4BAAiB,EAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,KAAE,KAAK,OAAA,IAAG;AACjE,CAAC;AAnDD,kCAmDC;AAED;;GAEG;AACU,QAAA,QAAQ,GAAG,WAAW,CAAC"}
|
package/dist/usePageFilters.js
CHANGED
|
@@ -10,17 +10,29 @@ var __assign = (this && this.__assign) || function () {
|
|
|
10
10
|
};
|
|
11
11
|
return __assign.apply(this, arguments);
|
|
12
12
|
};
|
|
13
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
14
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
15
|
+
};
|
|
13
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.usePageFilters = void 0;
|
|
14
18
|
var react_1 = require("react");
|
|
19
|
+
var json_stable_stringify_1 = __importDefault(require("json-stable-stringify"));
|
|
15
20
|
var clearedState = {
|
|
16
21
|
global: [],
|
|
17
22
|
interactions: [],
|
|
18
23
|
interactionKey: "",
|
|
19
24
|
};
|
|
20
25
|
function usePageFilters() {
|
|
21
|
-
var _a = react_1.useState(clearedState), state = _a[0], set = _a[1];
|
|
26
|
+
var _a = (0, react_1.useState)(clearedState), state = _a[0], set = _a[1];
|
|
22
27
|
function setInteraction(interactionKey, interactions) {
|
|
23
|
-
|
|
28
|
+
console.log(interactionKey, state.interactionKey, state.interactionKey === interactionKey, interactions, state.interactions, (0, json_stable_stringify_1.default)(state.interactions), (0, json_stable_stringify_1.default)(interactions), (0, json_stable_stringify_1.default)(state.interactions) === (0, json_stable_stringify_1.default)(interactions));
|
|
29
|
+
if (state.interactionKey === interactionKey &&
|
|
30
|
+
(0, json_stable_stringify_1.default)(state.interactions) === (0, json_stable_stringify_1.default)(interactions)) {
|
|
31
|
+
clearInteraction();
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
set(__assign(__assign({}, state), { interactionKey: interactionKey, interactions: interactions }));
|
|
35
|
+
}
|
|
24
36
|
}
|
|
25
37
|
function setGlobal(global) {
|
|
26
38
|
set(__assign(__assign({}, state), { global: global }));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usePageFilters.js","sourceRoot":"","sources":["../src/usePageFilters.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"usePageFilters.js","sourceRoot":"","sources":["../src/usePageFilters.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,+BAAiC;AAEjC,gFAAoD;AAiBpD,IAAM,YAAY,GAAqB;IACnC,MAAM,EAAE,EAAE;IACV,YAAY,EAAE,EAAE;IAChB,cAAc,EAAE,EAAE;CACrB,CAAC;AAEF,SAAgB,cAAc;IACpB,IAAA,KAAe,IAAA,gBAAQ,EAAmB,YAAY,CAAC,EAAtD,KAAK,QAAA,EAAE,GAAG,QAA4C,CAAC;IAC9D,SAAS,cAAc,CAAC,cAAsB,EAAE,YAA0B;QACtE,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,cAAc,KAAK,cAAc,EACrF,YAAY,EAAE,KAAK,CAAC,YAAY,EAChC,IAAA,+BAAe,EAAC,KAAK,CAAC,YAAY,CAAC,EAAE,IAAA,+BAAe,EAAC,YAAY,CAAC,EAClE,IAAA,+BAAe,EAAC,KAAK,CAAC,YAAY,CAAC,KAAK,IAAA,+BAAe,EAAC,YAAY,CAAC,CAAC,CAAC;QAE3E,IAAI,KAAK,CAAC,cAAc,KAAK,cAAc;YACvC,IAAA,+BAAe,EAAC,KAAK,CAAC,YAAY,CAAC,KAAK,IAAA,+BAAe,EAAC,YAAY,CAAC,EAAE;YACvE,gBAAgB,EAAE,CAAC;SACtB;aAAM;YACH,GAAG,uBAAM,KAAK,KAAE,cAAc,gBAAA,EAAE,YAAY,cAAA,IAAG,CAAC;SACnD;IACL,CAAC;IACD,SAAS,SAAS,CAAC,MAAoB;QACnC,GAAG,uBAAM,KAAK,KAAE,MAAM,QAAA,IAAG,CAAC;IAC9B,CAAC;IACD,SAAS,gBAAgB;QACrB,GAAG,uBAAM,KAAK,KAAE,cAAc,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,IAAG,CAAC;IAC5D,CAAC;IACD,SAAS,WAAW;QAChB,GAAG,uBAAM,KAAK,KAAE,MAAM,EAAE,EAAE,IAAG,CAAC;IAClC,CAAC;IACD,SAAS,QAAQ;QACb,GAAG,CAAC,YAAY,CAAC,CAAC;IACtB,CAAC;IACD,SAAS,UAAU,CAAC,GAAW;QAC3B,IAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QAC5B,OAAO,GAAG,KAAK,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IACrF,CAAC;IACD,6BAAY,KAAK,KAAE,cAAc,gBAAA,EAAE,SAAS,WAAA,EAAE,gBAAgB,kBAAA,EAAE,WAAW,aAAA,EAAE,QAAQ,UAAA,EAAE,UAAU,YAAA,IAAG;AACxG,CAAC;AAhCD,wCAgCC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "flowerbi-react",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.0.0",
|
|
4
4
|
"author": "Daniel Earwicker <dan@earwicker.com>",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"description": "React helpers for FlowerBI",
|
|
@@ -9,22 +9,22 @@
|
|
|
9
9
|
"dependencies": {
|
|
10
10
|
"@types/json-stable-stringify": "^1.0.32",
|
|
11
11
|
"@types/react": "^16.9.0",
|
|
12
|
-
"
|
|
13
|
-
"
|
|
12
|
+
"flowerbi": "3.0.0",
|
|
13
|
+
"json-stable-stringify": "^1.0.1"
|
|
14
14
|
},
|
|
15
15
|
"devDependencies": {
|
|
16
|
-
"prettier": "^2.
|
|
17
|
-
"react": "^
|
|
18
|
-
"
|
|
19
|
-
"
|
|
16
|
+
"prettier": "^2.5.1",
|
|
17
|
+
"react": "^17.0.2",
|
|
18
|
+
"typedoc": "^0.22.11",
|
|
19
|
+
"typescript": "^4.5.5"
|
|
20
20
|
},
|
|
21
21
|
"peerDependencies": {
|
|
22
|
-
"react": "^16.13.1"
|
|
22
|
+
"react": "^16.13.1 || ^17.0.2"
|
|
23
23
|
},
|
|
24
24
|
"scripts": {
|
|
25
25
|
"build": "tsc",
|
|
26
26
|
"watch": "tsc -w",
|
|
27
|
-
"docs": "typedoc --
|
|
27
|
+
"docs": "typedoc --out ../../../docs/typedoc/flowerbi-react src",
|
|
28
28
|
"prepare": "npm run build && npm run docs"
|
|
29
29
|
}
|
|
30
30
|
}
|
package/src/index.ts
CHANGED
|
@@ -49,71 +49,60 @@ export type QueryDependency = {
|
|
|
49
49
|
* results are used to build this query, so we wait for them before executing,
|
|
50
50
|
* and optionally short-circuit to an empty result if the dependency is empty.
|
|
51
51
|
*/
|
|
52
|
-
export function
|
|
52
|
+
export function useFlowerBI<S extends QuerySelect>(fetch: QueryFetch, query: Query<S>, dependencies?: QueryDependency[]): UseQueryResult<S> {
|
|
53
53
|
const queryJson = jsonifyQuery(query);
|
|
54
54
|
|
|
55
55
|
const [state, setState] = useState<UseQueryState>("init");
|
|
56
56
|
const [result, setResult] = useState<QueryResultJson>({ records: [] });
|
|
57
57
|
|
|
58
|
-
const cache = useRef<{ timer?: number; queryString?: string }>({});
|
|
59
|
-
|
|
60
58
|
useEffect(() => {
|
|
61
59
|
let disposed = false; // discard stale results
|
|
62
60
|
|
|
63
|
-
if (
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
cache.current.timer = window.setTimeout(() => {
|
|
69
|
-
if (dependencies?.length) {
|
|
70
|
-
// if any not ready, neither are we
|
|
71
|
-
if (dependencies.some(x => x.dependency.state !== "ready")) {
|
|
72
|
-
if (state !== "init") {
|
|
73
|
-
setState("refresh");
|
|
74
|
-
}
|
|
75
|
-
return;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
// if any with option nonEmpty produced empty result, so do we
|
|
79
|
-
if (dependencies.filter(x => !!x.nonEmpty).some(x => !x.dependency.records.length)) {
|
|
80
|
-
setState("ready");
|
|
81
|
-
setResult({ records: [] });
|
|
82
|
-
return;
|
|
61
|
+
if (dependencies?.length) {
|
|
62
|
+
// if any not ready, neither are we
|
|
63
|
+
if (dependencies.some(x => x.dependency.state !== "ready")) {
|
|
64
|
+
if (state !== "init") {
|
|
65
|
+
setState("refresh");
|
|
83
66
|
}
|
|
67
|
+
return;
|
|
84
68
|
}
|
|
85
69
|
|
|
86
|
-
|
|
87
|
-
if (
|
|
88
|
-
|
|
70
|
+
// if any with option nonEmpty produced empty result, so do we
|
|
71
|
+
if (dependencies.filter(x => !!x.nonEmpty).some(x => !x.dependency.records.length)) {
|
|
72
|
+
setState("ready");
|
|
73
|
+
setResult({ records: [] });
|
|
89
74
|
return;
|
|
90
75
|
}
|
|
76
|
+
}
|
|
91
77
|
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
78
|
+
if (state !== "init") {
|
|
79
|
+
setState("refresh");
|
|
80
|
+
}
|
|
95
81
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
()
|
|
105
|
-
|
|
106
|
-
cache.current.queryString = queryAsString;
|
|
107
|
-
setState("error");
|
|
108
|
-
}
|
|
82
|
+
fetch(queryJson).then(
|
|
83
|
+
x => {
|
|
84
|
+
if (!disposed) {
|
|
85
|
+
setState("ready");
|
|
86
|
+
setResult(x);
|
|
87
|
+
}
|
|
88
|
+
},
|
|
89
|
+
() => {
|
|
90
|
+
if (!disposed) {
|
|
91
|
+
setState("error");
|
|
109
92
|
}
|
|
110
|
-
|
|
111
|
-
|
|
93
|
+
}
|
|
94
|
+
);
|
|
112
95
|
|
|
113
96
|
return () => {
|
|
114
97
|
disposed = true;
|
|
115
98
|
};
|
|
116
|
-
|
|
99
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
100
|
+
}, [fetch, stableStringify(queryJson)]);
|
|
117
101
|
|
|
118
102
|
return { ...expandQueryResult(query.select, result), state };
|
|
119
103
|
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Alias of useFlowerBI for backward compatibility.
|
|
107
|
+
*/
|
|
108
|
+
export const useQuery = useFlowerBI;
|
package/src/usePageFilters.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { useState } from "react";
|
|
2
2
|
import { FilterJson } from "flowerbi";
|
|
3
|
+
import stableStringify from "json-stable-stringify";
|
|
3
4
|
|
|
4
5
|
export interface PageFiltersState {
|
|
5
6
|
readonly global: FilterJson[];
|
|
@@ -25,7 +26,17 @@ const clearedState: PageFiltersState = {
|
|
|
25
26
|
export function usePageFilters(): PageFilters {
|
|
26
27
|
const [state, set] = useState<PageFiltersState>(clearedState);
|
|
27
28
|
function setInteraction(interactionKey: string, interactions: FilterJson[]) {
|
|
28
|
-
|
|
29
|
+
console.log(interactionKey, state.interactionKey, state.interactionKey === interactionKey,
|
|
30
|
+
interactions, state.interactions,
|
|
31
|
+
stableStringify(state.interactions), stableStringify(interactions),
|
|
32
|
+
stableStringify(state.interactions) === stableStringify(interactions));
|
|
33
|
+
|
|
34
|
+
if (state.interactionKey === interactionKey &&
|
|
35
|
+
stableStringify(state.interactions) === stableStringify(interactions)) {
|
|
36
|
+
clearInteraction();
|
|
37
|
+
} else {
|
|
38
|
+
set({ ...state, interactionKey, interactions });
|
|
39
|
+
}
|
|
29
40
|
}
|
|
30
41
|
function setGlobal(global: FilterJson[]) {
|
|
31
42
|
set({ ...state, global });
|
package/dist/useQuery.js
DELETED
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __assign = (this && this.__assign) || function () {
|
|
3
|
-
__assign = Object.assign || function(t) {
|
|
4
|
-
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
-
s = arguments[i];
|
|
6
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
-
t[p] = s[p];
|
|
8
|
-
}
|
|
9
|
-
return t;
|
|
10
|
-
};
|
|
11
|
-
return __assign.apply(this, arguments);
|
|
12
|
-
};
|
|
13
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
14
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
15
|
-
};
|
|
16
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
var react_1 = require("react");
|
|
18
|
-
var flowerbi_1 = require("flowerbi");
|
|
19
|
-
var json_stable_stringify_1 = __importDefault(require("json-stable-stringify"));
|
|
20
|
-
/**
|
|
21
|
-
* A custom React hook that evaluates to the result of a
|
|
22
|
-
* [Query](../flowerbi/interfaces/query.html), making it easy to perform a
|
|
23
|
-
* query from within a component.
|
|
24
|
-
*
|
|
25
|
-
* The returned object has a strongly-typed `records` array, and optionally
|
|
26
|
-
* a `totals` object. It has a `state` of type {@link UseQueryState} that
|
|
27
|
-
* can be used to show a loading indicator.
|
|
28
|
-
*
|
|
29
|
-
* @param fetch The fetch function to use.
|
|
30
|
-
* @param query The [Query](../flowerbi/interfaces/query.html) specification.
|
|
31
|
-
* @param dependencies Optionally, a list of one or more other queries whose
|
|
32
|
-
* results are used to build this query, so we wait for them before executing,
|
|
33
|
-
* and optionally short-circuit to an empty result if the dependency is empty.
|
|
34
|
-
*/
|
|
35
|
-
function useQuery(fetch, query, dependencies) {
|
|
36
|
-
var queryJson = flowerbi_1.jsonifyQuery(query);
|
|
37
|
-
var _a = react_1.useState("init"), state = _a[0], setState = _a[1];
|
|
38
|
-
var _b = react_1.useState({ records: [] }), result = _b[0], setResult = _b[1];
|
|
39
|
-
var cache = react_1.useRef({});
|
|
40
|
-
react_1.useEffect(function () {
|
|
41
|
-
var disposed = false; // discard stale results
|
|
42
|
-
if (cache.current.timer !== undefined) {
|
|
43
|
-
window.clearTimeout(cache.current.timer);
|
|
44
|
-
}
|
|
45
|
-
// de-bounce (later versions of React may do this for us)
|
|
46
|
-
cache.current.timer = window.setTimeout(function () {
|
|
47
|
-
if (dependencies === null || dependencies === void 0 ? void 0 : dependencies.length) {
|
|
48
|
-
// if any not ready, neither are we
|
|
49
|
-
if (dependencies.some(function (x) { return x.dependency.state !== "ready"; })) {
|
|
50
|
-
if (state !== "init") {
|
|
51
|
-
setState("refresh");
|
|
52
|
-
}
|
|
53
|
-
return;
|
|
54
|
-
}
|
|
55
|
-
// if any with option nonEmpty produced empty result, so do we
|
|
56
|
-
if (dependencies.filter(function (x) { return !!x.nonEmpty; }).some(function (x) { return !x.dependency.records.length; })) {
|
|
57
|
-
setState("ready");
|
|
58
|
-
setResult({ records: [] });
|
|
59
|
-
return;
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
var queryAsString = json_stable_stringify_1.default(queryJson);
|
|
63
|
-
if (queryAsString === cache.current.queryString) {
|
|
64
|
-
// current state was produced from the same query, so assume its current
|
|
65
|
-
return;
|
|
66
|
-
}
|
|
67
|
-
if (state !== "init") {
|
|
68
|
-
setState("refresh");
|
|
69
|
-
}
|
|
70
|
-
fetch(queryJson).then(function (x) {
|
|
71
|
-
if (!disposed) {
|
|
72
|
-
cache.current.queryString = queryAsString;
|
|
73
|
-
setState("ready");
|
|
74
|
-
setResult(x);
|
|
75
|
-
}
|
|
76
|
-
}, function () {
|
|
77
|
-
if (!disposed) {
|
|
78
|
-
cache.current.queryString = queryAsString;
|
|
79
|
-
setState("error");
|
|
80
|
-
}
|
|
81
|
-
});
|
|
82
|
-
}, 100);
|
|
83
|
-
return function () {
|
|
84
|
-
disposed = true;
|
|
85
|
-
};
|
|
86
|
-
}, [dependencies, fetch, queryJson, state]);
|
|
87
|
-
return __assign(__assign({}, flowerbi_1.expandQueryResult(query.select, result)), { state: state });
|
|
88
|
-
}
|
|
89
|
-
exports.useQuery = useQuery;
|
|
90
|
-
//# sourceMappingURL=useQuery.js.map
|
package/dist/useQuery.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useQuery.js","sourceRoot":"","sources":["../src/useQuery.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,+BAAoD;AACpD,qCAAiI;AACjI,gFAAoD;AAkCpD;;;;;;;;;;;;;;GAcG;AACH,SAAgB,QAAQ,CAAwB,KAAiB,EAAE,KAAe,EAAE,YAAgC;IAChH,IAAM,SAAS,GAAG,uBAAY,CAAC,KAAK,CAAC,CAAC;IAEhC,IAAA,6BAAmD,EAAlD,aAAK,EAAE,gBAA2C,CAAC;IACpD,IAAA,sCAAgE,EAA/D,cAAM,EAAE,iBAAuD,CAAC;IAEvE,IAAM,KAAK,GAAG,cAAM,CAA2C,EAAE,CAAC,CAAC;IAEnE,iBAAS,CAAC;QACN,IAAI,QAAQ,GAAG,KAAK,CAAC,CAAC,wBAAwB;QAE9C,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,KAAK,SAAS,EAAE;YACnC,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;SAC5C;QAED,yDAAyD;QACzD,KAAK,CAAC,OAAO,CAAC,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC;YACpC,IAAI,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,MAAM,EAAE;gBACtB,mCAAmC;gBACnC,IAAI,YAAY,CAAC,IAAI,CAAC,UAAA,CAAC,IAAI,OAAA,CAAC,CAAC,UAAU,CAAC,KAAK,KAAK,OAAO,EAA9B,CAA8B,CAAC,EAAE;oBACxD,IAAI,KAAK,KAAK,MAAM,EAAE;wBAClB,QAAQ,CAAC,SAAS,CAAC,CAAC;qBACvB;oBACD,OAAO;iBACV;gBAED,8DAA8D;gBAC9D,IAAI,YAAY,CAAC,MAAM,CAAC,UAAA,CAAC,IAAI,OAAA,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAZ,CAAY,CAAC,CAAC,IAAI,CAAC,UAAA,CAAC,IAAI,OAAA,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,EAA5B,CAA4B,CAAC,EAAE;oBAChF,QAAQ,CAAC,OAAO,CAAC,CAAC;oBAClB,SAAS,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;oBAC3B,OAAO;iBACV;aACJ;YAED,IAAM,aAAa,GAAG,+BAAe,CAAC,SAAS,CAAC,CAAC;YACjD,IAAI,aAAa,KAAK,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE;gBAC7C,wEAAwE;gBACxE,OAAO;aACV;YAED,IAAI,KAAK,KAAK,MAAM,EAAE;gBAClB,QAAQ,CAAC,SAAS,CAAC,CAAC;aACvB;YAED,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CACjB,UAAA,CAAC;gBACG,IAAI,CAAC,QAAQ,EAAE;oBACX,KAAK,CAAC,OAAO,CAAC,WAAW,GAAG,aAAa,CAAC;oBAC1C,QAAQ,CAAC,OAAO,CAAC,CAAC;oBAClB,SAAS,CAAC,CAAC,CAAC,CAAC;iBAChB;YACL,CAAC,EACD;gBACI,IAAI,CAAC,QAAQ,EAAE;oBACX,KAAK,CAAC,OAAO,CAAC,WAAW,GAAG,aAAa,CAAC;oBAC1C,QAAQ,CAAC,OAAO,CAAC,CAAC;iBACrB;YACL,CAAC,CACJ,CAAC;QACN,CAAC,EAAE,GAAG,CAAC,CAAC;QAER,OAAO;YACH,QAAQ,GAAG,IAAI,CAAC;QACpB,CAAC,CAAC;IACN,CAAC,EAAE,CAAC,YAAY,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;IAE5C,6BAAY,4BAAiB,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,KAAE,KAAK,OAAA,IAAG;AACjE,CAAC;AAnED,4BAmEC"}
|