@homebound/beam 2.211.0 → 2.212.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Chip = exports.ChipTypes = void 0;
4
4
  const jsx_runtime_1 = require("@emotion/react/jsx-runtime");
5
5
  const PresentationContext_1 = require("./PresentationContext");
6
+ const Tooltip_1 = require("./Tooltip");
6
7
  const Css_1 = require("../Css");
7
8
  const useTestIds_1 = require("../utils/useTestIds");
8
9
  // exporting for using in type prop as constant - this could be moved and become a global list for colors
@@ -17,13 +18,17 @@ exports.ChipTypes = {
17
18
  /** Kinda like a chip, but read-only, so no `onClick` or `hover`. */
18
19
  function Chip({ type = exports.ChipTypes.neutral, ...props }) {
19
20
  const { fieldProps } = (0, PresentationContext_1.usePresentationContext)();
20
- const { text, title = text, xss = {}, compact = fieldProps === null || fieldProps === void 0 ? void 0 : fieldProps.compact } = props;
21
+ const { text, title, xss = {}, compact = fieldProps === null || fieldProps === void 0 ? void 0 : fieldProps.compact } = props;
21
22
  const tid = (0, useTestIds_1.useTestIds)(props, "chip");
22
- return ((0, jsx_runtime_1.jsx)("span", Object.assign({ css: {
23
- ...Css_1.Css[compact ? "xs" : "sm"].dif.aic.br16.pl1.px1.pyPx(2).gray900.$,
24
- ...typeStyles[type],
25
- ...xss,
26
- } }, tid, { title: title }, { children: (0, jsx_runtime_1.jsx)("span", Object.assign({ css: Css_1.Css.lineClamp1.breakAll.$ }, { children: text }), void 0) }), void 0));
23
+ return (0, Tooltip_1.maybeTooltip)({
24
+ title,
25
+ placement: "top",
26
+ children: ((0, jsx_runtime_1.jsx)("span", Object.assign({ css: {
27
+ ...Css_1.Css[compact ? "xs" : "sm"].dif.aic.br16.pl1.px1.pyPx(2).gray900.$,
28
+ ...typeStyles[type],
29
+ ...xss,
30
+ } }, tid, { children: (0, jsx_runtime_1.jsx)("span", Object.assign({ css: Css_1.Css.lineClamp1.breakAll.$ }, { children: text }), void 0) }), void 0)),
31
+ });
27
32
  }
28
33
  exports.Chip = Chip;
29
34
  const typeStyles = {
@@ -0,0 +1,12 @@
1
+ import { Filter } from "./types";
2
+ import { NumberFieldType } from "../../inputs/NumberField";
3
+ export declare type NumberRangeFilterProps<DV extends NumberRangeFilterValue> = {
4
+ label: string;
5
+ numberFieldType?: NumberFieldType;
6
+ defaultValue?: DV;
7
+ };
8
+ export declare type NumberRangeFilterValue = {
9
+ min: number;
10
+ max: number;
11
+ };
12
+ export declare function numberRangeFilter(props: NumberRangeFilterProps<NumberRangeFilterValue>): (key: string) => Filter<NumberRangeFilterValue>;
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.numberRangeFilter = void 0;
4
+ const jsx_runtime_1 = require("@emotion/react/jsx-runtime");
5
+ const BaseFilter_1 = require("./BaseFilter");
6
+ const CompoundField_1 = require("../internal/CompoundField");
7
+ const Label_1 = require("../Label");
8
+ const defaultTestId_1 = require("../../utils/defaultTestId");
9
+ const Css_1 = require("../../Css");
10
+ const NumberField_1 = require("../../inputs/NumberField");
11
+ function numberRangeFilter(props) {
12
+ return (key) => new NumberRangeFilter(key, props);
13
+ }
14
+ exports.numberRangeFilter = numberRangeFilter;
15
+ class NumberRangeFilter extends BaseFilter_1.BaseFilter {
16
+ render(value, setValue, tid, inModal, vertical) {
17
+ var _a, _b;
18
+ const { label, numberFieldType } = this.props;
19
+ const min = (_a = value === null || value === void 0 ? void 0 : value.min) !== null && _a !== void 0 ? _a : undefined;
20
+ const max = (_b = value === null || value === void 0 ? void 0 : value.max) !== null && _b !== void 0 ? _b : undefined;
21
+ return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [vertical && ((0, jsx_runtime_1.jsxs)("div", Object.assign({}, tid, { children: [(0, jsx_runtime_1.jsx)(Label_1.Label, { label: label }, void 0), (0, jsx_runtime_1.jsx)("div", Object.assign({ css: Css_1.Css.pb1.$ }, { children: (0, jsx_runtime_1.jsx)(NumberField_1.NumberField, Object.assign({ inlineLabel: true, clearable: true, label: "Min", value: min, type: numberFieldType, onChange: (minVal) => {
22
+ const maxValue = max ? { max } : {};
23
+ setValue(minVal || max ? { min: minVal, ...maxValue } : undefined);
24
+ } }, tid[`${(0, defaultTestId_1.defaultTestId)(label)}_min_vertical`]), void 0) }), void 0), (0, jsx_runtime_1.jsx)(NumberField_1.NumberField, Object.assign({ inlineLabel: true, clearable: true, label: "Max", value: max, type: numberFieldType, onChange: (maxVal) => {
25
+ const minValue = min ? { min } : {};
26
+ setValue(maxVal || min ? { max: maxVal, ...minValue } : undefined);
27
+ } }, tid[`${(0, defaultTestId_1.defaultTestId)(label)}_max_vertical`]), void 0)] }), void 0)), !vertical && ((0, jsx_runtime_1.jsxs)(CompoundField_1.CompoundField, Object.assign({}, tid, { children: [(0, jsx_runtime_1.jsx)(NumberField_1.NumberField, Object.assign({ compact: true, sizeToContent: !inModal, inlineLabel: true, clearable: true,
28
+ // When in horizontal view, we combine the filter label with the min / max labels as all filter labels are displayed inline
29
+ label: !inModal ? `${label} Min` : "Min", value: min, type: numberFieldType, onChange: (minVal) => {
30
+ const maxValue = max ? { max } : {};
31
+ setValue(minVal || max ? { min: minVal, ...maxValue } : undefined);
32
+ } }, tid[`${(0, defaultTestId_1.defaultTestId)(label)}_min`]), void 0), (0, jsx_runtime_1.jsx)(NumberField_1.NumberField, Object.assign({ compact: true, sizeToContent: !inModal, inlineLabel: true, clearable: true, label: !inModal ? `${label} Max` : "Max", value: max, type: numberFieldType, onChange: (maxVal) => {
33
+ const minValue = min ? { min } : {};
34
+ setValue(maxVal || min ? { max: maxVal, ...minValue } : undefined);
35
+ } }, tid[`${(0, defaultTestId_1.defaultTestId)(label)}_max`]), void 0)] }), void 0))] }, void 0));
36
+ }
37
+ }
@@ -2,6 +2,7 @@ export { dateFilter } from "./DateFilter";
2
2
  export type { DateFilterValue } from "./DateFilter";
3
3
  export { dateRangeFilter } from "./DateRangeFilter";
4
4
  export type { DateRangeFilterValue } from "./DateRangeFilter";
5
+ export { numberRangeFilter } from "./NumberRangeFilter";
5
6
  export { multiFilter } from "./MultiFilter";
6
7
  export { singleFilter } from "./SingleFilter";
7
8
  export { booleanFilter } from "./BooleanFilter";
@@ -10,11 +10,13 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
10
10
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
11
11
  };
12
12
  Object.defineProperty(exports, "__esModule", { value: true });
13
- exports.toggleFilter = exports.booleanFilter = exports.singleFilter = exports.multiFilter = exports.dateRangeFilter = exports.dateFilter = void 0;
13
+ exports.toggleFilter = exports.booleanFilter = exports.singleFilter = exports.multiFilter = exports.numberRangeFilter = exports.dateRangeFilter = exports.dateFilter = void 0;
14
14
  var DateFilter_1 = require("./DateFilter");
15
15
  Object.defineProperty(exports, "dateFilter", { enumerable: true, get: function () { return DateFilter_1.dateFilter; } });
16
16
  var DateRangeFilter_1 = require("./DateRangeFilter");
17
17
  Object.defineProperty(exports, "dateRangeFilter", { enumerable: true, get: function () { return DateRangeFilter_1.dateRangeFilter; } });
18
+ var NumberRangeFilter_1 = require("./NumberRangeFilter");
19
+ Object.defineProperty(exports, "numberRangeFilter", { enumerable: true, get: function () { return NumberRangeFilter_1.numberRangeFilter; } });
18
20
  var MultiFilter_1 = require("./MultiFilter");
19
21
  Object.defineProperty(exports, "multiFilter", { enumerable: true, get: function () { return MultiFilter_1.multiFilter; } });
20
22
  var SingleFilter_1 = require("./SingleFilter");
@@ -1,6 +1,7 @@
1
1
  import { DateFilterValue } from "./DateFilter";
2
2
  import { DateRangeFilterValue } from "./DateRangeFilter";
3
3
  import { FilterDefs } from "./types";
4
+ import { NumberRangeFilterValue } from "./NumberRangeFilter";
4
5
  export declare enum Stage {
5
6
  StageOne = "ONE",
6
7
  StageTwo = "TWO"
@@ -39,6 +40,7 @@ export declare type ProjectFilter = {
39
40
  doNotUse?: boolean | null;
40
41
  date?: DateFilterValue<string>;
41
42
  dateRange?: DateRangeFilterValue<string>;
43
+ numberRange?: NumberRangeFilterValue;
42
44
  };
43
45
  export declare type StageFilter = NonNullable<FilterDefs<ProjectFilter>["stage"]>;
44
46
  export declare type StageSingleFilter = NonNullable<FilterDefs<ProjectFilter>["stageSingle"]>;
@@ -33,6 +33,8 @@ export interface NumberFieldProps {
33
33
  useGrouping?: boolean;
34
34
  hideErrorMessage?: boolean;
35
35
  borderless?: boolean;
36
+ inlineLabel?: boolean;
37
+ sizeToContent?: boolean;
36
38
  }
37
39
  export declare function NumberField(props: NumberFieldProps): import("@emotion/react/jsx-runtime").JSX.Element;
38
40
  export declare function formatValue(value: number, factor: number, numFractionDigits: number | undefined, numIntegerDigits: number | undefined): number | undefined;
@@ -12,10 +12,11 @@ const Css_1 = require("../Css");
12
12
  const utils_1 = require("../utils");
13
13
  const TextFieldBase_1 = require("./TextFieldBase");
14
14
  function NumberField(props) {
15
+ var _a;
15
16
  // Determine default alignment based on presentation context
16
17
  const { fieldProps } = (0, PresentationContext_1.usePresentationContext)();
17
18
  const alignment = (fieldProps === null || fieldProps === void 0 ? void 0 : fieldProps.numberAlignment) === "right" ? Css_1.Css.tr.jcfe.$ : Css_1.Css.tl.jcfs.$;
18
- const { disabled, required, readOnly, type, label, onBlur, onFocus, errorMsg, helperText, value, onChange, xss, displayDirection = false, numFractionDigits = type === "dollars" ? 2 : undefined, truncate = false, onEnter, numberFormatOptions, numIntegerDigits, useGrouping = true, ...otherProps } = props;
19
+ const { disabled, required, readOnly, type, label, onBlur, onFocus, errorMsg, helperText, value, onChange, xss, displayDirection = false, numFractionDigits = type === "dollars" ? 2 : undefined, truncate = false, onEnter, numberFormatOptions, numIntegerDigits, useGrouping = true, sizeToContent = false, ...otherProps } = props;
19
20
  const isDisabled = !!disabled;
20
21
  const isReadOnly = !!readOnly;
21
22
  const factor = type === "percent" || type === "cents" ? 100 : type === "basisPoints" ? 10000 : 1;
@@ -85,7 +86,9 @@ function NumberField(props) {
85
86
  if (readOnly && !inputRef.current) {
86
87
  inputRef.current = document.createElement("input");
87
88
  }
88
- return ((0, jsx_runtime_1.jsx)(TextFieldBase_1.TextFieldBase, Object.assign({ xss: { ...alignment, ...xss }, groupProps: groupProps, labelProps: labelProps, label: label, required: required, inputProps: inputProps,
89
+ return ((0, jsx_runtime_1.jsx)(TextFieldBase_1.TextFieldBase, Object.assign({ xss: { ...alignment, ...xss }, groupProps: groupProps, labelProps: labelProps, label: label, required: required, inputProps: (0, react_aria_1.mergeProps)(inputProps, {
90
+ size: sizeToContent ? String((_a = inputProps.value) !== null && _a !== void 0 ? _a : "").length || 1 : undefined,
91
+ }),
89
92
  // This is called on each DOM change, to push the latest value into the field
90
93
  onChange: (rawInputValue) => {
91
94
  const parsedValue = numberParser.parse(rawInputValue || "");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@homebound/beam",
3
- "version": "2.211.0",
3
+ "version": "2.212.1",
4
4
  "author": "Homebound",
5
5
  "license": "MIT",
6
6
  "main": "dist/index.js",