@jetbrains/ring-ui 4.1.20 → 4.1.24

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.
@@ -818,12 +818,17 @@ export default class Auth {
818
818
  }
819
819
 
820
820
  _checkBackendsAreUp() {
821
+ const abortCtrl = new AbortController();
821
822
  const {backendCheckTimeout} = this.config;
823
+
822
824
  return Promise.all([
823
825
  promiseWithTimeout(
824
- this.http.fetch('settings/public?fields=id'),
826
+ this.http.fetch('settings/public?fields=id', {signal: abortCtrl.signal}),
825
827
  backendCheckTimeout,
826
- {error: new Error('The authorization server is taking too long to respond. Please try again later.')}
828
+ {
829
+ error: new Error('The authorization server is taking too long to respond. Please try again later.'),
830
+ onTimeout: () => abortCtrl.abort()
831
+ }
827
832
  ),
828
833
  this.config.checkBackendIsUp()
829
834
  ]).catch(err => {
@@ -1,9 +1,12 @@
1
1
  // Useful for using fetch with timeout
2
2
  // https://github.com/github/fetch/issues/175#issuecomment-284787564
3
3
 
4
- export default function promiseWithTimeout(promise, timeout, {error}) {
4
+ export default function promiseWithTimeout(promise, timeout, {error, onTimeout = () => {}}) {
5
5
  return new Promise((resolve, reject) => {
6
- setTimeout(() => reject(error || new Error('Timeout')), timeout);
6
+ setTimeout(() => {
7
+ onTimeout();
8
+ reject(error || new Error('Timeout'));
9
+ }, timeout);
7
10
 
8
11
  promise.then(resolve, reject);
9
12
  });
@@ -1,4 +1,4 @@
1
- import React, {Component} from 'react';
1
+ import React, {forwardRef, Component} from 'react';
2
2
  import PropTypes from 'prop-types';
3
3
  import classNames from 'classnames';
4
4
  import createResizeDetector from 'element-resize-detector';
@@ -129,13 +129,15 @@ class Content extends Component {
129
129
  }
130
130
  }
131
131
 
132
- const ContentWrapper = props => (
132
+ const ContentWrapper = forwardRef((props, ref) => (
133
133
  <ScrollHandlerContext.Consumer>
134
134
  {onScroll => {
135
135
  const addProps = onScroll != null ? {onScroll, bottomBorder: true} : {};
136
- return <Content {...props} {...addProps}/>;
136
+ return <Content {...props} {...addProps} ref={ref}/>;
137
137
  }}
138
138
  </ScrollHandlerContext.Consumer>
139
- );
139
+ ));
140
+
141
+ ContentWrapper.displayName = 'ContentWrapper';
140
142
 
141
143
  export default ContentWrapper;
@@ -31,9 +31,6 @@ import {DEFAULT_ITEM_TYPE, Dimension, Type} from './consts';
31
31
 
32
32
  import styles from './list.css';
33
33
 
34
- const scheduleScrollListener = scheduleRAF();
35
- const scheduleHoverListener = scheduleRAF();
36
-
37
34
  function noop() {}
38
35
 
39
36
  const warnEmptyKey = deprecate(
@@ -122,6 +119,12 @@ export default class List extends Component {
122
119
  ariaLabel: 'List'
123
120
  };
124
121
 
122
+ constructor(...args) {
123
+ super(...args);
124
+ this.scheduleScrollListener = scheduleRAF();
125
+ this.scheduleHoverListener = scheduleRAF();
126
+ }
127
+
125
128
  state = {
126
129
  activeIndex: null,
127
130
  prevActiveIndex: null,
@@ -220,7 +223,7 @@ export default class List extends Component {
220
223
  };
221
224
 
222
225
  hoverHandler = memoize(index => () =>
223
- scheduleHoverListener(() => {
226
+ this.scheduleHoverListener(() => {
224
227
  if (this.state.disabledHover) {
225
228
  return;
226
229
  }
@@ -429,7 +432,7 @@ export default class List extends Component {
429
432
  return this.props.compact ? Dimension.COMPACT_ITEM_HEIGHT : Dimension.ITEM_HEIGHT;
430
433
  }
431
434
 
432
- scrollEndHandler = () => scheduleScrollListener(() => {
435
+ scrollEndHandler = () => this.scheduleScrollListener(() => {
433
436
  const innerContainer = this.inner;
434
437
  if (innerContainer) {
435
438
  const maxScrollingPosition = innerContainer.scrollHeight;
@@ -59,6 +59,7 @@ export default class Popup extends PureComponent {
59
59
 
60
60
  directions: PropTypes.arrayOf(PropTypes.string),
61
61
  autoPositioning: PropTypes.bool,
62
+ autoPositioningOnScroll: PropTypes.bool,
62
63
  autoCorrectTopOverflow: PropTypes.bool,
63
64
  left: PropTypes.number,
64
65
  top: PropTypes.number,
@@ -91,6 +92,7 @@ export default class Popup extends PureComponent {
91
92
 
92
93
  directions: DEFAULT_DIRECTIONS,
93
94
  autoPositioning: true,
95
+ autoPositioningOnScroll: true,
94
96
  autoCorrectTopOverflow: true,
95
97
  left: 0,
96
98
  top: 0,
@@ -250,7 +252,9 @@ export default class Popup extends PureComponent {
250
252
  setTimeout(() => {
251
253
  this._listenersEnabled = true;
252
254
  this.listeners.add(window, 'resize', this._redraw);
253
- this.listeners.add(window, 'scroll', this._redraw);
255
+ if (this.props.autoPositioningOnScroll) {
256
+ this.listeners.add(window, 'scroll', this._redraw);
257
+ }
254
258
  this.listeners.add(document, 'pointerdown', this._onDocumentClick, true);
255
259
  let el = this._getAnchor();
256
260
  while (el) {
@@ -69,6 +69,9 @@
69
69
  .selectedIcon {
70
70
  composes: resetButton from "../global/global.css";
71
71
 
72
+ position: relative;
73
+ top: 3px;
74
+
72
75
  display: inline-block;
73
76
 
74
77
  width: calc(2 * unit);
@@ -264,6 +264,7 @@ export default class Select extends Component {
264
264
  disabled: PropTypes.bool,
265
265
  hideSelected: PropTypes.bool,
266
266
  label: PropTypes.string,
267
+ renderBottomToolbar: PropTypes.func,
267
268
  selectedLabel: PropTypes.oneOfType([
268
269
  PropTypes.string,
269
270
  PropTypes.arrayOf(PropTypes.node),
@@ -667,9 +668,9 @@ export default class Select extends Component {
667
668
  };
668
669
 
669
670
  getToolbar() {
670
- const {hint} = this.props;
671
+ const {hint, renderBottomToolbar} = this.props;
671
672
  const {prefix, label, delayed} = this.state.addButton || {};
672
- const isToolbarHasElements = this.state.addButton || hint;
673
+ const isToolbarHasElements = this.state.addButton || hint || renderBottomToolbar;
673
674
  if (!isToolbarHasElements) {
674
675
  return null;
675
676
  }
@@ -677,10 +678,11 @@ export default class Select extends Component {
677
678
  return (
678
679
  <div
679
680
  className={classNames({
680
- [styles.toolbar]: !!this.state.addButton
681
+ [styles.toolbar]: Boolean(this.state.addButton || renderBottomToolbar)
681
682
  })}
682
683
  data-test="ring-select-toolbar"
683
684
  >
685
+ {renderBottomToolbar && renderBottomToolbar()}
684
686
  {this.state.addButton && (
685
687
  <Button
686
688
  text
@@ -951,11 +951,15 @@ class Auth {
951
951
  }
952
952
 
953
953
  _checkBackendsAreUp() {
954
+ const abortCtrl = new AbortController();
954
955
  const {
955
956
  backendCheckTimeout
956
957
  } = this.config;
957
- return Promise.all([promiseWithTimeout(this.http.fetch('settings/public?fields=id'), backendCheckTimeout, {
958
- error: new Error('The authorization server is taking too long to respond. Please try again later.')
958
+ return Promise.all([promiseWithTimeout(this.http.fetch('settings/public?fields=id', {
959
+ signal: abortCtrl.signal
960
+ }), backendCheckTimeout, {
961
+ error: new Error('The authorization server is taking too long to respond. Please try again later.'),
962
+ onTimeout: () => abortCtrl.abort()
959
963
  }), this.config.checkBackendIsUp()]).catch(err => {
960
964
  if (err instanceof TypeError) {
961
965
  throw new TypeError('Could not connect to the server due to network error. Please check your connection and try again.');
@@ -12,14 +12,14 @@ function getAngularComponentName(name) {
12
12
  }
13
13
 
14
14
  function createAngularComponent(Component) {
15
- var _class, _temp;
15
+ var _class;
16
16
 
17
17
  const propKeys = Object.keys(Component.propTypes);
18
18
  const bindings = {};
19
19
  propKeys.forEach(key => {
20
20
  bindings[key] = '<';
21
21
  });
22
- return _temp = _class = class AngularComponent extends RingAngularComponent {
22
+ return _class = class AngularComponent extends RingAngularComponent {
23
23
  $postLink() {
24
24
  const {
25
25
  $transclude
@@ -72,7 +72,7 @@ function createAngularComponent(Component) {
72
72
  }) : null), container);
73
73
  }
74
74
 
75
- }, _defineProperty(_class, "$inject", ['$scope', '$element', '$transclude']), _defineProperty(_class, "bindings", bindings), _defineProperty(_class, "transclude", true), _temp;
75
+ }, _defineProperty(_class, "$inject", ['$scope', '$element', '$transclude']), _defineProperty(_class, "bindings", bindings), _defineProperty(_class, "transclude", true), _class;
76
76
  }
77
77
 
78
78
  function angularComponentFactory(Component, name) {
@@ -5,9 +5,9 @@ import PropTypes from 'prop-types';
5
5
  import composeRefs from './composeRefs.js';
6
6
 
7
7
  function focusSensorHOC(ComposedComponent) {
8
- var _class, _temp;
8
+ var _class;
9
9
 
10
- return _temp = _class = class FocusSensor extends Component {
10
+ return _class = class FocusSensor extends Component {
11
11
  constructor() {
12
12
  super(...arguments);
13
13
 
@@ -140,7 +140,7 @@ function focusSensorHOC(ComposedComponent) {
140
140
  autofocus: false,
141
141
  onFocus: () => {},
142
142
  onBlur: () => {}
143
- }), _temp;
143
+ }), _class;
144
144
  }
145
145
 
146
146
  export { focusSensorHOC as default };
@@ -2,10 +2,14 @@
2
2
  // https://github.com/github/fetch/issues/175#issuecomment-284787564
3
3
  function promiseWithTimeout(promise, timeout, _ref) {
4
4
  let {
5
- error
5
+ error,
6
+ onTimeout = () => {}
6
7
  } = _ref;
7
8
  return new Promise((resolve, reject) => {
8
- setTimeout(() => reject(error || new Error('Timeout')), timeout);
9
+ setTimeout(() => {
10
+ onTimeout();
11
+ reject(error || new Error('Timeout'));
12
+ }, timeout);
9
13
  promise.then(resolve, reject);
10
14
  });
11
15
  }
@@ -8,9 +8,9 @@ const TITLE_RESIZE_THRESHOLD = 36;
8
8
  const PhaseContext = /*#__PURE__*/createContext();
9
9
  const ScrollHandlerContext = /*#__PURE__*/createContext();
10
10
  function adaptiveIslandHOC(ComposedComponent) {
11
- var _class, _temp;
11
+ var _class;
12
12
 
13
- return _temp = _class = class AdaptiveIsland extends Component {
13
+ return _class = class AdaptiveIsland extends Component {
14
14
  constructor() {
15
15
  super(...arguments);
16
16
 
@@ -42,7 +42,7 @@ function adaptiveIslandHOC(ComposedComponent) {
42
42
  }, /*#__PURE__*/React.createElement(ComposedComponent, this.props)));
43
43
  }
44
44
 
45
- }, _defineProperty(_class, "propTypes", ComposedComponent.propTypes), _temp;
45
+ }, _defineProperty(_class, "propTypes", ComposedComponent.propTypes), _class;
46
46
  }
47
47
 
48
48
  export { PhaseContext, ScrollHandlerContext, adaptiveIslandHOC as default };
@@ -1,6 +1,6 @@
1
1
  import { _ as _defineProperty, a as _extends } from '../_helpers/_rollupPluginBabelHelpers.js';
2
2
  import 'core-js/modules/web.dom-collections.iterator.js';
3
- import React, { Component } from 'react';
3
+ import React, { Component, forwardRef } from 'react';
4
4
  import PropTypes from 'prop-types';
5
5
  import classNames from 'classnames';
6
6
  import createResizeDetector from 'element-resize-detector';
@@ -146,12 +146,15 @@ _defineProperty(Content, "defaultProps", {
146
146
  onScrollToBottom: noop
147
147
  });
148
148
 
149
- const ContentWrapper = props => /*#__PURE__*/React.createElement(ScrollHandlerContext.Consumer, null, onScroll => {
149
+ const ContentWrapper = /*#__PURE__*/forwardRef((props, ref) => /*#__PURE__*/React.createElement(ScrollHandlerContext.Consumer, null, onScroll => {
150
150
  const addProps = onScroll != null ? {
151
151
  onScroll,
152
152
  bottomBorder: true
153
153
  } : {};
154
- return /*#__PURE__*/React.createElement(Content, _extends({}, props, addProps));
155
- });
154
+ return /*#__PURE__*/React.createElement(Content, _extends({}, props, addProps, {
155
+ ref: ref
156
+ }));
157
+ }));
158
+ ContentWrapper.displayName = 'ContentWrapper';
156
159
 
157
160
  export { ContentWrapper as default };
package/dist/link/link.js CHANGED
@@ -35,10 +35,10 @@ const makeWrapText = memoize(innerClassName => {
35
35
  return WrapText;
36
36
  });
37
37
  function linkHOC(ComposedComponent) {
38
- var _class, _temp;
38
+ var _class;
39
39
 
40
40
  const isCustom = typeof ComposedComponent !== 'string' && ComposedComponent !== ClickableLink;
41
- return _temp = _class = class Link extends Component {
41
+ return _class = class Link extends Component {
42
42
  getChildren() {
43
43
  const {
44
44
  children,
@@ -108,7 +108,7 @@ function linkHOC(ComposedComponent) {
108
108
  href: PropTypes.string,
109
109
  onPlainLeftClick: PropTypes.func,
110
110
  onClick: PropTypes.func
111
- }), _temp;
111
+ }), _class;
112
112
  }
113
113
  var Link = linkHOC(ClickableLink);
114
114
 
package/dist/list/list.js CHANGED
@@ -46,9 +46,6 @@ import '../icon/icon__svg.js';
46
46
  import '../_helpers/checkbox.js';
47
47
  import '../global/get-event-key.js';
48
48
 
49
- const scheduleScrollListener = scheduleRAF();
50
- const scheduleHoverListener = scheduleRAF();
51
-
52
49
  function noop() {}
53
50
 
54
51
  const warnEmptyKey = deprecate(() => {}, 'No key passed for list item with non-string label. It is considered as a bad practice and has been deprecated, please provide a key.');
@@ -105,7 +102,7 @@ class List extends Component {
105
102
  scrolledToBottom: false
106
103
  });
107
104
 
108
- _defineProperty(this, "hoverHandler", memoize(index => () => scheduleHoverListener(() => {
105
+ _defineProperty(this, "hoverHandler", memoize(index => () => this.scheduleHoverListener(() => {
109
106
  if (this.state.disabledHover) {
110
107
  return;
111
108
  }
@@ -291,7 +288,7 @@ class List extends Component {
291
288
  });
292
289
  });
293
290
 
294
- _defineProperty(this, "scrollEndHandler", () => scheduleScrollListener(() => {
291
+ _defineProperty(this, "scrollEndHandler", () => this.scheduleScrollListener(() => {
295
292
  const innerContainer = this.inner;
296
293
 
297
294
  if (innerContainer) {
@@ -475,6 +472,9 @@ class List extends Component {
475
472
  'command+enter': this.enterHandler,
476
473
  'shift+enter': this.enterHandler
477
474
  });
475
+
476
+ this.scheduleScrollListener = scheduleRAF();
477
+ this.scheduleHoverListener = scheduleRAF();
478
478
  }
479
479
 
480
480
  static getDerivedStateFromProps(nextProps, prevState) {
@@ -213,7 +213,11 @@ class Popup extends PureComponent {
213
213
  setTimeout(() => {
214
214
  this._listenersEnabled = true;
215
215
  this.listeners.add(window, 'resize', this._redraw);
216
- this.listeners.add(window, 'scroll', this._redraw);
216
+
217
+ if (this.props.autoPositioningOnScroll) {
218
+ this.listeners.add(window, 'scroll', this._redraw);
219
+ }
220
+
217
221
  this.listeners.add(document, 'pointerdown', this._onDocumentClick, true);
218
222
 
219
223
  let el = this._getAnchor();
@@ -336,6 +340,7 @@ _defineProperty(Popup, "propTypes", {
336
340
  // true means that it's never used in SSR
337
341
  directions: PropTypes.arrayOf(PropTypes.string),
338
342
  autoPositioning: PropTypes.bool,
343
+ autoPositioningOnScroll: PropTypes.bool,
339
344
  autoCorrectTopOverflow: PropTypes.bool,
340
345
  left: PropTypes.number,
341
346
  top: PropTypes.number,
@@ -370,6 +375,7 @@ _defineProperty(Popup, "defaultProps", {
370
375
  keepMounted: false,
371
376
  directions: DEFAULT_DIRECTIONS,
372
377
  autoPositioning: true,
378
+ autoPositioningOnScroll: true,
373
379
  autoCorrectTopOverflow: true,
374
380
  left: 0,
375
381
  top: 0,
@@ -899,14 +899,15 @@ class Select extends Component {
899
899
 
900
900
  getToolbar() {
901
901
  const {
902
- hint
902
+ hint,
903
+ renderBottomToolbar
903
904
  } = this.props;
904
905
  const {
905
906
  prefix,
906
907
  label,
907
908
  delayed
908
909
  } = this.state.addButton || {};
909
- const isToolbarHasElements = this.state.addButton || hint;
910
+ const isToolbarHasElements = this.state.addButton || hint || renderBottomToolbar;
910
911
 
911
912
  if (!isToolbarHasElements) {
912
913
  return null;
@@ -914,10 +915,10 @@ class Select extends Component {
914
915
 
915
916
  return /*#__PURE__*/React.createElement("div", {
916
917
  className: classNames({
917
- [modules_9d0de074.toolbar]: !!this.state.addButton
918
+ [modules_9d0de074.toolbar]: Boolean(this.state.addButton || renderBottomToolbar)
918
919
  }),
919
920
  "data-test": "ring-select-toolbar"
920
- }, this.state.addButton && /*#__PURE__*/React.createElement(Button, {
921
+ }, renderBottomToolbar && renderBottomToolbar(), this.state.addButton && /*#__PURE__*/React.createElement(Button, {
921
922
  text: true,
922
923
  delayed: delayed,
923
924
  className: classNames(modules_9d0de074.button, modules_9d0de074.buttonSpaced),
@@ -1261,6 +1262,7 @@ _defineProperty(Select, "propTypes", {
1261
1262
  disabled: PropTypes.bool,
1262
1263
  hideSelected: PropTypes.bool,
1263
1264
  label: PropTypes.string,
1265
+ renderBottomToolbar: PropTypes.func,
1264
1266
  selectedLabel: PropTypes.oneOfType([PropTypes.string, PropTypes.arrayOf(PropTypes.node), PropTypes.node]),
1265
1267
  inputPlaceholder: PropTypes.string,
1266
1268
  clear: PropTypes.bool,
@@ -10,9 +10,9 @@ import '../global/sniffer.js';
10
10
  import 'sniffr';
11
11
 
12
12
  function shortcutsHOC(ComposedComponent) {
13
- var _class, _temp;
13
+ var _class;
14
14
 
15
- return _temp = _class = class WithShortcuts extends React.Component {
15
+ return _class = class WithShortcuts extends React.Component {
16
16
  constructor() {
17
17
  super(...arguments);
18
18
 
@@ -36,7 +36,7 @@ function shortcutsHOC(ComposedComponent) {
36
36
  }, _defineProperty(_class, "propTypes", {
37
37
  rgShortcutsOptions: PropTypes.object,
38
38
  rgShortcutsMap: PropTypes.object
39
- }), _temp;
39
+ }), _class;
40
40
  }
41
41
 
42
42
  export { shortcutsHOC as default };