@deephaven/components 0.73.0 → 0.74.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -88,7 +88,7 @@ class HierarchicalCheckboxMenu extends Component {
88
88
  if (children instanceof Map) {
89
89
  var newChildren = new Map(children);
90
90
  if (child != null) {
91
- newChildren.set(child, children.get(child) === undefined);
91
+ newChildren.set(child, children.get(child) !== true);
92
92
  } else {
93
93
  var parentSelected = HierarchicalCheckboxMenu.isParentSelected(parent, map);
94
94
  var newChildValue = parentSelected == null || !parentSelected;
@@ -1 +1 @@
1
- {"version":3,"file":"HierarchicalCheckboxMenu.js","names":["React","Component","FontAwesomeIcon","classNames","Checkbox","Popper","Button","jsx","_jsx","jsxs","_jsxs","HierarchicalCheckboxMenu","isParentSelected","parent","valueMap","children","get","undefined","includesTrue","Array","from","values","includes","includesFalse","constructor","props","toggleMenu","bind","toggleValueFor","selectAll","clear","state","menuIsOpen","event","stopPropagation","preventDefault","setState","child","onUpdateValueMap","map","Map","newChildren","set","parentSelected","newChildValue","forEach","_","key","currentChildren","setAllValues","value","copy","renderMenuElement","dataTestId","className","entries","_ref","checked","onChange","_ref2","kind","onClick","concat","render","menuText","icon","id","type","options","placement","isShown","onExited","closeOnBlur","interactive","_defineProperty"],"sources":["../src/HierarchicalCheckboxMenu.tsx"],"sourcesContent":["import React, { Component } from 'react';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { IconDefinition } from '@deephaven/icons';\nimport classNames from 'classnames';\nimport Checkbox from './Checkbox';\nimport Popper from './popper/Popper';\nimport './HierarchicalCheckboxMenu.scss';\nimport Button from './Button';\n\nexport type HierarchicalCheckboxValueMap = Map<\n string,\n boolean | Map<string, boolean>\n>;\n\ntype HierarchicalCheckboxMenuProps = {\n className: string;\n menuText: string;\n valueMap: HierarchicalCheckboxValueMap;\n onUpdateValueMap: (map: HierarchicalCheckboxValueMap) => void;\n icon: IconDefinition | null;\n id: string;\n 'data-testid'?: string;\n};\n\ntype HierarchicalCheckboxMenuState = {\n menuIsOpen: boolean;\n};\n\n/**\n * A pull down menu that displays a hierarchy of checkboxes.\n *\n * Currently supports only two levels of check boxes. The input should be a Map\n * where the keys are the parent names. The values can a boolean if the parent\n * has no children or another Map where keys are child names and values are booleans.\n *\n * Here is an example:\n * const INITIAL_TYPE_MAP = new Map([\n * ['Queries', new Map([['Live', true], ['Batch', true]])],\n * [\n * 'DBA Queries',\n * new Map([\n * ['Data Merge', true],\n * ['Data Validation', true],\n * ['Imports', true],\n * ['Data Services', true],\n * ]),\n * ],\n * ['Helper Queries', true],\n * ]);\n *\n * When a checkbox is changed, this component will make a deep copy of the Map\n * with the appropriate booleans changed. It will then call onUpdateValueMap\n * with the new Map.\n */\nclass HierarchicalCheckboxMenu extends Component<\n HierarchicalCheckboxMenuProps,\n HierarchicalCheckboxMenuState\n> {\n static defaultProps: Partial<HierarchicalCheckboxMenuProps> = {\n className: '',\n icon: null,\n id: '',\n 'data-testid': undefined,\n };\n\n static isParentSelected(\n parent: string,\n valueMap: HierarchicalCheckboxValueMap\n ): boolean | null {\n const children = valueMap.get(parent);\n if (children === undefined) {\n return false;\n }\n if (typeof children === 'boolean') {\n // This parent has no children\n return children;\n }\n const includesTrue = Array.from(children.values()).includes(true);\n const includesFalse = Array.from(children.values()).includes(false);\n if (includesTrue && includesFalse) {\n // Indeterminate\n return null;\n }\n return includesTrue;\n }\n\n constructor(props: HierarchicalCheckboxMenuProps) {\n super(props);\n\n this.toggleMenu = this.toggleMenu.bind(this);\n this.toggleValueFor = this.toggleValueFor.bind(this);\n this.selectAll = this.selectAll.bind(this);\n this.clear = this.clear.bind(this);\n\n this.state = {\n menuIsOpen: false,\n };\n }\n\n toggleMenu(event: React.MouseEvent<HTMLButtonElement>): void {\n event.stopPropagation();\n event.preventDefault();\n this.setState(state => {\n const { menuIsOpen } = state;\n return { menuIsOpen: !menuIsOpen };\n });\n }\n\n toggleValueFor(parent: string, child?: string): void {\n const { valueMap, onUpdateValueMap } = this.props;\n\n // Make a deep copy of the Map and toggle the boolean for parent / child\n const map = new Map(valueMap);\n const children = map.get(parent);\n if (children instanceof Map) {\n const newChildren = new Map(children);\n if (child != null) {\n newChildren.set(child, children.get(child) === undefined);\n } else {\n const parentSelected = HierarchicalCheckboxMenu.isParentSelected(\n parent,\n map\n );\n const newChildValue = parentSelected == null || !parentSelected;\n children.forEach((_, key) => newChildren.set(key, newChildValue));\n }\n map.set(parent, newChildren);\n } else {\n map.set(parent, children == null || !children);\n }\n\n // The parent was clicked so all children must be toggled\n const currentChildren = map.get(parent);\n if (\n child === undefined &&\n currentChildren !== undefined &&\n typeof currentChildren !== 'boolean'\n ) {\n const parentSelected = HierarchicalCheckboxMenu.isParentSelected(\n parent,\n valueMap\n );\n if (parentSelected != null && parentSelected) {\n currentChildren.forEach((_, key) => currentChildren.set(key, false));\n } else {\n // for parent selection of false or null (indeterminate), select everything\n currentChildren.forEach((_, key) => currentChildren.set(key, true));\n }\n }\n\n onUpdateValueMap(map);\n }\n\n setAllValues(value: boolean): void {\n const { valueMap, onUpdateValueMap } = this.props;\n\n // Make a deep copy of the Map and set everything\n const copy = new Map();\n valueMap.forEach((child, parent) => {\n if (typeof child === 'boolean') {\n copy.set(parent, value);\n } else {\n const children = new Map();\n child.forEach((_, key) => children.set(key, value));\n copy.set(parent, children);\n }\n });\n\n onUpdateValueMap(copy);\n }\n\n selectAll(): void {\n this.setAllValues(true);\n }\n\n clear(): void {\n this.setAllValues(false);\n }\n\n renderMenuElement(): React.ReactNode {\n const { valueMap, 'data-testid': dataTestId } = this.props;\n return (\n <div className=\"hcm-menu-container\">\n {Array.from(valueMap.entries()).map(([parent, children]) => (\n <div key={parent}>\n <Checkbox\n className=\"hcm-parent\"\n checked={HierarchicalCheckboxMenu.isParentSelected(\n parent,\n valueMap\n )}\n onChange={() => this.toggleValueFor(parent)}\n >\n {parent}\n </Checkbox>\n {children !== undefined &&\n typeof children !== 'boolean' &&\n Array.from(children.entries()).map(([child, value]) => (\n <Checkbox\n className=\"hcm-child\"\n key={child}\n checked={value}\n onChange={() => this.toggleValueFor(parent, child)}\n >\n {child}\n </Checkbox>\n ))}\n </div>\n ))}\n <Button\n kind=\"ghost\"\n onClick={this.selectAll}\n data-testid={\n dataTestId !== undefined\n ? `${dataTestId}-btn-select-all`\n : undefined\n }\n >\n Select All\n </Button>\n <Button\n kind=\"ghost\"\n onClick={this.clear}\n data-testid={\n dataTestId !== undefined ? `${dataTestId}-btn-clear` : undefined\n }\n >\n Clear\n </Button>\n </div>\n );\n }\n\n render(): JSX.Element {\n const {\n menuText,\n className,\n icon,\n id,\n 'data-testid': dataTestId,\n } = this.props;\n const { menuIsOpen } = this.state;\n\n return (\n <button\n type=\"button\"\n className={classNames('btn hcm-btn', className)}\n onClick={this.toggleMenu}\n id={id}\n data-testid={dataTestId}\n >\n <span>\n {icon && <FontAwesomeIcon icon={icon} className=\"hcm-icon mr-1\" />}\n {menuText}\n </span>\n <span className=\"cs-caret\" />\n <Popper\n options={{ placement: 'bottom' }}\n isShown={menuIsOpen}\n onExited={() => {\n this.setState({ menuIsOpen: false });\n }}\n closeOnBlur\n interactive\n >\n {this.renderMenuElement()}\n </Popper>\n </button>\n );\n }\n}\n\nexport default HierarchicalCheckboxMenu;\n"],"mappings":";;;AAAA,OAAOA,KAAK,IAAIC,SAAS,QAAQ,OAAO;AACxC,SAASC,eAAe,QAAQ,gCAAgC;AAEhE,OAAOC,UAAU,MAAM,YAAY;AAAC,OAC7BC,QAAQ;AAAA,OACRC,MAAM;AAAA;AAAA,OAENC,MAAM;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAAA,SAAAC,IAAA,IAAAC,KAAA;AAqBb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMC,wBAAwB,SAASV,SAAS,CAG9C;EAQA,OAAOW,gBAAgBA,CACrBC,MAAc,EACdC,QAAsC,EACtB;IAChB,IAAMC,QAAQ,GAAGD,QAAQ,CAACE,GAAG,CAACH,MAAM,CAAC;IACrC,IAAIE,QAAQ,KAAKE,SAAS,EAAE;MAC1B,OAAO,KAAK;IACd;IACA,IAAI,OAAOF,QAAQ,KAAK,SAAS,EAAE;MACjC;MACA,OAAOA,QAAQ;IACjB;IACA,IAAMG,YAAY,GAAGC,KAAK,CAACC,IAAI,CAACL,QAAQ,CAACM,MAAM,CAAC,CAAC,CAAC,CAACC,QAAQ,CAAC,IAAI,CAAC;IACjE,IAAMC,aAAa,GAAGJ,KAAK,CAACC,IAAI,CAACL,QAAQ,CAACM,MAAM,CAAC,CAAC,CAAC,CAACC,QAAQ,CAAC,KAAK,CAAC;IACnE,IAAIJ,YAAY,IAAIK,aAAa,EAAE;MACjC;MACA,OAAO,IAAI;IACb;IACA,OAAOL,YAAY;EACrB;EAEAM,WAAWA,CAACC,KAAoC,EAAE;IAChD,KAAK,CAACA,KAAK,CAAC;IAEZ,IAAI,CAACC,UAAU,GAAG,IAAI,CAACA,UAAU,CAACC,IAAI,CAAC,IAAI,CAAC;IAC5C,IAAI,CAACC,cAAc,GAAG,IAAI,CAACA,cAAc,CAACD,IAAI,CAAC,IAAI,CAAC;IACpD,IAAI,CAACE,SAAS,GAAG,IAAI,CAACA,SAAS,CAACF,IAAI,CAAC,IAAI,CAAC;IAC1C,IAAI,CAACG,KAAK,GAAG,IAAI,CAACA,KAAK,CAACH,IAAI,CAAC,IAAI,CAAC;IAElC,IAAI,CAACI,KAAK,GAAG;MACXC,UAAU,EAAE;IACd,CAAC;EACH;EAEAN,UAAUA,CAACO,KAA0C,EAAQ;IAC3DA,KAAK,CAACC,eAAe,CAAC,CAAC;IACvBD,KAAK,CAACE,cAAc,CAAC,CAAC;IACtB,IAAI,CAACC,QAAQ,CAACL,KAAK,IAAI;MACrB,IAAM;QAAEC;MAAW,CAAC,GAAGD,KAAK;MAC5B,OAAO;QAAEC,UAAU,EAAE,CAACA;MAAW,CAAC;IACpC,CAAC,CAAC;EACJ;EAEAJ,cAAcA,CAACf,MAAc,EAAEwB,KAAc,EAAQ;IACnD,IAAM;MAAEvB,QAAQ;MAAEwB;IAAiB,CAAC,GAAG,IAAI,CAACb,KAAK;;IAEjD;IACA,IAAMc,GAAG,GAAG,IAAIC,GAAG,CAAC1B,QAAQ,CAAC;IAC7B,IAAMC,QAAQ,GAAGwB,GAAG,CAACvB,GAAG,CAACH,MAAM,CAAC;IAChC,IAAIE,QAAQ,YAAYyB,GAAG,EAAE;MAC3B,IAAMC,WAAW,GAAG,IAAID,GAAG,CAACzB,QAAQ,CAAC;MACrC,IAAIsB,KAAK,IAAI,IAAI,EAAE;QACjBI,WAAW,CAACC,GAAG,CAACL,KAAK,EAAEtB,QAAQ,CAACC,GAAG,CAACqB,KAAK,CAAC,KAAKpB,SAAS,CAAC;MAC3D,CAAC,MAAM;QACL,IAAM0B,cAAc,GAAGhC,wBAAwB,CAACC,gBAAgB,CAC9DC,MAAM,EACN0B,GACF,CAAC;QACD,IAAMK,aAAa,GAAGD,cAAc,IAAI,IAAI,IAAI,CAACA,cAAc;QAC/D5B,QAAQ,CAAC8B,OAAO,CAAC,CAACC,CAAC,EAAEC,GAAG,KAAKN,WAAW,CAACC,GAAG,CAACK,GAAG,EAAEH,aAAa,CAAC,CAAC;MACnE;MACAL,GAAG,CAACG,GAAG,CAAC7B,MAAM,EAAE4B,WAAW,CAAC;IAC9B,CAAC,MAAM;MACLF,GAAG,CAACG,GAAG,CAAC7B,MAAM,EAAEE,QAAQ,IAAI,IAAI,IAAI,CAACA,QAAQ,CAAC;IAChD;;IAEA;IACA,IAAMiC,eAAe,GAAGT,GAAG,CAACvB,GAAG,CAACH,MAAM,CAAC;IACvC,IACEwB,KAAK,KAAKpB,SAAS,IACnB+B,eAAe,KAAK/B,SAAS,IAC7B,OAAO+B,eAAe,KAAK,SAAS,EACpC;MACA,IAAML,eAAc,GAAGhC,wBAAwB,CAACC,gBAAgB,CAC9DC,MAAM,EACNC,QACF,CAAC;MACD,IAAI6B,eAAc,IAAI,IAAI,IAAIA,eAAc,EAAE;QAC5CK,eAAe,CAACH,OAAO,CAAC,CAACC,CAAC,EAAEC,GAAG,KAAKC,eAAe,CAACN,GAAG,CAACK,GAAG,EAAE,KAAK,CAAC,CAAC;MACtE,CAAC,MAAM;QACL;QACAC,eAAe,CAACH,OAAO,CAAC,CAACC,CAAC,EAAEC,GAAG,KAAKC,eAAe,CAACN,GAAG,CAACK,GAAG,EAAE,IAAI,CAAC,CAAC;MACrE;IACF;IAEAT,gBAAgB,CAACC,GAAG,CAAC;EACvB;EAEAU,YAAYA,CAACC,KAAc,EAAQ;IACjC,IAAM;MAAEpC,QAAQ;MAAEwB;IAAiB,CAAC,GAAG,IAAI,CAACb,KAAK;;IAEjD;IACA,IAAM0B,IAAI,GAAG,IAAIX,GAAG,CAAC,CAAC;IACtB1B,QAAQ,CAAC+B,OAAO,CAAC,CAACR,KAAK,EAAExB,MAAM,KAAK;MAClC,IAAI,OAAOwB,KAAK,KAAK,SAAS,EAAE;QAC9Bc,IAAI,CAACT,GAAG,CAAC7B,MAAM,EAAEqC,KAAK,CAAC;MACzB,CAAC,MAAM;QACL,IAAMnC,QAAQ,GAAG,IAAIyB,GAAG,CAAC,CAAC;QAC1BH,KAAK,CAACQ,OAAO,CAAC,CAACC,CAAC,EAAEC,GAAG,KAAKhC,QAAQ,CAAC2B,GAAG,CAACK,GAAG,EAAEG,KAAK,CAAC,CAAC;QACnDC,IAAI,CAACT,GAAG,CAAC7B,MAAM,EAAEE,QAAQ,CAAC;MAC5B;IACF,CAAC,CAAC;IAEFuB,gBAAgB,CAACa,IAAI,CAAC;EACxB;EAEAtB,SAASA,CAAA,EAAS;IAChB,IAAI,CAACoB,YAAY,CAAC,IAAI,CAAC;EACzB;EAEAnB,KAAKA,CAAA,EAAS;IACZ,IAAI,CAACmB,YAAY,CAAC,KAAK,CAAC;EAC1B;EAEAG,iBAAiBA,CAAA,EAAoB;IACnC,IAAM;MAAEtC,QAAQ;MAAE,aAAa,EAAEuC;IAAW,CAAC,GAAG,IAAI,CAAC5B,KAAK;IAC1D,oBACEf,KAAA;MAAK4C,SAAS,EAAC,oBAAoB;MAAAvC,QAAA,GAChCI,KAAK,CAACC,IAAI,CAACN,QAAQ,CAACyC,OAAO,CAAC,CAAC,CAAC,CAAChB,GAAG,CAACiB,IAAA;QAAA,IAAC,CAAC3C,MAAM,EAAEE,QAAQ,CAAC,GAAAyC,IAAA;QAAA,oBACrD9C,KAAA;UAAAK,QAAA,gBACEP,IAAA,CAACJ,QAAQ;YACPkD,SAAS,EAAC,YAAY;YACtBG,OAAO,EAAE9C,wBAAwB,CAACC,gBAAgB,CAChDC,MAAM,EACNC,QACF,CAAE;YACF4C,QAAQ,EAAEA,CAAA,KAAM,IAAI,CAAC9B,cAAc,CAACf,MAAM,CAAE;YAAAE,QAAA,EAE3CF;UAAM,CACC,CAAC,EACVE,QAAQ,KAAKE,SAAS,IACrB,OAAOF,QAAQ,KAAK,SAAS,IAC7BI,KAAK,CAACC,IAAI,CAACL,QAAQ,CAACwC,OAAO,CAAC,CAAC,CAAC,CAAChB,GAAG,CAACoB,KAAA;YAAA,IAAC,CAACtB,KAAK,EAAEa,KAAK,CAAC,GAAAS,KAAA;YAAA,oBAChDnD,IAAA,CAACJ,QAAQ;cACPkD,SAAS,EAAC,WAAW;cAErBG,OAAO,EAAEP,KAAM;cACfQ,QAAQ,EAAEA,CAAA,KAAM,IAAI,CAAC9B,cAAc,CAACf,MAAM,EAAEwB,KAAK,CAAE;cAAAtB,QAAA,EAElDsB;YAAK,GAJDA,KAKG,CAAC;UAAA,CACZ,CAAC;QAAA,GAtBIxB,MAuBL,CAAC;MAAA,CACP,CAAC,eACFL,IAAA,CAACF,MAAM;QACLsD,IAAI,EAAC,OAAO;QACZC,OAAO,EAAE,IAAI,CAAChC,SAAU;QACxB,eACEwB,UAAU,KAAKpC,SAAS,MAAA6C,MAAA,CACjBT,UAAU,uBACbpC,SACL;QAAAF,QAAA,EACF;MAED,CAAQ,CAAC,eACTP,IAAA,CAACF,MAAM;QACLsD,IAAI,EAAC,OAAO;QACZC,OAAO,EAAE,IAAI,CAAC/B,KAAM;QACpB,eACEuB,UAAU,KAAKpC,SAAS,MAAA6C,MAAA,CAAMT,UAAU,kBAAepC,SACxD;QAAAF,QAAA,EACF;MAED,CAAQ,CAAC;IAAA,CACN,CAAC;EAEV;EAEAgD,MAAMA,CAAA,EAAgB;IACpB,IAAM;MACJC,QAAQ;MACRV,SAAS;MACTW,IAAI;MACJC,EAAE;MACF,aAAa,EAAEb;IACjB,CAAC,GAAG,IAAI,CAAC5B,KAAK;IACd,IAAM;MAAEO;IAAW,CAAC,GAAG,IAAI,CAACD,KAAK;IAEjC,oBACErB,KAAA;MACEyD,IAAI,EAAC,QAAQ;MACbb,SAAS,EAAEnD,UAAU,CAAC,aAAa,EAAEmD,SAAS,CAAE;MAChDO,OAAO,EAAE,IAAI,CAACnC,UAAW;MACzBwC,EAAE,EAAEA,EAAG;MACP,eAAab,UAAW;MAAAtC,QAAA,gBAExBL,KAAA;QAAAK,QAAA,GACGkD,IAAI,iBAAIzD,IAAA,CAACN,eAAe;UAAC+D,IAAI,EAAEA,IAAK;UAACX,SAAS,EAAC;QAAe,CAAE,CAAC,EACjEU,QAAQ;MAAA,CACL,CAAC,eACPxD,IAAA;QAAM8C,SAAS,EAAC;MAAU,CAAE,CAAC,eAC7B9C,IAAA,CAACH,MAAM;QACL+D,OAAO,EAAE;UAAEC,SAAS,EAAE;QAAS,CAAE;QACjCC,OAAO,EAAEtC,UAAW;QACpBuC,QAAQ,EAAEA,CAAA,KAAM;UACd,IAAI,CAACnC,QAAQ,CAAC;YAAEJ,UAAU,EAAE;UAAM,CAAC,CAAC;QACtC,CAAE;QACFwC,WAAW;QACXC,WAAW;QAAA1D,QAAA,EAEV,IAAI,CAACqC,iBAAiB,CAAC;MAAC,CACnB,CAAC;IAAA,CACH,CAAC;EAEb;AACF;AAACsB,eAAA,CAxNK/D,wBAAwB,kBAIkC;EAC5D2C,SAAS,EAAE,EAAE;EACbW,IAAI,EAAE,IAAI;EACVC,EAAE,EAAE,EAAE;EACN,aAAa,EAAEjD;AACjB,CAAC;AAiNH,eAAeN,wBAAwB"}
1
+ {"version":3,"file":"HierarchicalCheckboxMenu.js","names":["React","Component","FontAwesomeIcon","classNames","Checkbox","Popper","Button","jsx","_jsx","jsxs","_jsxs","HierarchicalCheckboxMenu","isParentSelected","parent","valueMap","children","get","undefined","includesTrue","Array","from","values","includes","includesFalse","constructor","props","toggleMenu","bind","toggleValueFor","selectAll","clear","state","menuIsOpen","event","stopPropagation","preventDefault","setState","child","onUpdateValueMap","map","Map","newChildren","set","parentSelected","newChildValue","forEach","_","key","currentChildren","setAllValues","value","copy","renderMenuElement","dataTestId","className","entries","_ref","checked","onChange","_ref2","kind","onClick","concat","render","menuText","icon","id","type","options","placement","isShown","onExited","closeOnBlur","interactive","_defineProperty"],"sources":["../src/HierarchicalCheckboxMenu.tsx"],"sourcesContent":["import React, { Component } from 'react';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { IconDefinition } from '@deephaven/icons';\nimport classNames from 'classnames';\nimport Checkbox from './Checkbox';\nimport Popper from './popper/Popper';\nimport './HierarchicalCheckboxMenu.scss';\nimport Button from './Button';\n\nexport type HierarchicalCheckboxValueMap = Map<\n string,\n boolean | Map<string, boolean>\n>;\n\ntype HierarchicalCheckboxMenuProps = {\n className: string;\n menuText: string;\n valueMap: HierarchicalCheckboxValueMap;\n onUpdateValueMap: (map: HierarchicalCheckboxValueMap) => void;\n icon: IconDefinition | null;\n id: string;\n 'data-testid'?: string;\n};\n\ntype HierarchicalCheckboxMenuState = {\n menuIsOpen: boolean;\n};\n\n/**\n * A pull down menu that displays a hierarchy of checkboxes.\n *\n * Currently supports only two levels of check boxes. The input should be a Map\n * where the keys are the parent names. The values can a boolean if the parent\n * has no children or another Map where keys are child names and values are booleans.\n *\n * Here is an example:\n * const INITIAL_TYPE_MAP = new Map([\n * ['Queries', new Map([['Live', true], ['Batch', true]])],\n * [\n * 'DBA Queries',\n * new Map([\n * ['Data Merge', true],\n * ['Data Validation', true],\n * ['Imports', true],\n * ['Data Services', true],\n * ]),\n * ],\n * ['Helper Queries', true],\n * ]);\n *\n * When a checkbox is changed, this component will make a deep copy of the Map\n * with the appropriate booleans changed. It will then call onUpdateValueMap\n * with the new Map.\n */\nclass HierarchicalCheckboxMenu extends Component<\n HierarchicalCheckboxMenuProps,\n HierarchicalCheckboxMenuState\n> {\n static defaultProps: Partial<HierarchicalCheckboxMenuProps> = {\n className: '',\n icon: null,\n id: '',\n 'data-testid': undefined,\n };\n\n static isParentSelected(\n parent: string,\n valueMap: HierarchicalCheckboxValueMap\n ): boolean | null {\n const children = valueMap.get(parent);\n if (children === undefined) {\n return false;\n }\n if (typeof children === 'boolean') {\n // This parent has no children\n return children;\n }\n const includesTrue = Array.from(children.values()).includes(true);\n const includesFalse = Array.from(children.values()).includes(false);\n if (includesTrue && includesFalse) {\n // Indeterminate\n return null;\n }\n return includesTrue;\n }\n\n constructor(props: HierarchicalCheckboxMenuProps) {\n super(props);\n\n this.toggleMenu = this.toggleMenu.bind(this);\n this.toggleValueFor = this.toggleValueFor.bind(this);\n this.selectAll = this.selectAll.bind(this);\n this.clear = this.clear.bind(this);\n\n this.state = {\n menuIsOpen: false,\n };\n }\n\n toggleMenu(event: React.MouseEvent<HTMLButtonElement>): void {\n event.stopPropagation();\n event.preventDefault();\n this.setState(state => {\n const { menuIsOpen } = state;\n return { menuIsOpen: !menuIsOpen };\n });\n }\n\n toggleValueFor(parent: string, child?: string): void {\n const { valueMap, onUpdateValueMap } = this.props;\n\n // Make a deep copy of the Map and toggle the boolean for parent / child\n const map = new Map(valueMap);\n const children = map.get(parent);\n if (children instanceof Map) {\n const newChildren = new Map(children);\n if (child != null) {\n newChildren.set(child, children.get(child) !== true);\n } else {\n const parentSelected = HierarchicalCheckboxMenu.isParentSelected(\n parent,\n map\n );\n const newChildValue = parentSelected == null || !parentSelected;\n children.forEach((_, key) => newChildren.set(key, newChildValue));\n }\n map.set(parent, newChildren);\n } else {\n map.set(parent, children == null || !children);\n }\n\n // The parent was clicked so all children must be toggled\n const currentChildren = map.get(parent);\n if (\n child === undefined &&\n currentChildren !== undefined &&\n typeof currentChildren !== 'boolean'\n ) {\n const parentSelected = HierarchicalCheckboxMenu.isParentSelected(\n parent,\n valueMap\n );\n if (parentSelected != null && parentSelected) {\n currentChildren.forEach((_, key) => currentChildren.set(key, false));\n } else {\n // for parent selection of false or null (indeterminate), select everything\n currentChildren.forEach((_, key) => currentChildren.set(key, true));\n }\n }\n\n onUpdateValueMap(map);\n }\n\n setAllValues(value: boolean): void {\n const { valueMap, onUpdateValueMap } = this.props;\n\n // Make a deep copy of the Map and set everything\n const copy = new Map();\n valueMap.forEach((child, parent) => {\n if (typeof child === 'boolean') {\n copy.set(parent, value);\n } else {\n const children = new Map();\n child.forEach((_, key) => children.set(key, value));\n copy.set(parent, children);\n }\n });\n\n onUpdateValueMap(copy);\n }\n\n selectAll(): void {\n this.setAllValues(true);\n }\n\n clear(): void {\n this.setAllValues(false);\n }\n\n renderMenuElement(): React.ReactNode {\n const { valueMap, 'data-testid': dataTestId } = this.props;\n return (\n <div className=\"hcm-menu-container\">\n {Array.from(valueMap.entries()).map(([parent, children]) => (\n <div key={parent}>\n <Checkbox\n className=\"hcm-parent\"\n checked={HierarchicalCheckboxMenu.isParentSelected(\n parent,\n valueMap\n )}\n onChange={() => this.toggleValueFor(parent)}\n >\n {parent}\n </Checkbox>\n {children !== undefined &&\n typeof children !== 'boolean' &&\n Array.from(children.entries()).map(([child, value]) => (\n <Checkbox\n className=\"hcm-child\"\n key={child}\n checked={value}\n onChange={() => this.toggleValueFor(parent, child)}\n >\n {child}\n </Checkbox>\n ))}\n </div>\n ))}\n <Button\n kind=\"ghost\"\n onClick={this.selectAll}\n data-testid={\n dataTestId !== undefined\n ? `${dataTestId}-btn-select-all`\n : undefined\n }\n >\n Select All\n </Button>\n <Button\n kind=\"ghost\"\n onClick={this.clear}\n data-testid={\n dataTestId !== undefined ? `${dataTestId}-btn-clear` : undefined\n }\n >\n Clear\n </Button>\n </div>\n );\n }\n\n render(): JSX.Element {\n const {\n menuText,\n className,\n icon,\n id,\n 'data-testid': dataTestId,\n } = this.props;\n const { menuIsOpen } = this.state;\n\n return (\n <button\n type=\"button\"\n className={classNames('btn hcm-btn', className)}\n onClick={this.toggleMenu}\n id={id}\n data-testid={dataTestId}\n >\n <span>\n {icon && <FontAwesomeIcon icon={icon} className=\"hcm-icon mr-1\" />}\n {menuText}\n </span>\n <span className=\"cs-caret\" />\n <Popper\n options={{ placement: 'bottom' }}\n isShown={menuIsOpen}\n onExited={() => {\n this.setState({ menuIsOpen: false });\n }}\n closeOnBlur\n interactive\n >\n {this.renderMenuElement()}\n </Popper>\n </button>\n );\n }\n}\n\nexport default HierarchicalCheckboxMenu;\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"NavTab.d.ts","sourceRoot":"","sources":["../../src/navigation/NavTab.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAe,MAAM,OAAO,CAAC;AAIpC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAG/C,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAE7D,UAAU,WAAW;IACnB,GAAG,EAAE,UAAU,CAAC;IAChB,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;IAC3C,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,OAAO,CAAC;IACrB,cAAc,CAAC,EAAE,uBAAuB,GAAG,uBAAuB,EAAE,CAAC;CACtE;AAED,QAAA,MAAM,MAAM,mHAUP,WAAW,iBA6Df,CAAC;AAIF,eAAe,MAAM,CAAC"}
1
+ {"version":3,"file":"NavTab.d.ts","sourceRoot":"","sources":["../../src/navigation/NavTab.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAe,MAAM,OAAO,CAAC;AAKpC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAG/C,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAE7D,UAAU,WAAW;IACnB,GAAG,EAAE,UAAU,CAAC;IAChB,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;IAC3C,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,OAAO,CAAC;IACrB,cAAc,CAAC,EAAE,uBAAuB,GAAG,uBAAuB,EAAE,CAAC;CACtE;AAED,QAAA,MAAM,MAAM,mHAUP,WAAW,iBAuEf,CAAC;AAIF,eAAe,MAAM,CAAC"}
@@ -7,6 +7,7 @@ import React, { memo } from 'react';
7
7
  import classNames from 'classnames';
8
8
  import { Draggable } from 'react-beautiful-dnd';
9
9
  import { vsClose } from '@deephaven/icons';
10
+ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
10
11
  import Button from "../Button.js";
11
12
  import ContextActions from "../context-actions/ContextActions.js";
12
13
  import { jsx as _jsx } from "react/jsx-runtime";
@@ -25,8 +26,15 @@ var NavTab = /*#__PURE__*/memo(_ref => {
25
26
  var {
26
27
  key,
27
28
  isClosable = onClose != null,
28
- title
29
+ title,
30
+ icon
29
31
  } = tab;
32
+ var iconElem;
33
+ if (icon != null) {
34
+ iconElem = /*#__PURE__*/React.isValidElement(icon) ? icon : /*#__PURE__*/_jsx(FontAwesomeIcon, {
35
+ icon: icon
36
+ });
37
+ }
30
38
  return /*#__PURE__*/_jsx(Draggable, {
31
39
  draggableId: key,
32
40
  index: index,
@@ -56,7 +64,7 @@ var NavTab = /*#__PURE__*/memo(_ref => {
56
64
  onKeyPress: event => {
57
65
  if (event.key === 'Enter') onSelect(key);
58
66
  },
59
- children: [title, isClosable && /*#__PURE__*/_jsx(Button, {
67
+ children: [iconElem, title, isClosable && /*#__PURE__*/_jsx(Button, {
60
68
  kind: "ghost",
61
69
  className: "btn-nav-tab-close",
62
70
  onClick: event => {
@@ -1 +1 @@
1
- {"version":3,"file":"NavTab.js","names":["React","memo","classNames","Draggable","vsClose","Button","ContextActions","jsx","_jsx","jsxs","_jsxs","NavTab","_ref","tab","onClose","onSelect","isActive","activeRef","index","isDraggable","contextActions","key","isClosable","title","draggableId","isDragDisabled","children","provided","snapshot","className","ref","_objectSpread","innerRef","draggableProps","dragHandleProps","active","dragging","isDragging","concat","role","tabIndex","onClick","e","target","focus","onKeyPress","event","kind","stopPropagation","preventDefault","icon","tooltip","actions","displayName"],"sources":["../../src/navigation/NavTab.tsx"],"sourcesContent":["import React, { memo } from 'react';\nimport classNames from 'classnames';\nimport { Draggable } from 'react-beautiful-dnd';\nimport { vsClose } from '@deephaven/icons';\nimport type { NavTabItem } from './NavTabList';\nimport Button from '../Button';\nimport ContextActions from '../context-actions/ContextActions';\nimport { ResolvableContextAction } from '../context-actions';\n\ninterface NavTabProps {\n tab: NavTabItem;\n onSelect: (key: string) => void;\n onClose?: (key: string) => void;\n isActive: boolean;\n activeRef: React.RefObject<HTMLDivElement>;\n index: number;\n isDraggable: boolean;\n contextActions?: ResolvableContextAction | ResolvableContextAction[];\n}\n\nconst NavTab = memo(\n ({\n tab,\n onClose,\n onSelect,\n isActive,\n activeRef,\n index,\n isDraggable,\n contextActions,\n }: NavTabProps) => {\n const { key, isClosable = onClose != null, title } = tab;\n\n return (\n <Draggable\n draggableId={key}\n key={key}\n index={index}\n isDragDisabled={!isDraggable}\n >\n {(provided, snapshot) => (\n <div\n className=\"context-menu-wrapper\"\n ref={isActive ? activeRef : null}\n >\n <div\n ref={provided.innerRef}\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...provided.draggableProps}\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...provided.dragHandleProps}\n className={classNames(\n 'btn btn-link btn-nav-tab',\n { active: isActive },\n { dragging: snapshot.isDragging }\n )}\n data-testid={`btn-nav-tab-${title}`}\n role=\"tab\"\n tabIndex={0}\n onClick={e => {\n (e.target as HTMLDivElement).focus();\n // focus is normally set on mousedown, but dnd calls preventDefault for drag purposes\n // so we can call focus on the firing of the actual click event manually\n\n onSelect(key);\n }}\n onKeyPress={event => {\n if (event.key === 'Enter') onSelect(key);\n }}\n >\n {title}\n {isClosable && (\n <Button\n kind=\"ghost\"\n className=\"btn-nav-tab-close\"\n onClick={event => {\n onClose?.(key);\n event.stopPropagation();\n event.preventDefault();\n }}\n icon={vsClose}\n tooltip=\"Close\"\n />\n )}\n </div>\n <ContextActions actions={contextActions} />\n </div>\n )}\n </Draggable>\n );\n }\n);\n\nNavTab.displayName = 'NavTab';\n\nexport default NavTab;\n"],"mappings":";;;;;AAAA,OAAOA,KAAK,IAAIC,IAAI,QAAQ,OAAO;AACnC,OAAOC,UAAU,MAAM,YAAY;AACnC,SAASC,SAAS,QAAQ,qBAAqB;AAC/C,SAASC,OAAO,QAAQ,kBAAkB;AAAC,OAEpCC,MAAM;AAAA,OACNC,cAAc;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAAA,SAAAC,IAAA,IAAAC,KAAA;AAcrB,IAAMC,MAAM,gBAAGV,IAAI,CACjBW,IAAA,IASmB;EAAA,IATlB;IACCC,GAAG;IACHC,OAAO;IACPC,QAAQ;IACRC,QAAQ;IACRC,SAAS;IACTC,KAAK;IACLC,WAAW;IACXC;EACW,CAAC,GAAAR,IAAA;EACZ,IAAM;IAAES,GAAG;IAAEC,UAAU,GAAGR,OAAO,IAAI,IAAI;IAAES;EAAM,CAAC,GAAGV,GAAG;EAExD,oBACEL,IAAA,CAACL,SAAS;IACRqB,WAAW,EAAEH,GAAI;IAEjBH,KAAK,EAAEA,KAAM;IACbO,cAAc,EAAE,CAACN,WAAY;IAAAO,QAAA,EAE5BA,CAACC,QAAQ,EAAEC,QAAQ,kBAClBlB,KAAA;MACEmB,SAAS,EAAC,sBAAsB;MAChCC,GAAG,EAAEd,QAAQ,GAAGC,SAAS,GAAG,IAAK;MAAAS,QAAA,gBAEjChB,KAAA,QAAAqB,aAAA,CAAAA,aAAA,CAAAA,aAAA;QACED,GAAG,EAAEH,QAAQ,CAACK;QACd;MAAA,GACIL,QAAQ,CAACM,cAAc,GAEvBN,QAAQ,CAACO,eAAe;QAC5BL,SAAS,EAAE3B,UAAU,CACnB,0BAA0B,EAC1B;UAAEiC,MAAM,EAAEnB;QAAS,CAAC,EACpB;UAAEoB,QAAQ,EAAER,QAAQ,CAACS;QAAW,CAClC,CAAE;QACF,8BAAAC,MAAA,CAA4Bf,KAAK,CAAG;QACpCgB,IAAI,EAAC,KAAK;QACVC,QAAQ,EAAE,CAAE;QACZC,OAAO,EAAEC,CAAC,IAAI;UACXA,CAAC,CAACC,MAAM,CAAoBC,KAAK,CAAC,CAAC;UACpC;UACA;;UAEA7B,QAAQ,CAACM,GAAG,CAAC;QACf,CAAE;QACFwB,UAAU,EAAEC,KAAK,IAAI;UACnB,IAAIA,KAAK,CAACzB,GAAG,KAAK,OAAO,EAAEN,QAAQ,CAACM,GAAG,CAAC;QAC1C,CAAE;QAAAK,QAAA,GAEDH,KAAK,EACLD,UAAU,iBACTd,IAAA,CAACH,MAAM;UACL0C,IAAI,EAAC,OAAO;UACZlB,SAAS,EAAC,mBAAmB;UAC7BY,OAAO,EAAEK,KAAK,IAAI;YAChBhC,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAGO,GAAG,CAAC;YACdyB,KAAK,CAACE,eAAe,CAAC,CAAC;YACvBF,KAAK,CAACG,cAAc,CAAC,CAAC;UACxB,CAAE;UACFC,IAAI,EAAE9C,OAAQ;UACd+C,OAAO,EAAC;QAAO,CAChB,CACF;MAAA,EACE,CAAC,eACN3C,IAAA,CAACF,cAAc;QAAC8C,OAAO,EAAEhC;MAAe,CAAE,CAAC;IAAA,CACxC;EACN,GAnDIC,GAoDI,CAAC;AAEhB,CACF,CAAC;AAEDV,MAAM,CAAC0C,WAAW,GAAG,QAAQ;AAE7B,eAAe1C,MAAM"}
1
+ {"version":3,"file":"NavTab.js","names":["React","memo","classNames","Draggable","vsClose","FontAwesomeIcon","Button","ContextActions","jsx","_jsx","jsxs","_jsxs","NavTab","_ref","tab","onClose","onSelect","isActive","activeRef","index","isDraggable","contextActions","key","isClosable","title","icon","iconElem","isValidElement","draggableId","isDragDisabled","children","provided","snapshot","className","ref","_objectSpread","innerRef","draggableProps","dragHandleProps","active","dragging","isDragging","concat","role","tabIndex","onClick","e","target","focus","onKeyPress","event","kind","stopPropagation","preventDefault","tooltip","actions","displayName"],"sources":["../../src/navigation/NavTab.tsx"],"sourcesContent":["import React, { memo } from 'react';\nimport classNames from 'classnames';\nimport { Draggable } from 'react-beautiful-dnd';\nimport { IconDefinition, vsClose } from '@deephaven/icons';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport type { NavTabItem } from './NavTabList';\nimport Button from '../Button';\nimport ContextActions from '../context-actions/ContextActions';\nimport { ResolvableContextAction } from '../context-actions';\n\ninterface NavTabProps {\n tab: NavTabItem;\n onSelect: (key: string) => void;\n onClose?: (key: string) => void;\n isActive: boolean;\n activeRef: React.RefObject<HTMLDivElement>;\n index: number;\n isDraggable: boolean;\n contextActions?: ResolvableContextAction | ResolvableContextAction[];\n}\n\nconst NavTab = memo(\n ({\n tab,\n onClose,\n onSelect,\n isActive,\n activeRef,\n index,\n isDraggable,\n contextActions,\n }: NavTabProps) => {\n const { key, isClosable = onClose != null, title, icon } = tab;\n\n let iconElem: JSX.Element | undefined;\n if (icon != null) {\n iconElem = React.isValidElement(icon) ? (\n icon\n ) : (\n <FontAwesomeIcon icon={icon as IconDefinition} />\n );\n }\n\n return (\n <Draggable\n draggableId={key}\n key={key}\n index={index}\n isDragDisabled={!isDraggable}\n >\n {(provided, snapshot) => (\n <div\n className=\"context-menu-wrapper\"\n ref={isActive ? activeRef : null}\n >\n <div\n ref={provided.innerRef}\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...provided.draggableProps}\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...provided.dragHandleProps}\n className={classNames(\n 'btn btn-link btn-nav-tab',\n { active: isActive },\n { dragging: snapshot.isDragging }\n )}\n data-testid={`btn-nav-tab-${title}`}\n role=\"tab\"\n tabIndex={0}\n onClick={e => {\n (e.target as HTMLDivElement).focus();\n // focus is normally set on mousedown, but dnd calls preventDefault for drag purposes\n // so we can call focus on the firing of the actual click event manually\n\n onSelect(key);\n }}\n onKeyPress={event => {\n if (event.key === 'Enter') onSelect(key);\n }}\n >\n {iconElem}\n {title}\n {isClosable && (\n <Button\n kind=\"ghost\"\n className=\"btn-nav-tab-close\"\n onClick={event => {\n onClose?.(key);\n event.stopPropagation();\n event.preventDefault();\n }}\n icon={vsClose}\n tooltip=\"Close\"\n />\n )}\n </div>\n <ContextActions actions={contextActions} />\n </div>\n )}\n </Draggable>\n );\n }\n);\n\nNavTab.displayName = 'NavTab';\n\nexport default NavTab;\n"],"mappings":";;;;;AAAA,OAAOA,KAAK,IAAIC,IAAI,QAAQ,OAAO;AACnC,OAAOC,UAAU,MAAM,YAAY;AACnC,SAASC,SAAS,QAAQ,qBAAqB;AAC/C,SAAyBC,OAAO,QAAQ,kBAAkB;AAC1D,SAASC,eAAe,QAAQ,gCAAgC;AAAC,OAE1DC,MAAM;AAAA,OACNC,cAAc;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAAA,SAAAC,IAAA,IAAAC,KAAA;AAcrB,IAAMC,MAAM,gBAAGX,IAAI,CACjBY,IAAA,IASmB;EAAA,IATlB;IACCC,GAAG;IACHC,OAAO;IACPC,QAAQ;IACRC,QAAQ;IACRC,SAAS;IACTC,KAAK;IACLC,WAAW;IACXC;EACW,CAAC,GAAAR,IAAA;EACZ,IAAM;IAAES,GAAG;IAAEC,UAAU,GAAGR,OAAO,IAAI,IAAI;IAAES,KAAK;IAAEC;EAAK,CAAC,GAAGX,GAAG;EAE9D,IAAIY,QAAiC;EACrC,IAAID,IAAI,IAAI,IAAI,EAAE;IAChBC,QAAQ,GAAG,aAAA1B,KAAK,CAAC2B,cAAc,CAACF,IAAI,CAAC,GACnCA,IAAI,gBAEJhB,IAAA,CAACJ,eAAe;MAACoB,IAAI,EAAEA;IAAuB,CAAE,CACjD;EACH;EAEA,oBACEhB,IAAA,CAACN,SAAS;IACRyB,WAAW,EAAEN,GAAI;IAEjBH,KAAK,EAAEA,KAAM;IACbU,cAAc,EAAE,CAACT,WAAY;IAAAU,QAAA,EAE5BA,CAACC,QAAQ,EAAEC,QAAQ,kBAClBrB,KAAA;MACEsB,SAAS,EAAC,sBAAsB;MAChCC,GAAG,EAAEjB,QAAQ,GAAGC,SAAS,GAAG,IAAK;MAAAY,QAAA,gBAEjCnB,KAAA,QAAAwB,aAAA,CAAAA,aAAA,CAAAA,aAAA;QACED,GAAG,EAAEH,QAAQ,CAACK;QACd;MAAA,GACIL,QAAQ,CAACM,cAAc,GAEvBN,QAAQ,CAACO,eAAe;QAC5BL,SAAS,EAAE/B,UAAU,CACnB,0BAA0B,EAC1B;UAAEqC,MAAM,EAAEtB;QAAS,CAAC,EACpB;UAAEuB,QAAQ,EAAER,QAAQ,CAACS;QAAW,CAClC,CAAE;QACF,8BAAAC,MAAA,CAA4BlB,KAAK,CAAG;QACpCmB,IAAI,EAAC,KAAK;QACVC,QAAQ,EAAE,CAAE;QACZC,OAAO,EAAEC,CAAC,IAAI;UACXA,CAAC,CAACC,MAAM,CAAoBC,KAAK,CAAC,CAAC;UACpC;UACA;;UAEAhC,QAAQ,CAACM,GAAG,CAAC;QACf,CAAE;QACF2B,UAAU,EAAEC,KAAK,IAAI;UACnB,IAAIA,KAAK,CAAC5B,GAAG,KAAK,OAAO,EAAEN,QAAQ,CAACM,GAAG,CAAC;QAC1C,CAAE;QAAAQ,QAAA,GAEDJ,QAAQ,EACRF,KAAK,EACLD,UAAU,iBACTd,IAAA,CAACH,MAAM;UACL6C,IAAI,EAAC,OAAO;UACZlB,SAAS,EAAC,mBAAmB;UAC7BY,OAAO,EAAEK,KAAK,IAAI;YAChBnC,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAGO,GAAG,CAAC;YACd4B,KAAK,CAACE,eAAe,CAAC,CAAC;YACvBF,KAAK,CAACG,cAAc,CAAC,CAAC;UACxB,CAAE;UACF5B,IAAI,EAAErB,OAAQ;UACdkD,OAAO,EAAC;QAAO,CAChB,CACF;MAAA,EACE,CAAC,eACN7C,IAAA,CAACF,cAAc;QAACgD,OAAO,EAAElC;MAAe,CAAE,CAAC;IAAA,CACxC;EACN,GApDIC,GAqDI,CAAC;AAEhB,CACF,CAAC;AAEDV,MAAM,CAAC4C,WAAW,GAAG,QAAQ;AAE7B,eAAe5C,MAAM"}
@@ -1,4 +1,5 @@
1
1
  import React from 'react';
2
+ import { IconDefinition } from '@fortawesome/fontawesome-svg-core';
2
3
  import './NavTabList.scss';
3
4
  import { ContextAction } from '../context-actions';
4
5
  export interface NavTabItem {
@@ -10,6 +11,10 @@ export interface NavTabItem {
10
11
  * Title to display on the tab.
11
12
  */
12
13
  title: string;
14
+ /**
15
+ * Icon to display on the tab.
16
+ */
17
+ icon?: IconDefinition | JSX.Element;
13
18
  /**
14
19
  * Whether the tab is closable.
15
20
  * If omitted, the tab will be closeable if onClose exists.
@@ -1 +1 @@
1
- {"version":3,"file":"NavTabList.d.ts","sourceRoot":"","sources":["../../src/navigation/NavTabList.tsx"],"names":[],"mappings":"AAAA,OAAO,KAMN,MAAM,OAAO,CAAC;AAcf,OAAO,mBAAmB,CAAC;AAC3B,OAAO,EAAE,aAAa,EAA2B,MAAM,oBAAoB,CAAC;AAS5E,MAAM,WAAW,UAAU;IACzB;;OAEG;IACH,GAAG,EAAE,MAAM,CAAC;IAEZ;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,KAAK,eAAe,CAAC,CAAC,SAAS,UAAU,GAAG,UAAU,IAAI;IACxD;;;OAGG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;;OAGG;IACH,IAAI,EAAE,CAAC,EAAE,CAAC;IAEV;;;;OAIG;IACH,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAEhC;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAEhC;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,KAAK,IAAI,CAAC;IAEpE;;;;;;;OAOG;IACH,kBAAkB,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,aAAa,GAAG,aAAa,EAAE,CAAC;CAClE,CAAC;AAmEF,iBAAS,UAAU,CAAC,EAClB,SAAS,EACT,IAAI,EACJ,QAAQ,EACR,SAAS,EACT,OAAO,EACP,kBAAkB,GACnB,EAAE,eAAe,GAAG,KAAK,CAAC,YAAY,CAkUtC;AAED,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"NavTabList.d.ts","sourceRoot":"","sources":["../../src/navigation/NavTabList.tsx"],"names":[],"mappings":"AAAA,OAAO,KAMN,MAAM,OAAO,CAAC;AASf,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAMnE,OAAO,mBAAmB,CAAC;AAC3B,OAAO,EAAE,aAAa,EAA2B,MAAM,oBAAoB,CAAC;AAS5E,MAAM,WAAW,UAAU;IACzB;;OAEG;IACH,GAAG,EAAE,MAAM,CAAC;IAEZ;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,IAAI,CAAC,EAAE,cAAc,GAAG,GAAG,CAAC,OAAO,CAAC;IAEpC;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,KAAK,eAAe,CAAC,CAAC,SAAS,UAAU,GAAG,UAAU,IAAI;IACxD;;;OAGG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;;OAGG;IACH,IAAI,EAAE,CAAC,EAAE,CAAC;IAEV;;;;OAIG;IACH,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAEhC;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAEhC;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,KAAK,IAAI,CAAC;IAEpE;;;;;;;OAOG;IACH,kBAAkB,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,aAAa,GAAG,aAAa,EAAE,CAAC;CAClE,CAAC;AAmEF,iBAAS,UAAU,CAAC,EAClB,SAAS,EACT,IAAI,EACJ,QAAQ,EACR,SAAS,EACT,OAAO,EACP,kBAAkB,GACnB,EAAE,eAAe,GAAG,KAAK,CAAC,YAAY,CAkUtC;AAED,eAAe,UAAU,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"NavTabList.js","names":["React","useCallback","useEffect","useMemo","useRef","useState","classNames","clamp","DragDropContext","Droppable","FontAwesomeIcon","vsChevronRight","vsChevronLeft","useResizeObserver","DragUtils","Button","NavTab","jsx","_jsx","jsxs","_jsxs","CLICK_TIMEOUT","START_SPEED","ACCELERATION","isScrolledLeft","element","scrollLeft","isScrolledRight","clientWidth","scrollWidth","makeBaseContextActions","tab","tabs","onClose","isClosable","key","contextActions","push","title","order","group","action","disabled","i","length","forEach","t","NavTabList","_ref","activeKey","onSelect","onReorder","makeContextActions","containerRef","isOverflowing","setIsOverflowing","disableScrollLeft","setDisableScrollLeft","disableScrollRight","setDisableScrollRight","handleResize","current","onDragEnd","result","stopDragging","destination","source","index","handleScroll","shouldDisableScrollLeft","shouldDisableScrollRight","continuousScrollRef","cancelClick","handleLeftClick","children","child","offsetLeft","scrollIntoView","behavior","block","inline","handleRightClick","offsetWidth","handleMouseRepeat","direction","startX","deltaX","arguments","undefined","prevTimestamp","container","rAF","requestAnimationFrame","timestamp","startTime","deltaTime","newDeltaX","Math","min","endContinuousScroll","holdTimer","clearTimeout","cancelAnimationFrame","window","removeEventListener","handleMouseDown","setTimeout","addEventListener","handleMouseDownLeft","handleMouseDownRight","handleWheel","_containerRef$current","onWheel","e","stopPropagation","preventDefault","nav","currentTarget","delta","abs","deltaY","_containerRef$current2","tabContextActionMap","tabContextActions","Map","_makeContextActions","set","activeTabRef","activeTab","find","navTabs","map","isActive","activeRef","isDraggable","get","scrollActiveTabIntoView","className","kind","icon","transform","tooltip","onClick","onMouseDown","onDragStart","startDragging","droppableId","provided","snapshot","_objectSpread","ref","r","innerRef","droppableProps","dragging","draggingFromThisWith","role","onScroll","placeholder"],"sources":["../../src/navigation/NavTabList.tsx"],"sourcesContent":["import React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport classNames from 'classnames';\nimport clamp from 'lodash.clamp';\nimport {\n DragDropContext,\n Droppable,\n OnDragEndResponder,\n} from 'react-beautiful-dnd';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { vsChevronRight, vsChevronLeft } from '@deephaven/icons';\nimport { useResizeObserver } from '@deephaven/react-hooks';\nimport DragUtils from '../DragUtils';\nimport Button from '../Button';\nimport NavTab from './NavTab';\nimport './NavTabList.scss';\nimport { ContextAction, ResolvableContextAction } from '../context-actions';\n\n// mouse hold timeout to act as hold instead of click\nconst CLICK_TIMEOUT = 500;\n\n// mouse hold acceleration\nconst START_SPEED = 0.01;\nconst ACCELERATION = 0.0005;\n\nexport interface NavTabItem {\n /**\n * Unique key for the tab.\n */\n key: string;\n\n /**\n * Title to display on the tab.\n */\n title: string;\n\n /**\n * Whether the tab is closable.\n * If omitted, the tab will be closeable if onClose exists.\n */\n isClosable?: boolean;\n}\n\ntype NavTabListProps<T extends NavTabItem = NavTabItem> = {\n /**\n * The key of the active tab.\n * If this does not match a tab key, no tab will be active.\n */\n activeKey: string;\n\n /**\n * Array of tabs to display.\n * @see {@link NavTabItem} for the minimum required properties.\n */\n tabs: T[];\n\n /**\n * Function called when a tab is selected.\n *\n * @param key The key of the tab to select\n */\n onSelect: (key: string) => void;\n\n /**\n * Function called when a tab is closed.\n * If the function is provided, all tabs will be closeable by default.\n * Tabs may set their own closeable property to override this behavior.\n *\n * @param key The key of the tab to close\n */\n onClose?: (key: string) => void;\n\n /**\n * Function called when a tab is reordered.\n * If the function is omitted, the tab list will not be reorderable.\n *\n * @param sourceIndex Index in the tab list the drag started from\n * @param destinationIndex Index in the tab list the drag ended at\n */\n onReorder?: (sourceIndex: number, destinationIndex: number) => void;\n\n /**\n * Context actions to add to the tab in addition to the default actions.\n * The default actions are Close, Close to the Right, and Close All.\n * The default actions have a group value of 20.\n *\n * @param tab The tab to make context items for\n * @returns Additional context items for the tab\n */\n makeContextActions?: (tab: T) => ContextAction | ContextAction[];\n};\n\nfunction isScrolledLeft(element: HTMLElement): boolean {\n return element.scrollLeft === 0;\n}\n\nfunction isScrolledRight(element: HTMLElement): boolean {\n return (\n element.scrollLeft + element.clientWidth === element.scrollWidth ||\n element.scrollWidth === 0\n );\n}\n\nfunction makeBaseContextActions(\n tab: NavTabItem,\n tabs: NavTabItem[],\n onClose: ((key: string) => void) | undefined\n): ContextAction[] {\n const { isClosable = false, key } = tab;\n const contextActions: ContextAction[] = [];\n if (isClosable && onClose != null) {\n contextActions.push({\n title: 'Close',\n order: 10,\n group: 20,\n action: () => {\n onClose(key);\n },\n });\n\n let disabled = true;\n for (let i = tabs.length - 1; i > 0; i -= 1) {\n if (tabs[i].key === tab.key) break;\n if (tabs[i].isClosable === true) {\n disabled = false;\n break;\n }\n }\n\n contextActions.push({\n title: 'Close to the Right',\n order: 20,\n group: 20,\n action: () => {\n for (let i = tabs.length - 1; i > 0; i -= 1) {\n if (tabs[i].key === key) break;\n if (tabs[i].isClosable === true) onClose(tabs[i].key);\n }\n },\n disabled,\n });\n\n contextActions.push({\n title: 'Close All',\n order: 30,\n group: 20,\n action: () => {\n tabs.forEach(t => {\n if (t.isClosable === true) onClose(t.key);\n });\n },\n });\n }\n\n return contextActions;\n}\n\nfunction NavTabList({\n activeKey,\n tabs,\n onSelect,\n onReorder,\n onClose,\n makeContextActions,\n}: NavTabListProps): React.ReactElement {\n const containerRef = useRef<HTMLDivElement>();\n const [isOverflowing, setIsOverflowing] = useState(true);\n const [disableScrollLeft, setDisableScrollLeft] = useState(true);\n const [disableScrollRight, setDisableScrollRight] = useState(true);\n const handleResize = useCallback(() => {\n if (containerRef.current == null) {\n return;\n }\n\n if (\n containerRef.current.clientWidth < containerRef.current.scrollWidth &&\n tabs.length > 0\n ) {\n setIsOverflowing(true);\n } else {\n setIsOverflowing(false);\n }\n\n setDisableScrollLeft(isScrolledLeft(containerRef.current));\n setDisableScrollRight(isScrolledRight(containerRef.current));\n }, [tabs]);\n useResizeObserver(containerRef.current, handleResize);\n\n const onDragEnd: OnDragEndResponder = useCallback(\n result => {\n DragUtils.stopDragging();\n\n // dropped outside the list\n if (!result.destination) {\n return;\n }\n\n onReorder?.(result.source.index, result.destination.index);\n },\n [onReorder]\n );\n\n const handleScroll = useCallback(() => {\n if (containerRef.current == null) {\n return;\n }\n\n const shouldDisableScrollLeft = isScrolledLeft(containerRef.current);\n if (shouldDisableScrollLeft !== disableScrollLeft) {\n setDisableScrollLeft(shouldDisableScrollLeft);\n }\n\n const shouldDisableScrollRight = isScrolledRight(containerRef.current);\n if (shouldDisableScrollRight !== disableScrollRight) {\n setDisableScrollRight(shouldDisableScrollRight);\n }\n }, [disableScrollLeft, disableScrollRight]);\n\n const continuousScrollRef = useRef<{\n holdTimer?: number;\n rAF?: number;\n cancelClick: boolean;\n }>({ cancelClick: false });\n\n const handleLeftClick = useCallback(() => {\n if (\n containerRef.current == null ||\n continuousScrollRef.current.cancelClick\n ) {\n return;\n }\n\n const { children } = containerRef.current;\n for (let i = children.length - 1; i >= 0; i -= 1) {\n const child = children[i] as HTMLElement;\n // Subtract 5px from left edge to account for rounding of offset values\n if (child.offsetLeft < containerRef.current.scrollLeft - 5) {\n child.scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n inline: 'start',\n });\n return;\n }\n }\n }, []);\n\n const handleRightClick = useCallback(() => {\n if (\n containerRef.current == null ||\n continuousScrollRef.current.cancelClick\n ) {\n return;\n }\n\n const { children } = containerRef.current;\n for (let i = 0; i < children.length; i += 1) {\n const child = children[i] as HTMLElement;\n // Add 5px to right edge to account for rounding of offset values\n if (\n child.offsetLeft + 5 >\n containerRef.current.scrollLeft + containerRef.current.offsetWidth\n ) {\n child.scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n inline: 'end',\n });\n return;\n }\n }\n }, []);\n\n /**\n * Recurively called after initial timeout on mousedown. Continuously scroll with acceleration.\n * Cancelled by mouseup handler cancelling the animationFrame.\n * @param direction of scroll, left or right\n * @param startX starting position of scroll\n * @param deltaX delta from intial startX calculated recursively\n * @param prevTimestamp called on subsequent delta frames\n */\n const handleMouseRepeat = useCallback(\n (\n direction: 'left' | 'right',\n startX: number,\n deltaX = 0,\n prevTimestamp?: number\n ) => {\n const container = containerRef.current;\n if (container == null) {\n return;\n }\n\n continuousScrollRef.current.cancelClick = true;\n\n if (direction === 'left') {\n // eslint-disable-next-line no-param-reassign\n container.scrollLeft = startX - deltaX;\n } else if (direction === 'right') {\n // eslint-disable-next-line no-param-reassign\n container.scrollLeft = startX + deltaX;\n }\n\n // eslint-disable-next-line no-param-reassign\n continuousScrollRef.current.rAF = requestAnimationFrame(timestamp => {\n const startTime = prevTimestamp ?? timestamp;\n const deltaTime = timestamp - startTime;\n let newDeltaX =\n START_SPEED * deltaTime + 0.5 * ACCELERATION * deltaTime ** 2;\n newDeltaX = Math.min(newDeltaX, container.scrollWidth);\n // scrollLeft enforces a limit but no point letting delta increment beyond scrollWidth\n\n handleMouseRepeat(direction, startX, newDeltaX, startTime);\n });\n },\n []\n );\n\n const endContinuousScroll = useCallback(() => {\n const { holdTimer, rAF } = continuousScrollRef.current;\n if (holdTimer != null) {\n clearTimeout(holdTimer);\n continuousScrollRef.current.holdTimer = undefined;\n }\n if (rAF != null) {\n cancelAnimationFrame(rAF);\n continuousScrollRef.current.rAF = undefined;\n }\n window.removeEventListener('mouseup', endContinuousScroll);\n }, []);\n\n useEffect(\n () => () => window.removeEventListener('mouseup', endContinuousScroll),\n [endContinuousScroll]\n );\n\n const handleMouseDown = useCallback(\n (direction: 'left' | 'right') => {\n if (containerRef.current != null) {\n continuousScrollRef.current.holdTimer = window.setTimeout(\n handleMouseRepeat,\n CLICK_TIMEOUT,\n direction,\n containerRef.current.scrollLeft\n );\n }\n continuousScrollRef.current.cancelClick = false;\n window.addEventListener('mouseup', endContinuousScroll);\n },\n [endContinuousScroll, handleMouseRepeat]\n );\n\n const handleMouseDownLeft = useCallback(() => {\n handleMouseDown('left');\n }, [handleMouseDown]);\n\n const handleMouseDownRight = useCallback(() => {\n handleMouseDown('right');\n }, [handleMouseDown]);\n\n // React binds to the root as a passive listener for wheel\n // This prevents the wheel event from being canceled\n // Bypass React's event system so we can prevent the default behavior\n // https://github.com/facebook/react/issues/14856\n useEffect(function handleWheel() {\n const onWheel = (e: WheelEvent) => {\n e.stopPropagation();\n e.preventDefault();\n const nav = e.currentTarget as HTMLDivElement;\n const delta =\n Math.abs(e.deltaY) > Math.abs(e.deltaX) ? e.deltaY : e.deltaX;\n\n // Scrolling jumps too far sometimes, so clamp to get a smoother scroll\n nav.scrollLeft += clamp(delta, -30, 30);\n };\n\n containerRef.current?.addEventListener('wheel', onWheel);\n return () => {\n containerRef.current?.removeEventListener('wheel', onWheel);\n };\n }, []);\n\n const tabContextActionMap = useMemo(() => {\n const tabContextActions = new Map<string, ResolvableContextAction[]>();\n tabs.forEach(tab => {\n const { key } = tab;\n const contextActions = [\n () => makeBaseContextActions(tab, tabs, onClose),\n () => makeContextActions?.(tab) ?? [],\n ];\n tabContextActions.set(key, contextActions);\n });\n return tabContextActions;\n }, [makeContextActions, tabs, onClose]);\n\n const activeTabRef = useRef<HTMLDivElement>(null);\n const activeTab = tabs.find(tab => tab.key === activeKey);\n const navTabs = tabs.map((tab, index) => {\n const { key } = tab;\n const isActive = tab === activeTab;\n\n return (\n <NavTab\n tab={tab}\n key={key}\n index={index}\n isActive={isActive}\n activeRef={activeTabRef}\n onSelect={onSelect}\n onClose={onClose}\n isDraggable={onReorder != null}\n contextActions={tabContextActionMap.get(key)}\n />\n );\n });\n\n useEffect(\n // Needs to be in a useEffect so the ref is updated\n function scrollActiveTabIntoView() {\n if (activeTabRef.current != null) {\n activeTabRef.current.scrollIntoView({\n block: 'nearest',\n inline: 'nearest',\n });\n }\n },\n [activeKey]\n );\n\n return (\n <nav className=\"nav-container\">\n {isOverflowing && (\n <Button\n kind=\"ghost\"\n icon={<FontAwesomeIcon icon={vsChevronLeft} transform=\"grow-4\" />}\n className=\"tab-controls-btn tab-controls-btn-left\"\n tooltip=\"Scroll left\"\n onClick={handleLeftClick}\n onMouseDown={handleMouseDownLeft}\n disabled={disableScrollLeft}\n />\n )}\n <DragDropContext\n onDragStart={DragUtils.startDragging}\n onDragEnd={onDragEnd}\n >\n <Droppable\n droppableId=\"droppable-tab-navigation\"\n direction=\"horizontal\"\n >\n {(provided, snapshot) => (\n <div\n ref={r => {\n if (r == null) {\n return;\n }\n containerRef.current = r;\n provided.innerRef(r);\n }}\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...provided.droppableProps}\n className={classNames('nav nav-tabs', {\n dragging: snapshot.draggingFromThisWith,\n })}\n role=\"tablist\"\n onScroll={handleScroll}\n >\n {navTabs}\n {provided.placeholder}\n </div>\n )}\n </Droppable>\n </DragDropContext>\n {isOverflowing && (\n <Button\n kind=\"ghost\"\n icon={<FontAwesomeIcon icon={vsChevronRight} transform=\"grow-4\" />}\n className=\"tab-controls-btn tab-controls-btn-right\"\n tooltip=\"Scroll right\"\n onClick={handleRightClick}\n onMouseDown={handleMouseDownRight}\n disabled={disableScrollRight}\n />\n )}\n </nav>\n );\n}\n\nexport default NavTabList;\n"],"mappings":"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"}
1
+ {"version":3,"file":"NavTabList.js","names":["React","useCallback","useEffect","useMemo","useRef","useState","classNames","clamp","DragDropContext","Droppable","FontAwesomeIcon","vsChevronRight","vsChevronLeft","useResizeObserver","DragUtils","Button","NavTab","jsx","_jsx","jsxs","_jsxs","CLICK_TIMEOUT","START_SPEED","ACCELERATION","isScrolledLeft","element","scrollLeft","isScrolledRight","clientWidth","scrollWidth","makeBaseContextActions","tab","tabs","onClose","isClosable","key","contextActions","push","title","order","group","action","disabled","i","length","forEach","t","NavTabList","_ref","activeKey","onSelect","onReorder","makeContextActions","containerRef","isOverflowing","setIsOverflowing","disableScrollLeft","setDisableScrollLeft","disableScrollRight","setDisableScrollRight","handleResize","current","onDragEnd","result","stopDragging","destination","source","index","handleScroll","shouldDisableScrollLeft","shouldDisableScrollRight","continuousScrollRef","cancelClick","handleLeftClick","children","child","offsetLeft","scrollIntoView","behavior","block","inline","handleRightClick","offsetWidth","handleMouseRepeat","direction","startX","deltaX","arguments","undefined","prevTimestamp","container","rAF","requestAnimationFrame","timestamp","startTime","deltaTime","newDeltaX","Math","min","endContinuousScroll","holdTimer","clearTimeout","cancelAnimationFrame","window","removeEventListener","handleMouseDown","setTimeout","addEventListener","handleMouseDownLeft","handleMouseDownRight","handleWheel","_containerRef$current","onWheel","e","stopPropagation","preventDefault","nav","currentTarget","delta","abs","deltaY","_containerRef$current2","tabContextActionMap","tabContextActions","Map","_makeContextActions","set","activeTabRef","activeTab","find","navTabs","map","isActive","activeRef","isDraggable","get","scrollActiveTabIntoView","className","kind","icon","transform","tooltip","onClick","onMouseDown","onDragStart","startDragging","droppableId","provided","snapshot","_objectSpread","ref","r","innerRef","droppableProps","dragging","draggingFromThisWith","role","onScroll","placeholder"],"sources":["../../src/navigation/NavTabList.tsx"],"sourcesContent":["import React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport classNames from 'classnames';\nimport clamp from 'lodash.clamp';\nimport {\n DragDropContext,\n Droppable,\n OnDragEndResponder,\n} from 'react-beautiful-dnd';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { IconDefinition } from '@fortawesome/fontawesome-svg-core';\nimport { vsChevronRight, vsChevronLeft } from '@deephaven/icons';\nimport { useResizeObserver } from '@deephaven/react-hooks';\nimport DragUtils from '../DragUtils';\nimport Button from '../Button';\nimport NavTab from './NavTab';\nimport './NavTabList.scss';\nimport { ContextAction, ResolvableContextAction } from '../context-actions';\n\n// mouse hold timeout to act as hold instead of click\nconst CLICK_TIMEOUT = 500;\n\n// mouse hold acceleration\nconst START_SPEED = 0.01;\nconst ACCELERATION = 0.0005;\n\nexport interface NavTabItem {\n /**\n * Unique key for the tab.\n */\n key: string;\n\n /**\n * Title to display on the tab.\n */\n title: string;\n\n /**\n * Icon to display on the tab.\n */\n icon?: IconDefinition | JSX.Element;\n\n /**\n * Whether the tab is closable.\n * If omitted, the tab will be closeable if onClose exists.\n */\n isClosable?: boolean;\n}\n\ntype NavTabListProps<T extends NavTabItem = NavTabItem> = {\n /**\n * The key of the active tab.\n * If this does not match a tab key, no tab will be active.\n */\n activeKey: string;\n\n /**\n * Array of tabs to display.\n * @see {@link NavTabItem} for the minimum required properties.\n */\n tabs: T[];\n\n /**\n * Function called when a tab is selected.\n *\n * @param key The key of the tab to select\n */\n onSelect: (key: string) => void;\n\n /**\n * Function called when a tab is closed.\n * If the function is provided, all tabs will be closeable by default.\n * Tabs may set their own closeable property to override this behavior.\n *\n * @param key The key of the tab to close\n */\n onClose?: (key: string) => void;\n\n /**\n * Function called when a tab is reordered.\n * If the function is omitted, the tab list will not be reorderable.\n *\n * @param sourceIndex Index in the tab list the drag started from\n * @param destinationIndex Index in the tab list the drag ended at\n */\n onReorder?: (sourceIndex: number, destinationIndex: number) => void;\n\n /**\n * Context actions to add to the tab in addition to the default actions.\n * The default actions are Close, Close to the Right, and Close All.\n * The default actions have a group value of 20.\n *\n * @param tab The tab to make context items for\n * @returns Additional context items for the tab\n */\n makeContextActions?: (tab: T) => ContextAction | ContextAction[];\n};\n\nfunction isScrolledLeft(element: HTMLElement): boolean {\n return element.scrollLeft === 0;\n}\n\nfunction isScrolledRight(element: HTMLElement): boolean {\n return (\n element.scrollLeft + element.clientWidth === element.scrollWidth ||\n element.scrollWidth === 0\n );\n}\n\nfunction makeBaseContextActions(\n tab: NavTabItem,\n tabs: NavTabItem[],\n onClose: ((key: string) => void) | undefined\n): ContextAction[] {\n const { isClosable = false, key } = tab;\n const contextActions: ContextAction[] = [];\n if (isClosable && onClose != null) {\n contextActions.push({\n title: 'Close',\n order: 10,\n group: 20,\n action: () => {\n onClose(key);\n },\n });\n\n let disabled = true;\n for (let i = tabs.length - 1; i > 0; i -= 1) {\n if (tabs[i].key === tab.key) break;\n if (tabs[i].isClosable === true) {\n disabled = false;\n break;\n }\n }\n\n contextActions.push({\n title: 'Close to the Right',\n order: 20,\n group: 20,\n action: () => {\n for (let i = tabs.length - 1; i > 0; i -= 1) {\n if (tabs[i].key === key) break;\n if (tabs[i].isClosable === true) onClose(tabs[i].key);\n }\n },\n disabled,\n });\n\n contextActions.push({\n title: 'Close All',\n order: 30,\n group: 20,\n action: () => {\n tabs.forEach(t => {\n if (t.isClosable === true) onClose(t.key);\n });\n },\n });\n }\n\n return contextActions;\n}\n\nfunction NavTabList({\n activeKey,\n tabs,\n onSelect,\n onReorder,\n onClose,\n makeContextActions,\n}: NavTabListProps): React.ReactElement {\n const containerRef = useRef<HTMLDivElement>();\n const [isOverflowing, setIsOverflowing] = useState(true);\n const [disableScrollLeft, setDisableScrollLeft] = useState(true);\n const [disableScrollRight, setDisableScrollRight] = useState(true);\n const handleResize = useCallback(() => {\n if (containerRef.current == null) {\n return;\n }\n\n if (\n containerRef.current.clientWidth < containerRef.current.scrollWidth &&\n tabs.length > 0\n ) {\n setIsOverflowing(true);\n } else {\n setIsOverflowing(false);\n }\n\n setDisableScrollLeft(isScrolledLeft(containerRef.current));\n setDisableScrollRight(isScrolledRight(containerRef.current));\n }, [tabs]);\n useResizeObserver(containerRef.current, handleResize);\n\n const onDragEnd: OnDragEndResponder = useCallback(\n result => {\n DragUtils.stopDragging();\n\n // dropped outside the list\n if (!result.destination) {\n return;\n }\n\n onReorder?.(result.source.index, result.destination.index);\n },\n [onReorder]\n );\n\n const handleScroll = useCallback(() => {\n if (containerRef.current == null) {\n return;\n }\n\n const shouldDisableScrollLeft = isScrolledLeft(containerRef.current);\n if (shouldDisableScrollLeft !== disableScrollLeft) {\n setDisableScrollLeft(shouldDisableScrollLeft);\n }\n\n const shouldDisableScrollRight = isScrolledRight(containerRef.current);\n if (shouldDisableScrollRight !== disableScrollRight) {\n setDisableScrollRight(shouldDisableScrollRight);\n }\n }, [disableScrollLeft, disableScrollRight]);\n\n const continuousScrollRef = useRef<{\n holdTimer?: number;\n rAF?: number;\n cancelClick: boolean;\n }>({ cancelClick: false });\n\n const handleLeftClick = useCallback(() => {\n if (\n containerRef.current == null ||\n continuousScrollRef.current.cancelClick\n ) {\n return;\n }\n\n const { children } = containerRef.current;\n for (let i = children.length - 1; i >= 0; i -= 1) {\n const child = children[i] as HTMLElement;\n // Subtract 5px from left edge to account for rounding of offset values\n if (child.offsetLeft < containerRef.current.scrollLeft - 5) {\n child.scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n inline: 'start',\n });\n return;\n }\n }\n }, []);\n\n const handleRightClick = useCallback(() => {\n if (\n containerRef.current == null ||\n continuousScrollRef.current.cancelClick\n ) {\n return;\n }\n\n const { children } = containerRef.current;\n for (let i = 0; i < children.length; i += 1) {\n const child = children[i] as HTMLElement;\n // Add 5px to right edge to account for rounding of offset values\n if (\n child.offsetLeft + 5 >\n containerRef.current.scrollLeft + containerRef.current.offsetWidth\n ) {\n child.scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n inline: 'end',\n });\n return;\n }\n }\n }, []);\n\n /**\n * Recurively called after initial timeout on mousedown. Continuously scroll with acceleration.\n * Cancelled by mouseup handler cancelling the animationFrame.\n * @param direction of scroll, left or right\n * @param startX starting position of scroll\n * @param deltaX delta from intial startX calculated recursively\n * @param prevTimestamp called on subsequent delta frames\n */\n const handleMouseRepeat = useCallback(\n (\n direction: 'left' | 'right',\n startX: number,\n deltaX = 0,\n prevTimestamp?: number\n ) => {\n const container = containerRef.current;\n if (container == null) {\n return;\n }\n\n continuousScrollRef.current.cancelClick = true;\n\n if (direction === 'left') {\n // eslint-disable-next-line no-param-reassign\n container.scrollLeft = startX - deltaX;\n } else if (direction === 'right') {\n // eslint-disable-next-line no-param-reassign\n container.scrollLeft = startX + deltaX;\n }\n\n // eslint-disable-next-line no-param-reassign\n continuousScrollRef.current.rAF = requestAnimationFrame(timestamp => {\n const startTime = prevTimestamp ?? timestamp;\n const deltaTime = timestamp - startTime;\n let newDeltaX =\n START_SPEED * deltaTime + 0.5 * ACCELERATION * deltaTime ** 2;\n newDeltaX = Math.min(newDeltaX, container.scrollWidth);\n // scrollLeft enforces a limit but no point letting delta increment beyond scrollWidth\n\n handleMouseRepeat(direction, startX, newDeltaX, startTime);\n });\n },\n []\n );\n\n const endContinuousScroll = useCallback(() => {\n const { holdTimer, rAF } = continuousScrollRef.current;\n if (holdTimer != null) {\n clearTimeout(holdTimer);\n continuousScrollRef.current.holdTimer = undefined;\n }\n if (rAF != null) {\n cancelAnimationFrame(rAF);\n continuousScrollRef.current.rAF = undefined;\n }\n window.removeEventListener('mouseup', endContinuousScroll);\n }, []);\n\n useEffect(\n () => () => window.removeEventListener('mouseup', endContinuousScroll),\n [endContinuousScroll]\n );\n\n const handleMouseDown = useCallback(\n (direction: 'left' | 'right') => {\n if (containerRef.current != null) {\n continuousScrollRef.current.holdTimer = window.setTimeout(\n handleMouseRepeat,\n CLICK_TIMEOUT,\n direction,\n containerRef.current.scrollLeft\n );\n }\n continuousScrollRef.current.cancelClick = false;\n window.addEventListener('mouseup', endContinuousScroll);\n },\n [endContinuousScroll, handleMouseRepeat]\n );\n\n const handleMouseDownLeft = useCallback(() => {\n handleMouseDown('left');\n }, [handleMouseDown]);\n\n const handleMouseDownRight = useCallback(() => {\n handleMouseDown('right');\n }, [handleMouseDown]);\n\n // React binds to the root as a passive listener for wheel\n // This prevents the wheel event from being canceled\n // Bypass React's event system so we can prevent the default behavior\n // https://github.com/facebook/react/issues/14856\n useEffect(function handleWheel() {\n const onWheel = (e: WheelEvent) => {\n e.stopPropagation();\n e.preventDefault();\n const nav = e.currentTarget as HTMLDivElement;\n const delta =\n Math.abs(e.deltaY) > Math.abs(e.deltaX) ? e.deltaY : e.deltaX;\n\n // Scrolling jumps too far sometimes, so clamp to get a smoother scroll\n nav.scrollLeft += clamp(delta, -30, 30);\n };\n\n containerRef.current?.addEventListener('wheel', onWheel);\n return () => {\n containerRef.current?.removeEventListener('wheel', onWheel);\n };\n }, []);\n\n const tabContextActionMap = useMemo(() => {\n const tabContextActions = new Map<string, ResolvableContextAction[]>();\n tabs.forEach(tab => {\n const { key } = tab;\n const contextActions = [\n () => makeBaseContextActions(tab, tabs, onClose),\n () => makeContextActions?.(tab) ?? [],\n ];\n tabContextActions.set(key, contextActions);\n });\n return tabContextActions;\n }, [makeContextActions, tabs, onClose]);\n\n const activeTabRef = useRef<HTMLDivElement>(null);\n const activeTab = tabs.find(tab => tab.key === activeKey);\n const navTabs = tabs.map((tab, index) => {\n const { key } = tab;\n const isActive = tab === activeTab;\n\n return (\n <NavTab\n tab={tab}\n key={key}\n index={index}\n isActive={isActive}\n activeRef={activeTabRef}\n onSelect={onSelect}\n onClose={onClose}\n isDraggable={onReorder != null}\n contextActions={tabContextActionMap.get(key)}\n />\n );\n });\n\n useEffect(\n // Needs to be in a useEffect so the ref is updated\n function scrollActiveTabIntoView() {\n if (activeTabRef.current != null) {\n activeTabRef.current.scrollIntoView({\n block: 'nearest',\n inline: 'nearest',\n });\n }\n },\n [activeKey]\n );\n\n return (\n <nav className=\"nav-container\">\n {isOverflowing && (\n <Button\n kind=\"ghost\"\n icon={<FontAwesomeIcon icon={vsChevronLeft} transform=\"grow-4\" />}\n className=\"tab-controls-btn tab-controls-btn-left\"\n tooltip=\"Scroll left\"\n onClick={handleLeftClick}\n onMouseDown={handleMouseDownLeft}\n disabled={disableScrollLeft}\n />\n )}\n <DragDropContext\n onDragStart={DragUtils.startDragging}\n onDragEnd={onDragEnd}\n >\n <Droppable\n droppableId=\"droppable-tab-navigation\"\n direction=\"horizontal\"\n >\n {(provided, snapshot) => (\n <div\n ref={r => {\n if (r == null) {\n return;\n }\n containerRef.current = r;\n provided.innerRef(r);\n }}\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...provided.droppableProps}\n className={classNames('nav nav-tabs', {\n dragging: snapshot.draggingFromThisWith,\n })}\n role=\"tablist\"\n onScroll={handleScroll}\n >\n {navTabs}\n {provided.placeholder}\n </div>\n )}\n </Droppable>\n </DragDropContext>\n {isOverflowing && (\n <Button\n kind=\"ghost\"\n icon={<FontAwesomeIcon icon={vsChevronRight} transform=\"grow-4\" />}\n className=\"tab-controls-btn tab-controls-btn-right\"\n tooltip=\"Scroll right\"\n onClick={handleRightClick}\n onMouseDown={handleMouseDownRight}\n disabled={disableScrollRight}\n />\n )}\n </nav>\n );\n}\n\nexport default NavTabList;\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@deephaven/components",
3
- "version": "0.73.0",
3
+ "version": "0.74.0",
4
4
  "description": "Deephaven React component library",
5
5
  "author": "Deephaven Data Labs LLC",
6
6
  "license": "Apache-2.0",
@@ -25,10 +25,10 @@
25
25
  },
26
26
  "dependencies": {
27
27
  "@adobe/react-spectrum": "^3.34.1",
28
- "@deephaven/icons": "^0.73.0",
29
- "@deephaven/log": "^0.73.0",
30
- "@deephaven/react-hooks": "^0.73.0",
31
- "@deephaven/utils": "^0.73.0",
28
+ "@deephaven/icons": "^0.74.0",
29
+ "@deephaven/log": "^0.74.0",
30
+ "@deephaven/react-hooks": "^0.74.0",
31
+ "@deephaven/utils": "^0.74.0",
32
32
  "@fortawesome/fontawesome-svg-core": "^6.2.1",
33
33
  "@fortawesome/react-fontawesome": "^0.2.0",
34
34
  "@react-spectrum/theme-default": "^3.5.1",
@@ -55,7 +55,7 @@
55
55
  "react-dom": ">=16.8.0"
56
56
  },
57
57
  "devDependencies": {
58
- "@deephaven/mocks": "^0.73.0"
58
+ "@deephaven/mocks": "^0.74.0"
59
59
  },
60
60
  "files": [
61
61
  "dist",
@@ -69,5 +69,5 @@
69
69
  "publishConfig": {
70
70
  "access": "public"
71
71
  },
72
- "gitHead": "9e9e272cee02bc7b2c7cda19a00bf55385a0cffb"
72
+ "gitHead": "0dbf17d6c463cb59e4ff4193828fecb346031b3e"
73
73
  }