@linzjs/step-ag-grid 2.2.1 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,10 @@
1
1
  /// <reference types="react" />
2
- export interface GridSubComponentTextAreaProps {
3
- setValue: (value: string) => void;
2
+ import { GridSubComponentProps } from "./gridForm/GridSubComponentProps";
3
+ export interface GridSubComponentTextAreaProps extends GridSubComponentProps {
4
+ placeholder?: string;
5
+ required?: boolean;
6
+ maxlength?: number;
7
+ width?: string | number;
8
+ validate: (value: string) => string | null;
4
9
  }
5
10
  export declare const GridSubComponentTextArea: (props: GridSubComponentTextAreaProps) => JSX.Element;
@@ -22,7 +22,7 @@ export declare const MenuHeaderItem: (title: string) => {
22
22
  };
23
23
  export declare type SelectOption<ValueType> = ValueType | FinalSelectOption<ValueType>;
24
24
  export interface GridFormPopoutDropDownProps<RowType extends GridBaseRow, ValueType> extends CellEditorCommon {
25
- className?: "GridPopoverEditDropDown-containerSmall" | "GridPopoverEditDropDown-containerMedium" | "GridPopoverEditDropDown-containerLarge" | string | undefined;
25
+ className?: "GridPopoverEditDropDown-containerSmall" | "GridPopoverEditDropDown-containerMedium" | "GridPopoverEditDropDown-containerLarge" | "GridPopoverEditDropDown-containerUnlimited" | string | undefined;
26
26
  filtered?: "local" | "reload";
27
27
  filterPlaceholder?: string;
28
28
  onSelectedItem?: (props: GridPopoutEditDropDownSelectedItem<RowType, ValueType>) => Promise<void>;
@@ -5,20 +5,19 @@ import { CellEditorCommon } from "../GridCell";
5
5
  interface MultiFinalSelectOption<ValueType> {
6
6
  value: ValueType;
7
7
  label?: JSX.Element | string;
8
- subComponent?: (props: any, ref: any) => any;
8
+ subComponent?: (props: any) => JSX.Element;
9
9
  }
10
10
  export declare type MultiSelectOption<ValueType> = ValueType | MultiFinalSelectOption<ValueType>;
11
- export interface MultiSelectResult<RowType> {
12
- selectedRows: RowType[];
13
- values: Record<string, any>;
11
+ export interface SelectedOptionResult<ValueType> extends MultiFinalSelectOption<ValueType> {
12
+ subValue: any;
14
13
  }
15
14
  export interface GridFormMultiSelectProps<RowType extends GridBaseRow, ValueType> extends CellEditorCommon {
16
- className?: "GridMultiSelect-containerSmall" | "GridMultiSelect-containerMedium" | "GridMultiSelect-containerLarge" | string | undefined;
15
+ className?: "GridMultiSelect-containerSmall" | "GridMultiSelect-containerMedium" | "GridMultiSelect-containerLarge" | "GridMultiSelect-containerUnlimited" | string | undefined;
17
16
  filtered?: boolean;
18
17
  filterPlaceholder?: string;
19
- onSave?: (props: MultiSelectResult<RowType>) => Promise<boolean>;
18
+ onSave?: (selectedRows: RowType[], selectedOptions: SelectedOptionResult<ValueType>[]) => Promise<boolean>;
20
19
  options: MultiSelectOption<ValueType>[] | ((selectedRows: RowType[]) => Promise<MultiSelectOption<ValueType>[]> | MultiSelectOption<ValueType>[]);
21
- initialSelectedValues?: (selectedRows: RowType[]) => any[];
20
+ initialSelectedValues?: (selectedRows: RowType[]) => any[] | Record<string, any>;
22
21
  }
23
22
  export declare const GridFormMultiSelect: <RowType extends GridBaseRow, ValueType>(props: GridFormMultiSelectProps<RowType, ValueType>) => JSX.Element;
24
23
  export {};
@@ -0,0 +1,6 @@
1
+ export interface GridSubComponentProps {
2
+ value: string;
3
+ setValue: (value: string) => void;
4
+ setValid: (valid: boolean) => void;
5
+ triggerSave: () => Promise<void>;
6
+ }
@@ -9,5 +9,6 @@ export interface LuiTextInputProps {
9
9
  value: string;
10
10
  placeholder?: string;
11
11
  formatted?: string;
12
+ onMouseEnter?: (e: React.MouseEvent<HTMLTextAreaElement>) => void;
12
13
  }
13
14
  export declare const TextInputFormatted: (props: LuiTextInputProps) => JSX.Element;
@@ -1,6 +1,6 @@
1
1
  import { useMemo, useLayoutEffect, useEffect, createContext, memo, forwardRef, useRef, useContext, useState, useCallback, useReducer, cloneElement, useImperativeHandle, Fragment } from 'react';
2
2
  import { unstable_batchedUpdates, flushSync, createPortal } from 'react-dom';
3
- import { findIndex, isEmpty, castArray, remove, flatten, delay, sortBy, last, difference, xorBy, fromPairs } from 'lodash-es';
3
+ import { findIndex, isEmpty, castArray, remove, flatten, delay, sortBy, last, difference, xorBy, pickBy, pick } from 'lodash-es';
4
4
  import { jsx, jsxs, Fragment as Fragment$1 } from 'react/jsx-runtime';
5
5
  import { AgGridReact } from 'ag-grid-react';
6
6
  import { LuiMiniSpinner, LuiIcon, LuiCheckboxInput, LuiButton } from '@linzjs/lui';
@@ -2708,7 +2708,11 @@ var useGridPopoverHook = function (props) {
2708
2708
  });
2709
2709
  }); }, [props, stopEditing, propsRef]);
2710
2710
  var popoverWrapper = useCallback(function (children) {
2711
- return (jsx(Fragment$1, { children: anchorRef.current && (jsxs(ControlledMenu, __assign({ state: isOpen ? "open" : "closed", portal: true, unmountOnClose: true, anchorRef: anchorRef, saveButtonRef: saveButtonRef, menuClassName: "step-ag-grid-react-menu", onClose: function (event) { return triggerSave(event.reason).then(); }, viewScroll: "auto", dontShrinkIfDirectionIsTop: true, className: props.className, closeMenuExclusionClassName: "ReactModal__Content" }, { children: [saving && ( // This is the overlay that prevents editing when the editor is saving
2711
+ return (jsx(Fragment$1, { children: anchorRef.current && (jsxs(ControlledMenu, __assign({ state: isOpen ? "open" : "closed", portal: true, unmountOnClose: true, anchorRef: anchorRef, saveButtonRef: saveButtonRef, menuClassName: "step-ag-grid-react-menu", onClose: function (event) {
2712
+ if (event.reason === "blur")
2713
+ return;
2714
+ triggerSave(event.reason).then();
2715
+ }, viewScroll: "auto", dontShrinkIfDirectionIsTop: true, className: props.className, closeMenuExclusionClassName: "ReactModal__Content" }, { children: [saving && ( // This is the overlay that prevents editing when the editor is saving
2712
2716
  jsx("div", { style: {
2713
2717
  position: "absolute",
2714
2718
  left: 0,
@@ -2996,27 +3000,39 @@ var GridFormDropDown = function (_props) {
2996
3000
 
2997
3001
  var GridFormMultiSelect = function (props) {
2998
3002
  var selectedRows = props.selectedRows;
2999
- var _a = useState(""), filter = _a[0], setFilter = _a[1];
3000
- var _b = useState([]), filteredValues = _b[0], setFilteredValues = _b[1];
3003
+ var initialiseValues = useMemo(function () { return props.initialSelectedValues && props.initialSelectedValues(selectedRows); }, [props, selectedRows]);
3004
+ var subComponentIsValid = useRef({});
3005
+ var _a = useState(initialiseValues && !Array.isArray(initialiseValues)
3006
+ ? pickBy(initialiseValues, function (value) { return typeof value !== "boolean"; })
3007
+ : {}), subSelectedValues = _a[0], setSubSelectedValues = _a[1];
3008
+ var _b = useState(function () {
3009
+ return initialiseValues ? (Array.isArray(initialiseValues) ? initialiseValues : Object.keys(initialiseValues)) : [];
3010
+ }), selectedValues = _b[0], setSelectedValues = _b[1];
3011
+ var _c = useState(""), filter = _c[0], setFilter = _c[1];
3012
+ var _d = useState([]), filteredValues = _d[0], setFilteredValues = _d[1];
3001
3013
  var optionsInitialising = useRef(false);
3002
- var _c = useState(), options = _c[0], setOptions = _c[1];
3003
- var subSelectedValues = useRef({});
3004
- var _d = useState(function () {
3005
- return props.initialSelectedValues ? props.initialSelectedValues(selectedRows) : [];
3006
- }), selectedValues = _d[0], setSelectedValues = _d[1];
3014
+ var _e = useState(), options = _e[0], setOptions = _e[1];
3007
3015
  var save = useCallback(function (selectedRows) { return __awaiter(void 0, void 0, void 0, function () {
3008
- var values;
3009
- return __generator(this, function (_a) {
3010
- switch (_a.label) {
3016
+ var validations, notValid, selectedOptions, selectedResults;
3017
+ var _a;
3018
+ return __generator(this, function (_b) {
3019
+ switch (_b.label) {
3011
3020
  case 0:
3012
- values = fromPairs(selectedValues.map(function (value) { var _a; return [value, (_a = subSelectedValues.current[value]) !== null && _a !== void 0 ? _a : true]; }));
3013
3021
  if (!props.onSave) return [3 /*break*/, 2];
3014
- return [4 /*yield*/, props.onSave({ selectedRows: selectedRows, values: values })];
3015
- case 1: return [2 /*return*/, _a.sent()];
3022
+ validations = pick(subComponentIsValid.current, selectedValues);
3023
+ notValid = Object.values(validations).some(function (v) { return !v; });
3024
+ if (notValid)
3025
+ return [2 /*return*/, false];
3026
+ selectedOptions = (_a = selectedValues.map(function (row) { return (options !== null && options !== void 0 ? options : []).find(function (opt) { return opt.value == row; }); })) !== null && _a !== void 0 ? _a : [];
3027
+ selectedResults = selectedOptions.map(function (selectedOption) {
3028
+ return (__assign(__assign({}, selectedOption), { subValue: subSelectedValues["".concat(selectedOption === null || selectedOption === void 0 ? void 0 : selectedOption.value)] }));
3029
+ });
3030
+ return [4 /*yield*/, props.onSave(selectedRows, selectedResults)];
3031
+ case 1: return [2 /*return*/, _b.sent()];
3016
3032
  case 2: return [2 /*return*/, true];
3017
3033
  }
3018
3034
  });
3019
- }); }, [props, selectedValues]);
3035
+ }); }, [options, props, selectedValues, subSelectedValues]);
3020
3036
  // Load up options list if it's async function
3021
3037
  useEffect(function () {
3022
3038
  var _a;
@@ -3069,7 +3085,7 @@ var GridFormMultiSelect = function (props) {
3069
3085
  })
3070
3086
  .filter(function (r) { return r !== undefined; }));
3071
3087
  }, [props.filtered, filter, options]);
3072
- var _e = useGridPopoverHook({ className: props.className, save: save }), popoverWrapper = _e.popoverWrapper, triggerSave = _e.triggerSave;
3088
+ var _f = useGridPopoverHook({ className: props.className, save: save }), popoverWrapper = _f.popoverWrapper, triggerSave = _f.triggerSave;
3073
3089
  return popoverWrapper(jsx(ComponentLoadingWrapper, __assign({ loading: !options, className: "GridFormMultiSelect-container" }, { children: jsxs(Fragment$1, { children: [options && props.filtered && (jsxs(Fragment$1, { children: [jsx(FocusableItem, __assign({ className: "filter-item" }, { children: function (_a) {
3074
3090
  var _b;
3075
3091
  var ref = _a.ref;
@@ -3111,16 +3127,23 @@ var GridFormMultiSelect = function (props) {
3111
3127
  } }) }), "".concat(index)), selectedValues.includes(item.value) && item.subComponent && (jsx(FocusableItem, __assign({ className: "LuiDeprecatedForms" }, { children: function (ref) {
3112
3128
  return item.subComponent &&
3113
3129
  item.subComponent({
3130
+ ref: ref,
3131
+ value: subSelectedValues["".concat(item.value)],
3114
3132
  setValue: function (value) {
3115
- subSelectedValues.current[item.value] = value;
3116
- }
3117
- }, ref);
3133
+ subSelectedValues["".concat(item.value)] = value;
3134
+ setSubSelectedValues(__assign({}, subSelectedValues));
3135
+ },
3136
+ setValid: function (valid) {
3137
+ subComponentIsValid.current["".concat(item.value)] = valid;
3138
+ },
3139
+ triggerSave: triggerSave
3140
+ });
3118
3141
  } }), "".concat(item.value, "_subcomponent")))] }, "".concat(index)));
3119
3142
  }) }))] }) })));
3120
3143
  };
3121
3144
 
3122
3145
  var GridPopoutEditMultiSelect = function (colDef, props) {
3123
- return GridCell(__assign({ initialWidth: 65, maxWidth: 150 }, colDef), __assign(__assign({ editor: GridFormMultiSelect }, props), { editorParams: __assign({ className: "GridMultiSelect-containerMedium" }, props.editorParams) }));
3146
+ return GridCell(colDef, __assign(__assign({ editor: GridFormMultiSelect }, props), { editorParams: __assign({ className: "GridMultiSelect-containerMedium" }, props.editorParams) }));
3124
3147
  };
3125
3148
 
3126
3149
  var css_248z$3 = ".GridPopoutMenu-burger{cursor:pointer}.GridPopoutMenu-burger svg{fill:#007198}.GridPopoutMenu-burgerDisabled svg{fill:#989189}";
@@ -3294,7 +3317,7 @@ var css_248z$1 = ".LuiTextInput{margin-bottom:0}.LuiTextInput-formatted{color:#b
3294
3317
  styleInject(css_248z$1);
3295
3318
 
3296
3319
  var TextInputFormatted = function (props) {
3297
- return (jsxs("div", __assign({ className: clsx("LuiTextInput Grid-popoverContainer", props.error && "hasError", props.warning && "hasWarning", props.className) }, { children: [jsxs("span", __assign({ className: "LuiTextInput-inputWrapper" }, { children: [jsx("input", __assign({ type: "text", className: "LuiTextInput-input", min: "0", value: props.value, onChange: props.onChange }, props.inputProps)), jsx("span", __assign({ className: "LuiTextInput-formatted" }, { children: props.formatted }))] })), props.error && (jsxs("span", __assign({ className: "LuiTextInput-error" }, { children: [jsx(LuiIcon, { alt: "error", name: "ic_error", className: "LuiTextInput-error-icon", size: "sm", status: "error" }), props.error] }))), props.warning && (jsxs("span", __assign({ className: "LuiTextInput-warning" }, { children: [jsx(LuiIcon, { alt: "warning", name: "ic_warning", className: "LuiTextInput-warning-icon", size: "sm", status: "warning" }), props.warning] })))] })));
3320
+ return (jsxs("div", __assign({ className: clsx("LuiTextInput Grid-popoverContainer", props.error && "hasError", props.warning && "hasWarning", props.className) }, { children: [jsxs("span", __assign({ className: "LuiTextInput-inputWrapper" }, { children: [jsx("input", __assign({ type: "text", className: "LuiTextInput-input", min: "0", spellCheck: true, defaultValue: props.value, onChange: props.onChange }, props.inputProps)), jsx("span", __assign({ className: "LuiTextInput-formatted" }, { children: props.formatted }))] })), props.error && (jsxs("span", __assign({ className: "LuiTextInput-error" }, { children: [jsx(LuiIcon, { alt: "error", name: "ic_error", className: "LuiTextInput-error-icon", size: "sm", status: "error" }), props.error] }))), props.warning && (jsxs("span", __assign({ className: "LuiTextInput-warning" }, { children: [jsx(LuiIcon, { alt: "warning", name: "ic_warning", className: "LuiTextInput-warning-icon", size: "sm", status: "warning" }), props.warning] })))] })));
3298
3321
  };
3299
3322
 
3300
3323
  var GridFormEditBearing = function (_props) {
@@ -3376,7 +3399,7 @@ var GridPopoverEditBearingCorrection = function (colDef, props) {
3376
3399
  };
3377
3400
 
3378
3401
  var GridPopoverEditDropDown = function (colDef, props) {
3379
- return GridCell(__assign({ initialWidth: 65, maxWidth: 150 }, colDef), __assign(__assign({ editor: GridFormDropDown }, props), { editorParams: __assign({
3402
+ return GridCell(colDef, __assign(__assign({ editor: GridFormDropDown }, props), { editorParams: __assign({
3380
3403
  // Defaults to medium size container
3381
3404
  className: "GridPopoverEditDropDown-containerMedium" }, props.editorParams) }));
3382
3405
  };
@@ -3404,7 +3427,7 @@ var GridFormMessage = function (_props) {
3404
3427
  };
3405
3428
 
3406
3429
  var GridPopoverMessage = function (colDef, props) {
3407
- return GridCell(__assign(__assign({ maxWidth: 140 }, colDef), { cellRendererParams: __assign({ singleClickEdit: true }, colDef.cellRendererParams) }), __assign({ editor: GridFormMessage }, props));
3430
+ return GridCell(__assign(__assign({}, colDef), { cellRendererParams: __assign({ singleClickEdit: true }, colDef.cellRendererParams) }), __assign({ editor: GridFormMessage }, props));
3408
3431
  };
3409
3432
 
3410
3433
  // Unique ID creation requires a high quality random # generator. In the browser we therefore
@@ -3525,9 +3548,7 @@ var GridFormTextArea = function (_props) {
3525
3548
  return popoverWrapper(jsx("div", __assign({ style: { display: "flex", flexDirection: "row", width: (_b = props.width) !== null && _b !== void 0 ? _b : 240 } }, { children: jsx(TextAreaInput, { value: value, onChange: function (e) { return setValue(e.target.value); }, error: invalid(), inputProps: { placeholder: props.placeholder } }) })));
3526
3549
  };
3527
3550
 
3528
- var GridPopoverTextArea = function (colDef, params) {
3529
- return GridCell(__assign({ maxWidth: 260 }, colDef), __assign({ editor: GridFormTextArea }, params));
3530
- };
3551
+ var GridPopoverTextArea = function (colDef, params) { return GridCell(colDef, __assign({ editor: GridFormTextArea }, params)); };
3531
3552
 
3532
3553
  var GridFormTextInput = function (_props) {
3533
3554
  var _a;
@@ -3572,7 +3593,12 @@ var GridFormTextInput = function (_props) {
3572
3593
  });
3573
3594
  }); }, [invalid, value, initValue, props]);
3574
3595
  var _c = useGridPopoverHook({ className: props.className, save: save }), popoverWrapper = _c.popoverWrapper, triggerSave = _c.triggerSave;
3575
- return popoverWrapper(jsx("div", __assign({ style: { display: "flex", flexDirection: "row", width: (_a = props.width) !== null && _a !== void 0 ? _a : 240 }, className: "FormTest" }, { children: jsx(TextInputFormatted, { value: value, onChange: function (e) { return setValue(e.target.value); }, error: invalid(), formatted: props.units, inputProps: {
3596
+ return popoverWrapper(jsx("div", __assign({ style: { display: "flex", flexDirection: "row", width: (_a = props.width) !== null && _a !== void 0 ? _a : 240 }, className: "FormTest" }, { children: jsx(TextInputFormatted, { value: value, onChange: function (e) { return setValue(e.target.value); }, error: invalid(), formatted: props.units, onMouseEnter: function (e) {
3597
+ if (document.activeElement != e.currentTarget) {
3598
+ e.currentTarget.focus();
3599
+ e.currentTarget.selectionStart = e.currentTarget.value.length;
3600
+ }
3601
+ }, inputProps: {
3576
3602
  style: { width: "100%" },
3577
3603
  placeholder: props.placeholder,
3578
3604
  onKeyDown: function (e) { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
@@ -3582,15 +3608,38 @@ var GridFormTextInput = function (_props) {
3582
3608
  };
3583
3609
 
3584
3610
  var GridPopoverTextInput = function (colDef, params) {
3585
- return GridCell(__assign({ maxWidth: 140 }, colDef), __assign({ editor: GridFormTextInput }, params));
3611
+ return GridCell(colDef, __assign({ editor: GridFormTextInput }, params));
3586
3612
  };
3587
3613
 
3588
3614
  var GridSubComponentTextArea = function (props) {
3589
- var _a = useState(""), value = _a[0], setValue = _a[1];
3615
+ var value = props.value, setValue = props.setValue, setValid = props.setValid, triggerSave = props.triggerSave;
3616
+ var validate = useCallback(function (value) {
3617
+ if (props.required && value.length === 0) {
3618
+ return "Some text is required";
3619
+ }
3620
+ if (props.maxlength && value.length > props.maxlength) {
3621
+ return "Text must be no longer than ".concat(props.maxlength, " characters");
3622
+ }
3623
+ if (props.validate) {
3624
+ return props.validate(value);
3625
+ }
3626
+ return null;
3627
+ }, [props]);
3590
3628
  useEffect(function () {
3591
- props.setValue(value);
3592
- }, [props, value]);
3593
- return (jsx("div", __assign({ className: "FreeTextInput LuiDeprecatedForms" }, { children: jsx("textarea", { autoFocus: true, maxLength: 10000, spellCheck: true, className: "free-text-input", onChange: function (e) { return setValue(e.target.value); }, defaultValue: value }) })));
3629
+ setValid(validate(value) == null);
3630
+ }, [setValid, validate, value]);
3631
+ return (jsx("div", __assign({ className: "FreeTextInput LuiDeprecatedForms" }, { children: jsx(TextInputFormatted, { className: "free-text-input", value: value, onMouseEnter: function (e) {
3632
+ if (document.activeElement != e.currentTarget) {
3633
+ e.currentTarget.focus();
3634
+ e.currentTarget.selectionStart = e.currentTarget.value.length;
3635
+ }
3636
+ }, onChange: function (e) { return setValue(e.target.value); }, error: validate(value), inputProps: {
3637
+ autoFocus: true,
3638
+ placeholder: props.placeholder,
3639
+ onKeyDown: function (e) { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
3640
+ return [2 /*return*/, e.key === "Enter" && triggerSave().then()];
3641
+ }); }); }
3642
+ } }) })));
3594
3643
  };
3595
3644
 
3596
3645
  var css_248z = ".ActionButton{align-items:center;display:flex}.ActionButton .LuiIcon{margin:0 4px!important}.ActionButton-minimalArea{position:relative}.ActionButton-minimalAreaDisplay{position:absolute}.ActionButton-minimalAreaExpand{visibility:hidden}.ActionButton-inProgress{background-color:#e2f3f7!important;color:#007198!important;cursor:progress}.ActionButton-inProgress svg *{fill:#0000!important}";