@vuu-ui/vuu-table-extras 2.1.19 → 2.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -23,12 +23,12 @@ const DataSourceStats = ({
23
23
  css: DatasourceStats,
24
24
  window: targetWindow
25
25
  });
26
- const { range, selectedCount, size } = useDatasourceStats.useDatasourceStats({
26
+ const { maxScroll, range, selectedCount, size } = useDatasourceStats.useDatasourceStats({
27
27
  dataSource,
28
28
  showRowStats
29
29
  });
30
30
  const from = numberFormatter.format(range.from + 1);
31
- const to = numberFormatter.format(Math.min(range.to, size));
31
+ const to = numberFormatter.format(Math.min(range.to, size, maxScroll));
32
32
  const value = numberFormatter.format(size);
33
33
  if (size === 0) {
34
34
  return /* @__PURE__ */ jsxRuntime.jsx("div", { ...htmlAttributes, className: cx(classBase, className), children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: `${classBase}-label`, children: "No Rows to display" }) });
@@ -1 +1 @@
1
- {"version":3,"file":"DatasourceStats.js","sources":["../../../../../../../packages/vuu-table-extras/src/datasource-stats/DatasourceStats.tsx"],"sourcesContent":["import cx from \"clsx\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { HTMLAttributes, ReactNode } from \"react\";\nimport {\n DatasourceStatsHookProps,\n useDatasourceStats,\n} from \"./useDatasourceStats\";\n\nimport dataSourceStats from \"./DatasourceStats.css\";\n\nexport type ItemLabel =\n | string\n | {\n singlular: string;\n plural: string;\n };\n\nexport interface DataSourceStatsProps\n extends DatasourceStatsHookProps,\n Omit<HTMLAttributes<HTMLDivElement>, \"children\"> {\n /**\n * children will be displayed when selection present. Intended\n * use case is display of action button(s) that will operate on\n * selected rows.\n */\n children?: ReactNode;\n selectionActions?: ReactNode;\n tooltrayActions?: ReactNode;\n}\n\nconst classBase = \"vuuDatasourceStats\";\n\nconst numberFormatter = new Intl.NumberFormat();\n\nexport const DataSourceStats = ({\n children,\n className,\n dataSource,\n showRowStats = true,\n tooltrayActions,\n ...htmlAttributes\n}: DataSourceStatsProps) => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-datasource-stats\",\n css: dataSourceStats,\n window: targetWindow,\n });\n\n const { range, selectedCount, size } = useDatasourceStats({\n dataSource,\n showRowStats,\n });\n\n const from = numberFormatter.format(range.from + 1);\n const to = numberFormatter.format(Math.min(range.to, size));\n const value = numberFormatter.format(size);\n\n if (size === 0) {\n return (\n <div {...htmlAttributes} className={cx(classBase, className)}>\n <span className={`${classBase}-label`}>No Rows to display</span>\n </div>\n );\n } else {\n return (\n <div\n {...htmlAttributes}\n className={cx(classBase, className, {\n [`${classBase}-withSelection`]: selectedCount > 0,\n })}\n >\n {showRowStats ? (\n <div className={`${classBase}-statsPanel ${classBase}-rowStats`}>\n <span className={`${classBase}-label`}>Row count</span>\n <span className={`${classBase}-range`}>\n <span className={`${classBase}-value`}>{from}</span>\n <span className={`${classBase}-label`}>-</span>\n <span className={`${classBase}-value`}>{to}</span>\n </span>\n <span className={`${classBase}-label`}>of</span>\n <span className={`${classBase}-value`}>{value}</span>\n {selectedCount > 0 ? (\n <span\n className={cx(`${classBase}-label`, `${classBase}-selected`)}\n >{`${selectedCount.toLocaleString()} selected`}</span>\n ) : null}\n </div>\n ) : null}\n {selectedCount > 0 ? (\n <div\n className={`${classBase}-statsPanel ${classBase}-selectionActions`}\n >\n {children}\n </div>\n ) : null}\n {tooltrayActions ? (\n <div className={`${classBase}-statsPanel ${classBase}-tooltray`}>\n <span className={`${classBase}-actions`}>{tooltrayActions}</span>\n </div>\n ) : null}\n </div>\n );\n }\n};\n"],"names":["useWindow","useComponentCssInjection","dataSourceStats","useDatasourceStats","jsx","jsxs"],"mappings":"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"}
1
+ {"version":3,"file":"DatasourceStats.js","sources":["../../../../../../../packages/vuu-table-extras/src/datasource-stats/DatasourceStats.tsx"],"sourcesContent":["import cx from \"clsx\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { HTMLAttributes, ReactNode } from \"react\";\nimport {\n DatasourceStatsHookProps,\n useDatasourceStats,\n} from \"./useDatasourceStats\";\n\nimport dataSourceStats from \"./DatasourceStats.css\";\n\nexport type ItemLabel =\n | string\n | {\n singlular: string;\n plural: string;\n };\n\nexport interface DataSourceStatsProps\n extends DatasourceStatsHookProps,\n Omit<HTMLAttributes<HTMLDivElement>, \"children\"> {\n /**\n * children will be displayed when selection present. Intended\n * use case is display of action button(s) that will operate on\n * selected rows.\n */\n children?: ReactNode;\n selectionActions?: ReactNode;\n tooltrayActions?: ReactNode;\n}\n\nconst classBase = \"vuuDatasourceStats\";\n\nconst numberFormatter = new Intl.NumberFormat();\n\nexport const DataSourceStats = ({\n children,\n className,\n dataSource,\n showRowStats = true,\n tooltrayActions,\n ...htmlAttributes\n}: DataSourceStatsProps) => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-datasource-stats\",\n css: dataSourceStats,\n window: targetWindow,\n });\n\n const { maxScroll, range, selectedCount, size } = useDatasourceStats({\n dataSource,\n showRowStats,\n });\n\n const from = numberFormatter.format(range.from + 1);\n const to = numberFormatter.format(Math.min(range.to, size, maxScroll));\n const value = numberFormatter.format(size);\n\n if (size === 0) {\n return (\n <div {...htmlAttributes} className={cx(classBase, className)}>\n <span className={`${classBase}-label`}>No Rows to display</span>\n </div>\n );\n } else {\n return (\n <div\n {...htmlAttributes}\n className={cx(classBase, className, {\n [`${classBase}-withSelection`]: selectedCount > 0,\n })}\n >\n {showRowStats ? (\n <div className={`${classBase}-statsPanel ${classBase}-rowStats`}>\n <span className={`${classBase}-label`}>Row count</span>\n <span className={`${classBase}-range`}>\n <span className={`${classBase}-value`}>{from}</span>\n <span className={`${classBase}-label`}>-</span>\n <span className={`${classBase}-value`}>{to}</span>\n </span>\n <span className={`${classBase}-label`}>of</span>\n <span className={`${classBase}-value`}>{value}</span>\n {selectedCount > 0 ? (\n <span\n className={cx(`${classBase}-label`, `${classBase}-selected`)}\n >{`${selectedCount.toLocaleString()} selected`}</span>\n ) : null}\n </div>\n ) : null}\n {selectedCount > 0 ? (\n <div\n className={`${classBase}-statsPanel ${classBase}-selectionActions`}\n >\n {children}\n </div>\n ) : null}\n {tooltrayActions ? (\n <div className={`${classBase}-statsPanel ${classBase}-tooltray`}>\n <span className={`${classBase}-actions`}>{tooltrayActions}</span>\n </div>\n ) : null}\n </div>\n );\n }\n};\n"],"names":["useWindow","useComponentCssInjection","dataSourceStats","useDatasourceStats","jsx","jsxs"],"mappings":"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"}
@@ -17,6 +17,7 @@ const useDatasourceStats = ({
17
17
  const [selectedCount, setSelectedCount] = react.useState(0);
18
18
  const [range, setRange] = react.useState(dataSource.range);
19
19
  const [size, setSize] = react.useState(dataSource.size);
20
+ const [maxRangeEnd, setMaxRangeEnd] = react.useState(dataSource.maxRangeEnd ?? Number.MAX_SAFE_INTEGER);
20
21
  const [freezeTime, setFreezeTime] = react.useState(
21
22
  formatTime(dataSource.freezeTimestamp)
22
23
  );
@@ -33,8 +34,11 @@ const useDatasourceStats = ({
33
34
  const handleRowSelection = react.useCallback((count) => {
34
35
  setSelectedCount(count);
35
36
  }, []);
36
- const handleSize = react.useCallback((size2) => {
37
+ const handleSize = react.useCallback((size2, maxRangeEnd2 = Number.MAX_SAFE_INTEGER) => {
37
38
  setSize(size2);
39
+ if (maxRangeEnd2 !== Number.MAX_SAFE_INTEGER) {
40
+ setMaxRangeEnd(maxRangeEnd2);
41
+ }
38
42
  }, []);
39
43
  react.useMemo(() => {
40
44
  setSize(dataSource.size);
@@ -53,7 +57,8 @@ const useDatasourceStats = ({
53
57
  range,
54
58
  selectedCount,
55
59
  size,
56
- freezeTime
60
+ freezeTime,
61
+ maxScroll: maxRangeEnd
57
62
  };
58
63
  };
59
64
 
@@ -1 +1 @@
1
- {"version":3,"file":"useDatasourceStats.js","sources":["../../../../../../../packages/vuu-table-extras/src/datasource-stats/useDatasourceStats.ts"],"sourcesContent":["import { DataSource, RowSelectionEventHandler } from \"@vuu-ui/vuu-data-types\";\nimport { formatDate, Range } from \"@vuu-ui/vuu-utils\";\nimport { useCallback, useMemo, useState } from \"react\";\n\nexport interface DatasourceStatsHookProps {\n dataSource: DataSource;\n showFreezeStatus?: boolean;\n showRowStats?: boolean;\n showSelectionStats?: boolean;\n}\n\nconst timeFormatter = formatDate({ time: \"hh:mm:ss\" });\n\nconst formatTime = (ts: number | undefined) => {\n if (typeof ts === \"number\") {\n return timeFormatter(new Date(ts));\n } else {\n return undefined;\n }\n};\n\nexport const useDatasourceStats = ({\n dataSource,\n}: DatasourceStatsHookProps) => {\n const [selectedCount, setSelectedCount] = useState(0);\n const [range, setRange] = useState<Range>(dataSource.range);\n const [size, setSize] = useState(dataSource.size);\n const [freezeTime, setFreezeTime] = useState(\n formatTime(dataSource.freezeTimestamp),\n );\n\n const handleFreeze = useCallback(\n (isFrozen: boolean, freezeTimestamp: number) => {\n if (isFrozen) {\n setFreezeTime(formatTime(freezeTimestamp));\n } else {\n setFreezeTime(undefined);\n }\n },\n [],\n );\n\n const handleRowSelection = useCallback<RowSelectionEventHandler>((count) => {\n setSelectedCount(count);\n }, []);\n\n const handleSize = useCallback((size: number) => {\n setSize(size);\n }, []);\n\n useMemo(() => {\n setSize(dataSource.size);\n dataSource.on(\"resize\", handleSize);\n dataSource.on(\"range\", setRange);\n dataSource.on(\"freeze\", handleFreeze);\n dataSource.on(\"row-selection\", handleRowSelection);\n return () => {\n dataSource.removeListener(\"resize\", handleSize);\n dataSource.removeListener(\"range\", setRange);\n dataSource.removeListener(\"freeze\", handleFreeze);\n dataSource.removeListener(\"row-selection\", handleRowSelection);\n };\n }, [dataSource, handleFreeze, handleRowSelection, handleSize]);\n\n return {\n range,\n selectedCount,\n size,\n freezeTime,\n };\n};\n"],"names":["formatDate","useState","useCallback","size","useMemo"],"mappings":";;;;;AAWA,MAAM,aAAgB,GAAAA,mBAAA,CAAW,EAAE,IAAA,EAAM,YAAY,CAAA;AAErD,MAAM,UAAA,GAAa,CAAC,EAA2B,KAAA;AAC7C,EAAI,IAAA,OAAO,OAAO,QAAU,EAAA;AAC1B,IAAA,OAAO,aAAc,CAAA,IAAI,IAAK,CAAA,EAAE,CAAC,CAAA;AAAA,GAC5B,MAAA;AACL,IAAO,OAAA,KAAA,CAAA;AAAA;AAEX,CAAA;AAEO,MAAM,qBAAqB,CAAC;AAAA,EACjC;AACF,CAAgC,KAAA;AAC9B,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIC,eAAS,CAAC,CAAA;AACpD,EAAA,MAAM,CAAC,KAAO,EAAA,QAAQ,CAAI,GAAAA,cAAA,CAAgB,WAAW,KAAK,CAAA;AAC1D,EAAA,MAAM,CAAC,IAAM,EAAA,OAAO,CAAI,GAAAA,cAAA,CAAS,WAAW,IAAI,CAAA;AAChD,EAAM,MAAA,CAAC,UAAY,EAAA,aAAa,CAAI,GAAAA,cAAA;AAAA,IAClC,UAAA,CAAW,WAAW,eAAe;AAAA,GACvC;AAEA,EAAA,MAAM,YAAe,GAAAC,iBAAA;AAAA,IACnB,CAAC,UAAmB,eAA4B,KAAA;AAC9C,MAAA,IAAI,QAAU,EAAA;AACZ,QAAc,aAAA,CAAA,UAAA,CAAW,eAAe,CAAC,CAAA;AAAA,OACpC,MAAA;AACL,QAAA,aAAA,CAAc,KAAS,CAAA,CAAA;AAAA;AACzB,KACF;AAAA,IACA;AAAC,GACH;AAEA,EAAM,MAAA,kBAAA,GAAqBA,iBAAsC,CAAA,CAAC,KAAU,KAAA;AAC1E,IAAA,gBAAA,CAAiB,KAAK,CAAA;AAAA,GACxB,EAAG,EAAE,CAAA;AAEL,EAAM,MAAA,UAAA,GAAaA,iBAAY,CAAA,CAACC,KAAiB,KAAA;AAC/C,IAAA,OAAA,CAAQA,KAAI,CAAA;AAAA,GACd,EAAG,EAAE,CAAA;AAEL,EAAAC,aAAA,CAAQ,MAAM;AACZ,IAAA,OAAA,CAAQ,WAAW,IAAI,CAAA;AACvB,IAAW,UAAA,CAAA,EAAA,CAAG,UAAU,UAAU,CAAA;AAClC,IAAW,UAAA,CAAA,EAAA,CAAG,SAAS,QAAQ,CAAA;AAC/B,IAAW,UAAA,CAAA,EAAA,CAAG,UAAU,YAAY,CAAA;AACpC,IAAW,UAAA,CAAA,EAAA,CAAG,iBAAiB,kBAAkB,CAAA;AACjD,IAAA,OAAO,MAAM;AACX,MAAW,UAAA,CAAA,cAAA,CAAe,UAAU,UAAU,CAAA;AAC9C,MAAW,UAAA,CAAA,cAAA,CAAe,SAAS,QAAQ,CAAA;AAC3C,MAAW,UAAA,CAAA,cAAA,CAAe,UAAU,YAAY,CAAA;AAChD,MAAW,UAAA,CAAA,cAAA,CAAe,iBAAiB,kBAAkB,CAAA;AAAA,KAC/D;AAAA,KACC,CAAC,UAAA,EAAY,YAAc,EAAA,kBAAA,EAAoB,UAAU,CAAC,CAAA;AAE7D,EAAO,OAAA;AAAA,IACL,KAAA;AAAA,IACA,aAAA;AAAA,IACA,IAAA;AAAA,IACA;AAAA,GACF;AACF;;;;"}
1
+ {"version":3,"file":"useDatasourceStats.js","sources":["../../../../../../../packages/vuu-table-extras/src/datasource-stats/useDatasourceStats.ts"],"sourcesContent":["import { DataSource, RowSelectionEventHandler } from \"@vuu-ui/vuu-data-types\";\nimport { formatDate, Range } from \"@vuu-ui/vuu-utils\";\nimport { useCallback, useMemo, useState } from \"react\";\n\nexport interface DatasourceStatsHookProps {\n dataSource: DataSource;\n showFreezeStatus?: boolean;\n showRowStats?: boolean;\n showSelectionStats?: boolean;\n}\n\nconst timeFormatter = formatDate({ time: \"hh:mm:ss\" });\n\nconst formatTime = (ts: number | undefined) => {\n if (typeof ts === \"number\") {\n return timeFormatter(new Date(ts));\n } else {\n return undefined;\n }\n};\n\nexport const useDatasourceStats = ({\n dataSource,\n}: DatasourceStatsHookProps) => {\n const [selectedCount, setSelectedCount] = useState(0);\n const [range, setRange] = useState<Range>(dataSource.range);\n const [size, setSize] = useState(dataSource.size);\n const [maxRangeEnd, setMaxRangeEnd] = useState(dataSource.maxRangeEnd ?? Number.MAX_SAFE_INTEGER);\n const [freezeTime, setFreezeTime] = useState(\n formatTime(dataSource.freezeTimestamp),\n );\n\n const handleFreeze = useCallback(\n (isFrozen: boolean, freezeTimestamp: number) => {\n if (isFrozen) {\n setFreezeTime(formatTime(freezeTimestamp));\n } else {\n setFreezeTime(undefined);\n }\n },\n [],\n );\n\n const handleRowSelection = useCallback<RowSelectionEventHandler>((count) => {\n setSelectedCount(count);\n }, []);\n\n const handleSize = useCallback((size: number, maxRangeEnd = Number.MAX_SAFE_INTEGER) => {\n setSize(size);\n if (maxRangeEnd !== Number.MAX_SAFE_INTEGER) {\n setMaxRangeEnd(maxRangeEnd);\n }\n }, []);\n\n useMemo(() => {\n setSize(dataSource.size);\n dataSource.on(\"resize\", handleSize);\n dataSource.on(\"range\", setRange);\n dataSource.on(\"freeze\", handleFreeze);\n dataSource.on(\"row-selection\", handleRowSelection);\n return () => {\n dataSource.removeListener(\"resize\", handleSize);\n dataSource.removeListener(\"range\", setRange);\n dataSource.removeListener(\"freeze\", handleFreeze);\n dataSource.removeListener(\"row-selection\", handleRowSelection);\n };\n }, [dataSource, handleFreeze, handleRowSelection, handleSize]);\n\n return {\n range,\n selectedCount,\n size,\n freezeTime,\n maxScroll: maxRangeEnd\n };\n};\n"],"names":["formatDate","useState","useCallback","size","maxRangeEnd","useMemo"],"mappings":";;;;;AAWA,MAAM,aAAgB,GAAAA,mBAAA,CAAW,EAAE,IAAA,EAAM,YAAY,CAAA;AAErD,MAAM,UAAA,GAAa,CAAC,EAA2B,KAAA;AAC7C,EAAI,IAAA,OAAO,OAAO,QAAU,EAAA;AAC1B,IAAA,OAAO,aAAc,CAAA,IAAI,IAAK,CAAA,EAAE,CAAC,CAAA;AAAA,GAC5B,MAAA;AACL,IAAO,OAAA,KAAA,CAAA;AAAA;AAEX,CAAA;AAEO,MAAM,qBAAqB,CAAC;AAAA,EACjC;AACF,CAAgC,KAAA;AAC9B,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIC,eAAS,CAAC,CAAA;AACpD,EAAA,MAAM,CAAC,KAAO,EAAA,QAAQ,CAAI,GAAAA,cAAA,CAAgB,WAAW,KAAK,CAAA;AAC1D,EAAA,MAAM,CAAC,IAAM,EAAA,OAAO,CAAI,GAAAA,cAAA,CAAS,WAAW,IAAI,CAAA;AAChD,EAAM,MAAA,CAAC,aAAa,cAAc,CAAA,GAAIA,eAAS,UAAW,CAAA,WAAA,IAAe,OAAO,gBAAgB,CAAA;AAChG,EAAM,MAAA,CAAC,UAAY,EAAA,aAAa,CAAI,GAAAA,cAAA;AAAA,IAClC,UAAA,CAAW,WAAW,eAAe;AAAA,GACvC;AAEA,EAAA,MAAM,YAAe,GAAAC,iBAAA;AAAA,IACnB,CAAC,UAAmB,eAA4B,KAAA;AAC9C,MAAA,IAAI,QAAU,EAAA;AACZ,QAAc,aAAA,CAAA,UAAA,CAAW,eAAe,CAAC,CAAA;AAAA,OACpC,MAAA;AACL,QAAA,aAAA,CAAc,KAAS,CAAA,CAAA;AAAA;AACzB,KACF;AAAA,IACA;AAAC,GACH;AAEA,EAAM,MAAA,kBAAA,GAAqBA,iBAAsC,CAAA,CAAC,KAAU,KAAA;AAC1E,IAAA,gBAAA,CAAiB,KAAK,CAAA;AAAA,GACxB,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,aAAaA,iBAAY,CAAA,CAACC,KAAcC,EAAAA,YAAAA,GAAc,OAAO,gBAAqB,KAAA;AACtF,IAAA,OAAA,CAAQD,KAAI,CAAA;AACZ,IAAIC,IAAAA,YAAAA,KAAgB,OAAO,gBAAkB,EAAA;AAC3C,MAAA,cAAA,CAAeA,YAAW,CAAA;AAAA;AAC5B,GACF,EAAG,EAAE,CAAA;AAEL,EAAAC,aAAA,CAAQ,MAAM;AACZ,IAAA,OAAA,CAAQ,WAAW,IAAI,CAAA;AACvB,IAAW,UAAA,CAAA,EAAA,CAAG,UAAU,UAAU,CAAA;AAClC,IAAW,UAAA,CAAA,EAAA,CAAG,SAAS,QAAQ,CAAA;AAC/B,IAAW,UAAA,CAAA,EAAA,CAAG,UAAU,YAAY,CAAA;AACpC,IAAW,UAAA,CAAA,EAAA,CAAG,iBAAiB,kBAAkB,CAAA;AACjD,IAAA,OAAO,MAAM;AACX,MAAW,UAAA,CAAA,cAAA,CAAe,UAAU,UAAU,CAAA;AAC9C,MAAW,UAAA,CAAA,cAAA,CAAe,SAAS,QAAQ,CAAA;AAC3C,MAAW,UAAA,CAAA,cAAA,CAAe,UAAU,YAAY,CAAA;AAChD,MAAW,UAAA,CAAA,cAAA,CAAe,iBAAiB,kBAAkB,CAAA;AAAA,KAC/D;AAAA,KACC,CAAC,UAAA,EAAY,YAAc,EAAA,kBAAA,EAAoB,UAAU,CAAC,CAAA;AAE7D,EAAO,OAAA;AAAA,IACL,KAAA;AAAA,IACA,aAAA;AAAA,IACA,IAAA;AAAA,IACA,UAAA;AAAA,IACA,SAAW,EAAA;AAAA,GACb;AACF;;;;"}
@@ -21,12 +21,12 @@ const DataSourceStats = ({
21
21
  css: dataSourceStats,
22
22
  window: targetWindow
23
23
  });
24
- const { range, selectedCount, size } = useDatasourceStats({
24
+ const { maxScroll, range, selectedCount, size } = useDatasourceStats({
25
25
  dataSource,
26
26
  showRowStats
27
27
  });
28
28
  const from = numberFormatter.format(range.from + 1);
29
- const to = numberFormatter.format(Math.min(range.to, size));
29
+ const to = numberFormatter.format(Math.min(range.to, size, maxScroll));
30
30
  const value = numberFormatter.format(size);
31
31
  if (size === 0) {
32
32
  return /* @__PURE__ */ jsx("div", { ...htmlAttributes, className: cx(classBase, className), children: /* @__PURE__ */ jsx("span", { className: `${classBase}-label`, children: "No Rows to display" }) });
@@ -1 +1 @@
1
- {"version":3,"file":"DatasourceStats.js","sources":["../../../../../../../packages/vuu-table-extras/src/datasource-stats/DatasourceStats.tsx"],"sourcesContent":["import cx from \"clsx\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { HTMLAttributes, ReactNode } from \"react\";\nimport {\n DatasourceStatsHookProps,\n useDatasourceStats,\n} from \"./useDatasourceStats\";\n\nimport dataSourceStats from \"./DatasourceStats.css\";\n\nexport type ItemLabel =\n | string\n | {\n singlular: string;\n plural: string;\n };\n\nexport interface DataSourceStatsProps\n extends DatasourceStatsHookProps,\n Omit<HTMLAttributes<HTMLDivElement>, \"children\"> {\n /**\n * children will be displayed when selection present. Intended\n * use case is display of action button(s) that will operate on\n * selected rows.\n */\n children?: ReactNode;\n selectionActions?: ReactNode;\n tooltrayActions?: ReactNode;\n}\n\nconst classBase = \"vuuDatasourceStats\";\n\nconst numberFormatter = new Intl.NumberFormat();\n\nexport const DataSourceStats = ({\n children,\n className,\n dataSource,\n showRowStats = true,\n tooltrayActions,\n ...htmlAttributes\n}: DataSourceStatsProps) => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-datasource-stats\",\n css: dataSourceStats,\n window: targetWindow,\n });\n\n const { range, selectedCount, size } = useDatasourceStats({\n dataSource,\n showRowStats,\n });\n\n const from = numberFormatter.format(range.from + 1);\n const to = numberFormatter.format(Math.min(range.to, size));\n const value = numberFormatter.format(size);\n\n if (size === 0) {\n return (\n <div {...htmlAttributes} className={cx(classBase, className)}>\n <span className={`${classBase}-label`}>No Rows to display</span>\n </div>\n );\n } else {\n return (\n <div\n {...htmlAttributes}\n className={cx(classBase, className, {\n [`${classBase}-withSelection`]: selectedCount > 0,\n })}\n >\n {showRowStats ? (\n <div className={`${classBase}-statsPanel ${classBase}-rowStats`}>\n <span className={`${classBase}-label`}>Row count</span>\n <span className={`${classBase}-range`}>\n <span className={`${classBase}-value`}>{from}</span>\n <span className={`${classBase}-label`}>-</span>\n <span className={`${classBase}-value`}>{to}</span>\n </span>\n <span className={`${classBase}-label`}>of</span>\n <span className={`${classBase}-value`}>{value}</span>\n {selectedCount > 0 ? (\n <span\n className={cx(`${classBase}-label`, `${classBase}-selected`)}\n >{`${selectedCount.toLocaleString()} selected`}</span>\n ) : null}\n </div>\n ) : null}\n {selectedCount > 0 ? (\n <div\n className={`${classBase}-statsPanel ${classBase}-selectionActions`}\n >\n {children}\n </div>\n ) : null}\n {tooltrayActions ? (\n <div className={`${classBase}-statsPanel ${classBase}-tooltray`}>\n <span className={`${classBase}-actions`}>{tooltrayActions}</span>\n </div>\n ) : null}\n </div>\n );\n }\n};\n"],"names":[],"mappings":";;;;;;;AA+BA,MAAM,SAAY,GAAA,oBAAA;AAElB,MAAM,eAAA,GAAkB,IAAI,IAAA,CAAK,YAAa,EAAA;AAEvC,MAAM,kBAAkB,CAAC;AAAA,EAC9B,QAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,YAAe,GAAA,IAAA;AAAA,EACf,eAAA;AAAA,EACA,GAAG;AACL,CAA4B,KAAA;AAC1B,EAAA,MAAM,eAAe,SAAU,EAAA;AAC/B,EAAyB,wBAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,sBAAA;AAAA,IACR,GAAK,EAAA,eAAA;AAAA,IACL,MAAQ,EAAA;AAAA,GACT,CAAA;AAED,EAAA,MAAM,EAAE,KAAA,EAAO,aAAe,EAAA,IAAA,KAAS,kBAAmB,CAAA;AAAA,IACxD,UAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,MAAM,IAAO,GAAA,eAAA,CAAgB,MAAO,CAAA,KAAA,CAAM,OAAO,CAAC,CAAA;AAClD,EAAM,MAAA,EAAA,GAAK,gBAAgB,MAAO,CAAA,IAAA,CAAK,IAAI,KAAM,CAAA,EAAA,EAAI,IAAI,CAAC,CAAA;AAC1D,EAAM,MAAA,KAAA,GAAQ,eAAgB,CAAA,MAAA,CAAO,IAAI,CAAA;AAEzC,EAAA,IAAI,SAAS,CAAG,EAAA;AACd,IAAA,2BACG,KAAK,EAAA,EAAA,GAAG,cAAgB,EAAA,SAAA,EAAW,GAAG,SAAW,EAAA,SAAS,CACzD,EAAA,QAAA,kBAAA,GAAA,CAAC,UAAK,SAAW,EAAA,CAAA,EAAG,SAAS,CAAA,MAAA,CAAA,EAAU,gCAAkB,CAC3D,EAAA,CAAA;AAAA,GAEG,MAAA;AACL,IACE,uBAAA,IAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACE,GAAG,cAAA;AAAA,QACJ,SAAA,EAAW,EAAG,CAAA,SAAA,EAAW,SAAW,EAAA;AAAA,UAClC,CAAC,CAAA,EAAG,SAAS,CAAA,cAAA,CAAgB,GAAG,aAAgB,GAAA;AAAA,SACjD,CAAA;AAAA,QAEA,QAAA,EAAA;AAAA,UAAA,YAAA,wBACE,KAAI,EAAA,EAAA,SAAA,EAAW,GAAG,SAAS,CAAA,YAAA,EAAe,SAAS,CAClD,SAAA,CAAA,EAAA,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,MAAK,EAAA,EAAA,SAAA,EAAW,CAAG,EAAA,SAAS,UAAU,QAAS,EAAA,WAAA,EAAA,CAAA;AAAA,4BAC/C,IAAA,CAAA,MAAA,EAAA,EAAK,SAAW,EAAA,CAAA,EAAG,SAAS,CAC3B,MAAA,CAAA,EAAA,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,MAAK,EAAA,EAAA,SAAA,EAAW,CAAG,EAAA,SAAS,UAAW,QAAK,EAAA,IAAA,EAAA,CAAA;AAAA,kCAC5C,MAAK,EAAA,EAAA,SAAA,EAAW,CAAG,EAAA,SAAS,UAAU,QAAC,EAAA,GAAA,EAAA,CAAA;AAAA,kCACvC,MAAK,EAAA,EAAA,SAAA,EAAW,CAAG,EAAA,SAAS,UAAW,QAAG,EAAA,EAAA,EAAA;AAAA,aAC7C,EAAA,CAAA;AAAA,gCACC,MAAK,EAAA,EAAA,SAAA,EAAW,CAAG,EAAA,SAAS,UAAU,QAAE,EAAA,IAAA,EAAA,CAAA;AAAA,gCACxC,MAAK,EAAA,EAAA,SAAA,EAAW,CAAG,EAAA,SAAS,UAAW,QAAM,EAAA,KAAA,EAAA,CAAA;AAAA,YAC7C,gBAAgB,CACf,mBAAA,GAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,WAAW,EAAG,CAAA,CAAA,EAAG,SAAS,CAAU,MAAA,CAAA,EAAA,CAAA,EAAG,SAAS,CAAW,SAAA,CAAA,CAAA;AAAA,gBAC3D,QAAA,EAAA,CAAA,EAAG,aAAc,CAAA,cAAA,EAAgB,CAAA,SAAA;AAAA;AAAA,aACjC,GAAA;AAAA,WAAA,EACN,CACE,GAAA,IAAA;AAAA,UACH,gBAAgB,CACf,mBAAA,GAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,SAAW,EAAA,CAAA,EAAG,SAAS,CAAA,YAAA,EAAe,SAAS,CAAA,iBAAA,CAAA;AAAA,cAE9C;AAAA;AAAA,WAED,GAAA,IAAA;AAAA,UACH,kCACE,GAAA,CAAA,KAAA,EAAA,EAAI,SAAW,EAAA,CAAA,EAAG,SAAS,CAAe,YAAA,EAAA,SAAS,CAClD,SAAA,CAAA,EAAA,QAAA,kBAAA,GAAA,CAAC,UAAK,SAAW,EAAA,CAAA,EAAG,SAAS,CAAa,QAAA,CAAA,EAAA,QAAA,EAAA,eAAA,EAAgB,GAC5D,CACE,GAAA;AAAA;AAAA;AAAA,KACN;AAAA;AAGN;;;;"}
1
+ {"version":3,"file":"DatasourceStats.js","sources":["../../../../../../../packages/vuu-table-extras/src/datasource-stats/DatasourceStats.tsx"],"sourcesContent":["import cx from \"clsx\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { HTMLAttributes, ReactNode } from \"react\";\nimport {\n DatasourceStatsHookProps,\n useDatasourceStats,\n} from \"./useDatasourceStats\";\n\nimport dataSourceStats from \"./DatasourceStats.css\";\n\nexport type ItemLabel =\n | string\n | {\n singlular: string;\n plural: string;\n };\n\nexport interface DataSourceStatsProps\n extends DatasourceStatsHookProps,\n Omit<HTMLAttributes<HTMLDivElement>, \"children\"> {\n /**\n * children will be displayed when selection present. Intended\n * use case is display of action button(s) that will operate on\n * selected rows.\n */\n children?: ReactNode;\n selectionActions?: ReactNode;\n tooltrayActions?: ReactNode;\n}\n\nconst classBase = \"vuuDatasourceStats\";\n\nconst numberFormatter = new Intl.NumberFormat();\n\nexport const DataSourceStats = ({\n children,\n className,\n dataSource,\n showRowStats = true,\n tooltrayActions,\n ...htmlAttributes\n}: DataSourceStatsProps) => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-datasource-stats\",\n css: dataSourceStats,\n window: targetWindow,\n });\n\n const { maxScroll, range, selectedCount, size } = useDatasourceStats({\n dataSource,\n showRowStats,\n });\n\n const from = numberFormatter.format(range.from + 1);\n const to = numberFormatter.format(Math.min(range.to, size, maxScroll));\n const value = numberFormatter.format(size);\n\n if (size === 0) {\n return (\n <div {...htmlAttributes} className={cx(classBase, className)}>\n <span className={`${classBase}-label`}>No Rows to display</span>\n </div>\n );\n } else {\n return (\n <div\n {...htmlAttributes}\n className={cx(classBase, className, {\n [`${classBase}-withSelection`]: selectedCount > 0,\n })}\n >\n {showRowStats ? (\n <div className={`${classBase}-statsPanel ${classBase}-rowStats`}>\n <span className={`${classBase}-label`}>Row count</span>\n <span className={`${classBase}-range`}>\n <span className={`${classBase}-value`}>{from}</span>\n <span className={`${classBase}-label`}>-</span>\n <span className={`${classBase}-value`}>{to}</span>\n </span>\n <span className={`${classBase}-label`}>of</span>\n <span className={`${classBase}-value`}>{value}</span>\n {selectedCount > 0 ? (\n <span\n className={cx(`${classBase}-label`, `${classBase}-selected`)}\n >{`${selectedCount.toLocaleString()} selected`}</span>\n ) : null}\n </div>\n ) : null}\n {selectedCount > 0 ? (\n <div\n className={`${classBase}-statsPanel ${classBase}-selectionActions`}\n >\n {children}\n </div>\n ) : null}\n {tooltrayActions ? (\n <div className={`${classBase}-statsPanel ${classBase}-tooltray`}>\n <span className={`${classBase}-actions`}>{tooltrayActions}</span>\n </div>\n ) : null}\n </div>\n );\n }\n};\n"],"names":[],"mappings":"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"}
@@ -15,6 +15,7 @@ const useDatasourceStats = ({
15
15
  const [selectedCount, setSelectedCount] = useState(0);
16
16
  const [range, setRange] = useState(dataSource.range);
17
17
  const [size, setSize] = useState(dataSource.size);
18
+ const [maxRangeEnd, setMaxRangeEnd] = useState(dataSource.maxRangeEnd ?? Number.MAX_SAFE_INTEGER);
18
19
  const [freezeTime, setFreezeTime] = useState(
19
20
  formatTime(dataSource.freezeTimestamp)
20
21
  );
@@ -31,8 +32,11 @@ const useDatasourceStats = ({
31
32
  const handleRowSelection = useCallback((count) => {
32
33
  setSelectedCount(count);
33
34
  }, []);
34
- const handleSize = useCallback((size2) => {
35
+ const handleSize = useCallback((size2, maxRangeEnd2 = Number.MAX_SAFE_INTEGER) => {
35
36
  setSize(size2);
37
+ if (maxRangeEnd2 !== Number.MAX_SAFE_INTEGER) {
38
+ setMaxRangeEnd(maxRangeEnd2);
39
+ }
36
40
  }, []);
37
41
  useMemo(() => {
38
42
  setSize(dataSource.size);
@@ -51,7 +55,8 @@ const useDatasourceStats = ({
51
55
  range,
52
56
  selectedCount,
53
57
  size,
54
- freezeTime
58
+ freezeTime,
59
+ maxScroll: maxRangeEnd
55
60
  };
56
61
  };
57
62
 
@@ -1 +1 @@
1
- {"version":3,"file":"useDatasourceStats.js","sources":["../../../../../../../packages/vuu-table-extras/src/datasource-stats/useDatasourceStats.ts"],"sourcesContent":["import { DataSource, RowSelectionEventHandler } from \"@vuu-ui/vuu-data-types\";\nimport { formatDate, Range } from \"@vuu-ui/vuu-utils\";\nimport { useCallback, useMemo, useState } from \"react\";\n\nexport interface DatasourceStatsHookProps {\n dataSource: DataSource;\n showFreezeStatus?: boolean;\n showRowStats?: boolean;\n showSelectionStats?: boolean;\n}\n\nconst timeFormatter = formatDate({ time: \"hh:mm:ss\" });\n\nconst formatTime = (ts: number | undefined) => {\n if (typeof ts === \"number\") {\n return timeFormatter(new Date(ts));\n } else {\n return undefined;\n }\n};\n\nexport const useDatasourceStats = ({\n dataSource,\n}: DatasourceStatsHookProps) => {\n const [selectedCount, setSelectedCount] = useState(0);\n const [range, setRange] = useState<Range>(dataSource.range);\n const [size, setSize] = useState(dataSource.size);\n const [freezeTime, setFreezeTime] = useState(\n formatTime(dataSource.freezeTimestamp),\n );\n\n const handleFreeze = useCallback(\n (isFrozen: boolean, freezeTimestamp: number) => {\n if (isFrozen) {\n setFreezeTime(formatTime(freezeTimestamp));\n } else {\n setFreezeTime(undefined);\n }\n },\n [],\n );\n\n const handleRowSelection = useCallback<RowSelectionEventHandler>((count) => {\n setSelectedCount(count);\n }, []);\n\n const handleSize = useCallback((size: number) => {\n setSize(size);\n }, []);\n\n useMemo(() => {\n setSize(dataSource.size);\n dataSource.on(\"resize\", handleSize);\n dataSource.on(\"range\", setRange);\n dataSource.on(\"freeze\", handleFreeze);\n dataSource.on(\"row-selection\", handleRowSelection);\n return () => {\n dataSource.removeListener(\"resize\", handleSize);\n dataSource.removeListener(\"range\", setRange);\n dataSource.removeListener(\"freeze\", handleFreeze);\n dataSource.removeListener(\"row-selection\", handleRowSelection);\n };\n }, [dataSource, handleFreeze, handleRowSelection, handleSize]);\n\n return {\n range,\n selectedCount,\n size,\n freezeTime,\n };\n};\n"],"names":["size"],"mappings":";;;AAWA,MAAM,aAAgB,GAAA,UAAA,CAAW,EAAE,IAAA,EAAM,YAAY,CAAA;AAErD,MAAM,UAAA,GAAa,CAAC,EAA2B,KAAA;AAC7C,EAAI,IAAA,OAAO,OAAO,QAAU,EAAA;AAC1B,IAAA,OAAO,aAAc,CAAA,IAAI,IAAK,CAAA,EAAE,CAAC,CAAA;AAAA,GAC5B,MAAA;AACL,IAAO,OAAA,KAAA,CAAA;AAAA;AAEX,CAAA;AAEO,MAAM,qBAAqB,CAAC;AAAA,EACjC;AACF,CAAgC,KAAA;AAC9B,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAI,SAAS,CAAC,CAAA;AACpD,EAAA,MAAM,CAAC,KAAO,EAAA,QAAQ,CAAI,GAAA,QAAA,CAAgB,WAAW,KAAK,CAAA;AAC1D,EAAA,MAAM,CAAC,IAAM,EAAA,OAAO,CAAI,GAAA,QAAA,CAAS,WAAW,IAAI,CAAA;AAChD,EAAM,MAAA,CAAC,UAAY,EAAA,aAAa,CAAI,GAAA,QAAA;AAAA,IAClC,UAAA,CAAW,WAAW,eAAe;AAAA,GACvC;AAEA,EAAA,MAAM,YAAe,GAAA,WAAA;AAAA,IACnB,CAAC,UAAmB,eAA4B,KAAA;AAC9C,MAAA,IAAI,QAAU,EAAA;AACZ,QAAc,aAAA,CAAA,UAAA,CAAW,eAAe,CAAC,CAAA;AAAA,OACpC,MAAA;AACL,QAAA,aAAA,CAAc,KAAS,CAAA,CAAA;AAAA;AACzB,KACF;AAAA,IACA;AAAC,GACH;AAEA,EAAM,MAAA,kBAAA,GAAqB,WAAsC,CAAA,CAAC,KAAU,KAAA;AAC1E,IAAA,gBAAA,CAAiB,KAAK,CAAA;AAAA,GACxB,EAAG,EAAE,CAAA;AAEL,EAAM,MAAA,UAAA,GAAa,WAAY,CAAA,CAACA,KAAiB,KAAA;AAC/C,IAAA,OAAA,CAAQA,KAAI,CAAA;AAAA,GACd,EAAG,EAAE,CAAA;AAEL,EAAA,OAAA,CAAQ,MAAM;AACZ,IAAA,OAAA,CAAQ,WAAW,IAAI,CAAA;AACvB,IAAW,UAAA,CAAA,EAAA,CAAG,UAAU,UAAU,CAAA;AAClC,IAAW,UAAA,CAAA,EAAA,CAAG,SAAS,QAAQ,CAAA;AAC/B,IAAW,UAAA,CAAA,EAAA,CAAG,UAAU,YAAY,CAAA;AACpC,IAAW,UAAA,CAAA,EAAA,CAAG,iBAAiB,kBAAkB,CAAA;AACjD,IAAA,OAAO,MAAM;AACX,MAAW,UAAA,CAAA,cAAA,CAAe,UAAU,UAAU,CAAA;AAC9C,MAAW,UAAA,CAAA,cAAA,CAAe,SAAS,QAAQ,CAAA;AAC3C,MAAW,UAAA,CAAA,cAAA,CAAe,UAAU,YAAY,CAAA;AAChD,MAAW,UAAA,CAAA,cAAA,CAAe,iBAAiB,kBAAkB,CAAA;AAAA,KAC/D;AAAA,KACC,CAAC,UAAA,EAAY,YAAc,EAAA,kBAAA,EAAoB,UAAU,CAAC,CAAA;AAE7D,EAAO,OAAA;AAAA,IACL,KAAA;AAAA,IACA,aAAA;AAAA,IACA,IAAA;AAAA,IACA;AAAA,GACF;AACF;;;;"}
1
+ {"version":3,"file":"useDatasourceStats.js","sources":["../../../../../../../packages/vuu-table-extras/src/datasource-stats/useDatasourceStats.ts"],"sourcesContent":["import { DataSource, RowSelectionEventHandler } from \"@vuu-ui/vuu-data-types\";\nimport { formatDate, Range } from \"@vuu-ui/vuu-utils\";\nimport { useCallback, useMemo, useState } from \"react\";\n\nexport interface DatasourceStatsHookProps {\n dataSource: DataSource;\n showFreezeStatus?: boolean;\n showRowStats?: boolean;\n showSelectionStats?: boolean;\n}\n\nconst timeFormatter = formatDate({ time: \"hh:mm:ss\" });\n\nconst formatTime = (ts: number | undefined) => {\n if (typeof ts === \"number\") {\n return timeFormatter(new Date(ts));\n } else {\n return undefined;\n }\n};\n\nexport const useDatasourceStats = ({\n dataSource,\n}: DatasourceStatsHookProps) => {\n const [selectedCount, setSelectedCount] = useState(0);\n const [range, setRange] = useState<Range>(dataSource.range);\n const [size, setSize] = useState(dataSource.size);\n const [maxRangeEnd, setMaxRangeEnd] = useState(dataSource.maxRangeEnd ?? Number.MAX_SAFE_INTEGER);\n const [freezeTime, setFreezeTime] = useState(\n formatTime(dataSource.freezeTimestamp),\n );\n\n const handleFreeze = useCallback(\n (isFrozen: boolean, freezeTimestamp: number) => {\n if (isFrozen) {\n setFreezeTime(formatTime(freezeTimestamp));\n } else {\n setFreezeTime(undefined);\n }\n },\n [],\n );\n\n const handleRowSelection = useCallback<RowSelectionEventHandler>((count) => {\n setSelectedCount(count);\n }, []);\n\n const handleSize = useCallback((size: number, maxRangeEnd = Number.MAX_SAFE_INTEGER) => {\n setSize(size);\n if (maxRangeEnd !== Number.MAX_SAFE_INTEGER) {\n setMaxRangeEnd(maxRangeEnd);\n }\n }, []);\n\n useMemo(() => {\n setSize(dataSource.size);\n dataSource.on(\"resize\", handleSize);\n dataSource.on(\"range\", setRange);\n dataSource.on(\"freeze\", handleFreeze);\n dataSource.on(\"row-selection\", handleRowSelection);\n return () => {\n dataSource.removeListener(\"resize\", handleSize);\n dataSource.removeListener(\"range\", setRange);\n dataSource.removeListener(\"freeze\", handleFreeze);\n dataSource.removeListener(\"row-selection\", handleRowSelection);\n };\n }, [dataSource, handleFreeze, handleRowSelection, handleSize]);\n\n return {\n range,\n selectedCount,\n size,\n freezeTime,\n maxScroll: maxRangeEnd\n };\n};\n"],"names":["size","maxRangeEnd"],"mappings":";;;AAWA,MAAM,aAAgB,GAAA,UAAA,CAAW,EAAE,IAAA,EAAM,YAAY,CAAA;AAErD,MAAM,UAAA,GAAa,CAAC,EAA2B,KAAA;AAC7C,EAAI,IAAA,OAAO,OAAO,QAAU,EAAA;AAC1B,IAAA,OAAO,aAAc,CAAA,IAAI,IAAK,CAAA,EAAE,CAAC,CAAA;AAAA,GAC5B,MAAA;AACL,IAAO,OAAA,KAAA,CAAA;AAAA;AAEX,CAAA;AAEO,MAAM,qBAAqB,CAAC;AAAA,EACjC;AACF,CAAgC,KAAA;AAC9B,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAI,SAAS,CAAC,CAAA;AACpD,EAAA,MAAM,CAAC,KAAO,EAAA,QAAQ,CAAI,GAAA,QAAA,CAAgB,WAAW,KAAK,CAAA;AAC1D,EAAA,MAAM,CAAC,IAAM,EAAA,OAAO,CAAI,GAAA,QAAA,CAAS,WAAW,IAAI,CAAA;AAChD,EAAM,MAAA,CAAC,aAAa,cAAc,CAAA,GAAI,SAAS,UAAW,CAAA,WAAA,IAAe,OAAO,gBAAgB,CAAA;AAChG,EAAM,MAAA,CAAC,UAAY,EAAA,aAAa,CAAI,GAAA,QAAA;AAAA,IAClC,UAAA,CAAW,WAAW,eAAe;AAAA,GACvC;AAEA,EAAA,MAAM,YAAe,GAAA,WAAA;AAAA,IACnB,CAAC,UAAmB,eAA4B,KAAA;AAC9C,MAAA,IAAI,QAAU,EAAA;AACZ,QAAc,aAAA,CAAA,UAAA,CAAW,eAAe,CAAC,CAAA;AAAA,OACpC,MAAA;AACL,QAAA,aAAA,CAAc,KAAS,CAAA,CAAA;AAAA;AACzB,KACF;AAAA,IACA;AAAC,GACH;AAEA,EAAM,MAAA,kBAAA,GAAqB,WAAsC,CAAA,CAAC,KAAU,KAAA;AAC1E,IAAA,gBAAA,CAAiB,KAAK,CAAA;AAAA,GACxB,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,aAAa,WAAY,CAAA,CAACA,KAAcC,EAAAA,YAAAA,GAAc,OAAO,gBAAqB,KAAA;AACtF,IAAA,OAAA,CAAQD,KAAI,CAAA;AACZ,IAAIC,IAAAA,YAAAA,KAAgB,OAAO,gBAAkB,EAAA;AAC3C,MAAA,cAAA,CAAeA,YAAW,CAAA;AAAA;AAC5B,GACF,EAAG,EAAE,CAAA;AAEL,EAAA,OAAA,CAAQ,MAAM;AACZ,IAAA,OAAA,CAAQ,WAAW,IAAI,CAAA;AACvB,IAAW,UAAA,CAAA,EAAA,CAAG,UAAU,UAAU,CAAA;AAClC,IAAW,UAAA,CAAA,EAAA,CAAG,SAAS,QAAQ,CAAA;AAC/B,IAAW,UAAA,CAAA,EAAA,CAAG,UAAU,YAAY,CAAA;AACpC,IAAW,UAAA,CAAA,EAAA,CAAG,iBAAiB,kBAAkB,CAAA;AACjD,IAAA,OAAO,MAAM;AACX,MAAW,UAAA,CAAA,cAAA,CAAe,UAAU,UAAU,CAAA;AAC9C,MAAW,UAAA,CAAA,cAAA,CAAe,SAAS,QAAQ,CAAA;AAC3C,MAAW,UAAA,CAAA,cAAA,CAAe,UAAU,YAAY,CAAA;AAChD,MAAW,UAAA,CAAA,cAAA,CAAe,iBAAiB,kBAAkB,CAAA;AAAA,KAC/D;AAAA,KACC,CAAC,UAAA,EAAY,YAAc,EAAA,kBAAA,EAAoB,UAAU,CAAC,CAAA;AAE7D,EAAO,OAAA;AAAA,IACL,KAAA;AAAA,IACA,aAAA;AAAA,IACA,IAAA;AAAA,IACA,UAAA;AAAA,IACA,SAAW,EAAA;AAAA,GACb;AACF;;;;"}
package/package.json CHANGED
@@ -1,20 +1,20 @@
1
1
  {
2
- "version": "2.1.19",
2
+ "version": "2.2.1",
3
3
  "author": "heswell",
4
4
  "license": "Apache-2.0",
5
5
  "devDependencies": {
6
- "@vuu-ui/vuu-filter-types": "2.1.19",
7
- "@vuu-ui/vuu-protocol-types": "2.1.19"
6
+ "@vuu-ui/vuu-filter-types": "2.2.1",
7
+ "@vuu-ui/vuu-protocol-types": "2.2.1"
8
8
  },
9
9
  "dependencies": {
10
- "@vuu-ui/vuu-codemirror": "2.1.19",
11
- "@vuu-ui/vuu-data-react": "2.1.19",
12
- "@vuu-ui/vuu-data-types": "2.1.19",
13
- "@vuu-ui/vuu-table-types": "2.1.19",
14
- "@vuu-ui/vuu-popups": "2.1.19",
15
- "@vuu-ui/vuu-table": "2.1.19",
16
- "@vuu-ui/vuu-utils": "2.1.19",
17
- "@vuu-ui/vuu-ui-controls": "2.1.19",
10
+ "@vuu-ui/vuu-codemirror": "2.2.1",
11
+ "@vuu-ui/vuu-data-react": "2.2.1",
12
+ "@vuu-ui/vuu-data-types": "2.2.1",
13
+ "@vuu-ui/vuu-table-types": "2.2.1",
14
+ "@vuu-ui/vuu-popups": "2.2.1",
15
+ "@vuu-ui/vuu-table": "2.2.1",
16
+ "@vuu-ui/vuu-utils": "2.2.1",
17
+ "@vuu-ui/vuu-ui-controls": "2.2.1",
18
18
  "@lezer/lr": "1.4.2",
19
19
  "@salt-ds/core": "1.54.1",
20
20
  "@salt-ds/lab": "1.0.0-alpha.83",
@@ -11,4 +11,5 @@ export declare const useDatasourceStats: ({ dataSource, }: DatasourceStatsHookPr
11
11
  selectedCount: number;
12
12
  size: number;
13
13
  freezeTime: string | undefined;
14
+ maxScroll: number;
14
15
  };