@deephaven/iris-grid 0.11.9-beta.0 → 0.11.10-beta.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.
Files changed (25) hide show
  1. package/dist/IrisGridCellOverflowModal.d.ts.map +1 -1
  2. package/dist/IrisGridCellOverflowModal.js +3 -3
  3. package/dist/IrisGridCellOverflowModal.js.map +1 -1
  4. package/dist/IrisGridModelUpdater.d.ts.map +1 -1
  5. package/dist/IrisGridModelUpdater.js +12 -12
  6. package/dist/IrisGridModelUpdater.js.map +1 -1
  7. package/dist/PendingDataBottomBar.d.ts.map +1 -1
  8. package/dist/PendingDataBottomBar.js +5 -3
  9. package/dist/PendingDataBottomBar.js.map +1 -1
  10. package/dist/sidebar/aggregations/Aggregations.d.ts.map +1 -1
  11. package/dist/sidebar/aggregations/Aggregations.js +1 -1
  12. package/dist/sidebar/aggregations/Aggregations.js.map +1 -1
  13. package/dist/sidebar/conditional-formatting/ColumnFormatEditor.d.ts.map +1 -1
  14. package/dist/sidebar/conditional-formatting/ColumnFormatEditor.js +1 -1
  15. package/dist/sidebar/conditional-formatting/ColumnFormatEditor.js.map +1 -1
  16. package/dist/sidebar/conditional-formatting/ConditionEditor.d.ts.map +1 -1
  17. package/dist/sidebar/conditional-formatting/ConditionEditor.js +1 -1
  18. package/dist/sidebar/conditional-formatting/ConditionEditor.js.map +1 -1
  19. package/dist/sidebar/conditional-formatting/RowFormatEditor.d.ts.map +1 -1
  20. package/dist/sidebar/conditional-formatting/RowFormatEditor.js +1 -1
  21. package/dist/sidebar/conditional-formatting/RowFormatEditor.js.map +1 -1
  22. package/dist/sidebar/conditional-formatting/StyleEditor.d.ts.map +1 -1
  23. package/dist/sidebar/conditional-formatting/StyleEditor.js +1 -1
  24. package/dist/sidebar/conditional-formatting/StyleEditor.js.map +1 -1
  25. package/package.json +12 -12
@@ -1 +1 @@
1
- {"version":3,"file":"IrisGridCellOverflowModal.d.ts","sourceRoot":"","sources":["../src/IrisGridCellOverflowModal.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsC,MAAM,OAAO,CAAC;AAM3D,OAAO,kCAAkC,CAAC;AAE1C,UAAU,8BAA8B;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,MAAM,CAAC,OAAO,UAAU,yBAAyB,CAAC,EAChD,IAAI,EACJ,MAAM,EACN,OAAO,GACR,EAAE,8BAA8B,GAAG,KAAK,CAAC,SAAS,CAiJlD"}
1
+ {"version":3,"file":"IrisGridCellOverflowModal.d.ts","sourceRoot":"","sources":["../src/IrisGridCellOverflowModal.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsC,MAAM,OAAO,CAAC;AAM3D,OAAO,kCAAkC,CAAC;AAE1C,UAAU,8BAA8B;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,MAAM,CAAC,OAAO,UAAU,yBAAyB,CAAC,EAChD,IAAI,EACJ,MAAM,EACN,OAAO,GACR,EAAE,8BAA8B,GAAG,KAAK,CAAC,SAAS,CA0JlD"}
@@ -17,7 +17,7 @@ export default function IrisGridCellOverflowModal(_ref) {
17
17
  var [canFormat, setCanFormat] = useState(false);
18
18
  var editorRef = useRef(); // Update format button on open
19
19
 
20
- useEffect(() => {
20
+ useEffect(function enableFormatButtonWhenOpen() {
21
21
  if (!isOpen) {
22
22
  return;
23
23
  }
@@ -32,13 +32,13 @@ export default function IrisGridCellOverflowModal(_ref) {
32
32
  setIsFormatted(false);
33
33
  }, [isOpen, text]); // Re-layout editor on height change
34
34
 
35
- useEffect(() => {
35
+ useEffect(function updateLayoutOnHeightChange() {
36
36
  if (editorRef.current) {
37
37
  editorRef.current.layout();
38
38
  }
39
39
  }, [height]); // Update editor options on line number toggle
40
40
 
41
- useEffect(() => {
41
+ useEffect(function toggleShowLineNumber() {
42
42
  if (editorRef.current) {
43
43
  editorRef.current.updateOptions({
44
44
  lineNumbers: showLineNumbers ? 'on' : 'off'
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/IrisGridCellOverflowModal.tsx"],"names":["React","useEffect","useRef","useState","Editor","Modal","ModalBody","ModalHeader","Button","vsJson","vsListOrdered","IrisGridCellOverflowModal","text","isOpen","onClose","isOpened","setIsOpened","height","setHeight","showLineNumbers","setShowLineNumbers","isFormatted","setIsFormatted","canFormat","setCanFormat","editorRef","JSON","parse","current","layout","updateOptions","lineNumbers","toggleLineNumbers","formatAsJSON","model","getModel","setValue","stringify","undefined","autoSetLineNumbers","editor","getLineCount","handleToggle","onEditorInitialized","onDidContentSizeChange","contentHeight","value","readOnly","wordWrap","language","folding","padding","bottom","overviewRulerLanes","renderLineHighlight","find","seedSearchStringFromSelection"],"mappings":"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","sourcesContent":["import React, { useEffect, useRef, useState } from 'react';\nimport { Editor } from '@deephaven/console';\nimport { Modal, ModalBody, ModalHeader } from 'reactstrap';\nimport * as monaco from 'monaco-editor';\nimport { Button } from '@deephaven/components';\nimport { vsJson, vsListOrdered } from '@deephaven/icons';\nimport './IrisGridCellOverflowModal.scss';\n\ninterface IrisGridCellOverflowModalProps {\n text: string;\n isOpen: boolean;\n onClose: () => void;\n}\n\nexport default function IrisGridCellOverflowModal({\n text,\n isOpen,\n onClose,\n}: IrisGridCellOverflowModalProps): React.ReactNode {\n const [isOpened, setIsOpened] = useState(false);\n const [height, setHeight] = useState(0);\n const [showLineNumbers, setShowLineNumbers] = useState(false);\n const [isFormatted, setIsFormatted] = useState(false);\n const [canFormat, setCanFormat] = useState(false);\n const editorRef = useRef<monaco.editor.IStandaloneCodeEditor>();\n\n // Update format button on open\n useEffect(() => {\n if (!isOpen) {\n return;\n }\n\n try {\n JSON.parse(text);\n setCanFormat(true);\n } catch {\n setCanFormat(false);\n }\n setIsFormatted(false);\n }, [isOpen, text]);\n\n // Re-layout editor on height change\n useEffect(() => {\n if (editorRef.current) {\n editorRef.current.layout();\n }\n }, [height]);\n\n // Update editor options on line number toggle\n useEffect(() => {\n if (editorRef.current) {\n editorRef.current.updateOptions({\n lineNumbers: showLineNumbers ? 'on' : 'off',\n });\n }\n }, [showLineNumbers]);\n\n function toggleLineNumbers() {\n setShowLineNumbers(!showLineNumbers);\n }\n\n function formatAsJSON() {\n const model = editorRef.current?.getModel();\n if (!canFormat || !model) {\n return;\n }\n\n if (!isFormatted) {\n model.setValue(JSON.stringify(JSON.parse(text), undefined, 2));\n setIsFormatted(true);\n } else {\n model.setValue(text);\n setIsFormatted(false);\n }\n autoSetLineNumbers();\n }\n\n function autoSetLineNumbers() {\n const editor = editorRef.current;\n if (!editor) {\n return;\n }\n\n setShowLineNumbers((editor.getModel()?.getLineCount() ?? 0) > 1);\n }\n\n function handleToggle() {\n if (isOpened) {\n editorRef.current = undefined;\n onClose();\n }\n }\n\n function onEditorInitialized(editor: monaco.editor.IStandaloneCodeEditor) {\n editorRef.current = editor;\n editor.onDidContentSizeChange(({ contentHeight }) =>\n setHeight(contentHeight)\n );\n autoSetLineNumbers();\n }\n\n if (!isOpen && !isOpened) {\n return null;\n }\n\n return (\n <Modal\n isOpen={isOpen}\n centered\n keyboard\n toggle={handleToggle}\n onOpened={() => setIsOpened(true)}\n onClosed={() => {\n setIsOpened(false);\n setHeight(0);\n }}\n size=\"xl\"\n className=\"theme-bg-dark cell-overflow-modal\"\n >\n <ModalHeader tag=\"div\" toggle={onClose}>\n <h5 className=\"overflow-modal-title\">Cell Contents</h5>\n <Button\n kind=\"inline\"\n active={showLineNumbers}\n icon={vsListOrdered}\n tooltip=\"Toggle line numbers\"\n onClick={toggleLineNumbers}\n />\n {canFormat && (\n <Button\n kind=\"inline\"\n icon={vsJson}\n active={isFormatted}\n tooltip=\"Format as JSON\"\n onClick={formatAsJSON}\n />\n )}\n </ModalHeader>\n <ModalBody style={{ height }}>\n <Editor\n onEditorInitialized={onEditorInitialized}\n settings={{\n value: text,\n readOnly: true,\n wordWrap: 'on',\n // Loading json language w/o the monaco workers causes UI freezes and monaco errors. TS colorizes the same\n language: canFormat ? 'typescript' : 'plaintext',\n folding: canFormat,\n padding: { bottom: 16 },\n lineNumbers: showLineNumbers ? 'on' : 'off',\n overviewRulerLanes: 0,\n renderLineHighlight: 'none',\n /*\n The entire string may be 1 giant line\n Monaco by default seeds find w/ that line\n On very long strings this hangs the browser, so never seed the search\n */\n find: { seedSearchStringFromSelection: 'never' },\n }}\n />\n </ModalBody>\n </Modal>\n );\n}\n"],"file":"IrisGridCellOverflowModal.js"}
1
+ {"version":3,"sources":["../src/IrisGridCellOverflowModal.tsx"],"names":["React","useEffect","useRef","useState","Editor","Modal","ModalBody","ModalHeader","Button","vsJson","vsListOrdered","IrisGridCellOverflowModal","text","isOpen","onClose","isOpened","setIsOpened","height","setHeight","showLineNumbers","setShowLineNumbers","isFormatted","setIsFormatted","canFormat","setCanFormat","editorRef","enableFormatButtonWhenOpen","JSON","parse","updateLayoutOnHeightChange","current","layout","toggleShowLineNumber","updateOptions","lineNumbers","toggleLineNumbers","formatAsJSON","model","getModel","setValue","stringify","undefined","autoSetLineNumbers","editor","getLineCount","handleToggle","onEditorInitialized","onDidContentSizeChange","contentHeight","value","readOnly","wordWrap","language","folding","padding","bottom","overviewRulerLanes","renderLineHighlight","find","seedSearchStringFromSelection"],"mappings":"AAAA,OAAOA,KAAP,IAAgBC,SAAhB,EAA2BC,MAA3B,EAAmCC,QAAnC,QAAmD,OAAnD;AACA,SAASC,MAAT,QAAuB,oBAAvB;AACA,SAASC,KAAT,EAAgBC,SAAhB,EAA2BC,WAA3B,QAA8C,YAA9C;AAEA,SAASC,MAAT,QAAuB,uBAAvB;AACA,SAASC,MAAT,EAAiBC,aAAjB,QAAsC,kBAAtC;;AASA,eAAe,SAASC,yBAAT,OAIqC;AAAA,MAJF;AAChDC,IAAAA,IADgD;AAEhDC,IAAAA,MAFgD;AAGhDC,IAAAA;AAHgD,GAIE;AAClD,MAAM,CAACC,QAAD,EAAWC,WAAX,IAA0Bb,QAAQ,CAAC,KAAD,CAAxC;AACA,MAAM,CAACc,MAAD,EAASC,SAAT,IAAsBf,QAAQ,CAAC,CAAD,CAApC;AACA,MAAM,CAACgB,eAAD,EAAkBC,kBAAlB,IAAwCjB,QAAQ,CAAC,KAAD,CAAtD;AACA,MAAM,CAACkB,WAAD,EAAcC,cAAd,IAAgCnB,QAAQ,CAAC,KAAD,CAA9C;AACA,MAAM,CAACoB,SAAD,EAAYC,YAAZ,IAA4BrB,QAAQ,CAAC,KAAD,CAA1C;AACA,MAAMsB,SAAS,GAAGvB,MAAM,EAAxB,CANkD,CAQlD;;AACAD,EAAAA,SAAS,CACP,SAASyB,0BAAT,GAAsC;AACpC,QAAI,CAACb,MAAL,EAAa;AACX;AACD;;AAED,QAAI;AACFc,MAAAA,IAAI,CAACC,KAAL,CAAWhB,IAAX;AACAY,MAAAA,YAAY,CAAC,IAAD,CAAZ;AACD,KAHD,CAGE,gBAAM;AACNA,MAAAA,YAAY,CAAC,KAAD,CAAZ;AACD;;AACDF,IAAAA,cAAc,CAAC,KAAD,CAAd;AACD,GAbM,EAcP,CAACT,MAAD,EAASD,IAAT,CAdO,CAAT,CATkD,CA0BlD;;AACAX,EAAAA,SAAS,CACP,SAAS4B,0BAAT,GAAsC;AACpC,QAAIJ,SAAS,CAACK,OAAd,EAAuB;AACrBL,MAAAA,SAAS,CAACK,OAAV,CAAkBC,MAAlB;AACD;AACF,GALM,EAMP,CAACd,MAAD,CANO,CAAT,CA3BkD,CAoClD;;AACAhB,EAAAA,SAAS,CACP,SAAS+B,oBAAT,GAAgC;AAC9B,QAAIP,SAAS,CAACK,OAAd,EAAuB;AACrBL,MAAAA,SAAS,CAACK,OAAV,CAAkBG,aAAlB,CAAgC;AAC9BC,QAAAA,WAAW,EAAEf,eAAe,GAAG,IAAH,GAAU;AADR,OAAhC;AAGD;AACF,GAPM,EAQP,CAACA,eAAD,CARO,CAAT;;AAWA,WAASgB,iBAAT,GAA6B;AAC3Bf,IAAAA,kBAAkB,CAAC,CAACD,eAAF,CAAlB;AACD;;AAED,WAASiB,YAAT,GAAwB;AAAA;;AACtB,QAAMC,KAAK,yBAAGZ,SAAS,CAACK,OAAb,uDAAG,mBAAmBQ,QAAnB,EAAd;;AACA,QAAI,CAACf,SAAD,IAAc,CAACc,KAAnB,EAA0B;AACxB;AACD;;AAED,QAAI,CAAChB,WAAL,EAAkB;AAChBgB,MAAAA,KAAK,CAACE,QAAN,CAAeZ,IAAI,CAACa,SAAL,CAAeb,IAAI,CAACC,KAAL,CAAWhB,IAAX,CAAf,EAAiC6B,SAAjC,EAA4C,CAA5C,CAAf;AACAnB,MAAAA,cAAc,CAAC,IAAD,CAAd;AACD,KAHD,MAGO;AACLe,MAAAA,KAAK,CAACE,QAAN,CAAe3B,IAAf;AACAU,MAAAA,cAAc,CAAC,KAAD,CAAd;AACD;;AACDoB,IAAAA,kBAAkB;AACnB;;AAED,WAASA,kBAAT,GAA8B;AAAA;;AAC5B,QAAMC,MAAM,GAAGlB,SAAS,CAACK,OAAzB;;AACA,QAAI,CAACa,MAAL,EAAa;AACX;AACD;;AAEDvB,IAAAA,kBAAkB,CAAC,8CAACuB,MAAM,CAACL,QAAP,EAAD,qDAAC,iBAAmBM,YAAnB,EAAD,yEAAsC,CAAtC,IAA2C,CAA5C,CAAlB;AACD;;AAED,WAASC,YAAT,GAAwB;AACtB,QAAI9B,QAAJ,EAAc;AACZU,MAAAA,SAAS,CAACK,OAAV,GAAoBW,SAApB;AACA3B,MAAAA,OAAO;AACR;AACF;;AAED,WAASgC,mBAAT,CAA6BH,MAA7B,EAA0E;AACxElB,IAAAA,SAAS,CAACK,OAAV,GAAoBa,MAApB;AACAA,IAAAA,MAAM,CAACI,sBAAP,CAA8B;AAAA,UAAC;AAAEC,QAAAA;AAAF,OAAD;AAAA,aAC5B9B,SAAS,CAAC8B,aAAD,CADmB;AAAA,KAA9B;AAGAN,IAAAA,kBAAkB;AACnB;;AAED,MAAI,CAAC7B,MAAD,IAAW,CAACE,QAAhB,EAA0B;AACxB,WAAO,IAAP;AACD;;AAED,sBACE,oBAAC,KAAD;AACE,IAAA,MAAM,EAAEF,MADV;AAEE,IAAA,QAAQ,MAFV;AAGE,IAAA,QAAQ,MAHV;AAIE,IAAA,MAAM,EAAEgC,YAJV;AAKE,IAAA,QAAQ,EAAE,MAAM7B,WAAW,CAAC,IAAD,CAL7B;AAME,IAAA,QAAQ,EAAE,MAAM;AACdA,MAAAA,WAAW,CAAC,KAAD,CAAX;AACAE,MAAAA,SAAS,CAAC,CAAD,CAAT;AACD,KATH;AAUE,IAAA,IAAI,EAAC,IAVP;AAWE,IAAA,SAAS,EAAC;AAXZ,kBAaE,oBAAC,WAAD;AAAa,IAAA,GAAG,EAAC,KAAjB;AAAuB,IAAA,MAAM,EAAEJ;AAA/B,kBACE;AAAI,IAAA,SAAS,EAAC;AAAd,qBADF,eAEE,oBAAC,MAAD;AACE,IAAA,IAAI,EAAC,QADP;AAEE,IAAA,MAAM,EAAEK,eAFV;AAGE,IAAA,IAAI,EAAET,aAHR;AAIE,IAAA,OAAO,EAAC,qBAJV;AAKE,IAAA,OAAO,EAAEyB;AALX,IAFF,EASGZ,SAAS,iBACR,oBAAC,MAAD;AACE,IAAA,IAAI,EAAC,QADP;AAEE,IAAA,IAAI,EAAEd,MAFR;AAGE,IAAA,MAAM,EAAEY,WAHV;AAIE,IAAA,OAAO,EAAC,gBAJV;AAKE,IAAA,OAAO,EAAEe;AALX,IAVJ,CAbF,eAgCE,oBAAC,SAAD;AAAW,IAAA,KAAK,EAAE;AAAEnB,MAAAA;AAAF;AAAlB,kBACE,oBAAC,MAAD;AACE,IAAA,mBAAmB,EAAE6B,mBADvB;AAEE,IAAA,QAAQ,EAAE;AACRG,MAAAA,KAAK,EAAErC,IADC;AAERsC,MAAAA,QAAQ,EAAE,IAFF;AAGRC,MAAAA,QAAQ,EAAE,IAHF;AAIR;AACAC,MAAAA,QAAQ,EAAE7B,SAAS,GAAG,YAAH,GAAkB,WAL7B;AAMR8B,MAAAA,OAAO,EAAE9B,SAND;AAOR+B,MAAAA,OAAO,EAAE;AAAEC,QAAAA,MAAM,EAAE;AAAV,OAPD;AAQRrB,MAAAA,WAAW,EAAEf,eAAe,GAAG,IAAH,GAAU,KAR9B;AASRqC,MAAAA,kBAAkB,EAAE,CATZ;AAURC,MAAAA,mBAAmB,EAAE,MAVb;;AAWR;AACZ;AACA;AACA;AACA;AACYC,MAAAA,IAAI,EAAE;AAAEC,QAAAA,6BAA6B,EAAE;AAAjC;AAhBE;AAFZ,IADF,CAhCF,CADF;AA0DD","sourcesContent":["import React, { useEffect, useRef, useState } from 'react';\nimport { Editor } from '@deephaven/console';\nimport { Modal, ModalBody, ModalHeader } from 'reactstrap';\nimport * as monaco from 'monaco-editor';\nimport { Button } from '@deephaven/components';\nimport { vsJson, vsListOrdered } from '@deephaven/icons';\nimport './IrisGridCellOverflowModal.scss';\n\ninterface IrisGridCellOverflowModalProps {\n text: string;\n isOpen: boolean;\n onClose: () => void;\n}\n\nexport default function IrisGridCellOverflowModal({\n text,\n isOpen,\n onClose,\n}: IrisGridCellOverflowModalProps): React.ReactNode {\n const [isOpened, setIsOpened] = useState(false);\n const [height, setHeight] = useState(0);\n const [showLineNumbers, setShowLineNumbers] = useState(false);\n const [isFormatted, setIsFormatted] = useState(false);\n const [canFormat, setCanFormat] = useState(false);\n const editorRef = useRef<monaco.editor.IStandaloneCodeEditor>();\n\n // Update format button on open\n useEffect(\n function enableFormatButtonWhenOpen() {\n if (!isOpen) {\n return;\n }\n\n try {\n JSON.parse(text);\n setCanFormat(true);\n } catch {\n setCanFormat(false);\n }\n setIsFormatted(false);\n },\n [isOpen, text]\n );\n\n // Re-layout editor on height change\n useEffect(\n function updateLayoutOnHeightChange() {\n if (editorRef.current) {\n editorRef.current.layout();\n }\n },\n [height]\n );\n\n // Update editor options on line number toggle\n useEffect(\n function toggleShowLineNumber() {\n if (editorRef.current) {\n editorRef.current.updateOptions({\n lineNumbers: showLineNumbers ? 'on' : 'off',\n });\n }\n },\n [showLineNumbers]\n );\n\n function toggleLineNumbers() {\n setShowLineNumbers(!showLineNumbers);\n }\n\n function formatAsJSON() {\n const model = editorRef.current?.getModel();\n if (!canFormat || !model) {\n return;\n }\n\n if (!isFormatted) {\n model.setValue(JSON.stringify(JSON.parse(text), undefined, 2));\n setIsFormatted(true);\n } else {\n model.setValue(text);\n setIsFormatted(false);\n }\n autoSetLineNumbers();\n }\n\n function autoSetLineNumbers() {\n const editor = editorRef.current;\n if (!editor) {\n return;\n }\n\n setShowLineNumbers((editor.getModel()?.getLineCount() ?? 0) > 1);\n }\n\n function handleToggle() {\n if (isOpened) {\n editorRef.current = undefined;\n onClose();\n }\n }\n\n function onEditorInitialized(editor: monaco.editor.IStandaloneCodeEditor) {\n editorRef.current = editor;\n editor.onDidContentSizeChange(({ contentHeight }) =>\n setHeight(contentHeight)\n );\n autoSetLineNumbers();\n }\n\n if (!isOpen && !isOpened) {\n return null;\n }\n\n return (\n <Modal\n isOpen={isOpen}\n centered\n keyboard\n toggle={handleToggle}\n onOpened={() => setIsOpened(true)}\n onClosed={() => {\n setIsOpened(false);\n setHeight(0);\n }}\n size=\"xl\"\n className=\"theme-bg-dark cell-overflow-modal\"\n >\n <ModalHeader tag=\"div\" toggle={onClose}>\n <h5 className=\"overflow-modal-title\">Cell Contents</h5>\n <Button\n kind=\"inline\"\n active={showLineNumbers}\n icon={vsListOrdered}\n tooltip=\"Toggle line numbers\"\n onClick={toggleLineNumbers}\n />\n {canFormat && (\n <Button\n kind=\"inline\"\n icon={vsJson}\n active={isFormatted}\n tooltip=\"Format as JSON\"\n onClick={formatAsJSON}\n />\n )}\n </ModalHeader>\n <ModalBody style={{ height }}>\n <Editor\n onEditorInitialized={onEditorInitialized}\n settings={{\n value: text,\n readOnly: true,\n wordWrap: 'on',\n // Loading json language w/o the monaco workers causes UI freezes and monaco errors. TS colorizes the same\n language: canFormat ? 'typescript' : 'plaintext',\n folding: canFormat,\n padding: { bottom: 16 },\n lineNumbers: showLineNumbers ? 'on' : 'off',\n overviewRulerLanes: 0,\n renderLineHighlight: 'none',\n /*\n The entire string may be 1 giant line\n Monaco by default seeds find w/ that line\n On very long strings this hangs the browser, so never seed the search\n */\n find: { seedSearchStringFromSelection: 'never' },\n }}\n />\n </ModalBody>\n </Modal>\n );\n}\n"],"file":"IrisGridCellOverflowModal.js"}
@@ -1 +1 @@
1
- {"version":3,"file":"IrisGridModelUpdater.d.ts","sourceRoot":"","sources":["../src/IrisGridModelUpdater.tsx"],"names":[],"mappings":"AAEA,OAAO,KAA6B,MAAM,OAAO,CAAC;AAClD,OAAW,EACT,MAAM,EACN,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,IAAI,EACJ,iBAAiB,EAClB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,SAAS,MAAM,aAAa,CAAC;AACpC,OAAO,aAAa,MAAM,iBAAiB,CAAC;AAE5C,OAAmB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAIvD,UAAU,yBAAyB;IACjC,KAAK,EAAE,aAAa,CAAC;IACrB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,YAAY,EAAE,OAAO,EAAE,CAAC;IACxB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,SAAS,EAAE,SAAS,CAAC;IACrB,YAAY,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;IACnC,YAAY,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACxC,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAC;IACjC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACpD;AAED;;GAEG;AACH,QAAA,MAAM,oBAAoB,0SAuBrB,yBAAyB,UA6E7B,CAAC;AAIF,eAAe,oBAAoB,CAAC"}
1
+ {"version":3,"file":"IrisGridModelUpdater.d.ts","sourceRoot":"","sources":["../src/IrisGridModelUpdater.tsx"],"names":[],"mappings":"AAEA,OAAO,KAA6B,MAAM,OAAO,CAAC;AAClD,OAAW,EACT,MAAM,EACN,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,IAAI,EACJ,iBAAiB,EAClB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,SAAS,MAAM,aAAa,CAAC;AACpC,OAAO,aAAa,MAAM,iBAAiB,CAAC;AAE5C,OAAmB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAIvD,UAAU,yBAAyB;IACjC,KAAK,EAAE,aAAa,CAAC;IACrB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,YAAY,EAAE,OAAO,EAAE,CAAC;IACxB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,SAAS,EAAE,SAAS,CAAC;IACrB,YAAY,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;IACnC,YAAY,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACxC,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAC;IACjC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACpD;AAED;;GAEG;AACH,QAAA,MAAM,oBAAoB,0SAuBrB,yBAAyB,UAiH7B,CAAC;AAIF,eAAe,oBAAoB,CAAC"}
@@ -35,10 +35,10 @@ var IrisGridModelUpdater = /*#__PURE__*/React.memo(_ref => {
35
35
  formatColumns
36
36
  } = _ref;
37
37
  var columns = useMemo(() => IrisGridUtils.getModelViewportColumns(modelColumns, left, right, movedColumns, hiddenColumns, alwaysFetchColumns, COLUMN_BUFFER_PAGES), [modelColumns, left, right, movedColumns, hiddenColumns, alwaysFetchColumns]);
38
- useEffect(() => {
38
+ useEffect(function updateFilter() {
39
39
  model.filter = filter;
40
40
  }, [model, filter]);
41
- useEffect(() => {
41
+ useEffect(function updateSorts() {
42
42
  var sortsForModel = [...sorts];
43
43
 
44
44
  if (reverseType !== TableUtils.REVERSE_TYPE.NONE) {
@@ -47,44 +47,44 @@ var IrisGridModelUpdater = /*#__PURE__*/React.memo(_ref => {
47
47
 
48
48
  model.sort = sortsForModel;
49
49
  }, [model, sorts, reverseType]);
50
- useEffect(() => {
50
+ useEffect(function updateFormatter() {
51
51
  model.formatter = formatter;
52
52
  }, [model, formatter]);
53
- useEffect(() => {
53
+ useEffect(function updateCustomColumns() {
54
54
  if (model.isCustomColumnsAvailable) {
55
55
  model.customColumns = customColumns;
56
56
  }
57
57
  }, [model, customColumns]);
58
- useEffect(() => {
58
+ useEffect(function updateFormatColumns() {
59
59
  if (model.isFormatColumnsAvailable) {
60
60
  model.formatColumns = formatColumns;
61
61
  }
62
62
  }, [model, formatColumns]);
63
- useEffect(() => {
63
+ useEffect(function updateViewport() {
64
64
  model.setViewport(top, bottom, columns);
65
65
  }, [model, top, bottom, columns]);
66
- useEffect(() => {
66
+ useEffect(function updateRollupCOnfig() {
67
67
  if (model.isRollupAvailable) {
68
68
  model.rollupConfig = rollupConfig;
69
69
  }
70
70
  }, [model, model.isRollupAvailable, rollupConfig]);
71
- useEffect(() => {
71
+ useEffect(function updateSelectDistinctColumns() {
72
72
  if (model.isSelectDistinctAvailable) {
73
73
  model.selectDistinctColumns = selectDistinctColumns;
74
74
  }
75
75
  }, [model, selectDistinctColumns]);
76
- useEffect(() => {
76
+ useEffect(function updateTotalsConfig() {
77
77
  if (model.isTotalsAvailable) {
78
78
  model.totalsConfig = totalsConfig;
79
79
  }
80
80
  }, [model, model.isTotalsAvailable, totalsConfig]);
81
- useEffect(() => {
81
+ useEffect(function updatePendingRowCount() {
82
82
  model.pendingRowCount = pendingRowCount;
83
83
  }, [model, pendingRowCount]);
84
- useEffect(() => {
84
+ useEffect(function updatePendingDataMap() {
85
85
  model.pendingDataMap = pendingDataMap;
86
86
  }, [model, pendingDataMap]);
87
- useEffect(() => {
87
+ useEffect(function updateFrozenColumns() {
88
88
  if (frozenColumns) {
89
89
  model.updateFrozenColumns(frozenColumns);
90
90
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/IrisGridModelUpdater.tsx"],"names":["React","useEffect","useMemo","dh","IrisGridUtils","TableUtils","COLUMN_BUFFER_PAGES","IrisGridModelUpdater","memo","model","modelColumns","top","bottom","left","right","filter","formatter","reverseType","REVERSE_TYPE","NONE","sorts","customColumns","movedColumns","hiddenColumns","alwaysFetchColumns","rollupConfig","totalsConfig","selectDistinctColumns","pendingRowCount","pendingDataMap","Map","frozenColumns","formatColumns","columns","getModelViewportColumns","sortsForModel","push","Table","reverse","sort","isCustomColumnsAvailable","isFormatColumnsAvailable","setViewport","isRollupAvailable","isSelectDistinctAvailable","isTotalsAvailable","updateFrozenColumns","displayName"],"mappings":"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","sourcesContent":["/* eslint-disable react/require-default-props */\n/* eslint-disable no-param-reassign */\nimport React, { useEffect, useMemo } from 'react';\nimport dh, {\n Column,\n CustomColumn,\n FilterCondition,\n RollupConfig,\n Sort,\n TotalsTableConfig,\n} from '@deephaven/jsapi-shim';\nimport Formatter from './Formatter';\nimport IrisGridModel from './IrisGridModel';\nimport IrisGridUtils from './IrisGridUtils';\nimport TableUtils, { ReverseType } from './TableUtils';\n\nconst COLUMN_BUFFER_PAGES = 1;\n\ninterface IrisGridModelUpdaterProps {\n model: IrisGridModel;\n modelColumns: Column[];\n top: number;\n bottom: number;\n left?: number;\n right?: number;\n filter: FilterCondition[];\n sorts: Sort[];\n reverseType?: ReverseType;\n customColumns: string[];\n movedColumns: unknown[];\n hiddenColumns: number[];\n frozenColumns?: string[];\n formatColumns: CustomColumn[];\n alwaysFetchColumns: string[];\n formatter: Formatter;\n rollupConfig?: RollupConfig | null;\n totalsConfig?: TotalsTableConfig | null;\n selectDistinctColumns?: string[];\n pendingRowCount?: number;\n pendingDataMap?: Map<number, Map<string, unknown>>;\n}\n\n/**\n * React component to keep IrisGridModel in sync\n */\nconst IrisGridModelUpdater = React.memo(\n ({\n model,\n modelColumns,\n top,\n bottom,\n left,\n right,\n filter,\n formatter,\n reverseType = TableUtils.REVERSE_TYPE.NONE,\n sorts,\n customColumns,\n movedColumns,\n hiddenColumns,\n alwaysFetchColumns,\n rollupConfig = null,\n totalsConfig = null,\n selectDistinctColumns = [],\n pendingRowCount = 0,\n pendingDataMap = new Map(),\n frozenColumns,\n formatColumns,\n }: IrisGridModelUpdaterProps) => {\n const columns = useMemo(\n () =>\n IrisGridUtils.getModelViewportColumns(\n modelColumns,\n left,\n right,\n movedColumns,\n hiddenColumns,\n alwaysFetchColumns,\n COLUMN_BUFFER_PAGES\n ),\n [\n modelColumns,\n left,\n right,\n movedColumns,\n hiddenColumns,\n alwaysFetchColumns,\n ]\n );\n\n useEffect(() => {\n model.filter = filter;\n }, [model, filter]);\n useEffect(() => {\n const sortsForModel = [...sorts];\n if (reverseType !== TableUtils.REVERSE_TYPE.NONE) {\n sortsForModel.push(dh.Table.reverse());\n }\n model.sort = sortsForModel;\n }, [model, sorts, reverseType]);\n useEffect(() => {\n model.formatter = formatter;\n }, [model, formatter]);\n useEffect(() => {\n if (model.isCustomColumnsAvailable) {\n model.customColumns = customColumns;\n }\n }, [model, customColumns]);\n useEffect(() => {\n if (model.isFormatColumnsAvailable) {\n model.formatColumns = formatColumns;\n }\n }, [model, formatColumns]);\n useEffect(() => {\n model.setViewport(top, bottom, columns);\n }, [model, top, bottom, columns]);\n useEffect(() => {\n if (model.isRollupAvailable) {\n model.rollupConfig = rollupConfig;\n }\n }, [model, model.isRollupAvailable, rollupConfig]);\n useEffect(() => {\n if (model.isSelectDistinctAvailable) {\n model.selectDistinctColumns = selectDistinctColumns;\n }\n }, [model, selectDistinctColumns]);\n useEffect(() => {\n if (model.isTotalsAvailable) {\n model.totalsConfig = totalsConfig;\n }\n }, [model, model.isTotalsAvailable, totalsConfig]);\n useEffect(() => {\n model.pendingRowCount = pendingRowCount;\n }, [model, pendingRowCount]);\n useEffect(() => {\n model.pendingDataMap = pendingDataMap;\n }, [model, pendingDataMap]);\n useEffect(() => {\n if (frozenColumns) {\n model.updateFrozenColumns(frozenColumns);\n }\n }, [model, frozenColumns]);\n\n return null;\n }\n);\n\nIrisGridModelUpdater.displayName = 'IrisGridModelUpdater';\n\nexport default IrisGridModelUpdater;\n"],"file":"IrisGridModelUpdater.js"}
1
+ {"version":3,"sources":["../src/IrisGridModelUpdater.tsx"],"names":["React","useEffect","useMemo","dh","IrisGridUtils","TableUtils","COLUMN_BUFFER_PAGES","IrisGridModelUpdater","memo","model","modelColumns","top","bottom","left","right","filter","formatter","reverseType","REVERSE_TYPE","NONE","sorts","customColumns","movedColumns","hiddenColumns","alwaysFetchColumns","rollupConfig","totalsConfig","selectDistinctColumns","pendingRowCount","pendingDataMap","Map","frozenColumns","formatColumns","columns","getModelViewportColumns","updateFilter","updateSorts","sortsForModel","push","Table","reverse","sort","updateFormatter","updateCustomColumns","isCustomColumnsAvailable","updateFormatColumns","isFormatColumnsAvailable","updateViewport","setViewport","updateRollupCOnfig","isRollupAvailable","updateSelectDistinctColumns","isSelectDistinctAvailable","updateTotalsConfig","isTotalsAvailable","updatePendingRowCount","updatePendingDataMap","updateFrozenColumns","displayName"],"mappings":"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","sourcesContent":["/* eslint-disable react/require-default-props */\n/* eslint-disable no-param-reassign */\nimport React, { useEffect, useMemo } from 'react';\nimport dh, {\n Column,\n CustomColumn,\n FilterCondition,\n RollupConfig,\n Sort,\n TotalsTableConfig,\n} from '@deephaven/jsapi-shim';\nimport Formatter from './Formatter';\nimport IrisGridModel from './IrisGridModel';\nimport IrisGridUtils from './IrisGridUtils';\nimport TableUtils, { ReverseType } from './TableUtils';\n\nconst COLUMN_BUFFER_PAGES = 1;\n\ninterface IrisGridModelUpdaterProps {\n model: IrisGridModel;\n modelColumns: Column[];\n top: number;\n bottom: number;\n left?: number;\n right?: number;\n filter: FilterCondition[];\n sorts: Sort[];\n reverseType?: ReverseType;\n customColumns: string[];\n movedColumns: unknown[];\n hiddenColumns: number[];\n frozenColumns?: string[];\n formatColumns: CustomColumn[];\n alwaysFetchColumns: string[];\n formatter: Formatter;\n rollupConfig?: RollupConfig | null;\n totalsConfig?: TotalsTableConfig | null;\n selectDistinctColumns?: string[];\n pendingRowCount?: number;\n pendingDataMap?: Map<number, Map<string, unknown>>;\n}\n\n/**\n * React component to keep IrisGridModel in sync\n */\nconst IrisGridModelUpdater = React.memo(\n ({\n model,\n modelColumns,\n top,\n bottom,\n left,\n right,\n filter,\n formatter,\n reverseType = TableUtils.REVERSE_TYPE.NONE,\n sorts,\n customColumns,\n movedColumns,\n hiddenColumns,\n alwaysFetchColumns,\n rollupConfig = null,\n totalsConfig = null,\n selectDistinctColumns = [],\n pendingRowCount = 0,\n pendingDataMap = new Map(),\n frozenColumns,\n formatColumns,\n }: IrisGridModelUpdaterProps) => {\n const columns = useMemo(\n () =>\n IrisGridUtils.getModelViewportColumns(\n modelColumns,\n left,\n right,\n movedColumns,\n hiddenColumns,\n alwaysFetchColumns,\n COLUMN_BUFFER_PAGES\n ),\n [\n modelColumns,\n left,\n right,\n movedColumns,\n hiddenColumns,\n alwaysFetchColumns,\n ]\n );\n\n useEffect(\n function updateFilter() {\n model.filter = filter;\n },\n [model, filter]\n );\n useEffect(\n function updateSorts() {\n const sortsForModel = [...sorts];\n if (reverseType !== TableUtils.REVERSE_TYPE.NONE) {\n sortsForModel.push(dh.Table.reverse());\n }\n model.sort = sortsForModel;\n },\n [model, sorts, reverseType]\n );\n useEffect(\n function updateFormatter() {\n model.formatter = formatter;\n },\n [model, formatter]\n );\n useEffect(\n function updateCustomColumns() {\n if (model.isCustomColumnsAvailable) {\n model.customColumns = customColumns;\n }\n },\n [model, customColumns]\n );\n useEffect(\n function updateFormatColumns() {\n if (model.isFormatColumnsAvailable) {\n model.formatColumns = formatColumns;\n }\n },\n [model, formatColumns]\n );\n useEffect(\n function updateViewport() {\n model.setViewport(top, bottom, columns);\n },\n [model, top, bottom, columns]\n );\n useEffect(\n function updateRollupCOnfig() {\n if (model.isRollupAvailable) {\n model.rollupConfig = rollupConfig;\n }\n },\n [model, model.isRollupAvailable, rollupConfig]\n );\n useEffect(\n function updateSelectDistinctColumns() {\n if (model.isSelectDistinctAvailable) {\n model.selectDistinctColumns = selectDistinctColumns;\n }\n },\n [model, selectDistinctColumns]\n );\n useEffect(\n function updateTotalsConfig() {\n if (model.isTotalsAvailable) {\n model.totalsConfig = totalsConfig;\n }\n },\n [model, model.isTotalsAvailable, totalsConfig]\n );\n useEffect(\n function updatePendingRowCount() {\n model.pendingRowCount = pendingRowCount;\n },\n [model, pendingRowCount]\n );\n useEffect(\n function updatePendingDataMap() {\n model.pendingDataMap = pendingDataMap;\n },\n [model, pendingDataMap]\n );\n useEffect(\n function updateFrozenColumns() {\n if (frozenColumns) {\n model.updateFrozenColumns(frozenColumns);\n }\n },\n [model, frozenColumns]\n );\n\n return null;\n }\n);\n\nIrisGridModelUpdater.displayName = 'IrisGridModelUpdater';\n\nexport default IrisGridModelUpdater;\n"],"file":"IrisGridModelUpdater.js"}
@@ -1 +1 @@
1
- {"version":3,"file":"PendingDataBottomBar.d.ts","sourceRoot":"","sources":["../src/PendingDataBottomBar.tsx"],"names":[],"mappings":";AAMA,OAAO,6BAA6B,CAAC;AAMrC,oBAAY,yBAAyB,GAAG;IACtC,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IACxC,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE;YAAE,KAAK,EAAE,OAAO,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC,CAAC;IACvE,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CACvB,CAAC;AAEF,eAAO,MAAM,oBAAoB,wJAa9B,yBAAyB,KAAG,WAmG9B,CAAC;AAEF,eAAe,oBAAoB,CAAC"}
1
+ {"version":3,"file":"PendingDataBottomBar.d.ts","sourceRoot":"","sources":["../src/PendingDataBottomBar.tsx"],"names":[],"mappings":";AAMA,OAAO,6BAA6B,CAAC;AAMrC,oBAAY,yBAAyB,GAAG;IACtC,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IACxC,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE;YAAE,KAAK,EAAE,OAAO,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC,CAAC;IACvE,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CACvB,CAAC;AAEF,eAAO,MAAM,oBAAoB,wJAa9B,yBAAyB,KAAG,WAwG9B,CAAC;AAEF,eAAe,oBAAoB,CAAC"}
@@ -37,7 +37,7 @@ export var PendingDataBottomBar = _ref => {
37
37
 
38
38
  return "Key can't be empty (on ".concat(pendingDataErrors.size, " rows)");
39
39
  }, [error, pendingDataErrors]);
40
- useEffect(() => {
40
+ useEffect(function showSuccessMessage() {
41
41
  if (prevIsSaving && !isSaving && errorMessage == null) {
42
42
  setIsSuccessShown(true);
43
43
  setWasSuccessShown(true);
@@ -46,7 +46,7 @@ export var PendingDataBottomBar = _ref => {
46
46
  }, HIDE_TIMEOUT);
47
47
  }
48
48
  }, [errorMessage, isSaving, prevIsSaving]);
49
- useEffect(() => {
49
+ useEffect(function hideSuccessMessage() {
50
50
  if (successTimeout.current && pendingDataMap.size > 0) {
51
51
  // A change just occurred while the success message was still being shown, just hide the success message
52
52
  clearTimeout(successTimeout.current);
@@ -54,7 +54,9 @@ export var PendingDataBottomBar = _ref => {
54
54
  setWasSuccessShown(false);
55
55
  }
56
56
  }, [pendingDataMap]);
57
- useEffect(() => () => successTimeout.current ? clearTimeout(successTimeout.current) : undefined, []);
57
+ useEffect(function cleanupTimeout() {
58
+ return () => successTimeout.current ? clearTimeout(successTimeout.current) : undefined;
59
+ }, []);
58
60
  var pendingRowCount = pendingDataMap.size;
59
61
  var commitIcon;
60
62
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/PendingDataBottomBar.tsx"],"names":["React","useEffect","useMemo","useRef","useState","FontAwesomeIcon","vsPass","vsWarning","Button","LoadingSpinner","usePrevious","IrisGridBottomBar","HIDE_TIMEOUT","MAX_NUMBER_ROWS_SHOWN","PendingDataBottomBar","isSaving","onSave","onDiscard","discardTooltip","saveTooltip","error","pendingDataErrors","pendingDataMap","onEntering","onEntered","onExiting","onExited","isSuccessShown","setIsSuccessShown","wasSuccessShown","setWasSuccessShown","successTimeout","prevIsSaving","errorMessage","size","Array","from","keys","join","trim","current","setTimeout","clearTimeout","undefined","pendingRowCount","commitIcon"],"mappings":"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","sourcesContent":["import React, { useEffect, useMemo, useRef, useState } from 'react';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { vsPass, vsWarning } from '@deephaven/icons';\nimport { Button, LoadingSpinner } from '@deephaven/components';\nimport { usePrevious } from '@deephaven/react-hooks';\nimport IrisGridBottomBar from './IrisGridBottomBar';\nimport './PendingDataBottomBar.scss';\n\nconst HIDE_TIMEOUT = 3000;\n\nconst MAX_NUMBER_ROWS_SHOWN = 5;\n\nexport type PendingDataBottomBarProps = {\n onSave: () => Promise<void>;\n onDiscard: () => Promise<void>;\n discardTooltip?: string;\n saveTooltip?: string;\n isSaving?: boolean;\n error?: string;\n pendingDataErrors: Map<number, Error[]>;\n pendingDataMap: Map<number, { data: Map<number, { value: unknown }> }>;\n onEntering?: () => void;\n onEntered?: () => void;\n onExiting?: () => void;\n onExited?: () => void;\n};\n\nexport const PendingDataBottomBar = ({\n isSaving = false,\n onSave,\n onDiscard,\n discardTooltip,\n saveTooltip,\n error,\n pendingDataErrors,\n pendingDataMap,\n onEntering,\n onEntered,\n onExiting,\n onExited,\n}: PendingDataBottomBarProps): JSX.Element => {\n const [isSuccessShown, setIsSuccessShown] = useState(false);\n const [wasSuccessShown, setWasSuccessShown] = useState(false);\n const successTimeout = useRef<ReturnType<typeof setTimeout>>();\n const prevIsSaving = usePrevious(isSaving);\n const errorMessage = useMemo(() => {\n if (pendingDataErrors.size === 0) {\n return error;\n }\n if (pendingDataErrors.size <= MAX_NUMBER_ROWS_SHOWN) {\n return `Key can't be empty (on pending row${\n pendingDataErrors.size > 1 ? 's' : ''\n } ${Array.from(pendingDataErrors.keys()).join(', ').trim()})`;\n }\n return `Key can't be empty (on ${pendingDataErrors.size} rows)`;\n }, [error, pendingDataErrors]);\n\n useEffect(() => {\n if (prevIsSaving && !isSaving && errorMessage == null) {\n setIsSuccessShown(true);\n setWasSuccessShown(true);\n successTimeout.current = setTimeout(() => {\n setIsSuccessShown(false);\n }, HIDE_TIMEOUT);\n }\n }, [errorMessage, isSaving, prevIsSaving]);\n\n useEffect(() => {\n if (successTimeout.current && pendingDataMap.size > 0) {\n // A change just occurred while the success message was still being shown, just hide the success message\n clearTimeout(successTimeout.current);\n setIsSuccessShown(false);\n setWasSuccessShown(false);\n }\n }, [pendingDataMap]);\n\n useEffect(\n () => () =>\n successTimeout.current ? clearTimeout(successTimeout.current) : undefined,\n []\n );\n\n const pendingRowCount = pendingDataMap.size;\n let commitIcon;\n if (isSaving) {\n commitIcon = <LoadingSpinner />;\n } else if (wasSuccessShown) {\n commitIcon = vsPass;\n }\n\n return (\n <IrisGridBottomBar\n className=\"pending-data-bottom-bar\"\n isShown={pendingRowCount > 0 || isSuccessShown || errorMessage != null}\n onEntering={onEntering}\n onEntered={onEntered}\n onExiting={onExiting}\n onExited={() => {\n setWasSuccessShown(false);\n if (onExited) {\n onExited();\n }\n }}\n >\n {errorMessage && (\n <div className=\"error-message\">\n <FontAwesomeIcon icon={vsWarning} />\n <span>{`${errorMessage}`}</span>\n </div>\n )}\n {!errorMessage && (\n <div className=\"status-message\">\n {pendingRowCount > 0 && (\n <span>{`${pendingRowCount} row${\n pendingRowCount > 1 ? 's' : ''\n } pending`}</span>\n )}\n </div>\n )}\n <div className=\"buttons-container\">\n {!isSaving && !wasSuccessShown && (\n <Button kind=\"secondary\" onClick={onDiscard} tooltip={discardTooltip}>\n Discard\n </Button>\n )}\n <Button\n kind={wasSuccessShown ? 'success' : 'primary'}\n onClick={onSave}\n icon={commitIcon}\n disabled={isSaving || wasSuccessShown || errorMessage != null}\n tooltip={saveTooltip}\n >\n {isSaving && `Committing...`}\n {!isSaving && wasSuccessShown && `Success`}\n {!isSaving && !wasSuccessShown && `Commit`}\n </Button>\n </div>\n </IrisGridBottomBar>\n );\n};\n\nexport default PendingDataBottomBar;\n"],"file":"PendingDataBottomBar.js"}
1
+ {"version":3,"sources":["../src/PendingDataBottomBar.tsx"],"names":["React","useEffect","useMemo","useRef","useState","FontAwesomeIcon","vsPass","vsWarning","Button","LoadingSpinner","usePrevious","IrisGridBottomBar","HIDE_TIMEOUT","MAX_NUMBER_ROWS_SHOWN","PendingDataBottomBar","isSaving","onSave","onDiscard","discardTooltip","saveTooltip","error","pendingDataErrors","pendingDataMap","onEntering","onEntered","onExiting","onExited","isSuccessShown","setIsSuccessShown","wasSuccessShown","setWasSuccessShown","successTimeout","prevIsSaving","errorMessage","size","Array","from","keys","join","trim","showSuccessMessage","current","setTimeout","hideSuccessMessage","clearTimeout","cleanupTimeout","undefined","pendingRowCount","commitIcon"],"mappings":"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","sourcesContent":["import React, { useEffect, useMemo, useRef, useState } from 'react';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { vsPass, vsWarning } from '@deephaven/icons';\nimport { Button, LoadingSpinner } from '@deephaven/components';\nimport { usePrevious } from '@deephaven/react-hooks';\nimport IrisGridBottomBar from './IrisGridBottomBar';\nimport './PendingDataBottomBar.scss';\n\nconst HIDE_TIMEOUT = 3000;\n\nconst MAX_NUMBER_ROWS_SHOWN = 5;\n\nexport type PendingDataBottomBarProps = {\n onSave: () => Promise<void>;\n onDiscard: () => Promise<void>;\n discardTooltip?: string;\n saveTooltip?: string;\n isSaving?: boolean;\n error?: string;\n pendingDataErrors: Map<number, Error[]>;\n pendingDataMap: Map<number, { data: Map<number, { value: unknown }> }>;\n onEntering?: () => void;\n onEntered?: () => void;\n onExiting?: () => void;\n onExited?: () => void;\n};\n\nexport const PendingDataBottomBar = ({\n isSaving = false,\n onSave,\n onDiscard,\n discardTooltip,\n saveTooltip,\n error,\n pendingDataErrors,\n pendingDataMap,\n onEntering,\n onEntered,\n onExiting,\n onExited,\n}: PendingDataBottomBarProps): JSX.Element => {\n const [isSuccessShown, setIsSuccessShown] = useState(false);\n const [wasSuccessShown, setWasSuccessShown] = useState(false);\n const successTimeout = useRef<ReturnType<typeof setTimeout>>();\n const prevIsSaving = usePrevious(isSaving);\n const errorMessage = useMemo(() => {\n if (pendingDataErrors.size === 0) {\n return error;\n }\n if (pendingDataErrors.size <= MAX_NUMBER_ROWS_SHOWN) {\n return `Key can't be empty (on pending row${\n pendingDataErrors.size > 1 ? 's' : ''\n } ${Array.from(pendingDataErrors.keys()).join(', ').trim()})`;\n }\n return `Key can't be empty (on ${pendingDataErrors.size} rows)`;\n }, [error, pendingDataErrors]);\n\n useEffect(\n function showSuccessMessage() {\n if (prevIsSaving && !isSaving && errorMessage == null) {\n setIsSuccessShown(true);\n setWasSuccessShown(true);\n successTimeout.current = setTimeout(() => {\n setIsSuccessShown(false);\n }, HIDE_TIMEOUT);\n }\n },\n [errorMessage, isSaving, prevIsSaving]\n );\n\n useEffect(\n function hideSuccessMessage() {\n if (successTimeout.current && pendingDataMap.size > 0) {\n // A change just occurred while the success message was still being shown, just hide the success message\n clearTimeout(successTimeout.current);\n setIsSuccessShown(false);\n setWasSuccessShown(false);\n }\n },\n [pendingDataMap]\n );\n\n useEffect(function cleanupTimeout() {\n return () =>\n successTimeout.current ? clearTimeout(successTimeout.current) : undefined;\n }, []);\n\n const pendingRowCount = pendingDataMap.size;\n let commitIcon;\n if (isSaving) {\n commitIcon = <LoadingSpinner />;\n } else if (wasSuccessShown) {\n commitIcon = vsPass;\n }\n\n return (\n <IrisGridBottomBar\n className=\"pending-data-bottom-bar\"\n isShown={pendingRowCount > 0 || isSuccessShown || errorMessage != null}\n onEntering={onEntering}\n onEntered={onEntered}\n onExiting={onExiting}\n onExited={() => {\n setWasSuccessShown(false);\n if (onExited) {\n onExited();\n }\n }}\n >\n {errorMessage && (\n <div className=\"error-message\">\n <FontAwesomeIcon icon={vsWarning} />\n <span>{`${errorMessage}`}</span>\n </div>\n )}\n {!errorMessage && (\n <div className=\"status-message\">\n {pendingRowCount > 0 && (\n <span>{`${pendingRowCount} row${\n pendingRowCount > 1 ? 's' : ''\n } pending`}</span>\n )}\n </div>\n )}\n <div className=\"buttons-container\">\n {!isSaving && !wasSuccessShown && (\n <Button kind=\"secondary\" onClick={onDiscard} tooltip={discardTooltip}>\n Discard\n </Button>\n )}\n <Button\n kind={wasSuccessShown ? 'success' : 'primary'}\n onClick={onSave}\n icon={commitIcon}\n disabled={isSaving || wasSuccessShown || errorMessage != null}\n tooltip={saveTooltip}\n >\n {isSaving && `Committing...`}\n {!isSaving && wasSuccessShown && `Success`}\n {!isSaving && !wasSuccessShown && `Commit`}\n </Button>\n </div>\n </IrisGridBottomBar>\n );\n};\n\nexport default PendingDataBottomBar;\n"],"file":"PendingDataBottomBar.js"}
@@ -1 +1 @@
1
- {"version":3,"file":"Aggregations.d.ts","sourceRoot":"","sources":["../../../src/sidebar/aggregations/Aggregations.tsx"],"names":[],"mappings":";AA2BA,OAAO,oBAAoB,MAAM,wBAAwB,CAAC;AAE1D,OAAO,qBAAqB,CAAC;AAI7B,oBAAY,WAAW,GAAG;IACxB,SAAS,EAAE,oBAAoB,CAAC;IAChC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF,oBAAY,mBAAmB,GAAG;IAChC,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,SAAS,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,oBAAY,iBAAiB,GAAG;IAC9B,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,QAAQ,EAAE,CAAC,QAAQ,EAAE,mBAAmB,KAAK,IAAI,CAAC;IAClD,MAAM,EAAE,CAAC,WAAW,EAAE,WAAW,KAAK,IAAI,CAAC;CAC5C,CAAC;AAEF,eAAO,MAAM,kBAAkB,wBAc9B,CAAC;AAEF,QAAA,MAAM,YAAY,8CAKf,iBAAiB,KAAG,WAoPtB,CAAC;AAEF,eAAe,YAAY,CAAC"}
1
+ {"version":3,"file":"Aggregations.d.ts","sourceRoot":"","sources":["../../../src/sidebar/aggregations/Aggregations.tsx"],"names":[],"mappings":";AA2BA,OAAO,oBAAoB,MAAM,wBAAwB,CAAC;AAE1D,OAAO,qBAAqB,CAAC;AAI7B,oBAAY,WAAW,GAAG;IACxB,SAAS,EAAE,oBAAoB,CAAC;IAChC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF,oBAAY,mBAAmB,GAAG;IAChC,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,SAAS,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,oBAAY,iBAAiB,GAAG;IAC9B,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,QAAQ,EAAE,CAAC,QAAQ,EAAE,mBAAmB,KAAK,IAAI,CAAC;IAClD,MAAM,EAAE,CAAC,WAAW,EAAE,WAAW,KAAK,IAAI,CAAC;CAC5C,CAAC;AAEF,eAAO,MAAM,kBAAkB,wBAc9B,CAAC;AAEF,QAAA,MAAM,YAAY,8CAKf,iBAAiB,KAAG,WAuPtB,CAAC;AAEF,eAAe,YAAY,CAAC"}
@@ -99,7 +99,7 @@ var Aggregations = _ref => {
99
99
  var handleShowOnTopChange = useCallback(event => {
100
100
  changeShowOnTop(event.target.value === 'true');
101
101
  }, [changeShowOnTop]);
102
- useEffect(() => {
102
+ useEffect(function setDefaultOperation() {
103
103
  if (options.length > 0 && !options.includes(selectedOperation)) {
104
104
  setSelectedOperation(options[0]);
105
105
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/sidebar/aggregations/Aggregations.tsx"],"names":["React","useCallback","useEffect","useMemo","useState","DragDropContext","classNames","FontAwesomeIcon","dhNewCircleLargeFilled","vsTrash","vsEdit","dhWarningFilled","Log","DraggableItemList","DragUtils","Option","Select","RadioItem","RadioGroup","Button","AggregationOperation","AggregationUtils","log","module","SELECTABLE_OPTIONS","SUM","ABS_SUM","MIN","MAX","VAR","AVG","STD","FIRST","LAST","COUNT_DISTINCT","DISTINCT","COUNT","UNIQUE","Aggregations","isRollup","settings","onChange","onEdit","aggregations","showOnTop","options","filter","option","some","aggregation","operation","selectedOperation","setSelectedOperation","selectedRanges","setSelectedRanges","changeSettings","changedSettings","changeAggregations","newAggregations","changeShowOnTop","newShowOnTop","handleDragStart","debug","startDragging","handleDragEnd","destination","source","stopDragging","destinationIndex","index","draggedItems","reorder","insertIndex","adjustDestinationIndex","newSelectedRanges","length","handleOperationChange","handleAdd","selected","invert","handleDeleteClicked","itemIndex","handleAggregationSelectionChange","handleAggregationSelect","isRollupOperation","handleShowOnTopChange","event","target","value","includes","renderAggregation","item","isClone","selectedCount","text","badgeText","undefined","className","isEditable","renderBadge","renderHandle","isOptionsShown","isAggregationsShown","map"],"mappings":"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","sourcesContent":["import React, {\n ChangeEvent,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from 'react';\nimport { DragDropContext } from 'react-beautiful-dnd';\nimport classNames from 'classnames';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport {\n dhNewCircleLargeFilled,\n vsTrash,\n vsEdit,\n dhWarningFilled,\n} from '@deephaven/icons';\nimport Log from '@deephaven/log';\nimport {\n DraggableItemList,\n DragUtils,\n Option,\n Select,\n RadioItem,\n RadioGroup,\n Button,\n} from '@deephaven/components';\nimport type { DraggableRenderItemProps, Range } from '@deephaven/components';\nimport AggregationOperation from './AggregationOperation';\nimport AggregationUtils from './AggregationUtils';\nimport './Aggregations.scss';\n\nconst log = Log.module('Aggregations');\n\nexport type Aggregation = {\n operation: AggregationOperation;\n selected: string[];\n invert: boolean;\n};\n\nexport type AggregationSettings = {\n aggregations: Aggregation[];\n showOnTop: boolean;\n};\n\nexport type AggregationsProps = {\n isRollup: boolean;\n settings: AggregationSettings;\n onChange: (settings: AggregationSettings) => void;\n onEdit: (aggregation: Aggregation) => void;\n};\n\nexport const SELECTABLE_OPTIONS = [\n AggregationOperation.SUM,\n AggregationOperation.ABS_SUM,\n AggregationOperation.MIN,\n AggregationOperation.MAX,\n AggregationOperation.VAR,\n AggregationOperation.AVG,\n AggregationOperation.STD,\n AggregationOperation.FIRST,\n AggregationOperation.LAST,\n AggregationOperation.COUNT_DISTINCT,\n AggregationOperation.DISTINCT,\n AggregationOperation.COUNT,\n AggregationOperation.UNIQUE,\n];\n\nconst Aggregations = ({\n isRollup,\n settings,\n onChange,\n onEdit,\n}: AggregationsProps): JSX.Element => {\n const { aggregations, showOnTop } = settings;\n const options = useMemo(\n () =>\n SELECTABLE_OPTIONS.filter(\n option =>\n !aggregations.some(aggregation => aggregation.operation === option)\n ),\n [aggregations]\n );\n const [selectedOperation, setSelectedOperation] = useState(options[0]);\n const [selectedRanges, setSelectedRanges] = useState<Range[]>([]);\n const changeSettings = useCallback(\n changedSettings => {\n onChange({ ...settings, ...changedSettings });\n },\n [onChange, settings]\n );\n const changeAggregations = useCallback(\n newAggregations => {\n changeSettings({ aggregations: newAggregations });\n },\n [changeSettings]\n );\n\n const changeShowOnTop = useCallback(\n newShowOnTop => {\n changeSettings({ showOnTop: newShowOnTop });\n },\n [changeSettings]\n );\n\n const handleDragStart = useCallback(() => {\n log.debug('handleDragStart');\n\n DragUtils.startDragging();\n }, []);\n\n const handleDragEnd = useCallback(\n ({ destination, source }) => {\n log.debug('handleDragEnd', destination, source);\n\n DragUtils.stopDragging();\n\n if (destination === null) {\n return;\n }\n\n let destinationIndex = destination.index;\n if (source.index < destination.index) {\n destinationIndex += 1;\n }\n\n const newAggregations = [...aggregations];\n const draggedItems = DragUtils.reorder(\n newAggregations,\n selectedRanges,\n newAggregations,\n destinationIndex\n );\n const insertIndex = DragUtils.adjustDestinationIndex(\n destinationIndex,\n selectedRanges\n );\n const newSelectedRanges: Range[] = [\n [insertIndex, insertIndex + draggedItems.length - 1],\n ];\n changeAggregations(newAggregations);\n setSelectedRanges(newSelectedRanges);\n },\n [changeAggregations, aggregations, selectedRanges, setSelectedRanges]\n );\n\n const handleOperationChange = useCallback(\n operation => {\n setSelectedOperation(operation);\n },\n [setSelectedOperation]\n );\n\n const handleAdd = useCallback(() => {\n changeAggregations([\n ...aggregations,\n { operation: selectedOperation, selected: [], invert: true },\n ]);\n }, [aggregations, selectedOperation, changeAggregations]);\n\n const handleDeleteClicked = useCallback(\n (itemIndex: number) => {\n changeAggregations(\n aggregations.filter((aggregation, index) => index !== itemIndex)\n );\n },\n [aggregations, changeAggregations]\n );\n\n const handleAggregationSelectionChange = useCallback(\n newSelectedRanges => {\n setSelectedRanges(newSelectedRanges);\n },\n [setSelectedRanges]\n );\n\n const handleAggregationSelect = useCallback(\n itemIndex => {\n const aggregation = aggregations[itemIndex];\n if (!AggregationUtils.isRollupOperation(aggregation.operation)) {\n onEdit(aggregation);\n }\n },\n [aggregations, onEdit]\n );\n\n const handleShowOnTopChange = useCallback(\n (event: ChangeEvent<HTMLInputElement>) => {\n changeShowOnTop(event.target.value === 'true');\n },\n [changeShowOnTop]\n );\n\n useEffect(() => {\n if (options.length > 0 && !options.includes(selectedOperation)) {\n setSelectedOperation(options[0]);\n }\n }, [options, selectedOperation]);\n\n const renderAggregation = useCallback(\n ({\n item,\n itemIndex,\n isClone,\n selectedCount,\n }: DraggableRenderItemProps<Aggregation>) => {\n const text = item.operation;\n const badgeText = isClone ? `${selectedCount}` : undefined;\n const className = isClone ? 'item-list-item-clone' : undefined;\n const isRollupOperation = AggregationUtils.isRollupOperation(\n item.operation\n );\n const isEditable = !isClone && !isRollupOperation;\n return (\n <>\n <div\n className={classNames(\n 'item-list-item-content',\n 'draggable-item-list-item-content',\n className\n )}\n >\n <span className=\"title\">\n {text}\n {!isRollup && isRollupOperation && (\n <span className=\"small text-warning\">\n <FontAwesomeIcon icon={dhWarningFilled} /> Requires rollup\n </span>\n )}\n </span>\n {DraggableItemList.renderBadge({ text: badgeText })}\n {DraggableItemList.renderHandle()}\n </div>\n {!isClone && (\n <>\n <Button\n kind=\"ghost\"\n className=\"btn-edit\"\n icon={vsEdit}\n tooltip=\"Edit Columns\"\n onClick={() => onEdit(item)}\n disabled={!isEditable}\n />\n <Button\n kind=\"ghost\"\n className=\"btn-delete\"\n icon={vsTrash}\n tooltip=\"Delete Aggregation\"\n onClick={() => handleDeleteClicked(itemIndex)}\n />\n </>\n )}\n </>\n );\n },\n [handleDeleteClicked, onEdit, isRollup]\n );\n\n const isOptionsShown = options.length > 0;\n const isAggregationsShown = aggregations.length > 0;\n\n return (\n <div className=\"aggregations\">\n {isOptionsShown && (\n <div className=\"form-inline\">\n <Select onChange={handleOperationChange} value={selectedOperation}>\n {options.map(option => (\n <Option value={option} key={option}>\n {option}\n </Option>\n ))}\n </Select>\n <button\n type=\"button\"\n className=\"btn btn-link btn-add\"\n onClick={handleAdd}\n >\n <FontAwesomeIcon icon={dhNewCircleLargeFilled} />\n Add Aggregation\n </button>\n </div>\n )}\n {isOptionsShown && isAggregationsShown && <hr />}\n {isAggregationsShown && (\n <>\n {!isRollup && (\n <div className=\"form-inline\">\n <label>Placement:&nbsp;</label>\n <RadioGroup\n onChange={handleShowOnTopChange}\n value={`${showOnTop}`}\n >\n <RadioItem value=\"true\">Top</RadioItem>\n <RadioItem value=\"false\">Bottom</RadioItem>\n </RadioGroup>\n </div>\n )}\n <DragDropContext\n onDragStart={handleDragStart}\n onDragEnd={handleDragEnd}\n >\n <DraggableItemList<Aggregation>\n className=\"selected-aggregations\"\n itemCount={aggregations.length}\n items={aggregations}\n renderItem={renderAggregation}\n offset={0}\n onSelectionChange={handleAggregationSelectionChange}\n onSelect={handleAggregationSelect}\n selectedRanges={selectedRanges}\n isMultiSelect\n />\n </DragDropContext>\n </>\n )}\n </div>\n );\n};\n\nexport default Aggregations;\n"],"file":"Aggregations.js"}
1
+ {"version":3,"sources":["../../../src/sidebar/aggregations/Aggregations.tsx"],"names":["React","useCallback","useEffect","useMemo","useState","DragDropContext","classNames","FontAwesomeIcon","dhNewCircleLargeFilled","vsTrash","vsEdit","dhWarningFilled","Log","DraggableItemList","DragUtils","Option","Select","RadioItem","RadioGroup","Button","AggregationOperation","AggregationUtils","log","module","SELECTABLE_OPTIONS","SUM","ABS_SUM","MIN","MAX","VAR","AVG","STD","FIRST","LAST","COUNT_DISTINCT","DISTINCT","COUNT","UNIQUE","Aggregations","isRollup","settings","onChange","onEdit","aggregations","showOnTop","options","filter","option","some","aggregation","operation","selectedOperation","setSelectedOperation","selectedRanges","setSelectedRanges","changeSettings","changedSettings","changeAggregations","newAggregations","changeShowOnTop","newShowOnTop","handleDragStart","debug","startDragging","handleDragEnd","destination","source","stopDragging","destinationIndex","index","draggedItems","reorder","insertIndex","adjustDestinationIndex","newSelectedRanges","length","handleOperationChange","handleAdd","selected","invert","handleDeleteClicked","itemIndex","handleAggregationSelectionChange","handleAggregationSelect","isRollupOperation","handleShowOnTopChange","event","target","value","setDefaultOperation","includes","renderAggregation","item","isClone","selectedCount","text","badgeText","undefined","className","isEditable","renderBadge","renderHandle","isOptionsShown","isAggregationsShown","map"],"mappings":"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","sourcesContent":["import React, {\n ChangeEvent,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from 'react';\nimport { DragDropContext } from 'react-beautiful-dnd';\nimport classNames from 'classnames';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport {\n dhNewCircleLargeFilled,\n vsTrash,\n vsEdit,\n dhWarningFilled,\n} from '@deephaven/icons';\nimport Log from '@deephaven/log';\nimport {\n DraggableItemList,\n DragUtils,\n Option,\n Select,\n RadioItem,\n RadioGroup,\n Button,\n} from '@deephaven/components';\nimport type { DraggableRenderItemProps, Range } from '@deephaven/components';\nimport AggregationOperation from './AggregationOperation';\nimport AggregationUtils from './AggregationUtils';\nimport './Aggregations.scss';\n\nconst log = Log.module('Aggregations');\n\nexport type Aggregation = {\n operation: AggregationOperation;\n selected: string[];\n invert: boolean;\n};\n\nexport type AggregationSettings = {\n aggregations: Aggregation[];\n showOnTop: boolean;\n};\n\nexport type AggregationsProps = {\n isRollup: boolean;\n settings: AggregationSettings;\n onChange: (settings: AggregationSettings) => void;\n onEdit: (aggregation: Aggregation) => void;\n};\n\nexport const SELECTABLE_OPTIONS = [\n AggregationOperation.SUM,\n AggregationOperation.ABS_SUM,\n AggregationOperation.MIN,\n AggregationOperation.MAX,\n AggregationOperation.VAR,\n AggregationOperation.AVG,\n AggregationOperation.STD,\n AggregationOperation.FIRST,\n AggregationOperation.LAST,\n AggregationOperation.COUNT_DISTINCT,\n AggregationOperation.DISTINCT,\n AggregationOperation.COUNT,\n AggregationOperation.UNIQUE,\n];\n\nconst Aggregations = ({\n isRollup,\n settings,\n onChange,\n onEdit,\n}: AggregationsProps): JSX.Element => {\n const { aggregations, showOnTop } = settings;\n const options = useMemo(\n () =>\n SELECTABLE_OPTIONS.filter(\n option =>\n !aggregations.some(aggregation => aggregation.operation === option)\n ),\n [aggregations]\n );\n const [selectedOperation, setSelectedOperation] = useState(options[0]);\n const [selectedRanges, setSelectedRanges] = useState<Range[]>([]);\n const changeSettings = useCallback(\n changedSettings => {\n onChange({ ...settings, ...changedSettings });\n },\n [onChange, settings]\n );\n const changeAggregations = useCallback(\n newAggregations => {\n changeSettings({ aggregations: newAggregations });\n },\n [changeSettings]\n );\n\n const changeShowOnTop = useCallback(\n newShowOnTop => {\n changeSettings({ showOnTop: newShowOnTop });\n },\n [changeSettings]\n );\n\n const handleDragStart = useCallback(() => {\n log.debug('handleDragStart');\n\n DragUtils.startDragging();\n }, []);\n\n const handleDragEnd = useCallback(\n ({ destination, source }) => {\n log.debug('handleDragEnd', destination, source);\n\n DragUtils.stopDragging();\n\n if (destination === null) {\n return;\n }\n\n let destinationIndex = destination.index;\n if (source.index < destination.index) {\n destinationIndex += 1;\n }\n\n const newAggregations = [...aggregations];\n const draggedItems = DragUtils.reorder(\n newAggregations,\n selectedRanges,\n newAggregations,\n destinationIndex\n );\n const insertIndex = DragUtils.adjustDestinationIndex(\n destinationIndex,\n selectedRanges\n );\n const newSelectedRanges: Range[] = [\n [insertIndex, insertIndex + draggedItems.length - 1],\n ];\n changeAggregations(newAggregations);\n setSelectedRanges(newSelectedRanges);\n },\n [changeAggregations, aggregations, selectedRanges, setSelectedRanges]\n );\n\n const handleOperationChange = useCallback(\n operation => {\n setSelectedOperation(operation);\n },\n [setSelectedOperation]\n );\n\n const handleAdd = useCallback(() => {\n changeAggregations([\n ...aggregations,\n { operation: selectedOperation, selected: [], invert: true },\n ]);\n }, [aggregations, selectedOperation, changeAggregations]);\n\n const handleDeleteClicked = useCallback(\n (itemIndex: number) => {\n changeAggregations(\n aggregations.filter((aggregation, index) => index !== itemIndex)\n );\n },\n [aggregations, changeAggregations]\n );\n\n const handleAggregationSelectionChange = useCallback(\n newSelectedRanges => {\n setSelectedRanges(newSelectedRanges);\n },\n [setSelectedRanges]\n );\n\n const handleAggregationSelect = useCallback(\n itemIndex => {\n const aggregation = aggregations[itemIndex];\n if (!AggregationUtils.isRollupOperation(aggregation.operation)) {\n onEdit(aggregation);\n }\n },\n [aggregations, onEdit]\n );\n\n const handleShowOnTopChange = useCallback(\n (event: ChangeEvent<HTMLInputElement>) => {\n changeShowOnTop(event.target.value === 'true');\n },\n [changeShowOnTop]\n );\n\n useEffect(\n function setDefaultOperation() {\n if (options.length > 0 && !options.includes(selectedOperation)) {\n setSelectedOperation(options[0]);\n }\n },\n [options, selectedOperation]\n );\n\n const renderAggregation = useCallback(\n ({\n item,\n itemIndex,\n isClone,\n selectedCount,\n }: DraggableRenderItemProps<Aggregation>) => {\n const text = item.operation;\n const badgeText = isClone ? `${selectedCount}` : undefined;\n const className = isClone ? 'item-list-item-clone' : undefined;\n const isRollupOperation = AggregationUtils.isRollupOperation(\n item.operation\n );\n const isEditable = !isClone && !isRollupOperation;\n return (\n <>\n <div\n className={classNames(\n 'item-list-item-content',\n 'draggable-item-list-item-content',\n className\n )}\n >\n <span className=\"title\">\n {text}\n {!isRollup && isRollupOperation && (\n <span className=\"small text-warning\">\n <FontAwesomeIcon icon={dhWarningFilled} /> Requires rollup\n </span>\n )}\n </span>\n {DraggableItemList.renderBadge({ text: badgeText })}\n {DraggableItemList.renderHandle()}\n </div>\n {!isClone && (\n <>\n <Button\n kind=\"ghost\"\n className=\"btn-edit\"\n icon={vsEdit}\n tooltip=\"Edit Columns\"\n onClick={() => onEdit(item)}\n disabled={!isEditable}\n />\n <Button\n kind=\"ghost\"\n className=\"btn-delete\"\n icon={vsTrash}\n tooltip=\"Delete Aggregation\"\n onClick={() => handleDeleteClicked(itemIndex)}\n />\n </>\n )}\n </>\n );\n },\n [handleDeleteClicked, onEdit, isRollup]\n );\n\n const isOptionsShown = options.length > 0;\n const isAggregationsShown = aggregations.length > 0;\n\n return (\n <div className=\"aggregations\">\n {isOptionsShown && (\n <div className=\"form-inline\">\n <Select onChange={handleOperationChange} value={selectedOperation}>\n {options.map(option => (\n <Option value={option} key={option}>\n {option}\n </Option>\n ))}\n </Select>\n <button\n type=\"button\"\n className=\"btn btn-link btn-add\"\n onClick={handleAdd}\n >\n <FontAwesomeIcon icon={dhNewCircleLargeFilled} />\n Add Aggregation\n </button>\n </div>\n )}\n {isOptionsShown && isAggregationsShown && <hr />}\n {isAggregationsShown && (\n <>\n {!isRollup && (\n <div className=\"form-inline\">\n <label>Placement:&nbsp;</label>\n <RadioGroup\n onChange={handleShowOnTopChange}\n value={`${showOnTop}`}\n >\n <RadioItem value=\"true\">Top</RadioItem>\n <RadioItem value=\"false\">Bottom</RadioItem>\n </RadioGroup>\n </div>\n )}\n <DragDropContext\n onDragStart={handleDragStart}\n onDragEnd={handleDragEnd}\n >\n <DraggableItemList<Aggregation>\n className=\"selected-aggregations\"\n itemCount={aggregations.length}\n items={aggregations}\n renderItem={renderAggregation}\n offset={0}\n onSelectionChange={handleAggregationSelectionChange}\n onSelect={handleAggregationSelect}\n selectedRanges={selectedRanges}\n isMultiSelect\n />\n </DragDropContext>\n </>\n )}\n </div>\n );\n};\n\nexport default Aggregations;\n"],"file":"Aggregations.js"}
@@ -1 +1 @@
1
- {"version":3,"file":"ColumnFormatEditor.d.ts","sourceRoot":"","sources":["../../../src/sidebar/conditional-formatting/ColumnFormatEditor.tsx"],"names":[],"mappings":";AAGA,OAAO,EACL,gBAAgB,EAChB,cAAc,EAId,WAAW,EACZ,MAAM,8BAA8B,CAAC;AAMtC,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC3B;AAeD,QAAA,MAAM,kBAAkB,UAAW,uBAAuB,KAAG,WA0G5D,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
1
+ {"version":3,"file":"ColumnFormatEditor.d.ts","sourceRoot":"","sources":["../../../src/sidebar/conditional-formatting/ColumnFormatEditor.tsx"],"names":[],"mappings":";AAGA,OAAO,EACL,gBAAgB,EAChB,cAAc,EAId,WAAW,EACZ,MAAM,8BAA8B,CAAC;AAMtC,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC3B;AAeD,QAAA,MAAM,kBAAkB,UAAW,uBAAuB,KAAG,WAuG5D,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
@@ -72,7 +72,7 @@ var ColumnFormatEditor = props => {
72
72
  log.debug('handleStyleChange', updatedStyleConfig);
73
73
  setStyle(updatedStyleConfig);
74
74
  }, []);
75
- useEffect(() => {
75
+ useEffect(function updateColumnFormat() {
76
76
  if (selectedColumn === undefined) {
77
77
  log.debug('Column is not selected, skip update.');
78
78
  return;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/sidebar/conditional-formatting/ColumnFormatEditor.tsx"],"names":["React","useCallback","useEffect","useState","Log","ComboBox","getDefaultConditionConfigForType","getConditionConfig","getDefaultStyleConfig","ConditionEditor","StyleEditor","log","module","DEFAULT_CALLBACK","undefined","makeDefaultConfig","columns","type","name","column","config","style","ColumnFormatEditor","props","onChange","selectedColumn","setColumn","find","c","conditionConfig","setConditionConfig","conditionValid","setConditionValid","selectedStyle","setStyle","handleColumnChange","value","newColumn","error","handleConditionChange","updatedConditionConfig","isValid","debug","handleStyleChange","updatedStyleConfig","columnInputOptions","map","title"],"mappings":"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","sourcesContent":["import React, { useCallback, useEffect, useState } from 'react';\nimport Log from '@deephaven/log';\nimport { ComboBox } from '@deephaven/components';\nimport {\n BaseFormatConfig,\n ChangeCallback,\n getDefaultConditionConfigForType,\n getConditionConfig,\n getDefaultStyleConfig,\n ModelColumn,\n} from './ConditionalFormattingUtils';\nimport ConditionEditor from './ConditionEditor';\nimport StyleEditor from './StyleEditor';\n\nconst log = Log.module('ColumnFormatEditor');\n\nexport interface ColumnFormatEditorProps {\n columns: ModelColumn[];\n config?: BaseFormatConfig;\n onChange?: ChangeCallback;\n}\n\nconst DEFAULT_CALLBACK = () => undefined;\n\nfunction makeDefaultConfig(columns: ModelColumn[]): BaseFormatConfig {\n const { type, name } = columns[0];\n const column = { type, name };\n const config = {\n column,\n style: getDefaultStyleConfig(),\n ...getDefaultConditionConfigForType(type),\n };\n return config;\n}\n\nconst ColumnFormatEditor = (props: ColumnFormatEditorProps): JSX.Element => {\n const {\n columns,\n config = makeDefaultConfig(columns),\n onChange = DEFAULT_CALLBACK,\n } = props;\n\n const [selectedColumn, setColumn] = useState(\n columns.find(\n c => c.name === config.column.name && c.type === config.column.type\n ) ?? columns[0]\n );\n const [conditionConfig, setConditionConfig] = useState(\n getConditionConfig(config)\n );\n const [conditionValid, setConditionValid] = useState(false);\n const [selectedStyle, setStyle] = useState(config.style);\n\n const handleColumnChange = useCallback(\n value => {\n const newColumn = columns.find(({ name }) => name === value);\n if (newColumn !== undefined) {\n setColumn(newColumn);\n if (selectedColumn.type !== newColumn.type) {\n setConditionConfig(getDefaultConditionConfigForType(newColumn.type));\n setConditionValid(false);\n }\n } else {\n log.error(`Column ${value} not found.`);\n }\n },\n [columns, selectedColumn]\n );\n\n const handleConditionChange = useCallback(\n (updatedConditionConfig, isValid) => {\n log.debug('handleConditionChange', updatedConditionConfig, isValid);\n setConditionConfig(updatedConditionConfig);\n setConditionValid(isValid);\n },\n []\n );\n\n const handleStyleChange = useCallback(updatedStyleConfig => {\n log.debug('handleStyleChange', updatedStyleConfig);\n setStyle(updatedStyleConfig);\n }, []);\n\n useEffect(() => {\n if (selectedColumn === undefined) {\n log.debug('Column is not selected, skip update.');\n return;\n }\n if (selectedStyle === undefined) {\n log.debug('Style is not selected, skip update.');\n return;\n }\n const { type, name } = selectedColumn;\n const column = { type, name };\n onChange(\n {\n column,\n style: selectedStyle,\n ...conditionConfig,\n },\n conditionValid\n );\n }, [\n onChange,\n selectedColumn,\n selectedStyle,\n conditionConfig,\n conditionValid,\n ]);\n\n const columnInputOptions = columns.map(({ name }) => ({\n title: name,\n value: name,\n }));\n\n return (\n <div className=\"conditional-rule-editor form\">\n <div className=\"mb-2\">\n <label className=\"mb-0\">Format Cell If</label>\n <ComboBox\n defaultValue={selectedColumn?.name}\n options={columnInputOptions}\n inputPlaceholder=\"Select a column\"\n spellCheck={false}\n onChange={handleColumnChange}\n searchPlaceholder=\"Filter columns\"\n />\n </div>\n\n {selectedColumn !== undefined && (\n <>\n <ConditionEditor\n column={selectedColumn}\n config={conditionConfig}\n onChange={handleConditionChange}\n />\n <StyleEditor config={selectedStyle} onChange={handleStyleChange} />\n </>\n )}\n </div>\n );\n};\n\nexport default ColumnFormatEditor;\n"],"file":"ColumnFormatEditor.js"}
1
+ {"version":3,"sources":["../../../src/sidebar/conditional-formatting/ColumnFormatEditor.tsx"],"names":["React","useCallback","useEffect","useState","Log","ComboBox","getDefaultConditionConfigForType","getConditionConfig","getDefaultStyleConfig","ConditionEditor","StyleEditor","log","module","DEFAULT_CALLBACK","undefined","makeDefaultConfig","columns","type","name","column","config","style","ColumnFormatEditor","props","onChange","selectedColumn","setColumn","find","c","conditionConfig","setConditionConfig","conditionValid","setConditionValid","selectedStyle","setStyle","handleColumnChange","value","newColumn","error","handleConditionChange","updatedConditionConfig","isValid","debug","handleStyleChange","updatedStyleConfig","updateColumnFormat","columnInputOptions","map","title"],"mappings":"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","sourcesContent":["import React, { useCallback, useEffect, useState } from 'react';\nimport Log from '@deephaven/log';\nimport { ComboBox } from '@deephaven/components';\nimport {\n BaseFormatConfig,\n ChangeCallback,\n getDefaultConditionConfigForType,\n getConditionConfig,\n getDefaultStyleConfig,\n ModelColumn,\n} from './ConditionalFormattingUtils';\nimport ConditionEditor from './ConditionEditor';\nimport StyleEditor from './StyleEditor';\n\nconst log = Log.module('ColumnFormatEditor');\n\nexport interface ColumnFormatEditorProps {\n columns: ModelColumn[];\n config?: BaseFormatConfig;\n onChange?: ChangeCallback;\n}\n\nconst DEFAULT_CALLBACK = () => undefined;\n\nfunction makeDefaultConfig(columns: ModelColumn[]): BaseFormatConfig {\n const { type, name } = columns[0];\n const column = { type, name };\n const config = {\n column,\n style: getDefaultStyleConfig(),\n ...getDefaultConditionConfigForType(type),\n };\n return config;\n}\n\nconst ColumnFormatEditor = (props: ColumnFormatEditorProps): JSX.Element => {\n const {\n columns,\n config = makeDefaultConfig(columns),\n onChange = DEFAULT_CALLBACK,\n } = props;\n\n const [selectedColumn, setColumn] = useState(\n columns.find(\n c => c.name === config.column.name && c.type === config.column.type\n ) ?? columns[0]\n );\n const [conditionConfig, setConditionConfig] = useState(\n getConditionConfig(config)\n );\n const [conditionValid, setConditionValid] = useState(false);\n const [selectedStyle, setStyle] = useState(config.style);\n\n const handleColumnChange = useCallback(\n value => {\n const newColumn = columns.find(({ name }) => name === value);\n if (newColumn !== undefined) {\n setColumn(newColumn);\n if (selectedColumn.type !== newColumn.type) {\n setConditionConfig(getDefaultConditionConfigForType(newColumn.type));\n setConditionValid(false);\n }\n } else {\n log.error(`Column ${value} not found.`);\n }\n },\n [columns, selectedColumn]\n );\n\n const handleConditionChange = useCallback(\n (updatedConditionConfig, isValid) => {\n log.debug('handleConditionChange', updatedConditionConfig, isValid);\n setConditionConfig(updatedConditionConfig);\n setConditionValid(isValid);\n },\n []\n );\n\n const handleStyleChange = useCallback(updatedStyleConfig => {\n log.debug('handleStyleChange', updatedStyleConfig);\n setStyle(updatedStyleConfig);\n }, []);\n\n useEffect(\n function updateColumnFormat() {\n if (selectedColumn === undefined) {\n log.debug('Column is not selected, skip update.');\n return;\n }\n if (selectedStyle === undefined) {\n log.debug('Style is not selected, skip update.');\n return;\n }\n const { type, name } = selectedColumn;\n const column = { type, name };\n onChange(\n {\n column,\n style: selectedStyle,\n ...conditionConfig,\n },\n conditionValid\n );\n },\n [onChange, selectedColumn, selectedStyle, conditionConfig, conditionValid]\n );\n\n const columnInputOptions = columns.map(({ name }) => ({\n title: name,\n value: name,\n }));\n\n return (\n <div className=\"conditional-rule-editor form\">\n <div className=\"mb-2\">\n <label className=\"mb-0\">Format Cell If</label>\n <ComboBox\n defaultValue={selectedColumn?.name}\n options={columnInputOptions}\n inputPlaceholder=\"Select a column\"\n spellCheck={false}\n onChange={handleColumnChange}\n searchPlaceholder=\"Filter columns\"\n />\n </div>\n\n {selectedColumn !== undefined && (\n <>\n <ConditionEditor\n column={selectedColumn}\n config={conditionConfig}\n onChange={handleConditionChange}\n />\n <StyleEditor config={selectedStyle} onChange={handleStyleChange} />\n </>\n )}\n </div>\n );\n};\n\nexport default ColumnFormatEditor;\n"],"file":"ColumnFormatEditor.js"}
@@ -1 +1 @@
1
- {"version":3,"file":"ConditionEditor.d.ts","sourceRoot":"","sources":["../../../src/sidebar/conditional-formatting/ConditionEditor.tsx"],"names":[],"mappings":";AAGA,OAAO,EAOL,WAAW,EACX,eAAe,EAMhB,MAAM,8BAA8B,CAAC;AAItC,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,WAAW,CAAC;IACpB,MAAM,EAAE,eAAe,CAAC;IACxB,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,eAAe,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;CAChE;AAgOD,QAAA,MAAM,eAAe,UAAW,oBAAoB,KAAG,WAwKtD,CAAC;AAEF,eAAe,eAAe,CAAC"}
1
+ {"version":3,"file":"ConditionEditor.d.ts","sourceRoot":"","sources":["../../../src/sidebar/conditional-formatting/ConditionEditor.tsx"],"names":[],"mappings":";AAGA,OAAO,EAOL,WAAW,EACX,eAAe,EAMhB,MAAM,8BAA8B,CAAC;AAItC,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,WAAW,CAAC;IACpB,MAAM,EAAE,eAAe,CAAC;IACxB,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,eAAe,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;CAChE;AAgOD,QAAA,MAAM,eAAe,UAAW,oBAAoB,KAAG,WA6KtD,CAAC;AAEF,eAAe,eAAe,CAAC"}
@@ -213,7 +213,7 @@ var ConditionEditor = props => {
213
213
  log.debug('handleEndValueChange', value);
214
214
  setEndValue(value);
215
215
  }, []);
216
- useEffect(() => {
216
+ useEffect(function changeCondition() {
217
217
  var isValid = true;
218
218
 
219
219
  if (selectedCondition === undefined) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/sidebar/conditional-formatting/ConditionEditor.tsx"],"names":["React","useCallback","useEffect","useMemo","useState","Log","TableUtils","StringCondition","DateCondition","getLabelForNumberCondition","getLabelForDateCondition","getLabelForStringCondition","NumberCondition","getDefaultConditionForType","getLabelForBooleanCondition","BooleanCondition","CharCondition","getLabelForCharCondition","log","module","DEFAULT_CALLBACK","undefined","numberConditionOptions","IS_EQUAL","IS_NOT_EQUAL","IS_BETWEEN","GREATER_THAN","GREATER_THAN_OR_EQUAL","LESS_THAN","LESS_THAN_OR_EQUAL","IS_NULL","IS_NOT_NULL","map","option","stringConditions","IS_EXACTLY","IS_NOT_EXACTLY","CONTAINS","DOES_NOT_CONTAIN","STARTS_WITH","ENDS_WITH","dateConditions","IS_BEFORE","IS_BEFORE_OR_EQUAL","IS_AFTER","IS_AFTER_OR_EQUAL","booleanConditions","IS_TRUE","IS_FALSE","charConditions","isNumberConditionValid","condition","value","startValue","endValue","Number","isNaN","parseFloat","getNumberInputs","selectedCondition","handleValueChange","handleStartValueChange","handleEndValueChange","conditionValue","getStringInputs","getDateInputs","getBooleanInputs","getCharInputs","ConditionEditor","props","column","config","onChange","selectedColumnType","type","prevColumnType","setPrevColumnType","setCondition","setValue","setStartValue","start","setEndValue","end","conditions","isNumberType","isCharType","isStringType","isDateType","isBooleanType","handleConditionChange","e","target","debug","isValid","conditionInputs"],"mappings":"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","sourcesContent":["import React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport Log from '@deephaven/log';\nimport TableUtils from '../../TableUtils';\nimport {\n StringCondition,\n DateCondition,\n getLabelForNumberCondition,\n getLabelForDateCondition,\n getLabelForStringCondition,\n NumberCondition,\n ModelColumn,\n ConditionConfig,\n getDefaultConditionForType,\n getLabelForBooleanCondition,\n BooleanCondition,\n CharCondition,\n getLabelForCharCondition,\n} from './ConditionalFormattingUtils';\n\nconst log = Log.module('ConditionEditor');\n\nexport interface ConditionEditorProps {\n column: ModelColumn;\n config: ConditionConfig;\n onChange?: (config: ConditionConfig, isValid: boolean) => void;\n}\n\nconst DEFAULT_CALLBACK = () => undefined;\n\nconst numberConditionOptions = [\n NumberCondition.IS_EQUAL,\n NumberCondition.IS_NOT_EQUAL,\n NumberCondition.IS_BETWEEN,\n NumberCondition.GREATER_THAN,\n NumberCondition.GREATER_THAN_OR_EQUAL,\n NumberCondition.LESS_THAN,\n NumberCondition.LESS_THAN_OR_EQUAL,\n NumberCondition.IS_NULL,\n NumberCondition.IS_NOT_NULL,\n].map(option => (\n <option key={option} value={option}>\n {getLabelForNumberCondition(option)}\n </option>\n));\n\nconst stringConditions = [\n StringCondition.IS_EXACTLY,\n StringCondition.IS_NOT_EXACTLY,\n StringCondition.CONTAINS,\n StringCondition.DOES_NOT_CONTAIN,\n StringCondition.STARTS_WITH,\n StringCondition.ENDS_WITH,\n StringCondition.IS_NULL,\n StringCondition.IS_NOT_NULL,\n].map(option => (\n <option key={option} value={option}>\n {getLabelForStringCondition(option)}\n </option>\n));\n\nconst dateConditions = [\n DateCondition.IS_EXACTLY,\n DateCondition.IS_NOT_EXACTLY,\n DateCondition.IS_BEFORE,\n DateCondition.IS_BEFORE_OR_EQUAL,\n DateCondition.IS_AFTER,\n DateCondition.IS_AFTER_OR_EQUAL,\n DateCondition.IS_NULL,\n DateCondition.IS_NOT_NULL,\n].map(option => (\n <option key={option} value={option}>\n {getLabelForDateCondition(option)}\n </option>\n));\n\nconst booleanConditions = [\n BooleanCondition.IS_TRUE,\n BooleanCondition.IS_FALSE,\n BooleanCondition.IS_NULL,\n BooleanCondition.IS_NOT_NULL,\n].map(option => (\n <option key={option} value={option}>\n {getLabelForBooleanCondition(option)}\n </option>\n));\n\nconst charConditions = [\n CharCondition.IS_EQUAL,\n CharCondition.IS_NOT_EQUAL,\n CharCondition.IS_NULL,\n CharCondition.IS_NOT_NULL,\n].map(option => (\n <option key={option} value={option}>\n {getLabelForCharCondition(option)}\n </option>\n));\n\nfunction isNumberConditionValid(\n condition: NumberCondition,\n value?: string,\n startValue?: string,\n endValue?: string\n) {\n if (\n condition === NumberCondition.IS_NULL ||\n condition === NumberCondition.IS_NOT_NULL\n ) {\n return true;\n }\n if (\n condition === NumberCondition.IS_BETWEEN &&\n startValue &&\n !Number.isNaN(Number.parseFloat(startValue)) &&\n endValue &&\n !Number.isNaN(Number.parseFloat(endValue))\n ) {\n return true;\n }\n if (\n condition !== NumberCondition.IS_BETWEEN &&\n value &&\n !Number.isNaN(Number.parseFloat(value))\n ) {\n return true;\n }\n return false;\n}\n\nfunction getNumberInputs(\n selectedCondition: NumberCondition,\n handleValueChange: (e: unknown) => void,\n handleStartValueChange: (e: unknown) => void,\n handleEndValueChange: (e: unknown) => void,\n conditionValue?: string,\n startValue?: string,\n endValue?: string\n) {\n switch (selectedCondition) {\n case NumberCondition.IS_EQUAL:\n case NumberCondition.IS_NOT_EQUAL:\n case NumberCondition.GREATER_THAN:\n case NumberCondition.GREATER_THAN_OR_EQUAL:\n case NumberCondition.LESS_THAN:\n case NumberCondition.LESS_THAN_OR_EQUAL:\n return (\n <input\n type=\"number\"\n className=\"form-control\"\n placeholder=\"Enter value\"\n value={conditionValue ?? ''}\n onChange={handleValueChange}\n />\n );\n case NumberCondition.IS_BETWEEN:\n return (\n <div className=\"d-flex flex-row\">\n <input\n type=\"number\"\n className=\"form-control d-flex mr-2\"\n placeholder=\"Start value\"\n value={startValue ?? ''}\n onChange={handleStartValueChange}\n />\n <input\n type=\"number\"\n className=\"form-control d-flex\"\n placeholder=\"End value\"\n value={endValue ?? ''}\n onChange={handleEndValueChange}\n />\n </div>\n );\n case NumberCondition.IS_NULL:\n case NumberCondition.IS_NOT_NULL:\n return null;\n }\n}\n\nfunction getStringInputs(\n selectedCondition: StringCondition,\n handleValueChange: (e: unknown) => void,\n conditionValue?: string\n) {\n switch (selectedCondition) {\n case StringCondition.IS_NULL:\n case StringCondition.IS_NOT_NULL:\n return null;\n default:\n return (\n <input\n type=\"text\"\n className=\"form-control\"\n placeholder=\"Enter value\"\n value={conditionValue ?? ''}\n onChange={handleValueChange}\n />\n );\n }\n}\n\nfunction getDateInputs(\n selectedCondition: DateCondition,\n handleValueChange: (e: unknown) => void,\n conditionValue?: string\n) {\n switch (selectedCondition) {\n case DateCondition.IS_NULL:\n case DateCondition.IS_NOT_NULL:\n return null;\n default:\n return (\n <input\n type=\"text\"\n className=\"form-control\"\n placeholder=\"Enter value\"\n value={conditionValue ?? ''}\n onChange={handleValueChange}\n />\n );\n }\n}\n\nfunction getBooleanInputs() {\n return null;\n}\n\nfunction getCharInputs(\n selectedCondition: CharCondition,\n handleValueChange: (e: unknown) => void,\n conditionValue?: string\n) {\n switch (selectedCondition) {\n case CharCondition.IS_NULL:\n case CharCondition.IS_NOT_NULL:\n return null;\n default:\n return (\n <input\n type=\"text\"\n className=\"form-control\"\n maxLength={1}\n placeholder=\"Enter value\"\n value={conditionValue ?? ''}\n onChange={handleValueChange}\n />\n );\n }\n}\n\nconst ConditionEditor = (props: ConditionEditorProps): JSX.Element => {\n const { column, config, onChange = DEFAULT_CALLBACK } = props;\n const selectedColumnType = column.type;\n const [prevColumnType, setPrevColumnType] = useState(selectedColumnType);\n const [selectedCondition, setCondition] = useState(config.condition);\n const [conditionValue, setValue] = useState(config.value);\n const [startValue, setStartValue] = useState(config.start);\n const [endValue, setEndValue] = useState(config.end);\n\n if (selectedColumnType !== prevColumnType) {\n // Column type changed, reset condition and value fields\n setCondition(getDefaultConditionForType(selectedColumnType));\n setValue(undefined);\n setStartValue(undefined);\n setEndValue(undefined);\n setPrevColumnType(selectedColumnType);\n }\n\n const conditions = useMemo(() => {\n if (selectedColumnType === undefined) {\n return [];\n }\n if (TableUtils.isNumberType(selectedColumnType)) {\n return numberConditionOptions;\n }\n if (TableUtils.isCharType(selectedColumnType)) {\n return charConditions;\n }\n if (TableUtils.isStringType(selectedColumnType)) {\n return stringConditions;\n }\n if (TableUtils.isDateType(selectedColumnType)) {\n return dateConditions;\n }\n if (TableUtils.isBooleanType(selectedColumnType)) {\n return booleanConditions;\n }\n }, [selectedColumnType]);\n\n const handleConditionChange = useCallback(e => {\n const { value } = e.target;\n log.debug('handleConditionChange', value);\n setCondition(value);\n }, []);\n\n const handleValueChange = useCallback(e => {\n const { value } = e.target;\n log.debug('handleValueChange', value);\n setValue(value);\n }, []);\n\n const handleStartValueChange = useCallback(e => {\n const { value } = e.target;\n log.debug('handleStartValueChange', value);\n setStartValue(value);\n }, []);\n\n const handleEndValueChange = useCallback(e => {\n const { value } = e.target;\n log.debug('handleEndValueChange', value);\n setEndValue(value);\n }, []);\n\n useEffect(() => {\n let isValid = true;\n\n if (selectedCondition === undefined) {\n log.debug('Unable to create formatting rule. Condition is not selected.');\n isValid = false;\n }\n\n if (\n TableUtils.isNumberType(column.type) &&\n !isNumberConditionValid(\n selectedCondition as NumberCondition,\n conditionValue,\n startValue,\n endValue\n )\n ) {\n log.debug(\n 'Unable to create formatting rule. Invalid value',\n conditionValue\n );\n isValid = false;\n }\n onChange(\n {\n condition: selectedCondition,\n value: conditionValue,\n start: startValue,\n end: endValue,\n },\n isValid\n );\n }, [\n onChange,\n column.type,\n selectedCondition,\n conditionValue,\n startValue,\n endValue,\n ]);\n\n const conditionInputs = useMemo(() => {\n if (selectedColumnType === undefined) {\n // Column not selected\n return null;\n }\n if (TableUtils.isNumberType(selectedColumnType)) {\n return getNumberInputs(\n selectedCondition as NumberCondition,\n handleValueChange,\n handleStartValueChange,\n handleEndValueChange,\n conditionValue,\n startValue,\n endValue\n );\n }\n if (TableUtils.isCharType(selectedColumnType)) {\n return getCharInputs(\n selectedCondition as CharCondition,\n handleValueChange,\n conditionValue\n );\n }\n if (TableUtils.isStringType(selectedColumnType)) {\n return getStringInputs(\n selectedCondition as StringCondition,\n handleValueChange,\n conditionValue\n );\n }\n if (TableUtils.isDateType(selectedColumnType)) {\n return getDateInputs(\n selectedCondition as DateCondition,\n handleValueChange,\n conditionValue\n );\n }\n if (TableUtils.isBooleanType(selectedColumnType)) {\n return getBooleanInputs();\n }\n }, [\n selectedColumnType,\n selectedCondition,\n conditionValue,\n startValue,\n endValue,\n handleValueChange,\n handleStartValueChange,\n handleEndValueChange,\n ]);\n\n return (\n <div className=\"condition-editor mb-2\">\n <select\n value={selectedCondition}\n id=\"condition-select\"\n className=\"custom-select mb-2\"\n onChange={handleConditionChange}\n >\n {conditions}\n </select>\n {conditionInputs}\n </div>\n );\n};\n\nexport default ConditionEditor;\n"],"file":"ConditionEditor.js"}
1
+ {"version":3,"sources":["../../../src/sidebar/conditional-formatting/ConditionEditor.tsx"],"names":["React","useCallback","useEffect","useMemo","useState","Log","TableUtils","StringCondition","DateCondition","getLabelForNumberCondition","getLabelForDateCondition","getLabelForStringCondition","NumberCondition","getDefaultConditionForType","getLabelForBooleanCondition","BooleanCondition","CharCondition","getLabelForCharCondition","log","module","DEFAULT_CALLBACK","undefined","numberConditionOptions","IS_EQUAL","IS_NOT_EQUAL","IS_BETWEEN","GREATER_THAN","GREATER_THAN_OR_EQUAL","LESS_THAN","LESS_THAN_OR_EQUAL","IS_NULL","IS_NOT_NULL","map","option","stringConditions","IS_EXACTLY","IS_NOT_EXACTLY","CONTAINS","DOES_NOT_CONTAIN","STARTS_WITH","ENDS_WITH","dateConditions","IS_BEFORE","IS_BEFORE_OR_EQUAL","IS_AFTER","IS_AFTER_OR_EQUAL","booleanConditions","IS_TRUE","IS_FALSE","charConditions","isNumberConditionValid","condition","value","startValue","endValue","Number","isNaN","parseFloat","getNumberInputs","selectedCondition","handleValueChange","handleStartValueChange","handleEndValueChange","conditionValue","getStringInputs","getDateInputs","getBooleanInputs","getCharInputs","ConditionEditor","props","column","config","onChange","selectedColumnType","type","prevColumnType","setPrevColumnType","setCondition","setValue","setStartValue","start","setEndValue","end","conditions","isNumberType","isCharType","isStringType","isDateType","isBooleanType","handleConditionChange","e","target","debug","changeCondition","isValid","conditionInputs"],"mappings":"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","sourcesContent":["import React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport Log from '@deephaven/log';\nimport TableUtils from '../../TableUtils';\nimport {\n StringCondition,\n DateCondition,\n getLabelForNumberCondition,\n getLabelForDateCondition,\n getLabelForStringCondition,\n NumberCondition,\n ModelColumn,\n ConditionConfig,\n getDefaultConditionForType,\n getLabelForBooleanCondition,\n BooleanCondition,\n CharCondition,\n getLabelForCharCondition,\n} from './ConditionalFormattingUtils';\n\nconst log = Log.module('ConditionEditor');\n\nexport interface ConditionEditorProps {\n column: ModelColumn;\n config: ConditionConfig;\n onChange?: (config: ConditionConfig, isValid: boolean) => void;\n}\n\nconst DEFAULT_CALLBACK = () => undefined;\n\nconst numberConditionOptions = [\n NumberCondition.IS_EQUAL,\n NumberCondition.IS_NOT_EQUAL,\n NumberCondition.IS_BETWEEN,\n NumberCondition.GREATER_THAN,\n NumberCondition.GREATER_THAN_OR_EQUAL,\n NumberCondition.LESS_THAN,\n NumberCondition.LESS_THAN_OR_EQUAL,\n NumberCondition.IS_NULL,\n NumberCondition.IS_NOT_NULL,\n].map(option => (\n <option key={option} value={option}>\n {getLabelForNumberCondition(option)}\n </option>\n));\n\nconst stringConditions = [\n StringCondition.IS_EXACTLY,\n StringCondition.IS_NOT_EXACTLY,\n StringCondition.CONTAINS,\n StringCondition.DOES_NOT_CONTAIN,\n StringCondition.STARTS_WITH,\n StringCondition.ENDS_WITH,\n StringCondition.IS_NULL,\n StringCondition.IS_NOT_NULL,\n].map(option => (\n <option key={option} value={option}>\n {getLabelForStringCondition(option)}\n </option>\n));\n\nconst dateConditions = [\n DateCondition.IS_EXACTLY,\n DateCondition.IS_NOT_EXACTLY,\n DateCondition.IS_BEFORE,\n DateCondition.IS_BEFORE_OR_EQUAL,\n DateCondition.IS_AFTER,\n DateCondition.IS_AFTER_OR_EQUAL,\n DateCondition.IS_NULL,\n DateCondition.IS_NOT_NULL,\n].map(option => (\n <option key={option} value={option}>\n {getLabelForDateCondition(option)}\n </option>\n));\n\nconst booleanConditions = [\n BooleanCondition.IS_TRUE,\n BooleanCondition.IS_FALSE,\n BooleanCondition.IS_NULL,\n BooleanCondition.IS_NOT_NULL,\n].map(option => (\n <option key={option} value={option}>\n {getLabelForBooleanCondition(option)}\n </option>\n));\n\nconst charConditions = [\n CharCondition.IS_EQUAL,\n CharCondition.IS_NOT_EQUAL,\n CharCondition.IS_NULL,\n CharCondition.IS_NOT_NULL,\n].map(option => (\n <option key={option} value={option}>\n {getLabelForCharCondition(option)}\n </option>\n));\n\nfunction isNumberConditionValid(\n condition: NumberCondition,\n value?: string,\n startValue?: string,\n endValue?: string\n) {\n if (\n condition === NumberCondition.IS_NULL ||\n condition === NumberCondition.IS_NOT_NULL\n ) {\n return true;\n }\n if (\n condition === NumberCondition.IS_BETWEEN &&\n startValue &&\n !Number.isNaN(Number.parseFloat(startValue)) &&\n endValue &&\n !Number.isNaN(Number.parseFloat(endValue))\n ) {\n return true;\n }\n if (\n condition !== NumberCondition.IS_BETWEEN &&\n value &&\n !Number.isNaN(Number.parseFloat(value))\n ) {\n return true;\n }\n return false;\n}\n\nfunction getNumberInputs(\n selectedCondition: NumberCondition,\n handleValueChange: (e: unknown) => void,\n handleStartValueChange: (e: unknown) => void,\n handleEndValueChange: (e: unknown) => void,\n conditionValue?: string,\n startValue?: string,\n endValue?: string\n) {\n switch (selectedCondition) {\n case NumberCondition.IS_EQUAL:\n case NumberCondition.IS_NOT_EQUAL:\n case NumberCondition.GREATER_THAN:\n case NumberCondition.GREATER_THAN_OR_EQUAL:\n case NumberCondition.LESS_THAN:\n case NumberCondition.LESS_THAN_OR_EQUAL:\n return (\n <input\n type=\"number\"\n className=\"form-control\"\n placeholder=\"Enter value\"\n value={conditionValue ?? ''}\n onChange={handleValueChange}\n />\n );\n case NumberCondition.IS_BETWEEN:\n return (\n <div className=\"d-flex flex-row\">\n <input\n type=\"number\"\n className=\"form-control d-flex mr-2\"\n placeholder=\"Start value\"\n value={startValue ?? ''}\n onChange={handleStartValueChange}\n />\n <input\n type=\"number\"\n className=\"form-control d-flex\"\n placeholder=\"End value\"\n value={endValue ?? ''}\n onChange={handleEndValueChange}\n />\n </div>\n );\n case NumberCondition.IS_NULL:\n case NumberCondition.IS_NOT_NULL:\n return null;\n }\n}\n\nfunction getStringInputs(\n selectedCondition: StringCondition,\n handleValueChange: (e: unknown) => void,\n conditionValue?: string\n) {\n switch (selectedCondition) {\n case StringCondition.IS_NULL:\n case StringCondition.IS_NOT_NULL:\n return null;\n default:\n return (\n <input\n type=\"text\"\n className=\"form-control\"\n placeholder=\"Enter value\"\n value={conditionValue ?? ''}\n onChange={handleValueChange}\n />\n );\n }\n}\n\nfunction getDateInputs(\n selectedCondition: DateCondition,\n handleValueChange: (e: unknown) => void,\n conditionValue?: string\n) {\n switch (selectedCondition) {\n case DateCondition.IS_NULL:\n case DateCondition.IS_NOT_NULL:\n return null;\n default:\n return (\n <input\n type=\"text\"\n className=\"form-control\"\n placeholder=\"Enter value\"\n value={conditionValue ?? ''}\n onChange={handleValueChange}\n />\n );\n }\n}\n\nfunction getBooleanInputs() {\n return null;\n}\n\nfunction getCharInputs(\n selectedCondition: CharCondition,\n handleValueChange: (e: unknown) => void,\n conditionValue?: string\n) {\n switch (selectedCondition) {\n case CharCondition.IS_NULL:\n case CharCondition.IS_NOT_NULL:\n return null;\n default:\n return (\n <input\n type=\"text\"\n className=\"form-control\"\n maxLength={1}\n placeholder=\"Enter value\"\n value={conditionValue ?? ''}\n onChange={handleValueChange}\n />\n );\n }\n}\n\nconst ConditionEditor = (props: ConditionEditorProps): JSX.Element => {\n const { column, config, onChange = DEFAULT_CALLBACK } = props;\n const selectedColumnType = column.type;\n const [prevColumnType, setPrevColumnType] = useState(selectedColumnType);\n const [selectedCondition, setCondition] = useState(config.condition);\n const [conditionValue, setValue] = useState(config.value);\n const [startValue, setStartValue] = useState(config.start);\n const [endValue, setEndValue] = useState(config.end);\n\n if (selectedColumnType !== prevColumnType) {\n // Column type changed, reset condition and value fields\n setCondition(getDefaultConditionForType(selectedColumnType));\n setValue(undefined);\n setStartValue(undefined);\n setEndValue(undefined);\n setPrevColumnType(selectedColumnType);\n }\n\n const conditions = useMemo(() => {\n if (selectedColumnType === undefined) {\n return [];\n }\n if (TableUtils.isNumberType(selectedColumnType)) {\n return numberConditionOptions;\n }\n if (TableUtils.isCharType(selectedColumnType)) {\n return charConditions;\n }\n if (TableUtils.isStringType(selectedColumnType)) {\n return stringConditions;\n }\n if (TableUtils.isDateType(selectedColumnType)) {\n return dateConditions;\n }\n if (TableUtils.isBooleanType(selectedColumnType)) {\n return booleanConditions;\n }\n }, [selectedColumnType]);\n\n const handleConditionChange = useCallback(e => {\n const { value } = e.target;\n log.debug('handleConditionChange', value);\n setCondition(value);\n }, []);\n\n const handleValueChange = useCallback(e => {\n const { value } = e.target;\n log.debug('handleValueChange', value);\n setValue(value);\n }, []);\n\n const handleStartValueChange = useCallback(e => {\n const { value } = e.target;\n log.debug('handleStartValueChange', value);\n setStartValue(value);\n }, []);\n\n const handleEndValueChange = useCallback(e => {\n const { value } = e.target;\n log.debug('handleEndValueChange', value);\n setEndValue(value);\n }, []);\n\n useEffect(\n function changeCondition() {\n let isValid = true;\n\n if (selectedCondition === undefined) {\n log.debug(\n 'Unable to create formatting rule. Condition is not selected.'\n );\n isValid = false;\n }\n\n if (\n TableUtils.isNumberType(column.type) &&\n !isNumberConditionValid(\n selectedCondition as NumberCondition,\n conditionValue,\n startValue,\n endValue\n )\n ) {\n log.debug(\n 'Unable to create formatting rule. Invalid value',\n conditionValue\n );\n isValid = false;\n }\n onChange(\n {\n condition: selectedCondition,\n value: conditionValue,\n start: startValue,\n end: endValue,\n },\n isValid\n );\n },\n [\n onChange,\n column.type,\n selectedCondition,\n conditionValue,\n startValue,\n endValue,\n ]\n );\n\n const conditionInputs = useMemo(() => {\n if (selectedColumnType === undefined) {\n // Column not selected\n return null;\n }\n if (TableUtils.isNumberType(selectedColumnType)) {\n return getNumberInputs(\n selectedCondition as NumberCondition,\n handleValueChange,\n handleStartValueChange,\n handleEndValueChange,\n conditionValue,\n startValue,\n endValue\n );\n }\n if (TableUtils.isCharType(selectedColumnType)) {\n return getCharInputs(\n selectedCondition as CharCondition,\n handleValueChange,\n conditionValue\n );\n }\n if (TableUtils.isStringType(selectedColumnType)) {\n return getStringInputs(\n selectedCondition as StringCondition,\n handleValueChange,\n conditionValue\n );\n }\n if (TableUtils.isDateType(selectedColumnType)) {\n return getDateInputs(\n selectedCondition as DateCondition,\n handleValueChange,\n conditionValue\n );\n }\n if (TableUtils.isBooleanType(selectedColumnType)) {\n return getBooleanInputs();\n }\n }, [\n selectedColumnType,\n selectedCondition,\n conditionValue,\n startValue,\n endValue,\n handleValueChange,\n handleStartValueChange,\n handleEndValueChange,\n ]);\n\n return (\n <div className=\"condition-editor mb-2\">\n <select\n value={selectedCondition}\n id=\"condition-select\"\n className=\"custom-select mb-2\"\n onChange={handleConditionChange}\n >\n {conditions}\n </select>\n {conditionInputs}\n </div>\n );\n};\n\nexport default ConditionEditor;\n"],"file":"ConditionEditor.js"}
@@ -1 +1 @@
1
- {"version":3,"file":"RowFormatEditor.d.ts","sourceRoot":"","sources":["../../../src/sidebar/conditional-formatting/RowFormatEditor.tsx"],"names":[],"mappings":";AAGA,OAAO,EACL,gBAAgB,EAChB,cAAc,EAId,WAAW,EACZ,MAAM,8BAA8B,CAAC;AAMtC,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC3B;AAeD,QAAA,MAAM,eAAe,UAAW,oBAAoB,KAAG,WA0GtD,CAAC;AAEF,eAAe,eAAe,CAAC"}
1
+ {"version":3,"file":"RowFormatEditor.d.ts","sourceRoot":"","sources":["../../../src/sidebar/conditional-formatting/RowFormatEditor.tsx"],"names":[],"mappings":";AAGA,OAAO,EACL,gBAAgB,EAChB,cAAc,EAId,WAAW,EACZ,MAAM,8BAA8B,CAAC;AAMtC,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC3B;AAeD,QAAA,MAAM,eAAe,UAAW,oBAAoB,KAAG,WAuGtD,CAAC;AAEF,eAAe,eAAe,CAAC"}
@@ -72,7 +72,7 @@ var RowFormatEditor = props => {
72
72
  log.debug('handleStyleChange', updatedStyleConfig);
73
73
  setStyle(updatedStyleConfig);
74
74
  }, []);
75
- useEffect(() => {
75
+ useEffect(function updateRowFormat() {
76
76
  if (selectedColumn === undefined) {
77
77
  log.debug('Column is not selected, skip update.');
78
78
  return;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/sidebar/conditional-formatting/RowFormatEditor.tsx"],"names":["React","useCallback","useEffect","useState","Log","ComboBox","getDefaultConditionConfigForType","getConditionConfig","getDefaultStyleConfig","ConditionEditor","StyleEditor","log","module","DEFAULT_CALLBACK","undefined","makeDefaultConfig","columns","type","name","column","config","style","RowFormatEditor","props","onChange","selectedColumn","setColumn","find","c","conditionConfig","setConditionConfig","conditionValid","setConditionValid","selectedStyle","setStyle","handleColumnChange","value","newColumn","error","handleConditionChange","updatedConditionConfig","isValid","debug","handleStyleChange","updatedStyleConfig","columnInputOptions","map","title"],"mappings":"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","sourcesContent":["import React, { useCallback, useEffect, useState } from 'react';\nimport Log from '@deephaven/log';\nimport { ComboBox } from '@deephaven/components';\nimport {\n BaseFormatConfig,\n ChangeCallback,\n getDefaultConditionConfigForType,\n getConditionConfig,\n getDefaultStyleConfig,\n ModelColumn,\n} from './ConditionalFormattingUtils';\nimport ConditionEditor from './ConditionEditor';\nimport StyleEditor from './StyleEditor';\n\nconst log = Log.module('RowFormatEditor');\n\nexport interface RowFormatEditorProps {\n columns: ModelColumn[];\n config?: BaseFormatConfig;\n onChange?: ChangeCallback;\n}\n\nconst DEFAULT_CALLBACK = () => undefined;\n\nfunction makeDefaultConfig(columns: ModelColumn[]): BaseFormatConfig {\n const { type, name } = columns[0];\n const column = { type, name };\n const config = {\n column,\n style: getDefaultStyleConfig(),\n ...getDefaultConditionConfigForType(type),\n };\n return config;\n}\n\nconst RowFormatEditor = (props: RowFormatEditorProps): JSX.Element => {\n const {\n columns,\n config = makeDefaultConfig(columns),\n onChange = DEFAULT_CALLBACK,\n } = props;\n\n const [selectedColumn, setColumn] = useState(\n columns.find(\n c => c.name === config.column.name && c.type === config.column.type\n ) ?? columns[0]\n );\n const [conditionConfig, setConditionConfig] = useState(\n getConditionConfig(config)\n );\n const [conditionValid, setConditionValid] = useState(false);\n const [selectedStyle, setStyle] = useState(config.style);\n\n const handleColumnChange = useCallback(\n value => {\n const newColumn = columns.find(({ name }) => name === value);\n if (newColumn !== undefined) {\n setColumn(newColumn);\n if (selectedColumn.type !== newColumn.type) {\n setConditionConfig(getDefaultConditionConfigForType(newColumn.type));\n setConditionValid(false);\n }\n } else {\n log.error(`Column ${value} not found.`);\n }\n },\n [columns, selectedColumn]\n );\n\n const handleConditionChange = useCallback(\n (updatedConditionConfig, isValid) => {\n log.debug('handleConditionChange', updatedConditionConfig, isValid);\n setConditionConfig(updatedConditionConfig);\n setConditionValid(isValid);\n },\n []\n );\n\n const handleStyleChange = useCallback(updatedStyleConfig => {\n log.debug('handleStyleChange', updatedStyleConfig);\n setStyle(updatedStyleConfig);\n }, []);\n\n useEffect(() => {\n if (selectedColumn === undefined) {\n log.debug('Column is not selected, skip update.');\n return;\n }\n if (selectedStyle === undefined) {\n log.debug('Style is not selected, skip update.');\n return;\n }\n const { type, name } = selectedColumn;\n const column = { type, name };\n onChange(\n {\n column,\n style: selectedStyle,\n ...conditionConfig,\n },\n conditionValid\n );\n }, [\n onChange,\n selectedColumn,\n selectedStyle,\n conditionConfig,\n conditionValid,\n ]);\n\n const columnInputOptions = columns.map(({ name }) => ({\n title: name,\n value: name,\n }));\n\n return (\n <div className=\"conditional-rule-editor form\">\n <div className=\"mb-2\">\n <label className=\"mb-0\">Format Row If</label>\n <ComboBox\n defaultValue={selectedColumn?.name}\n options={columnInputOptions}\n inputPlaceholder=\"Select a column\"\n spellCheck={false}\n onChange={handleColumnChange}\n searchPlaceholder=\"Filter columns\"\n />\n </div>\n\n {selectedColumn !== undefined && (\n <>\n <ConditionEditor\n column={selectedColumn}\n config={conditionConfig}\n onChange={handleConditionChange}\n />\n <StyleEditor config={selectedStyle} onChange={handleStyleChange} />\n </>\n )}\n </div>\n );\n};\n\nexport default RowFormatEditor;\n"],"file":"RowFormatEditor.js"}
1
+ {"version":3,"sources":["../../../src/sidebar/conditional-formatting/RowFormatEditor.tsx"],"names":["React","useCallback","useEffect","useState","Log","ComboBox","getDefaultConditionConfigForType","getConditionConfig","getDefaultStyleConfig","ConditionEditor","StyleEditor","log","module","DEFAULT_CALLBACK","undefined","makeDefaultConfig","columns","type","name","column","config","style","RowFormatEditor","props","onChange","selectedColumn","setColumn","find","c","conditionConfig","setConditionConfig","conditionValid","setConditionValid","selectedStyle","setStyle","handleColumnChange","value","newColumn","error","handleConditionChange","updatedConditionConfig","isValid","debug","handleStyleChange","updatedStyleConfig","updateRowFormat","columnInputOptions","map","title"],"mappings":"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","sourcesContent":["import React, { useCallback, useEffect, useState } from 'react';\nimport Log from '@deephaven/log';\nimport { ComboBox } from '@deephaven/components';\nimport {\n BaseFormatConfig,\n ChangeCallback,\n getDefaultConditionConfigForType,\n getConditionConfig,\n getDefaultStyleConfig,\n ModelColumn,\n} from './ConditionalFormattingUtils';\nimport ConditionEditor from './ConditionEditor';\nimport StyleEditor from './StyleEditor';\n\nconst log = Log.module('RowFormatEditor');\n\nexport interface RowFormatEditorProps {\n columns: ModelColumn[];\n config?: BaseFormatConfig;\n onChange?: ChangeCallback;\n}\n\nconst DEFAULT_CALLBACK = () => undefined;\n\nfunction makeDefaultConfig(columns: ModelColumn[]): BaseFormatConfig {\n const { type, name } = columns[0];\n const column = { type, name };\n const config = {\n column,\n style: getDefaultStyleConfig(),\n ...getDefaultConditionConfigForType(type),\n };\n return config;\n}\n\nconst RowFormatEditor = (props: RowFormatEditorProps): JSX.Element => {\n const {\n columns,\n config = makeDefaultConfig(columns),\n onChange = DEFAULT_CALLBACK,\n } = props;\n\n const [selectedColumn, setColumn] = useState(\n columns.find(\n c => c.name === config.column.name && c.type === config.column.type\n ) ?? columns[0]\n );\n const [conditionConfig, setConditionConfig] = useState(\n getConditionConfig(config)\n );\n const [conditionValid, setConditionValid] = useState(false);\n const [selectedStyle, setStyle] = useState(config.style);\n\n const handleColumnChange = useCallback(\n value => {\n const newColumn = columns.find(({ name }) => name === value);\n if (newColumn !== undefined) {\n setColumn(newColumn);\n if (selectedColumn.type !== newColumn.type) {\n setConditionConfig(getDefaultConditionConfigForType(newColumn.type));\n setConditionValid(false);\n }\n } else {\n log.error(`Column ${value} not found.`);\n }\n },\n [columns, selectedColumn]\n );\n\n const handleConditionChange = useCallback(\n (updatedConditionConfig, isValid) => {\n log.debug('handleConditionChange', updatedConditionConfig, isValid);\n setConditionConfig(updatedConditionConfig);\n setConditionValid(isValid);\n },\n []\n );\n\n const handleStyleChange = useCallback(updatedStyleConfig => {\n log.debug('handleStyleChange', updatedStyleConfig);\n setStyle(updatedStyleConfig);\n }, []);\n\n useEffect(\n function updateRowFormat() {\n if (selectedColumn === undefined) {\n log.debug('Column is not selected, skip update.');\n return;\n }\n if (selectedStyle === undefined) {\n log.debug('Style is not selected, skip update.');\n return;\n }\n const { type, name } = selectedColumn;\n const column = { type, name };\n onChange(\n {\n column,\n style: selectedStyle,\n ...conditionConfig,\n },\n conditionValid\n );\n },\n [onChange, selectedColumn, selectedStyle, conditionConfig, conditionValid]\n );\n\n const columnInputOptions = columns.map(({ name }) => ({\n title: name,\n value: name,\n }));\n\n return (\n <div className=\"conditional-rule-editor form\">\n <div className=\"mb-2\">\n <label className=\"mb-0\">Format Row If</label>\n <ComboBox\n defaultValue={selectedColumn?.name}\n options={columnInputOptions}\n inputPlaceholder=\"Select a column\"\n spellCheck={false}\n onChange={handleColumnChange}\n searchPlaceholder=\"Filter columns\"\n />\n </div>\n\n {selectedColumn !== undefined && (\n <>\n <ConditionEditor\n column={selectedColumn}\n config={conditionConfig}\n onChange={handleConditionChange}\n />\n <StyleEditor config={selectedStyle} onChange={handleStyleChange} />\n </>\n )}\n </div>\n );\n};\n\nexport default RowFormatEditor;\n"],"file":"RowFormatEditor.js"}
@@ -1 +1 @@
1
- {"version":3,"file":"StyleEditor.d.ts","sourceRoot":"","sources":["../../../src/sidebar/conditional-formatting/StyleEditor.tsx"],"names":[],"mappings":";AAYA,OAAO,EAGL,iBAAiB,EAGlB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,oBAAoB,CAAC;AAY5B,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,iBAAiB,CAAC;IAC1B,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,iBAAiB,KAAK,IAAI,CAAC;CAChD;AAID,QAAA,MAAM,WAAW,UAAW,oBAAoB,KAAG,WAoJlD,CAAC;AAEF,eAAe,WAAW,CAAC"}
1
+ {"version":3,"file":"StyleEditor.d.ts","sourceRoot":"","sources":["../../../src/sidebar/conditional-formatting/StyleEditor.tsx"],"names":[],"mappings":";AAYA,OAAO,EAGL,iBAAiB,EAGlB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,oBAAoB,CAAC;AAY5B,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,iBAAiB,CAAC;IAC1B,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,iBAAiB,KAAK,IAAI,CAAC;CAChD;AAID,QAAA,MAAM,WAAW,UAAW,oBAAoB,KAAG,WAuJlD,CAAC;AAEF,eAAe,WAAW,CAAC"}
@@ -53,7 +53,7 @@ var StyleEditor = props => {
53
53
  }
54
54
  }
55
55
 
56
- useEffect(() => {
56
+ useEffect(function updateTheme() {
57
57
  onChange({
58
58
  type: styleType,
59
59
  customConfig: {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/sidebar/conditional-formatting/StyleEditor.tsx"],"names":["React","useCallback","useEffect","useMemo","useRef","useState","FontAwesomeIcon","Log","ColorUtils","dhSort","vsCheck","Button","DropdownMenu","FormatStyleType","getLabelForStyleType","getBackgroundForStyleConfig","getColorForStyleConfig","log","module","DEFAULT_BACKGROUND","DEFAULT_COLOR_LIGHT","DEFAULT_COLOR_DARK","DEFAULT_DROPDOWN_WIDTH","DEFAULT_CALLBACK","undefined","StyleEditor","props","config","onChange","styleType","setStyleType","type","background","setBackground","customConfig","isShown","setShown","dropdownWidth","setDropdownWidth","csContainer","handleBackgroundChange","e","value","target","debug","handleMenuClosed","handleToggleClick","updateDropdownWidth","styleOptions","NO_FORMATTING","POSITIVE","NEGATIVE","WARN","NEUTRAL","ACCENT_1","ACCENT_2","CUSTOM","current","getBoundingClientRect","width","color","isDark","renderOptions","matchFound","optionArray","index","option","key","push","length","renderMenuElement","menuElement","placement","maxWidth"],"mappings":"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","sourcesContent":["import React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport Log from '@deephaven/log';\nimport { ColorUtils } from '@deephaven/utils';\nimport { dhSort, vsCheck } from '@deephaven/icons';\nimport { Button, DropdownMenu } from '@deephaven/components';\nimport {\n FormatStyleType,\n getLabelForStyleType,\n FormatStyleConfig,\n getBackgroundForStyleConfig,\n getColorForStyleConfig,\n} from './ConditionalFormattingUtils';\n\nimport './StyleEditor.scss';\n\nconst log = Log.module('StyleEditor');\n\nconst DEFAULT_BACKGROUND = '#fcfcfa';\n\nconst DEFAULT_COLOR_LIGHT = '#f0f0ee';\n\nconst DEFAULT_COLOR_DARK = '#1a171a';\n\nconst DEFAULT_DROPDOWN_WIDTH = 200;\n\nexport interface ConditionEditorProps {\n config: FormatStyleConfig;\n onChange?: (config: FormatStyleConfig) => void;\n}\n\nconst DEFAULT_CALLBACK = () => undefined;\n\nconst StyleEditor = (props: ConditionEditorProps): JSX.Element => {\n const { config, onChange = DEFAULT_CALLBACK } = props;\n const [styleType, setStyleType] = useState(config.type);\n const [background, setBackground] = useState(\n config.customConfig?.background ?? DEFAULT_BACKGROUND\n );\n const [isShown, setShown] = useState(false);\n const [dropdownWidth, setDropdownWidth] = useState(DEFAULT_DROPDOWN_WIDTH);\n const csContainer = useRef<HTMLDivElement>(null);\n\n const handleBackgroundChange = useCallback(e => {\n const { value } = e.target;\n log.debug('handleBackgroundChange', value);\n setBackground(value);\n }, []);\n\n const handleMenuClosed = useCallback(() => {\n if (isShown) {\n setShown(false);\n }\n }, [isShown]);\n\n const handleToggleClick = useCallback(() => {\n if (!isShown) {\n updateDropdownWidth();\n }\n setShown(!isShown);\n }, [isShown]);\n\n const styleOptions = useMemo(\n () => [\n FormatStyleType.NO_FORMATTING,\n FormatStyleType.POSITIVE,\n FormatStyleType.NEGATIVE,\n FormatStyleType.WARN,\n FormatStyleType.NEUTRAL,\n FormatStyleType.ACCENT_1,\n FormatStyleType.ACCENT_2,\n FormatStyleType.CUSTOM,\n ],\n []\n );\n\n function updateDropdownWidth(): void {\n if (csContainer.current) {\n setDropdownWidth(csContainer.current.getBoundingClientRect().width);\n }\n }\n\n useEffect(() => {\n onChange({\n type: styleType,\n customConfig: {\n color: ColorUtils.isDark(background)\n ? DEFAULT_COLOR_LIGHT\n : DEFAULT_COLOR_DARK,\n background,\n },\n });\n }, [onChange, styleType, background]);\n\n const renderOptions = useCallback(() => {\n let matchFound = false;\n const optionArray: JSX.Element[] = [];\n for (let index = 0; index < styleOptions.length; index += 1) {\n const option = styleOptions[index];\n const key = `option-${index}-${option}`;\n matchFound = matchFound || option === styleType;\n optionArray.push(\n <Button\n key={key}\n kind=\"inline\"\n className=\"style-option-btn\"\n onClick={() => {\n setStyleType(option);\n setShown(false);\n }}\n style={{\n color: getColorForStyleConfig({ type: option }),\n background: getBackgroundForStyleConfig({ type: option }),\n }}\n >\n {option === styleType && (\n <FontAwesomeIcon icon={vsCheck} className=\"mr-2\" />\n )}\n {option !== styleType && <span className=\"mr-4\" />}\n {getLabelForStyleType(option)}\n </Button>\n );\n }\n return optionArray;\n }, [styleOptions, styleType]);\n\n const renderMenuElement = useCallback(\n () => (\n <div\n className=\"style-menu-container\"\n role=\"presentation\"\n style={{ width: dropdownWidth }}\n >\n <div className=\"style-options\">{renderOptions()}</div>\n </div>\n ),\n [dropdownWidth, renderOptions]\n );\n\n return (\n <div className=\"style-editor\">\n <div className=\"mb-2\" ref={csContainer}>\n <label className=\"mb-0\">Style</label>\n <Button\n kind=\"inline\"\n className=\"cs-dropdown\"\n style={{\n color: getColorForStyleConfig({ type: styleType }),\n background: getBackgroundForStyleConfig({ type: styleType }),\n }}\n onClick={handleToggleClick}\n >\n {getLabelForStyleType(styleType)}\n\n <span>\n <FontAwesomeIcon icon={dhSort} className=\"cs-caret\" />\n </span>\n <DropdownMenu\n isShown={isShown}\n actions={{ menuElement: renderMenuElement() }}\n popperOptions={{ placement: 'bottom-start' }}\n popperClassName=\"style-dropdown-menu\"\n onMenuClosed={handleMenuClosed}\n menuStyle={{ maxWidth: '100rem' }}\n />\n </Button>\n </div>\n\n {styleType === FormatStyleType.CUSTOM && (\n <div className=\"mb-2\">\n <label className=\"mb-0\">Background</label>\n <input\n type=\"color\"\n value={background}\n className=\"custom-select color-select\"\n onChange={handleBackgroundChange}\n />\n </div>\n )}\n </div>\n );\n};\n\nexport default StyleEditor;\n"],"file":"StyleEditor.js"}
1
+ {"version":3,"sources":["../../../src/sidebar/conditional-formatting/StyleEditor.tsx"],"names":["React","useCallback","useEffect","useMemo","useRef","useState","FontAwesomeIcon","Log","ColorUtils","dhSort","vsCheck","Button","DropdownMenu","FormatStyleType","getLabelForStyleType","getBackgroundForStyleConfig","getColorForStyleConfig","log","module","DEFAULT_BACKGROUND","DEFAULT_COLOR_LIGHT","DEFAULT_COLOR_DARK","DEFAULT_DROPDOWN_WIDTH","DEFAULT_CALLBACK","undefined","StyleEditor","props","config","onChange","styleType","setStyleType","type","background","setBackground","customConfig","isShown","setShown","dropdownWidth","setDropdownWidth","csContainer","handleBackgroundChange","e","value","target","debug","handleMenuClosed","handleToggleClick","updateDropdownWidth","styleOptions","NO_FORMATTING","POSITIVE","NEGATIVE","WARN","NEUTRAL","ACCENT_1","ACCENT_2","CUSTOM","current","getBoundingClientRect","width","updateTheme","color","isDark","renderOptions","matchFound","optionArray","index","option","key","push","length","renderMenuElement","menuElement","placement","maxWidth"],"mappings":"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","sourcesContent":["import React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport Log from '@deephaven/log';\nimport { ColorUtils } from '@deephaven/utils';\nimport { dhSort, vsCheck } from '@deephaven/icons';\nimport { Button, DropdownMenu } from '@deephaven/components';\nimport {\n FormatStyleType,\n getLabelForStyleType,\n FormatStyleConfig,\n getBackgroundForStyleConfig,\n getColorForStyleConfig,\n} from './ConditionalFormattingUtils';\n\nimport './StyleEditor.scss';\n\nconst log = Log.module('StyleEditor');\n\nconst DEFAULT_BACKGROUND = '#fcfcfa';\n\nconst DEFAULT_COLOR_LIGHT = '#f0f0ee';\n\nconst DEFAULT_COLOR_DARK = '#1a171a';\n\nconst DEFAULT_DROPDOWN_WIDTH = 200;\n\nexport interface ConditionEditorProps {\n config: FormatStyleConfig;\n onChange?: (config: FormatStyleConfig) => void;\n}\n\nconst DEFAULT_CALLBACK = () => undefined;\n\nconst StyleEditor = (props: ConditionEditorProps): JSX.Element => {\n const { config, onChange = DEFAULT_CALLBACK } = props;\n const [styleType, setStyleType] = useState(config.type);\n const [background, setBackground] = useState(\n config.customConfig?.background ?? DEFAULT_BACKGROUND\n );\n const [isShown, setShown] = useState(false);\n const [dropdownWidth, setDropdownWidth] = useState(DEFAULT_DROPDOWN_WIDTH);\n const csContainer = useRef<HTMLDivElement>(null);\n\n const handleBackgroundChange = useCallback(e => {\n const { value } = e.target;\n log.debug('handleBackgroundChange', value);\n setBackground(value);\n }, []);\n\n const handleMenuClosed = useCallback(() => {\n if (isShown) {\n setShown(false);\n }\n }, [isShown]);\n\n const handleToggleClick = useCallback(() => {\n if (!isShown) {\n updateDropdownWidth();\n }\n setShown(!isShown);\n }, [isShown]);\n\n const styleOptions = useMemo(\n () => [\n FormatStyleType.NO_FORMATTING,\n FormatStyleType.POSITIVE,\n FormatStyleType.NEGATIVE,\n FormatStyleType.WARN,\n FormatStyleType.NEUTRAL,\n FormatStyleType.ACCENT_1,\n FormatStyleType.ACCENT_2,\n FormatStyleType.CUSTOM,\n ],\n []\n );\n\n function updateDropdownWidth(): void {\n if (csContainer.current) {\n setDropdownWidth(csContainer.current.getBoundingClientRect().width);\n }\n }\n\n useEffect(\n function updateTheme() {\n onChange({\n type: styleType,\n customConfig: {\n color: ColorUtils.isDark(background)\n ? DEFAULT_COLOR_LIGHT\n : DEFAULT_COLOR_DARK,\n background,\n },\n });\n },\n [onChange, styleType, background]\n );\n\n const renderOptions = useCallback(() => {\n let matchFound = false;\n const optionArray: JSX.Element[] = [];\n for (let index = 0; index < styleOptions.length; index += 1) {\n const option = styleOptions[index];\n const key = `option-${index}-${option}`;\n matchFound = matchFound || option === styleType;\n optionArray.push(\n <Button\n key={key}\n kind=\"inline\"\n className=\"style-option-btn\"\n onClick={() => {\n setStyleType(option);\n setShown(false);\n }}\n style={{\n color: getColorForStyleConfig({ type: option }),\n background: getBackgroundForStyleConfig({ type: option }),\n }}\n >\n {option === styleType && (\n <FontAwesomeIcon icon={vsCheck} className=\"mr-2\" />\n )}\n {option !== styleType && <span className=\"mr-4\" />}\n {getLabelForStyleType(option)}\n </Button>\n );\n }\n return optionArray;\n }, [styleOptions, styleType]);\n\n const renderMenuElement = useCallback(\n () => (\n <div\n className=\"style-menu-container\"\n role=\"presentation\"\n style={{ width: dropdownWidth }}\n >\n <div className=\"style-options\">{renderOptions()}</div>\n </div>\n ),\n [dropdownWidth, renderOptions]\n );\n\n return (\n <div className=\"style-editor\">\n <div className=\"mb-2\" ref={csContainer}>\n <label className=\"mb-0\">Style</label>\n <Button\n kind=\"inline\"\n className=\"cs-dropdown\"\n style={{\n color: getColorForStyleConfig({ type: styleType }),\n background: getBackgroundForStyleConfig({ type: styleType }),\n }}\n onClick={handleToggleClick}\n >\n {getLabelForStyleType(styleType)}\n\n <span>\n <FontAwesomeIcon icon={dhSort} className=\"cs-caret\" />\n </span>\n <DropdownMenu\n isShown={isShown}\n actions={{ menuElement: renderMenuElement() }}\n popperOptions={{ placement: 'bottom-start' }}\n popperClassName=\"style-dropdown-menu\"\n onMenuClosed={handleMenuClosed}\n menuStyle={{ maxWidth: '100rem' }}\n />\n </Button>\n </div>\n\n {styleType === FormatStyleType.CUSTOM && (\n <div className=\"mb-2\">\n <label className=\"mb-0\">Background</label>\n <input\n type=\"color\"\n value={background}\n className=\"custom-select color-select\"\n onChange={handleBackgroundChange}\n />\n </div>\n )}\n </div>\n );\n};\n\nexport default StyleEditor;\n"],"file":"StyleEditor.js"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@deephaven/iris-grid",
3
- "version": "0.11.9-beta.0+34ddf36",
3
+ "version": "0.11.10-beta.1+981349f",
4
4
  "description": "Deephaven Iris Grid",
5
5
  "author": "Deephaven Data Labs LLC",
6
6
  "license": "Apache-2.0",
@@ -30,13 +30,13 @@
30
30
  "start": "cross-env NODE_ENV=development npm run watch"
31
31
  },
32
32
  "dependencies": {
33
- "@deephaven/console": "^0.11.9-beta.0+34ddf36",
34
- "@deephaven/grid": "^0.11.9-beta.0+34ddf36",
35
- "@deephaven/icons": "^0.11.9-beta.0+34ddf36",
36
- "@deephaven/jsapi-shim": "^0.11.9-beta.0+34ddf36",
37
- "@deephaven/react-hooks": "^0.11.9-beta.0+34ddf36",
38
- "@deephaven/storage": "^0.11.9-beta.0+34ddf36",
39
- "@deephaven/utils": "^0.11.9-beta.0+34ddf36",
33
+ "@deephaven/console": "^0.11.10-beta.1+981349f",
34
+ "@deephaven/grid": "^0.11.10-beta.1+981349f",
35
+ "@deephaven/icons": "^0.11.10-beta.1+981349f",
36
+ "@deephaven/jsapi-shim": "^0.11.10-beta.1+981349f",
37
+ "@deephaven/react-hooks": "^0.11.10-beta.1+981349f",
38
+ "@deephaven/storage": "^0.11.10-beta.1+981349f",
39
+ "@deephaven/utils": "^0.11.10-beta.1+981349f",
40
40
  "@fortawesome/react-fontawesome": "^0.1.15",
41
41
  "classnames": "^2.3.1",
42
42
  "deep-equal": "^2.0.5",
@@ -59,9 +59,9 @@
59
59
  "react": "^17.x"
60
60
  },
61
61
  "devDependencies": {
62
- "@deephaven/log": "^0.11.9-beta.0+34ddf36",
63
- "@deephaven/mocks": "^0.11.9-beta.0+34ddf36",
64
- "@deephaven/tsconfig": "^0.11.9-beta.0+34ddf36"
62
+ "@deephaven/log": "^0.11.10-beta.1+981349f",
63
+ "@deephaven/mocks": "^0.11.10-beta.1+981349f",
64
+ "@deephaven/tsconfig": "^0.11.10-beta.1+981349f"
65
65
  },
66
66
  "files": [
67
67
  "dist"
@@ -72,5 +72,5 @@
72
72
  "publishConfig": {
73
73
  "access": "public"
74
74
  },
75
- "gitHead": "34ddf36a257f99891c1387f8dfd1ed9aac95faee"
75
+ "gitHead": "981349fbbde1dcacd9a5f4ac1386d08c2c3da371"
76
76
  }