@deephaven/components 0.21.2-dhe-vite.5 → 0.22.1-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Button.d.ts +0 -1
- package/dist/Button.d.ts.map +1 -1
- package/dist/Button.js +16 -0
- package/dist/Button.js.map +1 -1
- package/dist/EditableItemList.d.ts +2 -2
- package/dist/EditableItemList.d.ts.map +1 -1
- package/dist/EditableItemList.js +14 -18
- package/dist/EditableItemList.js.map +1 -1
- package/package.json +10 -18
package/dist/Button.d.ts
CHANGED
|
@@ -15,7 +15,6 @@ interface BaseButtonProps extends React.ComponentPropsWithRef<'button'> {
|
|
|
15
15
|
icon?: IconDefinition | JSX.Element;
|
|
16
16
|
active?: boolean;
|
|
17
17
|
'data-testid'?: string;
|
|
18
|
-
'aria-label'?: string;
|
|
19
18
|
}
|
|
20
19
|
declare type ButtonWithChildren = BaseButtonProps & {
|
|
21
20
|
children: React.ReactNode;
|
package/dist/Button.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Button.d.ts","sourceRoot":"","sources":["../src/Button.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAGnE,QAAA,MAAM,YAAY,uFAQR,CAAC;AACX,aAAK,WAAW,GAAG,OAAO,YAAY,CAAC;AACvC,aAAK,UAAU,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;AAEtC,QAAA,MAAM,aAAa,wBAAyB,CAAC;AAC7C,aAAK,YAAY,GAAG,OAAO,aAAa,CAAC;AACzC,aAAK,WAAW,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;AAExC,aAAK,WAAW,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEjD,UAAU,eAAgB,SAAQ,KAAK,CAAC,qBAAqB,CAAC,QAAQ,CAAC;IACrE,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC;IAC/B,IAAI,CAAC,EAAE,cAAc,GAAG,GAAG,CAAC,OAAO,CAAC;IACpC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"Button.d.ts","sourceRoot":"","sources":["../src/Button.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAGnE,QAAA,MAAM,YAAY,uFAQR,CAAC;AACX,aAAK,WAAW,GAAG,OAAO,YAAY,CAAC;AACvC,aAAK,UAAU,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;AAEtC,QAAA,MAAM,aAAa,wBAAyB,CAAC;AAC7C,aAAK,YAAY,GAAG,OAAO,aAAa,CAAC;AACzC,aAAK,WAAW,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;AAExC,aAAK,WAAW,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEjD,UAAU,eAAgB,SAAQ,KAAK,CAAC,qBAAqB,CAAC,QAAQ,CAAC;IACrE,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC;IAC/B,IAAI,CAAC,EAAE,cAAc,GAAG,GAAG,CAAC,OAAO,CAAC;IACpC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,aAAK,kBAAkB,GAAG,eAAe,GAAG;IAC1C,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,CAAC;AAEF,aAAK,2BAA2B,GAAG,eAAe,GAAG;IACnD,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,cAAc,GAAG,GAAG,CAAC,OAAO,CAAC;IACnC,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB,CAAC;AAEF,aAAK,wBAAwB,GAAG,eAAe,GAAG;IAChD,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,cAAc,GAAG,GAAG,CAAC,OAAO,CAAC;IACnC,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB,CAAC;AAmCF,QAAA,MAAM,MAAM,4wcAyGX,CAAC;AA+EF,eAAe,MAAM,CAAC"}
|
package/dist/Button.js
CHANGED
|
@@ -51,8 +51,12 @@ var Button = /*#__PURE__*/React.forwardRef((props, ref) => {
|
|
|
51
51
|
disabled,
|
|
52
52
|
active,
|
|
53
53
|
onClick,
|
|
54
|
+
onContextMenu,
|
|
54
55
|
onMouseDown,
|
|
55
56
|
onMouseUp,
|
|
57
|
+
onMouseEnter,
|
|
58
|
+
onMouseLeave,
|
|
59
|
+
onKeyDown,
|
|
56
60
|
className,
|
|
57
61
|
style,
|
|
58
62
|
children,
|
|
@@ -99,8 +103,12 @@ var Button = /*#__PURE__*/React.forwardRef((props, ref) => {
|
|
|
99
103
|
active
|
|
100
104
|
}, className),
|
|
101
105
|
onClick: onClick,
|
|
106
|
+
onContextMenu: onContextMenu,
|
|
102
107
|
onMouseUp: onMouseUp,
|
|
103
108
|
onMouseDown: onMouseDown,
|
|
109
|
+
onMouseEnter: onMouseEnter,
|
|
110
|
+
onMouseLeave: onMouseLeave,
|
|
111
|
+
onKeyDown: onKeyDown,
|
|
104
112
|
style: style,
|
|
105
113
|
disabled: disabled,
|
|
106
114
|
tabIndex: tabIndex,
|
|
@@ -169,8 +177,12 @@ Button.propTypes = {
|
|
|
169
177
|
return null;
|
|
170
178
|
},
|
|
171
179
|
|
|
180
|
+
onContextMenu: PropTypes.func,
|
|
172
181
|
onMouseUp: PropTypes.func,
|
|
173
182
|
onMouseDown: PropTypes.func,
|
|
183
|
+
onMouseEnter: PropTypes.func,
|
|
184
|
+
onMouseLeave: PropTypes.func,
|
|
185
|
+
onKeyDown: PropTypes.func,
|
|
174
186
|
tabIndex: PropTypes.number,
|
|
175
187
|
children: PropTypes.node,
|
|
176
188
|
className: PropTypes.string,
|
|
@@ -180,8 +192,12 @@ Button.propTypes = {
|
|
|
180
192
|
Button.defaultProps = {
|
|
181
193
|
type: 'button',
|
|
182
194
|
onClick: undefined,
|
|
195
|
+
onContextMenu: undefined,
|
|
183
196
|
onMouseUp: undefined,
|
|
184
197
|
onMouseDown: undefined,
|
|
198
|
+
onMouseEnter: undefined,
|
|
199
|
+
onMouseLeave: undefined,
|
|
200
|
+
onKeyDown: undefined,
|
|
185
201
|
variant: undefined,
|
|
186
202
|
tooltip: undefined,
|
|
187
203
|
icon: undefined,
|
package/dist/Button.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Button.js","names":["React","PropTypes","classNames","FontAwesomeIcon","Tooltip","BUTTON_KINDS","VARIANT_KINDS","getClassName","kind","iconOnly","getVariantClasses","Button","forwardRef","props","ref","variant","type","tooltip","icon","disabled","active","onClick","onMouseDown","onMouseUp","className","style","children","tabIndex","dataTestId","ariaLabel","Boolean","btnClassName","variantClassName","iconElem","isValidElement","tooltipElem","undefined","ariaLabelString","button","displayName","propTypes","oneOf","isRequired","Error","iconName","bool","func","number","node","string","object","defaultProps"],"sources":["../src/Button.tsx"],"sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { IconDefinition } from '@fortawesome/fontawesome-svg-core';\nimport { Tooltip } from './popper';\n\nconst BUTTON_KINDS = [\n 'primary',\n 'secondary',\n 'tertiary',\n 'success',\n 'danger',\n 'inline',\n 'ghost',\n] as const;\ntype ButtonTuple = typeof BUTTON_KINDS;\ntype ButtonKind = ButtonTuple[number];\n\nconst VARIANT_KINDS = ['group-end'] as const;\ntype VariantTuple = typeof VARIANT_KINDS;\ntype VariantKind = VariantTuple[number];\n\ntype ButtonTypes = 'submit' | 'reset' | 'button';\n\ninterface BaseButtonProps extends React.ComponentPropsWithRef<'button'> {\n kind: ButtonKind;\n type?: ButtonTypes;\n variant?: VariantKind;\n tooltip?: string | JSX.Element;\n icon?: IconDefinition | JSX.Element;\n active?: boolean;\n 'data-testid'?: string;\n 'aria-label'?: string;\n}\n\ntype ButtonWithChildren = BaseButtonProps & {\n children: React.ReactNode;\n};\n\ntype IconOnlyButtonStringTooltip = BaseButtonProps & {\n tooltip: string;\n icon: IconDefinition | JSX.Element;\n children?: undefined;\n};\n\ntype IconOnlyButtonJsxTooltip = BaseButtonProps & {\n tooltip: JSX.Element;\n 'aria-label': string;\n icon: IconDefinition | JSX.Element;\n children?: undefined;\n};\n\ntype IconOnlyButton = IconOnlyButtonStringTooltip | IconOnlyButtonJsxTooltip;\n\ntype ButtonProps = IconOnlyButton | ButtonWithChildren;\n\nfunction getClassName(kind: ButtonKind, iconOnly: boolean): string {\n switch (kind) {\n case 'primary':\n return 'btn-primary';\n case 'secondary':\n return 'btn-outline-primary';\n case 'tertiary':\n return 'btn-secondary';\n case 'success':\n return 'btn-success';\n case 'danger':\n return 'btn-danger';\n case 'inline':\n return 'btn-inline';\n case 'ghost':\n return classNames('btn-link', {\n 'btn-link-icon': iconOnly,\n 'btn-link-icon-only': iconOnly,\n });\n }\n}\n\nfunction getVariantClasses(kind: VariantKind): string {\n switch (kind) {\n case 'group-end':\n return classNames('pl-2', 'pr-3');\n }\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n (props: ButtonProps, ref) => {\n const {\n kind,\n variant,\n type,\n tooltip,\n icon,\n disabled,\n active,\n onClick,\n onMouseDown,\n onMouseUp,\n className,\n style,\n children,\n tabIndex,\n 'data-testid': dataTestId,\n 'aria-label': ariaLabel,\n } = props;\n\n const iconOnly = Boolean(icon && children == null);\n const btnClassName = getClassName(kind, iconOnly);\n\n let variantClassName;\n if (variant) {\n variantClassName = getVariantClasses(variant);\n }\n\n let iconElem: JSX.Element | undefined;\n if (icon) {\n iconElem = React.isValidElement(icon) ? (\n icon\n ) : (\n <FontAwesomeIcon icon={icon as IconDefinition} />\n );\n }\n\n let tooltipElem: JSX.Element | undefined;\n if (tooltip !== undefined) {\n tooltipElem =\n typeof tooltip === 'string' ? <Tooltip>{tooltip}</Tooltip> : tooltip;\n }\n\n // use tooltip as arial-label for iconOnly buttons only\n // if tooltip is also a string and aria-label is not set\n let ariaLabelString = ariaLabel;\n if (\n ariaLabel === undefined &&\n iconOnly &&\n tooltip != null &&\n typeof tooltip === 'string'\n ) {\n ariaLabelString = tooltip;\n }\n\n const button = (\n <button\n data-testid={dataTestId}\n ref={ref}\n // eslint-disable-next-line react/button-has-type\n type={type}\n className={classNames(\n 'btn',\n btnClassName,\n variantClassName,\n { active },\n className\n )}\n onClick={onClick}\n onMouseUp={onMouseUp}\n onMouseDown={onMouseDown}\n style={style}\n disabled={disabled}\n tabIndex={tabIndex}\n aria-label={ariaLabelString}\n >\n {icon && iconElem}\n {children}\n {tooltip != null &&\n (disabled === undefined || !disabled) &&\n tooltipElem}\n </button>\n );\n\n // disabled buttons tooltips need a wrapped element to receive pointer events\n // https://jakearchibald.com/2017/events-and-disabled-form-fields/\n\n return disabled !== undefined && disabled ? (\n <span className=\"btn-disabled-wrapper\">\n {button}\n {tooltip !== undefined && tooltipElem}\n </span>\n ) : (\n button\n );\n }\n);\n\nButton.displayName = 'Button';\n\nButton.propTypes = {\n kind: PropTypes.oneOf(BUTTON_KINDS).isRequired,\n variant: PropTypes.oneOf(VARIANT_KINDS),\n type: PropTypes.oneOf<ButtonTypes>(['submit', 'reset', 'button']),\n tooltip(props) {\n const { tooltip, icon, children } = props;\n if (tooltip === undefined && icon != null && children == null) {\n return new Error('Tooltip is required for icon only buttons');\n }\n return null;\n },\n icon(props) {\n const { children, icon } = props;\n if (icon == null && children == null) {\n return new Error('Icon is required if no children are provided');\n }\n\n if (\n children == null &&\n !React.isValidElement(icon) &&\n (icon == null || icon.iconName === '' || icon.iconName == null)\n ) {\n return new Error(\n 'Icon must be react element or fontawesome IconDefinition'\n );\n }\n\n return null;\n },\n disabled: PropTypes.bool,\n active: PropTypes.bool,\n onClick(props) {\n const { onClick, type } = props;\n if (type === 'button' && typeof onClick !== 'function') {\n return new Error('type button requires an onClick function');\n }\n if (onClick !== undefined && typeof onClick !== 'function') {\n return new Error('onClick must be a function');\n }\n return null;\n },\n onMouseUp: PropTypes.func,\n onMouseDown: PropTypes.func,\n tabIndex: PropTypes.number,\n children: PropTypes.node,\n className: PropTypes.string,\n style: PropTypes.object,\n 'data-testid': PropTypes.string,\n};\n\nButton.defaultProps = {\n type: 'button',\n onClick: undefined,\n onMouseUp: undefined,\n onMouseDown: undefined,\n variant: undefined,\n tooltip: undefined,\n icon: undefined,\n disabled: false,\n active: undefined,\n tabIndex: undefined,\n children: undefined,\n className: undefined,\n style: {},\n 'data-testid': undefined,\n};\n\nexport default Button;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Button.js","names":["React","PropTypes","classNames","FontAwesomeIcon","Tooltip","BUTTON_KINDS","VARIANT_KINDS","getClassName","kind","iconOnly","getVariantClasses","Button","forwardRef","props","ref","variant","type","tooltip","icon","disabled","active","onClick","onContextMenu","onMouseDown","onMouseUp","onMouseEnter","onMouseLeave","onKeyDown","className","style","children","tabIndex","dataTestId","ariaLabel","Boolean","btnClassName","variantClassName","iconElem","isValidElement","tooltipElem","undefined","ariaLabelString","button","displayName","propTypes","oneOf","isRequired","Error","iconName","bool","func","number","node","string","object","defaultProps"],"sources":["../src/Button.tsx"],"sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { IconDefinition } from '@fortawesome/fontawesome-svg-core';\nimport { Tooltip } from './popper';\n\nconst BUTTON_KINDS = [\n 'primary',\n 'secondary',\n 'tertiary',\n 'success',\n 'danger',\n 'inline',\n 'ghost',\n] as const;\ntype ButtonTuple = typeof BUTTON_KINDS;\ntype ButtonKind = ButtonTuple[number];\n\nconst VARIANT_KINDS = ['group-end'] as const;\ntype VariantTuple = typeof VARIANT_KINDS;\ntype VariantKind = VariantTuple[number];\n\ntype ButtonTypes = 'submit' | 'reset' | 'button';\n\ninterface BaseButtonProps extends React.ComponentPropsWithRef<'button'> {\n kind: ButtonKind;\n type?: ButtonTypes;\n variant?: VariantKind;\n tooltip?: string | JSX.Element;\n icon?: IconDefinition | JSX.Element;\n active?: boolean;\n 'data-testid'?: string;\n}\n\ntype ButtonWithChildren = BaseButtonProps & {\n children: React.ReactNode;\n};\n\ntype IconOnlyButtonStringTooltip = BaseButtonProps & {\n tooltip: string;\n icon: IconDefinition | JSX.Element;\n children?: undefined;\n};\n\ntype IconOnlyButtonJsxTooltip = BaseButtonProps & {\n tooltip: JSX.Element;\n 'aria-label': string;\n icon: IconDefinition | JSX.Element;\n children?: undefined;\n};\n\ntype IconOnlyButton = IconOnlyButtonStringTooltip | IconOnlyButtonJsxTooltip;\n\ntype ButtonProps = IconOnlyButton | ButtonWithChildren;\n\nfunction getClassName(kind: ButtonKind, iconOnly: boolean): string {\n switch (kind) {\n case 'primary':\n return 'btn-primary';\n case 'secondary':\n return 'btn-outline-primary';\n case 'tertiary':\n return 'btn-secondary';\n case 'success':\n return 'btn-success';\n case 'danger':\n return 'btn-danger';\n case 'inline':\n return 'btn-inline';\n case 'ghost':\n return classNames('btn-link', {\n 'btn-link-icon': iconOnly,\n 'btn-link-icon-only': iconOnly,\n });\n }\n}\n\nfunction getVariantClasses(kind: VariantKind): string {\n switch (kind) {\n case 'group-end':\n return classNames('pl-2', 'pr-3');\n }\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n (props: ButtonProps, ref) => {\n const {\n kind,\n variant,\n type,\n tooltip,\n icon,\n disabled,\n active,\n onClick,\n onContextMenu,\n onMouseDown,\n onMouseUp,\n onMouseEnter,\n onMouseLeave,\n onKeyDown,\n className,\n style,\n children,\n tabIndex,\n 'data-testid': dataTestId,\n 'aria-label': ariaLabel,\n } = props;\n\n const iconOnly = Boolean(icon && children == null);\n const btnClassName = getClassName(kind, iconOnly);\n\n let variantClassName;\n if (variant) {\n variantClassName = getVariantClasses(variant);\n }\n\n let iconElem: JSX.Element | undefined;\n if (icon) {\n iconElem = React.isValidElement(icon) ? (\n icon\n ) : (\n <FontAwesomeIcon icon={icon as IconDefinition} />\n );\n }\n\n let tooltipElem: JSX.Element | undefined;\n if (tooltip !== undefined) {\n tooltipElem =\n typeof tooltip === 'string' ? <Tooltip>{tooltip}</Tooltip> : tooltip;\n }\n\n // use tooltip as arial-label for iconOnly buttons only\n // if tooltip is also a string and aria-label is not set\n let ariaLabelString = ariaLabel;\n if (\n ariaLabel === undefined &&\n iconOnly &&\n tooltip != null &&\n typeof tooltip === 'string'\n ) {\n ariaLabelString = tooltip;\n }\n\n const button = (\n <button\n data-testid={dataTestId}\n ref={ref}\n // eslint-disable-next-line react/button-has-type\n type={type}\n className={classNames(\n 'btn',\n btnClassName,\n variantClassName,\n { active },\n className\n )}\n onClick={onClick}\n onContextMenu={onContextMenu}\n onMouseUp={onMouseUp}\n onMouseDown={onMouseDown}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n onKeyDown={onKeyDown}\n style={style}\n disabled={disabled}\n tabIndex={tabIndex}\n aria-label={ariaLabelString}\n >\n {icon && iconElem}\n {children}\n {tooltip != null &&\n (disabled === undefined || !disabled) &&\n tooltipElem}\n </button>\n );\n\n // disabled buttons tooltips need a wrapped element to receive pointer events\n // https://jakearchibald.com/2017/events-and-disabled-form-fields/\n\n return disabled !== undefined && disabled ? (\n <span className=\"btn-disabled-wrapper\">\n {button}\n {tooltip !== undefined && tooltipElem}\n </span>\n ) : (\n button\n );\n }\n);\n\nButton.displayName = 'Button';\n\nButton.propTypes = {\n kind: PropTypes.oneOf(BUTTON_KINDS).isRequired,\n variant: PropTypes.oneOf(VARIANT_KINDS),\n type: PropTypes.oneOf<ButtonTypes>(['submit', 'reset', 'button']),\n tooltip(props) {\n const { tooltip, icon, children } = props;\n if (tooltip === undefined && icon != null && children == null) {\n return new Error('Tooltip is required for icon only buttons');\n }\n return null;\n },\n icon(props) {\n const { children, icon } = props;\n if (icon == null && children == null) {\n return new Error('Icon is required if no children are provided');\n }\n\n if (\n children == null &&\n !React.isValidElement(icon) &&\n (icon == null || icon.iconName === '' || icon.iconName == null)\n ) {\n return new Error(\n 'Icon must be react element or fontawesome IconDefinition'\n );\n }\n\n return null;\n },\n disabled: PropTypes.bool,\n active: PropTypes.bool,\n onClick(props) {\n const { onClick, type } = props;\n if (type === 'button' && typeof onClick !== 'function') {\n return new Error('type button requires an onClick function');\n }\n if (onClick !== undefined && typeof onClick !== 'function') {\n return new Error('onClick must be a function');\n }\n return null;\n },\n onContextMenu: PropTypes.func,\n onMouseUp: PropTypes.func,\n onMouseDown: PropTypes.func,\n onMouseEnter: PropTypes.func,\n onMouseLeave: PropTypes.func,\n onKeyDown: PropTypes.func,\n tabIndex: PropTypes.number,\n children: PropTypes.node,\n className: PropTypes.string,\n style: PropTypes.object,\n 'data-testid': PropTypes.string,\n};\n\nButton.defaultProps = {\n type: 'button',\n onClick: undefined,\n onContextMenu: undefined,\n onMouseUp: undefined,\n onMouseDown: undefined,\n onMouseEnter: undefined,\n onMouseLeave: undefined,\n onKeyDown: undefined,\n variant: undefined,\n tooltip: undefined,\n icon: undefined,\n disabled: false,\n active: undefined,\n tabIndex: undefined,\n children: undefined,\n className: undefined,\n style: {},\n 'data-testid': undefined,\n};\n\nexport default Button;\n"],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
interface EditableItemListProps {
|
|
2
|
+
export interface EditableItemListProps {
|
|
3
3
|
isInvalid?: boolean;
|
|
4
4
|
items: string[];
|
|
5
|
-
onDelete: (
|
|
5
|
+
onDelete: (items: string[]) => void;
|
|
6
6
|
onAdd: (item: string) => void;
|
|
7
7
|
validate?: (item: string) => Error | null;
|
|
8
8
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EditableItemList.d.ts","sourceRoot":"","sources":["../src/EditableItemList.tsx"],"names":[],"mappings":"AAAA,OAAO,KAMN,MAAM,OAAO,CAAC;AAOf,
|
|
1
|
+
{"version":3,"file":"EditableItemList.d.ts","sourceRoot":"","sources":["../src/EditableItemList.tsx"],"names":[],"mappings":"AAAA,OAAO,KAMN,MAAM,OAAO,CAAC;AAOf,MAAM,WAAW,qBAAqB;IACpC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACpC,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9B,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,KAAK,GAAG,IAAI,CAAC;CAC3C;AAGD,QAAA,MAAM,gBAAgB,UAAW,qBAAqB,KAAG,MAAM,YAmH9D,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
|
package/dist/EditableItemList.js
CHANGED
|
@@ -2,6 +2,7 @@ import React, { useCallback, useMemo, useState } from 'react';
|
|
|
2
2
|
import classNames from 'classnames';
|
|
3
3
|
import clamp from 'lodash.clamp';
|
|
4
4
|
import { vsAdd, vsTrash } from '@deephaven/icons';
|
|
5
|
+
import { RangeUtils } from '@deephaven/utils';
|
|
5
6
|
import { Button, ItemList } from "./index.js";
|
|
6
7
|
|
|
7
8
|
// Display a list of items with an input for adding new items, and Add/Delete buttons
|
|
@@ -14,20 +15,15 @@ var EditableItemList = props => {
|
|
|
14
15
|
validate = () => null
|
|
15
16
|
} = props;
|
|
16
17
|
var [inputError, setInputError] = useState(null);
|
|
17
|
-
var [
|
|
18
|
+
var [selectedRanges, setSelectedRanges] = useState([]);
|
|
18
19
|
var [value, setValue] = useState('');
|
|
19
|
-
var
|
|
20
|
-
|
|
20
|
+
var handleSelectionChange = useCallback(ranges => {
|
|
21
|
+
setSelectedRanges(ranges);
|
|
21
22
|
}, []);
|
|
22
23
|
var handleDelete = useCallback(() => {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
onDelete(items[selectedIndex]);
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
setSelectedIndex(newIndex === -1 ? undefined : newIndex);
|
|
30
|
-
}, [items, selectedIndex, onDelete]);
|
|
24
|
+
onDelete(RangeUtils.getItemsInRanges(items, selectedRanges));
|
|
25
|
+
setSelectedRanges([]);
|
|
26
|
+
}, [items, selectedRanges, onDelete]);
|
|
31
27
|
var handleAdd = useCallback(() => {
|
|
32
28
|
if (value === '') {
|
|
33
29
|
return;
|
|
@@ -50,14 +46,13 @@ var EditableItemList = props => {
|
|
|
50
46
|
setInputError(inputValue === '' ? null : validate(inputValue));
|
|
51
47
|
}, [validate]);
|
|
52
48
|
var handleInputFocus = useCallback(() => {
|
|
53
|
-
|
|
49
|
+
setSelectedRanges([]);
|
|
54
50
|
}, []);
|
|
55
51
|
var handleInputKeyDown = useCallback(event => {
|
|
56
52
|
if (event.key === 'Enter') {
|
|
57
53
|
handleAdd();
|
|
58
54
|
}
|
|
59
55
|
}, [handleAdd]);
|
|
60
|
-
var selectedRanges = useMemo(() => selectedIndex === undefined ? [] : [[selectedIndex, selectedIndex]], [selectedIndex]);
|
|
61
56
|
var containerHeight = useMemo(() => 14 + clamp(items.length, 1, 6) * ItemList.DEFAULT_ROW_HEIGHT, [items.length]);
|
|
62
57
|
return /*#__PURE__*/React.createElement("div", {
|
|
63
58
|
className: classNames('editable-item-list-container', {
|
|
@@ -71,11 +66,12 @@ var EditableItemList = props => {
|
|
|
71
66
|
itemCount: items.length,
|
|
72
67
|
items: items.map((item, index) => ({
|
|
73
68
|
value: item,
|
|
74
|
-
isSelected: index
|
|
69
|
+
isSelected: RangeUtils.isSelected(selectedRanges, index)
|
|
75
70
|
})),
|
|
76
71
|
offset: 0,
|
|
77
|
-
|
|
78
|
-
|
|
72
|
+
selectedRanges: selectedRanges,
|
|
73
|
+
onSelectionChange: handleSelectionChange,
|
|
74
|
+
isMultiSelect: true
|
|
79
75
|
})), /*#__PURE__*/React.createElement("div", {
|
|
80
76
|
className: "d-flex flex-row pt-2"
|
|
81
77
|
}, /*#__PURE__*/React.createElement("div", {
|
|
@@ -102,9 +98,9 @@ var EditableItemList = props => {
|
|
|
102
98
|
}), /*#__PURE__*/React.createElement(Button, {
|
|
103
99
|
kind: "ghost",
|
|
104
100
|
onClick: handleDelete,
|
|
105
|
-
disabled:
|
|
101
|
+
disabled: selectedRanges.length === 0,
|
|
106
102
|
icon: vsTrash,
|
|
107
|
-
tooltip: "Delete selected
|
|
103
|
+
tooltip: "Delete selected items",
|
|
108
104
|
"data-testid": "delete-item-button"
|
|
109
105
|
}))));
|
|
110
106
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EditableItemList.js","names":["React","useCallback","useMemo","useState","classNames","clamp","vsAdd","vsTrash","Button","ItemList","EditableItemList","props","isInvalid","items","onAdd","undefined","onDelete","validate","inputError","setInputError","
|
|
1
|
+
{"version":3,"file":"EditableItemList.js","names":["React","useCallback","useMemo","useState","classNames","clamp","vsAdd","vsTrash","RangeUtils","Button","ItemList","EditableItemList","props","isInvalid","items","onAdd","undefined","onDelete","validate","inputError","setInputError","selectedRanges","setSelectedRanges","value","setValue","handleSelectionChange","ranges","handleDelete","getItemsInRanges","handleAdd","validationError","handleInputChange","event","inputValue","target","handleInputFocus","handleInputKeyDown","key","containerHeight","length","DEFAULT_ROW_HEIGHT","height","map","item","index","isSelected"],"sources":["../src/EditableItemList.tsx"],"sourcesContent":["import React, {\n ChangeEvent,\n KeyboardEvent,\n useCallback,\n useMemo,\n useState,\n} from 'react';\nimport classNames from 'classnames';\nimport clamp from 'lodash.clamp';\nimport { vsAdd, vsTrash } from '@deephaven/icons';\nimport { Range, RangeUtils } from '@deephaven/utils';\nimport { Button, ItemList } from '.';\n\nexport interface EditableItemListProps {\n isInvalid?: boolean;\n items: string[];\n onDelete: (items: string[]) => void;\n onAdd: (item: string) => void;\n validate?: (item: string) => Error | null;\n}\n\n// Display a list of items with an input for adding new items, and Add/Delete buttons\nconst EditableItemList = (props: EditableItemListProps): React.ReactElement => {\n const {\n isInvalid = false,\n items,\n onAdd = () => undefined,\n onDelete = () => undefined,\n validate = () => null,\n } = props;\n const [inputError, setInputError] = useState<Error | null>(null);\n const [selectedRanges, setSelectedRanges] = useState<Range[]>([]);\n const [value, setValue] = useState('');\n\n const handleSelectionChange = useCallback((ranges: Range[]) => {\n setSelectedRanges(ranges);\n }, []);\n\n const handleDelete = useCallback(() => {\n onDelete(RangeUtils.getItemsInRanges(items, selectedRanges));\n setSelectedRanges([]);\n }, [items, selectedRanges, onDelete]);\n\n const handleAdd = useCallback(() => {\n if (value === '') {\n return;\n }\n const validationError = validate(value);\n if (validationError == null) {\n onAdd(value);\n setValue('');\n } else {\n setInputError(validationError);\n }\n }, [value, onAdd, validate]);\n\n const handleInputChange = useCallback(\n (event: ChangeEvent<HTMLInputElement>) => {\n const { value: inputValue } = event.target;\n setValue(inputValue);\n setInputError(inputValue === '' ? null : validate(inputValue));\n },\n [validate]\n );\n\n const handleInputFocus = useCallback(() => {\n setSelectedRanges([]);\n }, []);\n\n const handleInputKeyDown = useCallback(\n (event: KeyboardEvent) => {\n if (event.key === 'Enter') {\n handleAdd();\n }\n },\n [handleAdd]\n );\n\n const containerHeight = useMemo(\n (): number => 14 + clamp(items.length, 1, 6) * ItemList.DEFAULT_ROW_HEIGHT,\n [items.length]\n );\n\n return (\n <div\n className={classNames('editable-item-list-container', {\n 'is-invalid': isInvalid,\n })}\n >\n <div style={{ height: containerHeight }}>\n <ItemList\n itemCount={items.length}\n items={items.map((item, index) => ({\n value: item,\n isSelected: RangeUtils.isSelected(selectedRanges, index),\n }))}\n offset={0}\n selectedRanges={selectedRanges}\n onSelectionChange={handleSelectionChange}\n isMultiSelect\n />\n </div>\n <div className=\"d-flex flex-row pt-2\">\n <div className=\"d-flex flex-grow-1\">\n <input\n className={classNames('form-control', {\n 'is-invalid': inputError != null,\n })}\n placeholder=\"Enter value\"\n type=\"text\"\n value={value}\n onChange={handleInputChange}\n onFocus={handleInputFocus}\n onKeyDown={handleInputKeyDown}\n />\n </div>\n <div className=\"d-flex align-items-start mt-1 ml-2\">\n <Button\n kind=\"ghost\"\n onClick={handleAdd}\n disabled={inputError != null || value === ''}\n icon={vsAdd}\n tooltip=\"Add new item\"\n data-testid=\"add-item-button\"\n />\n <Button\n kind=\"ghost\"\n onClick={handleDelete}\n disabled={selectedRanges.length === 0}\n icon={vsTrash}\n tooltip=\"Delete selected items\"\n data-testid=\"delete-item-button\"\n />\n </div>\n </div>\n </div>\n );\n};\n\nexport default EditableItemList;\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@deephaven/components",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.22.1-beta.0+c2f10a3",
|
|
4
4
|
"description": "Deephaven React component library",
|
|
5
5
|
"author": "Deephaven Data Labs LLC",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -19,22 +19,14 @@
|
|
|
19
19
|
},
|
|
20
20
|
"scripts": {
|
|
21
21
|
"build": "cross-env NODE_ENV=production run-p build:*",
|
|
22
|
-
"build
|
|
23
|
-
"
|
|
24
|
-
"sass": "sass --embed-sources --load-path=../../node_modules ./src:./dist ./scss/BaseStyleSheet.scss:./css/BaseStyleSheet.css",
|
|
25
|
-
"build:babel": "npm run babel",
|
|
26
|
-
"build:sass": "npm run sass",
|
|
27
|
-
"watch": "run-p watch:*",
|
|
28
|
-
"watch:babel": "npm run babel -- -w --skip-initial-build",
|
|
29
|
-
"watch:sass": "npm run sass -- --watch --update",
|
|
30
|
-
"prestart": "npm run build-dev",
|
|
31
|
-
"start": "cross-env NODE_ENV=development npm run watch"
|
|
22
|
+
"build:babel": "babel ./src --out-dir ./dist --extensions \".ts,.tsx,.js,.jsx\" --source-maps --root-mode upward",
|
|
23
|
+
"build:sass": "sass --embed-sources --load-path=../../node_modules ./src:./dist ./scss/BaseStyleSheet.scss:./css/BaseStyleSheet.css"
|
|
32
24
|
},
|
|
33
25
|
"dependencies": {
|
|
34
|
-
"@deephaven/icons": "^0.
|
|
35
|
-
"@deephaven/log": "^0.
|
|
36
|
-
"@deephaven/react-hooks": "^0.
|
|
37
|
-
"@deephaven/utils": "^0.
|
|
26
|
+
"@deephaven/icons": "^0.22.1-beta.0+c2f10a3",
|
|
27
|
+
"@deephaven/log": "^0.22.1-beta.0+c2f10a3",
|
|
28
|
+
"@deephaven/react-hooks": "^0.22.1-beta.0+c2f10a3",
|
|
29
|
+
"@deephaven/utils": "^0.22.1-beta.0+c2f10a3",
|
|
38
30
|
"@fortawesome/fontawesome-svg-core": "^6.1.1",
|
|
39
31
|
"@fortawesome/react-fontawesome": "^0.1.18",
|
|
40
32
|
"bootstrap": "4.6.2",
|
|
@@ -57,8 +49,8 @@
|
|
|
57
49
|
"react-dom": "^17.x"
|
|
58
50
|
},
|
|
59
51
|
"devDependencies": {
|
|
60
|
-
"@deephaven/mocks": "^0.
|
|
61
|
-
"@deephaven/tsconfig": "^0.
|
|
52
|
+
"@deephaven/mocks": "^0.22.1-beta.0+c2f10a3",
|
|
53
|
+
"@deephaven/tsconfig": "^0.22.1-beta.0+c2f10a3"
|
|
62
54
|
},
|
|
63
55
|
"files": [
|
|
64
56
|
"dist",
|
|
@@ -71,5 +63,5 @@
|
|
|
71
63
|
"publishConfig": {
|
|
72
64
|
"access": "public"
|
|
73
65
|
},
|
|
74
|
-
"gitHead": "
|
|
66
|
+
"gitHead": "c2f10a395058a78c527eb9e0e9750411279eebd2"
|
|
75
67
|
}
|