@linzjs/step-ag-grid 30.4.4 → 31.1.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.
Files changed (72) hide show
  1. package/dist/GridTheme.scss +8 -7
  2. package/dist/index.css +6 -3
  3. package/dist/src/utils/__tests__/testQuick.ts +7 -7
  4. package/dist/src/utils/__tests__/testUtil.ts +3 -1
  5. package/dist/src/utils/__tests__/vitestUtil.ts +3 -1
  6. package/dist/src/utils/storybook.d.ts +4 -0
  7. package/dist/src/utils/useInterval.d.ts +17 -0
  8. package/dist/src/utils/useIsomorphicLayoutEffect.d.ts +17 -0
  9. package/dist/step-ag-grid.cjs +310 -214
  10. package/dist/step-ag-grid.cjs.map +1 -1
  11. package/dist/step-ag-grid.esm.js +310 -214
  12. package/dist/step-ag-grid.esm.js.map +1 -1
  13. package/package.json +26 -52
  14. package/src/components/Grid.tsx +6 -3
  15. package/src/components/PostSortRowsHook.ts +3 -1
  16. package/src/components/gridFilter/GridFilterColumnsMultiSelect.scss +18 -20
  17. package/src/components/gridFilter/GridFilterColumnsToggle.tsx +3 -4
  18. package/src/components/gridFilter/useGridFilter.ts +2 -2
  19. package/src/components/gridForm/GridFormDropDown.tsx +1 -1
  20. package/src/components/gridForm/GridFormInlineTextInput.tsx +1 -2
  21. package/src/components/gridForm/GridFormMultiSelect.tsx +10 -4
  22. package/src/components/gridForm/GridFormSubComponentTextArea.tsx +1 -2
  23. package/src/components/gridForm/GridFormSubComponentTextInput.tsx +1 -2
  24. package/src/components/gridForm/GridFormTextArea.tsx +1 -2
  25. package/src/components/gridForm/GridFormTextInput.tsx +1 -2
  26. package/src/components/gridHeader/GridHeaderSelect.tsx +3 -1
  27. package/src/components/gridHook/useGridCopy.ts +13 -3
  28. package/src/components/gridHook/useGridRangeSelection.ts +29 -16
  29. package/src/contexts/GridContextProvider.tsx +18 -7
  30. package/src/lui/ActionButton.scss +1 -1
  31. package/src/lui/ActionButton.tsx +5 -1
  32. package/src/lui/FormError.scss +1 -1
  33. package/src/lui/TextAreaInput.tsx +1 -1
  34. package/src/lui/TextInputFormatted.scss +13 -13
  35. package/src/lui/TextInputFormatted.tsx +1 -1
  36. package/src/react-menu3/README.md +66 -67
  37. package/src/react-menu3/components/ControlledMenu.tsx +2 -2
  38. package/src/react-menu3/components/Menu.tsx +1 -1
  39. package/src/react-menu3/components/MenuItem.tsx +1 -1
  40. package/src/react-menu3/components/MenuList.tsx +8 -2
  41. package/src/react-menu3/components/SubMenu.tsx +6 -6
  42. package/src/react-menu3/hooks/useBEM.ts +2 -1
  43. package/src/react-menu3/hooks/useItemState.ts +8 -4
  44. package/src/react-menu3/styles/_var.scss +1 -1
  45. package/src/react-menu3/styles/core.scss +6 -6
  46. package/src/react-menu3/styles/index.scss +11 -8
  47. package/src/react-menu3/styles/theme-dark.scss +1 -1
  48. package/src/react-menu3/styles/transitions/slide.scss +8 -8
  49. package/src/react-menu3/utils/utils.ts +2 -1
  50. package/src/stories/grid/FormTest.scss +13 -13
  51. package/src/stories/grid/GridInlineText.stories.tsx +2 -2
  52. package/src/stories/grid/GridSorting.stories.tsx +6 -2
  53. package/src/styles/ComponentLoadingWrapper.scss +1 -1
  54. package/src/styles/ContextMenu.scss +1 -1
  55. package/src/styles/Grid.scss +11 -9
  56. package/src/styles/GridCell.scss +1 -1
  57. package/src/styles/GridFilterColumnsToggle.scss +1 -1
  58. package/src/styles/GridFormInlineTextInput.scss +7 -7
  59. package/src/styles/GridFormMultiSelectGrid.scss +1 -1
  60. package/src/styles/GridFormSubComponentTextInput.scss +4 -4
  61. package/src/styles/GridIcon.scss +1 -1
  62. package/src/styles/GridPopoverMenu.scss +1 -1
  63. package/src/styles/GridTheme.scss +8 -7
  64. package/src/styles/index.scss +16 -16
  65. package/src/styles/react-menu-customisations.scss +119 -120
  66. package/src/utils/__tests__/testQuick.ts +7 -7
  67. package/src/utils/__tests__/testUtil.ts +3 -1
  68. package/src/utils/__tests__/vitestUtil.ts +3 -1
  69. package/src/utils/deferredPromise.ts +1 -1
  70. package/src/utils/storybook.ts +5 -0
  71. package/src/utils/useInterval.ts +44 -0
  72. package/src/utils/useIsomorphicLayoutEffect.ts +18 -0
@@ -1,4 +1,4 @@
1
- @use "../../node_modules/@linzjs/lui/dist/scss/Core" as lui;
1
+ @use '../../node_modules/@linzjs/lui/dist/scss/Core' as lui;
2
2
 
3
3
  .GridFormInlineTextInput {
4
4
  height: 100%;
@@ -10,14 +10,14 @@
10
10
 
11
11
  .GridFormInlineTextInput > input {
12
12
  display: block;
13
- left:0;
14
- top:0;
15
- right:0;
16
- bottom:0;
13
+ left: 0;
14
+ top: 0;
15
+ right: 0;
16
+ bottom: 0;
17
17
  position: absolute;
18
18
  padding-left: 9px;
19
19
  padding-right: 9px;
20
20
  outline: 0;
21
21
  border: 0;
22
- font-family: "Open Sans", system-ui, sans-serif;
23
- }
22
+ font-family: 'Open Sans', system-ui, sans-serif;
23
+ }
@@ -6,4 +6,4 @@
6
6
  text-overflow: ellipsis;
7
7
  white-space: nowrap;
8
8
  overflow: hidden;
9
- }
9
+ }
@@ -1,4 +1,4 @@
1
- .GridFormSubComponentTextInput-full-width-input {
2
- width: 100%;
3
- padding: 0;
4
- }
1
+ .GridFormSubComponentTextInput-full-width-input {
2
+ width: 100%;
3
+ padding: 0;
4
+ }
@@ -1,4 +1,4 @@
1
- @use "../../node_modules/@linzjs/lui/dist/scss/Core" as lui;
1
+ @use '../../node_modules/@linzjs/lui/dist/scss/Core' as lui;
2
2
 
3
3
  .AgGridGenericCellRenderer-icon {
4
4
  margin-right: 4px;
@@ -1,4 +1,4 @@
1
- @use "../../node_modules/@linzjs/lui/dist/scss/Core" as lui;
1
+ @use '../../node_modules/@linzjs/lui/dist/scss/Core' as lui;
2
2
 
3
3
  .ag-cell .GridPopoutMenu-burger {
4
4
  cursor: pointer;
@@ -1,5 +1,5 @@
1
- @use "@linzjs/lui/dist/scss/Core" as lui;
2
- @use "ag-grid-community/styles" as ag;
1
+ @use '@linzjs/lui/dist/scss/Core' as lui;
2
+ @use 'ag-grid-community/styles' as ag;
3
3
 
4
4
  // ag-grid likes to add 1px to this, so we subtract to compensate
5
5
  $grid-base-font-size: calc(#{lui.$base-font-size} - 1px);
@@ -44,7 +44,7 @@ $grid-base-font-size: calc(#{lui.$base-font-size} - 1px);
44
44
  data-color: lui.$charcoal,
45
45
  foreground-color: lui.$charcoal,
46
46
  font-family: (
47
- "Open Sans",
47
+ 'Open Sans',
48
48
  system-ui,
49
49
  sans-serif,
50
50
  ),
@@ -58,6 +58,7 @@ $grid-base-font-size: calc(#{lui.$base-font-size} - 1px);
58
58
  )
59
59
  );
60
60
 
61
+ .ag-theme-step-view-list-default,
61
62
  .ag-theme-step-default.theme-specific,
62
63
  .ag-theme-step-compact.theme-specific {
63
64
  // Don't hide the drag handle
@@ -154,7 +155,7 @@ $grid-base-font-size: calc(#{lui.$base-font-size} - 1px);
154
155
  content: none !important;
155
156
  }
156
157
  }
157
-
158
+
158
159
  .ag-header-cell-filter-button.ag-has-popup-positioned-under .ag-icon-filter {
159
160
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='%23ffffff'%3E%3Cpath d='M6 12.984v-1.969h12v1.969zM3 6h18v2.016H3zm6.984 12v-2.016h4.031V18z'/%3E%3C/svg%3E") !important;
160
161
  background-color: #007198;
@@ -243,7 +244,8 @@ $grid-base-font-size: calc(#{lui.$base-font-size} - 1px);
243
244
  visibility: inherit;
244
245
  }
245
246
 
246
- .ag-row-highlight-above::after, .ag-row-highlight-below::after {
247
+ .ag-row-highlight-above::after,
248
+ .ag-row-highlight-below::after {
247
249
  content: '';
248
250
  height: 3px;
249
251
  background-color: transparent;
@@ -268,7 +270,7 @@ $grid-base-font-size: calc(#{lui.$base-font-size} - 1px);
268
270
 
269
271
  .ag-pinned-left-header,
270
272
  .ag-pinned-left-cols-container {
271
- clip-path: polygon(0% 0%, 120% 0%, 120% 100%, 0% 100%);
273
+ clip-path: polygon(0% 0%, 120% 0%, 120% 100%, 0% 100%);
272
274
  }
273
275
 
274
276
  .ag-pinned-right-header,
@@ -278,7 +280,6 @@ $grid-base-font-size: calc(#{lui.$base-font-size} - 1px);
278
280
  }
279
281
 
280
282
  .ag-theme-step-view-list-default.theme-specific {
281
-
282
283
  .ag-header-hide-default-select .ag-labeled {
283
284
  display: none;
284
285
  }
@@ -1,16 +1,16 @@
1
- @use "./lui-overrides";
2
- @use "./react-menu-customisations";
3
- @use "./ComponentLoadingWrapper";
4
- @use "./Grid";
5
- @use "./GridCell";
6
- @use "./GridFormDropDown";
7
- @use "./GridFormEditBearing";
8
- @use "./GridFormMultiSelect";
9
- @use "./GridFormMultiSelectGrid";
10
- @use "./GridFormSubComponentTextInput";
11
- @use "./GridIcon";
12
- @use "./GridLoadableCell";
13
- @use "./GridPopoverMenu";
14
- @use "./GridFilterColumnsToggle";
15
- @use "./GridFilterHeaderIconButton";
16
- @use "./GridFormInlineTextInput";
1
+ @use './lui-overrides';
2
+ @use './react-menu-customisations';
3
+ @use './ComponentLoadingWrapper';
4
+ @use './Grid';
5
+ @use './GridCell';
6
+ @use './GridFormDropDown';
7
+ @use './GridFormEditBearing';
8
+ @use './GridFormMultiSelect';
9
+ @use './GridFormMultiSelectGrid';
10
+ @use './GridFormSubComponentTextInput';
11
+ @use './GridIcon';
12
+ @use './GridLoadableCell';
13
+ @use './GridPopoverMenu';
14
+ @use './GridFilterColumnsToggle';
15
+ @use './GridFilterHeaderIconButton';
16
+ @use './GridFormInlineTextInput';
@@ -1,120 +1,119 @@
1
- @use "../../node_modules/@linzjs/lui/dist/scss/Core" as lui;
2
-
3
- /**
4
- * Here is where we can override the styles of react-menu
5
- */
6
- .step-ag-grid-react-menu.szh-menu {
7
- z-index: 900;
8
- color: lui.$base-type-color;
9
- @include lui.font-regular();
10
-
11
- div,
12
- a[role="menuitem"] {
13
- text-decoration: none;
14
- color: lui.$base-type-color;
15
- @include lui.font-regular();
16
- }
17
-
18
- li[role="menuitem"]:not(.szh-menu__item--disabled):hover {
19
- background-color: lui.$polar;
20
- }
21
-
22
- .szh-menu__header {
23
- display: flex;
24
- align-items: center;
25
- }
26
- }
27
-
28
- /**
29
- * Here are styles for lui select menu
30
- */
31
- .lui-select-menu.szh-menu {
32
- z-index: 900;
33
- width: 92vw;
34
- overflow-y: scroll;
35
-
36
- color: lui.$base-type-color;
37
- @include lui.font-light();
38
- }
39
-
40
- .lui-select-menuItem {
41
- padding: lui.$unit-xs lui.$unit-sm lui.$unit-xs lui.$unit-xs;
42
- display: flex;
43
- line-height: 1;
44
- transition: all 0.2s ease-in-out;
45
- fill: lui.$fuscous;
46
-
47
- &:hover {
48
- background-color: lui.$polar;
49
- }
50
- }
51
-
52
- .lui-select-menuItem--error {
53
- p {
54
- color: lui.$error;
55
- }
56
-
57
- .LuiIcon {
58
- fill: lui.$error;
59
- }
60
- }
61
-
62
- .lui-select-menuItemText {
63
- @include lui.font-regular();
64
- color: lui.$charcoal;
65
- margin: 0;
66
- padding-left: lui.$unit-lg;
67
-
68
- // if no icon, give it 4px to align with the group header
69
- &--noPadding {
70
- padding-left: lui.$unit-xxs;
71
- }
72
- }
73
-
74
- .lui-select-icon + .lui-select-menuItemText {
75
- padding-left: lui.$unit-xs;
76
- }
77
-
78
- .lui-select-menu-group {
79
- height: 32px;
80
- color: lui.$fuscous;
81
- padding-left: 0.75rem;
82
- text-transform: none;
83
- @include lui.font-semibold();
84
- }
85
-
86
- .lui-select-submenu {
87
- flex: 1;
88
-
89
- div[role="menuitem"] {
90
- padding: lui.$unit-xs lui.$unit-xs lui.$unit-xs 2.5rem;
91
- text-decoration: none;
92
- @include lui.font-regular();
93
- height: 40px;
94
- }
95
- // overwrite the hover color
96
- .szh-menu__item--hover {
97
- background-color: lui.$polar;
98
- }
99
- }
100
-
101
- .lui-select-submenu-with-icon {
102
- flex: 1;
103
- // width: 200px;
104
- div[role="menuitem"] {
105
- padding-left: 0;
106
- text-decoration: none;
107
- @include lui.font-regular();
108
- height: 40px;
109
- }
110
- }
111
-
112
- .lui-select-divider {
113
- margin: 0.25rem;
114
- }
115
-
116
-
117
- .step-ag-grid-react-menu-sub-header-icon {
118
- margin: lui.$unit-xs;
119
- fill: lui.$fuscous;
120
- }
1
+ @use '../../node_modules/@linzjs/lui/dist/scss/Core' as lui;
2
+
3
+ /**
4
+ * Here is where we can override the styles of react-menu
5
+ */
6
+ .step-ag-grid-react-menu.szh-menu {
7
+ z-index: 900;
8
+ color: lui.$base-type-color;
9
+ @include lui.font-regular();
10
+
11
+ div,
12
+ a[role='menuitem'] {
13
+ text-decoration: none;
14
+ color: lui.$base-type-color;
15
+ @include lui.font-regular();
16
+ }
17
+
18
+ li[role='menuitem']:not(.szh-menu__item--disabled):hover {
19
+ background-color: lui.$polar;
20
+ }
21
+
22
+ .szh-menu__header {
23
+ display: flex;
24
+ align-items: center;
25
+ }
26
+ }
27
+
28
+ /**
29
+ * Here are styles for lui select menu
30
+ */
31
+ .lui-select-menu.szh-menu {
32
+ z-index: 900;
33
+ width: 92vw;
34
+ overflow-y: scroll;
35
+
36
+ color: lui.$base-type-color;
37
+ @include lui.font-light();
38
+ }
39
+
40
+ .lui-select-menuItem {
41
+ padding: lui.$unit-xs lui.$unit-sm lui.$unit-xs lui.$unit-xs;
42
+ display: flex;
43
+ line-height: 1;
44
+ transition: all 0.2s ease-in-out;
45
+ fill: lui.$fuscous;
46
+
47
+ &:hover {
48
+ background-color: lui.$polar;
49
+ }
50
+ }
51
+
52
+ .lui-select-menuItem--error {
53
+ p {
54
+ color: lui.$error;
55
+ }
56
+
57
+ .LuiIcon {
58
+ fill: lui.$error;
59
+ }
60
+ }
61
+
62
+ .lui-select-menuItemText {
63
+ @include lui.font-regular();
64
+ color: lui.$charcoal;
65
+ margin: 0;
66
+ padding-left: lui.$unit-lg;
67
+
68
+ // if no icon, give it 4px to align with the group header
69
+ &--noPadding {
70
+ padding-left: lui.$unit-xxs;
71
+ }
72
+ }
73
+
74
+ .lui-select-icon + .lui-select-menuItemText {
75
+ padding-left: lui.$unit-xs;
76
+ }
77
+
78
+ .lui-select-menu-group {
79
+ height: 32px;
80
+ color: lui.$fuscous;
81
+ padding-left: 0.75rem;
82
+ text-transform: none;
83
+ @include lui.font-semibold();
84
+ }
85
+
86
+ .lui-select-submenu {
87
+ flex: 1;
88
+
89
+ div[role='menuitem'] {
90
+ padding: lui.$unit-xs lui.$unit-xs lui.$unit-xs 2.5rem;
91
+ text-decoration: none;
92
+ @include lui.font-regular();
93
+ height: 40px;
94
+ }
95
+ // overwrite the hover color
96
+ .szh-menu__item--hover {
97
+ background-color: lui.$polar;
98
+ }
99
+ }
100
+
101
+ .lui-select-submenu-with-icon {
102
+ flex: 1;
103
+ // width: 200px;
104
+ div[role='menuitem'] {
105
+ padding-left: 0;
106
+ text-decoration: none;
107
+ @include lui.font-regular();
108
+ height: 40px;
109
+ }
110
+ }
111
+
112
+ .lui-select-divider {
113
+ margin: 0.25rem;
114
+ }
115
+
116
+ .step-ag-grid-react-menu-sub-header-icon {
117
+ margin: lui.$unit-xs;
118
+ fill: lui.$fuscous;
119
+ }
@@ -52,13 +52,13 @@ const quickSelector = <T extends HTMLElement>(
52
52
  let lastIQueryQuick = props;
53
53
  for (let loop: IQueryQuick | undefined = props; loop; loop = loop.child) {
54
54
  lastIQueryQuick = loop;
55
- loop.selector && (selector += loop.selector);
56
- loop.tagName && (selector += loop.tagName);
57
- loop.ariaLabel && (selector += `[aria-label='${escapeSelectorParam(loop.ariaLabel)}']`);
58
- loop.role && (selector += `[role="${escapeSelectorParam(loop.role)}"]`);
59
- loop.testId && (selector += `[data-testid="${escapeSelectorParam(loop.testId)}"]`);
60
- loop.icon && (selector += `[data-icon='${loop.icon}']`);
61
- loop.classes && (selector += loop.classes);
55
+ if (loop.selector) selector += loop.selector;
56
+ if (loop.tagName) selector += loop.tagName;
57
+ if (loop.ariaLabel) selector += `[aria-label='${escapeSelectorParam(loop.ariaLabel)}']`;
58
+ if (loop.role) selector += `[role="${escapeSelectorParam(loop.role)}"]`;
59
+ if (loop.testId) selector += `[data-testid="${escapeSelectorParam(loop.testId)}"]`;
60
+ if (loop.icon) selector += `[data-icon='${loop.icon}']`;
61
+ if (loop.classes) selector += loop.classes;
62
62
  selector += ' ';
63
63
  }
64
64
 
@@ -259,7 +259,9 @@ export const findMultiSelectOption = async (value: string): Promise<HTMLElement>
259
259
 
260
260
  export const clickMultiSelectOption = async (value: string): Promise<void> => {
261
261
  const menuItem = await findMultiSelectOption(value);
262
- menuItem.parentElement && (await user.click(menuItem.parentElement));
262
+ if (menuItem.parentElement) {
263
+ await user.click(menuItem.parentElement);
264
+ }
263
265
  };
264
266
 
265
267
  const typeInput = async (value: string, filter: IQueryQuick): Promise<void> => {
@@ -260,7 +260,9 @@ export const findMultiSelectOption = async (value: string): Promise<HTMLElement>
260
260
 
261
261
  export const clickMultiSelectOption = async (value: string): Promise<void> => {
262
262
  const menuItem = await findMultiSelectOption(value);
263
- menuItem.parentElement && (await user.click(menuItem.parentElement));
263
+ if (menuItem.parentElement) {
264
+ await user.click(menuItem.parentElement);
265
+ }
264
266
  };
265
267
 
266
268
  const typeInput = async (value: string, filter: IQueryQuick): Promise<void> => {
@@ -7,7 +7,7 @@ export const useDeferredPromise = <T>() => {
7
7
  // End promise on unload
8
8
  useEffect(() => {
9
9
  return () => {
10
- promiseReject.current && promiseReject.current();
10
+ promiseReject.current?.();
11
11
  };
12
12
  }, []);
13
13
 
@@ -0,0 +1,5 @@
1
+ export interface WindowStorybookProps {
2
+ IS_STORYBOOK?: boolean;
3
+ }
4
+
5
+ export const isStorybook = (window as WindowStorybookProps).IS_STORYBOOK;
@@ -0,0 +1,44 @@
1
+ import { useEffect, useRef } from 'react';
2
+ import { useIsomorphicLayoutEffect } from 'usehooks-ts';
3
+
4
+ /**
5
+ * Copied from usehooks-ts
6
+ *
7
+ * Custom hook that creates an interval that invokes a callback function at a specified delay using the [`setInterval API`](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/setInterval).
8
+ * @param {() => void} callback - The function to be invoked at each interval.
9
+ * @param {number | null} delay - The time, in milliseconds, between each invocation of the callback. Use `null` to clear the interval.
10
+ * @public
11
+ * @see [Documentation](https://usehooks-ts.com/react-hook/use-interval)
12
+ * @example
13
+ * ```tsx
14
+ * const handleInterval = () => {
15
+ * // Code to be executed at each interval
16
+ * };
17
+ * useInterval(handleInterval, 1000);
18
+ * ```
19
+ */
20
+ export function useInterval(callback: () => void, delay: number | null) {
21
+ const savedCallback = useRef(callback);
22
+
23
+ // Remember the latest callback if it changes.
24
+ useIsomorphicLayoutEffect(() => {
25
+ savedCallback.current = callback;
26
+ }, [callback]);
27
+
28
+ // Set up the interval.
29
+ useEffect(() => {
30
+ // Don't schedule if no delay is specified.
31
+ // Note: 0 is a valid value for delay.
32
+ if (delay === null) {
33
+ return;
34
+ }
35
+
36
+ const id = setInterval(() => {
37
+ savedCallback.current();
38
+ }, delay);
39
+
40
+ return () => {
41
+ clearInterval(id);
42
+ };
43
+ }, [delay]);
44
+ }
@@ -0,0 +1,18 @@
1
+ import { useEffect, useLayoutEffect } from 'react';
2
+
3
+ /**
4
+ * Copied from usehooks-ts
5
+ *
6
+ * Custom hook that uses either `useLayoutEffect` or `useEffect` based on the environment (client-side or server-side).
7
+ * @param {Function} effect - The effect function to be executed.
8
+ * @param {Array<any>} [dependencies] - An array of dependencies for the effect (optional).
9
+ * @public
10
+ * @see [Documentation](https://usehooks-ts.com/react-hook/use-isomorphic-layout-effect)
11
+ * @example
12
+ * ```tsx
13
+ * useIsomorphicLayoutEffect(() => {
14
+ * // Code to be executed during the layout phase on the client side
15
+ * }, [dependency1, dependency2]);
16
+ * ```
17
+ */
18
+ export const useIsomorphicLayoutEffect = typeof window !== 'undefined' ? useLayoutEffect : useEffect;