@axinom/mosaic-ui 0.66.0-rc.13 → 0.66.0-rc.15

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 (46) hide show
  1. package/dist/components/DynamicDataList/DynamicListHeader/DynamicListHeader.d.ts.map +1 -1
  2. package/dist/components/List/ListHeader/ColumnLabel/ColumnLabel.d.ts.map +1 -1
  3. package/dist/components/List/ListHeader/ListHeader.d.ts.map +1 -1
  4. package/dist/components/List/ListRow/ListRow.d.ts.map +1 -1
  5. package/dist/components/List/ListRow/ListRowCell/ListRowCell.d.ts +15 -0
  6. package/dist/components/List/ListRow/ListRowCell/ListRowCell.d.ts.map +1 -0
  7. package/dist/components/List/ListRow/ListRowCell/renderData.d.ts +9 -0
  8. package/dist/components/List/ListRow/ListRowCell/renderData.d.ts.map +1 -0
  9. package/dist/components/List/ListRow/Renderers/TagsRenderer/TagsRenderer.d.ts.map +1 -1
  10. package/dist/components/Utils/Postgraphile/CreateConnectionRenderer.d.ts +1 -1
  11. package/dist/components/Utils/Postgraphile/CreateConnectionRenderer.d.ts.map +1 -1
  12. package/dist/helpers/idleCallbackHelpers.d.ts +42 -0
  13. package/dist/helpers/idleCallbackHelpers.d.ts.map +1 -0
  14. package/dist/helpers/index.d.ts +1 -0
  15. package/dist/helpers/index.d.ts.map +1 -1
  16. package/dist/hooks/useResize/useResize.d.ts +3 -0
  17. package/dist/hooks/useResize/useResize.d.ts.map +1 -1
  18. package/dist/index.es.js +4 -4
  19. package/dist/index.es.js.map +1 -1
  20. package/dist/index.js +4 -4
  21. package/dist/index.js.map +1 -1
  22. package/package.json +2 -2
  23. package/src/components/DynamicDataList/DynamicDataList.scss +1 -0
  24. package/src/components/DynamicDataList/DynamicListHeader/DynamicListHeader.scss +10 -0
  25. package/src/components/DynamicDataList/DynamicListHeader/DynamicListHeader.spec.tsx +2 -0
  26. package/src/components/DynamicDataList/DynamicListHeader/DynamicListHeader.tsx +65 -49
  27. package/src/components/List/List.scss +1 -0
  28. package/src/components/List/ListHeader/ColumnLabel/ColumnLabel.spec.tsx +4 -4
  29. package/src/components/List/ListHeader/ColumnLabel/ColumnLabel.tsx +5 -1
  30. package/src/components/List/ListHeader/ListHeader.scss +10 -1
  31. package/src/components/List/ListHeader/ListHeader.spec.tsx +2 -0
  32. package/src/components/List/ListHeader/ListHeader.tsx +60 -50
  33. package/src/components/List/ListRow/ListRow.scss +0 -27
  34. package/src/components/List/ListRow/ListRow.spec.tsx +10 -8
  35. package/src/components/List/ListRow/ListRow.tsx +20 -152
  36. package/src/components/List/ListRow/ListRowCell/ListRowCell.scss +26 -0
  37. package/src/components/List/ListRow/ListRowCell/ListRowCell.spec.tsx +491 -0
  38. package/src/components/List/ListRow/ListRowCell/ListRowCell.tsx +57 -0
  39. package/src/components/List/ListRow/ListRowCell/renderData.tsx +124 -0
  40. package/src/components/List/ListRow/Renderers/TagsRenderer/TagsRenderer.spec.tsx +191 -80
  41. package/src/components/List/ListRow/Renderers/TagsRenderer/TagsRenderer.tsx +63 -34
  42. package/src/components/Utils/Postgraphile/CreateConnectionRenderer.spec.ts +48 -12
  43. package/src/components/Utils/Postgraphile/CreateConnectionRenderer.tsx +5 -4
  44. package/src/helpers/idleCallbackHelpers.ts +66 -0
  45. package/src/helpers/index.ts +5 -0
  46. package/src/hooks/useResize/useResize.ts +36 -4
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@axinom/mosaic-ui",
3
- "version": "0.66.0-rc.13",
3
+ "version": "0.66.0-rc.15",
4
4
  "description": "UI components for building Axinom Mosaic applications",
5
5
  "author": "Axinom",
6
6
  "license": "PROPRIETARY",
@@ -112,5 +112,5 @@
112
112
  "publishConfig": {
113
113
  "access": "public"
114
114
  },
115
- "gitHead": "f2b0591969b1a8bacd397ad7270e0322d11e0314"
115
+ "gitHead": "79cc9f1ccdc2d279bff514a1714b4e86b8cebc5e"
116
116
  }
@@ -8,4 +8,5 @@
8
8
  grid-template-rows: 1fr;
9
9
  grid-template-columns: 1fr;
10
10
  row-gap: var(--dynamic-list-row-gap, $dynamic-list-row-gap);
11
+ position: relative;
11
12
  }
@@ -1,5 +1,15 @@
1
1
  @import '../../../styles/common.scss';
2
2
 
3
+ .resizeIndicator {
4
+ position: absolute;
5
+ top: 0;
6
+ bottom: 0;
7
+ width: 1px;
8
+ background-color: var(--explorer-list-row-border, #dddddd);
9
+ pointer-events: none;
10
+ z-index: 10;
11
+ }
12
+
3
13
  .container {
4
14
  background-color: var(
5
15
  --explorer-background-color,
@@ -238,6 +238,8 @@ describe('DynamicListHeader', () => {
238
238
  } as any),
239
239
  );
240
240
 
241
+ window.dispatchEvent(new Event('mouseup', {} as any));
242
+
241
243
  expect(spy).toHaveBeenCalledTimes(1);
242
244
  });
243
245
  });
@@ -70,60 +70,76 @@ export const DynamicListHeader = <T extends Data>({
70
70
  customStyles.top = 0;
71
71
  }
72
72
 
73
- const { cols, mouseDown } = useResize(columns, onColumnSizesChanged);
73
+ const { cols, mouseDown, isResizing, resizePosition, containerRef } =
74
+ useResize(columns, onColumnSizesChanged);
74
75
 
75
76
  return (
76
- <div
77
- className={clsx(
78
- classes.container,
79
- 'dynamic-list-header-container',
80
- className,
81
- )}
82
- style={customStyles}
83
- data-test-id="dynamic-list-header"
84
- >
85
- {showPositionColumn && (
77
+ <>
78
+ {isResizing && resizePosition !== undefined && (
86
79
  <div
87
- className={clsx(classes.column)}
88
- data-test-id="dynamic-list-header-cell"
89
- >
90
- <p className={clsx(classes.position)}>
91
- {positionLabel ?? (allowDragging ? 'Position' : 'Pos')}
92
- </p>
93
- <div
94
- className={clsx(classes.resizeHandle, classes.resizeHandleDisabled)}
95
- />
96
- </div>
80
+ className={classes.resizeIndicator}
81
+ style={{ left: `${resizePosition}px` }}
82
+ />
97
83
  )}
98
- {columns.map((column, i) => (
99
- <div
100
- key={column.key ?? (column.propertyName as string)}
101
- className={clsx(classes.column)}
102
- ref={cols[i].ref}
103
- data-test-id={`dynamic-list-header-property:${
104
- column.propertyName as string
105
- }`}
106
- >
107
- <p>{column.label}</p>
84
+ <div
85
+ className={clsx(
86
+ classes.container,
87
+ 'dynamic-list-header-container',
88
+ className,
89
+ )}
90
+ ref={containerRef}
91
+ style={customStyles}
92
+ data-test-id="dynamic-list-header"
93
+ >
94
+ {showPositionColumn && (
108
95
  <div
109
- onMouseDown={
110
- !column.disableResizing
111
- ? (e) => {
112
- e.preventDefault();
113
- mouseDown(i);
114
- }
115
- : undefined
116
- }
117
- onDoubleClick={onResetColumnSizes}
118
- className={clsx(classes.resizeHandle, {
119
- [classes.resizeHandleDisabled]: column.disableResizing ?? false,
120
- })}
96
+ className={clsx(classes.column)}
97
+ data-test-id="dynamic-list-header-cell"
98
+ >
99
+ <p className={clsx(classes.position)}>
100
+ {positionLabel ?? (allowDragging ? 'Position' : 'Pos')}
101
+ </p>
102
+ <div
103
+ className={clsx(
104
+ classes.resizeHandle,
105
+ classes.resizeHandleDisabled,
106
+ )}
107
+ />
108
+ </div>
109
+ )}
110
+ {columns.map((column, i) => (
111
+ <div
112
+ key={column.key ?? (column.propertyName as string)}
113
+ className={clsx(classes.column)}
114
+ ref={cols[i].ref}
115
+ data-test-id={`dynamic-list-header-property:${
116
+ column.propertyName as string
117
+ }`}
118
+ >
119
+ <p>{column.label}</p>
120
+ <div
121
+ onMouseDown={
122
+ !column.disableResizing
123
+ ? (e) => {
124
+ e.preventDefault();
125
+ mouseDown(i);
126
+ }
127
+ : undefined
128
+ }
129
+ onDoubleClick={onResetColumnSizes}
130
+ className={clsx(classes.resizeHandle, {
131
+ [classes.resizeHandleDisabled]: column.disableResizing ?? false,
132
+ })}
133
+ />
134
+ </div>
135
+ ))}
136
+ {showActionColumn && (
137
+ <div
138
+ className={clsx(classes.column)}
139
+ ref={cols[cols.length - 1].ref}
121
140
  />
122
- </div>
123
- ))}
124
- {showActionColumn && (
125
- <div className={clsx(classes.column)} ref={cols[cols.length - 1].ref} />
126
- )}
127
- </div>
141
+ )}
142
+ </div>
143
+ </>
128
144
  );
129
145
  };
@@ -12,6 +12,7 @@
12
12
  $explorer-background-color
13
13
  );
14
14
  overflow-x: auto;
15
+ position: relative;
15
16
 
16
17
  .LoadingData {
17
18
  margin: 1rem 0;
@@ -77,7 +77,7 @@ describe('ColumnLabel', () => {
77
77
  );
78
78
 
79
79
  const columnTitle = wrapper.find('.clickWrapper');
80
- columnTitle.simulate('click');
80
+ columnTitle.simulate('click', { stopPropagation: jest.fn() });
81
81
 
82
82
  expect(spy).toHaveBeenCalledTimes(1);
83
83
  expect(spy).toHaveBeenCalledWith({
@@ -102,7 +102,7 @@ describe('ColumnLabel', () => {
102
102
  );
103
103
 
104
104
  const columnTitle = wrapper.find('.clickWrapper');
105
- columnTitle.simulate('click');
105
+ columnTitle.simulate('click', { stopPropagation: jest.fn() });
106
106
 
107
107
  expect(spy).toHaveBeenCalledTimes(1);
108
108
  expect(spy).toHaveBeenCalledWith({
@@ -126,7 +126,7 @@ describe('ColumnLabel', () => {
126
126
  );
127
127
 
128
128
  const columnTitle = wrapper.find('.clickWrapper');
129
- columnTitle.simulate('click');
129
+ columnTitle.simulate('click', { stopPropagation: jest.fn() });
130
130
 
131
131
  expect(spy).toHaveBeenCalledTimes(1);
132
132
  expect(spy).toHaveBeenCalledWith({
@@ -150,7 +150,7 @@ describe('ColumnLabel', () => {
150
150
  );
151
151
 
152
152
  const columnTitle = wrapper.find('.clickWrapper');
153
- columnTitle.simulate('click');
153
+ columnTitle.simulate('click', { stopPropagation: jest.fn() });
154
154
 
155
155
  expect(spy).toHaveBeenCalledTimes(1);
156
156
  expect(spy).toHaveBeenCalledWith({
@@ -65,7 +65,11 @@ export const ColumnLabel = <T,>({
65
65
  <div
66
66
  className={clsx(classes.clickWrapper, classes.sortable)}
67
67
  onClick={
68
- propertyName && (() => onSortChanged(getSortDir(propertyName)))
68
+ propertyName &&
69
+ ((e) => {
70
+ onSortChanged(getSortDir(propertyName));
71
+ e.stopPropagation();
72
+ })
69
73
  }
70
74
  data-test-id={`list-label:${String(propertyName)}`}
71
75
  data-test-sort-dir={direction ?? 'none'}
@@ -1,11 +1,20 @@
1
1
  @import '../../../styles/common.scss';
2
2
 
3
+ .resizeIndicator {
4
+ position: absolute;
5
+ top: 0;
6
+ bottom: 0;
7
+ width: 1px;
8
+ background-color: var(--explorer-list-row-border, #dddddd);
9
+ pointer-events: none;
10
+ z-index: 1;
11
+ }
12
+
3
13
  .container {
4
14
  padding-left: 5px;
5
15
  display: grid;
6
16
  position: sticky;
7
17
  top: 0;
8
- //z-index: 1;
9
18
 
10
19
  background-color: var(
11
20
  --explorer-header-background-color,
@@ -208,6 +208,8 @@ describe('ListHeader', () => {
208
208
  } as any),
209
209
  );
210
210
 
211
+ window.dispatchEvent(new Event('mouseup', {} as any));
212
+
211
213
  expect(spy).toHaveBeenCalledTimes(1);
212
214
  });
213
215
  });
@@ -85,60 +85,70 @@ export const ListHeader = <T extends Data>({
85
85
  alignItems: verticalTextAlign,
86
86
  } as React.CSSProperties;
87
87
 
88
- const { cols, mouseDown } = useResize(columns, onColumnSizesChanged);
88
+ const { cols, mouseDown, isResizing, resizePosition, containerRef } =
89
+ useResize(columns, onColumnSizesChanged);
89
90
 
90
91
  return (
91
- <div
92
- className={clsx(classes.container, 'list-header-container', className)}
93
- style={customStyles}
94
- data-test-id="list-header"
95
- >
96
- {columns.map((column, i) => (
92
+ <>
93
+ {isResizing && resizePosition !== undefined && (
97
94
  <div
98
- key={column.key ?? (column.propertyName as string)}
99
- ref={cols[i].ref}
100
- className={clsx(classes.columnLabel)}
101
- >
102
- <ColumnLabel<T>
103
- propertyName={column.propertyName}
104
- label={column.label ?? (column.propertyName as string)}
105
- sortable={column.sortable}
106
- columnSortKeys={column?.columnSortKeys}
107
- sortData={sortData}
108
- onSortChanged={onSortChanged}
109
- />
95
+ className={classes.resizeIndicator}
96
+ style={{ left: `${resizePosition}px` }}
97
+ />
98
+ )}
99
+ <div
100
+ className={clsx(classes.container, 'list-header-container', className)}
101
+ style={customStyles}
102
+ data-test-id="list-header"
103
+ ref={containerRef}
104
+ >
105
+ {columns.map((column, i) => (
110
106
  <div
111
- onMouseDown={
112
- !column.disableResizing
113
- ? (e) => {
114
- e.preventDefault();
115
- mouseDown(i);
116
- }
117
- : undefined
118
- }
119
- onDoubleClick={() => onResetColumnSizes()}
120
- className={clsx(classes.resizeHandle, {
121
- [classes.resizeHandleDisabled]: column.disableResizing,
122
- })}
123
- />
124
- </div>
125
- ))}
126
- {hasActionColumn && (
127
- <div
128
- ref={cols[cols.length - 1].ref}
129
- className={clsx(classes.columnLabel)}
130
- >
131
- {showItemCheckbox && (
132
- <ListCheckBox
133
- height={actionSize}
134
- width={actionSize}
135
- isChecked={itemSelected}
136
- isDisabled={isCheckboxDisabled}
137
- onCheckBoxToggled={onCheckboxToggled}
107
+ key={column.key ?? (column.propertyName as string)}
108
+ ref={cols[i].ref}
109
+ className={clsx(classes.columnLabel)}
110
+ >
111
+ <ColumnLabel<T>
112
+ propertyName={column.propertyName}
113
+ label={column.label ?? (column.propertyName as string)}
114
+ sortable={column.sortable}
115
+ columnSortKeys={column?.columnSortKeys}
116
+ sortData={sortData}
117
+ onSortChanged={onSortChanged}
138
118
  />
139
- )}
140
- </div>
141
- )}
142
- </div>
119
+ <div
120
+ onMouseDown={
121
+ !column.disableResizing
122
+ ? (e) => {
123
+ e.preventDefault();
124
+ mouseDown(i);
125
+ }
126
+ : undefined
127
+ }
128
+ onDoubleClick={() => onResetColumnSizes()}
129
+ className={clsx(classes.resizeHandle, {
130
+ [classes.resizeHandleDisabled]: column.disableResizing,
131
+ })}
132
+ />
133
+ </div>
134
+ ))}
135
+ {hasActionColumn && (
136
+ <div
137
+ ref={cols[cols.length - 1].ref}
138
+ className={clsx(classes.columnLabel)}
139
+ >
140
+ {showItemCheckbox && (
141
+ <ListCheckBox
142
+ height={actionSize}
143
+ width={actionSize}
144
+ isChecked={itemSelected}
145
+ isDisabled={isCheckboxDisabled}
146
+ onCheckBoxToggled={onCheckboxToggled}
147
+ />
148
+ )}
149
+ </div>
150
+ )}
151
+ </div>
152
+ </>
143
153
  );
144
154
  };
@@ -32,33 +32,6 @@
32
32
  color: var(--disabled-text-color, $gray);
33
33
  }
34
34
 
35
- .cellWrapper {
36
- display: grid;
37
- width: 100%;
38
- height: 100%;
39
- }
40
-
41
- .cell {
42
- max-width: 100%;
43
- max-height: 100%;
44
-
45
- span {
46
- padding: 5px 0;
47
- display: block;
48
- width: 100%;
49
- }
50
-
51
- &.nowrap {
52
- overflow: hidden;
53
-
54
- span {
55
- white-space: nowrap;
56
- text-overflow: ellipsis;
57
- overflow: hidden;
58
- }
59
- }
60
- }
61
-
62
35
  .actions {
63
36
  display: grid;
64
37
  grid-template-rows: 1fr;
@@ -47,7 +47,7 @@ describe('ListRow', () => {
47
47
  `(
48
48
  'renders the defined columns in the defined order -> $name',
49
49
  ({ expectedColumns }: { expectedColumns: Column<TestExplorerData>[] }) => {
50
- const wrapper = shallow(
50
+ const wrapper = mount(
51
51
  <ListRow {...mockProps} columns={expectedColumns} />,
52
52
  );
53
53
 
@@ -74,7 +74,7 @@ describe('ListRow', () => {
74
74
 
75
75
  setLocale('en-US');
76
76
 
77
- const wrapper = shallow(
77
+ const wrapper = mount(
78
78
  <ListRow
79
79
  data={rowData}
80
80
  columns={expectedColumns}
@@ -115,7 +115,7 @@ describe('ListRow', () => {
115
115
  ];
116
116
  const rowData = { value: 'something' };
117
117
 
118
- const wrapper = shallow(
118
+ const wrapper = mount(
119
119
  // @ts-expect-error Typings to not match up
120
120
  <ListRow {...mockProps} data={rowData} columns={expectedColumns} />,
121
121
  );
@@ -129,9 +129,7 @@ describe('ListRow', () => {
129
129
  { propertyName: "doesn't exist", size: '1fr', label: 'desc' },
130
130
  ];
131
131
 
132
- const wrapper = shallow(
133
- <ListRow {...mockProps} columns={expectedColumns} />,
134
- );
132
+ const wrapper = mount(<ListRow {...mockProps} columns={expectedColumns} />);
135
133
 
136
134
  const actualColumns = wrapper.find('.cellWrapper');
137
135
 
@@ -488,12 +486,16 @@ describe('ListRow', () => {
488
486
  ];
489
487
  const rowData = { value: mockValue };
490
488
 
491
- const wrapper = shallow(
489
+ const wrapper = mount(
492
490
  // @ts-expect-error Typings to not match up
493
491
  <ListRow {...mockProps} data={rowData} columns={expectedColumns} />,
494
492
  );
495
493
 
496
- const cell = wrapper.find('.cell').first();
494
+ // When a custom renderer returns a string, it's wrapped in a span with data-test-id
495
+ const span = wrapper
496
+ .find('span[data-test-id="list-entry-property:value"]')
497
+ .first();
498
+ const cell = span.closest('.cell');
497
499
 
498
500
  expect(cell.prop('title')).toBe(mockValue);
499
501
  });