Skip to content

Commit 0e5e9b6

Browse files
feat(ObjectPage): Add 'Pin-Header' button (#354)
This PR includes a full refactoring of the ObjectPage using native CSS capabilities instead of custom scroll handlers. This might lead to problems in IE11 and needs to be tested as well. The Anchor Bar was replaced with the UI5 Web Component TabContainer in order to improve accessibility and RTL. --> #345 Closes #334 Closes #248
1 parent 8db97c3 commit 0e5e9b6

24 files changed

+1804
-2205
lines changed

config/jest.config.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ module.exports = {
1919
'!packages/main/src/components/AnalyticalTable/types/*', // no table enums
2020
'!packages/base/src/styling/sap_fiori_3.ts', // no old theming parameters
2121
'!packages/base/src/styling/HSLColor.ts', // no deprecated HSL Util
22-
'!packages/base/src/styling/font72.ts' // no deprecated font
22+
'!packages/base/src/styling/font72.ts', // no deprecated font
23+
'!packages/base/src/Scroller/*' // no scroll lib as it is not longer used
2324
],
2425
setupFiles: ['jest-canvas-mock'],
2526
setupFilesAfterEnv: ['./config/jestsetup.ts'],

config/jestsetup.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import Enzyme from 'enzyme';
44
import Adapter from 'enzyme-adapter-react-16';
55
import { createSerializer } from 'enzyme-to-json';
66
import ResizeObserver from 'resize-observer-polyfill';
7+
import 'intersection-observer';
78
import '@ui5/webcomponents/dist/json-imports/i18n';
89

910
process.env.NODE_ENV = 'test';

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@
6565
"gzip-size": "^5.1.0",
6666
"husky": "^4.2.1",
6767
"identity-obj-proxy": "^3.0.0",
68+
"intersection-observer": "^0.7.0",
6869
"jest": "^25.1.0",
6970
"jest-canvas-mock": "^2.2.0",
7071
"jest-environment-jsdom-sixteen": "^1.0.2",

packages/base/package.json

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@
1616
"**/modernizr.js",
1717
"core-js/**/*",
1818
"./src/polyfill/*.ts",
19-
"./polyfill/*.js"
19+
"./polyfill/*.js",
20+
"intersection-observer"
2021
],
2122
"scripts": {
2223
"clean": "rimraf cjs Device hooks lib polyfill styling types utils index.esm.js index.d.ts",
@@ -26,7 +27,9 @@
2627
},
2728
"dependencies": {
2829
"core-js": "3.6.4",
29-
"resize-observer-polyfill": "^1.5.1"
30+
"intersection-observer": "^0.7.0",
31+
"resize-observer-polyfill": "^1.5.1",
32+
"smoothscroll-polyfill": "^0.4.4"
3033
},
3134
"peerDependencies": {
3235
"react": "^16.8.0",

packages/base/src/Scroller/Scroller.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { IScroller } from '@ui5/webcomponents-react-base/interfaces/IScroller';
22
import React, { forwardRef, RefObject, useCallback, useEffect, useImperativeHandle, useRef, useState } from 'react';
3-
3+
import { deprecationNotice } from '@ui5/webcomponents-react-base/lib/Utils';
44
import { ScrollContentProvider } from './ScrollContextProvider';
55
import { scrollTo } from './ScrollHelper';
66

@@ -10,6 +10,11 @@ export interface Props {
1010
forceSelection?: boolean;
1111
}
1212

13+
deprecationNotice(
14+
'Scroller',
15+
"'@ui5/webcomponents-react-base/lib/Scroller' is deprecated and will be removed in the next major release."
16+
);
17+
1318
export const Scroller = forwardRef((props: Props, ref: RefObject<IScroller>) => {
1419
const { children, scrollContainer, forceSelection = true } = props;
1520

packages/base/src/polyfill/Edge.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
11
import ResizeObserver from 'resize-observer-polyfill';
2+
import 'intersection-observer';
3+
import smoothscroll from 'smoothscroll-polyfill';
24

35
// @ts-ignore
46
window.ResizeObserver = ResizeObserver;
7+
8+
// required for scrollTo methods
9+
smoothscroll.polyfill();

packages/base/src/polyfill/IE11.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,11 @@ import 'core-js/modules/es.object.assign';
33
import 'core-js/modules/es.object.values';
44
import 'core-js/modules/es.array.from';
55
import ResizeObserver from 'resize-observer-polyfill';
6+
import 'intersection-observer';
7+
import smoothscroll from 'smoothscroll-polyfill';
68

79
// @ts-ignore
810
window.ResizeObserver = ResizeObserver;
11+
12+
// required for scrollTo methods
13+
smoothscroll.polyfill();

packages/main/src/components/AnalyticalTable/demo/generateData.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,6 @@ const makeTreeEntry = (...lens) => {
5252
return makeDataLevel();
5353
};
5454

55-
56-
5755
const makeEntry = () => ({
5856
name: getRandomName(),
5957
longColumn: 'Really really long column content... don´t crop please',

packages/main/src/components/ObjectPage/CollapsedAvatar.tsx

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { StyleClassHelper } from '@ui5/webcomponents-react-base/lib/StyleClassHelper';
22
import { AvatarSize } from '@ui5/webcomponents-react/lib/AvatarSize';
3-
import React, { ReactElement, useLayoutEffect, useMemo, useRef, useState } from 'react';
3+
import React, { useEffect, useMemo, useRef, useState, ReactElement } from 'react';
44
import { createComponentStyles } from '@ui5/webcomponents-react-base/lib/createComponentStyles';
55

66
const styles = {
@@ -51,7 +51,7 @@ export const CollapsedAvatar = (props: CollapsedAvatarPropTypes) => {
5151
className={classes.imageContainer}
5252
style={{ borderRadius: imageShapeCircle ? '50%' : 0, overflow: 'hidden' }}
5353
>
54-
<img className={classes.image} src={image} alt="Company Logo" />
54+
<img className={classes.image} src={image} alt="Object Page Image" />
5555
</span>
5656
);
5757
} else {
@@ -65,10 +65,8 @@ export const CollapsedAvatar = (props: CollapsedAvatarPropTypes) => {
6565
}
6666
}, [image, imageShapeCircle]);
6767

68-
useLayoutEffect(() => {
69-
requestAnimationFrame(() => {
70-
setIsMounted(true);
71-
});
68+
useEffect(() => {
69+
setIsMounted(true);
7270
}, []);
7371

7472
const containerClasses = StyleClassHelper.of(classes.base);

packages/main/src/components/ObjectPage/ObjectPage.jss.ts

Lines changed: 43 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -5,76 +5,66 @@ const styles = {
55
width: '100%',
66
height: '100%',
77
position: 'relative',
8-
display: 'flex',
9-
flexDirection: 'column',
10-
isolation: 'isolate',
118
whiteSpace: 'normal',
129
fontFamily: ThemingParameters.sapFontFamily,
13-
backgroundColor: ThemingParameters.sapBackgroundColor
14-
},
15-
contentContainer: {
10+
backgroundColor: ThemingParameters.sapBackgroundColor,
1611
overflowX: 'hidden',
1712
overflowY: 'auto',
18-
position: 'relative',
19-
flexGrow: 1
20-
},
21-
outerContentContainer: {
22-
width: '100%',
23-
height: '100%',
24-
overflow: 'hidden'
25-
},
26-
contentScrollContainer: {
27-
position: 'relative'
13+
'&::-webkit-scrollbar': {
14+
backgroundColor: ThemingParameters.sapScrollBar_TrackColor,
15+
width: ThemingParameters.sapScrollBar_Dimension
16+
},
17+
'&::-webkit-scrollbar-thumb': {
18+
backgroundColor: ThemingParameters.sapScrollBar_BorderColor,
19+
'&:hover': {
20+
backgroundColor: ThemingParameters.sapScrollBar_Hover_FaceColor
21+
}
22+
},
23+
'&::-webkit-scrollbar-corner': {
24+
backgroundColor: ThemingParameters.sapScrollBar_TrackColor
25+
},
26+
'& section[id="ObjectPageSection-1"] > div[role="heading"]': {
27+
display: 'none'
28+
}
2829
},
29-
anchorBar: {
30-
paddingLeft: '2rem',
31-
backgroundColor: ThemingParameters.sapObjectHeader_Background,
32-
boxShadow: `inset 0 -0.0625rem ${ThemingParameters.sapObjectHeader_BorderColor}, inset 0 0.0625rem ${ThemingParameters.sapObjectHeader_BorderColor}`,
33-
display: 'flex',
34-
height: '2.75rem',
35-
minHeight: '2.75rem',
36-
position: 'relative'
30+
iconTabBarMode: {
31+
'& section[data-component-name="ObjectPageSection"] > div[role="heading"]': {
32+
display: 'none'
33+
}
3734
},
38-
sectionsContainer: {
39-
'&:before': {
40-
display: 'table',
41-
content: '""'
42-
},
43-
'& :first-child > div[role="heading"]': {
35+
noHeader: {
36+
'& $header': {
4437
display: 'none'
4538
},
46-
position: 'relative',
47-
height: '100%',
48-
// overflowX: 'hidden',
49-
// overflowY: 'auto',
50-
overflow: 'hidden',
51-
backgroundColor: ThemingParameters.sapBackgroundColor,
52-
'&:after': {
53-
clear: 'both',
54-
display: 'table',
55-
content: '""'
39+
'& $contentHeader': {
40+
display: 'none'
5641
}
5742
},
58-
fillerDiv: {
59-
backgroundColor: ThemingParameters.sapBackgroundColor
43+
headerCollapsed: {
44+
'& $contentHeader': {
45+
display: 'none'
46+
}
6047
},
6148
// header
6249
header: {
6350
flexShrink: 0,
64-
position: 'relative',
6551
backgroundColor: ThemingParameters.sapObjectHeader_Background,
66-
'&$stickied': {
67-
'& $image': {
68-
opacity: '1',
69-
height: '3rem',
70-
width: '3rem',
71-
margin: '0.25rem 1rem 0.25rem 0'
72-
}
73-
}
52+
position: 'sticky',
53+
top: 0,
54+
zIndex: 2
7455
},
7556
contentHeader: {
7657
backgroundColor: ThemingParameters.sapObjectHeader_Background,
77-
position: 'relative'
58+
position: 'sticky',
59+
paddingBottom: '0.25rem',
60+
maxHeight: '500px',
61+
overflow: 'hidden',
62+
paddingLeft: '2rem'
63+
},
64+
anchorBar: {
65+
position: 'sticky',
66+
zIndex: 2,
67+
'--_ui5_tc_header_box_shadow': 'inset 0px -1px 0 0px rgba(0,0,0,0.15)'
7868
},
7969
titleBar: {
8070
padding: '0.5rem 2rem',
@@ -122,18 +112,8 @@ const styles = {
122112
padding: 0
123113
}
124114
},
125-
stickied: {},
126-
headerContent: {
127-
//paddingTop: '1.5rem',
128-
paddingBottom: '0.25rem',
129-
transition: 'max-height 0.5s',
130-
maxHeight: '500px',
131-
overflow: 'hidden',
132-
paddingLeft: '2rem',
133-
position: 'relative'
134-
},
135115
titleInHeaderContent: {
136-
'& $headerContent': {
116+
'& contentHeader': {
137117
paddingTop: 0,
138118
'& > *': {
139119
display: 'flex',
@@ -148,17 +128,6 @@ const styles = {
148128
// paddingTop: 0
149129
}
150130
},
151-
alwaysVisibleHeader: {
152-
'& $headerContent': {
153-
paddingLeft: 0
154-
},
155-
'& $contentHeader': {
156-
marginTop: '0.5rem'
157-
},
158-
'& $titleBar': {
159-
paddingBottom: 0
160-
}
161-
},
162131
headerCustomContent: {
163132
display: 'inline-block',
164133
verticalAlign: 'top',
@@ -196,13 +165,6 @@ const styles = {
196165
},
197166
avatar: {
198167
marginRight: '1rem'
199-
},
200-
toggleHeaderButton: {
201-
position: 'absolute',
202-
'--_ui5_button_compact_height': '1.25rem',
203-
'--_ui5_button_base_height': '1.25rem',
204-
top: `-0.625rem`,
205-
left: 'calc(50% - 1rem)'
206168
}
207169
};
208170

0 commit comments

Comments
 (0)