@deephaven/jsapi-components 0.50.1-beta.5 → 0.51.1-beta.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/dist/ColumnNameError.js.map +1 -1
- package/dist/ConnectionContext.d.ts +5 -0
- package/dist/ConnectionContext.d.ts.map +1 -0
- package/dist/ConnectionContext.js +4 -0
- package/dist/ConnectionContext.js.map +1 -0
- package/dist/HookTestUtils.js.map +1 -1
- package/dist/RefreshTokenBootstrap.js.map +1 -1
- package/dist/RefreshTokenUtils.js.map +1 -1
- package/dist/TableDisconnectError.js.map +1 -1
- package/dist/TableInput.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/useBroadcastChannel.js.map +1 -1
- package/dist/useBroadcastLoginListener.js.map +1 -1
- package/dist/useCheckIfExistsValue.js.map +1 -1
- package/dist/useConnection.d.ts +4 -0
- package/dist/useConnection.d.ts.map +1 -0
- package/dist/useConnection.js +7 -0
- package/dist/useConnection.js.map +1 -0
- package/dist/useDebouncedViewportSearch.js.map +1 -1
- package/dist/useDebouncedViewportSelectionFilter.js.map +1 -1
- package/dist/useFilterConditionFactories.js.map +1 -1
- package/dist/useFilteredItemsWithDefaultValue.js.map +1 -1
- package/dist/useGetItemPosition.js.map +1 -1
- package/dist/useInitializeViewportData.js.map +1 -1
- package/dist/useNotNullOrEmptyFilter.js.map +1 -1
- package/dist/usePickerWithSelectedValues.js.map +1 -1
- package/dist/useSearchableViewportData.js.map +1 -1
- package/dist/useSelectDistinctTable.js.map +1 -1
- package/dist/useSetPaddedViewportCallback.js.map +1 -1
- package/dist/useShowOnlyEmptyFilter.js.map +1 -1
- package/dist/useTable.js.map +1 -1
- package/dist/useTableClose.js.map +1 -1
- package/dist/useTableColumn.js.map +1 -1
- package/dist/useTableListener.js.map +1 -1
- package/dist/useTableSize.js.map +1 -1
- package/dist/useTableUtils.js.map +1 -1
- package/dist/useValueFilter.js.map +1 -1
- package/dist/useViewportData.js.map +1 -1
- package/dist/useViewportFilter.js.map +1 -1
- package/package.json +10 -10
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ColumnNameError.js","names":["ColumnNameError","Error"],"sources":["../src/ColumnNameError.ts"],"sourcesContent":["class ColumnNameError extends Error {\n isColumnNameError = true;\n}\n\nexport default ColumnNameError;\n"],"mappings":";;;AAAA,MAAMA,eAAe,SAASC,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"ColumnNameError.js","names":["ColumnNameError","Error","constructor","arguments","_defineProperty"],"sources":["../src/ColumnNameError.ts"],"sourcesContent":["class ColumnNameError extends Error {\n isColumnNameError = true;\n}\n\nexport default ColumnNameError;\n"],"mappings":";;;AAAA,MAAMA,eAAe,SAASC,KAAK,CAAC;EAAAC,YAAA;IAAA,SAAAC,SAAA;IAAAC,eAAA,4BACd,IAAI;EAAA;AAC1B;AAEA,eAAeJ,eAAe"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConnectionContext.d.ts","sourceRoot":"","sources":["../src/ConnectionContext.ts"],"names":[],"mappings":";AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAE5D,eAAO,MAAM,iBAAiB,+CAA4C,CAAC;AAE3E,eAAe,iBAAiB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConnectionContext.js","names":["createContext","ConnectionContext"],"sources":["../src/ConnectionContext.ts"],"sourcesContent":["import { createContext } from 'react';\nimport type { IdeConnection } from '@deephaven/jsapi-types';\n\nexport const ConnectionContext = createContext<IdeConnection | null>(null);\n\nexport default ConnectionContext;\n"],"mappings":"AAAA,SAASA,aAAa,QAAQ,OAAO;AAGrC,OAAO,IAAMC,iBAAiB,gBAAGD,aAAa,CAAuB,IAAI,CAAC;AAE1E,eAAeC,iBAAiB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HookTestUtils.js","names":["React","ApiContext","makeApiContextWrapper","dh","ApiContextWrapper","children"],"sources":["../src/HookTestUtils.tsx"],"sourcesContent":["import React, { ReactNode } from 'react';\nimport { ApiContext } from '@deephaven/jsapi-bootstrap';\nimport type { dh as DhType } from '@deephaven/jsapi-types';\n\nexport function makeApiContextWrapper(dh: DhType) {\n return function ApiContextWrapper({\n children,\n }: {\n children?: ReactNode;\n }): JSX.Element {\n return <ApiContext.Provider value={dh}>{children}</ApiContext.Provider>;\n };\n}\n\nexport default {\n makeApiContextWrapper,\n};\n"],"mappings":"AAAA,OAAOA,KAAK,MAAqB,OAAO;AACxC,SAASC,UAAU,QAAQ,4BAA4B;AAAC;AAGxD,OAAO,SAASC,
|
|
1
|
+
{"version":3,"file":"HookTestUtils.js","names":["React","ApiContext","jsx","_jsx","makeApiContextWrapper","dh","ApiContextWrapper","_ref","children","Provider","value"],"sources":["../src/HookTestUtils.tsx"],"sourcesContent":["import React, { ReactNode } from 'react';\nimport { ApiContext } from '@deephaven/jsapi-bootstrap';\nimport type { dh as DhType } from '@deephaven/jsapi-types';\n\nexport function makeApiContextWrapper(dh: DhType) {\n return function ApiContextWrapper({\n children,\n }: {\n children?: ReactNode;\n }): JSX.Element {\n return <ApiContext.Provider value={dh}>{children}</ApiContext.Provider>;\n };\n}\n\nexport default {\n makeApiContextWrapper,\n};\n"],"mappings":"AAAA,OAAOA,KAAK,MAAqB,OAAO;AACxC,SAASC,UAAU,QAAQ,4BAA4B;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAGxD,OAAO,SAASC,qBAAqBA,CAACC,EAAU,EAAE;EAChD,OAAO,SAASC,iBAAiBA,CAAAC,IAAA,EAIjB;IAAA,IAJkB;MAChCC;IAGF,CAAC,GAAAD,IAAA;IACC,oBAAOJ,IAAA,CAACF,UAAU,CAACQ,QAAQ;MAACC,KAAK,EAAEL,EAAG;MAAAG,QAAA,EAAEA;IAAQ,CAAsB,CAAC;EACzE,CAAC;AACH;AAEA,eAAe;EACbJ;AACF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RefreshTokenBootstrap.js","names":["React","useCallback","useEffect","useState","useApi","useClient","useBroadcastLoginListener","readRefreshToken","RefreshTokenContext","storeRefreshToken","RefreshTokenBootstrap","children","api","client","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 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): JSX.Element {\n const api = useApi();\n const client = useClient();\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, 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,yBAAyB;AAAA,SAE9BC,gBAAgB,EAChBC,mBAAmB,EACnBC,iBAAiB;AAAA;AAUnB;AACA;AACA;AACA,OAAO,SAASC,
|
|
1
|
+
{"version":3,"file":"RefreshTokenBootstrap.js","names":["React","useCallback","useEffect","useState","useApi","useClient","useBroadcastLoginListener","readRefreshToken","RefreshTokenContext","storeRefreshToken","jsx","_jsx","RefreshTokenBootstrap","_ref","children","api","client","token","setToken","listenForTokenUpdates","cleanup","addEventListener","CoreClient","EVENT_REFRESH_TOKEN_UPDATED","event","detail","newToken","onLogin","onLogout","Provider","value"],"sources":["../src/RefreshTokenBootstrap.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useState } from 'react';\nimport { useApi, useClient } from '@deephaven/jsapi-bootstrap';\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): JSX.Element {\n const api = useApi();\n const client = useClient();\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, 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,yBAAyB;AAAA,SAE9BC,gBAAgB,EAChBC,mBAAmB,EACnBC,iBAAiB;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAUnB;AACA;AACA;AACA,OAAO,SAASC,qBAAqBA,CAAAC,IAAA,EAEO;EAAA,IAFN;IACpCC;EAC0B,CAAC,GAAAD,IAAA;EAC3B,IAAME,GAAG,GAAGX,MAAM,CAAC,CAAC;EACpB,IAAMY,MAAM,GAAGX,SAAS,CAAC,CAAC;EAC1B,IAAM,CAACY,KAAK,EAAEC,QAAQ,CAAC,GAAGf,QAAQ,CAACI,gBAAgB,CAAC,CAAC,CAAC;EAEtDL,SAAS,CACP,SAASiB,qBAAqBA,CAAA,EAAG;IAC/B,IAAMC,OAAO,GAAGJ,MAAM,CAACK,gBAAgB,CACrCN,GAAG,CAACO,UAAU,CAACC,2BAA2B,EACzCC,KAAkB,IAAK;MACtB,IAAM;QAAEC,MAAM,EAAEC;MAAS,CAAC,GAAGF,KAAK;MAClCf,iBAAiB,CAACiB,QAAQ,CAAC;MAC3BR,QAAQ,CAACQ,QAAQ,CAAC;IACpB,CACF,CAAC;IACD,OAAON,OAAO;EAChB,CAAC,EACD,CAACL,GAAG,EAAEC,MAAM,EAAEC,KAAK,CACrB,CAAC;EAED,IAAMU,OAAO,GAAG1B,WAAW,CAAC,MAAM;IAChCiB,QAAQ,CAACX,gBAAgB,CAAC,CAAC,CAAC;EAC9B,CAAC,EAAE,EAAE,CAAC;EAEN,IAAMqB,QAAQ,GAAG3B,WAAW,CAAC,MAAM;IACjCQ,iBAAiB,CAAC,IAAI,CAAC;IACvBS,QAAQ,CAAC,IAAI,CAAC;EAChB,CAAC,EAAE,EAAE,CAAC;EAENZ,yBAAyB,CAACqB,OAAO,EAAEC,QAAQ,CAAC;EAE5C,oBACEjB,IAAA,CAACH,mBAAmB,CAACqB,QAAQ;IAACC,KAAK,EAAEb,KAAM;IAAAH,QAAA,EACxCA;EAAQ,CACmB,CAAC;AAEnC;AAEA,eAAeF,qBAAqB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RefreshTokenUtils.js","names":["createContext","Cookies","Log","REFRESH_TOKEN_KEY","RefreshTokenContext","log","module","readRefreshToken","cookieToken","get","JSON","parse","e","error","storeRefreshToken","token","remove","stringify","bytes","expiry","expires","Date","set","secure","sameSite"],"sources":["../src/RefreshTokenUtils.ts"],"sourcesContent":["import { createContext } from 'react';\nimport Cookies from 'js-cookie';\nimport Log from '@deephaven/log';\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\nconst log = Log.module('RefreshTokenUtils');\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 try {\n if (cookieToken != null) {\n return JSON.parse(cookieToken);\n }\n } catch (e) {\n log.error('Error parsing refresh token', cookieToken, e);\n }\n return 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): void {\n if (token == null) {\n Cookies.remove(REFRESH_TOKEN_KEY);\n return;\n }\n\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}\n"],"mappings":"AAAA,SAASA,aAAa,QAAQ,OAAO;AACrC,OAAOC,OAAO,MAAM,WAAW;AAC/B,OAAOC,GAAG,MAAM,gBAAgB;AAEhC,OAAO,IAAMC,iBAAiB,GAAG,2CAA2C;AAI5E,OAAO,IAAMC,mBAAmB,gBAAGJ,aAAa,CAAsB,IAAI,CAAC;AAE3E,IAAMK,GAAG,GAAGH,GAAG,CAACI,MAAM,CAAC,mBAAmB,CAAC;;AAE3C;AACA;AACA;AACA;AACA,OAAO,SAASC,
|
|
1
|
+
{"version":3,"file":"RefreshTokenUtils.js","names":["createContext","Cookies","Log","REFRESH_TOKEN_KEY","RefreshTokenContext","log","module","readRefreshToken","cookieToken","get","JSON","parse","e","error","storeRefreshToken","token","remove","stringify","bytes","expiry","expires","Date","set","secure","sameSite"],"sources":["../src/RefreshTokenUtils.ts"],"sourcesContent":["import { createContext } from 'react';\nimport Cookies from 'js-cookie';\nimport Log from '@deephaven/log';\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\nconst log = Log.module('RefreshTokenUtils');\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 try {\n if (cookieToken != null) {\n return JSON.parse(cookieToken);\n }\n } catch (e) {\n log.error('Error parsing refresh token', cookieToken, e);\n }\n return 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): void {\n if (token == null) {\n Cookies.remove(REFRESH_TOKEN_KEY);\n return;\n }\n\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}\n"],"mappings":"AAAA,SAASA,aAAa,QAAQ,OAAO;AACrC,OAAOC,OAAO,MAAM,WAAW;AAC/B,OAAOC,GAAG,MAAM,gBAAgB;AAEhC,OAAO,IAAMC,iBAAiB,GAAG,2CAA2C;AAI5E,OAAO,IAAMC,mBAAmB,gBAAGJ,aAAa,CAAsB,IAAI,CAAC;AAE3E,IAAMK,GAAG,GAAGH,GAAG,CAACI,MAAM,CAAC,mBAAmB,CAAC;;AAE3C;AACA;AACA;AACA;AACA,OAAO,SAASC,gBAAgBA,CAAA,EAAwB;EACtD,IAAMC,WAAW,GAAGP,OAAO,CAACQ,GAAG,CAACN,iBAAiB,CAAC;EAClD,IAAI;IACF,IAAIK,WAAW,IAAI,IAAI,EAAE;MACvB,OAAOE,IAAI,CAACC,KAAK,CAACH,WAAW,CAAC;IAChC;EACF,CAAC,CAAC,OAAOI,CAAC,EAAE;IACVP,GAAG,CAACQ,KAAK,CAAC,6BAA6B,EAAEL,WAAW,EAAEI,CAAC,CAAC;EAC1D;EACA,OAAO,IAAI;AACb;;AAEA;AACA;AACA;AACA;AACA,OAAO,SAASE,iBAAiBA,CAACC,KAA0B,EAAQ;EAClE,IAAIA,KAAK,IAAI,IAAI,EAAE;IACjBd,OAAO,CAACe,MAAM,CAACb,iBAAiB,CAAC;IACjC;EACF;EAEA,IAAMK,WAAW,GAAGE,IAAI,CAACO,SAAS,CAAC;IACjCC,KAAK,EAAEH,KAAK,CAACG,KAAK;IAClBC,MAAM,EAAEJ,KAAK,CAACI;EAChB,CAAC,CAAC;EACF,IAAMC,OAAO,GAAG,IAAIC,IAAI,CAACN,KAAK,CAACI,MAAM,CAAC;EAEtClB,OAAO,CAACqB,GAAG,CAACnB,iBAAiB,EAAEK,WAAW,EAAE;IAC1Ce,MAAM,EAAE,IAAI;IACZC,QAAQ,EAAE,QAAQ;IAClBJ;EACF,CAAC,CAAC;AACJ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TableDisconnectError.js","names":["TableDisconnectError","Error"],"sources":["../src/TableDisconnectError.ts"],"sourcesContent":["class TableDisconnectError extends Error {\n isTableDisconnectError = true;\n}\n\nexport default TableDisconnectError;\n"],"mappings":";;;AAAA,MAAMA,oBAAoB,SAASC,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"TableDisconnectError.js","names":["TableDisconnectError","Error","constructor","arguments","_defineProperty"],"sources":["../src/TableDisconnectError.ts"],"sourcesContent":["class TableDisconnectError extends Error {\n isTableDisconnectError = true;\n}\n\nexport default TableDisconnectError;\n"],"mappings":";;;AAAA,MAAMA,oBAAoB,SAASC,KAAK,CAAC;EAAAC,YAAA;IAAA,SAAAC,SAAA;IAAAC,eAAA,iCACd,IAAI;EAAA;AAC/B;AAEA,eAAeJ,oBAAoB"}
|
package/dist/TableInput.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TableInput.js","names":["React","useCallback","useState","useRef","useEffect","useMemo","classNames","LoadingOverlay","SearchInput","SelectValueList","PromiseUtils","Log","Formatter","FormatterUtils","useApi","useTableColumn","log","module","SIZE_LIMIT","TableInput","props","className","undefined","columnName","settings","defaultValue","isInvalid","onChange","onBlur","table","tablePromise","parentRef","dh","formatter","columnFormats","getColumnFormats","dateTimeFormatterOptions","getDateTimeFormatterOptions","defaultDecimalFormatOptions","defaultIntegerFormatOptions","searchValue","setSearchValue","selection","setSelection","Set","setTable","listRef","itemCount","Math","min","size","column","data","error","formatValue","value","getFormattedString","type","name","items","updatedSelection","removedItems","result","forEach","v","isSelected","has","delete","push","displayValue","debug2","newSelection","Array","from","initTable","promise","resolved","debug","e","isCanceled","cancelablePromise","makeCancelable","cancel","handleSearchChange","target","index","findIndex","item","includes","current","scrollIntoView","handleSelect","length","selectedValue","add","handleSelectAll","values","map","handleClearSelection","handleViewportChange","handleChildBlur","relatedTarget","HTMLElement","contains","isEmpty","message","displayName","defaultProps"],"sources":["../src/TableInput.tsx"],"sourcesContent":["import React, {\n useCallback,\n useState,\n useRef,\n useEffect,\n useMemo,\n} from 'react';\nimport classNames from 'classnames';\nimport {\n LoadingOverlay,\n SearchInput,\n SelectValueList,\n} from '@deephaven/components';\nimport type { LongWrapper, Table } from '@deephaven/jsapi-types';\nimport { PromiseUtils } from '@deephaven/utils';\nimport Log from '@deephaven/log';\nimport { Formatter, FormatterUtils, Settings } from '@deephaven/jsapi-utils';\nimport { useApi } from '@deephaven/jsapi-bootstrap';\nimport useTableColumn from './useTableColumn';\n\nimport './TableInput.scss';\n\nconst log = Log.module('TableInput');\n\ntype Value = LongWrapper | string;\n\ninterface SelectValueItem {\n displayValue: string;\n value: Value;\n isSelected: boolean;\n}\n\ninterface TableInputProps {\n className?: string;\n columnName: string;\n settings: Settings;\n defaultValue: Value[];\n isInvalid?: boolean;\n table: Promise<Table>;\n onChange(items: Value[]): void;\n onBlur?: () => void;\n}\n\nconst SIZE_LIMIT = 250;\n\nfunction TableInput(props: TableInputProps): JSX.Element {\n const {\n className = undefined,\n columnName,\n settings,\n defaultValue = [],\n isInvalid = false,\n onChange = () => false,\n onBlur = () => false,\n table: tablePromise,\n } = props;\n const parentRef = useRef<HTMLDivElement>(null);\n const dh = useApi();\n const formatter = useMemo(() => {\n const columnFormats = FormatterUtils.getColumnFormats(settings);\n const dateTimeFormatterOptions =\n FormatterUtils.getDateTimeFormatterOptions(settings);\n const {\n defaultDecimalFormatOptions = {},\n defaultIntegerFormatOptions = {},\n } = settings;\n return new Formatter(\n dh,\n columnFormats,\n dateTimeFormatterOptions,\n defaultDecimalFormatOptions,\n defaultIntegerFormatOptions\n );\n }, [dh, settings]);\n const [searchValue, setSearchValue] = useState('');\n const [selection, setSelection] = useState(new Set(defaultValue));\n const [table, setTable] = useState<Table | undefined>();\n const listRef = useRef<SelectValueList<Value>>(null);\n\n const itemCount = Math.min(table?.size ?? 0, SIZE_LIMIT);\n\n const { column, data, error } = useTableColumn(\n table,\n 0,\n SIZE_LIMIT - 1,\n columnName\n );\n\n const formatValue = useCallback(\n value =>\n column\n ? formatter.getFormattedString(value, column.type, column.name)\n : `${value}`,\n [column, formatter]\n );\n\n const [items, updatedSelection] = useMemo(() => {\n const removedItems = new Set(selection);\n const result: SelectValueItem[] = [];\n if (data == null) {\n // Viewport not initialized\n return [result, null];\n }\n (data as Value[]).forEach(v => {\n const value = `${v}`;\n const isSelected = selection.has(value);\n if (isSelected) {\n removedItems.delete(value);\n }\n result.push({\n value,\n displayValue: formatValue(v),\n isSelected,\n });\n });\n\n if (removedItems.size > 0) {\n log.debug2('Selection has items that are missing from the viewport');\n const newSelection = new Set(selection);\n Array.from(removedItems).forEach(value => {\n newSelection.delete(value);\n });\n return [result, newSelection];\n }\n return [result, null];\n }, [data, selection, formatValue]);\n\n useEffect(() => {\n if (updatedSelection !== null) {\n setSelection(updatedSelection);\n onChange(Array.from(updatedSelection));\n }\n }, [onChange, updatedSelection]);\n\n const initTable = useCallback(async promise => {\n try {\n const resolved = await promise;\n log.debug('Table resolved', resolved);\n setTable(resolved);\n } catch (e) {\n if (PromiseUtils.isCanceled(e)) {\n return;\n }\n log.error(e);\n }\n }, []);\n\n useEffect(() => {\n const cancelablePromise = PromiseUtils.makeCancelable(tablePromise);\n initTable(cancelablePromise);\n return () => {\n log.debug2('Cancel table promise');\n cancelablePromise.cancel();\n };\n }, [tablePromise, initTable]);\n\n // Scroll the item matching the input into view\n const handleSearchChange = useCallback(\n e => {\n const { value } = e.target;\n setSearchValue(value);\n const index = items.findIndex(item => item.displayValue.includes(value));\n if (index > -1) {\n log.debug2(`Found ${value} at index ${index}`);\n listRef.current?.scrollIntoView(index);\n } else {\n log.debug2(`${value} not found`);\n }\n },\n [items, listRef]\n );\n\n const handleSelect = useCallback(\n index => {\n log.debug('handleSelect', index);\n if (index >= items.length) {\n log.error('Invalid index', index);\n return;\n }\n const selectedValue = items[index].value;\n const newSelection = new Set(selection);\n if (items[index].isSelected) {\n newSelection.delete(selectedValue);\n } else {\n newSelection.add(selectedValue);\n }\n setSelection(newSelection);\n onChange(Array.from(newSelection));\n },\n [onChange, items, selection]\n );\n\n const handleSelectAll = useCallback(() => {\n const values = items.map(item => item.value);\n const newSelection = new Set(values);\n setSelection(newSelection);\n onChange(values);\n }, [items, onChange]);\n\n const handleClearSelection = useCallback(() => {\n setSelection(new Set());\n onChange([]);\n }, [onChange]);\n\n const handleViewportChange = useCallback(() => {\n // no-op\n }, []);\n\n const handleChildBlur = useCallback(\n (e: React.FocusEvent<Element>) => {\n const { relatedTarget } = e;\n log.debug(\n 'handleChildBlur',\n relatedTarget,\n relatedTarget instanceof HTMLElement,\n parentRef.current,\n parentRef.current?.contains(relatedTarget)\n );\n if (\n !relatedTarget ||\n (parentRef.current &&\n relatedTarget instanceof HTMLElement &&\n !parentRef.current.contains(relatedTarget))\n ) {\n onBlur();\n }\n },\n [onBlur]\n );\n\n const isEmpty = items.length === 0;\n\n return (\n <div\n ref={parentRef}\n className={classNames(\n 'table-input-container d-flex flex-column position-relative',\n className\n )}\n >\n <SearchInput\n disabled={!!error || isEmpty}\n value={searchValue}\n placeholder=\"Search\"\n onChange={handleSearchChange}\n className=\"mb-2 d-flex\"\n onBlur={handleChildBlur}\n />\n <SelectValueList\n className=\"table-input-list\"\n disabled={table === undefined || isEmpty}\n isInvalid={isInvalid}\n items={isEmpty ? [{ value: 'Empty', isSelected: false }] : items}\n itemCount={itemCount}\n offset={0}\n onSelect={handleSelect}\n onViewportChange={handleViewportChange}\n ref={listRef}\n onBlur={handleChildBlur}\n />\n\n {table && (\n <div className=\"meta-row\">\n <div className=\"d-flex align-items-center text-muted small\">\n {table != null && table.size > itemCount && (\n <>Table is too large, showing the first {SIZE_LIMIT} items.</>\n )}\n </div>\n <div>\n <button\n type=\"button\"\n className=\"btn btn-link\"\n onBlur={handleChildBlur}\n onClick={handleSelectAll}\n >\n Select All\n </button>\n <button\n type=\"button\"\n className=\"btn btn-link mr-a\"\n onBlur={handleChildBlur}\n onClick={handleClearSelection}\n >\n Clear\n </button>\n </div>\n </div>\n )}\n\n {table == null ||\n (error && (\n <div className=\"h-100 w-100 position-absolute\">\n <LoadingOverlay\n isLoaded={table != null}\n isLoading={table == null && error == null}\n errorMessage={error?.message ?? null}\n />\n </div>\n ))}\n </div>\n );\n}\n\nTableInput.displayName = 'TableInput';\n\nTableInput.defaultProps = {\n isInvalid: false,\n className: undefined,\n};\n\nexport default TableInput;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"TableInput.js","names":["React","useCallback","useState","useRef","useEffect","useMemo","classNames","LoadingOverlay","SearchInput","SelectValueList","PromiseUtils","Log","Formatter","FormatterUtils","useApi","useTableColumn","jsx","_jsx","Fragment","_Fragment","jsxs","_jsxs","log","module","SIZE_LIMIT","TableInput","props","_table$size","_error$message","className","undefined","columnName","settings","defaultValue","isInvalid","onChange","onBlur","table","tablePromise","parentRef","dh","formatter","columnFormats","getColumnFormats","dateTimeFormatterOptions","getDateTimeFormatterOptions","defaultDecimalFormatOptions","defaultIntegerFormatOptions","searchValue","setSearchValue","selection","setSelection","Set","setTable","listRef","itemCount","Math","min","size","column","data","error","formatValue","value","getFormattedString","type","name","concat","items","updatedSelection","removedItems","result","forEach","v","isSelected","has","delete","push","displayValue","debug2","newSelection","Array","from","initTable","_ref","_asyncToGenerator","promise","resolved","debug","e","isCanceled","_x","apply","arguments","cancelablePromise","makeCancelable","cancel","handleSearchChange","target","index","findIndex","item","includes","_listRef$current","current","scrollIntoView","handleSelect","length","selectedValue","add","handleSelectAll","values","map","handleClearSelection","handleViewportChange","handleChildBlur","_parentRef$current","relatedTarget","HTMLElement","contains","isEmpty","ref","children","disabled","placeholder","offset","onSelect","onViewportChange","onClick","isLoaded","isLoading","errorMessage","message","displayName","defaultProps"],"sources":["../src/TableInput.tsx"],"sourcesContent":["import React, {\n useCallback,\n useState,\n useRef,\n useEffect,\n useMemo,\n} from 'react';\nimport classNames from 'classnames';\nimport {\n LoadingOverlay,\n SearchInput,\n SelectValueList,\n} from '@deephaven/components';\nimport type { LongWrapper, Table } from '@deephaven/jsapi-types';\nimport { PromiseUtils } from '@deephaven/utils';\nimport Log from '@deephaven/log';\nimport { Formatter, FormatterUtils, Settings } from '@deephaven/jsapi-utils';\nimport { useApi } from '@deephaven/jsapi-bootstrap';\nimport useTableColumn from './useTableColumn';\n\nimport './TableInput.scss';\n\nconst log = Log.module('TableInput');\n\ntype Value = LongWrapper | string;\n\ninterface SelectValueItem {\n displayValue: string;\n value: Value;\n isSelected: boolean;\n}\n\ninterface TableInputProps {\n className?: string;\n columnName: string;\n settings: Settings;\n defaultValue: Value[];\n isInvalid?: boolean;\n table: Promise<Table>;\n onChange(items: Value[]): void;\n onBlur?: () => void;\n}\n\nconst SIZE_LIMIT = 250;\n\nfunction TableInput(props: TableInputProps): JSX.Element {\n const {\n className = undefined,\n columnName,\n settings,\n defaultValue = [],\n isInvalid = false,\n onChange = () => false,\n onBlur = () => false,\n table: tablePromise,\n } = props;\n const parentRef = useRef<HTMLDivElement>(null);\n const dh = useApi();\n const formatter = useMemo(() => {\n const columnFormats = FormatterUtils.getColumnFormats(settings);\n const dateTimeFormatterOptions =\n FormatterUtils.getDateTimeFormatterOptions(settings);\n const {\n defaultDecimalFormatOptions = {},\n defaultIntegerFormatOptions = {},\n } = settings;\n return new Formatter(\n dh,\n columnFormats,\n dateTimeFormatterOptions,\n defaultDecimalFormatOptions,\n defaultIntegerFormatOptions\n );\n }, [dh, settings]);\n const [searchValue, setSearchValue] = useState('');\n const [selection, setSelection] = useState(new Set(defaultValue));\n const [table, setTable] = useState<Table | undefined>();\n const listRef = useRef<SelectValueList<Value>>(null);\n\n const itemCount = Math.min(table?.size ?? 0, SIZE_LIMIT);\n\n const { column, data, error } = useTableColumn(\n table,\n 0,\n SIZE_LIMIT - 1,\n columnName\n );\n\n const formatValue = useCallback(\n value =>\n column\n ? formatter.getFormattedString(value, column.type, column.name)\n : `${value}`,\n [column, formatter]\n );\n\n const [items, updatedSelection] = useMemo(() => {\n const removedItems = new Set(selection);\n const result: SelectValueItem[] = [];\n if (data == null) {\n // Viewport not initialized\n return [result, null];\n }\n (data as Value[]).forEach(v => {\n const value = `${v}`;\n const isSelected = selection.has(value);\n if (isSelected) {\n removedItems.delete(value);\n }\n result.push({\n value,\n displayValue: formatValue(v),\n isSelected,\n });\n });\n\n if (removedItems.size > 0) {\n log.debug2('Selection has items that are missing from the viewport');\n const newSelection = new Set(selection);\n Array.from(removedItems).forEach(value => {\n newSelection.delete(value);\n });\n return [result, newSelection];\n }\n return [result, null];\n }, [data, selection, formatValue]);\n\n useEffect(() => {\n if (updatedSelection !== null) {\n setSelection(updatedSelection);\n onChange(Array.from(updatedSelection));\n }\n }, [onChange, updatedSelection]);\n\n const initTable = useCallback(async promise => {\n try {\n const resolved = await promise;\n log.debug('Table resolved', resolved);\n setTable(resolved);\n } catch (e) {\n if (PromiseUtils.isCanceled(e)) {\n return;\n }\n log.error(e);\n }\n }, []);\n\n useEffect(() => {\n const cancelablePromise = PromiseUtils.makeCancelable(tablePromise);\n initTable(cancelablePromise);\n return () => {\n log.debug2('Cancel table promise');\n cancelablePromise.cancel();\n };\n }, [tablePromise, initTable]);\n\n // Scroll the item matching the input into view\n const handleSearchChange = useCallback(\n e => {\n const { value } = e.target;\n setSearchValue(value);\n const index = items.findIndex(item => item.displayValue.includes(value));\n if (index > -1) {\n log.debug2(`Found ${value} at index ${index}`);\n listRef.current?.scrollIntoView(index);\n } else {\n log.debug2(`${value} not found`);\n }\n },\n [items, listRef]\n );\n\n const handleSelect = useCallback(\n index => {\n log.debug('handleSelect', index);\n if (index >= items.length) {\n log.error('Invalid index', index);\n return;\n }\n const selectedValue = items[index].value;\n const newSelection = new Set(selection);\n if (items[index].isSelected) {\n newSelection.delete(selectedValue);\n } else {\n newSelection.add(selectedValue);\n }\n setSelection(newSelection);\n onChange(Array.from(newSelection));\n },\n [onChange, items, selection]\n );\n\n const handleSelectAll = useCallback(() => {\n const values = items.map(item => item.value);\n const newSelection = new Set(values);\n setSelection(newSelection);\n onChange(values);\n }, [items, onChange]);\n\n const handleClearSelection = useCallback(() => {\n setSelection(new Set());\n onChange([]);\n }, [onChange]);\n\n const handleViewportChange = useCallback(() => {\n // no-op\n }, []);\n\n const handleChildBlur = useCallback(\n (e: React.FocusEvent<Element>) => {\n const { relatedTarget } = e;\n log.debug(\n 'handleChildBlur',\n relatedTarget,\n relatedTarget instanceof HTMLElement,\n parentRef.current,\n parentRef.current?.contains(relatedTarget)\n );\n if (\n !relatedTarget ||\n (parentRef.current &&\n relatedTarget instanceof HTMLElement &&\n !parentRef.current.contains(relatedTarget))\n ) {\n onBlur();\n }\n },\n [onBlur]\n );\n\n const isEmpty = items.length === 0;\n\n return (\n <div\n ref={parentRef}\n className={classNames(\n 'table-input-container d-flex flex-column position-relative',\n className\n )}\n >\n <SearchInput\n disabled={!!error || isEmpty}\n value={searchValue}\n placeholder=\"Search\"\n onChange={handleSearchChange}\n className=\"mb-2 d-flex\"\n onBlur={handleChildBlur}\n />\n <SelectValueList\n className=\"table-input-list\"\n disabled={table === undefined || isEmpty}\n isInvalid={isInvalid}\n items={isEmpty ? [{ value: 'Empty', isSelected: false }] : items}\n itemCount={itemCount}\n offset={0}\n onSelect={handleSelect}\n onViewportChange={handleViewportChange}\n ref={listRef}\n onBlur={handleChildBlur}\n />\n\n {table && (\n <div className=\"meta-row\">\n <div className=\"d-flex align-items-center text-muted small\">\n {table != null && table.size > itemCount && (\n <>Table is too large, showing the first {SIZE_LIMIT} items.</>\n )}\n </div>\n <div>\n <button\n type=\"button\"\n className=\"btn btn-link\"\n onBlur={handleChildBlur}\n onClick={handleSelectAll}\n >\n Select All\n </button>\n <button\n type=\"button\"\n className=\"btn btn-link mr-a\"\n onBlur={handleChildBlur}\n onClick={handleClearSelection}\n >\n Clear\n </button>\n </div>\n </div>\n )}\n\n {table == null ||\n (error && (\n <div className=\"h-100 w-100 position-absolute\">\n <LoadingOverlay\n isLoaded={table != null}\n isLoading={table == null && error == null}\n errorMessage={error?.message ?? null}\n />\n </div>\n ))}\n </div>\n );\n}\n\nTableInput.displayName = 'TableInput';\n\nTableInput.defaultProps = {\n isInvalid: false,\n className: undefined,\n};\n\nexport default TableInput;\n"],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
export * from './ConnectionContext';
|
|
1
2
|
export * from './HookTestUtils';
|
|
2
3
|
export { default as TableInput } from './TableInput';
|
|
3
4
|
export * from './RefreshTokenBootstrap';
|
|
@@ -5,6 +6,7 @@ export * from './RefreshTokenUtils';
|
|
|
5
6
|
export { default as useBroadcastChannel } from './useBroadcastChannel';
|
|
6
7
|
export { default as useBroadcastLoginListener } from './useBroadcastLoginListener';
|
|
7
8
|
export * from './useCheckIfExistsValue';
|
|
9
|
+
export * from './useConnection';
|
|
8
10
|
export { default as useDebouncedViewportSearch } from './useDebouncedViewportSearch';
|
|
9
11
|
export * from './useDebouncedViewportSelectionFilter';
|
|
10
12
|
export * from './useFilterConditionFactories';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,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,cAAc,yBAAyB,CAAC;AACxC,OAAO,EAAE,OAAO,IAAI,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AACrF,cAAc,uCAAuC,CAAC;AACtD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,oCAAoC,CAAC;AACnD,cAAc,sBAAsB,CAAC;AACrC,OAAO,EAAE,OAAO,IAAI,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AACnF,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,+BAA+B,CAAC;AAC9C,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAC7E,OAAO,EAAE,OAAO,IAAI,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AACzF,cAAc,0BAA0B,CAAC;AACzC,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,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC3D,cAAc,kBAAkB,CAAC;AACjC,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAC/D,YAAY,EAAE,4BAA4B,EAAE,MAAM,0BAA0B,CAAC;AAC7E,YAAY,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC/D,cAAc,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,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,cAAc,yBAAyB,CAAC;AACxC,cAAc,iBAAiB,CAAC;AAChC,OAAO,EAAE,OAAO,IAAI,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AACrF,cAAc,uCAAuC,CAAC;AACtD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,oCAAoC,CAAC;AACnD,cAAc,sBAAsB,CAAC;AACrC,OAAO,EAAE,OAAO,IAAI,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AACnF,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,+BAA+B,CAAC;AAC9C,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAC7E,OAAO,EAAE,OAAO,IAAI,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AACzF,cAAc,0BAA0B,CAAC;AACzC,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,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC3D,cAAc,kBAAkB,CAAC;AACjC,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAC/D,YAAY,EAAE,4BAA4B,EAAE,MAAM,0BAA0B,CAAC;AAC7E,YAAY,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC/D,cAAc,qBAAqB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
export * from "./ConnectionContext.js";
|
|
1
2
|
export * from "./HookTestUtils.js";
|
|
2
3
|
export { default as TableInput } from "./TableInput.js";
|
|
3
4
|
export * from "./RefreshTokenBootstrap.js";
|
|
@@ -5,6 +6,7 @@ export * from "./RefreshTokenUtils.js";
|
|
|
5
6
|
export { default as useBroadcastChannel } from "./useBroadcastChannel.js";
|
|
6
7
|
export { default as useBroadcastLoginListener } from "./useBroadcastLoginListener.js";
|
|
7
8
|
export * from "./useCheckIfExistsValue.js";
|
|
9
|
+
export * from "./useConnection.js";
|
|
8
10
|
export { default as useDebouncedViewportSearch } from "./useDebouncedViewportSearch.js";
|
|
9
11
|
export * from "./useDebouncedViewportSelectionFilter.js";
|
|
10
12
|
export * from "./useFilterConditionFactories.js";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["default","TableInput","useBroadcastChannel","useBroadcastLoginListener","useDebouncedViewportSearch","useInitializeViewportData","useSelectDistinctTable","useSetPaddedViewportCallback","useTable","useTableColumn","useTableListener","useTableClose","useTableSize","useTableUtils","useViewportData"],"sources":["../src/index.ts"],"sourcesContent":["export * from './HookTestUtils';\nexport { default as TableInput } from './TableInput';\nexport * from './RefreshTokenBootstrap';\nexport * from './RefreshTokenUtils';\nexport { default as useBroadcastChannel } from './useBroadcastChannel';\nexport { default as useBroadcastLoginListener } from './useBroadcastLoginListener';\nexport * from './useCheckIfExistsValue';\nexport { default as useDebouncedViewportSearch } from './useDebouncedViewportSearch';\nexport * from './useDebouncedViewportSelectionFilter';\nexport * from './useFilterConditionFactories';\nexport * from './useFilteredItemsWithDefaultValue';\nexport * from './useGetItemPosition';\nexport { default as useInitializeViewportData } from './useInitializeViewportData';\nexport * from './useSearchableViewportData';\nexport * from './useNotNullOrEmptyFilter';\nexport * from './usePickerWithSelectedValues';\nexport { default as useSelectDistinctTable } from './useSelectDistinctTable';\nexport { default as useSetPaddedViewportCallback } from './useSetPaddedViewportCallback';\nexport * from './useShowOnlyEmptyFilter';\nexport { default as useTable } from './useTable';\nexport { default as useTableColumn } from './useTableColumn';\nexport { default as useTableListener } from './useTableListener';\nexport { default as useTableClose } from './useTableClose';\nexport { default as useTableSize } from './useTableSize';\nexport { default as useTableUtils } from './useTableUtils';\nexport * from './useValueFilter';\nexport { default as useViewportData } from './useViewportData';\nexport type { UseSelectDistinctTableResult } from './useSelectDistinctTable';\nexport type { UseViewportDataResult } from './useViewportData';\nexport * from './useViewportFilter';\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","names":["default","TableInput","useBroadcastChannel","useBroadcastLoginListener","useDebouncedViewportSearch","useInitializeViewportData","useSelectDistinctTable","useSetPaddedViewportCallback","useTable","useTableColumn","useTableListener","useTableClose","useTableSize","useTableUtils","useViewportData"],"sources":["../src/index.ts"],"sourcesContent":["export * from './ConnectionContext';\nexport * from './HookTestUtils';\nexport { default as TableInput } from './TableInput';\nexport * from './RefreshTokenBootstrap';\nexport * from './RefreshTokenUtils';\nexport { default as useBroadcastChannel } from './useBroadcastChannel';\nexport { default as useBroadcastLoginListener } from './useBroadcastLoginListener';\nexport * from './useCheckIfExistsValue';\nexport * from './useConnection';\nexport { default as useDebouncedViewportSearch } from './useDebouncedViewportSearch';\nexport * from './useDebouncedViewportSelectionFilter';\nexport * from './useFilterConditionFactories';\nexport * from './useFilteredItemsWithDefaultValue';\nexport * from './useGetItemPosition';\nexport { default as useInitializeViewportData } from './useInitializeViewportData';\nexport * from './useSearchableViewportData';\nexport * from './useNotNullOrEmptyFilter';\nexport * from './usePickerWithSelectedValues';\nexport { default as useSelectDistinctTable } from './useSelectDistinctTable';\nexport { default as useSetPaddedViewportCallback } from './useSetPaddedViewportCallback';\nexport * from './useShowOnlyEmptyFilter';\nexport { default as useTable } from './useTable';\nexport { default as useTableColumn } from './useTableColumn';\nexport { default as useTableListener } from './useTableListener';\nexport { default as useTableClose } from './useTableClose';\nexport { default as useTableSize } from './useTableSize';\nexport { default as useTableUtils } from './useTableUtils';\nexport * from './useValueFilter';\nexport { default as useViewportData } from './useViewportData';\nexport type { UseSelectDistinctTableResult } from './useSelectDistinctTable';\nexport type { UseViewportDataResult } from './useViewportData';\nexport * from './useViewportFilter';\n"],"mappings":";;SAESA,OAAO,IAAIC,UAAU;AAAA;AAAA;AAAA,SAGrBD,OAAO,IAAIE,mBAAmB;AAAA,SAC9BF,OAAO,IAAIG,yBAAyB;AAAA;AAAA;AAAA,SAGpCH,OAAO,IAAII,0BAA0B;AAAA;AAAA;AAAA;AAAA;AAAA,SAKrCJ,OAAO,IAAIK,yBAAyB;AAAA;AAAA;AAAA;AAAA,SAIpCL,OAAO,IAAIM,sBAAsB;AAAA,SACjCN,OAAO,IAAIO,4BAA4B;AAAA;AAAA,SAEvCP,OAAO,IAAIQ,QAAQ;AAAA,SACnBR,OAAO,IAAIS,cAAc;AAAA,SACzBT,OAAO,IAAIU,gBAAgB;AAAA,SAC3BV,OAAO,IAAIW,aAAa;AAAA,SACxBX,OAAO,IAAIY,YAAY;AAAA,SACvBZ,OAAO,IAAIa,aAAa;AAAA;AAAA,SAExBb,OAAO,IAAIc,eAAe;AAAA"}
|
|
@@ -1 +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","handleEvent","event","data","debug","addEventListener","removeEventListener"],"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): BroadcastChannel {\n const channel = useMemo(() => new BroadcastChannel(name), [name]);\n useEffect(\n () => () => {\n channel.close();\n },\n [channel]\n );\n\n useEffect(() => {\n function handleEvent(event: MessageEvent): void {\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.addEventListener('message', handleEvent);\n return () => {\n channel.removeEventListener('message', handleEvent);\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,
|
|
1
|
+
{"version":3,"file":"useBroadcastChannel.js","names":["BROADCAST_CHANNEL_NAME","isMessage","Log","EMPTY_FUNCTION","useEffect","useMemo","log","module","useBroadcastChannel","onEvent","arguments","length","undefined","name","channel","BroadcastChannel","close","handleEvent","event","data","debug","addEventListener","removeEventListener"],"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): BroadcastChannel {\n const channel = useMemo(() => new BroadcastChannel(name), [name]);\n useEffect(\n () => () => {\n channel.close();\n },\n [channel]\n );\n\n useEffect(() => {\n function handleEvent(event: MessageEvent): void {\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.addEventListener('message', handleEvent);\n return () => {\n channel.removeEventListener('message', handleEvent);\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,mBAAmBA,CAAA,EAGf;EAAA,IAFlBC,OAAwD,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAGP,cAAc;EAAA,IACzEU,IAAI,GAAAH,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAGV,sBAAsB;EAE7B,IAAMc,OAAO,GAAGT,OAAO,CAAC,MAAM,IAAIU,gBAAgB,CAACF,IAAI,CAAC,EAAE,CAACA,IAAI,CAAC,CAAC;EACjET,SAAS,CACP,MAAM,MAAM;IACVU,OAAO,CAACE,KAAK,CAAC,CAAC;EACjB,CAAC,EACD,CAACF,OAAO,CACV,CAAC;EAEDV,SAAS,CAAC,MAAM;IACd,SAASa,WAAWA,CAACC,KAAmB,EAAQ;MAC9C,IAAM;QAAEC;MAAK,CAAC,GAAGD,KAAK;MACtB,IAAI,CAACjB,SAAS,CAACkB,IAAI,CAAC,EAAE;QACpBb,GAAG,CAACc,KAAK,CAAC,gCAAgC,EAAED,IAAI,CAAC;QACjD;MACF;MACAb,GAAG,CAACc,KAAK,CAAC,gBAAgB,EAAED,IAAI,CAAC;MACjCV,OAAO,CAACS,KAAK,CAAC;IAChB;IACAJ,OAAO,CAACO,gBAAgB,CAAC,SAAS,EAAEJ,WAAW,CAAC;IAChD,OAAO,MAAM;MACXH,OAAO,CAACQ,mBAAmB,CAAC,SAAS,EAAEL,WAAW,CAAC;IACrD,CAAC;EACH,CAAC,EAAE,CAACH,OAAO,EAAEL,OAAO,CAAC,CAAC;EAEtB,OAAOK,OAAO;AAChB;AAEA,eAAeN,mBAAmB"}
|
|
@@ -1 +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): void {\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,
|
|
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): void {\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,yBAAyBA,CACvCC,OAAkD,EAClDC,QAAoD,EAC9C;EACN,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,CACpB,CAAC;EAEDH,mBAAmB,CAACI,SAAS,CAAC;AAChC;AAEA,eAAeH,yBAAyB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useCheckIfExistsValue.js","names":["useCallback","useState","useDebouncedValue","usePromiseFactory","useTableUtils","useCheckIfExistsValue","table","columnNames","debounceMs","isCaseSensitive","tableUtils","valueTrimmed","setValueTrimmed","valueTrimmedDebounced","trimAndUpdateValue","text","trim","data","valueExistsData","isLoading","valueExistsIsLoading","doesColumnValueExist","valueExists"],"sources":["../src/useCheckIfExistsValue.ts"],"sourcesContent":["import { useCallback, useState } from 'react';\nimport type { Table } from '@deephaven/jsapi-types';\nimport { useDebouncedValue, usePromiseFactory } from '@deephaven/react-hooks';\nimport useTableUtils from './useTableUtils';\n\nexport interface CheckIfExistsValue {\n /** Current trimmed value */\n valueTrimmed: string;\n\n /** Debounced trimmed value */\n valueTrimmedDebounced: string;\n\n /**\n * Whether the value exists in the given table columns. Will be null whenever\n * the value changes until the next check is complete.\n */\n valueExists: boolean | null;\n\n /** Trims and updates the value */\n trimAndUpdateValue: (value: string) => void;\n}\n\n/**\n * Manage a trimmed text value and check if it exists in a list of table columns.\n * @param table The table to check for the value\n * @param columnNames The column names to check\n * @param debounceMs Debounce timer for re-checking the value\n * @param isCaseSensitive Whether the value check is case sensitive\n */\nexport function useCheckIfExistsValue(\n table: Table | null | undefined,\n columnNames: string | string[],\n debounceMs: number,\n isCaseSensitive: boolean\n): CheckIfExistsValue {\n const tableUtils = useTableUtils();\n\n const [valueTrimmed, setValueTrimmed] = useState('');\n const valueTrimmedDebounced = useDebouncedValue(valueTrimmed, debounceMs);\n\n const trimAndUpdateValue = useCallback((text: string) => {\n setValueTrimmed(text.trim());\n }, []);\n\n const { data: valueExistsData, isLoading: valueExistsIsLoading } =\n usePromiseFactory(tableUtils.doesColumnValueExist, [\n table,\n columnNames,\n valueTrimmedDebounced,\n isCaseSensitive,\n ]);\n\n // If value check is loading or if debounce hasn't settled, set\n // `matchesExistingValue` to null since it is indeterminate\n const valueExists =\n valueExistsIsLoading || valueTrimmed !== valueTrimmedDebounced\n ? null\n : valueExistsData;\n\n return {\n valueTrimmed,\n valueTrimmedDebounced,\n valueExists,\n trimAndUpdateValue,\n };\n}\n\nexport default useCheckIfExistsValue;\n"],"mappings":"AAAA,SAASA,WAAW,EAAEC,QAAQ,QAAQ,OAAO;AAE7C,SAASC,iBAAiB,EAAEC,iBAAiB,QAAQ,wBAAwB;AAAC,OACvEC,aAAa;AAmBpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,
|
|
1
|
+
{"version":3,"file":"useCheckIfExistsValue.js","names":["useCallback","useState","useDebouncedValue","usePromiseFactory","useTableUtils","useCheckIfExistsValue","table","columnNames","debounceMs","isCaseSensitive","tableUtils","valueTrimmed","setValueTrimmed","valueTrimmedDebounced","trimAndUpdateValue","text","trim","data","valueExistsData","isLoading","valueExistsIsLoading","doesColumnValueExist","valueExists"],"sources":["../src/useCheckIfExistsValue.ts"],"sourcesContent":["import { useCallback, useState } from 'react';\nimport type { Table } from '@deephaven/jsapi-types';\nimport { useDebouncedValue, usePromiseFactory } from '@deephaven/react-hooks';\nimport useTableUtils from './useTableUtils';\n\nexport interface CheckIfExistsValue {\n /** Current trimmed value */\n valueTrimmed: string;\n\n /** Debounced trimmed value */\n valueTrimmedDebounced: string;\n\n /**\n * Whether the value exists in the given table columns. Will be null whenever\n * the value changes until the next check is complete.\n */\n valueExists: boolean | null;\n\n /** Trims and updates the value */\n trimAndUpdateValue: (value: string) => void;\n}\n\n/**\n * Manage a trimmed text value and check if it exists in a list of table columns.\n * @param table The table to check for the value\n * @param columnNames The column names to check\n * @param debounceMs Debounce timer for re-checking the value\n * @param isCaseSensitive Whether the value check is case sensitive\n */\nexport function useCheckIfExistsValue(\n table: Table | null | undefined,\n columnNames: string | string[],\n debounceMs: number,\n isCaseSensitive: boolean\n): CheckIfExistsValue {\n const tableUtils = useTableUtils();\n\n const [valueTrimmed, setValueTrimmed] = useState('');\n const valueTrimmedDebounced = useDebouncedValue(valueTrimmed, debounceMs);\n\n const trimAndUpdateValue = useCallback((text: string) => {\n setValueTrimmed(text.trim());\n }, []);\n\n const { data: valueExistsData, isLoading: valueExistsIsLoading } =\n usePromiseFactory(tableUtils.doesColumnValueExist, [\n table,\n columnNames,\n valueTrimmedDebounced,\n isCaseSensitive,\n ]);\n\n // If value check is loading or if debounce hasn't settled, set\n // `matchesExistingValue` to null since it is indeterminate\n const valueExists =\n valueExistsIsLoading || valueTrimmed !== valueTrimmedDebounced\n ? null\n : valueExistsData;\n\n return {\n valueTrimmed,\n valueTrimmedDebounced,\n valueExists,\n trimAndUpdateValue,\n };\n}\n\nexport default useCheckIfExistsValue;\n"],"mappings":"AAAA,SAASA,WAAW,EAAEC,QAAQ,QAAQ,OAAO;AAE7C,SAASC,iBAAiB,EAAEC,iBAAiB,QAAQ,wBAAwB;AAAC,OACvEC,aAAa;AAmBpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,qBAAqBA,CACnCC,KAA+B,EAC/BC,WAA8B,EAC9BC,UAAkB,EAClBC,eAAwB,EACJ;EACpB,IAAMC,UAAU,GAAGN,aAAa,CAAC,CAAC;EAElC,IAAM,CAACO,YAAY,EAAEC,eAAe,CAAC,GAAGX,QAAQ,CAAC,EAAE,CAAC;EACpD,IAAMY,qBAAqB,GAAGX,iBAAiB,CAACS,YAAY,EAAEH,UAAU,CAAC;EAEzE,IAAMM,kBAAkB,GAAGd,WAAW,CAAEe,IAAY,IAAK;IACvDH,eAAe,CAACG,IAAI,CAACC,IAAI,CAAC,CAAC,CAAC;EAC9B,CAAC,EAAE,EAAE,CAAC;EAEN,IAAM;IAAEC,IAAI,EAAEC,eAAe;IAAEC,SAAS,EAAEC;EAAqB,CAAC,GAC9DjB,iBAAiB,CAACO,UAAU,CAACW,oBAAoB,EAAE,CACjDf,KAAK,EACLC,WAAW,EACXM,qBAAqB,EACrBJ,eAAe,CAChB,CAAC;;EAEJ;EACA;EACA,IAAMa,WAAW,GACfF,oBAAoB,IAAIT,YAAY,KAAKE,qBAAqB,GAC1D,IAAI,GACJK,eAAe;EAErB,OAAO;IACLP,YAAY;IACZE,qBAAqB;IACrBS,WAAW;IACXR;EACF,CAAC;AACH;AAEA,eAAeT,qBAAqB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useConnection.d.ts","sourceRoot":"","sources":["../src/useConnection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAI5D,wBAAgB,aAAa,IAAI,aAAa,CAK7C;AAED,eAAe,aAAa,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { useContextOrThrow } from '@deephaven/react-hooks';
|
|
2
|
+
import { ConnectionContext } from "./ConnectionContext.js";
|
|
3
|
+
export function useConnection() {
|
|
4
|
+
return useContextOrThrow(ConnectionContext, 'No IdeConnection available in useConnection. Was code wrapped in ConnectionContext.Provider?');
|
|
5
|
+
}
|
|
6
|
+
export default useConnection;
|
|
7
|
+
//# sourceMappingURL=useConnection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useConnection.js","names":["useContextOrThrow","ConnectionContext","useConnection"],"sources":["../src/useConnection.ts"],"sourcesContent":["import type { IdeConnection } from '@deephaven/jsapi-types';\nimport { useContextOrThrow } from '@deephaven/react-hooks';\nimport { ConnectionContext } from './ConnectionContext';\n\nexport function useConnection(): IdeConnection {\n return useContextOrThrow(\n ConnectionContext,\n 'No IdeConnection available in useConnection. Was code wrapped in ConnectionContext.Provider?'\n );\n}\n\nexport default useConnection;\n"],"mappings":"AACA,SAASA,iBAAiB,QAAQ,wBAAwB;AAAC,SAClDC,iBAAiB;AAE1B,OAAO,SAASC,aAAaA,CAAA,EAAkB;EAC7C,OAAOF,iBAAiB,CACtBC,iBAAiB,EACjB,8FACF,CAAC;AACH;AAEA,eAAeC,aAAa"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useDebouncedViewportSearch.js","names":["debounce","Log","useEffect","useMemo","useTableUtils","log","module","DEBOUNCE_VIEWPORT_SEARCH_MS","useDebouncedViewportSearch","viewportData","columnName","debounceMs","tableUtils","table","applyFiltersAndRefresh","debouncedSearch","searchText","debug","searchTextTrimmed","trim","column","findColumn","value","makeFilterValue","type","filter","contains","cancel"],"sources":["../src/useDebouncedViewportSearch.ts"],"sourcesContent":["import debounce from 'lodash.debounce';\nimport type { Table, TreeTable } from '@deephaven/jsapi-types';\nimport Log from '@deephaven/log';\nimport { useEffect, useMemo } from 'react';\nimport { UseViewportDataResult } from './useViewportData';\nimport useTableUtils from './useTableUtils';\n\nconst log = Log.module('useDebouncedViewportSearch');\n\nexport const DEBOUNCE_VIEWPORT_SEARCH_MS = 200;\n\n/**\n * React hook that returns a debounced search callback for filtering a table\n * viewport.\n * @param viewportData Table viewport to filter\n * @param columnName Column name to filter by\n * @param debounceMs Millisecond value to debounce\n * @returns A debounced search function\n */\nexport function useDebouncedViewportSearch<I, T extends Table | TreeTable>(\n viewportData: UseViewportDataResult<I, T>,\n columnName: string,\n debounceMs = DEBOUNCE_VIEWPORT_SEARCH_MS\n): (searchText: string) => void {\n const tableUtils = useTableUtils();\n const { table, applyFiltersAndRefresh } = viewportData;\n\n const debouncedSearch = useMemo(\n () =>\n debounce((searchText: string) => {\n log.debug(`Applying debounced searchText '${searchText}'`);\n\n if (table == null) {\n return;\n }\n\n const searchTextTrimmed = searchText.trim();\n\n if (searchTextTrimmed === '') {\n applyFiltersAndRefresh([]);\n return;\n }\n\n const column = table.findColumn(columnName);\n const value = tableUtils.makeFilterValue(\n column.type,\n searchTextTrimmed\n );\n const filter = [column.filter().contains(value)];\n\n applyFiltersAndRefresh(filter);\n }, debounceMs),\n [applyFiltersAndRefresh, columnName, debounceMs, table, tableUtils]\n );\n\n useEffect(\n () => () => {\n log.debug('Cancelling debounced search function');\n debouncedSearch.cancel();\n },\n [debouncedSearch]\n );\n\n return debouncedSearch;\n}\n\nexport default useDebouncedViewportSearch;\n"],"mappings":"AAAA,OAAOA,QAAQ,MAAM,iBAAiB;AAEtC,OAAOC,GAAG,MAAM,gBAAgB;AAChC,SAASC,SAAS,EAAEC,OAAO,QAAQ,OAAO;AAAC,OAEpCC,aAAa;AAEpB,IAAMC,GAAG,GAAGJ,GAAG,CAACK,MAAM,CAAC,4BAA4B,CAAC;AAEpD,OAAO,IAAMC,2BAA2B,GAAG,GAAG;;AAE9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,
|
|
1
|
+
{"version":3,"file":"useDebouncedViewportSearch.js","names":["debounce","Log","useEffect","useMemo","useTableUtils","log","module","DEBOUNCE_VIEWPORT_SEARCH_MS","useDebouncedViewportSearch","viewportData","columnName","debounceMs","arguments","length","undefined","tableUtils","table","applyFiltersAndRefresh","debouncedSearch","searchText","debug","concat","searchTextTrimmed","trim","column","findColumn","value","makeFilterValue","type","filter","contains","cancel"],"sources":["../src/useDebouncedViewportSearch.ts"],"sourcesContent":["import debounce from 'lodash.debounce';\nimport type { Table, TreeTable } from '@deephaven/jsapi-types';\nimport Log from '@deephaven/log';\nimport { useEffect, useMemo } from 'react';\nimport { UseViewportDataResult } from './useViewportData';\nimport useTableUtils from './useTableUtils';\n\nconst log = Log.module('useDebouncedViewportSearch');\n\nexport const DEBOUNCE_VIEWPORT_SEARCH_MS = 200;\n\n/**\n * React hook that returns a debounced search callback for filtering a table\n * viewport.\n * @param viewportData Table viewport to filter\n * @param columnName Column name to filter by\n * @param debounceMs Millisecond value to debounce\n * @returns A debounced search function\n */\nexport function useDebouncedViewportSearch<I, T extends Table | TreeTable>(\n viewportData: UseViewportDataResult<I, T>,\n columnName: string,\n debounceMs = DEBOUNCE_VIEWPORT_SEARCH_MS\n): (searchText: string) => void {\n const tableUtils = useTableUtils();\n const { table, applyFiltersAndRefresh } = viewportData;\n\n const debouncedSearch = useMemo(\n () =>\n debounce((searchText: string) => {\n log.debug(`Applying debounced searchText '${searchText}'`);\n\n if (table == null) {\n return;\n }\n\n const searchTextTrimmed = searchText.trim();\n\n if (searchTextTrimmed === '') {\n applyFiltersAndRefresh([]);\n return;\n }\n\n const column = table.findColumn(columnName);\n const value = tableUtils.makeFilterValue(\n column.type,\n searchTextTrimmed\n );\n const filter = [column.filter().contains(value)];\n\n applyFiltersAndRefresh(filter);\n }, debounceMs),\n [applyFiltersAndRefresh, columnName, debounceMs, table, tableUtils]\n );\n\n useEffect(\n () => () => {\n log.debug('Cancelling debounced search function');\n debouncedSearch.cancel();\n },\n [debouncedSearch]\n );\n\n return debouncedSearch;\n}\n\nexport default useDebouncedViewportSearch;\n"],"mappings":"AAAA,OAAOA,QAAQ,MAAM,iBAAiB;AAEtC,OAAOC,GAAG,MAAM,gBAAgB;AAChC,SAASC,SAAS,EAAEC,OAAO,QAAQ,OAAO;AAAC,OAEpCC,aAAa;AAEpB,IAAMC,GAAG,GAAGJ,GAAG,CAACK,MAAM,CAAC,4BAA4B,CAAC;AAEpD,OAAO,IAAMC,2BAA2B,GAAG,GAAG;;AAE9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,0BAA0BA,CACxCC,YAAyC,EACzCC,UAAkB,EAEY;EAAA,IAD9BC,UAAU,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAGL,2BAA2B;EAExC,IAAMQ,UAAU,GAAGX,aAAa,CAAC,CAAC;EAClC,IAAM;IAAEY,KAAK;IAAEC;EAAuB,CAAC,GAAGR,YAAY;EAEtD,IAAMS,eAAe,GAAGf,OAAO,CAC7B,MACEH,QAAQ,CAAEmB,UAAkB,IAAK;IAC/Bd,GAAG,CAACe,KAAK,mCAAAC,MAAA,CAAmCF,UAAU,MAAG,CAAC;IAE1D,IAAIH,KAAK,IAAI,IAAI,EAAE;MACjB;IACF;IAEA,IAAMM,iBAAiB,GAAGH,UAAU,CAACI,IAAI,CAAC,CAAC;IAE3C,IAAID,iBAAiB,KAAK,EAAE,EAAE;MAC5BL,sBAAsB,CAAC,EAAE,CAAC;MAC1B;IACF;IAEA,IAAMO,MAAM,GAAGR,KAAK,CAACS,UAAU,CAACf,UAAU,CAAC;IAC3C,IAAMgB,KAAK,GAAGX,UAAU,CAACY,eAAe,CACtCH,MAAM,CAACI,IAAI,EACXN,iBACF,CAAC;IACD,IAAMO,MAAM,GAAG,CAACL,MAAM,CAACK,MAAM,CAAC,CAAC,CAACC,QAAQ,CAACJ,KAAK,CAAC,CAAC;IAEhDT,sBAAsB,CAACY,MAAM,CAAC;EAChC,CAAC,EAAElB,UAAU,CAAC,EAChB,CAACM,sBAAsB,EAAEP,UAAU,EAAEC,UAAU,EAAEK,KAAK,EAAED,UAAU,CACpE,CAAC;EAEDb,SAAS,CACP,MAAM,MAAM;IACVG,GAAG,CAACe,KAAK,CAAC,sCAAsC,CAAC;IACjDF,eAAe,CAACa,MAAM,CAAC,CAAC;EAC1B,CAAC,EACD,CAACb,eAAe,CAClB,CAAC;EAED,OAAOA,eAAe;AACxB;AAEA,eAAeV,0BAA0B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useDebouncedViewportSelectionFilter.js","names":["createSelectedValuesFilter","isSelectionMaybeInvertedEqual","useDebouncedValue","useIsEqualMemo","useMappedSelection","useMemo","useTableUtils","DEBOUNCE_MS","useDebouncedViewportSelectionFilter","viewportData","columnName","shouldSelectAllOnNoSelection","mapItemToValue","tableUtils","valuesSelection","debouncedValuesSelection","memoValuesSelection","selection","isInverted"],"sources":["../src/useDebouncedViewportSelectionFilter.ts"],"sourcesContent":["import {\n createSelectedValuesFilter,\n FilterConditionFactory,\n} from '@deephaven/jsapi-utils';\nimport {\n isSelectionMaybeInvertedEqual,\n useDebouncedValue,\n useIsEqualMemo,\n useMappedSelection,\n WindowedListData,\n} from '@deephaven/react-hooks';\nimport { KeyedItem } from '@deephaven/utils';\nimport { useMemo } from 'react';\nimport useTableUtils from './useTableUtils';\n\nexport const DEBOUNCE_MS = 300;\n\nexport interface UseDebouncedViewportSelectionFilterOptions<TItem, TValue> {\n viewportData: WindowedListData<KeyedItem<TItem>>;\n columnName: string;\n shouldSelectAllOnNoSelection: boolean;\n mapItemToValue: (item: KeyedItem<TItem>) => TValue;\n}\n\n/**\n * Creates a filter factory for the current selected keys of a viewport. The\n * selected keys will be mapped to values to match in a given column name. The\n * resulting filter factory is debounced to allow some cushion for cases where\n * a user rapidly changes selections, e.g. in a checkbox list.\n */\nexport function useDebouncedViewportSelectionFilter<TItem, TValue>({\n viewportData,\n columnName,\n shouldSelectAllOnNoSelection,\n mapItemToValue,\n}: UseDebouncedViewportSelectionFilterOptions<\n TItem,\n TValue\n>): FilterConditionFactory {\n const tableUtils = useTableUtils();\n\n // Map selection to values contained in the column to filter\n const valuesSelection = useMappedSelection(viewportData, mapItemToValue);\n\n // Debounce so user can rapidly select multiple items in a row without the\n // cost of updating the table on each change\n const debouncedValuesSelection = useDebouncedValue(\n valuesSelection,\n DEBOUNCE_MS\n );\n\n // In cases where a user rapidly selects then deselects the selection\n // reference will change, but the state it represents will remain unchanged.\n // Memoize based on the selection value to avoid unnecessarily re-applying\n // table filters.\n const memoValuesSelection = useIsEqualMemo(\n debouncedValuesSelection,\n isSelectionMaybeInvertedEqual\n );\n\n return useMemo(\n () =>\n createSelectedValuesFilter(\n tableUtils,\n columnName,\n memoValuesSelection.selection,\n shouldSelectAllOnNoSelection,\n memoValuesSelection.isInverted\n ),\n [columnName, memoValuesSelection, shouldSelectAllOnNoSelection, tableUtils]\n );\n}\n\nexport default useDebouncedViewportSelectionFilter;\n"],"mappings":"AAAA,SACEA,0BAA0B,QAErB,wBAAwB;AAC/B,SACEC,6BAA6B,EAC7BC,iBAAiB,EACjBC,cAAc,EACdC,kBAAkB,QAEb,wBAAwB;AAE/B,SAASC,OAAO,QAAQ,OAAO;AAAC,OACzBC,aAAa;AAEpB,OAAO,IAAMC,WAAW,GAAG,GAAG;AAS9B;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,
|
|
1
|
+
{"version":3,"file":"useDebouncedViewportSelectionFilter.js","names":["createSelectedValuesFilter","isSelectionMaybeInvertedEqual","useDebouncedValue","useIsEqualMemo","useMappedSelection","useMemo","useTableUtils","DEBOUNCE_MS","useDebouncedViewportSelectionFilter","_ref","viewportData","columnName","shouldSelectAllOnNoSelection","mapItemToValue","tableUtils","valuesSelection","debouncedValuesSelection","memoValuesSelection","selection","isInverted"],"sources":["../src/useDebouncedViewportSelectionFilter.ts"],"sourcesContent":["import {\n createSelectedValuesFilter,\n FilterConditionFactory,\n} from '@deephaven/jsapi-utils';\nimport {\n isSelectionMaybeInvertedEqual,\n useDebouncedValue,\n useIsEqualMemo,\n useMappedSelection,\n WindowedListData,\n} from '@deephaven/react-hooks';\nimport { KeyedItem } from '@deephaven/utils';\nimport { useMemo } from 'react';\nimport useTableUtils from './useTableUtils';\n\nexport const DEBOUNCE_MS = 300;\n\nexport interface UseDebouncedViewportSelectionFilterOptions<TItem, TValue> {\n viewportData: WindowedListData<KeyedItem<TItem>>;\n columnName: string;\n shouldSelectAllOnNoSelection: boolean;\n mapItemToValue: (item: KeyedItem<TItem>) => TValue;\n}\n\n/**\n * Creates a filter factory for the current selected keys of a viewport. The\n * selected keys will be mapped to values to match in a given column name. The\n * resulting filter factory is debounced to allow some cushion for cases where\n * a user rapidly changes selections, e.g. in a checkbox list.\n */\nexport function useDebouncedViewportSelectionFilter<TItem, TValue>({\n viewportData,\n columnName,\n shouldSelectAllOnNoSelection,\n mapItemToValue,\n}: UseDebouncedViewportSelectionFilterOptions<\n TItem,\n TValue\n>): FilterConditionFactory {\n const tableUtils = useTableUtils();\n\n // Map selection to values contained in the column to filter\n const valuesSelection = useMappedSelection(viewportData, mapItemToValue);\n\n // Debounce so user can rapidly select multiple items in a row without the\n // cost of updating the table on each change\n const debouncedValuesSelection = useDebouncedValue(\n valuesSelection,\n DEBOUNCE_MS\n );\n\n // In cases where a user rapidly selects then deselects the selection\n // reference will change, but the state it represents will remain unchanged.\n // Memoize based on the selection value to avoid unnecessarily re-applying\n // table filters.\n const memoValuesSelection = useIsEqualMemo(\n debouncedValuesSelection,\n isSelectionMaybeInvertedEqual\n );\n\n return useMemo(\n () =>\n createSelectedValuesFilter(\n tableUtils,\n columnName,\n memoValuesSelection.selection,\n shouldSelectAllOnNoSelection,\n memoValuesSelection.isInverted\n ),\n [columnName, memoValuesSelection, shouldSelectAllOnNoSelection, tableUtils]\n );\n}\n\nexport default useDebouncedViewportSelectionFilter;\n"],"mappings":"AAAA,SACEA,0BAA0B,QAErB,wBAAwB;AAC/B,SACEC,6BAA6B,EAC7BC,iBAAiB,EACjBC,cAAc,EACdC,kBAAkB,QAEb,wBAAwB;AAE/B,SAASC,OAAO,QAAQ,OAAO;AAAC,OACzBC,aAAa;AAEpB,OAAO,IAAMC,WAAW,GAAG,GAAG;AAS9B;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,mCAAmCA,CAAAC,IAAA,EAQxB;EAAA,IARwC;IACjEC,YAAY;IACZC,UAAU;IACVC,4BAA4B;IAC5BC;EAIF,CAAC,GAAAJ,IAAA;EACC,IAAMK,UAAU,GAAGR,aAAa,CAAC,CAAC;;EAElC;EACA,IAAMS,eAAe,GAAGX,kBAAkB,CAACM,YAAY,EAAEG,cAAc,CAAC;;EAExE;EACA;EACA,IAAMG,wBAAwB,GAAGd,iBAAiB,CAChDa,eAAe,EACfR,WACF,CAAC;;EAED;EACA;EACA;EACA;EACA,IAAMU,mBAAmB,GAAGd,cAAc,CACxCa,wBAAwB,EACxBf,6BACF,CAAC;EAED,OAAOI,OAAO,CACZ,MACEL,0BAA0B,CACxBc,UAAU,EACVH,UAAU,EACVM,mBAAmB,CAACC,SAAS,EAC7BN,4BAA4B,EAC5BK,mBAAmB,CAACE,UACtB,CAAC,EACH,CAACR,UAAU,EAAEM,mBAAmB,EAAEL,4BAA4B,EAAEE,UAAU,CAC5E,CAAC;AACH;AAEA,eAAeN,mCAAmC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useFilterConditionFactories.js","names":["useMemo","removeNullAndUndefined","useFilterConditionFactories","maybeTable","filterConditionFactories","map","f"],"sources":["../src/useFilterConditionFactories.ts"],"sourcesContent":["import { useMemo } from 'react';\nimport type { FilterCondition, Table, TreeTable } from '@deephaven/jsapi-types';\nimport type { FilterConditionFactory } from '@deephaven/jsapi-utils';\nimport { removeNullAndUndefined } from '@deephaven/utils';\n\nexport function useFilterConditionFactories(\n maybeTable: Table | TreeTable | null | undefined,\n ...filterConditionFactories: FilterConditionFactory[]\n): FilterCondition[] {\n return useMemo(\n () =>\n removeNullAndUndefined(\n ...filterConditionFactories.map(f => f(maybeTable))\n ),\n // Intentionally disabling hooks check so we can spread\n // the array items as dependencies.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [maybeTable, ...filterConditionFactories]\n );\n}\n\nexport default useFilterConditionFactories;\n"],"mappings":"AAAA,SAASA,OAAO,QAAQ,OAAO;AAG/B,SAASC,sBAAsB,QAAQ,kBAAkB;AAEzD,OAAO,SAASC,
|
|
1
|
+
{"version":3,"file":"useFilterConditionFactories.js","names":["useMemo","removeNullAndUndefined","useFilterConditionFactories","maybeTable","_len","arguments","length","filterConditionFactories","Array","_key","map","f"],"sources":["../src/useFilterConditionFactories.ts"],"sourcesContent":["import { useMemo } from 'react';\nimport type { FilterCondition, Table, TreeTable } from '@deephaven/jsapi-types';\nimport type { FilterConditionFactory } from '@deephaven/jsapi-utils';\nimport { removeNullAndUndefined } from '@deephaven/utils';\n\nexport function useFilterConditionFactories(\n maybeTable: Table | TreeTable | null | undefined,\n ...filterConditionFactories: FilterConditionFactory[]\n): FilterCondition[] {\n return useMemo(\n () =>\n removeNullAndUndefined(\n ...filterConditionFactories.map(f => f(maybeTable))\n ),\n // Intentionally disabling hooks check so we can spread\n // the array items as dependencies.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [maybeTable, ...filterConditionFactories]\n );\n}\n\nexport default useFilterConditionFactories;\n"],"mappings":"AAAA,SAASA,OAAO,QAAQ,OAAO;AAG/B,SAASC,sBAAsB,QAAQ,kBAAkB;AAEzD,OAAO,SAASC,2BAA2BA,CACzCC,UAAgD,EAE7B;EAAA,SAAAC,IAAA,GAAAC,SAAA,CAAAC,MAAA,EADhBC,wBAAwB,OAAAC,KAAA,CAAAJ,IAAA,OAAAA,IAAA,WAAAK,IAAA,MAAAA,IAAA,GAAAL,IAAA,EAAAK,IAAA;IAAxBF,wBAAwB,CAAAE,IAAA,QAAAJ,SAAA,CAAAI,IAAA;EAAA;EAE3B,OAAOT,OAAO,CACZ,MACEC,sBAAsB,CACpB,GAAGM,wBAAwB,CAACG,GAAG,CAACC,CAAC,IAAIA,CAAC,CAACR,UAAU,CAAC,CACpD,CAAC;EACH;EACA;EACA;EACA,CAACA,UAAU,EAAE,GAAGI,wBAAwB,CAC1C,CAAC;AACH;AAEA,eAAeL,2BAA2B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useFilteredItemsWithDefaultValue.js","names":["useMemo","useRef","useFilteredItemsWithDefaultValue","items","displayProp","searchText","defaultDisplayValue","searchTextRef","current","isLoading","length","item","toLowerCase","includes","key"],"sources":["../src/useFilteredItemsWithDefaultValue.ts"],"sourcesContent":["import { useMemo, useRef } from 'react';\nimport { KeyedItem } from '@deephaven/utils';\n\n/**\n * Takes an array of items and adds a default item to the top of the list if:\n * 1. defaultDisplayValue is provided\n * 2. The `searchText` is empty or\n * The `searchText` is contained (case insensitive) in the default item display text.\n * @param items List of items filtered on `searchText`\n * @param displayProp The item prop containing display text\n * @param searchText The current search text that is filtering the items\n * @param defaultDisplayValue The display text to set as the default item `displayProp` value\n */\nexport function useFilteredItemsWithDefaultValue<\n TItem,\n TProp extends keyof TItem,\n>(\n items: KeyedItem<TItem>[],\n displayProp: TProp,\n searchText: string,\n defaultDisplayValue?: string | null\n): KeyedItem<TItem>[] {\n // Exclude search text from updating the memo. This ensures that adding /\n // removing of the default item stays in sync with data loading. Otherwise,\n // the item can move while data is still loading.\n const searchTextRef = useRef('');\n searchTextRef.current = searchText;\n\n return useMemo(() => {\n // If the list is still loading, items will exist, but their item prop will be undefined\n const isLoading = items.length > 0 && items[0].item == null;\n\n if (\n !isLoading &&\n defaultDisplayValue != null &&\n (searchTextRef.current === '' ||\n defaultDisplayValue\n .toLowerCase()\n .includes(searchTextRef.current.toLowerCase()))\n ) {\n return [\n {\n key: defaultDisplayValue,\n item: { [displayProp]: defaultDisplayValue } as TItem,\n },\n ...items,\n ];\n }\n\n return items;\n }, [defaultDisplayValue, displayProp, items]);\n}\n\nexport default useFilteredItemsWithDefaultValue;\n"],"mappings":"AAAA,SAASA,OAAO,EAAEC,MAAM,QAAQ,OAAO;AAGvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,
|
|
1
|
+
{"version":3,"file":"useFilteredItemsWithDefaultValue.js","names":["useMemo","useRef","useFilteredItemsWithDefaultValue","items","displayProp","searchText","defaultDisplayValue","searchTextRef","current","isLoading","length","item","toLowerCase","includes","key"],"sources":["../src/useFilteredItemsWithDefaultValue.ts"],"sourcesContent":["import { useMemo, useRef } from 'react';\nimport { KeyedItem } from '@deephaven/utils';\n\n/**\n * Takes an array of items and adds a default item to the top of the list if:\n * 1. defaultDisplayValue is provided\n * 2. The `searchText` is empty or\n * The `searchText` is contained (case insensitive) in the default item display text.\n * @param items List of items filtered on `searchText`\n * @param displayProp The item prop containing display text\n * @param searchText The current search text that is filtering the items\n * @param defaultDisplayValue The display text to set as the default item `displayProp` value\n */\nexport function useFilteredItemsWithDefaultValue<\n TItem,\n TProp extends keyof TItem,\n>(\n items: KeyedItem<TItem>[],\n displayProp: TProp,\n searchText: string,\n defaultDisplayValue?: string | null\n): KeyedItem<TItem>[] {\n // Exclude search text from updating the memo. This ensures that adding /\n // removing of the default item stays in sync with data loading. Otherwise,\n // the item can move while data is still loading.\n const searchTextRef = useRef('');\n searchTextRef.current = searchText;\n\n return useMemo(() => {\n // If the list is still loading, items will exist, but their item prop will be undefined\n const isLoading = items.length > 0 && items[0].item == null;\n\n if (\n !isLoading &&\n defaultDisplayValue != null &&\n (searchTextRef.current === '' ||\n defaultDisplayValue\n .toLowerCase()\n .includes(searchTextRef.current.toLowerCase()))\n ) {\n return [\n {\n key: defaultDisplayValue,\n item: { [displayProp]: defaultDisplayValue } as TItem,\n },\n ...items,\n ];\n }\n\n return items;\n }, [defaultDisplayValue, displayProp, items]);\n}\n\nexport default useFilteredItemsWithDefaultValue;\n"],"mappings":"AAAA,SAASA,OAAO,EAAEC,MAAM,QAAQ,OAAO;AAGvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,gCAAgCA,CAI9CC,KAAyB,EACzBC,WAAkB,EAClBC,UAAkB,EAClBC,mBAAmC,EACf;EACpB;EACA;EACA;EACA,IAAMC,aAAa,GAAGN,MAAM,CAAC,EAAE,CAAC;EAChCM,aAAa,CAACC,OAAO,GAAGH,UAAU;EAElC,OAAOL,OAAO,CAAC,MAAM;IACnB;IACA,IAAMS,SAAS,GAAGN,KAAK,CAACO,MAAM,GAAG,CAAC,IAAIP,KAAK,CAAC,CAAC,CAAC,CAACQ,IAAI,IAAI,IAAI;IAE3D,IACE,CAACF,SAAS,IACVH,mBAAmB,IAAI,IAAI,KAC1BC,aAAa,CAACC,OAAO,KAAK,EAAE,IAC3BF,mBAAmB,CAChBM,WAAW,CAAC,CAAC,CACbC,QAAQ,CAACN,aAAa,CAACC,OAAO,CAACI,WAAW,CAAC,CAAC,CAAC,CAAC,EACnD;MACA,OAAO,CACL;QACEE,GAAG,EAAER,mBAAmB;QACxBK,IAAI,EAAE;UAAE,CAACP,WAAW,GAAGE;QAAoB;MAC7C,CAAC,EACD,GAAGH,KAAK,CACT;IACH;IAEA,OAAOA,KAAK;EACd,CAAC,EAAE,CAACG,mBAAmB,EAAEF,WAAW,EAAED,KAAK,CAAC,CAAC;AAC/C;AAEA,eAAeD,gCAAgC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useGetItemPosition.js","names":["useCallback","useGetItemPosition","table","columnName","defaultValue","itemHeight","topOffset","value","column","findColumn","rowIndex","seekRow","defaultItemOffset"],"sources":["../src/useGetItemPosition.ts"],"sourcesContent":["import { useCallback } from 'react';\nimport type { Table } from '@deephaven/jsapi-types';\n\nexport interface UseGetItemPositionOptions {\n table?: Table | null;\n columnName: string;\n defaultValue?: string | null;\n itemHeight: number;\n topOffset?: number;\n value: string;\n}\n\n/**\n * Gets an item's position in a list of items based on its row index in a table.\n * @param table Table to search for the item in\n * @param columnName Column name to search for the item in\n * @param defaultValue Optional default value. This would be the first item in\n * the list and not expected to be in the Table.\n * @param itemHeight Height of each item in the list\n * @param topOffset Optional pixel offset from the top of the list\n * @param value Value to search for in the column\n */\nexport function useGetItemPosition({\n table,\n columnName,\n defaultValue,\n itemHeight,\n topOffset = 0,\n value,\n}: UseGetItemPositionOptions): () => Promise<number> {\n return useCallback(async () => {\n if (table == null || value === '' || value === defaultValue) {\n return topOffset;\n }\n\n const column = table.findColumn(columnName);\n const rowIndex = await table.seekRow(0, column, 'String', value);\n\n // If a default item exists at the top of the list, offset the item index by 1\n const defaultItemOffset = defaultValue == null ? 0 : 1;\n\n return (rowIndex + defaultItemOffset) * itemHeight + topOffset;\n }, [columnName, defaultValue, itemHeight, table, topOffset, value]);\n}\n\nexport default useGetItemPosition;\n"],"mappings":";;AAAA,SAASA,WAAW,QAAQ,OAAO;AAYnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,
|
|
1
|
+
{"version":3,"file":"useGetItemPosition.js","names":["useCallback","useGetItemPosition","_ref","table","columnName","defaultValue","itemHeight","topOffset","value","_asyncToGenerator","column","findColumn","rowIndex","seekRow","defaultItemOffset"],"sources":["../src/useGetItemPosition.ts"],"sourcesContent":["import { useCallback } from 'react';\nimport type { Table } from '@deephaven/jsapi-types';\n\nexport interface UseGetItemPositionOptions {\n table?: Table | null;\n columnName: string;\n defaultValue?: string | null;\n itemHeight: number;\n topOffset?: number;\n value: string;\n}\n\n/**\n * Gets an item's position in a list of items based on its row index in a table.\n * @param table Table to search for the item in\n * @param columnName Column name to search for the item in\n * @param defaultValue Optional default value. This would be the first item in\n * the list and not expected to be in the Table.\n * @param itemHeight Height of each item in the list\n * @param topOffset Optional pixel offset from the top of the list\n * @param value Value to search for in the column\n */\nexport function useGetItemPosition({\n table,\n columnName,\n defaultValue,\n itemHeight,\n topOffset = 0,\n value,\n}: UseGetItemPositionOptions): () => Promise<number> {\n return useCallback(async () => {\n if (table == null || value === '' || value === defaultValue) {\n return topOffset;\n }\n\n const column = table.findColumn(columnName);\n const rowIndex = await table.seekRow(0, column, 'String', value);\n\n // If a default item exists at the top of the list, offset the item index by 1\n const defaultItemOffset = defaultValue == null ? 0 : 1;\n\n return (rowIndex + defaultItemOffset) * itemHeight + topOffset;\n }, [columnName, defaultValue, itemHeight, table, topOffset, value]);\n}\n\nexport default useGetItemPosition;\n"],"mappings":";;AAAA,SAASA,WAAW,QAAQ,OAAO;AAYnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,kBAAkBA,CAAAC,IAAA,EAOmB;EAAA,IAPlB;IACjCC,KAAK;IACLC,UAAU;IACVC,YAAY;IACZC,UAAU;IACVC,SAAS,GAAG,CAAC;IACbC;EACyB,CAAC,GAAAN,IAAA;EAC1B,OAAOF,WAAW,eAAAS,iBAAA,CAAC,aAAY;IAC7B,IAAIN,KAAK,IAAI,IAAI,IAAIK,KAAK,KAAK,EAAE,IAAIA,KAAK,KAAKH,YAAY,EAAE;MAC3D,OAAOE,SAAS;IAClB;IAEA,IAAMG,MAAM,GAAGP,KAAK,CAACQ,UAAU,CAACP,UAAU,CAAC;IAC3C,IAAMQ,QAAQ,SAAST,KAAK,CAACU,OAAO,CAAC,CAAC,EAAEH,MAAM,EAAE,QAAQ,EAAEF,KAAK,CAAC;;IAEhE;IACA,IAAMM,iBAAiB,GAAGT,YAAY,IAAI,IAAI,GAAG,CAAC,GAAG,CAAC;IAEtD,OAAO,CAACO,QAAQ,GAAGE,iBAAiB,IAAIR,UAAU,GAAGC,SAAS;EAChE,CAAC,GAAE,CAACH,UAAU,EAAEC,YAAY,EAAEC,UAAU,EAAEH,KAAK,EAAEI,SAAS,EAAEC,KAAK,CAAC,CAAC;AACrE;AAEA,eAAeP,kBAAkB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useInitializeViewportData.js","names":["useEffect","generateEmptyKeyedItems","useWindowedListData","Log","useTableSize","log","module","useInitializeViewportData","table","viewportData","targetSize","Math","max","currentSize","items","length","debug","setItems","Array","from"],"sources":["../src/useInitializeViewportData.ts"],"sourcesContent":["import { useEffect } from 'react';\nimport type { Table, TreeTable } from '@deephaven/jsapi-types';\nimport { generateEmptyKeyedItems } from '@deephaven/jsapi-utils';\nimport { useWindowedListData, WindowedListData } from '@deephaven/react-hooks';\nimport { KeyedItem } from '@deephaven/utils';\nimport Log from '@deephaven/log';\nimport useTableSize from './useTableSize';\n\nconst log = Log.module('useInitializeViewportData');\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 a WindowedListData object.\n */\nexport function useInitializeViewportData<T>(\n table: Table | TreeTable | null\n): WindowedListData<KeyedItem<T>> {\n const viewportData = useWindowedListData<KeyedItem<T>>({});\n\n // If the table changes size, we need to re-initialize it.\n const targetSize = Math.max(0, useTableSize(table));\n\n // Whenever the table reference or size changes, replace the list with empty\n // items. This is preferred over updating items in place to avoid the user\n // seeing items shift around multiple times.\n useEffect(() => {\n const currentSize = viewportData.items.length;\n\n if (targetSize !== currentSize) {\n log.debug('size changed:', { currentSize, targetSize });\n viewportData.setItems(\n Array.from(generateEmptyKeyedItems<T>(0, targetSize - 1))\n );\n }\n\n // Intentionally excluding viewportData since it changes on every render.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [targetSize, table]);\n\n return viewportData;\n}\n\nexport default useInitializeViewportData;\n"],"mappings":"AAAA,SAASA,SAAS,QAAQ,OAAO;AAEjC,SAASC,uBAAuB,QAAQ,wBAAwB;AAChE,SAASC,mBAAmB,QAA0B,wBAAwB;AAE9E,OAAOC,GAAG,MAAM,gBAAgB;AAAC,OAC1BC,YAAY;AAEnB,IAAMC,GAAG,GAAGF,GAAG,CAACG,MAAM,CAAC,2BAA2B,CAAC;;AAEnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,
|
|
1
|
+
{"version":3,"file":"useInitializeViewportData.js","names":["useEffect","generateEmptyKeyedItems","useWindowedListData","Log","useTableSize","log","module","useInitializeViewportData","table","viewportData","targetSize","Math","max","currentSize","items","length","debug","setItems","Array","from"],"sources":["../src/useInitializeViewportData.ts"],"sourcesContent":["import { useEffect } from 'react';\nimport type { Table, TreeTable } from '@deephaven/jsapi-types';\nimport { generateEmptyKeyedItems } from '@deephaven/jsapi-utils';\nimport { useWindowedListData, WindowedListData } from '@deephaven/react-hooks';\nimport { KeyedItem } from '@deephaven/utils';\nimport Log from '@deephaven/log';\nimport useTableSize from './useTableSize';\n\nconst log = Log.module('useInitializeViewportData');\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 a WindowedListData object.\n */\nexport function useInitializeViewportData<T>(\n table: Table | TreeTable | null\n): WindowedListData<KeyedItem<T>> {\n const viewportData = useWindowedListData<KeyedItem<T>>({});\n\n // If the table changes size, we need to re-initialize it.\n const targetSize = Math.max(0, useTableSize(table));\n\n // Whenever the table reference or size changes, replace the list with empty\n // items. This is preferred over updating items in place to avoid the user\n // seeing items shift around multiple times.\n useEffect(() => {\n const currentSize = viewportData.items.length;\n\n if (targetSize !== currentSize) {\n log.debug('size changed:', { currentSize, targetSize });\n viewportData.setItems(\n Array.from(generateEmptyKeyedItems<T>(0, targetSize - 1))\n );\n }\n\n // Intentionally excluding viewportData since it changes on every render.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [targetSize, table]);\n\n return viewportData;\n}\n\nexport default useInitializeViewportData;\n"],"mappings":"AAAA,SAASA,SAAS,QAAQ,OAAO;AAEjC,SAASC,uBAAuB,QAAQ,wBAAwB;AAChE,SAASC,mBAAmB,QAA0B,wBAAwB;AAE9E,OAAOC,GAAG,MAAM,gBAAgB;AAAC,OAC1BC,YAAY;AAEnB,IAAMC,GAAG,GAAGF,GAAG,CAACG,MAAM,CAAC,2BAA2B,CAAC;;AAEnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,yBAAyBA,CACvCC,KAA+B,EACC;EAChC,IAAMC,YAAY,GAAGP,mBAAmB,CAAe,CAAC,CAAC,CAAC;;EAE1D;EACA,IAAMQ,UAAU,GAAGC,IAAI,CAACC,GAAG,CAAC,CAAC,EAAER,YAAY,CAACI,KAAK,CAAC,CAAC;;EAEnD;EACA;EACA;EACAR,SAAS,CAAC,MAAM;IACd,IAAMa,WAAW,GAAGJ,YAAY,CAACK,KAAK,CAACC,MAAM;IAE7C,IAAIL,UAAU,KAAKG,WAAW,EAAE;MAC9BR,GAAG,CAACW,KAAK,CAAC,eAAe,EAAE;QAAEH,WAAW;QAAEH;MAAW,CAAC,CAAC;MACvDD,YAAY,CAACQ,QAAQ,CACnBC,KAAK,CAACC,IAAI,CAAClB,uBAAuB,CAAI,CAAC,EAAES,UAAU,GAAG,CAAC,CAAC,CAC1D,CAAC;IACH;;IAEA;IACA;EACF,CAAC,EAAE,CAACA,UAAU,EAAEF,KAAK,CAAC,CAAC;EAEvB,OAAOC,YAAY;AACrB;AAEA,eAAeF,yBAAyB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useNotNullOrEmptyFilter.js","names":["useMemo","createFilterConditionFactory","createNotNullOrEmptyFilterCondition","useTableUtils","useNotNullOrEmptyFilter","columnNames","conditionOperator","tableUtils","notNullOrEmptyFilterCondition"],"sources":["../src/useNotNullOrEmptyFilter.ts"],"sourcesContent":["import { useMemo } from 'react';\nimport {\n createFilterConditionFactory,\n createNotNullOrEmptyFilterCondition,\n FilterConditionFactory,\n} from '@deephaven/jsapi-utils';\nimport useTableUtils from './useTableUtils';\n\nexport function useNotNullOrEmptyFilter(\n columnNames: string | string[],\n conditionOperator: 'and' | 'or' = 'or'\n): FilterConditionFactory {\n const tableUtils = useTableUtils();\n\n const notNullOrEmptyFilterCondition = useMemo(\n () => createNotNullOrEmptyFilterCondition(tableUtils),\n [tableUtils]\n );\n\n return useMemo(\n () =>\n createFilterConditionFactory(\n columnNames,\n notNullOrEmptyFilterCondition,\n conditionOperator\n ),\n [columnNames, conditionOperator, notNullOrEmptyFilterCondition]\n );\n}\n\nexport default useNotNullOrEmptyFilter;\n"],"mappings":"AAAA,SAASA,OAAO,QAAQ,OAAO;AAC/B,SACEC,4BAA4B,EAC5BC,mCAAmC,QAE9B,wBAAwB;AAAC,OACzBC,aAAa;AAEpB,OAAO,SAASC,
|
|
1
|
+
{"version":3,"file":"useNotNullOrEmptyFilter.js","names":["useMemo","createFilterConditionFactory","createNotNullOrEmptyFilterCondition","useTableUtils","useNotNullOrEmptyFilter","columnNames","conditionOperator","arguments","length","undefined","tableUtils","notNullOrEmptyFilterCondition"],"sources":["../src/useNotNullOrEmptyFilter.ts"],"sourcesContent":["import { useMemo } from 'react';\nimport {\n createFilterConditionFactory,\n createNotNullOrEmptyFilterCondition,\n FilterConditionFactory,\n} from '@deephaven/jsapi-utils';\nimport useTableUtils from './useTableUtils';\n\nexport function useNotNullOrEmptyFilter(\n columnNames: string | string[],\n conditionOperator: 'and' | 'or' = 'or'\n): FilterConditionFactory {\n const tableUtils = useTableUtils();\n\n const notNullOrEmptyFilterCondition = useMemo(\n () => createNotNullOrEmptyFilterCondition(tableUtils),\n [tableUtils]\n );\n\n return useMemo(\n () =>\n createFilterConditionFactory(\n columnNames,\n notNullOrEmptyFilterCondition,\n conditionOperator\n ),\n [columnNames, conditionOperator, notNullOrEmptyFilterCondition]\n );\n}\n\nexport default useNotNullOrEmptyFilter;\n"],"mappings":"AAAA,SAASA,OAAO,QAAQ,OAAO;AAC/B,SACEC,4BAA4B,EAC5BC,mCAAmC,QAE9B,wBAAwB;AAAC,OACzBC,aAAa;AAEpB,OAAO,SAASC,uBAAuBA,CACrCC,WAA8B,EAEN;EAAA,IADxBC,iBAA+B,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG,IAAI;EAEtC,IAAMG,UAAU,GAAGP,aAAa,CAAC,CAAC;EAElC,IAAMQ,6BAA6B,GAAGX,OAAO,CAC3C,MAAME,mCAAmC,CAACQ,UAAU,CAAC,EACrD,CAACA,UAAU,CACb,CAAC;EAED,OAAOV,OAAO,CACZ,MACEC,4BAA4B,CAC1BI,WAAW,EACXM,6BAA6B,EAC7BL,iBACF,CAAC,EACH,CAACD,WAAW,EAAEC,iBAAiB,EAAEK,6BAA6B,CAChE,CAAC;AACH;AAEA,eAAeP,uBAAuB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usePickerWithSelectedValues.js","names":["useCallback","useMemo","useState","createSearchTextFilter","createSelectedValuesFilter","useDebouncedCallback","usePromiseFactory","COMBO_BOX_ITEM_HEIGHT","SEARCH_DEBOUNCE_MS","VIEWPORT_PADDING","VIEWPORT_SIZE","useFilterConditionFactories","useViewportData","useViewportFilter","useTableUtils","useTableClose","usePickerWithSelectedValues","maybeTable","columnName","mapItemToValue","tableUtils","searchText","setSearchText","debouncedSearchText","setDebouncedSearchText","selectedKey","setSelectedKey","selectedValueMap","setSelectedValueMap","Map","data","valueExists","isLoading","valueExistsIsLoading","doesColumnValueExist","searchTextExists","searchTextFilter","excludeSelectedValuesFilter","Set","keys","filterConditionFactories","listTable","createDistinctSortedColumnTable","list","table","itemHeight","viewportSize","viewportPadding","hasSearchTextWithZeroResults","length","size","searchTextIsInSelectedValues","has","onDebouncedSearchTextChange","onSearchTextChange","text","setSelectedKeyOnNextFrame","onSelectKey","key","item","viewportData","findItem","value","prev","next","set","onAddValues","values","onRemoveValues","delete","filter"],"sources":["../src/usePickerWithSelectedValues.ts"],"sourcesContent":["import { Key, useCallback, useMemo, useState } from 'react';\nimport type { Table } from '@deephaven/jsapi-types';\nimport {\n createSearchTextFilter,\n createSelectedValuesFilter,\n FilterConditionFactory,\n} from '@deephaven/jsapi-utils';\nimport {\n useDebouncedCallback,\n usePromiseFactory,\n} from '@deephaven/react-hooks';\nimport {\n COMBO_BOX_ITEM_HEIGHT,\n KeyedItem,\n SEARCH_DEBOUNCE_MS,\n SelectionT,\n VIEWPORT_PADDING,\n VIEWPORT_SIZE,\n} from '@deephaven/utils';\nimport useFilterConditionFactories from './useFilterConditionFactories';\nimport useViewportData, { UseViewportDataResult } from './useViewportData';\nimport useViewportFilter from './useViewportFilter';\nimport useTableUtils from './useTableUtils';\nimport useTableClose from './useTableClose';\n\nexport interface UsePickerWithSelectedValuesResult<TItem, TValue> {\n list: UseViewportDataResult<TItem, Table>;\n hasSearchTextWithZeroResults: boolean;\n searchText: string;\n searchTextExists: boolean | null;\n searchTextIsInSelectedValues: boolean;\n selectedKey: Key | null;\n selectedValueMap: ReadonlyMap<TValue, { value: TValue }>;\n onSearchTextChange: (searchText: string) => void;\n onSelectKey: (key: Key | null) => void;\n onAddValues: (values: ReadonlySet<TValue>) => void;\n onRemoveValues: (values: SelectionT<TValue>) => void;\n}\n\n/**\n * Manages a list of available items that can be searched and selected. Selected\n * items are removed from the list and managed in a selectedValueMap data\n * structure. Useful for components that contain a picker but show selected\n * values in a separate component.\n * @param maybeTable\n * @param columnName\n * @param mapItemToValue\n * @param filterConditionFactories\n */\nexport function usePickerWithSelectedValues<TItem, TValue>(\n maybeTable: Table | null,\n columnName: string,\n mapItemToValue: (item: KeyedItem<TItem>) => TValue,\n ...filterConditionFactories: FilterConditionFactory[]\n): UsePickerWithSelectedValuesResult<TItem, TValue> {\n const tableUtils = useTableUtils();\n\n // `searchText` should always be up to date for controlled search input.\n // `debouncedSearchText` will get updated after a delay to avoid updating\n // filters on every key stroke.\n const [searchText, setSearchText] = useState('');\n const [debouncedSearchText, setDebouncedSearchText] = useState('');\n\n const [selectedKey, setSelectedKey] = useState<Key | null>(null);\n const [selectedValueMap, setSelectedValueMap] = useState<\n Map<TValue, { value: TValue }>\n >(() => new Map());\n\n const { data: valueExists, isLoading: valueExistsIsLoading } =\n usePromiseFactory(tableUtils.doesColumnValueExist, [\n maybeTable,\n columnName,\n debouncedSearchText,\n false /* isCaseSensitive */,\n ]);\n\n // If value exists check is still loading or if debounce hasn't completed, set\n // `searchTextExists` to null since it is indeterminate.\n const searchTextExists =\n valueExistsIsLoading || debouncedSearchText !== searchText\n ? null\n : valueExists;\n\n const searchTextFilter = useMemo(\n () => createSearchTextFilter(tableUtils, columnName, debouncedSearchText),\n [columnName, debouncedSearchText, tableUtils]\n );\n\n // Filter out selected values from the picker\n const excludeSelectedValuesFilter = useMemo(\n () =>\n createSelectedValuesFilter(\n tableUtils,\n columnName,\n new Set(selectedValueMap.keys()),\n false,\n true\n ),\n [columnName, selectedValueMap, tableUtils]\n );\n\n const { data: listTable } = usePromiseFactory(\n tableUtils.createDistinctSortedColumnTable,\n [maybeTable, columnName, 'asc', ...filterConditionFactories]\n );\n\n useTableClose(listTable);\n\n const list = useViewportData<TItem, Table>({\n table: listTable,\n itemHeight: COMBO_BOX_ITEM_HEIGHT,\n viewportSize: VIEWPORT_SIZE,\n viewportPadding: VIEWPORT_PADDING,\n });\n\n const hasSearchTextWithZeroResults = searchText.length > 0 && list.size === 0;\n const searchTextIsInSelectedValues = selectedValueMap.has(\n searchText as TValue\n );\n\n const onDebouncedSearchTextChange = useDebouncedCallback(\n setDebouncedSearchText,\n SEARCH_DEBOUNCE_MS\n );\n\n const onSearchTextChange = useCallback(\n (text: string) => {\n setSearchText(text);\n onDebouncedSearchTextChange(text);\n },\n [onDebouncedSearchTextChange]\n );\n\n const setSelectedKeyOnNextFrame = useDebouncedCallback(setSelectedKey, 0);\n\n const onSelectKey = useCallback(\n (key: Key | null) => {\n setSearchText('');\n setDebouncedSearchText('');\n\n // Set the selection temporarily to avoid the picker staying open\n setSelectedKey(key);\n\n // Clear the selection on next frame since selected items get removed from\n // the list and added to `selectedValues` Map\n setSelectedKeyOnNextFrame(null);\n\n // key will be null in scenarios where search text doesn't match an item\n // and user clicks outside of picker\n if (key == null) {\n return;\n }\n\n const item = list.viewportData.findItem(key);\n\n if (item == null) {\n return;\n }\n\n const value = mapItemToValue(item);\n\n setSelectedValueMap(prev => {\n const next = new Map(prev);\n next.set(value, { value });\n return next;\n });\n },\n [setSelectedKeyOnNextFrame, list.viewportData, mapItemToValue]\n );\n\n const onAddValues = useCallback((values: ReadonlySet<TValue>) => {\n setSelectedValueMap(prev => {\n if (values.size === 0) {\n return prev;\n }\n\n const next = new Map(prev);\n\n // eslint-disable-next-line no-restricted-syntax\n for (const value of values) {\n next.set(value, { value });\n }\n\n return next;\n });\n }, []);\n\n const onRemoveValues = useCallback((values: SelectionT<TValue>) => {\n setSelectedValueMap(prev => {\n if (values === 'all') {\n return new Map();\n }\n\n const next = new Map(prev);\n\n // eslint-disable-next-line no-restricted-syntax\n for (const value of values) {\n next.delete(value);\n }\n\n return next;\n });\n }, []);\n\n const filter = useFilterConditionFactories(\n list.table,\n searchTextFilter,\n excludeSelectedValuesFilter\n );\n\n useViewportFilter(list, filter);\n\n return useMemo(\n () => ({\n list,\n hasSearchTextWithZeroResults,\n searchText,\n searchTextExists,\n searchTextIsInSelectedValues,\n selectedKey,\n selectedValueMap,\n onSearchTextChange,\n onSelectKey,\n onAddValues,\n onRemoveValues,\n }),\n [\n hasSearchTextWithZeroResults,\n list,\n onAddValues,\n onRemoveValues,\n onSearchTextChange,\n onSelectKey,\n searchText,\n searchTextExists,\n searchTextIsInSelectedValues,\n selectedKey,\n selectedValueMap,\n ]\n );\n}\n\nexport default usePickerWithSelectedValues;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"usePickerWithSelectedValues.js","names":["useCallback","useMemo","useState","createSearchTextFilter","createSelectedValuesFilter","useDebouncedCallback","usePromiseFactory","COMBO_BOX_ITEM_HEIGHT","SEARCH_DEBOUNCE_MS","VIEWPORT_PADDING","VIEWPORT_SIZE","useFilterConditionFactories","useViewportData","useViewportFilter","useTableUtils","useTableClose","usePickerWithSelectedValues","maybeTable","columnName","mapItemToValue","tableUtils","searchText","setSearchText","debouncedSearchText","setDebouncedSearchText","selectedKey","setSelectedKey","selectedValueMap","setSelectedValueMap","Map","data","valueExists","isLoading","valueExistsIsLoading","doesColumnValueExist","searchTextExists","searchTextFilter","excludeSelectedValuesFilter","Set","keys","_len","arguments","length","filterConditionFactories","Array","_key","listTable","createDistinctSortedColumnTable","list","table","itemHeight","viewportSize","viewportPadding","hasSearchTextWithZeroResults","size","searchTextIsInSelectedValues","has","onDebouncedSearchTextChange","onSearchTextChange","text","setSelectedKeyOnNextFrame","onSelectKey","key","item","viewportData","findItem","value","prev","next","set","onAddValues","values","onRemoveValues","delete","filter"],"sources":["../src/usePickerWithSelectedValues.ts"],"sourcesContent":["import { Key, useCallback, useMemo, useState } from 'react';\nimport type { Table } from '@deephaven/jsapi-types';\nimport {\n createSearchTextFilter,\n createSelectedValuesFilter,\n FilterConditionFactory,\n} from '@deephaven/jsapi-utils';\nimport {\n useDebouncedCallback,\n usePromiseFactory,\n} from '@deephaven/react-hooks';\nimport {\n COMBO_BOX_ITEM_HEIGHT,\n KeyedItem,\n SEARCH_DEBOUNCE_MS,\n SelectionT,\n VIEWPORT_PADDING,\n VIEWPORT_SIZE,\n} from '@deephaven/utils';\nimport useFilterConditionFactories from './useFilterConditionFactories';\nimport useViewportData, { UseViewportDataResult } from './useViewportData';\nimport useViewportFilter from './useViewportFilter';\nimport useTableUtils from './useTableUtils';\nimport useTableClose from './useTableClose';\n\nexport interface UsePickerWithSelectedValuesResult<TItem, TValue> {\n list: UseViewportDataResult<TItem, Table>;\n hasSearchTextWithZeroResults: boolean;\n searchText: string;\n searchTextExists: boolean | null;\n searchTextIsInSelectedValues: boolean;\n selectedKey: Key | null;\n selectedValueMap: ReadonlyMap<TValue, { value: TValue }>;\n onSearchTextChange: (searchText: string) => void;\n onSelectKey: (key: Key | null) => void;\n onAddValues: (values: ReadonlySet<TValue>) => void;\n onRemoveValues: (values: SelectionT<TValue>) => void;\n}\n\n/**\n * Manages a list of available items that can be searched and selected. Selected\n * items are removed from the list and managed in a selectedValueMap data\n * structure. Useful for components that contain a picker but show selected\n * values in a separate component.\n * @param maybeTable\n * @param columnName\n * @param mapItemToValue\n * @param filterConditionFactories\n */\nexport function usePickerWithSelectedValues<TItem, TValue>(\n maybeTable: Table | null,\n columnName: string,\n mapItemToValue: (item: KeyedItem<TItem>) => TValue,\n ...filterConditionFactories: FilterConditionFactory[]\n): UsePickerWithSelectedValuesResult<TItem, TValue> {\n const tableUtils = useTableUtils();\n\n // `searchText` should always be up to date for controlled search input.\n // `debouncedSearchText` will get updated after a delay to avoid updating\n // filters on every key stroke.\n const [searchText, setSearchText] = useState('');\n const [debouncedSearchText, setDebouncedSearchText] = useState('');\n\n const [selectedKey, setSelectedKey] = useState<Key | null>(null);\n const [selectedValueMap, setSelectedValueMap] = useState<\n Map<TValue, { value: TValue }>\n >(() => new Map());\n\n const { data: valueExists, isLoading: valueExistsIsLoading } =\n usePromiseFactory(tableUtils.doesColumnValueExist, [\n maybeTable,\n columnName,\n debouncedSearchText,\n false /* isCaseSensitive */,\n ]);\n\n // If value exists check is still loading or if debounce hasn't completed, set\n // `searchTextExists` to null since it is indeterminate.\n const searchTextExists =\n valueExistsIsLoading || debouncedSearchText !== searchText\n ? null\n : valueExists;\n\n const searchTextFilter = useMemo(\n () => createSearchTextFilter(tableUtils, columnName, debouncedSearchText),\n [columnName, debouncedSearchText, tableUtils]\n );\n\n // Filter out selected values from the picker\n const excludeSelectedValuesFilter = useMemo(\n () =>\n createSelectedValuesFilter(\n tableUtils,\n columnName,\n new Set(selectedValueMap.keys()),\n false,\n true\n ),\n [columnName, selectedValueMap, tableUtils]\n );\n\n const { data: listTable } = usePromiseFactory(\n tableUtils.createDistinctSortedColumnTable,\n [maybeTable, columnName, 'asc', ...filterConditionFactories]\n );\n\n useTableClose(listTable);\n\n const list = useViewportData<TItem, Table>({\n table: listTable,\n itemHeight: COMBO_BOX_ITEM_HEIGHT,\n viewportSize: VIEWPORT_SIZE,\n viewportPadding: VIEWPORT_PADDING,\n });\n\n const hasSearchTextWithZeroResults = searchText.length > 0 && list.size === 0;\n const searchTextIsInSelectedValues = selectedValueMap.has(\n searchText as TValue\n );\n\n const onDebouncedSearchTextChange = useDebouncedCallback(\n setDebouncedSearchText,\n SEARCH_DEBOUNCE_MS\n );\n\n const onSearchTextChange = useCallback(\n (text: string) => {\n setSearchText(text);\n onDebouncedSearchTextChange(text);\n },\n [onDebouncedSearchTextChange]\n );\n\n const setSelectedKeyOnNextFrame = useDebouncedCallback(setSelectedKey, 0);\n\n const onSelectKey = useCallback(\n (key: Key | null) => {\n setSearchText('');\n setDebouncedSearchText('');\n\n // Set the selection temporarily to avoid the picker staying open\n setSelectedKey(key);\n\n // Clear the selection on next frame since selected items get removed from\n // the list and added to `selectedValues` Map\n setSelectedKeyOnNextFrame(null);\n\n // key will be null in scenarios where search text doesn't match an item\n // and user clicks outside of picker\n if (key == null) {\n return;\n }\n\n const item = list.viewportData.findItem(key);\n\n if (item == null) {\n return;\n }\n\n const value = mapItemToValue(item);\n\n setSelectedValueMap(prev => {\n const next = new Map(prev);\n next.set(value, { value });\n return next;\n });\n },\n [setSelectedKeyOnNextFrame, list.viewportData, mapItemToValue]\n );\n\n const onAddValues = useCallback((values: ReadonlySet<TValue>) => {\n setSelectedValueMap(prev => {\n if (values.size === 0) {\n return prev;\n }\n\n const next = new Map(prev);\n\n // eslint-disable-next-line no-restricted-syntax\n for (const value of values) {\n next.set(value, { value });\n }\n\n return next;\n });\n }, []);\n\n const onRemoveValues = useCallback((values: SelectionT<TValue>) => {\n setSelectedValueMap(prev => {\n if (values === 'all') {\n return new Map();\n }\n\n const next = new Map(prev);\n\n // eslint-disable-next-line no-restricted-syntax\n for (const value of values) {\n next.delete(value);\n }\n\n return next;\n });\n }, []);\n\n const filter = useFilterConditionFactories(\n list.table,\n searchTextFilter,\n excludeSelectedValuesFilter\n );\n\n useViewportFilter(list, filter);\n\n return useMemo(\n () => ({\n list,\n hasSearchTextWithZeroResults,\n searchText,\n searchTextExists,\n searchTextIsInSelectedValues,\n selectedKey,\n selectedValueMap,\n onSearchTextChange,\n onSelectKey,\n onAddValues,\n onRemoveValues,\n }),\n [\n hasSearchTextWithZeroResults,\n list,\n onAddValues,\n onRemoveValues,\n onSearchTextChange,\n onSelectKey,\n searchText,\n searchTextExists,\n searchTextIsInSelectedValues,\n selectedKey,\n selectedValueMap,\n ]\n );\n}\n\nexport default usePickerWithSelectedValues;\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useSearchableViewportData.js","names":["useMemo","useState","createSearchTextFilter","SEARCH_DEBOUNCE_MS","TABLE_ROW_HEIGHT","VIEWPORT_PADDING","VIEWPORT_SIZE","useDebouncedCallback","useTableUtils","useViewportData","useFilterConditionFactories","useViewportFilter","useSearchableViewportData","maybeTable","searchColumnNames","tableUtils","searchText","setSearchText","searchTextFilter","onSearchTextChange","list","table","itemHeight","viewportSize","viewportPadding","additionalFilterConditionFactories","filter"],"sources":["../src/useSearchableViewportData.ts"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport type { Table } from '@deephaven/jsapi-types';\nimport {\n createSearchTextFilter,\n FilterConditionFactory,\n} from '@deephaven/jsapi-utils';\nimport {\n SEARCH_DEBOUNCE_MS,\n TABLE_ROW_HEIGHT,\n VIEWPORT_PADDING,\n VIEWPORT_SIZE,\n} from '@deephaven/utils';\nimport { useDebouncedCallback } from '@deephaven/react-hooks';\nimport { useTableUtils } from './useTableUtils';\nimport useViewportData, { UseViewportDataResult } from './useViewportData';\nimport useFilterConditionFactories from './useFilterConditionFactories';\nimport useViewportFilter from './useViewportFilter';\n\nexport interface SearchableViewportData<TData> {\n list: UseViewportDataResult<TData, Table>;\n onSearchTextChange: (searchText: string) => void;\n}\n\n/**\n * Use a viewport data list with a search text filter. Supports additional filters.\n * @param maybeTable The table to use\n * @param searchColumnNames The column names to search\n * @param additionalFilterConditionFactories Additional filter condition factories\n */\nexport function useSearchableViewportData<TData>(\n maybeTable: Table | null,\n searchColumnNames: string | string[],\n ...additionalFilterConditionFactories: FilterConditionFactory[]\n): SearchableViewportData<TData> {\n const tableUtils = useTableUtils();\n\n const [searchText, setSearchText] = useState<string>('');\n\n const searchTextFilter = useMemo(\n () => createSearchTextFilter(tableUtils, searchColumnNames, searchText),\n [searchColumnNames, searchText, tableUtils]\n );\n\n const onSearchTextChange = useDebouncedCallback(\n setSearchText,\n SEARCH_DEBOUNCE_MS\n );\n\n const list = useViewportData<TData, Table>({\n table: maybeTable,\n itemHeight: TABLE_ROW_HEIGHT,\n viewportSize: VIEWPORT_SIZE,\n viewportPadding: VIEWPORT_PADDING,\n });\n\n const filter = useFilterConditionFactories(\n list.table,\n searchTextFilter,\n ...additionalFilterConditionFactories\n );\n\n useViewportFilter(list, filter);\n\n return {\n list,\n onSearchTextChange,\n };\n}\n\nexport default useSearchableViewportData;\n"],"mappings":"AAAA,SAASA,OAAO,EAAEC,QAAQ,QAAQ,OAAO;AAEzC,SACEC,sBAAsB,QAEjB,wBAAwB;AAC/B,SACEC,kBAAkB,EAClBC,gBAAgB,EAChBC,gBAAgB,EAChBC,aAAa,QACR,kBAAkB;AACzB,SAASC,oBAAoB,QAAQ,wBAAwB;AAAC,SACrDC,aAAa;AAAA,OACfC,eAAe;AAAA,OACfC,2BAA2B;AAAA,OAC3BC,iBAAiB;AAOxB;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,
|
|
1
|
+
{"version":3,"file":"useSearchableViewportData.js","names":["useMemo","useState","createSearchTextFilter","SEARCH_DEBOUNCE_MS","TABLE_ROW_HEIGHT","VIEWPORT_PADDING","VIEWPORT_SIZE","useDebouncedCallback","useTableUtils","useViewportData","useFilterConditionFactories","useViewportFilter","useSearchableViewportData","maybeTable","searchColumnNames","tableUtils","searchText","setSearchText","searchTextFilter","onSearchTextChange","list","table","itemHeight","viewportSize","viewportPadding","_len","arguments","length","additionalFilterConditionFactories","Array","_key","filter"],"sources":["../src/useSearchableViewportData.ts"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport type { Table } from '@deephaven/jsapi-types';\nimport {\n createSearchTextFilter,\n FilterConditionFactory,\n} from '@deephaven/jsapi-utils';\nimport {\n SEARCH_DEBOUNCE_MS,\n TABLE_ROW_HEIGHT,\n VIEWPORT_PADDING,\n VIEWPORT_SIZE,\n} from '@deephaven/utils';\nimport { useDebouncedCallback } from '@deephaven/react-hooks';\nimport { useTableUtils } from './useTableUtils';\nimport useViewportData, { UseViewportDataResult } from './useViewportData';\nimport useFilterConditionFactories from './useFilterConditionFactories';\nimport useViewportFilter from './useViewportFilter';\n\nexport interface SearchableViewportData<TData> {\n list: UseViewportDataResult<TData, Table>;\n onSearchTextChange: (searchText: string) => void;\n}\n\n/**\n * Use a viewport data list with a search text filter. Supports additional filters.\n * @param maybeTable The table to use\n * @param searchColumnNames The column names to search\n * @param additionalFilterConditionFactories Additional filter condition factories\n */\nexport function useSearchableViewportData<TData>(\n maybeTable: Table | null,\n searchColumnNames: string | string[],\n ...additionalFilterConditionFactories: FilterConditionFactory[]\n): SearchableViewportData<TData> {\n const tableUtils = useTableUtils();\n\n const [searchText, setSearchText] = useState<string>('');\n\n const searchTextFilter = useMemo(\n () => createSearchTextFilter(tableUtils, searchColumnNames, searchText),\n [searchColumnNames, searchText, tableUtils]\n );\n\n const onSearchTextChange = useDebouncedCallback(\n setSearchText,\n SEARCH_DEBOUNCE_MS\n );\n\n const list = useViewportData<TData, Table>({\n table: maybeTable,\n itemHeight: TABLE_ROW_HEIGHT,\n viewportSize: VIEWPORT_SIZE,\n viewportPadding: VIEWPORT_PADDING,\n });\n\n const filter = useFilterConditionFactories(\n list.table,\n searchTextFilter,\n ...additionalFilterConditionFactories\n );\n\n useViewportFilter(list, filter);\n\n return {\n list,\n onSearchTextChange,\n };\n}\n\nexport default useSearchableViewportData;\n"],"mappings":"AAAA,SAASA,OAAO,EAAEC,QAAQ,QAAQ,OAAO;AAEzC,SACEC,sBAAsB,QAEjB,wBAAwB;AAC/B,SACEC,kBAAkB,EAClBC,gBAAgB,EAChBC,gBAAgB,EAChBC,aAAa,QACR,kBAAkB;AACzB,SAASC,oBAAoB,QAAQ,wBAAwB;AAAC,SACrDC,aAAa;AAAA,OACfC,eAAe;AAAA,OACfC,2BAA2B;AAAA,OAC3BC,iBAAiB;AAOxB;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,yBAAyBA,CACvCC,UAAwB,EACxBC,iBAAoC,EAEL;EAC/B,IAAMC,UAAU,GAAGP,aAAa,CAAC,CAAC;EAElC,IAAM,CAACQ,UAAU,EAAEC,aAAa,CAAC,GAAGhB,QAAQ,CAAS,EAAE,CAAC;EAExD,IAAMiB,gBAAgB,GAAGlB,OAAO,CAC9B,MAAME,sBAAsB,CAACa,UAAU,EAAED,iBAAiB,EAAEE,UAAU,CAAC,EACvE,CAACF,iBAAiB,EAAEE,UAAU,EAAED,UAAU,CAC5C,CAAC;EAED,IAAMI,kBAAkB,GAAGZ,oBAAoB,CAC7CU,aAAa,EACbd,kBACF,CAAC;EAED,IAAMiB,IAAI,GAAGX,eAAe,CAAe;IACzCY,KAAK,EAAER,UAAU;IACjBS,UAAU,EAAElB,gBAAgB;IAC5BmB,YAAY,EAAEjB,aAAa;IAC3BkB,eAAe,EAAEnB;EACnB,CAAC,CAAC;EAAC,SAAAoB,IAAA,GAAAC,SAAA,CAAAC,MAAA,EArBAC,kCAAkC,OAAAC,KAAA,CAAAJ,IAAA,OAAAA,IAAA,WAAAK,IAAA,MAAAA,IAAA,GAAAL,IAAA,EAAAK,IAAA;IAAlCF,kCAAkC,CAAAE,IAAA,QAAAJ,SAAA,CAAAI,IAAA;EAAA;EAuBrC,IAAMC,MAAM,GAAGrB,2BAA2B,CACxCU,IAAI,CAACC,KAAK,EACVH,gBAAgB,EAChB,GAAGU,kCACL,CAAC;EAEDjB,iBAAiB,CAACS,IAAI,EAAEW,MAAM,CAAC;EAE/B,OAAO;IACLX,IAAI;IACJD;EACF,CAAC;AACH;AAEA,eAAeP,yBAAyB"}
|
|
@@ -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 type { Table, TreeTable } from '@deephaven/jsapi-types';\nimport { usePromiseFactory } from '@deephaven/react-hooks';\n\n/**\n * Return type of `useSelectDistinctTable` hook.\n */\nexport interface UseSelectDistinctTableResult {\n distinctTable: Table | null;\n error: string | Error | null;\n isError: boolean;\n isLoading: boolean;\n}\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): UseSelectDistinctTableResult {\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 {\n data: distinctTable,\n error,\n isError,\n isLoading,\n } = usePromiseFactory(selectDistinct, []);\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;;AAQA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,SAASC,
|
|
1
|
+
{"version":3,"file":"useSelectDistinctTable.js","names":["useCallback","useEffect","usePromiseFactory","useSelectDistinctTable","table","_len","arguments","length","columnNames","Array","_key","selectDistinct","_asyncToGenerator","_table$selectDistinct","findColumns","data","distinctTable","error","isError","isLoading","close"],"sources":["../src/useSelectDistinctTable.ts"],"sourcesContent":["import { useCallback, useEffect } from 'react';\nimport type { Table, TreeTable } from '@deephaven/jsapi-types';\nimport { usePromiseFactory } from '@deephaven/react-hooks';\n\n/**\n * Return type of `useSelectDistinctTable` hook.\n */\nexport interface UseSelectDistinctTableResult {\n distinctTable: Table | null;\n error: string | Error | null;\n isError: boolean;\n isLoading: boolean;\n}\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): UseSelectDistinctTableResult {\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 {\n data: distinctTable,\n error,\n isError,\n isLoading,\n } = usePromiseFactory(selectDistinct, []);\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;;AAQA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,SAASC,sBAAsBA,CAC5CC,KAA+B,EAED;EAAA,SAAAC,IAAA,GAAAC,SAAA,CAAAC,MAAA,EAD3BC,WAAW,OAAAC,KAAA,CAAAJ,IAAA,OAAAA,IAAA,WAAAK,IAAA,MAAAA,IAAA,GAAAL,IAAA,EAAAK,IAAA;IAAXF,WAAW,CAAAE,IAAA,QAAAJ,SAAA,CAAAI,IAAA;EAAA;EAEd,IAAMC,cAAc,GAAGX,WAAW,eAAAY,iBAAA,CAChC;IAAA,IAAAC,qBAAA;IAAA,QAAAA,qBAAA,GAAYT,KAAK,aAALA,KAAK,uBAALA,KAAK,CAAEO,cAAc,CAACP,KAAK,CAACU,WAAW,CAACN,WAAW,CAAC,CAAC,cAAAK,qBAAA,cAAAA,qBAAA,GAAI,IAAI;EAAA;EACzE;EACA;EACA,CAACT,KAAK,EAAE,GAAGI,WAAW,CACxB,CAAC;EAED,IAAM;IACJO,IAAI,EAAEC,aAAa;IACnBC,KAAK;IACLC,OAAO;IACPC;EACF,CAAC,GAAGjB,iBAAiB,CAACS,cAAc,EAAE,EAAE,CAAC;EAEzCV,SAAS,CACP,MAAM,MAAM;IACVe,aAAa,aAAbA,aAAa,uBAAbA,aAAa,CAAEI,KAAK,CAAC,CAAC;EACxB,CAAC,EACD,CAACJ,aAAa,CAChB,CAAC;EAED,OAAO;IAAEA,aAAa;IAAEC,KAAK;IAAEC,OAAO;IAAEC;EAAU,CAAC;AACrD"}
|
|
@@ -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 type { 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 function useSetPaddedViewportCallback(\n table: Table | TreeTable | null,\n viewportSize: number,\n viewportPadding: number\n): (firstRow: number) => void {\n return useCallback(\n function setPaddedViewport(firstRow: number) {\n const [first, last] = padFirstAndLastRow(\n firstRow,\n viewportSize,\n viewportPadding,\n getSize(table)\n );\n\n table?.setViewport(first, last);\n },\n [table, viewportPadding, viewportSize]\n );\n}\n\nexport default useSetPaddedViewportCallback;\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,OAAO,SAASC,
|
|
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 type { 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 function useSetPaddedViewportCallback(\n table: Table | TreeTable | null,\n viewportSize: number,\n viewportPadding: number\n): (firstRow: number) => void {\n return useCallback(\n function setPaddedViewport(firstRow: number) {\n const [first, last] = padFirstAndLastRow(\n firstRow,\n viewportSize,\n viewportPadding,\n getSize(table)\n );\n\n table?.setViewport(first, last);\n },\n [table, viewportPadding, viewportSize]\n );\n}\n\nexport default useSetPaddedViewportCallback;\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,OAAO,SAASC,4BAA4BA,CAC1CC,KAA+B,EAC/BC,YAAoB,EACpBC,eAAuB,EACK;EAC5B,OAAON,WAAW,CAChB,SAASO,iBAAiBA,CAACC,QAAgB,EAAE;IAC3C,IAAM,CAACC,KAAK,EAAEC,IAAI,CAAC,GAAGR,kBAAkB,CACtCM,QAAQ,EACRH,YAAY,EACZC,eAAe,EACfL,OAAO,CAACG,KAAK,CACf,CAAC;IAEDA,KAAK,aAALA,KAAK,uBAALA,KAAK,CAAEO,WAAW,CAACF,KAAK,EAAEC,IAAI,CAAC;EACjC,CAAC,EACD,CAACN,KAAK,EAAEE,eAAe,EAAED,YAAY,CACvC,CAAC;AACH;AAEA,eAAeF,4BAA4B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useShowOnlyEmptyFilter.js","names":["useMemo","createFilterConditionFactory","createShowOnlyEmptyFilterCondition","useTableUtils","useShowOnlyEmptyFilter","isOn","columnNames","tableUtils","createColumnCondition"],"sources":["../src/useShowOnlyEmptyFilter.ts"],"sourcesContent":["import { useMemo } from 'react';\nimport {\n createFilterConditionFactory,\n createShowOnlyEmptyFilterCondition,\n FilterConditionFactory,\n} from '@deephaven/jsapi-utils';\nimport useTableUtils from './useTableUtils';\n\n/**\n * Creates a filter condition factory that can be toggle on or off. If on, the\n * filter will match only values that are null or empty strings. If off, the\n * filter will match all values.\n * @param isOn Whether the filter is on or off\n * @param columnNames Column names to filter\n */\nexport function useShowOnlyEmptyFilter(\n isOn: boolean,\n columnNames: string | string[]\n): FilterConditionFactory {\n const tableUtils = useTableUtils();\n\n const createColumnCondition = useMemo(\n () => createShowOnlyEmptyFilterCondition(tableUtils, isOn),\n [isOn, tableUtils]\n );\n\n return useMemo(\n () => createFilterConditionFactory(columnNames, createColumnCondition),\n [columnNames, createColumnCondition]\n );\n}\n\nexport default useShowOnlyEmptyFilter;\n"],"mappings":"AAAA,SAASA,OAAO,QAAQ,OAAO;AAC/B,SACEC,4BAA4B,EAC5BC,kCAAkC,QAE7B,wBAAwB;AAAC,OACzBC,aAAa;AAEpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,
|
|
1
|
+
{"version":3,"file":"useShowOnlyEmptyFilter.js","names":["useMemo","createFilterConditionFactory","createShowOnlyEmptyFilterCondition","useTableUtils","useShowOnlyEmptyFilter","isOn","columnNames","tableUtils","createColumnCondition"],"sources":["../src/useShowOnlyEmptyFilter.ts"],"sourcesContent":["import { useMemo } from 'react';\nimport {\n createFilterConditionFactory,\n createShowOnlyEmptyFilterCondition,\n FilterConditionFactory,\n} from '@deephaven/jsapi-utils';\nimport useTableUtils from './useTableUtils';\n\n/**\n * Creates a filter condition factory that can be toggle on or off. If on, the\n * filter will match only values that are null or empty strings. If off, the\n * filter will match all values.\n * @param isOn Whether the filter is on or off\n * @param columnNames Column names to filter\n */\nexport function useShowOnlyEmptyFilter(\n isOn: boolean,\n columnNames: string | string[]\n): FilterConditionFactory {\n const tableUtils = useTableUtils();\n\n const createColumnCondition = useMemo(\n () => createShowOnlyEmptyFilterCondition(tableUtils, isOn),\n [isOn, tableUtils]\n );\n\n return useMemo(\n () => createFilterConditionFactory(columnNames, createColumnCondition),\n [columnNames, createColumnCondition]\n );\n}\n\nexport default useShowOnlyEmptyFilter;\n"],"mappings":"AAAA,SAASA,OAAO,QAAQ,OAAO;AAC/B,SACEC,4BAA4B,EAC5BC,kCAAkC,QAE7B,wBAAwB;AAAC,OACzBC,aAAa;AAEpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,sBAAsBA,CACpCC,IAAa,EACbC,WAA8B,EACN;EACxB,IAAMC,UAAU,GAAGJ,aAAa,CAAC,CAAC;EAElC,IAAMK,qBAAqB,GAAGR,OAAO,CACnC,MAAME,kCAAkC,CAACK,UAAU,EAAEF,IAAI,CAAC,EAC1D,CAACA,IAAI,EAAEE,UAAU,CACnB,CAAC;EAED,OAAOP,OAAO,CACZ,MAAMC,4BAA4B,CAACK,WAAW,EAAEE,qBAAqB,CAAC,EACtE,CAACF,WAAW,EAAEE,qBAAqB,CACrC,CAAC;AACH;AAEA,eAAeJ,sBAAsB"}
|
package/dist/useTable.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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 type { 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":"AAAA,SAASA,WAAW,EAAEC,SAAS,EAAEC,QAAQ,QAAQ,OAAO;AACxD,SAASC,MAAM,QAAQ,4BAA4B;AAEnD,OAAOC,GAAG,MAAM,gBAAgB;AAAC,OAC1BC,gBAAgB;AAAA,OAChBC,eAAe;AAAA,OACfC,oBAAoB;AAE3B,IAAMC,GAAG,GAAGJ,GAAG,CAACK,MAAM,CAAC,UAAU,CAAC;AAElC,IAAMC,QAAQ,
|
|
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","_ref","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 type { 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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useTableClose.js","names":["useEffect","isClosed","useTableClose","table","close"],"sources":["../src/useTableClose.ts"],"sourcesContent":["import { useEffect } from 'react';\nimport type { Table, TreeTable } from '@deephaven/jsapi-types';\nimport { isClosed } from '@deephaven/jsapi-utils';\n\n/**\n * React hook that closes a given table when the reference changes or when the\n * component unmounts.\n * @param table\n */\nexport default function useTableClose(\n table: Table | TreeTable | null | undefined\n): void {\n useEffect(\n () => () => {\n if (table == null) {\n return;\n }\n\n if (!isClosed(table)) {\n table.close();\n }\n },\n [table]\n );\n}\n"],"mappings":"AAAA,SAASA,SAAS,QAAQ,OAAO;AAEjC,SAASC,QAAQ,QAAQ,wBAAwB;;AAEjD;AACA;AACA;AACA;AACA;AACA,eAAe,SAASC,
|
|
1
|
+
{"version":3,"file":"useTableClose.js","names":["useEffect","isClosed","useTableClose","table","close"],"sources":["../src/useTableClose.ts"],"sourcesContent":["import { useEffect } from 'react';\nimport type { Table, TreeTable } from '@deephaven/jsapi-types';\nimport { isClosed } from '@deephaven/jsapi-utils';\n\n/**\n * React hook that closes a given table when the reference changes or when the\n * component unmounts.\n * @param table\n */\nexport default function useTableClose(\n table: Table | TreeTable | null | undefined\n): void {\n useEffect(\n () => () => {\n if (table == null) {\n return;\n }\n\n if (!isClosed(table)) {\n table.close();\n }\n },\n [table]\n );\n}\n"],"mappings":"AAAA,SAASA,SAAS,QAAQ,OAAO;AAEjC,SAASC,QAAQ,QAAQ,wBAAwB;;AAEjD;AACA;AACA;AACA;AACA;AACA,eAAe,SAASC,aAAaA,CACnCC,KAA2C,EACrC;EACNH,SAAS,CACP,MAAM,MAAM;IACV,IAAIG,KAAK,IAAI,IAAI,EAAE;MACjB;IACF;IAEA,IAAI,CAACF,QAAQ,CAACE,KAAK,CAAC,EAAE;MACpBA,KAAK,CAACC,KAAK,CAAC,CAAC;IACf;EACF,CAAC,EACD,CAACD,KAAK,CACR,CAAC;AACH"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useTableColumn.js","names":["useMemo","useTable","useTableColumn","table","firstRow","lastRow","columnName","columnNames","columns","data","error","column"],"sources":["../src/useTableColumn.ts"],"sourcesContent":["import { useMemo } from 'react';\nimport type { Column, Table } from '@deephaven/jsapi-types';\nimport useTable from './useTable';\n\n/**\n * Subscribe to viewport updates on a single table column\n * @param table Table to get the data from\n * @param firstRow First viewport row\n * @param lastRow Last viewport row\n * @param columnName Column to get the data from\n * @returns Column object, data array for the column, error, setViewport method\n */\nconst useTableColumn = (\n table: Table | undefined,\n firstRow: number,\n lastRow: number,\n columnName: string\n): {\n column: Column | undefined;\n data: unknown[];\n error: Error | null;\n} => {\n const columnNames = useMemo(() => [columnName], [columnName]);\n const {\n columns = [],\n data = [],\n error,\n } = useTable(table, firstRow, lastRow, columnNames);\n return {\n column: columns[0],\n data: data[0],\n error,\n };\n};\n\nexport default useTableColumn;\n"],"mappings":"AAAA,SAASA,OAAO,QAAQ,OAAO;AAAC,OAEzBC,QAAQ;AAEf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAMC,cAAc,
|
|
1
|
+
{"version":3,"file":"useTableColumn.js","names":["useMemo","useTable","useTableColumn","table","firstRow","lastRow","columnName","columnNames","columns","data","error","column"],"sources":["../src/useTableColumn.ts"],"sourcesContent":["import { useMemo } from 'react';\nimport type { Column, Table } from '@deephaven/jsapi-types';\nimport useTable from './useTable';\n\n/**\n * Subscribe to viewport updates on a single table column\n * @param table Table to get the data from\n * @param firstRow First viewport row\n * @param lastRow Last viewport row\n * @param columnName Column to get the data from\n * @returns Column object, data array for the column, error, setViewport method\n */\nconst useTableColumn = (\n table: Table | undefined,\n firstRow: number,\n lastRow: number,\n columnName: string\n): {\n column: Column | undefined;\n data: unknown[];\n error: Error | null;\n} => {\n const columnNames = useMemo(() => [columnName], [columnName]);\n const {\n columns = [],\n data = [],\n error,\n } = useTable(table, firstRow, lastRow, columnNames);\n return {\n column: columns[0],\n data: data[0],\n error,\n };\n};\n\nexport default useTableColumn;\n"],"mappings":"AAAA,SAASA,OAAO,QAAQ,OAAO;AAAC,OAEzBC,QAAQ;AAEf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAMC,cAAc,GAAGA,CACrBC,KAAwB,EACxBC,QAAgB,EAChBC,OAAe,EACfC,UAAkB,KAKf;EACH,IAAMC,WAAW,GAAGP,OAAO,CAAC,MAAM,CAACM,UAAU,CAAC,EAAE,CAACA,UAAU,CAAC,CAAC;EAC7D,IAAM;IACJE,OAAO,GAAG,EAAE;IACZC,IAAI,GAAG,EAAE;IACTC;EACF,CAAC,GAAGT,QAAQ,CAACE,KAAK,EAAEC,QAAQ,EAAEC,OAAO,EAAEE,WAAW,CAAC;EACnD,OAAO;IACLI,MAAM,EAAEH,OAAO,CAAC,CAAC,CAAC;IAClBC,IAAI,EAAEA,IAAI,CAAC,CAAC,CAAC;IACbC;EACF,CAAC;AACH,CAAC;AAED,eAAeR,cAAc"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useTableListener.js","names":["useEffect","Log","log","module","useTableListener","eventEmitter","eventName","callback","initEventEmitter","debug2","addEventListener"],"sources":["../src/useTableListener.ts"],"sourcesContent":["import { useEffect } from 'react';\nimport type { Evented, EventListener } from '@deephaven/jsapi-types';\nimport Log from '@deephaven/log';\n\nconst log = Log.module('useTableListener');\n\nexport const useTableListener = (\n eventEmitter: Evented | undefined | null,\n eventName: string,\n callback: EventListener\n): void =>\n useEffect(\n function initEventEmitter() {\n if (eventEmitter == null) {\n log.debug2('Emitter undefined, skipping addEventListener', eventName);\n return;\n }\n log.debug2('Adding listener', eventName);\n return eventEmitter.addEventListener(eventName, callback);\n },\n [eventEmitter, eventName, callback]\n );\n\nexport default useTableListener;\n"],"mappings":"AAAA,SAASA,SAAS,QAAQ,OAAO;AAEjC,OAAOC,GAAG,MAAM,gBAAgB;AAEhC,IAAMC,GAAG,GAAGD,GAAG,CAACE,MAAM,CAAC,kBAAkB,CAAC;AAE1C,OAAO,IAAMC,gBAAgB,
|
|
1
|
+
{"version":3,"file":"useTableListener.js","names":["useEffect","Log","log","module","useTableListener","eventEmitter","eventName","callback","initEventEmitter","debug2","addEventListener"],"sources":["../src/useTableListener.ts"],"sourcesContent":["import { useEffect } from 'react';\nimport type { Evented, EventListener } from '@deephaven/jsapi-types';\nimport Log from '@deephaven/log';\n\nconst log = Log.module('useTableListener');\n\nexport const useTableListener = (\n eventEmitter: Evented | undefined | null,\n eventName: string,\n callback: EventListener\n): void =>\n useEffect(\n function initEventEmitter() {\n if (eventEmitter == null) {\n log.debug2('Emitter undefined, skipping addEventListener', eventName);\n return;\n }\n log.debug2('Adding listener', eventName);\n return eventEmitter.addEventListener(eventName, callback);\n },\n [eventEmitter, eventName, callback]\n );\n\nexport default useTableListener;\n"],"mappings":"AAAA,SAASA,SAAS,QAAQ,OAAO;AAEjC,OAAOC,GAAG,MAAM,gBAAgB;AAEhC,IAAMC,GAAG,GAAGD,GAAG,CAACE,MAAM,CAAC,kBAAkB,CAAC;AAE1C,OAAO,IAAMC,gBAAgB,GAAGA,CAC9BC,YAAwC,EACxCC,SAAiB,EACjBC,QAAuB,KAEvBP,SAAS,CACP,SAASQ,gBAAgBA,CAAA,EAAG;EAC1B,IAAIH,YAAY,IAAI,IAAI,EAAE;IACxBH,GAAG,CAACO,MAAM,CAAC,8CAA8C,EAAEH,SAAS,CAAC;IACrE;EACF;EACAJ,GAAG,CAACO,MAAM,CAAC,iBAAiB,EAAEH,SAAS,CAAC;EACxC,OAAOD,YAAY,CAACK,gBAAgB,CAACJ,SAAS,EAAEC,QAAQ,CAAC;AAC3D,CAAC,EACD,CAACF,YAAY,EAAEC,SAAS,EAAEC,QAAQ,CACpC,CAAC;AAEH,eAAeH,gBAAgB"}
|
package/dist/useTableSize.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useTableSize.js","names":["useState","useApi","getSize","useTableListener","useTableSize","table","forceRerender","dh","Table","EVENT_SIZECHANGED","i"],"sources":["../src/useTableSize.ts"],"sourcesContent":["import { useState } from 'react';\nimport { useApi } from '@deephaven/jsapi-bootstrap';\nimport type { Table, TreeTable } from '@deephaven/jsapi-types';\nimport { getSize } from '@deephaven/jsapi-utils';\nimport useTableListener from './useTableListener';\n\n/**\n * React hook that returns the size of a given table or zero if table is null or\n * undefined. The hook subscribes to the dh.Table.EVENT_SIZECHANGED event and\n * triggers a re-render if any events are received to ensure we have the current\n * size.\n * @param table The table to check the size on.\n */\nexport function useTableSize(\n table: Table | TreeTable | null | undefined\n): number {\n const [, forceRerender] = useState(0);\n\n const dh = useApi();\n\n useTableListener(table, dh.Table.EVENT_SIZECHANGED, () => {\n forceRerender(i => i + 1);\n });\n\n return getSize(table);\n}\n\nexport default useTableSize;\n"],"mappings":"AAAA,SAASA,QAAQ,QAAQ,OAAO;AAChC,SAASC,MAAM,QAAQ,4BAA4B;AAEnD,SAASC,OAAO,QAAQ,wBAAwB;AAAC,OAC1CC,gBAAgB;AAEvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,
|
|
1
|
+
{"version":3,"file":"useTableSize.js","names":["useState","useApi","getSize","useTableListener","useTableSize","table","forceRerender","dh","Table","EVENT_SIZECHANGED","i"],"sources":["../src/useTableSize.ts"],"sourcesContent":["import { useState } from 'react';\nimport { useApi } from '@deephaven/jsapi-bootstrap';\nimport type { Table, TreeTable } from '@deephaven/jsapi-types';\nimport { getSize } from '@deephaven/jsapi-utils';\nimport useTableListener from './useTableListener';\n\n/**\n * React hook that returns the size of a given table or zero if table is null or\n * undefined. The hook subscribes to the dh.Table.EVENT_SIZECHANGED event and\n * triggers a re-render if any events are received to ensure we have the current\n * size.\n * @param table The table to check the size on.\n */\nexport function useTableSize(\n table: Table | TreeTable | null | undefined\n): number {\n const [, forceRerender] = useState(0);\n\n const dh = useApi();\n\n useTableListener(table, dh.Table.EVENT_SIZECHANGED, () => {\n forceRerender(i => i + 1);\n });\n\n return getSize(table);\n}\n\nexport default useTableSize;\n"],"mappings":"AAAA,SAASA,QAAQ,QAAQ,OAAO;AAChC,SAASC,MAAM,QAAQ,4BAA4B;AAEnD,SAASC,OAAO,QAAQ,wBAAwB;AAAC,OAC1CC,gBAAgB;AAEvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,YAAYA,CAC1BC,KAA2C,EACnC;EACR,IAAM,GAAGC,aAAa,CAAC,GAAGN,QAAQ,CAAC,CAAC,CAAC;EAErC,IAAMO,EAAE,GAAGN,MAAM,CAAC,CAAC;EAEnBE,gBAAgB,CAACE,KAAK,EAAEE,EAAE,CAACC,KAAK,CAACC,iBAAiB,EAAE,MAAM;IACxDH,aAAa,CAACI,CAAC,IAAIA,CAAC,GAAG,CAAC,CAAC;EAC3B,CAAC,CAAC;EAEF,OAAOR,OAAO,CAACG,KAAK,CAAC;AACvB;AAEA,eAAeD,YAAY"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useTableUtils.js","names":["useMemo","useApi","TableUtils","useTableUtils","dh"],"sources":["../src/useTableUtils.ts"],"sourcesContent":["import { useMemo } from 'react';\nimport { useApi } from '@deephaven/jsapi-bootstrap';\nimport { TableUtils } from '@deephaven/jsapi-utils';\n\n/**\n * Get a `TableUtils` instance using `dh` api from the current context.\n */\nexport function useTableUtils(): TableUtils {\n const dh = useApi();\n return useMemo(() => new TableUtils(dh), [dh]);\n}\n\nexport default useTableUtils;\n"],"mappings":"AAAA,SAASA,OAAO,QAAQ,OAAO;AAC/B,SAASC,MAAM,QAAQ,4BAA4B;AACnD,SAASC,UAAU,QAAQ,wBAAwB;;AAEnD;AACA;AACA;AACA,OAAO,SAASC,
|
|
1
|
+
{"version":3,"file":"useTableUtils.js","names":["useMemo","useApi","TableUtils","useTableUtils","dh"],"sources":["../src/useTableUtils.ts"],"sourcesContent":["import { useMemo } from 'react';\nimport { useApi } from '@deephaven/jsapi-bootstrap';\nimport { TableUtils } from '@deephaven/jsapi-utils';\n\n/**\n * Get a `TableUtils` instance using `dh` api from the current context.\n */\nexport function useTableUtils(): TableUtils {\n const dh = useApi();\n return useMemo(() => new TableUtils(dh), [dh]);\n}\n\nexport default useTableUtils;\n"],"mappings":"AAAA,SAASA,OAAO,QAAQ,OAAO;AAC/B,SAASC,MAAM,QAAQ,4BAA4B;AACnD,SAASC,UAAU,QAAQ,wBAAwB;;AAEnD;AACA;AACA;AACA,OAAO,SAASC,aAAaA,CAAA,EAAe;EAC1C,IAAMC,EAAE,GAAGH,MAAM,CAAC,CAAC;EACnB,OAAOD,OAAO,CAAC,MAAM,IAAIE,UAAU,CAACE,EAAE,CAAC,EAAE,CAACA,EAAE,CAAC,CAAC;AAChD;AAEA,eAAeD,aAAa"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useValueFilter.js","names":["useMemo","createValueFilter","useTableUtils","useValueFilter","columnNames","value","operator","tableUtils"],"sources":["../src/useValueFilter.ts"],"sourcesContent":["import { useMemo } from 'react';\nimport {\n createValueFilter,\n FilterConditionFactory,\n} from '@deephaven/jsapi-utils';\nimport useTableUtils from './useTableUtils';\n\n/**\n * Create a filter condition factory for a filter operator that matches the given value.\n * @param columnNames Column names to compare value to\n * @param value Value to match\n * @param operator Operator to use for matching\n */\nexport function useValueFilter(\n columnNames: string | string[],\n value: string,\n operator: 'contains' | 'eq' | 'notEq'\n): FilterConditionFactory {\n const tableUtils = useTableUtils();\n\n return useMemo(\n () => createValueFilter(tableUtils, columnNames, value, operator),\n [columnNames, operator, tableUtils, value]\n );\n}\n\nexport default useValueFilter;\n"],"mappings":"AAAA,SAASA,OAAO,QAAQ,OAAO;AAC/B,SACEC,iBAAiB,QAEZ,wBAAwB;AAAC,OACzBC,aAAa;AAEpB;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,
|
|
1
|
+
{"version":3,"file":"useValueFilter.js","names":["useMemo","createValueFilter","useTableUtils","useValueFilter","columnNames","value","operator","tableUtils"],"sources":["../src/useValueFilter.ts"],"sourcesContent":["import { useMemo } from 'react';\nimport {\n createValueFilter,\n FilterConditionFactory,\n} from '@deephaven/jsapi-utils';\nimport useTableUtils from './useTableUtils';\n\n/**\n * Create a filter condition factory for a filter operator that matches the given value.\n * @param columnNames Column names to compare value to\n * @param value Value to match\n * @param operator Operator to use for matching\n */\nexport function useValueFilter(\n columnNames: string | string[],\n value: string,\n operator: 'contains' | 'eq' | 'notEq'\n): FilterConditionFactory {\n const tableUtils = useTableUtils();\n\n return useMemo(\n () => createValueFilter(tableUtils, columnNames, value, operator),\n [columnNames, operator, tableUtils, value]\n );\n}\n\nexport default useValueFilter;\n"],"mappings":"AAAA,SAASA,OAAO,QAAQ,OAAO;AAC/B,SACEC,iBAAiB,QAEZ,wBAAwB;AAAC,OACzBC,aAAa;AAEpB;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,cAAcA,CAC5BC,WAA8B,EAC9BC,KAAa,EACbC,QAAqC,EACb;EACxB,IAAMC,UAAU,GAAGL,aAAa,CAAC,CAAC;EAElC,OAAOF,OAAO,CACZ,MAAMC,iBAAiB,CAACM,UAAU,EAAEH,WAAW,EAAEC,KAAK,EAAEC,QAAQ,CAAC,EACjE,CAACF,WAAW,EAAEE,QAAQ,EAAEC,UAAU,EAAEF,KAAK,CAC3C,CAAC;AACH;AAEA,eAAeF,cAAc"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useViewportData.js","names":["useCallback","useEffect","useMemo","defaultRowDeserializer","isClosed","createOnTableUpdatedHandler","Log","useApi","useOnScrollOffsetChangeCallback","SCROLL_DEBOUNCE_MS","useInitializeViewportData","useSetPaddedViewportCallback","useTableSize","useTableListener","log","module","useViewportData","table","itemHeight","scrollDebounce","viewportSize","viewportPadding","deserializeRow","viewportData","setPaddedViewport","setViewport","firstRow","debug","applyFiltersAndRefresh","filters","applyFilter","dh","onTableUpdated","Table","EVENT_UPDATED","size","onScroll"],"sources":["../src/useViewportData.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo } from 'react';\nimport type { FilterCondition, Table, TreeTable } from '@deephaven/jsapi-types';\nimport {\n RowDeserializer,\n defaultRowDeserializer,\n isClosed,\n createOnTableUpdatedHandler,\n} from '@deephaven/jsapi-utils';\nimport Log from '@deephaven/log';\nimport { useApi } from '@deephaven/jsapi-bootstrap';\nimport {\n useOnScrollOffsetChangeCallback,\n WindowedListData,\n} from '@deephaven/react-hooks';\nimport { KeyedItem, SCROLL_DEBOUNCE_MS } from '@deephaven/utils';\nimport useInitializeViewportData from './useInitializeViewportData';\nimport useSetPaddedViewportCallback from './useSetPaddedViewportCallback';\nimport useTableSize from './useTableSize';\nimport useTableListener from './useTableListener';\n\nconst log = Log.module('useViewportData');\n\nexport interface UseViewportDataProps<TItem, TTable extends Table | TreeTable> {\n table: TTable | null;\n itemHeight?: number;\n scrollDebounce?: number;\n viewportSize?: number;\n viewportPadding?: number;\n deserializeRow?: RowDeserializer<TItem>;\n}\n\nexport interface UseViewportDataResult<\n TItem,\n TTable extends Table | TreeTable,\n> {\n /** Manages deserialized row items associated with a DH Table */\n viewportData: WindowedListData<KeyedItem<TItem>>;\n /** Size of the underlying Table */\n size: number;\n\n table: TTable | null;\n /** Apply filters and refresh viewport. */\n applyFiltersAndRefresh: (filters: FilterCondition[]) => void;\n /** Set the viewport of the Table */\n setViewport: (firstRow: number) => void;\n /** Handler for scroll events to update viewport */\n onScroll: (event: Event) => 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 itemHeight\n * @param viewportSize\n * @param viewportPadding\n * @returns An object for managing Table viewport state.\n */\nexport function useViewportData<TItem, TTable extends Table | TreeTable>({\n table,\n itemHeight = 1,\n scrollDebounce = SCROLL_DEBOUNCE_MS,\n viewportSize = 10,\n viewportPadding = 50,\n deserializeRow = defaultRowDeserializer,\n}: UseViewportDataProps<TItem, TTable>): UseViewportDataResult<TItem, TTable> {\n const viewportData = useInitializeViewportData<TItem>(table);\n\n const setPaddedViewport = useSetPaddedViewportCallback(\n table,\n viewportSize,\n viewportPadding\n );\n\n const setViewport = useCallback(\n (firstRow: number) => {\n if (table && !isClosed(table)) {\n setPaddedViewport(firstRow);\n } else {\n log.debug('setViewport called on closed table.', table);\n }\n },\n [table, setPaddedViewport]\n );\n\n const applyFiltersAndRefresh = useCallback(\n (filters: FilterCondition[]) => {\n if (table && !isClosed(table)) {\n table.applyFilter(filters);\n setViewport(0);\n } else {\n log.debug('applyFiltersAndRefresh called on closed table.', table);\n }\n },\n [setViewport, table]\n );\n\n const dh = useApi();\n\n const onTableUpdated = useMemo(\n () => createOnTableUpdatedHandler(viewportData, deserializeRow),\n [deserializeRow, viewportData]\n );\n\n useTableListener(table, dh.Table.EVENT_UPDATED, onTableUpdated);\n\n const size = useTableSize(table);\n\n useEffect(() => {\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 }, [table, setViewport, size]);\n\n const onScroll = useOnScrollOffsetChangeCallback(\n itemHeight,\n setViewport,\n scrollDebounce\n );\n\n return useMemo(\n () => ({\n viewportData,\n size,\n table,\n applyFiltersAndRefresh,\n setViewport,\n onScroll,\n }),\n [applyFiltersAndRefresh, onScroll, setViewport, size, table, viewportData]\n );\n}\n\nexport default useViewportData;\n"],"mappings":"AAAA,SAASA,WAAW,EAAEC,SAAS,EAAEC,OAAO,QAAQ,OAAO;AAEvD,SAEEC,sBAAsB,EACtBC,QAAQ,EACRC,2BAA2B,QACtB,wBAAwB;AAC/B,OAAOC,GAAG,MAAM,gBAAgB;AAChC,SAASC,MAAM,QAAQ,4BAA4B;AACnD,SACEC,+BAA+B,QAE1B,wBAAwB;AAC/B,SAAoBC,kBAAkB,QAAQ,kBAAkB;AAAC,OAC1DC,yBAAyB;AAAA,OACzBC,4BAA4B;AAAA,OAC5BC,YAAY;AAAA,OACZC,gBAAgB;AAEvB,IAAMC,GAAG,GAAGR,GAAG,CAACS,MAAM,CAAC,iBAAiB,CAAC;AA6BzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,
|
|
1
|
+
{"version":3,"file":"useViewportData.js","names":["useCallback","useEffect","useMemo","defaultRowDeserializer","isClosed","createOnTableUpdatedHandler","Log","useApi","useOnScrollOffsetChangeCallback","SCROLL_DEBOUNCE_MS","useInitializeViewportData","useSetPaddedViewportCallback","useTableSize","useTableListener","log","module","useViewportData","_ref","table","itemHeight","scrollDebounce","viewportSize","viewportPadding","deserializeRow","viewportData","setPaddedViewport","setViewport","firstRow","debug","applyFiltersAndRefresh","filters","applyFilter","dh","onTableUpdated","Table","EVENT_UPDATED","size","onScroll"],"sources":["../src/useViewportData.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo } from 'react';\nimport type { FilterCondition, Table, TreeTable } from '@deephaven/jsapi-types';\nimport {\n RowDeserializer,\n defaultRowDeserializer,\n isClosed,\n createOnTableUpdatedHandler,\n} from '@deephaven/jsapi-utils';\nimport Log from '@deephaven/log';\nimport { useApi } from '@deephaven/jsapi-bootstrap';\nimport {\n useOnScrollOffsetChangeCallback,\n WindowedListData,\n} from '@deephaven/react-hooks';\nimport { KeyedItem, SCROLL_DEBOUNCE_MS } from '@deephaven/utils';\nimport useInitializeViewportData from './useInitializeViewportData';\nimport useSetPaddedViewportCallback from './useSetPaddedViewportCallback';\nimport useTableSize from './useTableSize';\nimport useTableListener from './useTableListener';\n\nconst log = Log.module('useViewportData');\n\nexport interface UseViewportDataProps<TItem, TTable extends Table | TreeTable> {\n table: TTable | null;\n itemHeight?: number;\n scrollDebounce?: number;\n viewportSize?: number;\n viewportPadding?: number;\n deserializeRow?: RowDeserializer<TItem>;\n}\n\nexport interface UseViewportDataResult<\n TItem,\n TTable extends Table | TreeTable,\n> {\n /** Manages deserialized row items associated with a DH Table */\n viewportData: WindowedListData<KeyedItem<TItem>>;\n /** Size of the underlying Table */\n size: number;\n\n table: TTable | null;\n /** Apply filters and refresh viewport. */\n applyFiltersAndRefresh: (filters: FilterCondition[]) => void;\n /** Set the viewport of the Table */\n setViewport: (firstRow: number) => void;\n /** Handler for scroll events to update viewport */\n onScroll: (event: Event) => 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 itemHeight\n * @param viewportSize\n * @param viewportPadding\n * @returns An object for managing Table viewport state.\n */\nexport function useViewportData<TItem, TTable extends Table | TreeTable>({\n table,\n itemHeight = 1,\n scrollDebounce = SCROLL_DEBOUNCE_MS,\n viewportSize = 10,\n viewportPadding = 50,\n deserializeRow = defaultRowDeserializer,\n}: UseViewportDataProps<TItem, TTable>): UseViewportDataResult<TItem, TTable> {\n const viewportData = useInitializeViewportData<TItem>(table);\n\n const setPaddedViewport = useSetPaddedViewportCallback(\n table,\n viewportSize,\n viewportPadding\n );\n\n const setViewport = useCallback(\n (firstRow: number) => {\n if (table && !isClosed(table)) {\n setPaddedViewport(firstRow);\n } else {\n log.debug('setViewport called on closed table.', table);\n }\n },\n [table, setPaddedViewport]\n );\n\n const applyFiltersAndRefresh = useCallback(\n (filters: FilterCondition[]) => {\n if (table && !isClosed(table)) {\n table.applyFilter(filters);\n setViewport(0);\n } else {\n log.debug('applyFiltersAndRefresh called on closed table.', table);\n }\n },\n [setViewport, table]\n );\n\n const dh = useApi();\n\n const onTableUpdated = useMemo(\n () => createOnTableUpdatedHandler(viewportData, deserializeRow),\n [deserializeRow, viewportData]\n );\n\n useTableListener(table, dh.Table.EVENT_UPDATED, onTableUpdated);\n\n const size = useTableSize(table);\n\n useEffect(() => {\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 }, [table, setViewport, size]);\n\n const onScroll = useOnScrollOffsetChangeCallback(\n itemHeight,\n setViewport,\n scrollDebounce\n );\n\n return useMemo(\n () => ({\n viewportData,\n size,\n table,\n applyFiltersAndRefresh,\n setViewport,\n onScroll,\n }),\n [applyFiltersAndRefresh, onScroll, setViewport, size, table, viewportData]\n );\n}\n\nexport default useViewportData;\n"],"mappings":"AAAA,SAASA,WAAW,EAAEC,SAAS,EAAEC,OAAO,QAAQ,OAAO;AAEvD,SAEEC,sBAAsB,EACtBC,QAAQ,EACRC,2BAA2B,QACtB,wBAAwB;AAC/B,OAAOC,GAAG,MAAM,gBAAgB;AAChC,SAASC,MAAM,QAAQ,4BAA4B;AACnD,SACEC,+BAA+B,QAE1B,wBAAwB;AAC/B,SAAoBC,kBAAkB,QAAQ,kBAAkB;AAAC,OAC1DC,yBAAyB;AAAA,OACzBC,4BAA4B;AAAA,OAC5BC,YAAY;AAAA,OACZC,gBAAgB;AAEvB,IAAMC,GAAG,GAAGR,GAAG,CAACS,MAAM,CAAC,iBAAiB,CAAC;AA6BzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,eAAeA,CAAAC,IAAA,EAO+C;EAAA,IAPL;IACvEC,KAAK;IACLC,UAAU,GAAG,CAAC;IACdC,cAAc,GAAGX,kBAAkB;IACnCY,YAAY,GAAG,EAAE;IACjBC,eAAe,GAAG,EAAE;IACpBC,cAAc,GAAGpB;EACkB,CAAC,GAAAc,IAAA;EACpC,IAAMO,YAAY,GAAGd,yBAAyB,CAAQQ,KAAK,CAAC;EAE5D,IAAMO,iBAAiB,GAAGd,4BAA4B,CACpDO,KAAK,EACLG,YAAY,EACZC,eACF,CAAC;EAED,IAAMI,WAAW,GAAG1B,WAAW,CAC5B2B,QAAgB,IAAK;IACpB,IAAIT,KAAK,IAAI,CAACd,QAAQ,CAACc,KAAK,CAAC,EAAE;MAC7BO,iBAAiB,CAACE,QAAQ,CAAC;IAC7B,CAAC,MAAM;MACLb,GAAG,CAACc,KAAK,CAAC,qCAAqC,EAAEV,KAAK,CAAC;IACzD;EACF,CAAC,EACD,CAACA,KAAK,EAAEO,iBAAiB,CAC3B,CAAC;EAED,IAAMI,sBAAsB,GAAG7B,WAAW,CACvC8B,OAA0B,IAAK;IAC9B,IAAIZ,KAAK,IAAI,CAACd,QAAQ,CAACc,KAAK,CAAC,EAAE;MAC7BA,KAAK,CAACa,WAAW,CAACD,OAAO,CAAC;MAC1BJ,WAAW,CAAC,CAAC,CAAC;IAChB,CAAC,MAAM;MACLZ,GAAG,CAACc,KAAK,CAAC,gDAAgD,EAAEV,KAAK,CAAC;IACpE;EACF,CAAC,EACD,CAACQ,WAAW,EAAER,KAAK,CACrB,CAAC;EAED,IAAMc,EAAE,GAAGzB,MAAM,CAAC,CAAC;EAEnB,IAAM0B,cAAc,GAAG/B,OAAO,CAC5B,MAAMG,2BAA2B,CAACmB,YAAY,EAAED,cAAc,CAAC,EAC/D,CAACA,cAAc,EAAEC,YAAY,CAC/B,CAAC;EAEDX,gBAAgB,CAACK,KAAK,EAAEc,EAAE,CAACE,KAAK,CAACC,aAAa,EAAEF,cAAc,CAAC;EAE/D,IAAMG,IAAI,GAAGxB,YAAY,CAACM,KAAK,CAAC;EAEhCjB,SAAS,CAAC,MAAM;IACd;IACA;IACAyB,WAAW,CAAC,CAAC,CAAC;EAChB,CAAC,EAAE,CAACR,KAAK,EAAEQ,WAAW,EAAEU,IAAI,CAAC,CAAC;EAE9B,IAAMC,QAAQ,GAAG7B,+BAA+B,CAC9CW,UAAU,EACVO,WAAW,EACXN,cACF,CAAC;EAED,OAAOlB,OAAO,CACZ,OAAO;IACLsB,YAAY;IACZY,IAAI;IACJlB,KAAK;IACLW,sBAAsB;IACtBH,WAAW;IACXW;EACF,CAAC,CAAC,EACF,CAACR,sBAAsB,EAAEQ,QAAQ,EAAEX,WAAW,EAAEU,IAAI,EAAElB,KAAK,EAAEM,YAAY,CAC3E,CAAC;AACH;AAEA,eAAeR,eAAe"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useViewportFilter.js","names":["useEffect","useViewportFilter","viewportData","filter","applyFiltersAndRefresh"],"sources":["../src/useViewportFilter.ts"],"sourcesContent":["import { useEffect } from 'react';\nimport type { FilterCondition, Table } from '@deephaven/jsapi-types';\nimport { UseViewportDataResult } from './useViewportData';\n\n/**\n * Applies a filter to a viewport.\n * @param viewportData Viewport to filter\n * @param filter Filter to apply\n */\nexport function useViewportFilter<TItem>(\n viewportData: UseViewportDataResult<TItem, Table>,\n filter: FilterCondition[]\n): void {\n const { applyFiltersAndRefresh } = viewportData;\n\n useEffect(() => {\n applyFiltersAndRefresh(filter);\n }, [applyFiltersAndRefresh, filter]);\n}\n\nexport default useViewportFilter;\n"],"mappings":"AAAA,SAASA,SAAS,QAAQ,OAAO;AAIjC;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,
|
|
1
|
+
{"version":3,"file":"useViewportFilter.js","names":["useEffect","useViewportFilter","viewportData","filter","applyFiltersAndRefresh"],"sources":["../src/useViewportFilter.ts"],"sourcesContent":["import { useEffect } from 'react';\nimport type { FilterCondition, Table } from '@deephaven/jsapi-types';\nimport { UseViewportDataResult } from './useViewportData';\n\n/**\n * Applies a filter to a viewport.\n * @param viewportData Viewport to filter\n * @param filter Filter to apply\n */\nexport function useViewportFilter<TItem>(\n viewportData: UseViewportDataResult<TItem, Table>,\n filter: FilterCondition[]\n): void {\n const { applyFiltersAndRefresh } = viewportData;\n\n useEffect(() => {\n applyFiltersAndRefresh(filter);\n }, [applyFiltersAndRefresh, filter]);\n}\n\nexport default useViewportFilter;\n"],"mappings":"AAAA,SAASA,SAAS,QAAQ,OAAO;AAIjC;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,iBAAiBA,CAC/BC,YAAiD,EACjDC,MAAyB,EACnB;EACN,IAAM;IAAEC;EAAuB,CAAC,GAAGF,YAAY;EAE/CF,SAAS,CAAC,MAAM;IACdI,sBAAsB,CAACD,MAAM,CAAC;EAChC,CAAC,EAAE,CAACC,sBAAsB,EAAED,MAAM,CAAC,CAAC;AACtC;AAEA,eAAeF,iBAAiB"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@deephaven/jsapi-components",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.51.1-beta.0+54f7cc5d",
|
|
4
4
|
"description": "Deephaven JSAPI Components",
|
|
5
5
|
"author": "Deephaven Data Labs LLC",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -22,13 +22,13 @@
|
|
|
22
22
|
"build:sass": "sass --embed-sources --load-path=../../node_modules ./src:./dist"
|
|
23
23
|
},
|
|
24
24
|
"dependencies": {
|
|
25
|
-
"@deephaven/components": "^0.
|
|
26
|
-
"@deephaven/jsapi-bootstrap": "^0.
|
|
27
|
-
"@deephaven/jsapi-types": "^0.
|
|
28
|
-
"@deephaven/jsapi-utils": "^0.
|
|
29
|
-
"@deephaven/log": "^0.
|
|
30
|
-
"@deephaven/react-hooks": "^0.
|
|
31
|
-
"@deephaven/utils": "^0.
|
|
25
|
+
"@deephaven/components": "^0.51.1-beta.0+54f7cc5d",
|
|
26
|
+
"@deephaven/jsapi-bootstrap": "^0.51.1-beta.0+54f7cc5d",
|
|
27
|
+
"@deephaven/jsapi-types": "^0.51.1-beta.0+54f7cc5d",
|
|
28
|
+
"@deephaven/jsapi-utils": "^0.51.1-beta.0+54f7cc5d",
|
|
29
|
+
"@deephaven/log": "^0.51.1-beta.0+54f7cc5d",
|
|
30
|
+
"@deephaven/react-hooks": "^0.51.1-beta.0+54f7cc5d",
|
|
31
|
+
"@deephaven/utils": "^0.51.1-beta.0+54f7cc5d",
|
|
32
32
|
"@types/js-cookie": "^3.0.3",
|
|
33
33
|
"classnames": "^2.3.2",
|
|
34
34
|
"js-cookie": "^3.0.5",
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
"prop-types": "^15.8.1"
|
|
37
37
|
},
|
|
38
38
|
"devDependencies": {
|
|
39
|
-
"@deephaven/jsapi-shim": "^0.
|
|
39
|
+
"@deephaven/jsapi-shim": "^0.51.1-beta.0+54f7cc5d",
|
|
40
40
|
"react-test-renderer": "^17.0.2"
|
|
41
41
|
},
|
|
42
42
|
"peerDependencies": {
|
|
@@ -51,5 +51,5 @@
|
|
|
51
51
|
"publishConfig": {
|
|
52
52
|
"access": "public"
|
|
53
53
|
},
|
|
54
|
-
"gitHead": "
|
|
54
|
+
"gitHead": "54f7cc5d08a9c1a390b2e89a9fb84fe1018008eb"
|
|
55
55
|
}
|