@linzjs/step-ag-grid 16.0.0 → 17.0.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.
Files changed (102) hide show
  1. package/dist/GridTheme.scss +138 -106
  2. package/dist/index.css +1 -8
  3. package/dist/node_modules/@linzjs/lui/dist/assets/svg-content.d.ts +7 -0
  4. package/dist/src/components/ComponentLoadingWrapper.d.ts +3 -4
  5. package/dist/src/components/Grid.d.ts +2 -2
  6. package/dist/src/components/GridCell.d.ts +5 -5
  7. package/dist/src/components/GridCellMultiEditor.d.ts +2 -2
  8. package/dist/src/components/GridNoRowsOverlay.d.ts +3 -2
  9. package/dist/src/components/GridPopoverHook.d.ts +3 -3
  10. package/dist/src/components/GridWrapper.d.ts +2 -3
  11. package/dist/src/components/PostSortRowsHook.d.ts +1 -1
  12. package/dist/src/components/gridFilter/GridFilterButtons.d.ts +2 -2
  13. package/dist/src/components/gridFilter/GridFilterColumnsToggle.d.ts +2 -2
  14. package/dist/src/components/gridFilter/GridFilters.d.ts +2 -5
  15. package/dist/src/components/gridForm/GridFormDropDown.d.ts +2 -2
  16. package/dist/src/components/gridForm/GridFormMessage.d.ts +2 -2
  17. package/dist/src/components/gridForm/GridFormMultiSelect.d.ts +2 -2
  18. package/dist/src/components/gridForm/GridFormPopoverMenu.d.ts +3 -3
  19. package/dist/src/components/gridForm/GridFormSubComponentTextArea.d.ts +2 -2
  20. package/dist/src/components/gridForm/GridFormSubComponentTextInput.d.ts +2 -2
  21. package/dist/src/components/gridForm/GridFormTextArea.d.ts +2 -2
  22. package/dist/src/components/gridRender/GridRenderGenericCell.d.ts +2 -2
  23. package/dist/src/contexts/GridContext.d.ts +4 -4
  24. package/dist/src/contexts/GridContextProvider.d.ts +2 -6
  25. package/dist/src/contexts/GridPopoverContextProvider.d.ts +2 -3
  26. package/dist/src/contexts/GridUpdatingContextProvider.d.ts +2 -6
  27. package/dist/src/lui/ActionButton.d.ts +2 -2
  28. package/dist/src/lui/FormError.d.ts +2 -2
  29. package/dist/src/lui/TextAreaInput.d.ts +3 -3
  30. package/dist/src/lui/TextInputFormatted.d.ts +3 -3
  31. package/dist/src/react-menu3/components/FocusableItem.d.ts +2 -2
  32. package/dist/src/react-menu3/utils/withHovering.d.ts +2 -2
  33. package/dist/src/utils/textValidator.d.ts +3 -3
  34. package/dist/step-ag-grid.cjs.js +31 -15
  35. package/dist/step-ag-grid.cjs.js.map +1 -1
  36. package/dist/step-ag-grid.esm.js +31 -15
  37. package/dist/step-ag-grid.esm.js.map +1 -1
  38. package/package.json +45 -45
  39. package/src/components/ComponentLoadingWrapper.tsx +9 -6
  40. package/src/components/Grid.tsx +19 -10
  41. package/src/components/GridCell.tsx +5 -5
  42. package/src/components/GridCellMultiEditor.tsx +2 -2
  43. package/src/components/GridNoRowsOverlay.tsx +4 -2
  44. package/src/components/GridPopoverHook.tsx +4 -4
  45. package/src/components/GridWrapper.tsx +2 -3
  46. package/src/components/PostSortRowsHook.ts +4 -4
  47. package/src/components/gridFilter/GridFilterButtons.tsx +2 -2
  48. package/src/components/gridFilter/GridFilterColumnsToggle.tsx +2 -2
  49. package/src/components/gridFilter/GridFilters.tsx +4 -6
  50. package/src/components/gridForm/GridFormDropDown.tsx +4 -4
  51. package/src/components/gridForm/GridFormMessage.tsx +3 -3
  52. package/src/components/gridForm/GridFormMultiSelect.tsx +2 -1
  53. package/src/components/gridForm/GridFormPopoverMenu.tsx +4 -4
  54. package/src/components/gridForm/GridFormSubComponentTextArea.tsx +2 -2
  55. package/src/components/gridForm/GridFormSubComponentTextInput.tsx +2 -2
  56. package/src/components/gridForm/GridFormTextArea.tsx +2 -2
  57. package/src/components/gridPopoverEdit/GridPopoverMessage.ts +1 -1
  58. package/src/components/gridRender/GridRenderGenericCell.tsx +2 -1
  59. package/src/contexts/GridContext.tsx +4 -4
  60. package/src/contexts/GridContextProvider.tsx +26 -20
  61. package/src/contexts/GridPopoverContextProvider.tsx +2 -3
  62. package/src/contexts/GridUpdatingContextProvider.tsx +2 -6
  63. package/src/lui/ActionButton.tsx +2 -2
  64. package/src/lui/FormError.tsx +3 -1
  65. package/src/lui/TextAreaInput.tsx +3 -3
  66. package/src/lui/TextInputFormatted.tsx +3 -3
  67. package/src/lui/reactUtils.test.tsx +3 -3
  68. package/src/react-menu3/components/FocusableItem.tsx +2 -2
  69. package/src/react-menu3/utils/utils.ts +1 -1
  70. package/src/react-menu3/utils/withHovering.tsx +2 -2
  71. package/src/stories/grid/FormTest.tsx +2 -2
  72. package/src/stories/grid/GridFilterButtons.stories.tsx +8 -1
  73. package/src/stories/grid/GridNoRowsOverlay.stories.tsx +8 -8
  74. package/src/stories/grid/GridNonEditableRow.stories.tsx +9 -2
  75. package/src/stories/grid/GridPopoutContextMenu.stories.tsx +8 -1
  76. package/src/stories/grid/GridPopoutEditGeneric.stories.tsx +8 -1
  77. package/src/stories/grid/GridPopoutEditGenericTextArea.stories.tsx +8 -1
  78. package/src/stories/grid/GridPopoverEditBearing.stories.tsx +7 -0
  79. package/src/stories/grid/GridPopoverEditDropDown.stories.tsx +7 -0
  80. package/src/stories/grid/GridPopoverEditMultiSelect.stories.tsx +7 -0
  81. package/src/stories/grid/GridPopoverEditMultiSelectGrid.stories.tsx +8 -0
  82. package/src/stories/grid/GridReadOnly.stories.tsx +10 -2
  83. package/src/stories/grid/gridFormInteraction/GridFormDropDownInteraction.stories.tsx +2 -2
  84. package/src/stories/grid/gridFormInteraction/GridFormEditBearingCorrectionInteraction.stories.tsx +7 -2
  85. package/src/stories/grid/gridFormInteraction/GridFormEditBearingInteraction.stories.tsx +7 -2
  86. package/src/stories/grid/gridFormInteraction/GridFormMultiSelectGridInteraction.stories.tsx +1 -1
  87. package/src/stories/grid/gridFormInteraction/GridFormMultiSelectInteraction.stories.tsx +2 -2
  88. package/src/stories/grid/gridFormInteraction/GridFormPopoverMenuInteraction.stories.tsx +4 -3
  89. package/src/stories/grid/gridFormInteraction/GridFormTextAreaInteraction.stories.tsx +3 -3
  90. package/src/stories/grid/gridFormInteraction/GridFormTextInputInteraction.stories.tsx +3 -3
  91. package/src/stories/grid/gridFormStatic/GridFormDropDown.stories.tsx +1 -1
  92. package/src/stories/grid/gridFormStatic/GridFormEditBearing.stories.tsx +1 -1
  93. package/src/stories/grid/gridFormStatic/GridFormEditBearingCorrection.stories.tsx +1 -1
  94. package/src/stories/grid/gridFormStatic/GridFormMessage.stories.tsx +2 -2
  95. package/src/stories/grid/gridFormStatic/GridFormTextArea.stories.tsx +1 -1
  96. package/src/stories/grid/gridFormStatic/GridFormTextInput.stories.tsx +1 -1
  97. package/src/stories/grid/interactions/GridKeyboardInteractions.stories.tsx +4 -0
  98. package/src/styles/ComponentLoadingWrapper.scss +1 -4
  99. package/src/styles/Grid.scss +0 -4
  100. package/src/styles/GridTheme.scss +138 -106
  101. package/src/utils/testUtil.ts +3 -0
  102. package/src/utils/textValidator.ts +3 -1
@@ -1,10 +1,10 @@
1
- import { ColDef, ColumnApi, GridApi, RowNode } from "ag-grid-community";
1
+ import { ColDef, ColumnApi, GridApi, IRowNode } from "ag-grid-community";
2
2
  import { CsvExportParams } from "ag-grid-community/dist/lib/interfaces/exportParams";
3
3
  import { createContext, useContext } from "react";
4
4
 
5
5
  import { ColDefT, GridBaseRow } from "../components";
6
6
 
7
- export type GridFilterExternal<RowType extends GridBaseRow> = (data: RowType, rowNode: RowNode) => boolean;
7
+ export type GridFilterExternal<RowType extends GridBaseRow> = (data: RowType, rowNode: IRowNode) => boolean;
8
8
 
9
9
  export interface AutoSizeColumnsProps {
10
10
  skipHeader?: boolean;
@@ -51,14 +51,14 @@ export interface GridContextType<RowType extends GridBaseRow> {
51
51
  setSaving?: (saving: boolean) => void,
52
52
  tabDirection?: 1 | 0 | -1,
53
53
  ) => Promise<boolean>;
54
- redrawRows: (rowNodes?: RowNode[]) => void;
54
+ redrawRows: (rowNodes?: IRowNode[]) => void;
55
55
  externallySelectedItemsAreInSync: boolean;
56
56
  setExternallySelectedItemsAreInSync: (inSync: boolean) => void;
57
57
  waitForExternallySelectedItemsToBeInSync: () => Promise<void>;
58
58
  addExternalFilter: (filter: GridFilterExternal<RowType>) => void;
59
59
  removeExternalFilter: (filter: GridFilterExternal<RowType>) => void;
60
60
  isExternalFilterPresent: () => boolean;
61
- doesExternalFilterPass: (node: RowNode) => boolean;
61
+ doesExternalFilterPass: (node: IRowNode) => boolean;
62
62
  invisibleColumnIds: string[] | undefined;
63
63
  setInvisibleColumnIds: (colIds: string[]) => void;
64
64
  downloadCsv: (csvExportParams?: CsvExportParams) => void;
@@ -1,10 +1,9 @@
1
- import { ColDef, ColumnApi, GridApi, RowNode } from "ag-grid-community";
2
- import { CellPosition } from "ag-grid-community/dist/lib/entities/cellPosition";
1
+ import { CellPosition, ColDef, ColumnApi, GridApi, IRowNode, RowNode } from "ag-grid-community";
3
2
  import { ValueFormatterParams } from "ag-grid-community/dist/lib/entities/colDef";
4
3
  import { CsvExportParams, ProcessCellForExportParams } from "ag-grid-community/dist/lib/interfaces/exportParams";
5
4
  import debounce from "debounce-promise";
6
5
  import { compact, defer, delay, difference, filter, isEmpty, last, pull, remove, sortBy, sumBy } from "lodash-es";
7
- import { ReactElement, ReactNode, useCallback, useContext, useEffect, useMemo, useRef, useState } from "react";
6
+ import { PropsWithChildren, ReactElement, useCallback, useContext, useEffect, useMemo, useRef, useState } from "react";
8
7
 
9
8
  import { ColDefT, GridBaseRow } from "../components";
10
9
  import { GridCellFillerColId, isGridCellFiller } from "../components/GridCellFiller";
@@ -13,16 +12,12 @@ import { isNotEmpty, sanitiseFileName, wait } from "../utils/util";
13
12
  import { AutoSizeColumnsProps, AutoSizeColumnsResult, GridContext, GridFilterExternal } from "./GridContext";
14
13
  import { GridUpdatingContext } from "./GridUpdatingContext";
15
14
 
16
- interface GridContextProps {
17
- children: ReactNode;
18
- }
19
-
20
15
  /**
21
16
  * Context for AgGrid operations.
22
17
  * Make sure you wrap AgGrid in this.
23
18
  * Also, make sure the provider is created in a separate component, otherwise it won't be found.
24
19
  */
25
- export const GridContextProvider = <RowType extends GridBaseRow>(props: GridContextProps): ReactElement => {
20
+ export const GridContextProvider = <RowType extends GridBaseRow>(props: PropsWithChildren): ReactElement => {
26
21
  const { modifyUpdating, checkUpdating } = useContext(GridUpdatingContext);
27
22
  const [gridApi, setGridApi] = useState<GridApi>();
28
23
  const [columnApi, setColumnApi] = useState<ColumnApi>();
@@ -167,7 +162,7 @@ export const GridContextProvider = <RowType extends GridBaseRow>(props: GridCont
167
162
  * Find new row ids
168
163
  * Uses beforeUpdate ids to find new nodes.
169
164
  */
170
- const _getNewNodes = useCallback((): RowNode[] => {
165
+ const _getNewNodes = useCallback((): IRowNode[] => {
171
166
  return gridApiOp(
172
167
  (gridApi) =>
173
168
  compact(difference(_getAllRowIds(), idsBeforeUpdate.current).map((rowId) => gridApi.getRowNode("" + rowId))),
@@ -182,7 +177,7 @@ export const GridContextProvider = <RowType extends GridBaseRow>(props: GridCont
182
177
  * @param rowIds Row ids to get from grid.
183
178
  */
184
179
  const _rowIdsToNodes = useCallback(
185
- (rowIds: number[]): RowNode[] => {
180
+ (rowIds: number[]): IRowNode[] => {
186
181
  return gridApiOp(
187
182
  (gridApi) => compact(rowIds.map((rowId) => gridApi.getRowNode("" + rowId))),
188
183
  () => [] as RowNode[],
@@ -240,7 +235,14 @@ export const GridContextProvider = <RowType extends GridBaseRow>(props: GridCont
240
235
  // After retry count expires we give-up and deselect all rows, then select any subset of rows that have updated
241
236
  if (gridHasNotUpdated && retryCount > 0) {
242
237
  delay(
243
- () => _selectRowsWithOptionalFlash({ rowIds, select, flash, ifNoCellFocused, retryCount: retryCount - 1 }),
238
+ () =>
239
+ _selectRowsWithOptionalFlash({
240
+ rowIds,
241
+ select,
242
+ flash,
243
+ ifNoCellFocused,
244
+ retryCount: retryCount - 1,
245
+ }),
244
246
  250,
245
247
  );
246
248
  return;
@@ -394,13 +396,17 @@ export const GridContextProvider = <RowType extends GridBaseRow>(props: GridCont
394
396
  const autoSizeColumns = useCallback(
395
397
  ({ skipHeader, colIds, userSizedColIds }: AutoSizeColumnsProps = {}): AutoSizeColumnsResult => {
396
398
  if (!columnApi) return null;
397
- const colIdsSet = colIds instanceof Set ? colIds : new Set<string>(colIds ?? []);
398
- columnApi.getColumnState().forEach((col) => {
399
- const colId = col.colId;
400
- if ((isEmpty(colIdsSet) || colIdsSet.has(colId)) && !userSizedColIds?.has(colId)) {
401
- columnApi.autoSizeColumn(colId, skipHeader);
402
- }
399
+ const colIdsSet = colIds instanceof Set ? colIds : new Set(colIds);
400
+ const colsToResize = columnApi.getColumnState().filter((colState) => {
401
+ const colId = colState.colId;
402
+ return (isEmpty(colIdsSet) || colIdsSet.has(colId)) && !userSizedColIds?.has(colId) && !colState.flex;
403
403
  });
404
+ if (!isEmpty(colsToResize)) {
405
+ columnApi.autoSizeColumns(
406
+ colsToResize.map((colState) => colState.colId),
407
+ skipHeader,
408
+ );
409
+ }
404
410
  return {
405
411
  width: sumBy(
406
412
  columnApi.getColumnState().filter((col) => !col.hide),
@@ -415,7 +421,7 @@ export const GridContextProvider = <RowType extends GridBaseRow>(props: GridCont
415
421
  * Resize columns to fit container
416
422
  */
417
423
  const sizeColumnsToFit = useCallback((): void => {
418
- gridApi && gridApi.sizeColumnsToFit();
424
+ gridApi?.sizeColumnsToFit();
419
425
  }, [gridApi]);
420
426
 
421
427
  const stopEditing = useCallback((): void => {
@@ -584,7 +590,7 @@ export const GridContextProvider = <RowType extends GridBaseRow>(props: GridCont
584
590
  );
585
591
 
586
592
  const redrawRows = useCallback(
587
- (rowNodes?: RowNode[]) => {
593
+ (rowNodes?: IRowNode[]) => {
588
594
  gridApiOp((gridApi) => gridApi.redrawRows(rowNodes ? { rowNodes } : undefined));
589
595
  },
590
596
  [gridApiOp],
@@ -623,7 +629,7 @@ export const GridContextProvider = <RowType extends GridBaseRow>(props: GridCont
623
629
 
624
630
  const isExternalFilterPresent = (): boolean => !isEmpty(externalFilters.current);
625
631
 
626
- const doesExternalFilterPass = (node: RowNode): boolean =>
632
+ const doesExternalFilterPass = (node: IRowNode): boolean =>
627
633
  externalFilters.current.every((filter) => filter(node.data, node));
628
634
 
629
635
  const getColDef = useCallback(
@@ -1,6 +1,6 @@
1
1
  import { ICellEditorParams } from "ag-grid-community";
2
2
  import { sortBy } from "lodash-es";
3
- import { ReactNode, RefObject, useCallback, useContext, useMemo, useRef, useState } from "react";
3
+ import { PropsWithChildren, RefObject, useCallback, useContext, useMemo, useRef, useState } from "react";
4
4
 
5
5
  import { GridBaseRow } from "../components/Grid";
6
6
  import { GridContext } from "./GridContext";
@@ -8,10 +8,9 @@ import { GridPopoverContext } from "./GridPopoverContext";
8
8
 
9
9
  interface GridPopoverContextProps {
10
10
  props: ICellEditorParams;
11
- children: ReactNode;
12
11
  }
13
12
 
14
- export const GridPopoverContextProvider = ({ props, children }: GridPopoverContextProps) => {
13
+ export const GridPopoverContextProvider = ({ props, children }: PropsWithChildren<GridPopoverContextProps>) => {
15
14
  const { getFilteredSelectedRows, updatingCells } = useContext(GridContext);
16
15
  const anchorRef = useRef<Element>(props.eGridCell);
17
16
 
@@ -1,19 +1,15 @@
1
1
  import { castArray, flatten, remove } from "lodash-es";
2
- import { ReactNode, useRef, useState } from "react";
2
+ import { PropsWithChildren, useRef, useState } from "react";
3
3
 
4
4
  import { GridUpdatingContext } from "./GridUpdatingContext";
5
5
 
6
- interface UpdatingContextProviderProps {
7
- children: ReactNode;
8
- }
9
-
10
6
  export type GridUpdatingContextStatus = Record<string, (number | string)[] | undefined>;
11
7
 
12
8
  type FieldName = string;
13
9
  type IdList = (number | string)[];
14
10
  type UpdatingBlock = Record<FieldName, IdList[]>;
15
11
 
16
- export const GridUpdatingContextProvider = (props: UpdatingContextProviderProps) => {
12
+ export const GridUpdatingContextProvider = (props: PropsWithChildren) => {
17
13
  const updatingBlocks = useRef<UpdatingBlock>({});
18
14
  const updating = useRef<GridUpdatingContextStatus>({});
19
15
  const [updatedDep, setUpdatedDep] = useState(0);
@@ -1,7 +1,7 @@
1
1
  import "./ActionButton.scss";
2
2
 
3
3
  import clsx from "clsx";
4
- import { CSSProperties, useEffect, useState } from "react";
4
+ import { CSSProperties, ReactElement, useEffect, useState } from "react";
5
5
 
6
6
  import { LuiButton, LuiIcon, LuiMiniSpinner } from "@linzjs/lui";
7
7
  import { LuiButtonProps } from "@linzjs/lui/dist/components/LuiButton/LuiButton";
@@ -43,7 +43,7 @@ export const ActionButton = ({
43
43
  iconPosition = "left",
44
44
  level = "tertiary",
45
45
  "aria-label": ariaLabel,
46
- }: ActionButtonProps): JSX.Element => {
46
+ }: ActionButtonProps): ReactElement => {
47
47
  const [inProgress, setInProgress] = useState(false);
48
48
  const lastInProgress = usePrevious(inProgress ?? false);
49
49
  const [localInProgress, setLocalInProgress, setLocalInProgressDeferred] = useStateDeferred<boolean>(inProgress);
@@ -1,8 +1,10 @@
1
1
  import "./FormError.scss";
2
2
 
3
+ import { ReactElement } from "react";
4
+
3
5
  export interface FormErrorProps {
4
6
  helpText?: string;
5
- error?: JSX.Element | string | boolean | null;
7
+ error?: ReactElement | string | boolean | null;
6
8
  }
7
9
 
8
10
  export const FormError = (props: FormErrorProps) => {
@@ -1,6 +1,6 @@
1
1
  import clsx from "clsx";
2
2
  import { omit } from "lodash-es";
3
- import { InputHTMLAttributes, useState } from "react";
3
+ import { InputHTMLAttributes, ReactElement, useState } from "react";
4
4
  import { v4 as uuidVersion4 } from "uuid";
5
5
 
6
6
  import { FormError } from "./FormError";
@@ -15,10 +15,10 @@ export interface LuiTextAreaInputProps extends InputHTMLAttributes<HTMLTextAreaE
15
15
  value: string;
16
16
 
17
17
  // Custom fields
18
- label?: JSX.Element | string;
18
+ label?: ReactElement | string;
19
19
  mandatory?: boolean;
20
20
  helpText?: string;
21
- error?: JSX.Element | string | boolean | null;
21
+ error?: ReactElement | string | boolean | null;
22
22
  allowTabToSave?: boolean;
23
23
  }
24
24
 
@@ -2,7 +2,7 @@ import "./TextInputFormatted.scss";
2
2
 
3
3
  import clsx from "clsx";
4
4
  import { omit } from "lodash-es";
5
- import { DetailedHTMLProps, InputHTMLAttributes } from "react";
5
+ import { DetailedHTMLProps, InputHTMLAttributes, ReactElement } from "react";
6
6
 
7
7
  import { FormError } from "./FormError";
8
8
 
@@ -12,12 +12,12 @@ export interface LuiTextInputProps extends DetailedHTMLProps<InputHTMLAttributes
12
12
 
13
13
  // Custom fields
14
14
  helpText?: string;
15
- error?: JSX.Element | string | boolean | null;
15
+ error?: ReactElement | string | boolean | null;
16
16
  formatted?: string;
17
17
  allowTabToSave?: boolean;
18
18
  }
19
19
 
20
- export const TextInputFormatted = (props: LuiTextInputProps): JSX.Element => {
20
+ export const TextInputFormatted = (props: LuiTextInputProps): ReactElement => {
21
21
  return (
22
22
  <div className={clsx("LuiTextInput Grid-popoverContainer", props.error && "hasError", props.className)}>
23
23
  <span className="LuiTextInput-inputWrapper">
@@ -1,7 +1,7 @@
1
1
  import { screen } from "@testing-library/dom";
2
2
  import { render } from "@testing-library/react";
3
3
  import userEvent from "@testing-library/user-event";
4
- import { useEffect, useState } from "react";
4
+ import { ReactElement, useEffect, useState } from "react";
5
5
 
6
6
  import { usePrevious } from "./reactUtils";
7
7
 
@@ -11,7 +11,7 @@ interface WrapperProps {
11
11
 
12
12
  let extPrevious: boolean | undefined = undefined;
13
13
 
14
- const UsePreviousWrapper = ({ value }: WrapperProps): JSX.Element => {
14
+ const UsePreviousWrapper = ({ value }: WrapperProps): ReactElement => {
15
15
  const previous = usePrevious<boolean>(value);
16
16
  useEffect(() => {
17
17
  extPrevious = previous;
@@ -20,7 +20,7 @@ const UsePreviousWrapper = ({ value }: WrapperProps): JSX.Element => {
20
20
  return <div />;
21
21
  };
22
22
 
23
- const TestComponent = (): JSX.Element => {
23
+ const TestComponent = (): ReactElement => {
24
24
  const [value, setValue] = useState(false);
25
25
 
26
26
  const toggleValue = () => setValue((value) => !value);
@@ -1,4 +1,4 @@
1
- import { LegacyRef, useContext, useMemo, useRef } from "react";
1
+ import { LegacyRef, ReactElement, useContext, useMemo, useRef } from "react";
2
2
 
3
3
  import { EventHandlersContext } from "../contexts/EventHandlersContext";
4
4
  import { useBEM, useCombinedRef, useItemState } from "../hooks";
@@ -8,7 +8,7 @@ import { withHoveringResultProps } from "../utils/withHovering";
8
8
 
9
9
  export interface FocusableItemProps extends BaseProps, withHoveringResultProps {
10
10
  disabled?: boolean;
11
- children: (ref: LegacyRef<any>) => JSX.Element;
11
+ children: (ref: LegacyRef<any>) => ReactElement;
12
12
  }
13
13
 
14
14
  export const FocusableItemFr = ({
@@ -25,7 +25,7 @@ export function safeCall<T, R>(fn: (arg?: T) => R, arg?: T): T | R {
25
25
 
26
26
  const internalKey = "_szhsinMenu";
27
27
  export const getName = (component: Record<string, any | undefined>) => component[internalKey];
28
- //export const defineName = <T extends any[]>(name: string, component: (...args: T) => JSX.Element) =>
28
+ //export const defineName = <T extends any[]>(name: string, component: (...args: T) => ReactElement) =>
29
29
  // Object.defineProperty(component, internalKey, { value: name });
30
30
 
31
31
  export const defineName = (
@@ -1,4 +1,4 @@
1
- import { MutableRefObject, PropsWithRef, forwardRef, memo, useContext, useRef } from "react";
1
+ import { MutableRefObject, PropsWithRef, ReactElement, forwardRef, memo, useContext, useRef } from "react";
2
2
 
3
3
  import { HoverItemContext } from "../contexts/HoverItemContext";
4
4
 
@@ -8,7 +8,7 @@ export interface withHoveringResultProps {
8
8
  menuItemRef?: MutableRefObject<HTMLLIElement>;
9
9
  }
10
10
 
11
- export const withHovering = <T,>(name: string, WrappedComponent: (props: T) => JSX.Element) => {
11
+ export const withHovering = <T,>(name: string, WrappedComponent: (props: T) => ReactElement) => {
12
12
  const Component = memo(WrappedComponent);
13
13
  const WithHovering = forwardRef((props: PropsWithRef<T>, ref) => {
14
14
  const menuItemRef = useRef<any>(null);
@@ -1,6 +1,6 @@
1
1
  import "./FormTest.scss";
2
2
 
3
- import { useCallback, useState } from "react";
3
+ import { ReactElement, useCallback, useState } from "react";
4
4
 
5
5
  import { LuiAlertModal, LuiAlertModalButtons, LuiButton, LuiTextInput } from "@linzjs/lui";
6
6
 
@@ -15,7 +15,7 @@ export interface IFormTestRow {
15
15
  distance: number | null;
16
16
  }
17
17
 
18
- export const FormTest = (props: CellEditorCommon): JSX.Element => {
18
+ export const FormTest = (props: CellEditorCommon): ReactElement => {
19
19
  const { value } = useGridPopoverContext<IFormTestRow>();
20
20
  const [v1, ...v2] = value.split(" ");
21
21
 
@@ -2,7 +2,9 @@ import "../../styles/GridTheme.scss";
2
2
  import "../../styles/index.scss";
3
3
  import "@linzjs/lui/dist/scss/base.scss";
4
4
 
5
+ import { expect } from "@storybook/jest";
5
6
  import { ComponentMeta, ComponentStory } from "@storybook/react/dist/ts3.9/client/preview/types-6-3";
7
+ import { waitFor } from "@storybook/testing-library";
6
8
  import { useMemo, useState } from "react";
7
9
 
8
10
  import "@linzjs/lui/dist/fonts";
@@ -103,4 +105,9 @@ const GridFilterButtonsTemplate: ComponentStory<typeof Grid> = (props: GridProps
103
105
  );
104
106
  };
105
107
 
106
- export const FilterButtonsExample = GridFilterButtonsTemplate.bind({});
108
+ export const _FilterButtonsExample = GridFilterButtonsTemplate.bind({});
109
+ _FilterButtonsExample.play = async ({ canvasElement }) => {
110
+ await waitFor(() => {
111
+ expect(canvasElement.querySelector(".Grid-ready")).toBeInTheDocument();
112
+ });
113
+ };
@@ -6,7 +6,7 @@ import { within } from "@storybook/testing-library";
6
6
 
7
7
  import "@linzjs/lui/dist/fonts";
8
8
 
9
- import { GridNoRowsOverlay } from "../../components";
9
+ import { GridNoRowsOverlay, GridNoRowsOverlayProps } from "../../components";
10
10
 
11
11
  export default {
12
12
  title: "Components / Grids / GridNoRowsOverlay",
@@ -14,26 +14,26 @@ export default {
14
14
  args: {},
15
15
  } as ComponentMeta<typeof GridNoRowsOverlay>;
16
16
 
17
- const GridNoRowsOverlayTemplate: ComponentStory<typeof GridNoRowsOverlay> = (params) => {
17
+ const GridNoRowsOverlayTemplate: ComponentStory<typeof GridNoRowsOverlay> = (params: GridNoRowsOverlayProps) => {
18
18
  return <GridNoRowsOverlay {...params} />;
19
19
  };
20
20
 
21
- export const GridNoRowsEmpty = GridNoRowsOverlayTemplate.bind({});
22
- GridNoRowsEmpty.args = {
21
+ export const _GridNoRowsEmpty = GridNoRowsOverlayTemplate.bind({});
22
+ _GridNoRowsEmpty.args = {
23
23
  rowCount: 0,
24
24
  filteredRowCount: 0,
25
25
  };
26
- GridNoRowsEmpty.play = async ({ canvasElement }) => {
26
+ _GridNoRowsEmpty.play = async ({ canvasElement }) => {
27
27
  const canvas = within(canvasElement);
28
28
  expect(await canvas.findByText("There are currently no rows")).toBeInTheDocument();
29
29
  };
30
30
 
31
- export const GridNoRowsFiltered = GridNoRowsOverlayTemplate.bind({});
32
- GridNoRowsFiltered.args = {
31
+ export const _GridNoRowsFiltered = GridNoRowsOverlayTemplate.bind({});
32
+ _GridNoRowsFiltered.args = {
33
33
  rowCount: 1,
34
34
  filteredRowCount: 0,
35
35
  };
36
- GridNoRowsFiltered.play = async ({ canvasElement }) => {
36
+ _GridNoRowsFiltered.play = async ({ canvasElement }) => {
37
37
  const canvas = within(canvasElement);
38
38
  expect(await canvas.findByText("All rows have been filtered")).toBeInTheDocument();
39
39
  };
@@ -2,7 +2,9 @@ import "../../styles/GridTheme.scss";
2
2
  import "../../styles/index.scss";
3
3
  import "@linzjs/lui/dist/scss/base.scss";
4
4
 
5
+ import { expect } from "@storybook/jest";
5
6
  import { ComponentMeta, ComponentStory } from "@storybook/react/dist/ts3.9/client/preview/types-6-3";
7
+ import { waitFor } from "@storybook/testing-library";
6
8
  import { ColDef } from "ag-grid-community";
7
9
  import { GridPopoverEditDropDown } from "components/gridPopoverEdit/GridPopoverEditDropDown";
8
10
  import { GridPopoverTextArea } from "components/gridPopoverEdit/GridPopoverTextArea";
@@ -176,5 +178,10 @@ const GridNonEditableRowTemplate: ComponentStory<typeof Grid> = (props: GridProp
176
178
  );
177
179
  };
178
180
 
179
- export const NonEditableRow = GridNonEditableRowTemplate.bind({});
180
- NonEditableRow.args = { autoSelectFirstRow: true, selectable: true };
181
+ export const _NonEditableRow = GridNonEditableRowTemplate.bind({});
182
+ _NonEditableRow.args = { autoSelectFirstRow: true, selectable: true };
183
+ _NonEditableRow.play = async ({ canvasElement }) => {
184
+ await waitFor(() => {
185
+ expect(canvasElement.querySelector(".Grid-ready")).toBeInTheDocument();
186
+ });
187
+ };
@@ -2,7 +2,9 @@ import "../../styles/GridTheme.scss";
2
2
  import "../../styles/index.scss";
3
3
  import "@linzjs/lui/dist/scss/base.scss";
4
4
 
5
+ import { expect } from "@storybook/jest";
5
6
  import { ComponentMeta, ComponentStory } from "@storybook/react/dist/ts3.9/client/preview/types-6-3";
7
+ import { waitFor } from "@storybook/testing-library";
6
8
  import { ReactElement, useCallback, useContext, useMemo, useState } from "react";
7
9
 
8
10
  import "@linzjs/lui/dist/fonts";
@@ -134,4 +136,9 @@ const GridPopoutContextMenuTemplate: ComponentStory<typeof Grid> = (props: GridP
134
136
  );
135
137
  };
136
138
 
137
- export const EditContextMenu = GridPopoutContextMenuTemplate.bind({});
139
+ export const _EditContextMenu = GridPopoutContextMenuTemplate.bind({});
140
+ _EditContextMenu.play = async ({ canvasElement }) => {
141
+ await waitFor(() => {
142
+ expect(canvasElement.querySelector(".Grid-ready")).toBeInTheDocument();
143
+ });
144
+ };
@@ -2,7 +2,9 @@ import "../../styles/GridTheme.scss";
2
2
  import "../../styles/index.scss";
3
3
  import "@linzjs/lui/dist/scss/base.scss";
4
4
 
5
+ import { expect } from "@storybook/jest";
5
6
  import { ComponentMeta, ComponentStory } from "@storybook/react/dist/ts3.9/client/preview/types-6-3";
7
+ import { waitFor } from "@storybook/testing-library";
6
8
  import { useMemo, useState } from "react";
7
9
 
8
10
  import "@linzjs/lui/dist/fonts";
@@ -70,4 +72,9 @@ const GridPopoutEditGenericTemplate: ComponentStory<typeof Grid> = (props: GridP
70
72
  );
71
73
  };
72
74
 
73
- export const EditGeneric = GridPopoutEditGenericTemplate.bind({});
75
+ export const _EditGeneric = GridPopoutEditGenericTemplate.bind({});
76
+ _EditGeneric.play = async ({ canvasElement }) => {
77
+ await waitFor(() => {
78
+ expect(canvasElement.querySelector(".Grid-ready")).toBeInTheDocument();
79
+ });
80
+ };
@@ -2,7 +2,9 @@ import "../../styles/GridTheme.scss";
2
2
  import "../../styles/index.scss";
3
3
  import "@linzjs/lui/dist/scss/base.scss";
4
4
 
5
+ import { expect } from "@storybook/jest";
5
6
  import { ComponentMeta, ComponentStory } from "@storybook/react/dist/ts3.9/client/preview/types-6-3";
7
+ import { waitFor } from "@storybook/testing-library";
6
8
  import { useCallback, useContext, useMemo, useState } from "react";
7
9
 
8
10
  import "@linzjs/lui/dist/fonts";
@@ -225,4 +227,9 @@ const GridPopoutEditGenericTemplate: ComponentStory<typeof Grid> = (props: GridP
225
227
  );
226
228
  };
227
229
 
228
- export const EditGenericTextArea = GridPopoutEditGenericTemplate.bind({});
230
+ export const _EditGenericTextArea = GridPopoutEditGenericTemplate.bind({});
231
+ _EditGenericTextArea.play = async ({ canvasElement }) => {
232
+ await waitFor(() => {
233
+ expect(canvasElement.querySelector(".Grid-ready")).toBeInTheDocument();
234
+ });
235
+ };
@@ -2,7 +2,9 @@ import "../../styles/GridTheme.scss";
2
2
  import "../../styles/index.scss";
3
3
  import "@linzjs/lui/dist/scss/base.scss";
4
4
 
5
+ import { expect } from "@storybook/jest";
5
6
  import { ComponentMeta, ComponentStory } from "@storybook/react/dist/ts3.9/client/preview/types-6-3";
7
+ import { waitFor } from "@storybook/testing-library";
6
8
  import { useMemo, useState } from "react";
7
9
 
8
10
  import "@linzjs/lui/dist/fonts";
@@ -122,3 +124,8 @@ const GridPopoverEditBearingTemplate: ComponentStory<typeof Grid> = (props: Grid
122
124
  };
123
125
 
124
126
  export const _GridPopoverEditBearing = GridPopoverEditBearingTemplate.bind({});
127
+ _GridPopoverEditBearing.play = async ({ canvasElement }) => {
128
+ await waitFor(() => {
129
+ expect(canvasElement.querySelector(".Grid-ready")).toBeInTheDocument();
130
+ });
131
+ };
@@ -2,7 +2,9 @@ import "../../styles/GridTheme.scss";
2
2
  import "../../styles/index.scss";
3
3
  import "@linzjs/lui/dist/scss/base.scss";
4
4
 
5
+ import { expect } from "@storybook/jest";
5
6
  import { ComponentMeta, ComponentStory } from "@storybook/react/dist/ts3.9/client/preview/types-6-3";
7
+ import { waitFor } from "@storybook/testing-library";
6
8
  import { useCallback, useMemo, useState } from "react";
7
9
 
8
10
  import "@linzjs/lui/dist/fonts";
@@ -314,3 +316,8 @@ const GridEditDropDownTemplate: ComponentStory<typeof Grid> = (props: GridProps)
314
316
  };
315
317
 
316
318
  export const EditDropdown = GridEditDropDownTemplate.bind({});
319
+ EditDropdown.play = async ({ canvasElement }) => {
320
+ await waitFor(() => {
321
+ expect(canvasElement.querySelector(".Grid-ready")).toBeInTheDocument();
322
+ });
323
+ };
@@ -2,7 +2,9 @@ import "../../styles/GridTheme.scss";
2
2
  import "../../styles/index.scss";
3
3
  import "@linzjs/lui/dist/scss/base.scss";
4
4
 
5
+ import { expect } from "@storybook/jest";
5
6
  import { ComponentMeta, ComponentStory } from "@storybook/react/dist/ts3.9/client/preview/types-6-3";
7
+ import { waitFor } from "@storybook/testing-library";
6
8
  import { isEmpty, partition } from "lodash-es";
7
9
  import { useMemo, useState } from "react";
8
10
 
@@ -194,3 +196,8 @@ const GridEditMultiSelectTemplate: ComponentStory<typeof Grid> = (props: GridPro
194
196
  };
195
197
 
196
198
  export const EditMultiSelect = GridEditMultiSelectTemplate.bind({});
199
+ EditMultiSelect.play = async ({ canvasElement }) => {
200
+ await waitFor(() => {
201
+ expect(canvasElement.querySelector(".Grid-ready")).toBeInTheDocument();
202
+ });
203
+ };
@@ -2,7 +2,9 @@ import "../../styles/GridTheme.scss";
2
2
  import "../../styles/index.scss";
3
3
  import "@linzjs/lui/dist/scss/base.scss";
4
4
 
5
+ import { expect } from "@storybook/jest";
5
6
  import { ComponentMeta, ComponentStory } from "@storybook/react/dist/ts3.9/client/preview/types-6-3";
7
+ import { waitFor } from "@storybook/testing-library";
6
8
  import { countBy, mergeWith, pull, range, union } from "lodash-es";
7
9
  import { useMemo, useState } from "react";
8
10
 
@@ -11,6 +13,7 @@ import "@linzjs/lui/dist/fonts";
11
13
  import { ColDefT, Grid, GridCell, GridContextProvider, GridProps, GridUpdatingContextProvider } from "../..";
12
14
  import { MultiSelectGridOption } from "../../components/gridForm/GridFormMultiSelectGrid";
13
15
  import { GridPopoutEditMultiSelectGrid } from "../../components/gridPopoverEdit/GridPopoutEditMultiSelectGrid";
16
+ import { EditMultiSelect } from "./GridPopoverEditMultiSelect.stories";
14
17
 
15
18
  export default {
16
19
  title: "Components / Grids",
@@ -108,3 +111,8 @@ const GridEditMultiSelectGridTemplate: ComponentStory<typeof Grid> = (props: Gri
108
111
  };
109
112
 
110
113
  export const EditMultiSelectGrid = GridEditMultiSelectGridTemplate.bind({});
114
+ EditMultiSelect.play = async ({ canvasElement }) => {
115
+ await waitFor(() => {
116
+ expect(canvasElement.querySelector(".Grid-ready")).toBeInTheDocument();
117
+ });
118
+ };
@@ -2,8 +2,10 @@ import "../../styles/GridTheme.scss";
2
2
  import "../../styles/index.scss";
3
3
  import "@linzjs/lui/dist/scss/base.scss";
4
4
 
5
+ import { expect } from "@storybook/jest";
5
6
  import { ComponentMeta, ComponentStory } from "@storybook/react/dist/ts3.9/client/preview/types-6-3";
6
- import { useCallback, useMemo, useState } from "react";
7
+ import { waitFor } from "@storybook/testing-library";
8
+ import { ReactElement, useCallback, useMemo, useState } from "react";
7
9
 
8
10
  import "@linzjs/lui/dist/fonts";
9
11
 
@@ -127,6 +129,7 @@ const GridReadOnlyTemplate: ComponentStory<typeof Grid> = (props: GridProps) =>
127
129
  GridCell({
128
130
  headerName: "Custom edit",
129
131
  editable: true,
132
+ flex: 1,
130
133
  valueFormatter: () => "Press E",
131
134
  cellRendererParams: {
132
135
  rightHoverElement: (
@@ -249,7 +252,7 @@ const GridReadOnlyTemplate: ComponentStory<typeof Grid> = (props: GridProps) =>
249
252
  );
250
253
  };
251
254
 
252
- const GridFilterLessThan = (props: { field: keyof ITestRow; text: string }): JSX.Element => {
255
+ const GridFilterLessThan = (props: { field: keyof ITestRow; text: string }): ReactElement => {
253
256
  const [value, setValue] = useState<number>();
254
257
 
255
258
  const filter = useCallback(
@@ -277,3 +280,8 @@ const GridFilterLessThan = (props: { field: keyof ITestRow; text: string }): JSX
277
280
  };
278
281
 
279
282
  export const ReadOnlySingleSelection = GridReadOnlyTemplate.bind({});
283
+ ReadOnlySingleSelection.play = async ({ canvasElement }) => {
284
+ await waitFor(() => {
285
+ expect(canvasElement.querySelector(".Grid-ready")).toBeInTheDocument();
286
+ });
287
+ };
@@ -32,7 +32,7 @@ const onSelectedItem = jest
32
32
  .fn<Promise<void>, [GridPopoutEditDropDownSelectedItem<any>]>()
33
33
  .mockImplementation(async () => undefined);
34
34
 
35
- const Template: ComponentStory<typeof GridFormDropDown> = (props) => {
35
+ const Template: ComponentStory<typeof GridFormDropDown> = (props: GridFormDropDownProps<any>) => {
36
36
  const config: GridFormDropDownProps<any> = {
37
37
  filtered: "local",
38
38
  onSelectedItem,
@@ -128,7 +128,7 @@ GridFormDropDownInteractions_.play = async ({ canvasElement }) => {
128
128
 
129
129
  // Test invalid value doesn't save
130
130
  updateValue.mockClear();
131
- userEvent.clear(textInput);
131
+ await userEvent.clear(textInput);
132
132
  await userEvent.type(textInput, "{Enter}");
133
133
  expect(updateValue).not.toHaveBeenCalled();
134
134