@deephaven/jsapi-components 0.37.4-beta.0 → 0.37.4-logout.1
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/dist/RefreshTokenBootstrap.d.ts +13 -0
- package/dist/RefreshTokenBootstrap.d.ts.map +1 -0
- package/dist/RefreshTokenBootstrap.js +40 -0
- package/dist/RefreshTokenBootstrap.js.map +1 -0
- package/dist/RefreshTokenUtils.d.ts +18 -0
- package/dist/RefreshTokenUtils.d.ts.map +1 -0
- package/dist/RefreshTokenUtils.js +35 -0
- package/dist/RefreshTokenUtils.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/useBroadcastChannel.d.ts +4 -0
- package/dist/useBroadcastChannel.d.ts.map +1 -0
- package/dist/useBroadcastChannel.js +29 -0
- package/dist/useBroadcastChannel.js.map +1 -0
- package/dist/useBroadcastLoginListener.d.ts +4 -0
- package/dist/useBroadcastLoginListener.d.ts.map +1 -0
- package/dist/useBroadcastLoginListener.js +15 -0
- package/dist/useBroadcastLoginListener.js.map +1 -0
- package/dist/useInitializeViewportData.d.ts +1 -1
- package/dist/useInitializeViewportData.d.ts.map +1 -1
- package/dist/useInitializeViewportData.js.map +1 -1
- package/dist/useSelectDistinctTable.d.ts +1 -1
- package/dist/useSelectDistinctTable.d.ts.map +1 -1
- package/dist/useSelectDistinctTable.js.map +1 -1
- package/dist/useSetPaddedViewportCallback.d.ts +1 -1
- package/dist/useSetPaddedViewportCallback.d.ts.map +1 -1
- package/dist/useSetPaddedViewportCallback.js.map +1 -1
- package/dist/useTable.d.ts.map +1 -1
- package/dist/useTable.js +2 -1
- package/dist/useTable.js.map +1 -1
- package/dist/useViewportData.d.ts +1 -1
- package/dist/useViewportData.d.ts.map +1 -1
- package/dist/useViewportData.js.map +1 -1
- package/package.json +13 -11
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export type RefreshTokenBootstrapProps = {
|
|
3
|
+
/**
|
|
4
|
+
* The children to render wrapped with the RefreshTokenContext.
|
|
5
|
+
*/
|
|
6
|
+
children: React.ReactNode;
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* RefreshTokenBootstrap component. Handles storing and reading the refresh token.
|
|
10
|
+
*/
|
|
11
|
+
export declare function RefreshTokenBootstrap({ children, }: RefreshTokenBootstrapProps): JSX.Element;
|
|
12
|
+
export default RefreshTokenBootstrap;
|
|
13
|
+
//# sourceMappingURL=RefreshTokenBootstrap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RefreshTokenBootstrap.d.ts","sourceRoot":"","sources":["../src/RefreshTokenBootstrap.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA2C,MAAM,OAAO,CAAC;AAUhE,MAAM,MAAM,0BAA0B,GAAG;IACvC;;OAEG;IACH,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,CAAC;AAEF;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,EACpC,QAAQ,GACT,EAAE,0BAA0B,eAqC5B;AAED,eAAe,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import React, { useCallback, useEffect, useState } from 'react';
|
|
2
|
+
import { useApi, useClient } from '@deephaven/jsapi-bootstrap';
|
|
3
|
+
import useBroadcastChannel from "./useBroadcastChannel.js";
|
|
4
|
+
import useBroadcastLoginListener from "./useBroadcastLoginListener.js";
|
|
5
|
+
import { readRefreshToken, RefreshTokenContext, storeRefreshToken } from "./RefreshTokenUtils.js";
|
|
6
|
+
/**
|
|
7
|
+
* RefreshTokenBootstrap component. Handles storing and reading the refresh token.
|
|
8
|
+
*/
|
|
9
|
+
export function RefreshTokenBootstrap(_ref) {
|
|
10
|
+
var {
|
|
11
|
+
children
|
|
12
|
+
} = _ref;
|
|
13
|
+
var api = useApi();
|
|
14
|
+
var client = useClient();
|
|
15
|
+
var channel = useBroadcastChannel();
|
|
16
|
+
var [token, setToken] = useState(readRefreshToken());
|
|
17
|
+
useEffect(function listenForTokenUpdates() {
|
|
18
|
+
var cleanup = client.addEventListener(api.CoreClient.EVENT_REFRESH_TOKEN_UPDATED, event => {
|
|
19
|
+
var {
|
|
20
|
+
detail: newToken
|
|
21
|
+
} = event;
|
|
22
|
+
storeRefreshToken(newToken);
|
|
23
|
+
setToken(newToken);
|
|
24
|
+
});
|
|
25
|
+
return cleanup;
|
|
26
|
+
}, [api, channel, client, token]);
|
|
27
|
+
var onLogin = useCallback(() => {
|
|
28
|
+
setToken(readRefreshToken());
|
|
29
|
+
}, []);
|
|
30
|
+
var onLogout = useCallback(() => {
|
|
31
|
+
storeRefreshToken(null);
|
|
32
|
+
setToken(null);
|
|
33
|
+
}, []);
|
|
34
|
+
useBroadcastLoginListener(onLogin, onLogout);
|
|
35
|
+
return /*#__PURE__*/React.createElement(RefreshTokenContext.Provider, {
|
|
36
|
+
value: token
|
|
37
|
+
}, children);
|
|
38
|
+
}
|
|
39
|
+
export default RefreshTokenBootstrap;
|
|
40
|
+
//# sourceMappingURL=RefreshTokenBootstrap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RefreshTokenBootstrap.js","names":["React","useCallback","useEffect","useState","useApi","useClient","useBroadcastChannel","useBroadcastLoginListener","readRefreshToken","RefreshTokenContext","storeRefreshToken","RefreshTokenBootstrap","children","api","client","channel","token","setToken","listenForTokenUpdates","cleanup","addEventListener","CoreClient","EVENT_REFRESH_TOKEN_UPDATED","event","detail","newToken","onLogin","onLogout"],"sources":["../src/RefreshTokenBootstrap.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useState } from 'react';\nimport { useApi, useClient } from '@deephaven/jsapi-bootstrap';\nimport useBroadcastChannel from './useBroadcastChannel';\nimport useBroadcastLoginListener from './useBroadcastLoginListener';\nimport {\n readRefreshToken,\n RefreshTokenContext,\n storeRefreshToken,\n} from './RefreshTokenUtils';\n\nexport type RefreshTokenBootstrapProps = {\n /**\n * The children to render wrapped with the RefreshTokenContext.\n */\n children: React.ReactNode;\n};\n\n/**\n * RefreshTokenBootstrap component. Handles storing and reading the refresh token.\n */\nexport function RefreshTokenBootstrap({\n children,\n}: RefreshTokenBootstrapProps) {\n const api = useApi();\n const client = useClient();\n const channel = useBroadcastChannel();\n const [token, setToken] = useState(readRefreshToken());\n\n useEffect(\n function listenForTokenUpdates() {\n const cleanup = client.addEventListener(\n api.CoreClient.EVENT_REFRESH_TOKEN_UPDATED,\n (event: CustomEvent) => {\n const { detail: newToken } = event;\n storeRefreshToken(newToken);\n setToken(newToken);\n }\n );\n return cleanup;\n },\n [api, channel, client, token]\n );\n\n const onLogin = useCallback(() => {\n setToken(readRefreshToken());\n }, []);\n\n const onLogout = useCallback(() => {\n storeRefreshToken(null);\n setToken(null);\n }, []);\n\n useBroadcastLoginListener(onLogin, onLogout);\n\n return (\n <RefreshTokenContext.Provider value={token}>\n {children}\n </RefreshTokenContext.Provider>\n );\n}\n\nexport default RefreshTokenBootstrap;\n"],"mappings":"AAAA,OAAOA,KAAK,IAAIC,WAAW,EAAEC,SAAS,EAAEC,QAAQ,QAAQ,OAAO;AAC/D,SAASC,MAAM,EAAEC,SAAS,QAAQ,4BAA4B;AAAC,OACxDC,mBAAmB;AAAA,OACnBC,yBAAyB;AAAA,SAE9BC,gBAAgB,EAChBC,mBAAmB,EACnBC,iBAAiB;AAUnB;AACA;AACA;AACA,OAAO,SAASC,qBAAqB,OAEN;EAAA,IAFO;IACpCC;EAC0B,CAAC;EAC3B,IAAMC,GAAG,GAAGT,MAAM,EAAE;EACpB,IAAMU,MAAM,GAAGT,SAAS,EAAE;EAC1B,IAAMU,OAAO,GAAGT,mBAAmB,EAAE;EACrC,IAAM,CAACU,KAAK,EAAEC,QAAQ,CAAC,GAAGd,QAAQ,CAACK,gBAAgB,EAAE,CAAC;EAEtDN,SAAS,CACP,SAASgB,qBAAqB,GAAG;IAC/B,IAAMC,OAAO,GAAGL,MAAM,CAACM,gBAAgB,CACrCP,GAAG,CAACQ,UAAU,CAACC,2BAA2B,EACzCC,KAAkB,IAAK;MACtB,IAAM;QAAEC,MAAM,EAAEC;MAAS,CAAC,GAAGF,KAAK;MAClCb,iBAAiB,CAACe,QAAQ,CAAC;MAC3BR,QAAQ,CAACQ,QAAQ,CAAC;IACpB,CAAC,CACF;IACD,OAAON,OAAO;EAChB,CAAC,EACD,CAACN,GAAG,EAAEE,OAAO,EAAED,MAAM,EAAEE,KAAK,CAAC,CAC9B;EAED,IAAMU,OAAO,GAAGzB,WAAW,CAAC,MAAM;IAChCgB,QAAQ,CAACT,gBAAgB,EAAE,CAAC;EAC9B,CAAC,EAAE,EAAE,CAAC;EAEN,IAAMmB,QAAQ,GAAG1B,WAAW,CAAC,MAAM;IACjCS,iBAAiB,CAAC,IAAI,CAAC;IACvBO,QAAQ,CAAC,IAAI,CAAC;EAChB,CAAC,EAAE,EAAE,CAAC;EAENV,yBAAyB,CAACmB,OAAO,EAAEC,QAAQ,CAAC;EAE5C,oBACE,oBAAC,mBAAmB,CAAC,QAAQ;IAAC,KAAK,EAAEX;EAAM,GACxCJ,QAAQ,CACoB;AAEnC;AAEA,eAAeD,qBAAqB"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
export declare const REFRESH_TOKEN_KEY = "io.deephaven.web.client.auth.refreshToken";
|
|
3
|
+
export type RefreshToken = {
|
|
4
|
+
bytes: string;
|
|
5
|
+
expiry: number;
|
|
6
|
+
};
|
|
7
|
+
export declare const RefreshTokenContext: import("react").Context<RefreshToken | null>;
|
|
8
|
+
/**
|
|
9
|
+
* Read the refresh token from our cookie store
|
|
10
|
+
* @returns RefreshToken if it exists, null otherwise
|
|
11
|
+
*/
|
|
12
|
+
export declare function readRefreshToken(): RefreshToken | null;
|
|
13
|
+
/**
|
|
14
|
+
* Store the provided refresh token as a cookie
|
|
15
|
+
* @param token The refresh token to store
|
|
16
|
+
*/
|
|
17
|
+
export declare function storeRefreshToken(token: RefreshToken | null): void;
|
|
18
|
+
//# sourceMappingURL=RefreshTokenUtils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RefreshTokenUtils.d.ts","sourceRoot":"","sources":["../src/RefreshTokenUtils.ts"],"names":[],"mappings":";AAGA,eAAO,MAAM,iBAAiB,8CAA8C,CAAC;AAE7E,MAAM,MAAM,YAAY,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAE7D,eAAO,MAAM,mBAAmB,8CAA2C,CAAC;AAE5E;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,YAAY,GAAG,IAAI,CAGtD;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,QAgB3D"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { createContext } from 'react';
|
|
2
|
+
import Cookies from 'js-cookie';
|
|
3
|
+
export var REFRESH_TOKEN_KEY = 'io.deephaven.web.client.auth.refreshToken';
|
|
4
|
+
export var RefreshTokenContext = /*#__PURE__*/createContext(null);
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Read the refresh token from our cookie store
|
|
8
|
+
* @returns RefreshToken if it exists, null otherwise
|
|
9
|
+
*/
|
|
10
|
+
export function readRefreshToken() {
|
|
11
|
+
var cookieToken = Cookies.get(REFRESH_TOKEN_KEY);
|
|
12
|
+
return cookieToken != null ? JSON.parse(cookieToken) : null;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Store the provided refresh token as a cookie
|
|
17
|
+
* @param token The refresh token to store
|
|
18
|
+
*/
|
|
19
|
+
export function storeRefreshToken(token) {
|
|
20
|
+
if (token != null) {
|
|
21
|
+
var cookieToken = JSON.stringify({
|
|
22
|
+
bytes: token.bytes,
|
|
23
|
+
expiry: token.expiry
|
|
24
|
+
});
|
|
25
|
+
var expires = new Date(token.expiry);
|
|
26
|
+
Cookies.set(REFRESH_TOKEN_KEY, cookieToken, {
|
|
27
|
+
secure: true,
|
|
28
|
+
sameSite: 'strict',
|
|
29
|
+
expires
|
|
30
|
+
});
|
|
31
|
+
} else {
|
|
32
|
+
Cookies.remove(REFRESH_TOKEN_KEY);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=RefreshTokenUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RefreshTokenUtils.js","names":["createContext","Cookies","REFRESH_TOKEN_KEY","RefreshTokenContext","readRefreshToken","cookieToken","get","JSON","parse","storeRefreshToken","token","stringify","bytes","expiry","expires","Date","set","secure","sameSite","remove"],"sources":["../src/RefreshTokenUtils.ts"],"sourcesContent":["import { createContext } from 'react';\nimport Cookies from 'js-cookie';\n\nexport const REFRESH_TOKEN_KEY = 'io.deephaven.web.client.auth.refreshToken';\n\nexport type RefreshToken = { bytes: string; expiry: number };\n\nexport const RefreshTokenContext = createContext<RefreshToken | null>(null);\n\n/**\n * Read the refresh token from our cookie store\n * @returns RefreshToken if it exists, null otherwise\n */\nexport function readRefreshToken(): RefreshToken | null {\n const cookieToken = Cookies.get(REFRESH_TOKEN_KEY);\n return cookieToken != null ? JSON.parse(cookieToken) : null;\n}\n\n/**\n * Store the provided refresh token as a cookie\n * @param token The refresh token to store\n */\nexport function storeRefreshToken(token: RefreshToken | null) {\n if (token != null) {\n const cookieToken = JSON.stringify({\n bytes: token.bytes,\n expiry: token.expiry,\n });\n const expires = new Date(token.expiry);\n\n Cookies.set(REFRESH_TOKEN_KEY, cookieToken, {\n secure: true,\n sameSite: 'strict',\n expires,\n });\n } else {\n Cookies.remove(REFRESH_TOKEN_KEY);\n }\n}\n"],"mappings":"AAAA,SAASA,aAAa,QAAQ,OAAO;AACrC,OAAOC,OAAO,MAAM,WAAW;AAE/B,OAAO,IAAMC,iBAAiB,GAAG,2CAA2C;AAI5E,OAAO,IAAMC,mBAAmB,gBAAGH,aAAa,CAAsB,IAAI,CAAC;;AAE3E;AACA;AACA;AACA;AACA,OAAO,SAASI,gBAAgB,GAAwB;EACtD,IAAMC,WAAW,GAAGJ,OAAO,CAACK,GAAG,CAACJ,iBAAiB,CAAC;EAClD,OAAOG,WAAW,IAAI,IAAI,GAAGE,IAAI,CAACC,KAAK,CAACH,WAAW,CAAC,GAAG,IAAI;AAC7D;;AAEA;AACA;AACA;AACA;AACA,OAAO,SAASI,iBAAiB,CAACC,KAA0B,EAAE;EAC5D,IAAIA,KAAK,IAAI,IAAI,EAAE;IACjB,IAAML,WAAW,GAAGE,IAAI,CAACI,SAAS,CAAC;MACjCC,KAAK,EAAEF,KAAK,CAACE,KAAK;MAClBC,MAAM,EAAEH,KAAK,CAACG;IAChB,CAAC,CAAC;IACF,IAAMC,OAAO,GAAG,IAAIC,IAAI,CAACL,KAAK,CAACG,MAAM,CAAC;IAEtCZ,OAAO,CAACe,GAAG,CAACd,iBAAiB,EAAEG,WAAW,EAAE;MAC1CY,MAAM,EAAE,IAAI;MACZC,QAAQ,EAAE,QAAQ;MAClBJ;IACF,CAAC,CAAC;EACJ,CAAC,MAAM;IACLb,OAAO,CAACkB,MAAM,CAACjB,iBAAiB,CAAC;EACnC;AACF"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
export { default as TableInput } from './TableInput';
|
|
2
|
+
export * from './RefreshTokenBootstrap';
|
|
3
|
+
export * from './RefreshTokenUtils';
|
|
4
|
+
export { default as useBroadcastChannel } from './useBroadcastChannel';
|
|
5
|
+
export { default as useBroadcastLoginListener } from './useBroadcastLoginListener';
|
|
2
6
|
export { default as useInitializeViewportData } from './useInitializeViewportData';
|
|
3
7
|
export { default as useTable } from './useTable';
|
|
4
8
|
export { default as useTableColumn } from './useTableColumn';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,OAAO,IAAI,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AACnF,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAC7E,OAAO,EAAE,OAAO,IAAI,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AACzF,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,cAAc,CAAC;AACrD,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,EAAE,OAAO,IAAI,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AACnF,OAAO,EAAE,OAAO,IAAI,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AACnF,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAC7E,OAAO,EAAE,OAAO,IAAI,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AACzF,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,mBAAmB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
export { default as TableInput } from "./TableInput.js";
|
|
2
|
+
export * from "./RefreshTokenBootstrap.js";
|
|
3
|
+
export * from "./RefreshTokenUtils.js";
|
|
4
|
+
export { default as useBroadcastChannel } from "./useBroadcastChannel.js";
|
|
5
|
+
export { default as useBroadcastLoginListener } from "./useBroadcastLoginListener.js";
|
|
2
6
|
export { default as useInitializeViewportData } from "./useInitializeViewportData.js";
|
|
3
7
|
export { default as useTable } from "./useTable.js";
|
|
4
8
|
export { default as useTableColumn } from "./useTableColumn.js";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["default","TableInput","useInitializeViewportData","useTable","useTableColumn","useTableListener","useSelectDistinctTable","useSetPaddedViewportCallback","useViewportData"],"sources":["../src/index.ts"],"sourcesContent":["export { default as TableInput } from './TableInput';\nexport { default as useInitializeViewportData } from './useInitializeViewportData';\nexport { default as useTable } from './useTable';\nexport { default as useTableColumn } from './useTableColumn';\nexport { default as useTableListener } from './useTableListener';\nexport { default as useSelectDistinctTable } from './useSelectDistinctTable';\nexport { default as useSetPaddedViewportCallback } from './useSetPaddedViewportCallback';\nexport { default as useViewportData } from './useViewportData';\n"],"mappings":"SAASA,OAAO,IAAIC,UAAU;AAAA,
|
|
1
|
+
{"version":3,"file":"index.js","names":["default","TableInput","useBroadcastChannel","useBroadcastLoginListener","useInitializeViewportData","useTable","useTableColumn","useTableListener","useSelectDistinctTable","useSetPaddedViewportCallback","useViewportData"],"sources":["../src/index.ts"],"sourcesContent":["export { default as TableInput } from './TableInput';\nexport * from './RefreshTokenBootstrap';\nexport * from './RefreshTokenUtils';\nexport { default as useBroadcastChannel } from './useBroadcastChannel';\nexport { default as useBroadcastLoginListener } from './useBroadcastLoginListener';\nexport { default as useInitializeViewportData } from './useInitializeViewportData';\nexport { default as useTable } from './useTable';\nexport { default as useTableColumn } from './useTableColumn';\nexport { default as useTableListener } from './useTableListener';\nexport { default as useSelectDistinctTable } from './useSelectDistinctTable';\nexport { default as useSetPaddedViewportCallback } from './useSetPaddedViewportCallback';\nexport { default as useViewportData } from './useViewportData';\n"],"mappings":"SAASA,OAAO,IAAIC,UAAU;AAAA;AAAA;AAAA,SAGrBD,OAAO,IAAIE,mBAAmB;AAAA,SAC9BF,OAAO,IAAIG,yBAAyB;AAAA,SACpCH,OAAO,IAAII,yBAAyB;AAAA,SACpCJ,OAAO,IAAIK,QAAQ;AAAA,SACnBL,OAAO,IAAIM,cAAc;AAAA,SACzBN,OAAO,IAAIO,gBAAgB;AAAA,SAC3BP,OAAO,IAAIQ,sBAAsB;AAAA,SACjCR,OAAO,IAAIS,4BAA4B;AAAA,SACvCT,OAAO,IAAIU,eAAe"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { Message } from '@deephaven/jsapi-utils';
|
|
2
|
+
export declare function useBroadcastChannel(onEvent?: (event: MessageEvent<Message<unknown>>) => void, name?: string): BroadcastChannel;
|
|
3
|
+
export default useBroadcastChannel;
|
|
4
|
+
//# sourceMappingURL=useBroadcastChannel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useBroadcastChannel.d.ts","sourceRoot":"","sources":["../src/useBroadcastChannel.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,OAAO,EACR,MAAM,wBAAwB,CAAC;AAOhC,wBAAgB,mBAAmB,CACjC,OAAO,GAAE,CAAC,KAAK,EAAE,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,IAAqB,EACzE,IAAI,SAAyB,oBAuB9B;AAED,eAAe,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { BROADCAST_CHANNEL_NAME, isMessage } from '@deephaven/jsapi-utils';
|
|
2
|
+
import Log from '@deephaven/log';
|
|
3
|
+
import { EMPTY_FUNCTION } from '@deephaven/utils';
|
|
4
|
+
import { useEffect, useMemo } from 'react';
|
|
5
|
+
var log = Log.module('useBroadcastChannel');
|
|
6
|
+
export function useBroadcastChannel() {
|
|
7
|
+
var onEvent = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : EMPTY_FUNCTION;
|
|
8
|
+
var name = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : BROADCAST_CHANNEL_NAME;
|
|
9
|
+
var channel = useMemo(() => new BroadcastChannel(name), [name]);
|
|
10
|
+
useEffect(() => () => {
|
|
11
|
+
channel.close();
|
|
12
|
+
}, [channel]);
|
|
13
|
+
useEffect(() => {
|
|
14
|
+
channel.onmessage = event => {
|
|
15
|
+
var {
|
|
16
|
+
data
|
|
17
|
+
} = event;
|
|
18
|
+
if (!isMessage(data)) {
|
|
19
|
+
log.debug('Ignoring non-deephaven message', data);
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
log.debug('event received', data);
|
|
23
|
+
onEvent(event);
|
|
24
|
+
};
|
|
25
|
+
}, [channel, onEvent]);
|
|
26
|
+
return channel;
|
|
27
|
+
}
|
|
28
|
+
export default useBroadcastChannel;
|
|
29
|
+
//# sourceMappingURL=useBroadcastChannel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useBroadcastChannel.js","names":["BROADCAST_CHANNEL_NAME","isMessage","Log","EMPTY_FUNCTION","useEffect","useMemo","log","module","useBroadcastChannel","onEvent","name","channel","BroadcastChannel","close","onmessage","event","data","debug"],"sources":["../src/useBroadcastChannel.ts"],"sourcesContent":["import {\n BROADCAST_CHANNEL_NAME,\n isMessage,\n Message,\n} from '@deephaven/jsapi-utils';\nimport Log from '@deephaven/log';\nimport { EMPTY_FUNCTION } from '@deephaven/utils';\nimport { useEffect, useMemo } from 'react';\n\nconst log = Log.module('useBroadcastChannel');\n\nexport function useBroadcastChannel(\n onEvent: (event: MessageEvent<Message<unknown>>) => void = EMPTY_FUNCTION,\n name = BROADCAST_CHANNEL_NAME\n) {\n const channel = useMemo(() => new BroadcastChannel(name), [name]);\n useEffect(\n () => () => {\n channel.close();\n },\n [channel]\n );\n\n useEffect(() => {\n channel.onmessage = (event: MessageEvent) => {\n const { data } = event;\n if (!isMessage(data)) {\n log.debug('Ignoring non-deephaven message', data);\n return;\n }\n log.debug('event received', data);\n onEvent(event);\n };\n }, [channel, onEvent]);\n\n return channel;\n}\n\nexport default useBroadcastChannel;\n"],"mappings":"AAAA,SACEA,sBAAsB,EACtBC,SAAS,QAEJ,wBAAwB;AAC/B,OAAOC,GAAG,MAAM,gBAAgB;AAChC,SAASC,cAAc,QAAQ,kBAAkB;AACjD,SAASC,SAAS,EAAEC,OAAO,QAAQ,OAAO;AAE1C,IAAMC,GAAG,GAAGJ,GAAG,CAACK,MAAM,CAAC,qBAAqB,CAAC;AAE7C,OAAO,SAASC,mBAAmB,GAGjC;EAAA,IAFAC,OAAwD,uEAAGN,cAAc;EAAA,IACzEO,IAAI,uEAAGV,sBAAsB;EAE7B,IAAMW,OAAO,GAAGN,OAAO,CAAC,MAAM,IAAIO,gBAAgB,CAACF,IAAI,CAAC,EAAE,CAACA,IAAI,CAAC,CAAC;EACjEN,SAAS,CACP,MAAM,MAAM;IACVO,OAAO,CAACE,KAAK,EAAE;EACjB,CAAC,EACD,CAACF,OAAO,CAAC,CACV;EAEDP,SAAS,CAAC,MAAM;IACdO,OAAO,CAACG,SAAS,GAAIC,KAAmB,IAAK;MAC3C,IAAM;QAAEC;MAAK,CAAC,GAAGD,KAAK;MACtB,IAAI,CAACd,SAAS,CAACe,IAAI,CAAC,EAAE;QACpBV,GAAG,CAACW,KAAK,CAAC,gCAAgC,EAAED,IAAI,CAAC;QACjD;MACF;MACAV,GAAG,CAACW,KAAK,CAAC,gBAAgB,EAAED,IAAI,CAAC;MACjCP,OAAO,CAACM,KAAK,CAAC;IAChB,CAAC;EACH,CAAC,EAAE,CAACJ,OAAO,EAAEF,OAAO,CAAC,CAAC;EAEtB,OAAOE,OAAO;AAChB;AAEA,eAAeH,mBAAmB"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { BroadcastLoginMessage, BroadcastLogoutMessage } from '@deephaven/jsapi-utils';
|
|
2
|
+
export declare function useBroadcastLoginListener(onLogin?: (message: BroadcastLoginMessage) => void, onLogout?: (message: BroadcastLogoutMessage) => void): void;
|
|
3
|
+
export default useBroadcastLoginListener;
|
|
4
|
+
//# sourceMappingURL=useBroadcastLoginListener.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useBroadcastLoginListener.d.ts","sourceRoot":"","sources":["../src/useBroadcastLoginListener.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EAIvB,MAAM,wBAAwB,CAAC;AAIhC,wBAAgB,yBAAyB,CACvC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,qBAAqB,KAAK,IAAI,EAClD,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,sBAAsB,KAAK,IAAI,QAcrD;AAED,eAAe,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { isBroadcastLoginMessage, isBroadcastLogoutMessage } from '@deephaven/jsapi-utils';
|
|
2
|
+
import { useCallback } from 'react';
|
|
3
|
+
import useBroadcastChannel from "./useBroadcastChannel.js";
|
|
4
|
+
export function useBroadcastLoginListener(onLogin, onLogout) {
|
|
5
|
+
var onMessage = useCallback(event => {
|
|
6
|
+
if (isBroadcastLoginMessage(event.data)) {
|
|
7
|
+
onLogin === null || onLogin === void 0 ? void 0 : onLogin(event.data);
|
|
8
|
+
} else if (isBroadcastLogoutMessage(event.data)) {
|
|
9
|
+
onLogout === null || onLogout === void 0 ? void 0 : onLogout(event.data);
|
|
10
|
+
}
|
|
11
|
+
}, [onLogin, onLogout]);
|
|
12
|
+
useBroadcastChannel(onMessage);
|
|
13
|
+
}
|
|
14
|
+
export default useBroadcastLoginListener;
|
|
15
|
+
//# sourceMappingURL=useBroadcastLoginListener.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useBroadcastLoginListener.js","names":["isBroadcastLoginMessage","isBroadcastLogoutMessage","useCallback","useBroadcastChannel","useBroadcastLoginListener","onLogin","onLogout","onMessage","event","data"],"sources":["../src/useBroadcastLoginListener.ts"],"sourcesContent":["import {\n BroadcastLoginMessage,\n BroadcastLogoutMessage,\n isBroadcastLoginMessage,\n isBroadcastLogoutMessage,\n Message,\n} from '@deephaven/jsapi-utils';\nimport { useCallback } from 'react';\nimport useBroadcastChannel from './useBroadcastChannel';\n\nexport function useBroadcastLoginListener(\n onLogin?: (message: BroadcastLoginMessage) => void,\n onLogout?: (message: BroadcastLogoutMessage) => void\n) {\n const onMessage = useCallback(\n (event: MessageEvent<Message<unknown>>) => {\n if (isBroadcastLoginMessage(event.data)) {\n onLogin?.(event.data);\n } else if (isBroadcastLogoutMessage(event.data)) {\n onLogout?.(event.data);\n }\n },\n [onLogin, onLogout]\n );\n\n useBroadcastChannel(onMessage);\n}\n\nexport default useBroadcastLoginListener;\n"],"mappings":"AAAA,SAGEA,uBAAuB,EACvBC,wBAAwB,QAEnB,wBAAwB;AAC/B,SAASC,WAAW,QAAQ,OAAO;AAAC,OAC7BC,mBAAmB;AAE1B,OAAO,SAASC,yBAAyB,CACvCC,OAAkD,EAClDC,QAAoD,EACpD;EACA,IAAMC,SAAS,GAAGL,WAAW,CAC1BM,KAAqC,IAAK;IACzC,IAAIR,uBAAuB,CAACQ,KAAK,CAACC,IAAI,CAAC,EAAE;MACvCJ,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAGG,KAAK,CAACC,IAAI,CAAC;IACvB,CAAC,MAAM,IAAIR,wBAAwB,CAACO,KAAK,CAACC,IAAI,CAAC,EAAE;MAC/CH,QAAQ,aAARA,QAAQ,uBAARA,QAAQ,CAAGE,KAAK,CAACC,IAAI,CAAC;IACxB;EACF,CAAC,EACD,CAACJ,OAAO,EAAEC,QAAQ,CAAC,CACpB;EAEDH,mBAAmB,CAACI,SAAS,CAAC;AAChC;AAEA,eAAeH,yBAAyB"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ListData } from '@react-stately/data';
|
|
2
|
-
import { Table, TreeTable } from '@deephaven/jsapi-
|
|
2
|
+
import { Table, TreeTable } from '@deephaven/jsapi-types';
|
|
3
3
|
import { KeyedItem } from '@deephaven/jsapi-utils';
|
|
4
4
|
/**
|
|
5
5
|
* Initializes a ListData instance that can be used for windowed views of a
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useInitializeViewportData.d.ts","sourceRoot":"","sources":["../src/useInitializeViewportData.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAe,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"useInitializeViewportData.d.ts","sourceRoot":"","sources":["../src/useInitializeViewportData.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAe,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EACL,SAAS,EAGV,MAAM,wBAAwB,CAAC;AAEhC;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,OAAO,UAAU,yBAAyB,CAAC,CAAC,EACjD,KAAK,EAAE,KAAK,GAAG,SAAS,GAAG,IAAI,GAC9B,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAsBxB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useInitializeViewportData.js","names":["useEffect","useListData","generateEmptyKeyedItems","getSize","useInitializeViewportData","table","viewportData","items","length","remove","map","key","insert"],"sources":["../src/useInitializeViewportData.ts"],"sourcesContent":["import { useEffect } from 'react';\nimport { ListData, useListData } from '@react-stately/data';\nimport { Table, TreeTable } from '@deephaven/jsapi-
|
|
1
|
+
{"version":3,"file":"useInitializeViewportData.js","names":["useEffect","useListData","generateEmptyKeyedItems","getSize","useInitializeViewportData","table","viewportData","items","length","remove","map","key","insert"],"sources":["../src/useInitializeViewportData.ts"],"sourcesContent":["import { useEffect } from 'react';\nimport { ListData, useListData } from '@react-stately/data';\nimport { Table, TreeTable } from '@deephaven/jsapi-types';\nimport {\n KeyedItem,\n generateEmptyKeyedItems,\n getSize,\n} from '@deephaven/jsapi-utils';\n\n/**\n * Initializes a ListData instance that can be used for windowed views of a\n * Table. The list must always contain a KeyedItem for every record in the table,\n * so it is pre-populated with empty items that can be updated with real data as\n * the window changes.\n *\n * IMPORTANT: this will create an empty KeyedItem object for every row in the\n * source table. This is intended for \"human\" sized tables such as those used in\n * admin panels. This is not suitable for \"machine\" scale with millions+ rows.\n * @param table The table that will be used to determine the list size.\n * @returns\n */\nexport default function useInitializeViewportData<T>(\n table: Table | TreeTable | null\n): ListData<KeyedItem<T>> {\n const viewportData = useListData<KeyedItem<T>>({});\n\n // We only want this to fire 1x once the table exists. Note that `useListData`\n // has no way to respond to a reference change of the `table` instance so we\n // have to manually delete any previous keyed items from the list.\n useEffect(() => {\n if (!table) {\n return;\n }\n\n if (viewportData.items.length) {\n viewportData.remove(...viewportData.items.map(({ key }) => key));\n }\n\n viewportData.insert(0, ...generateEmptyKeyedItems<T>(getSize(table)));\n\n // Intentionally excluding viewportData since it changes on every render.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [table]);\n\n return viewportData;\n}\n"],"mappings":"AAAA,SAASA,SAAS,QAAQ,OAAO;AACjC,SAAmBC,WAAW,QAAQ,qBAAqB;AAE3D,SAEEC,uBAAuB,EACvBC,OAAO,QACF,wBAAwB;;AAE/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,SAASC,yBAAyB,CAC/CC,KAA+B,EACP;EACxB,IAAMC,YAAY,GAAGL,WAAW,CAAe,CAAC,CAAC,CAAC;;EAElD;EACA;EACA;EACAD,SAAS,CAAC,MAAM;IACd,IAAI,CAACK,KAAK,EAAE;MACV;IACF;IAEA,IAAIC,YAAY,CAACC,KAAK,CAACC,MAAM,EAAE;MAC7BF,YAAY,CAACG,MAAM,CAAC,GAAGH,YAAY,CAACC,KAAK,CAACG,GAAG,CAAC;QAAA,IAAC;UAAEC;QAAI,CAAC;QAAA,OAAKA,GAAG;MAAA,EAAC,CAAC;IAClE;IAEAL,YAAY,CAACM,MAAM,CAAC,CAAC,EAAE,GAAGV,uBAAuB,CAAIC,OAAO,CAACE,KAAK,CAAC,CAAC,CAAC;;IAErE;IACA;EACF,CAAC,EAAE,CAACA,KAAK,CAAC,CAAC;EAEX,OAAOC,YAAY;AACrB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useSelectDistinctTable.d.ts","sourceRoot":"","sources":["../src/useSelectDistinctTable.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"useSelectDistinctTable.d.ts","sourceRoot":"","sources":["../src/useSelectDistinctTable.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAG1D;;;;;GAKG;AACH,MAAM,CAAC,OAAO,UAAU,sBAAsB,CAC5C,KAAK,EAAE,KAAK,GAAG,SAAS,GAAG,IAAI,EAC/B,GAAG,WAAW,EAAE,MAAM,EAAE;;;;;EAsBzB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useSelectDistinctTable.js","names":["useCallback","useEffect","usePromiseFactory","useSelectDistinctTable","table","columnNames","selectDistinct","findColumns","data","distinctTable","error","isError","isLoading","close"],"sources":["../src/useSelectDistinctTable.ts"],"sourcesContent":["import { useCallback, useEffect } from 'react';\nimport { Table, TreeTable } from '@deephaven/jsapi-
|
|
1
|
+
{"version":3,"file":"useSelectDistinctTable.js","names":["useCallback","useEffect","usePromiseFactory","useSelectDistinctTable","table","columnNames","selectDistinct","findColumns","data","distinctTable","error","isError","isLoading","close"],"sources":["../src/useSelectDistinctTable.ts"],"sourcesContent":["import { useCallback, useEffect } from 'react';\nimport { Table, TreeTable } from '@deephaven/jsapi-types';\nimport { usePromiseFactory } from '@deephaven/react-hooks';\n\n/**\n * Creates and subscribes to a `selectDistinct` derived table and unsubscribes\n * on unmount.\n * @param table The table to call `selectDistinct` on.\n * @param columnNames The list of column names to pass to `selectDistinct`.\n */\nexport default function useSelectDistinctTable(\n table: Table | TreeTable | null,\n ...columnNames: string[]\n) {\n const selectDistinct = useCallback(\n async () => table?.selectDistinct(table.findColumns(columnNames)) ?? null,\n // Disabling the exhaustive checks due to the spreading of `columnNames`\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [table, ...columnNames]\n );\n\n const { data: distinctTable, error, isError, isLoading } = usePromiseFactory(\n selectDistinct,\n []\n );\n\n useEffect(\n () => () => {\n distinctTable?.close();\n },\n [distinctTable]\n );\n\n return { distinctTable, error, isError, isLoading };\n}\n"],"mappings":";;AAAA,SAASA,WAAW,EAAEC,SAAS,QAAQ,OAAO;AAE9C,SAASC,iBAAiB,QAAQ,wBAAwB;;AAE1D;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,SAASC,sBAAsB,CAC5CC,KAA+B,EAE/B;EAAA,kCADGC,WAAW;IAAXA,WAAW;EAAA;EAEd,IAAMC,cAAc,GAAGN,WAAW,iCAChC;IAAA;IAAA,gCAAYI,KAAK,aAALA,KAAK,uBAALA,KAAK,CAAEE,cAAc,CAACF,KAAK,CAACG,WAAW,CAACF,WAAW,CAAC,CAAC,yEAAI,IAAI;EAAA;EACzE;EACA;EACA,CAACD,KAAK,EAAE,GAAGC,WAAW,CAAC,CACxB;EAED,IAAM;IAAEG,IAAI,EAAEC,aAAa;IAAEC,KAAK;IAAEC,OAAO;IAAEC;EAAU,CAAC,GAAGV,iBAAiB,CAC1EI,cAAc,EACd,EAAE,CACH;EAEDL,SAAS,CACP,MAAM,MAAM;IACVQ,aAAa,aAAbA,aAAa,uBAAbA,aAAa,CAAEI,KAAK,EAAE;EACxB,CAAC,EACD,CAACJ,aAAa,CAAC,CAChB;EAED,OAAO;IAAEA,aAAa;IAAEC,KAAK;IAAEC,OAAO;IAAEC;EAAU,CAAC;AACrD"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Table, TreeTable } from '@deephaven/jsapi-
|
|
1
|
+
import { Table, TreeTable } from '@deephaven/jsapi-types';
|
|
2
2
|
/**
|
|
3
3
|
* Creates a callback function that will set a Table viewport. The callback has
|
|
4
4
|
* a closure over the Table, a desired viewport size, and additional padding.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useSetPaddedViewportCallback.d.ts","sourceRoot":"","sources":["../src/useSetPaddedViewportCallback.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"useSetPaddedViewportCallback.d.ts","sourceRoot":"","sources":["../src/useSetPaddedViewportCallback.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAG1D;;;;;;;;;GASG;AACH,MAAM,CAAC,OAAO,UAAU,4BAA4B,CAClD,KAAK,EAAE,KAAK,GAAG,SAAS,GAAG,IAAI,EAC/B,YAAY,EAAE,MAAM,EACpB,eAAe,EAAE,MAAM,cAGgB,MAAM,UAW9C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useSetPaddedViewportCallback.js","names":["useCallback","getSize","padFirstAndLastRow","useSetPaddedViewportCallback","table","viewportSize","viewportPadding","setPaddedViewport","firstRow","first","last","setViewport"],"sources":["../src/useSetPaddedViewportCallback.ts"],"sourcesContent":["import { useCallback } from 'react';\nimport { Table, TreeTable } from '@deephaven/jsapi-
|
|
1
|
+
{"version":3,"file":"useSetPaddedViewportCallback.js","names":["useCallback","getSize","padFirstAndLastRow","useSetPaddedViewportCallback","table","viewportSize","viewportPadding","setPaddedViewport","firstRow","first","last","setViewport"],"sources":["../src/useSetPaddedViewportCallback.ts"],"sourcesContent":["import { useCallback } from 'react';\nimport { Table, TreeTable } from '@deephaven/jsapi-types';\nimport { getSize, padFirstAndLastRow } from '@deephaven/jsapi-utils';\n\n/**\n * Creates a callback function that will set a Table viewport. The callback has\n * a closure over the Table, a desired viewport size, and additional padding.\n * These will be combined with a first row index passed to the callback to\n * calculate the final viewport.\n * @param table Table to call `setViewport` on.\n * @param viewportSize The desired viewport size.\n * @param viewportPadding Padding to add before and after the viewport.\n * @returns A callback function for setting the viewport.\n */\nexport default function useSetPaddedViewportCallback(\n table: Table | TreeTable | null,\n viewportSize: number,\n viewportPadding: number\n) {\n return useCallback(\n function setPaddedViewport(firstRow: number) {\n const [first, last] = padFirstAndLastRow(\n firstRow,\n viewportSize,\n viewportPadding,\n getSize(table)\n );\n table?.setViewport(first, last);\n },\n [table, viewportPadding, viewportSize]\n );\n}\n"],"mappings":"AAAA,SAASA,WAAW,QAAQ,OAAO;AAEnC,SAASC,OAAO,EAAEC,kBAAkB,QAAQ,wBAAwB;;AAEpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,SAASC,4BAA4B,CAClDC,KAA+B,EAC/BC,YAAoB,EACpBC,eAAuB,EACvB;EACA,OAAON,WAAW,CAChB,SAASO,iBAAiB,CAACC,QAAgB,EAAE;IAC3C,IAAM,CAACC,KAAK,EAAEC,IAAI,CAAC,GAAGR,kBAAkB,CACtCM,QAAQ,EACRH,YAAY,EACZC,eAAe,EACfL,OAAO,CAACG,KAAK,CAAC,CACf;IACDA,KAAK,aAALA,KAAK,uBAALA,KAAK,CAAEO,WAAW,CAACF,KAAK,EAAEC,IAAI,CAAC;EACjC,CAAC,EACD,CAACN,KAAK,EAAEE,eAAe,EAAED,YAAY,CAAC,CACvC;AACH"}
|
package/dist/useTable.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useTable.d.ts","sourceRoot":"","sources":["../src/useTable.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAO,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAQ5D,QAAA,MAAM,QAAQ,UACL,KAAK,GAAG,SAAS,YACd,MAAM,WACP,MAAM,gBACD,MAAM,EAAE;aAEb,MAAM,EAAE,GAAG,SAAS;UACvB,OAAO,EAAE,EAAE;WACV,KAAK,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"useTable.d.ts","sourceRoot":"","sources":["../src/useTable.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAO,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAQ5D,QAAA,MAAM,QAAQ,UACL,KAAK,GAAG,SAAS,YACd,MAAM,WACP,MAAM,gBACD,MAAM,EAAE;aAEb,MAAM,EAAE,GAAG,SAAS;UACvB,OAAO,EAAE,EAAE;WACV,KAAK,GAAG,IAAI;CA2DpB,CAAC;AAEF,eAAe,QAAQ,CAAC"}
|
package/dist/useTable.js
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { useCallback, useEffect, useState } from 'react';
|
|
2
|
-
import
|
|
2
|
+
import { useApi } from '@deephaven/jsapi-bootstrap';
|
|
3
3
|
import Log from '@deephaven/log';
|
|
4
4
|
import useTableListener from "./useTableListener.js";
|
|
5
5
|
import ColumnNameError from "./ColumnNameError.js";
|
|
6
6
|
import TableDisconnectError from "./TableDisconnectError.js";
|
|
7
7
|
var log = Log.module('useTable');
|
|
8
8
|
var useTable = (table, firstRow, lastRow, columnNames) => {
|
|
9
|
+
var dh = useApi();
|
|
9
10
|
var [columns, setColumns] = useState(undefined);
|
|
10
11
|
var [data, setData] = useState([]);
|
|
11
12
|
var [columnError, setColumnError] = useState(null);
|
package/dist/useTable.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useTable.js","names":["useCallback","useEffect","useState","
|
|
1
|
+
{"version":3,"file":"useTable.js","names":["useCallback","useEffect","useState","useApi","Log","useTableListener","ColumnNameError","TableDisconnectError","log","module","useTable","table","firstRow","lastRow","columnNames","dh","columns","setColumns","undefined","data","setData","columnError","setColumnError","tableError","setTableError","findColumns","e","error","debug2","setViewport","handleUpdate","detail","viewportData","map","column","rows","r","get","handleDisconnect","handleReconnect","Table","EVENT_UPDATED","EVENT_DISCONNECT","EVENT_RECONNECT"],"sources":["../src/useTable.ts"],"sourcesContent":["import { useCallback, useEffect, useState } from 'react';\nimport { useApi } from '@deephaven/jsapi-bootstrap';\nimport { Column, Row, Table } from '@deephaven/jsapi-types';\nimport Log from '@deephaven/log';\nimport useTableListener from './useTableListener';\nimport ColumnNameError from './ColumnNameError';\nimport TableDisconnectError from './TableDisconnectError';\n\nconst log = Log.module('useTable');\n\nconst useTable = (\n table: Table | undefined,\n firstRow: number,\n lastRow: number,\n columnNames?: string[]\n): {\n columns: Column[] | undefined;\n data: unknown[][];\n error: Error | null;\n} => {\n const dh = useApi();\n const [columns, setColumns] = useState<Column[] | undefined>(undefined);\n const [data, setData] = useState<unknown[][]>([]);\n const [columnError, setColumnError] = useState<Error | null>(null);\n const [tableError, setTableError] = useState<Error | null>(null);\n\n useEffect(() => {\n if (columnNames === undefined) {\n setColumns(table?.columns);\n setColumnError(null);\n return;\n }\n try {\n setColumns(table?.findColumns(columnNames));\n setColumnError(null);\n } catch (e) {\n log.error(`Column not found`, e, columnNames);\n setColumnError(new ColumnNameError('Invalid columnNames argument'));\n }\n }, [table, columnNames]);\n\n useEffect(() => {\n if (!columns || !table) {\n log.debug2('Table or column not initialized, skip viewport update.');\n return;\n }\n log.debug2('Setting viewport', firstRow, lastRow);\n table.setViewport(firstRow, lastRow, columns);\n }, [columns, table, firstRow, lastRow]);\n\n const handleUpdate = useCallback(\n ({ detail }) => {\n if (!columns) {\n log.error('Columns not initialized.');\n return;\n }\n const viewportData = columns.map(column =>\n (detail.rows as Row[]).map(r => r.get(column))\n );\n setData(viewportData);\n },\n [columns]\n );\n\n const handleDisconnect = useCallback(() => {\n setTableError(new TableDisconnectError('Table disconnected'));\n }, []);\n\n const handleReconnect = useCallback(() => {\n setTableError(null);\n }, []);\n\n useTableListener(table, dh.Table.EVENT_UPDATED, handleUpdate);\n useTableListener(table, dh.Table.EVENT_DISCONNECT, handleDisconnect);\n useTableListener(table, dh.Table.EVENT_RECONNECT, handleReconnect);\n\n return { columns, data, error: tableError ?? columnError };\n};\n\nexport default useTable;\n"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ListData } from '@react-stately/data';
|
|
2
|
-
import { Table, TreeTable } from '@deephaven/jsapi-
|
|
2
|
+
import { Table, TreeTable } from '@deephaven/jsapi-types';
|
|
3
3
|
import { KeyedItem, RowDeserializer } from '@deephaven/jsapi-utils';
|
|
4
4
|
export interface UseViewportDataProps<T> {
|
|
5
5
|
table: Table | TreeTable | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useViewportData.d.ts","sourceRoot":"","sources":["../src/useViewportData.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"useViewportData.d.ts","sourceRoot":"","sources":["../src/useViewportData.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EACL,SAAS,EACT,eAAe,EAKhB,MAAM,wBAAwB,CAAC;AAKhC,MAAM,WAAW,oBAAoB,CAAC,CAAC;IACrC,KAAK,EAAE,KAAK,GAAG,SAAS,GAAG,IAAI,CAAC;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC;CACrC;AAED,MAAM,WAAW,qBAAqB,CAAC,CAAC;IACtC,gEAAgE;IAChE,YAAY,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IACrC,mCAAmC;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,oCAAoC;IACpC,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;CACzC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,CAAC,EAAE,EACzC,KAAK,EACL,YAAiB,EACjB,eAAoB,EACpB,cAAuC,GACxC,EAAE,oBAAoB,CAAC,CAAC,CAAC,GAAG,qBAAqB,CAAC,CAAC,CAAC,CA4BpD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useViewportData.js","names":["useEffect","createOnTableUpdatedHandler","defaultRowDeserializer","getSize","isClosed","useInitializeViewportData","useSetPaddedViewportCallback","useTableListener","useViewportData","table","viewportSize","viewportPadding","deserializeRow","viewportData","setViewport","dh","Table","EVENT_UPDATED","size"],"sources":["../src/useViewportData.ts"],"sourcesContent":["import { useEffect } from 'react';\nimport { ListData } from '@react-stately/data';\nimport { Table, TreeTable } from '@deephaven/jsapi-
|
|
1
|
+
{"version":3,"file":"useViewportData.js","names":["useEffect","createOnTableUpdatedHandler","defaultRowDeserializer","getSize","isClosed","useInitializeViewportData","useSetPaddedViewportCallback","useTableListener","useViewportData","table","viewportSize","viewportPadding","deserializeRow","viewportData","setViewport","dh","Table","EVENT_UPDATED","size"],"sources":["../src/useViewportData.ts"],"sourcesContent":["import { useEffect } from 'react';\nimport { ListData } from '@react-stately/data';\nimport { Table, TreeTable } from '@deephaven/jsapi-types';\nimport {\n KeyedItem,\n RowDeserializer,\n createOnTableUpdatedHandler,\n defaultRowDeserializer,\n getSize,\n isClosed,\n} from '@deephaven/jsapi-utils';\nimport useInitializeViewportData from './useInitializeViewportData';\nimport useSetPaddedViewportCallback from './useSetPaddedViewportCallback';\nimport useTableListener from './useTableListener';\n\nexport interface UseViewportDataProps<T> {\n table: Table | TreeTable | null;\n viewportSize?: number;\n viewportPadding?: number;\n deserializeRow?: RowDeserializer<T>;\n}\n\nexport interface UseViewportDataResult<T> {\n /** Manages deserialized row items associated with a DH Table */\n viewportData: ListData<KeyedItem<T>>;\n /** Size of the underlying Table */\n size: number;\n /** Set the viewport of the Table */\n setViewport: (firstRow: number) => void;\n}\n\n/**\n * Sets up state management for windowed Table viewports. Returns a ListData\n * instance for managing items associated with the Table + a `setViewport`\n * callback for changing the current viewport.\n *\n * IMPORTANT: this will create an empty KeyedItem object for every row in the\n * source table. This is intended for \"human\" sized tables such as those used in\n * admin panels. This is not suitable for \"machine\" scale with millions+ rows.\n * @param table\n * @param viewportSize\n * @param viewportPadding\n * @returns An object for managing Table viewport state.\n */\nexport default function useViewportData<T>({\n table,\n viewportSize = 10,\n viewportPadding = 50,\n deserializeRow = defaultRowDeserializer,\n}: UseViewportDataProps<T>): UseViewportDataResult<T> {\n const viewportData = useInitializeViewportData<T>(table);\n\n const setViewport = useSetPaddedViewportCallback(\n table,\n viewportSize,\n viewportPadding\n );\n\n useTableListener(\n table,\n dh.Table.EVENT_UPDATED,\n createOnTableUpdatedHandler(table, viewportData, deserializeRow)\n );\n\n useEffect(() => {\n if (table && !isClosed(table)) {\n // Hydrate the viewport with real data. This will fetch data from index\n // 0 to the end of the viewport + padding.\n setViewport(0);\n }\n }, [table, setViewport]);\n\n return {\n viewportData,\n size: getSize(table),\n setViewport,\n };\n}\n"],"mappings":"AAAA,SAASA,SAAS,QAAQ,OAAO;AAGjC,SAGEC,2BAA2B,EAC3BC,sBAAsB,EACtBC,OAAO,EACPC,QAAQ,QACH,wBAAwB;AAAC,OACzBC,yBAAyB;AAAA,OACzBC,4BAA4B;AAAA,OAC5BC,gBAAgB;AAkBvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,SAASC,eAAe,OAKe;EAAA,IALX;IACzCC,KAAK;IACLC,YAAY,GAAG,EAAE;IACjBC,eAAe,GAAG,EAAE;IACpBC,cAAc,GAAGV;EACM,CAAC;EACxB,IAAMW,YAAY,GAAGR,yBAAyB,CAAII,KAAK,CAAC;EAExD,IAAMK,WAAW,GAAGR,4BAA4B,CAC9CG,KAAK,EACLC,YAAY,EACZC,eAAe,CAChB;EAEDJ,gBAAgB,CACdE,KAAK,EACLM,EAAE,CAACC,KAAK,CAACC,aAAa,EACtBhB,2BAA2B,CAACQ,KAAK,EAAEI,YAAY,EAAED,cAAc,CAAC,CACjE;EAEDZ,SAAS,CAAC,MAAM;IACd,IAAIS,KAAK,IAAI,CAACL,QAAQ,CAACK,KAAK,CAAC,EAAE;MAC7B;MACA;MACAK,WAAW,CAAC,CAAC,CAAC;IAChB;EACF,CAAC,EAAE,CAACL,KAAK,EAAEK,WAAW,CAAC,CAAC;EAExB,OAAO;IACLD,YAAY;IACZK,IAAI,EAAEf,OAAO,CAACM,KAAK,CAAC;IACpBK;EACF,CAAC;AACH"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@deephaven/jsapi-components",
|
|
3
|
-
"version": "0.37.4-
|
|
3
|
+
"version": "0.37.4-logout.1+055523d8",
|
|
4
4
|
"description": "Deephaven JSAPI Components",
|
|
5
5
|
"author": "Deephaven Data Labs LLC",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -22,20 +22,22 @@
|
|
|
22
22
|
"build:sass": "sass --embed-sources --load-path=../../node_modules ./src:./dist"
|
|
23
23
|
},
|
|
24
24
|
"dependencies": {
|
|
25
|
-
"@deephaven/components": "^0.37.4-
|
|
26
|
-
"@deephaven/jsapi-bootstrap": "^0.37.4-
|
|
27
|
-
"@deephaven/jsapi-
|
|
28
|
-
"@deephaven/jsapi-
|
|
29
|
-
"@deephaven/
|
|
30
|
-
"@deephaven/
|
|
31
|
-
"@deephaven/
|
|
32
|
-
"@deephaven/utils": "^0.37.4-beta.0+33c9673e",
|
|
25
|
+
"@deephaven/components": "^0.37.4-logout.1+055523d8",
|
|
26
|
+
"@deephaven/jsapi-bootstrap": "^0.37.4-logout.1+055523d8",
|
|
27
|
+
"@deephaven/jsapi-types": "^0.37.4-logout.1+055523d8",
|
|
28
|
+
"@deephaven/jsapi-utils": "^0.37.4-logout.1+055523d8",
|
|
29
|
+
"@deephaven/log": "^0.37.4-logout.1+055523d8",
|
|
30
|
+
"@deephaven/react-hooks": "^0.37.4-logout.1+055523d8",
|
|
31
|
+
"@deephaven/utils": "^0.37.4-logout.1+055523d8",
|
|
33
32
|
"@react-stately/data": "^3.9.1",
|
|
33
|
+
"@types/js-cookie": "^3.0.3",
|
|
34
34
|
"classnames": "^2.3.2",
|
|
35
|
+
"js-cookie": "^3.0.5",
|
|
35
36
|
"prop-types": "^15.8.1"
|
|
36
37
|
},
|
|
37
38
|
"devDependencies": {
|
|
38
|
-
"@deephaven/
|
|
39
|
+
"@deephaven/jsapi-shim": "^0.37.4-logout.1+055523d8",
|
|
40
|
+
"@deephaven/tsconfig": "^0.37.4-logout.1+055523d8",
|
|
39
41
|
"@testing-library/react-hooks": "^8.0.1",
|
|
40
42
|
"react-test-renderer": "^17.0.2"
|
|
41
43
|
},
|
|
@@ -51,5 +53,5 @@
|
|
|
51
53
|
"publishConfig": {
|
|
52
54
|
"access": "public"
|
|
53
55
|
},
|
|
54
|
-
"gitHead": "
|
|
56
|
+
"gitHead": "055523d81e65b5f0ef2d2515bcfe091f4a3391de"
|
|
55
57
|
}
|