@skyscanner/backpack-web 0.0.5 → 0.0.6
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.
- package/bpk-component-accordion/src/BpkAccordionItem.js +2 -2
- package/bpk-component-accordion/src/withAccordionItemState.js +1 -1
- package/bpk-component-aria-live/examples.js +2 -1
- package/bpk-component-autosuggest/examples.js +2 -2
- package/bpk-component-badge/examples.js +1 -1
- package/bpk-component-banner-alert/examples.js +1 -1
- package/bpk-component-barchart/src/BpkChartGridLines.js +8 -8
- package/bpk-component-button/examples.js +1 -1
- package/bpk-component-calendar/coloured-calendar-example.js +1 -1
- package/bpk-component-calendar/examples-components.js +1 -1
- package/bpk-component-calendar/examples.js +1 -1
- package/bpk-component-calendar/src/BpkCalendarGridTransition.js +11 -11
- package/bpk-component-calendar/src/BpkCalendarNav.js +8 -8
- package/bpk-component-calendar/src/Week.js +1 -1
- package/bpk-component-checkbox/examples.js +1 -1
- package/bpk-component-chip/examples.js +1 -1
- package/bpk-component-close-button/examples.js +1 -1
- package/bpk-component-datepicker/examples.js +1 -1
- package/bpk-component-dialog/src/BpkDialogInner.js +1 -1
- package/bpk-component-drawer/src/BpkDrawer.js +1 -1
- package/bpk-component-fieldset/examples.js +2 -2
- package/bpk-component-horizontal-nav/examples.js +1 -1
- package/bpk-component-icon/src/withAlignment.js +3 -2
- package/bpk-component-image/src/withLoadingBehavior.js +27 -27
- package/bpk-component-infinite-scroll/examples.js +1 -1
- package/bpk-component-infinite-scroll/src/withInfiniteScroll.js +105 -105
- package/bpk-component-input/examples.js +1 -1
- package/bpk-component-link/examples.js +1 -1
- package/bpk-component-loading-button/examples.js +1 -1
- package/bpk-component-map/examples.js +1 -1
- package/bpk-component-modal/examples.js +1 -1
- package/bpk-component-modal/src/BpkModal.js +7 -7
- package/bpk-component-navigation-bar/examples.js +1 -1
- package/bpk-component-navigation-stack/src/BpkNavigationStack.js +4 -3
- package/bpk-component-navigation-stack/stories-components.js +14 -14
- package/bpk-component-nudger/examples.js +1 -1
- package/bpk-component-overlay/src/BpkOverlay.js +1 -1
- package/bpk-component-radio/examples.js +1 -1
- package/bpk-component-scrollable-calendar/examples.js +1 -1
- package/bpk-component-section-list/examples.js +1 -1
- package/bpk-component-select/examples.js +1 -1
- package/bpk-component-slider/examples.js +8 -8
- package/bpk-component-star-rating/examples.js +1 -1
- package/bpk-component-star-rating/src/BpkStarRating.js +3 -3
- package/bpk-component-textarea/examples.js +1 -1
- package/bpk-component-ticket/src/BpkTicket.js +6 -6
- package/bpk-component-tooltip/examples.js +1 -1
- package/package.json +1 -1
|
@@ -79,8 +79,8 @@ const BpkAccordionItem = (props: Props) => {
|
|
|
79
79
|
const contentId = `${id}_content`;
|
|
80
80
|
const clonedIcon = icon
|
|
81
81
|
? React.cloneElement(icon, {
|
|
82
|
-
|
|
83
|
-
|
|
82
|
+
className: getClassName('bpk-accordion__leading-icon'),
|
|
83
|
+
})
|
|
84
84
|
: null;
|
|
85
85
|
|
|
86
86
|
return (
|
|
@@ -187,7 +187,8 @@ class ChipsExample extends React.Component<
|
|
|
187
187
|
const nextState = prevState;
|
|
188
188
|
nextState.categories[category] = !prevState.categories[category];
|
|
189
189
|
nextState.updates.push(
|
|
190
|
-
`${category} became ${
|
|
190
|
+
`${category} became ${
|
|
191
|
+
nextState.categories[category] ? 'enabled' : 'disabled'
|
|
191
192
|
}.`,
|
|
192
193
|
);
|
|
193
194
|
return nextState;
|
|
@@ -108,8 +108,8 @@ const getSuggestions = (value, hanzi) => {
|
|
|
108
108
|
return inputLength === 0
|
|
109
109
|
? []
|
|
110
110
|
: data.filter(
|
|
111
|
-
|
|
112
|
-
|
|
111
|
+
(office) => office.name.toLowerCase().indexOf(inputValue) !== -1,
|
|
112
|
+
);
|
|
113
113
|
};
|
|
114
114
|
|
|
115
115
|
const getSuggestionValue = (suggestion) =>
|
|
@@ -24,7 +24,7 @@ import BpkSmallFlightIcon from '../bpk-component-icon/sm/flight';
|
|
|
24
24
|
import BpkSmallWeatherIcon from '../bpk-component-icon/sm/weather';
|
|
25
25
|
import BpkSmallTickIcon from '../bpk-component-icon/sm/tick-circle';
|
|
26
26
|
import BpkSmallCloseIcon from '../bpk-component-icon/sm/close-circle';
|
|
27
|
-
import { BpkDarkExampleWrapper } from 'bpk-storybook-utils';
|
|
27
|
+
import { BpkDarkExampleWrapper } from '../bpk-storybook-utils';
|
|
28
28
|
|
|
29
29
|
import BadgeLayout from './BadgeLayout';
|
|
30
30
|
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
/* @flow strict */
|
|
19
19
|
|
|
20
20
|
import React, { Component } from 'react';
|
|
21
|
-
import { action } from 'bpk-storybook-utils';
|
|
21
|
+
import { action } from '../bpk-storybook-utils';
|
|
22
22
|
import { fontWeightBold } from '@skyscanner/bpk-foundations-web/tokens/base.es6';
|
|
23
23
|
import CurrencyIcon from '../bpk-component-icon/sm/currency';
|
|
24
24
|
import { AriaLiveDemo } from '../bpk-component-aria-live/examples';
|
|
@@ -66,15 +66,15 @@ const BpkChartGridLines = (props: Props) => {
|
|
|
66
66
|
const value = position(tick);
|
|
67
67
|
return orientation === ORIENTATION_X
|
|
68
68
|
? {
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
69
|
+
x1: value,
|
|
70
|
+
x2: value,
|
|
71
|
+
y2: height - margin.top - margin.bottom,
|
|
72
|
+
}
|
|
73
73
|
: {
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
74
|
+
x2: width - margin.left - margin.right,
|
|
75
|
+
y1: value,
|
|
76
|
+
y2: value,
|
|
77
|
+
};
|
|
78
78
|
};
|
|
79
79
|
|
|
80
80
|
const toLine = (tick, i) => (
|
|
@@ -29,7 +29,7 @@ import {
|
|
|
29
29
|
colorSkyGrayTint04,
|
|
30
30
|
colorMonteverde,
|
|
31
31
|
} from '@skyscanner/bpk-foundations-web/tokens/base.es6';
|
|
32
|
-
import { action } from 'bpk-storybook-utils';
|
|
32
|
+
import { action } from '../bpk-storybook-utils';
|
|
33
33
|
|
|
34
34
|
import { withButtonAlignment, withRtlSupport } from '../bpk-component-icon';
|
|
35
35
|
import SmallLongArrowRightIcon from '../bpk-component-icon/sm/long-arrow-right';
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
* limitations under the License.
|
|
17
17
|
*/
|
|
18
18
|
import React from 'react';
|
|
19
|
-
import { action } from 'bpk-storybook-utils';
|
|
19
|
+
import { action } from '../bpk-storybook-utils';
|
|
20
20
|
import addMonths from 'date-fns/addMonths';
|
|
21
21
|
import BpkText from '../bpk-component-text';
|
|
22
22
|
import startOfDay from 'date-fns/startOfDay';
|
|
@@ -172,11 +172,11 @@ class BpkCalendarGridTransition extends Component {
|
|
|
172
172
|
index === 1
|
|
173
173
|
? focusedDate
|
|
174
174
|
: getFocusedDateForMonth(
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
175
|
+
m,
|
|
176
|
+
focusedDate,
|
|
177
|
+
rest.minDate,
|
|
178
|
+
rest.maxDate,
|
|
179
|
+
)
|
|
180
180
|
}
|
|
181
181
|
aria-hidden={index !== 1}
|
|
182
182
|
className={getClassName('bpk-calendar-grid-transition__grid')}
|
|
@@ -208,12 +208,12 @@ BpkCalendarGridTransition.defaultProps = {
|
|
|
208
208
|
};
|
|
209
209
|
|
|
210
210
|
const addCalendarGridTransition = (TransitionComponent) => (props) =>
|
|
211
|
-
(
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
);
|
|
211
|
+
(
|
|
212
|
+
<BpkCalendarGridTransition
|
|
213
|
+
TransitionComponent={TransitionComponent}
|
|
214
|
+
{...props}
|
|
215
|
+
/>
|
|
216
|
+
);
|
|
217
217
|
|
|
218
218
|
export default BpkCalendarGridTransition;
|
|
219
219
|
export { addCalendarGridTransition };
|
|
@@ -39,14 +39,14 @@ const getClassName = cssModules(STYLES);
|
|
|
39
39
|
|
|
40
40
|
const changeMonth =
|
|
41
41
|
({ callback, max, min, month, source }) =>
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
42
|
+
(event) => {
|
|
43
|
+
// Safeguard for disabled buttons is due to React bug in Chrome: https://github.com/facebook/react/issues/8308
|
|
44
|
+
// PR: https://github.com/facebook/react/pull/8329 - unresolved as of 22/12/2016
|
|
45
|
+
if (isWithinRange(month, { start: min, end: max })) {
|
|
46
|
+
event.persist();
|
|
47
|
+
callback(event, { month, source });
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
50
|
|
|
51
51
|
const BpkCalendarNav = (props) => {
|
|
52
52
|
const {
|
|
@@ -249,7 +249,7 @@ class Week extends Component {
|
|
|
249
249
|
// render, component should update.
|
|
250
250
|
if (
|
|
251
251
|
this.props.selectionConfiguration.type ===
|
|
252
|
-
|
|
252
|
+
CALENDAR_SELECTION_TYPE.single &&
|
|
253
253
|
this.props.selectionConfiguration.date
|
|
254
254
|
) {
|
|
255
255
|
return singleDateHandler(this.props, nextProps);
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
import React, { Component } from 'react';
|
|
20
20
|
import PropTypes from 'prop-types';
|
|
21
21
|
import { memoize } from 'lodash';
|
|
22
|
-
import { action } from 'bpk-storybook-utils';
|
|
22
|
+
import { action } from '../bpk-storybook-utils';
|
|
23
23
|
import {
|
|
24
24
|
colorSagano,
|
|
25
25
|
colorBagan,
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
|
|
21
21
|
import React from 'react';
|
|
22
22
|
import { TransitionInitialMount, cssModules } from '../../bpk-react-utils';
|
|
23
|
-
import { withScrim } from '../../bpk-
|
|
23
|
+
import { withScrim } from '../../bpk-scrim-utils';
|
|
24
24
|
import { BpkContentBubble } from '../../bpk-component-flare';
|
|
25
25
|
|
|
26
26
|
import {
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
import PropTypes from 'prop-types';
|
|
22
22
|
import React, { Component } from 'react';
|
|
23
23
|
import { Portal, cssModules } from '../../bpk-react-utils';
|
|
24
|
-
import { withScrim } from '../../bpk-
|
|
24
|
+
import { withScrim } from '../../bpk-scrim-utils';
|
|
25
25
|
|
|
26
26
|
import BpkDrawerContent from './BpkDrawerContent';
|
|
27
27
|
import STYLES from './BpkDrawer.module.scss';
|
|
@@ -109,8 +109,8 @@ const getSuggestions = (value) => {
|
|
|
109
109
|
return inputLength === 0
|
|
110
110
|
? []
|
|
111
111
|
: offices.filter(
|
|
112
|
-
|
|
113
|
-
|
|
112
|
+
(office) => office.name.toLowerCase().indexOf(inputValue) !== -1,
|
|
113
|
+
);
|
|
114
114
|
};
|
|
115
115
|
|
|
116
116
|
const getSuggestionValue = (suggestion) =>
|
|
@@ -25,7 +25,7 @@ import {
|
|
|
25
25
|
colorSkyGrayTint06,
|
|
26
26
|
} from '@skyscanner/bpk-foundations-web/tokens/base.es6';
|
|
27
27
|
import BpkText from '../bpk-component-text';
|
|
28
|
-
import { BpkDarkExampleWrapper } from 'bpk-storybook-utils';
|
|
28
|
+
import { BpkDarkExampleWrapper } from '../bpk-storybook-utils';
|
|
29
29
|
|
|
30
30
|
import STYLES from './examples.module.scss';
|
|
31
31
|
|
|
@@ -23,8 +23,9 @@ export default function withAlignment(Component, objectHeight, subjectHeight) {
|
|
|
23
23
|
const WithAlignment = (props) => {
|
|
24
24
|
const objectHeightDecimal = `${objectHeight}`.replace('rem', '');
|
|
25
25
|
const subjectHeightDecimal = `${subjectHeight}`.replace('rem', '');
|
|
26
|
-
const marginTopCalculated = `${
|
|
27
|
-
|
|
26
|
+
const marginTopCalculated = `${
|
|
27
|
+
Math.max(0, objectHeightDecimal - subjectHeightDecimal) / 2
|
|
28
|
+
}rem`;
|
|
28
29
|
|
|
29
30
|
return (
|
|
30
31
|
<span
|
|
@@ -22,44 +22,44 @@ import { wrapDisplayName } from '../../bpk-react-utils';
|
|
|
22
22
|
|
|
23
23
|
type InjectedProps = {|
|
|
24
24
|
onLoad: () => mixed,
|
|
25
|
-
|
|
25
|
+
loading: boolean,
|
|
26
26
|
|};
|
|
27
27
|
|
|
28
28
|
export default function withLoadingBehavior<Config>(
|
|
29
29
|
Component: AbstractComponent<{| ...Config, ...InjectedProps |}>,
|
|
30
|
-
): AbstractComponent
|
|
31
|
-
class WithLoadingBehavior
|
|
30
|
+
): AbstractComponent<Config> {
|
|
31
|
+
class WithLoadingBehavior<C: Config> extends React.Component<
|
|
32
32
|
C,
|
|
33
33
|
{| loading: boolean |},
|
|
34
34
|
> {
|
|
35
|
-
|
|
36
|
-
|
|
35
|
+
constructor() {
|
|
36
|
+
super();
|
|
37
37
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
38
|
+
this.state = {
|
|
39
|
+
loading: true,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
42
|
|
|
43
43
|
onLoad = () => {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
44
|
+
this.setState(() => ({
|
|
45
|
+
loading: false,
|
|
46
|
+
}));
|
|
47
|
+
};
|
|
48
48
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
49
|
+
render() {
|
|
50
|
+
return (
|
|
51
|
+
<Component
|
|
52
|
+
onLoad={this.onLoad}
|
|
53
|
+
loading={this.state.loading}
|
|
54
|
+
{...this.props}
|
|
55
|
+
/>
|
|
56
|
+
);
|
|
57
|
+
}
|
|
57
58
|
}
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
);
|
|
59
|
+
WithLoadingBehavior.displayName = wrapDisplayName(
|
|
60
|
+
Component,
|
|
61
|
+
'withLoadingBehavior',
|
|
62
|
+
);
|
|
63
63
|
|
|
64
|
-
return WithLoadingBehavior;
|
|
64
|
+
return WithLoadingBehavior;
|
|
65
65
|
}
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
|
|
21
21
|
import React from 'react';
|
|
22
22
|
import PropTypes from 'prop-types';
|
|
23
|
-
import { action } from 'bpk-storybook-utils';
|
|
23
|
+
import { action } from '../bpk-storybook-utils';
|
|
24
24
|
import BpkButton from '../bpk-component-button';
|
|
25
25
|
import { BpkList, BpkListItem } from '../bpk-component-list';
|
|
26
26
|
import { BpkSpinner, SPINNER_TYPES } from '../bpk-component-spinner';
|
|
@@ -95,133 +95,133 @@ type PropsWithDefault = Config<Props, typeof defaultProps>;
|
|
|
95
95
|
|
|
96
96
|
const withInfiniteScroll = <T: ExtendedProps>(
|
|
97
97
|
ComponentToExtend: AbstractComponent<T>,
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
98
|
+
): AbstractComponent<PropsWithDefault & $Diff<T, ExtendedProps>> =>
|
|
99
|
+
class WithInfiniteScroll extends Component<Props, State> {
|
|
100
|
+
handleIntersection: IntersectionObserverCallback;
|
|
101
101
|
|
|
102
102
|
handleKeyPress: (e: SyntheticKeyboardEvent<HTMLButtonElement>) => void;
|
|
103
103
|
|
|
104
|
-
|
|
104
|
+
handleSeeMoreClick: (e: SyntheticEvent<HTMLButtonElement>) => void;
|
|
105
105
|
|
|
106
|
-
|
|
106
|
+
observer: IntersectionObserver;
|
|
107
107
|
|
|
108
|
-
|
|
108
|
+
sentinel: ?HTMLElement;
|
|
109
109
|
|
|
110
|
-
|
|
110
|
+
static propTypes = { ...propTypes };
|
|
111
111
|
|
|
112
|
-
|
|
112
|
+
static defaultProps = { ...defaultProps };
|
|
113
113
|
|
|
114
|
-
|
|
115
|
-
|
|
114
|
+
constructor(props: Props) {
|
|
115
|
+
super(props);
|
|
116
116
|
|
|
117
|
-
|
|
118
|
-
|
|
117
|
+
this.state = {
|
|
118
|
+
index: 0,
|
|
119
119
|
elementsToRender: [],
|
|
120
120
|
isListFinished: false,
|
|
121
121
|
showSeeMore: false,
|
|
122
122
|
};
|
|
123
123
|
|
|
124
|
-
|
|
124
|
+
this.props.dataSource.onDataChange(this.updateData);
|
|
125
125
|
|
|
126
|
-
|
|
127
|
-
|
|
126
|
+
const thresholds = {
|
|
127
|
+
small: 0.01,
|
|
128
128
|
half: 0.5,
|
|
129
129
|
full: 0.99, // using 0.99 instead of 1 to avoid problems with float precision in IE11
|
|
130
130
|
};
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
131
|
+
const displaySize = this.props.loaderIntersectionTrigger || 'full';
|
|
132
|
+
this.observer = new IntersectionObserver(this.handleIntersection, {
|
|
133
|
+
threshold: thresholds[displaySize] || thresholds.full,
|
|
134
134
|
});
|
|
135
135
|
}
|
|
136
136
|
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
137
|
+
componentDidMount() {
|
|
138
|
+
this.fetchItems({
|
|
139
|
+
elementsPerScroll: this.props.initiallyLoadedElements,
|
|
140
|
+
}).then((newState) => {
|
|
141
|
+
this.setState(newState);
|
|
142
|
+
});
|
|
143
143
|
}
|
|
144
144
|
|
|
145
|
-
|
|
145
|
+
componentDidUpdate(prevProps) {
|
|
146
146
|
if (this.sentinel && this.state.index > 0) {
|
|
147
|
-
|
|
147
|
+
this.observer.observe(this.sentinel);
|
|
148
148
|
}
|
|
149
149
|
|
|
150
|
-
|
|
151
|
-
|
|
150
|
+
if (this.props.dataSource !== prevProps.dataSource) {
|
|
151
|
+
prevProps.dataSource.removeListener(this.updateData);
|
|
152
152
|
this.props.dataSource.onDataChange(this.updateData);
|
|
153
153
|
this.fetchItems({
|
|
154
154
|
index: 0,
|
|
155
|
-
|
|
156
|
-
|
|
155
|
+
elementsPerScroll: this.props.elementsPerScroll,
|
|
156
|
+
elementsToRender: [],
|
|
157
157
|
}).then((newState) => this.setStateAfterDsUpdate(newState));
|
|
158
158
|
}
|
|
159
159
|
}
|
|
160
160
|
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
161
|
+
componentWillUnmount() {
|
|
162
|
+
this.props.dataSource.removeListener(this.updateData);
|
|
163
|
+
if (this.sentinel) {
|
|
164
|
+
this.observer.unobserve(this.sentinel);
|
|
165
165
|
}
|
|
166
166
|
}
|
|
167
167
|
|
|
168
|
-
|
|
168
|
+
setStateAfterDsUpdate(newState: State) {
|
|
169
169
|
// After a data source update (calling updateData in the data source or changing the dataSource prop)
|
|
170
170
|
// all visible data is fetched again (from 0 to current index) to update the list with the new data.
|
|
171
171
|
// If after this call there is no elementsToRender or index present in state
|
|
172
172
|
// it means the new data source has no items and we need to
|
|
173
173
|
// reset the list, which we do by setting `elementsToRender` to `[]` and `index` to `0`
|
|
174
|
-
const {elementsToRender, index} = newState;
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
174
|
+
const { elementsToRender, index } = newState;
|
|
175
|
+
this.setState({
|
|
176
|
+
...newState,
|
|
177
|
+
elementsToRender: elementsToRender || [],
|
|
178
178
|
index: index || 0,
|
|
179
179
|
});
|
|
180
180
|
}
|
|
181
181
|
|
|
182
182
|
updateData = () => {
|
|
183
|
-
const {index} = this.state;
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
183
|
+
const { index } = this.state;
|
|
184
|
+
// This means updateData was called before any data was loaded, e.g.
|
|
185
|
+
// An ArrayDataSource initialized empty and then changed latter on via `updateData`
|
|
186
|
+
// In this case we want to load new data and not just replace the old one.
|
|
187
|
+
// "See More After" should also be computed again in this case.
|
|
188
|
+
const isFirstLoad = index < this.props.elementsPerScroll;
|
|
189
|
+
this.fetchItems({
|
|
190
|
+
index: 0,
|
|
191
191
|
elementsPerScroll: isFirstLoad ? this.props.elementsPerScroll : index,
|
|
192
192
|
elementsToRender: [],
|
|
193
193
|
computeShowSeeMore: isFirstLoad,
|
|
194
194
|
}).then((newState) => this.setStateAfterDsUpdate(newState));
|
|
195
195
|
};
|
|
196
196
|
|
|
197
|
-
|
|
198
|
-
const {onScrollFinished, seeMoreAfter} = this.props;
|
|
199
|
-
|
|
200
|
-
|
|
197
|
+
fetchItems(config): Promise<$Shape<State>> {
|
|
198
|
+
const { onScrollFinished, seeMoreAfter } = this.props;
|
|
199
|
+
const { computeShowSeeMore, elementsPerScroll, elementsToRender, index } =
|
|
200
|
+
extend(
|
|
201
201
|
{
|
|
202
202
|
index: this.state.index,
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
203
|
+
elementsPerScroll: this.props.elementsPerScroll,
|
|
204
|
+
elementsToRender: this.state.elementsToRender,
|
|
205
|
+
computeShowSeeMore: true,
|
|
206
206
|
},
|
|
207
207
|
config,
|
|
208
|
-
|
|
208
|
+
);
|
|
209
209
|
|
|
210
|
-
|
|
211
|
-
|
|
210
|
+
return this.props.dataSource
|
|
211
|
+
.fetchItems(index, elementsPerScroll)
|
|
212
212
|
.then((nextElements) => {
|
|
213
|
-
|
|
213
|
+
let result = {
|
|
214
214
|
isListFinished: true,
|
|
215
215
|
};
|
|
216
216
|
if (nextElements && nextElements.length > 0) {
|
|
217
217
|
const nextIndex = index + elementsPerScroll;
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
218
|
+
result = {
|
|
219
|
+
index: nextIndex,
|
|
220
|
+
elementsToRender: (elementsToRender || []).concat(nextElements),
|
|
221
|
+
showSeeMore: computeShowSeeMore
|
|
222
|
+
? seeMoreAfter === index / elementsPerScroll
|
|
223
|
+
: this.state.showSeeMore,
|
|
224
|
+
isListFinished: nextElements.length < elementsPerScroll,
|
|
225
225
|
};
|
|
226
226
|
}
|
|
227
227
|
if (onScrollFinished && result.isListFinished) {
|
|
@@ -233,65 +233,65 @@ const withInfiniteScroll = <T: ExtendedProps>(
|
|
|
233
233
|
});
|
|
234
234
|
}
|
|
235
235
|
|
|
236
|
-
|
|
237
|
-
const {onScroll} = this.props;
|
|
238
|
-
|
|
239
|
-
|
|
236
|
+
handleIntersection = (entries: Array<IntersectionObserverEntry>) => {
|
|
237
|
+
const { onScroll } = this.props;
|
|
238
|
+
const entry = entries[0];
|
|
239
|
+
if (entry.isIntersecting) {
|
|
240
240
|
if (this.sentinel) {
|
|
241
|
-
|
|
241
|
+
this.observer.unobserve(this.sentinel);
|
|
242
242
|
}
|
|
243
|
-
|
|
244
|
-
|
|
243
|
+
if (onScroll) {
|
|
244
|
+
onScroll({ currentIndex: this.state.index });
|
|
245
245
|
}
|
|
246
246
|
return this.fetchItems().then((newState) => {
|
|
247
|
-
|
|
247
|
+
this.setState(newState);
|
|
248
248
|
});
|
|
249
249
|
}
|
|
250
|
-
|
|
250
|
+
return Promise.resolve();
|
|
251
251
|
};
|
|
252
252
|
|
|
253
253
|
handleSeeMoreClick = () => {
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
254
|
+
this.fetchItems().then((newState) => {
|
|
255
|
+
this.setState(newState);
|
|
256
|
+
});
|
|
257
257
|
};
|
|
258
258
|
|
|
259
|
-
|
|
260
|
-
const {elementsToRender, isListFinished, showSeeMore} = this.state;
|
|
261
|
-
|
|
259
|
+
render() {
|
|
260
|
+
const { elementsToRender, isListFinished, showSeeMore } = this.state;
|
|
261
|
+
const { renderLoadingComponent, renderSeeMoreComponent } = this.props;
|
|
262
262
|
|
|
263
|
-
|
|
263
|
+
const rest = omit(this.props, Object.keys(propTypes));
|
|
264
264
|
|
|
265
|
-
|
|
265
|
+
let loadingOrButton = null;
|
|
266
266
|
|
|
267
|
-
|
|
267
|
+
if (!isListFinished) {
|
|
268
268
|
if (showSeeMore && renderSeeMoreComponent) {
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
269
|
+
loadingOrButton = renderSeeMoreComponent({
|
|
270
|
+
onSeeMoreClick: this.handleSeeMoreClick,
|
|
271
|
+
});
|
|
272
272
|
} else {
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
273
|
+
loadingOrButton = (
|
|
274
|
+
<div
|
|
275
|
+
ref={(spinner) => {
|
|
276
|
+
this.sentinel = spinner;
|
|
277
|
+
}}
|
|
278
|
+
className={
|
|
279
|
+
renderLoadingComponent ? null : getClassNames('bpk-sentinel')
|
|
280
|
+
}
|
|
281
|
+
>
|
|
282
|
+
{renderLoadingComponent && renderLoadingComponent()}
|
|
283
|
+
</div>
|
|
284
|
+
);
|
|
285
285
|
}
|
|
286
286
|
}
|
|
287
287
|
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
288
|
+
return (
|
|
289
|
+
<div>
|
|
290
|
+
<ComponentToExtend {...rest} elements={elementsToRender} />
|
|
291
|
+
{loadingOrButton}
|
|
292
|
+
</div>
|
|
293
|
+
);
|
|
294
294
|
}
|
|
295
295
|
};
|
|
296
296
|
|
|
297
|
-
|
|
297
|
+
export default withInfiniteScroll;
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
import React, { Component } from 'react';
|
|
21
21
|
import PropTypes from 'prop-types';
|
|
22
22
|
import { cssModules } from '../bpk-react-utils';
|
|
23
|
-
import { action } from 'bpk-storybook-utils';
|
|
23
|
+
import { action } from '../bpk-storybook-utils';
|
|
24
24
|
import BpkLabel from '../bpk-component-label';
|
|
25
25
|
import BpkBannerAlert, { ALERT_TYPES } from '../bpk-component-banner-alert';
|
|
26
26
|
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
|
|
20
20
|
import React, { Component, type Node } from 'react';
|
|
21
21
|
import PropTypes from 'prop-types';
|
|
22
|
-
import { action } from 'bpk-storybook-utils';
|
|
22
|
+
import { action } from '../bpk-storybook-utils';
|
|
23
23
|
import BpkText from '../bpk-component-text';
|
|
24
24
|
import { withRtlSupport } from '../bpk-component-icon';
|
|
25
25
|
import LandmarkIconSm from '../bpk-component-icon/sm/landmark';
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
|
|
21
21
|
import PropTypes from 'prop-types';
|
|
22
22
|
import React, { type Element } from 'react';
|
|
23
|
-
import { withScrim } from '../../bpk-
|
|
23
|
+
import { withScrim } from '../../bpk-scrim-utils';
|
|
24
24
|
import { Portal, cssModules, isDeviceIphone } from '../../bpk-react-utils';
|
|
25
25
|
|
|
26
26
|
import STYLES from './BpkModal.module.scss';
|
|
@@ -45,12 +45,12 @@ export type Props = {
|
|
|
45
45
|
// diff will suffice for now.
|
|
46
46
|
...$Exact<$Diff<ModalDialogProps, ScrimProps>>,
|
|
47
47
|
isOpen: boolean,
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
48
|
+
isIphone: boolean,
|
|
49
|
+
closeOnScrimClick: boolean,
|
|
50
|
+
closeOnEscPressed: boolean,
|
|
51
|
+
renderTarget: ?() => ?HTMLElement,
|
|
52
|
+
target: ?((() => ?HTMLElement) | Element<any>),
|
|
53
|
+
onClose: (event: SyntheticEvent<>) => void | null,
|
|
54
54
|
};
|
|
55
55
|
|
|
56
56
|
const BpkModal = (props: Props) => {
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
/* @flow strict */
|
|
20
20
|
|
|
21
21
|
import React from 'react';
|
|
22
|
-
import { action } from 'bpk-storybook-utils';
|
|
22
|
+
import { action } from '../bpk-storybook-utils';
|
|
23
23
|
import { withRtlSupport } from '../bpk-component-icon';
|
|
24
24
|
import ArrowIcon from '../bpk-component-icon/sm/long-arrow-left';
|
|
25
25
|
import CloseIcon from '../bpk-component-icon/sm/close';
|
|
@@ -87,11 +87,12 @@ class BpkNavigationStack extends React.Component<Props, State> {
|
|
|
87
87
|
className={getClassName(
|
|
88
88
|
'bpk-navigation-stack__view-track',
|
|
89
89
|
transition &&
|
|
90
|
-
|
|
90
|
+
`bpk-navigation-stack__view-track--view-${transition}`,
|
|
91
91
|
)}
|
|
92
92
|
style={{
|
|
93
|
-
transform: `translateX(${
|
|
94
|
-
}
|
|
93
|
+
transform: `translateX(${
|
|
94
|
+
lastIndex === 0 ? '0%' : `${isRTL() ? '' : '-'}${lastIndex}00%`
|
|
95
|
+
})`,
|
|
95
96
|
}}
|
|
96
97
|
>
|
|
97
98
|
{Children.map(views, (view, idx) => (
|
|
@@ -53,15 +53,15 @@ export const View = ({
|
|
|
53
53
|
}: {
|
|
54
54
|
children: ({
|
|
55
55
|
index: number,
|
|
56
|
-
pushView: ?
|
|
57
|
-
popView: ?
|
|
58
|
-
}) => ?Element
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
56
|
+
pushView: ?(Element<any>) => mixed,
|
|
57
|
+
popView: ?() => mixed,
|
|
58
|
+
}) => ?Element<any>,
|
|
59
|
+
index: number,
|
|
60
|
+
pushView: ?(Element<any>) => mixed,
|
|
61
|
+
popView: ?() => mixed,
|
|
62
|
+
className: ?string,
|
|
63
|
+
noNavBar: boolean,
|
|
64
|
+
centered: boolean,
|
|
65
65
|
}) => (
|
|
66
66
|
// $FlowFixMe[cannot-spread-inexact] - inexact rest. See 'decisions/flowfixme.md'.
|
|
67
67
|
<section
|
|
@@ -93,8 +93,8 @@ export const SimpleNav = ({
|
|
|
93
93
|
pushView,
|
|
94
94
|
}: {
|
|
95
95
|
index: number,
|
|
96
|
-
pushView: ?(Element
|
|
97
|
-
|
|
96
|
+
pushView: ?(Element<any>) => mixed,
|
|
97
|
+
popView: ?() => mixed,
|
|
98
98
|
}) => (
|
|
99
99
|
<div>
|
|
100
100
|
<BpkButton
|
|
@@ -124,9 +124,9 @@ export const NavigationBar = ({
|
|
|
124
124
|
pushView,
|
|
125
125
|
}: {
|
|
126
126
|
index: number,
|
|
127
|
-
pushView: ?(Element
|
|
128
|
-
|
|
129
|
-
|
|
127
|
+
pushView: ?(Element<any>) => mixed,
|
|
128
|
+
popView: ?() => mixed,
|
|
129
|
+
nextView: ?() => ?Element<any>,
|
|
130
130
|
}) => (
|
|
131
131
|
<BpkNavigationBar
|
|
132
132
|
id={`my-navigation-bar-${index}`}
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
/* @flow strict */
|
|
20
20
|
|
|
21
21
|
import React, { Component } from 'react';
|
|
22
|
-
import { action, BpkDarkExampleWrapper } from 'bpk-storybook-utils';
|
|
22
|
+
import { action, BpkDarkExampleWrapper } from '../bpk-storybook-utils';
|
|
23
23
|
import BpkLabel from '../bpk-component-label';
|
|
24
24
|
import { cssModules } from '../bpk-react-utils';
|
|
25
25
|
|
|
@@ -57,7 +57,7 @@ const BpkOverlay = (props: Props) => {
|
|
|
57
57
|
const overlayClassNames = getClassName(
|
|
58
58
|
'bpk-overlay__overlay',
|
|
59
59
|
borderRadiusStyle === BORDER_RADIUS_STYLES.sm &&
|
|
60
|
-
|
|
60
|
+
'bpk-overlay__overlay--border-radius-sm',
|
|
61
61
|
overlayType === OVERLAY_TYPES.tint && 'bpk-overlay__overlay--tint',
|
|
62
62
|
);
|
|
63
63
|
|
|
@@ -20,7 +20,7 @@ import PropTypes from 'prop-types';
|
|
|
20
20
|
import React, { Component } from 'react';
|
|
21
21
|
import startOfMonth from 'date-fns/startOfMonth';
|
|
22
22
|
import endOfMonth from 'date-fns/endOfMonth';
|
|
23
|
-
import { action } from 'bpk-storybook-utils';
|
|
23
|
+
import { action } from '../bpk-storybook-utils';
|
|
24
24
|
import {
|
|
25
25
|
DateUtils,
|
|
26
26
|
CustomPropTypes,
|
|
@@ -51,15 +51,15 @@ class SliderContainer extends Component {
|
|
|
51
51
|
<div>
|
|
52
52
|
{this.state.value.length
|
|
53
53
|
? this.valueComponent(
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
54
|
+
this.state.value[0],
|
|
55
|
+
this.state.value[1],
|
|
56
|
+
time && this.valueTimeFormatter,
|
|
57
|
+
)
|
|
58
58
|
: this.valueComponent(
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
59
|
+
min,
|
|
60
|
+
this.state.value,
|
|
61
|
+
time && this.valueTimeFormatter,
|
|
62
|
+
)}
|
|
63
63
|
<BpkSlider
|
|
64
64
|
min={min}
|
|
65
65
|
max={time ? 59 : 100}
|
|
@@ -53,9 +53,9 @@ type Props = {
|
|
|
53
53
|
maxRating: number,
|
|
54
54
|
rating: number,
|
|
55
55
|
rounding:
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
56
|
+
| typeof ROUNDING_TYPES.down
|
|
57
|
+
| typeof ROUNDING_TYPES.up
|
|
58
|
+
| typeof ROUNDING_TYPES.nearest,
|
|
59
59
|
};
|
|
60
60
|
|
|
61
61
|
const BpkStarRating = (props: Props) => {
|
|
@@ -93,13 +93,13 @@ const BpkTicket = (props: Props) => {
|
|
|
93
93
|
const punchlineClassNames = getClassName(
|
|
94
94
|
'bpk-ticket__punchline',
|
|
95
95
|
vertical &&
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
96
|
+
(withNotches
|
|
97
|
+
? 'bpk-ticket__punchline--horizontal-with-notches'
|
|
98
|
+
: 'bpk-ticket__punchline--horizontal'),
|
|
99
99
|
!vertical &&
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
100
|
+
(withNotches
|
|
101
|
+
? 'bpk-ticket__punchline--vertical-with-notches'
|
|
102
|
+
: 'bpk-ticket__punchline--vertical'),
|
|
103
103
|
);
|
|
104
104
|
|
|
105
105
|
const startNotchClassNames = getClassName(
|