@deephaven/dashboard-core-plugins 0.91.1-webpack-fix.0 → 0.92.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.
@@ -1,6 +1,6 @@
1
1
  /// <reference types="react" />
2
2
  import { type WidgetComponentProps } from '@deephaven/plugin';
3
3
  import { type dh } from '@deephaven/jsapi-types';
4
- export declare function GridWidgetPlugin(props: WidgetComponentProps<dh.Table>): JSX.Element | null;
4
+ export declare function GridWidgetPlugin({ fetch, }: WidgetComponentProps<dh.Table>): JSX.Element | null;
5
5
  export default GridWidgetPlugin;
6
6
  //# sourceMappingURL=GridWidgetPlugin.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"GridWidgetPlugin.d.ts","sourceRoot":"","sources":["../src/GridWidgetPlugin.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,KAAK,EAAE,EAAE,MAAM,wBAAwB,CAAC;AAUjD,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,oBAAoB,CAAC,EAAE,CAAC,KAAK,CAAC,GACpC,GAAG,CAAC,OAAO,GAAG,IAAI,CAyBpB;AAED,eAAe,gBAAgB,CAAC"}
1
+ {"version":3,"file":"GridWidgetPlugin.d.ts","sourceRoot":"","sources":["../src/GridWidgetPlugin.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,KAAK,EAAE,EAAE,MAAM,wBAAwB,CAAC;AAQjD,wBAAgB,gBAAgB,CAAC,EAC/B,KAAK,GACN,EAAE,oBAAoB,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,OAAO,GAAG,IAAI,CAoBrD;AAED,eAAe,gBAAgB,CAAC"}
@@ -1,42 +1,34 @@
1
- function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
2
- function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
3
- import { useEffect, useState } from 'react';
4
- import { useApi } from '@deephaven/jsapi-bootstrap';
5
- import { IrisGrid, IrisGridModelFactory } from '@deephaven/iris-grid';
1
+ import { IrisGrid } from '@deephaven/iris-grid';
6
2
  import { useSelector } from 'react-redux';
7
3
  import { getSettings } from '@deephaven/redux';
4
+ import { LoadingOverlay } from '@deephaven/components';
5
+ import { getErrorMessage } from '@deephaven/utils';
6
+ import { useIrisGridModel } from "./useIrisGridModel.js";
8
7
  import { jsx as _jsx } from "react/jsx-runtime";
9
- export function GridWidgetPlugin(props) {
10
- var dh = useApi();
11
- var settings = useSelector(getSettings);
12
- var [model, setModel] = useState();
8
+ export function GridWidgetPlugin(_ref) {
13
9
  var {
14
10
  fetch
15
- } = props;
16
- useEffect(() => {
17
- var cancelled = false;
18
- function init() {
19
- return _init.apply(this, arguments);
20
- }
21
- function _init() {
22
- _init = _asyncToGenerator(function* () {
23
- var table = yield fetch();
24
- var newModel = yield IrisGridModelFactory.makeModel(dh, table);
25
- if (!cancelled) {
26
- setModel(newModel);
27
- }
28
- });
29
- return _init.apply(this, arguments);
30
- }
31
- init();
32
- return () => {
33
- cancelled = true;
34
- };
35
- }, [dh, fetch]);
36
- return model ? /*#__PURE__*/_jsx(IrisGrid, {
11
+ } = _ref;
12
+ var settings = useSelector(getSettings);
13
+ var fetchResult = useIrisGridModel(fetch);
14
+ if (fetchResult.status === 'loading') {
15
+ return /*#__PURE__*/_jsx(LoadingOverlay, {
16
+ isLoading: true
17
+ });
18
+ }
19
+ if (fetchResult.status === 'error') {
20
+ return /*#__PURE__*/_jsx(LoadingOverlay, {
21
+ errorMessage: getErrorMessage(fetchResult.error),
22
+ isLoading: false
23
+ });
24
+ }
25
+ var {
26
+ model
27
+ } = fetchResult;
28
+ return /*#__PURE__*/_jsx(IrisGrid, {
37
29
  model: model,
38
30
  settings: settings
39
- }) : null;
31
+ });
40
32
  }
41
33
  export default GridWidgetPlugin;
42
34
  //# sourceMappingURL=GridWidgetPlugin.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"GridWidgetPlugin.js","names":["useEffect","useState","useApi","IrisGrid","IrisGridModelFactory","useSelector","getSettings","jsx","_jsx","GridWidgetPlugin","props","dh","settings","model","setModel","fetch","cancelled","init","_init","apply","arguments","_asyncToGenerator","table","newModel","makeModel"],"sources":["../src/GridWidgetPlugin.tsx"],"sourcesContent":["import { useEffect, useState } from 'react';\nimport { type WidgetComponentProps } from '@deephaven/plugin';\nimport { type dh } from '@deephaven/jsapi-types';\nimport { useApi } from '@deephaven/jsapi-bootstrap';\nimport {\n IrisGrid,\n IrisGridModelFactory,\n type IrisGridModel,\n} from '@deephaven/iris-grid';\nimport { useSelector } from 'react-redux';\nimport { getSettings, RootState } from '@deephaven/redux';\n\nexport function GridWidgetPlugin(\n props: WidgetComponentProps<dh.Table>\n): JSX.Element | null {\n const dh = useApi();\n const settings = useSelector(getSettings<RootState>);\n const [model, setModel] = useState<IrisGridModel>();\n\n const { fetch } = props;\n\n useEffect(() => {\n let cancelled = false;\n async function init() {\n const table = await fetch();\n const newModel = await IrisGridModelFactory.makeModel(dh, table);\n if (!cancelled) {\n setModel(newModel);\n }\n }\n\n init();\n\n return () => {\n cancelled = true;\n };\n }, [dh, fetch]);\n\n return model ? <IrisGrid model={model} settings={settings} /> : null;\n}\n\nexport default GridWidgetPlugin;\n"],"mappings":";;AAAA,SAASA,SAAS,EAAEC,QAAQ,QAAQ,OAAO;AAG3C,SAASC,MAAM,QAAQ,4BAA4B;AACnD,SACEC,QAAQ,EACRC,oBAAoB,QAEf,sBAAsB;AAC7B,SAASC,WAAW,QAAQ,aAAa;AACzC,SAASC,WAAW,QAAmB,kBAAkB;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAE1D,OAAO,SAASC,gBAAgBA,CAC9BC,KAAqC,EACjB;EACpB,IAAMC,EAAE,GAAGT,MAAM,CAAC,CAAC;EACnB,IAAMU,QAAQ,GAAGP,WAAW,CAACC,WAAsB,CAAC;EACpD,IAAM,CAACO,KAAK,EAAEC,QAAQ,CAAC,GAAGb,QAAQ,CAAgB,CAAC;EAEnD,IAAM;IAAEc;EAAM,CAAC,GAAGL,KAAK;EAEvBV,SAAS,CAAC,MAAM;IACd,IAAIgB,SAAS,GAAG,KAAK;IAAC,SACPC,IAAIA,CAAA;MAAA,OAAAC,KAAA,CAAAC,KAAA,OAAAC,SAAA;IAAA;IAAA,SAAAF,MAAA;MAAAA,KAAA,GAAAG,iBAAA,CAAnB,aAAsB;QACpB,IAAMC,KAAK,SAASP,KAAK,CAAC,CAAC;QAC3B,IAAMQ,QAAQ,SAASnB,oBAAoB,CAACoB,SAAS,CAACb,EAAE,EAAEW,KAAK,CAAC;QAChE,IAAI,CAACN,SAAS,EAAE;UACdF,QAAQ,CAACS,QAAQ,CAAC;QACpB;MACF,CAAC;MAAA,OAAAL,KAAA,CAAAC,KAAA,OAAAC,SAAA;IAAA;IAEDH,IAAI,CAAC,CAAC;IAEN,OAAO,MAAM;MACXD,SAAS,GAAG,IAAI;IAClB,CAAC;EACH,CAAC,EAAE,CAACL,EAAE,EAAEI,KAAK,CAAC,CAAC;EAEf,OAAOF,KAAK,gBAAGL,IAAA,CAACL,QAAQ;IAACU,KAAK,EAAEA,KAAM;IAACD,QAAQ,EAAEA;EAAS,CAAE,CAAC,GAAG,IAAI;AACtE;AAEA,eAAeH,gBAAgB"}
1
+ {"version":3,"file":"GridWidgetPlugin.js","names":["IrisGrid","useSelector","getSettings","LoadingOverlay","getErrorMessage","useIrisGridModel","jsx","_jsx","GridWidgetPlugin","_ref","fetch","settings","fetchResult","status","isLoading","errorMessage","error","model"],"sources":["../src/GridWidgetPlugin.tsx"],"sourcesContent":["import { type WidgetComponentProps } from '@deephaven/plugin';\nimport { type dh } from '@deephaven/jsapi-types';\nimport { IrisGrid } from '@deephaven/iris-grid';\nimport { useSelector } from 'react-redux';\nimport { getSettings, RootState } from '@deephaven/redux';\nimport { LoadingOverlay } from '@deephaven/components';\nimport { getErrorMessage } from '@deephaven/utils';\nimport { useIrisGridModel } from './useIrisGridModel';\n\nexport function GridWidgetPlugin({\n fetch,\n}: WidgetComponentProps<dh.Table>): JSX.Element | null {\n const settings = useSelector(getSettings<RootState>);\n\n const fetchResult = useIrisGridModel(fetch);\n\n if (fetchResult.status === 'loading') {\n return <LoadingOverlay isLoading />;\n }\n\n if (fetchResult.status === 'error') {\n return (\n <LoadingOverlay\n errorMessage={getErrorMessage(fetchResult.error)}\n isLoading={false}\n />\n );\n }\n\n const { model } = fetchResult;\n return <IrisGrid model={model} settings={settings} />;\n}\n\nexport default GridWidgetPlugin;\n"],"mappings":"AAEA,SAASA,QAAQ,QAAQ,sBAAsB;AAC/C,SAASC,WAAW,QAAQ,aAAa;AACzC,SAASC,WAAW,QAAmB,kBAAkB;AACzD,SAASC,cAAc,QAAQ,uBAAuB;AACtD,SAASC,eAAe,QAAQ,kBAAkB;AAAC,SAC1CC,gBAAgB;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAEzB,OAAO,SAASC,gBAAgBA,CAAAC,IAAA,EAEuB;EAAA,IAFtB;IAC/BC;EAC8B,CAAC,GAAAD,IAAA;EAC/B,IAAME,QAAQ,GAAGV,WAAW,CAACC,WAAsB,CAAC;EAEpD,IAAMU,WAAW,GAAGP,gBAAgB,CAACK,KAAK,CAAC;EAE3C,IAAIE,WAAW,CAACC,MAAM,KAAK,SAAS,EAAE;IACpC,oBAAON,IAAA,CAACJ,cAAc;MAACW,SAAS;IAAA,CAAE,CAAC;EACrC;EAEA,IAAIF,WAAW,CAACC,MAAM,KAAK,OAAO,EAAE;IAClC,oBACEN,IAAA,CAACJ,cAAc;MACbY,YAAY,EAAEX,eAAe,CAACQ,WAAW,CAACI,KAAK,CAAE;MACjDF,SAAS,EAAE;IAAM,CAClB,CAAC;EAEN;EAEA,IAAM;IAAEG;EAAM,CAAC,GAAGL,WAAW;EAC7B,oBAAOL,IAAA,CAACP,QAAQ;IAACiB,KAAK,EAAEA,KAAM;IAACN,QAAQ,EAAEA;EAAS,CAAE,CAAC;AACvD;AAEA,eAAeH,gBAAgB"}
@@ -1,6 +1,6 @@
1
1
  /// <reference types="react" />
2
2
  import { WidgetComponentProps } from '@deephaven/plugin';
3
3
  import { type dh } from '@deephaven/jsapi-types';
4
- export declare function PandasWidgetPlugin(props: WidgetComponentProps<dh.Table>): JSX.Element | null;
4
+ export declare function PandasWidgetPlugin({ fetch, }: WidgetComponentProps<dh.Table>): JSX.Element | null;
5
5
  export default PandasWidgetPlugin;
6
6
  //# sourceMappingURL=PandasWidgetPlugin.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"PandasWidgetPlugin.d.ts","sourceRoot":"","sources":["../src/PandasWidgetPlugin.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,KAAK,EAAE,EAAE,MAAM,wBAAwB,CAAC;AASjD,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,oBAAoB,CAAC,EAAE,CAAC,KAAK,CAAC,GACpC,GAAG,CAAC,OAAO,GAAG,IAAI,CAiDpB;AAED,eAAe,kBAAkB,CAAC"}
1
+ {"version":3,"file":"PandasWidgetPlugin.d.ts","sourceRoot":"","sources":["../src/PandasWidgetPlugin.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,KAAK,EAAE,EAAE,MAAM,wBAAwB,CAAC;AAOjD,wBAAgB,kBAAkB,CAAC,EACjC,KAAK,GACN,EAAE,oBAAoB,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,OAAO,GAAG,IAAI,CAsBrD;AAED,eAAe,kBAAkB,CAAC"}
@@ -1,63 +1,34 @@
1
- function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
2
- function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
3
- import { useCallback, useEffect, useState } from 'react';
4
- import IrisGrid, { IrisGridModelFactory } from '@deephaven/iris-grid';
5
- import { useApi } from '@deephaven/jsapi-bootstrap';
1
+ import IrisGrid from '@deephaven/iris-grid';
6
2
  import { LoadingOverlay } from '@deephaven/components';
3
+ import { getErrorMessage } from '@deephaven/utils';
7
4
  import { PandasReloadButton } from "./panels/PandasReloadButton.js";
5
+ import { useIrisGridModel } from "./useIrisGridModel.js";
8
6
  import { jsx as _jsx } from "react/jsx-runtime";
9
- import { Fragment as _Fragment } from "react/jsx-runtime";
10
- import { jsxs as _jsxs } from "react/jsx-runtime";
11
- export function PandasWidgetPlugin(props) {
12
- var dh = useApi();
13
- var [model, setModel] = useState();
14
- var [isLoading, setIsLoading] = useState(true);
15
- var [isLoaded, setIsLoaded] = useState(false);
7
+ export function PandasWidgetPlugin(_ref) {
16
8
  var {
17
9
  fetch
18
- } = props;
19
- var makeModel = useCallback( /*#__PURE__*/_asyncToGenerator(function* () {
20
- var table = yield fetch();
21
- return IrisGridModelFactory.makeModel(dh, table);
22
- }), [dh, fetch]);
23
- var handleReload = useCallback( /*#__PURE__*/_asyncToGenerator(function* () {
24
- setIsLoading(true);
25
- var newModel = yield makeModel();
26
- setModel(newModel);
27
- setIsLoading(false);
28
- }), [makeModel]);
29
- useEffect(() => {
30
- var cancelled = false;
31
- function init() {
32
- return _init.apply(this, arguments);
33
- }
34
- function _init() {
35
- _init = _asyncToGenerator(function* () {
36
- var newModel = yield makeModel();
37
- if (!cancelled) {
38
- setModel(newModel);
39
- setIsLoaded(true);
40
- setIsLoading(false);
41
- }
42
- });
43
- return _init.apply(this, arguments);
44
- }
45
- init();
46
- setIsLoading(true);
47
- return () => {
48
- cancelled = true;
49
- };
50
- }, [makeModel]);
51
- return /*#__PURE__*/_jsxs(_Fragment, {
52
- children: [/*#__PURE__*/_jsx(LoadingOverlay, {
53
- isLoaded: isLoaded,
54
- isLoading: isLoading
55
- }), model && /*#__PURE__*/_jsx(IrisGrid, {
56
- model: model,
57
- children: /*#__PURE__*/_jsx(PandasReloadButton, {
58
- onClick: handleReload
59
- })
60
- })]
10
+ } = _ref;
11
+ var fetchResult = useIrisGridModel(fetch);
12
+ if (fetchResult.status === 'loading') {
13
+ return /*#__PURE__*/_jsx(LoadingOverlay, {
14
+ isLoading: true
15
+ });
16
+ }
17
+ if (fetchResult.status === 'error') {
18
+ return /*#__PURE__*/_jsx(LoadingOverlay, {
19
+ errorMessage: getErrorMessage(fetchResult.error),
20
+ isLoading: false
21
+ });
22
+ }
23
+ var {
24
+ model,
25
+ reload
26
+ } = fetchResult;
27
+ return /*#__PURE__*/_jsx(IrisGrid, {
28
+ model: model,
29
+ children: /*#__PURE__*/_jsx(PandasReloadButton, {
30
+ onClick: reload
31
+ })
61
32
  });
62
33
  }
63
34
  export default PandasWidgetPlugin;
@@ -1 +1 @@
1
- {"version":3,"file":"PandasWidgetPlugin.js","names":["useCallback","useEffect","useState","IrisGrid","IrisGridModelFactory","useApi","LoadingOverlay","PandasReloadButton","jsx","_jsx","Fragment","_Fragment","jsxs","_jsxs","PandasWidgetPlugin","props","dh","model","setModel","isLoading","setIsLoading","isLoaded","setIsLoaded","fetch","makeModel","_asyncToGenerator","table","handleReload","newModel","cancelled","init","_init","apply","arguments","children","onClick"],"sources":["../src/PandasWidgetPlugin.tsx"],"sourcesContent":["import { useCallback, useEffect, useState } from 'react';\nimport { WidgetComponentProps } from '@deephaven/plugin';\nimport { type dh } from '@deephaven/jsapi-types';\nimport IrisGrid, {\n IrisGridModelFactory,\n type IrisGridModel,\n} from '@deephaven/iris-grid';\nimport { useApi } from '@deephaven/jsapi-bootstrap';\nimport { LoadingOverlay } from '@deephaven/components';\nimport { PandasReloadButton } from './panels/PandasReloadButton';\n\nexport function PandasWidgetPlugin(\n props: WidgetComponentProps<dh.Table>\n): JSX.Element | null {\n const dh = useApi();\n const [model, setModel] = useState<IrisGridModel>();\n const [isLoading, setIsLoading] = useState(true);\n const [isLoaded, setIsLoaded] = useState(false);\n\n const { fetch } = props;\n\n const makeModel = useCallback(async () => {\n const table = await fetch();\n return IrisGridModelFactory.makeModel(dh, table);\n }, [dh, fetch]);\n\n const handleReload = useCallback(async () => {\n setIsLoading(true);\n const newModel = await makeModel();\n setModel(newModel);\n setIsLoading(false);\n }, [makeModel]);\n\n useEffect(() => {\n let cancelled = false;\n async function init() {\n const newModel = await makeModel();\n if (!cancelled) {\n setModel(newModel);\n setIsLoaded(true);\n setIsLoading(false);\n }\n }\n\n init();\n setIsLoading(true);\n\n return () => {\n cancelled = true;\n };\n }, [makeModel]);\n\n return (\n <>\n <LoadingOverlay isLoaded={isLoaded} isLoading={isLoading} />\n {model && (\n <IrisGrid model={model}>\n <PandasReloadButton onClick={handleReload} />\n </IrisGrid>\n )}\n </>\n );\n}\n\nexport default PandasWidgetPlugin;\n"],"mappings":";;AAAA,SAASA,WAAW,EAAEC,SAAS,EAAEC,QAAQ,QAAQ,OAAO;AAGxD,OAAOC,QAAQ,IACbC,oBAAoB,QAEf,sBAAsB;AAC7B,SAASC,MAAM,QAAQ,4BAA4B;AACnD,SAASC,cAAc,QAAQ,uBAAuB;AAAC,SAC9CC,kBAAkB;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAAA,SAAAC,QAAA,IAAAC,SAAA;AAAA,SAAAC,IAAA,IAAAC,KAAA;AAE3B,OAAO,SAASC,kBAAkBA,CAChCC,KAAqC,EACjB;EACpB,IAAMC,EAAE,GAAGX,MAAM,CAAC,CAAC;EACnB,IAAM,CAACY,KAAK,EAAEC,QAAQ,CAAC,GAAGhB,QAAQ,CAAgB,CAAC;EACnD,IAAM,CAACiB,SAAS,EAAEC,YAAY,CAAC,GAAGlB,QAAQ,CAAC,IAAI,CAAC;EAChD,IAAM,CAACmB,QAAQ,EAAEC,WAAW,CAAC,GAAGpB,QAAQ,CAAC,KAAK,CAAC;EAE/C,IAAM;IAAEqB;EAAM,CAAC,GAAGR,KAAK;EAEvB,IAAMS,SAAS,GAAGxB,WAAW,eAAAyB,iBAAA,CAAC,aAAY;IACxC,IAAMC,KAAK,SAASH,KAAK,CAAC,CAAC;IAC3B,OAAOnB,oBAAoB,CAACoB,SAAS,CAACR,EAAE,EAAEU,KAAK,CAAC;EAClD,CAAC,GAAE,CAACV,EAAE,EAAEO,KAAK,CAAC,CAAC;EAEf,IAAMI,YAAY,GAAG3B,WAAW,eAAAyB,iBAAA,CAAC,aAAY;IAC3CL,YAAY,CAAC,IAAI,CAAC;IAClB,IAAMQ,QAAQ,SAASJ,SAAS,CAAC,CAAC;IAClCN,QAAQ,CAACU,QAAQ,CAAC;IAClBR,YAAY,CAAC,KAAK,CAAC;EACrB,CAAC,GAAE,CAACI,SAAS,CAAC,CAAC;EAEfvB,SAAS,CAAC,MAAM;IACd,IAAI4B,SAAS,GAAG,KAAK;IAAC,SACPC,IAAIA,CAAA;MAAA,OAAAC,KAAA,CAAAC,KAAA,OAAAC,SAAA;IAAA;IAAA,SAAAF,MAAA;MAAAA,KAAA,GAAAN,iBAAA,CAAnB,aAAsB;QACpB,IAAMG,QAAQ,SAASJ,SAAS,CAAC,CAAC;QAClC,IAAI,CAACK,SAAS,EAAE;UACdX,QAAQ,CAACU,QAAQ,CAAC;UAClBN,WAAW,CAAC,IAAI,CAAC;UACjBF,YAAY,CAAC,KAAK,CAAC;QACrB;MACF,CAAC;MAAA,OAAAW,KAAA,CAAAC,KAAA,OAAAC,SAAA;IAAA;IAEDH,IAAI,CAAC,CAAC;IACNV,YAAY,CAAC,IAAI,CAAC;IAElB,OAAO,MAAM;MACXS,SAAS,GAAG,IAAI;IAClB,CAAC;EACH,CAAC,EAAE,CAACL,SAAS,CAAC,CAAC;EAEf,oBACEX,KAAA,CAAAF,SAAA;IAAAuB,QAAA,gBACEzB,IAAA,CAACH,cAAc;MAACe,QAAQ,EAAEA,QAAS;MAACF,SAAS,EAAEA;IAAU,CAAE,CAAC,EAC3DF,KAAK,iBACJR,IAAA,CAACN,QAAQ;MAACc,KAAK,EAAEA,KAAM;MAAAiB,QAAA,eACrBzB,IAAA,CAACF,kBAAkB;QAAC4B,OAAO,EAAER;MAAa,CAAE;IAAC,CACrC,CACX;EAAA,CACD,CAAC;AAEP;AAEA,eAAeb,kBAAkB"}
1
+ {"version":3,"file":"PandasWidgetPlugin.js","names":["IrisGrid","LoadingOverlay","getErrorMessage","PandasReloadButton","useIrisGridModel","jsx","_jsx","PandasWidgetPlugin","_ref","fetch","fetchResult","status","isLoading","errorMessage","error","model","reload","children","onClick"],"sources":["../src/PandasWidgetPlugin.tsx"],"sourcesContent":["import { WidgetComponentProps } from '@deephaven/plugin';\nimport { type dh } from '@deephaven/jsapi-types';\nimport IrisGrid from '@deephaven/iris-grid';\nimport { LoadingOverlay } from '@deephaven/components';\nimport { getErrorMessage } from '@deephaven/utils';\nimport { PandasReloadButton } from './panels/PandasReloadButton';\nimport { useIrisGridModel } from './useIrisGridModel';\n\nexport function PandasWidgetPlugin({\n fetch,\n}: WidgetComponentProps<dh.Table>): JSX.Element | null {\n const fetchResult = useIrisGridModel(fetch);\n\n if (fetchResult.status === 'loading') {\n return <LoadingOverlay isLoading />;\n }\n\n if (fetchResult.status === 'error') {\n return (\n <LoadingOverlay\n errorMessage={getErrorMessage(fetchResult.error)}\n isLoading={false}\n />\n );\n }\n\n const { model, reload } = fetchResult;\n return (\n <IrisGrid model={model}>\n <PandasReloadButton onClick={reload} />\n </IrisGrid>\n );\n}\n\nexport default PandasWidgetPlugin;\n"],"mappings":"AAEA,OAAOA,QAAQ,MAAM,sBAAsB;AAC3C,SAASC,cAAc,QAAQ,uBAAuB;AACtD,SAASC,eAAe,QAAQ,kBAAkB;AAAC,SAC1CC,kBAAkB;AAAA,SAClBC,gBAAgB;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAEzB,OAAO,SAASC,kBAAkBA,CAAAC,IAAA,EAEqB;EAAA,IAFpB;IACjCC;EAC8B,CAAC,GAAAD,IAAA;EAC/B,IAAME,WAAW,GAAGN,gBAAgB,CAACK,KAAK,CAAC;EAE3C,IAAIC,WAAW,CAACC,MAAM,KAAK,SAAS,EAAE;IACpC,oBAAOL,IAAA,CAACL,cAAc;MAACW,SAAS;IAAA,CAAE,CAAC;EACrC;EAEA,IAAIF,WAAW,CAACC,MAAM,KAAK,OAAO,EAAE;IAClC,oBACEL,IAAA,CAACL,cAAc;MACbY,YAAY,EAAEX,eAAe,CAACQ,WAAW,CAACI,KAAK,CAAE;MACjDF,SAAS,EAAE;IAAM,CAClB,CAAC;EAEN;EAEA,IAAM;IAAEG,KAAK;IAAEC;EAAO,CAAC,GAAGN,WAAW;EACrC,oBACEJ,IAAA,CAACN,QAAQ;IAACe,KAAK,EAAEA,KAAM;IAAAE,QAAA,eACrBX,IAAA,CAACH,kBAAkB;MAACe,OAAO,EAAEF;IAAO,CAAE;EAAC,CAC/B,CAAC;AAEf;AAEA,eAAeT,kBAAkB"}
@@ -0,0 +1,20 @@
1
+ import { type dh } from '@deephaven/jsapi-types';
2
+ import { IrisGridModel } from '@deephaven/iris-grid';
3
+ export type IrisGridModelFetch = () => Promise<dh.Table>;
4
+ export type IrisGridModelFetchErrorResult = {
5
+ error: NonNullable<unknown>;
6
+ status: 'error';
7
+ };
8
+ export type IrisGridModelFetchLoadingResult = {
9
+ status: 'loading';
10
+ };
11
+ export type IrisGridModelFetchSuccessResult = {
12
+ status: 'success';
13
+ model: IrisGridModel;
14
+ };
15
+ export type IrisGridModelFetchResult = (IrisGridModelFetchErrorResult | IrisGridModelFetchLoadingResult | IrisGridModelFetchSuccessResult) & {
16
+ reload: () => void;
17
+ };
18
+ /** Pass in a table `fetch` function, will load the model and handle any errors */
19
+ export declare function useIrisGridModel(fetch: IrisGridModelFetch): IrisGridModelFetchResult;
20
+ //# sourceMappingURL=useIrisGridModel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useIrisGridModel.d.ts","sourceRoot":"","sources":["../src/useIrisGridModel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,EAAE,MAAM,wBAAwB,CAAC;AAEjD,OAAO,EAAE,aAAa,EAAwB,MAAM,sBAAsB,CAAC;AAG3E,MAAM,MAAM,kBAAkB,GAAG,MAAM,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;AAEzD,MAAM,MAAM,6BAA6B,GAAG;IAC1C,KAAK,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;IAC5B,MAAM,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,+BAA+B,GAAG;IAC5C,MAAM,EAAE,SAAS,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,+BAA+B,GAAG;IAC5C,MAAM,EAAE,SAAS,CAAC;IAClB,KAAK,EAAE,aAAa,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG,CACnC,6BAA6B,GAC7B,+BAA+B,GAC/B,+BAA+B,CAClC,GAAG;IACF,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB,CAAC;AAEF,kFAAkF;AAClF,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,kBAAkB,GACxB,wBAAwB,CAsF1B"}
@@ -0,0 +1,96 @@
1
+ function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
2
+ function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
3
+ import { useApi } from '@deephaven/jsapi-bootstrap';
4
+ import { IrisGridModel, IrisGridModelFactory } from '@deephaven/iris-grid';
5
+ import { useCallback, useEffect, useState } from 'react';
6
+ /** Pass in a table `fetch` function, will load the model and handle any errors */
7
+ export function useIrisGridModel(fetch) {
8
+ var dh = useApi();
9
+ var [model, setModel] = useState();
10
+ var [error, setError] = useState();
11
+ var [isLoading, setIsLoading] = useState(true);
12
+ var makeModel = useCallback( /*#__PURE__*/_asyncToGenerator(function* () {
13
+ var table = yield fetch();
14
+ return IrisGridModelFactory.makeModel(dh, table);
15
+ }), [dh, fetch]);
16
+ var reload = useCallback( /*#__PURE__*/_asyncToGenerator(function* () {
17
+ setIsLoading(true);
18
+ setError(undefined);
19
+ try {
20
+ var newModel = yield makeModel();
21
+ setModel(newModel);
22
+ setIsLoading(false);
23
+ } catch (e) {
24
+ setError(e);
25
+ setIsLoading(false);
26
+ }
27
+ }), [makeModel]);
28
+ useEffect(() => {
29
+ var cancelled = false;
30
+ function init() {
31
+ return _init.apply(this, arguments);
32
+ }
33
+ function _init() {
34
+ _init = _asyncToGenerator(function* () {
35
+ setIsLoading(true);
36
+ setError(undefined);
37
+ try {
38
+ var newModel = yield makeModel();
39
+ if (!cancelled) {
40
+ setModel(newModel);
41
+ setIsLoading(false);
42
+ }
43
+ } catch (e) {
44
+ if (!cancelled) {
45
+ setError(e);
46
+ setIsLoading(false);
47
+ }
48
+ }
49
+ });
50
+ return _init.apply(this, arguments);
51
+ }
52
+ init();
53
+ return () => {
54
+ cancelled = true;
55
+ };
56
+ }, [makeModel]);
57
+ useEffect(function startListeningModel() {
58
+ if (!model) {
59
+ return;
60
+ }
61
+
62
+ // If the table inside a widget is disconnected, then don't bother trying to listen to reconnect, just close it and show a message
63
+ // Widget closes the table already when it is disconnected, so no need to close it again
64
+ function handleDisconnect() {
65
+ setError(new Error('Table disconnected'));
66
+ setModel(undefined);
67
+ setIsLoading(false);
68
+ }
69
+ model.addEventListener(IrisGridModel.EVENT.DISCONNECT, handleDisconnect);
70
+ return () => {
71
+ model.removeEventListener(IrisGridModel.EVENT.DISCONNECT, handleDisconnect);
72
+ };
73
+ }, [model]);
74
+ if (isLoading) {
75
+ return {
76
+ reload,
77
+ status: 'loading'
78
+ };
79
+ }
80
+ if (error != null) {
81
+ return {
82
+ error,
83
+ reload,
84
+ status: 'error'
85
+ };
86
+ }
87
+ if (model != null) {
88
+ return {
89
+ model,
90
+ reload,
91
+ status: 'success'
92
+ };
93
+ }
94
+ throw new Error('Invalid state');
95
+ }
96
+ //# sourceMappingURL=useIrisGridModel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useIrisGridModel.js","names":["useApi","IrisGridModel","IrisGridModelFactory","useCallback","useEffect","useState","useIrisGridModel","fetch","dh","model","setModel","error","setError","isLoading","setIsLoading","makeModel","_asyncToGenerator","table","reload","undefined","newModel","e","cancelled","init","_init","apply","arguments","startListeningModel","handleDisconnect","Error","addEventListener","EVENT","DISCONNECT","removeEventListener","status"],"sources":["../src/useIrisGridModel.ts"],"sourcesContent":["import { type dh } from '@deephaven/jsapi-types';\nimport { useApi } from '@deephaven/jsapi-bootstrap';\nimport { IrisGridModel, IrisGridModelFactory } from '@deephaven/iris-grid';\nimport { useCallback, useEffect, useState } from 'react';\n\nexport type IrisGridModelFetch = () => Promise<dh.Table>;\n\nexport type IrisGridModelFetchErrorResult = {\n error: NonNullable<unknown>;\n status: 'error';\n};\n\nexport type IrisGridModelFetchLoadingResult = {\n status: 'loading';\n};\n\nexport type IrisGridModelFetchSuccessResult = {\n status: 'success';\n model: IrisGridModel;\n};\n\nexport type IrisGridModelFetchResult = (\n | IrisGridModelFetchErrorResult\n | IrisGridModelFetchLoadingResult\n | IrisGridModelFetchSuccessResult\n) & {\n reload: () => void;\n};\n\n/** Pass in a table `fetch` function, will load the model and handle any errors */\nexport function useIrisGridModel(\n fetch: IrisGridModelFetch\n): IrisGridModelFetchResult {\n const dh = useApi();\n const [model, setModel] = useState<IrisGridModel>();\n const [error, setError] = useState<unknown>();\n const [isLoading, setIsLoading] = useState(true);\n\n const makeModel = useCallback(async () => {\n const table = await fetch();\n return IrisGridModelFactory.makeModel(dh, table);\n }, [dh, fetch]);\n\n const reload = useCallback(async () => {\n setIsLoading(true);\n setError(undefined);\n try {\n const newModel = await makeModel();\n setModel(newModel);\n setIsLoading(false);\n } catch (e) {\n setError(e);\n setIsLoading(false);\n }\n }, [makeModel]);\n\n useEffect(() => {\n let cancelled = false;\n async function init() {\n setIsLoading(true);\n setError(undefined);\n try {\n const newModel = await makeModel();\n if (!cancelled) {\n setModel(newModel);\n setIsLoading(false);\n }\n } catch (e) {\n if (!cancelled) {\n setError(e);\n setIsLoading(false);\n }\n }\n }\n\n init();\n\n return () => {\n cancelled = true;\n };\n }, [makeModel]);\n\n useEffect(\n function startListeningModel() {\n if (!model) {\n return;\n }\n\n // If the table inside a widget is disconnected, then don't bother trying to listen to reconnect, just close it and show a message\n // Widget closes the table already when it is disconnected, so no need to close it again\n function handleDisconnect() {\n setError(new Error('Table disconnected'));\n setModel(undefined);\n setIsLoading(false);\n }\n\n model.addEventListener(IrisGridModel.EVENT.DISCONNECT, handleDisconnect);\n\n return () => {\n model.removeEventListener(\n IrisGridModel.EVENT.DISCONNECT,\n handleDisconnect\n );\n };\n },\n [model]\n );\n\n if (isLoading) {\n return { reload, status: 'loading' };\n }\n if (error != null) {\n return { error, reload, status: 'error' };\n }\n if (model != null) {\n return { model, reload, status: 'success' };\n }\n throw new Error('Invalid state');\n}\n"],"mappings":";;AACA,SAASA,MAAM,QAAQ,4BAA4B;AACnD,SAASC,aAAa,EAAEC,oBAAoB,QAAQ,sBAAsB;AAC1E,SAASC,WAAW,EAAEC,SAAS,EAAEC,QAAQ,QAAQ,OAAO;AA0BxD;AACA,OAAO,SAASC,gBAAgBA,CAC9BC,KAAyB,EACC;EAC1B,IAAMC,EAAE,GAAGR,MAAM,CAAC,CAAC;EACnB,IAAM,CAACS,KAAK,EAAEC,QAAQ,CAAC,GAAGL,QAAQ,CAAgB,CAAC;EACnD,IAAM,CAACM,KAAK,EAAEC,QAAQ,CAAC,GAAGP,QAAQ,CAAU,CAAC;EAC7C,IAAM,CAACQ,SAAS,EAAEC,YAAY,CAAC,GAAGT,QAAQ,CAAC,IAAI,CAAC;EAEhD,IAAMU,SAAS,GAAGZ,WAAW,eAAAa,iBAAA,CAAC,aAAY;IACxC,IAAMC,KAAK,SAASV,KAAK,CAAC,CAAC;IAC3B,OAAOL,oBAAoB,CAACa,SAAS,CAACP,EAAE,EAAES,KAAK,CAAC;EAClD,CAAC,GAAE,CAACT,EAAE,EAAED,KAAK,CAAC,CAAC;EAEf,IAAMW,MAAM,GAAGf,WAAW,eAAAa,iBAAA,CAAC,aAAY;IACrCF,YAAY,CAAC,IAAI,CAAC;IAClBF,QAAQ,CAACO,SAAS,CAAC;IACnB,IAAI;MACF,IAAMC,QAAQ,SAASL,SAAS,CAAC,CAAC;MAClCL,QAAQ,CAACU,QAAQ,CAAC;MAClBN,YAAY,CAAC,KAAK,CAAC;IACrB,CAAC,CAAC,OAAOO,CAAC,EAAE;MACVT,QAAQ,CAACS,CAAC,CAAC;MACXP,YAAY,CAAC,KAAK,CAAC;IACrB;EACF,CAAC,GAAE,CAACC,SAAS,CAAC,CAAC;EAEfX,SAAS,CAAC,MAAM;IACd,IAAIkB,SAAS,GAAG,KAAK;IAAC,SACPC,IAAIA,CAAA;MAAA,OAAAC,KAAA,CAAAC,KAAA,OAAAC,SAAA;IAAA;IAAA,SAAAF,MAAA;MAAAA,KAAA,GAAAR,iBAAA,CAAnB,aAAsB;QACpBF,YAAY,CAAC,IAAI,CAAC;QAClBF,QAAQ,CAACO,SAAS,CAAC;QACnB,IAAI;UACF,IAAMC,QAAQ,SAASL,SAAS,CAAC,CAAC;UAClC,IAAI,CAACO,SAAS,EAAE;YACdZ,QAAQ,CAACU,QAAQ,CAAC;YAClBN,YAAY,CAAC,KAAK,CAAC;UACrB;QACF,CAAC,CAAC,OAAOO,CAAC,EAAE;UACV,IAAI,CAACC,SAAS,EAAE;YACdV,QAAQ,CAACS,CAAC,CAAC;YACXP,YAAY,CAAC,KAAK,CAAC;UACrB;QACF;MACF,CAAC;MAAA,OAAAU,KAAA,CAAAC,KAAA,OAAAC,SAAA;IAAA;IAEDH,IAAI,CAAC,CAAC;IAEN,OAAO,MAAM;MACXD,SAAS,GAAG,IAAI;IAClB,CAAC;EACH,CAAC,EAAE,CAACP,SAAS,CAAC,CAAC;EAEfX,SAAS,CACP,SAASuB,mBAAmBA,CAAA,EAAG;IAC7B,IAAI,CAAClB,KAAK,EAAE;MACV;IACF;;IAEA;IACA;IACA,SAASmB,gBAAgBA,CAAA,EAAG;MAC1BhB,QAAQ,CAAC,IAAIiB,KAAK,CAAC,oBAAoB,CAAC,CAAC;MACzCnB,QAAQ,CAACS,SAAS,CAAC;MACnBL,YAAY,CAAC,KAAK,CAAC;IACrB;IAEAL,KAAK,CAACqB,gBAAgB,CAAC7B,aAAa,CAAC8B,KAAK,CAACC,UAAU,EAAEJ,gBAAgB,CAAC;IAExE,OAAO,MAAM;MACXnB,KAAK,CAACwB,mBAAmB,CACvBhC,aAAa,CAAC8B,KAAK,CAACC,UAAU,EAC9BJ,gBACF,CAAC;IACH,CAAC;EACH,CAAC,EACD,CAACnB,KAAK,CACR,CAAC;EAED,IAAII,SAAS,EAAE;IACb,OAAO;MAAEK,MAAM;MAAEgB,MAAM,EAAE;IAAU,CAAC;EACtC;EACA,IAAIvB,KAAK,IAAI,IAAI,EAAE;IACjB,OAAO;MAAEA,KAAK;MAAEO,MAAM;MAAEgB,MAAM,EAAE;IAAQ,CAAC;EAC3C;EACA,IAAIzB,KAAK,IAAI,IAAI,EAAE;IACjB,OAAO;MAAEA,KAAK;MAAES,MAAM;MAAEgB,MAAM,EAAE;IAAU,CAAC;EAC7C;EACA,MAAM,IAAIL,KAAK,CAAC,eAAe,CAAC;AAClC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@deephaven/dashboard-core-plugins",
3
- "version": "0.91.1-webpack-fix.0+424a5cee",
3
+ "version": "0.92.0",
4
4
  "description": "Deephaven Dashboard Core Plugins",
5
5
  "author": "Deephaven Data Labs LLC",
6
6
  "license": "Apache-2.0",
@@ -22,26 +22,26 @@
22
22
  "build:sass": "sass --embed-sources --load-path=../../node_modules ./src:./dist"
23
23
  },
24
24
  "dependencies": {
25
- "@deephaven/chart": "^0.91.1-webpack-fix.0+424a5cee",
26
- "@deephaven/components": "^0.91.1-webpack-fix.0+424a5cee",
27
- "@deephaven/console": "^0.91.1-webpack-fix.0+424a5cee",
28
- "@deephaven/dashboard": "^0.91.1-webpack-fix.0+424a5cee",
29
- "@deephaven/file-explorer": "^0.91.1-webpack-fix.0+424a5cee",
30
- "@deephaven/filters": "^0.91.1-webpack-fix.0+424a5cee",
31
- "@deephaven/golden-layout": "^0.91.1-webpack-fix.0+424a5cee",
32
- "@deephaven/grid": "^0.91.1-webpack-fix.0+424a5cee",
33
- "@deephaven/icons": "^0.91.1-webpack-fix.0+424a5cee",
34
- "@deephaven/iris-grid": "^0.91.1-webpack-fix.0+424a5cee",
35
- "@deephaven/jsapi-bootstrap": "^0.91.1-webpack-fix.0+424a5cee",
36
- "@deephaven/jsapi-components": "^0.91.1-webpack-fix.0+424a5cee",
25
+ "@deephaven/chart": "^0.92.0",
26
+ "@deephaven/components": "^0.92.0",
27
+ "@deephaven/console": "^0.92.0",
28
+ "@deephaven/dashboard": "^0.92.0",
29
+ "@deephaven/file-explorer": "^0.92.0",
30
+ "@deephaven/filters": "^0.92.0",
31
+ "@deephaven/golden-layout": "^0.92.0",
32
+ "@deephaven/grid": "^0.92.0",
33
+ "@deephaven/icons": "^0.92.0",
34
+ "@deephaven/iris-grid": "^0.92.0",
35
+ "@deephaven/jsapi-bootstrap": "^0.92.0",
36
+ "@deephaven/jsapi-components": "^0.92.0",
37
37
  "@deephaven/jsapi-types": "^1.0.0-dev0.34.0",
38
- "@deephaven/jsapi-utils": "^0.91.1-webpack-fix.0+424a5cee",
39
- "@deephaven/log": "^0.91.1-webpack-fix.0+424a5cee",
40
- "@deephaven/plugin": "^0.91.1-webpack-fix.0+424a5cee",
41
- "@deephaven/react-hooks": "^0.91.1-webpack-fix.0+424a5cee",
42
- "@deephaven/redux": "^0.91.1-webpack-fix.0+424a5cee",
43
- "@deephaven/storage": "^0.91.1-webpack-fix.0+424a5cee",
44
- "@deephaven/utils": "^0.91.1-webpack-fix.0+424a5cee",
38
+ "@deephaven/jsapi-utils": "^0.92.0",
39
+ "@deephaven/log": "^0.92.0",
40
+ "@deephaven/plugin": "^0.92.0",
41
+ "@deephaven/react-hooks": "^0.92.0",
42
+ "@deephaven/redux": "^0.92.0",
43
+ "@deephaven/storage": "^0.92.0",
44
+ "@deephaven/utils": "^0.92.0",
45
45
  "@fortawesome/react-fontawesome": "^0.2.0",
46
46
  "classnames": "^2.3.1",
47
47
  "fast-deep-equal": "^3.1.3",
@@ -65,8 +65,8 @@
65
65
  "react-redux": "^7.2.4"
66
66
  },
67
67
  "devDependencies": {
68
- "@deephaven/jsapi-shim": "^0.91.1-webpack-fix.0+424a5cee",
69
- "@deephaven/mocks": "^0.91.1-webpack-fix.0+424a5cee"
68
+ "@deephaven/jsapi-shim": "^0.92.0",
69
+ "@deephaven/mocks": "^0.92.0"
70
70
  },
71
71
  "files": [
72
72
  "dist",
@@ -78,5 +78,5 @@
78
78
  "publishConfig": {
79
79
  "access": "public"
80
80
  },
81
- "gitHead": "424a5cee7f15f49438cc83ac5c7cff0630d3104b"
81
+ "gitHead": "0994c522bcda37eb79e3a6bf2f3ac63f680a49c5"
82
82
  }