@jetbrains/ring-ui 5.0.17 → 5.0.20

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.
@@ -301,6 +301,12 @@ export default class Auth {
301
301
  throw error;
302
302
  }
303
303
  async handleInitValidationError(error) {
304
+ if ('cause' in error && error.cause?.message === 'invalid_client') {
305
+ // eslint-disable-next-line no-console
306
+ console.error('RingUI Auth: invalid client detected. Logging out', error);
307
+ await this.logout();
308
+ return undefined;
309
+ }
304
310
  // Redirect flow
305
311
  if ('authRedirect' in error && error.authRedirect && this.config.redirect) {
306
312
  return this.sendRedirect(error);
@@ -137,7 +137,7 @@ export default class TokenValidator {
137
137
  if (errorResponse.status === CODE.UNAUTHORIZED ||
138
138
  TokenValidator.shouldRefreshToken(response.error)) {
139
139
  // Token expired
140
- throw new TokenValidator.TokenValidationError(response.error || errorResponse.message);
140
+ throw new TokenValidator.TokenValidationError(response.error || errorResponse.message, errorResponse.data?.error ? new Error(errorResponse.data?.error) : undefined);
141
141
  }
142
142
  // Request unexpectedly failed
143
143
  throw errorResponse;
@@ -108,7 +108,7 @@ class ButtonController extends RingAngularComponent {
108
108
  this.element.className = classNames(
109
109
  foreignClasses,
110
110
  getButtonClasses({
111
- height: ControlsHeight.S,
111
+ height: $attrs.height || ControlsHeight.S,
112
112
  className: styles.button,
113
113
  active: this.getAttrValue($attrs.active),
114
114
  disabled: this.getAttrValue($attrs.disabled),
@@ -61,11 +61,12 @@
61
61
  outline: none;
62
62
 
63
63
  font-size: var(--ring-font-size);
64
- line-height: calc(unit * 3);
65
64
  }
66
65
 
67
66
  .item.item {
68
67
  padding: 3px calc(unit * 2) 5px;
68
+
69
+ line-height: calc(unit * 3);
69
70
  }
70
71
 
71
72
  .itemContainer {
@@ -56,7 +56,7 @@ export default class Pager extends PureComponent<PagerProps> {
56
56
  selected: SelectItem<PagerSizeItem> | undefined;
57
57
  data: SelectItem<PagerSizeItem>[];
58
58
  };
59
- getTotal(): number;
59
+ getTotalPages(): number;
60
60
  handlePageSizeChange: (item: PagerSizeItem | null) => void;
61
61
  handlePrevClick: () => void;
62
62
  handleNextClick: () => void;
@@ -76,7 +76,7 @@ export default class Pager extends PureComponent<PagerProps> {
76
76
  getPageSizeSelector(): false | JSX.Element;
77
77
  getPagerLinks(): JSX.Element;
78
78
  generateHref(page: number): string | undefined;
79
- getPagerContent(): JSX.Element | null;
79
+ getPagerContent(): JSX.Element;
80
80
  render(): JSX.Element;
81
81
  }
82
82
  export declare type PagerAttrs = JSX.LibraryManagedAttributes<typeof Pager, PagerProps>;
@@ -45,7 +45,7 @@ export default class Pager extends PureComponent {
45
45
  const selected = data.find(it => it.key === pageSize);
46
46
  return { selected, data };
47
47
  }
48
- getTotal() {
48
+ getTotalPages() {
49
49
  const { total, pageSize } = this.props;
50
50
  return Math.ceil(total / pageSize);
51
51
  }
@@ -64,7 +64,7 @@ export default class Pager extends PureComponent {
64
64
  handleNextClick = () => {
65
65
  const { currentPage, onLoadPage } = this.props;
66
66
  const nextPage = currentPage + 1;
67
- const total = this.getTotal();
67
+ const total = this.getTotalPages();
68
68
  if (currentPage !== total) {
69
69
  this.props.onPageChange?.(nextPage);
70
70
  }
@@ -104,7 +104,8 @@ export default class Pager extends PureComponent {
104
104
  }
105
105
  getPagerLinks() {
106
106
  const prevLinkAvailable = this.props.currentPage !== 1;
107
- const nextLinkAvailable = this.props.openTotal || this.props.currentPage !== this.getTotal();
107
+ const nextLinkAvailable = this.props.openTotal ||
108
+ this.props.currentPage !== this.getTotalPages();
108
109
  const nextIcon = (<Icon glyph={chevronRightIcon} key="icon"/>);
109
110
  const prevIcon = (<Icon glyph={chevronLeftIcon} key="icon"/>);
110
111
  const prevText = this.props.translations.previousPage;
@@ -146,9 +147,9 @@ export default class Pager extends PureComponent {
146
147
  }
147
148
  getPagerContent() {
148
149
  const { currentPage, visiblePagesLimit } = this.props;
149
- const totalPages = this.getTotal();
150
- if (totalPages < 2 && !this.props.openTotal) {
151
- return null;
150
+ const totalPages = this.getTotalPages();
151
+ if (totalPages < this.props.currentPage) {
152
+ this.props.onPageChange?.(totalPages);
152
153
  }
153
154
  let start = 1;
154
155
  let end = totalPages;
@@ -204,7 +205,7 @@ export default class Pager extends PureComponent {
204
205
  render() {
205
206
  const classes = classNames(style.pager, this.props.className);
206
207
  return (<div data-test="ring-pager" className={classes}>
207
- {this.props.total > 1
208
+ {this.getTotalPages() > 1 || this.props.openTotal
208
209
  ? this.getPagerContent()
209
210
  : this.getPageSizeSelector()}
210
211
  </div>);
@@ -1,273 +1,164 @@
1
1
  @import "../global/variables.css";
2
+ @import "../button/button.css";
2
3
 
3
- @value dark from "../global/variables_dark.css";
4
4
  @value unit from "../global/global.css";
5
5
  @value overInputZIndex: 2;
6
6
  @value inputGap: calc(unit * 3);
7
7
 
8
8
  .queryAssist {
9
- height: calc(unit * 3);
9
+ --ring-input-icon-offset: calc(unit * 2.5);
10
+ --ring-input-padding-inline: unit;
11
+ --ring-input-padding-block: 3px;
12
+ --ring-input-padding-start: var(--ring-input-padding-inline);
13
+ --ring-input-padding-end: var(--ring-input-padding-inline);
10
14
 
11
- background: var(--ring-content-background-color);
12
- }
13
-
14
- .input {
15
- height: calc(unit * 3 - 2px);
16
-
17
- box-shadow: 0 0 0 1px var(--ring-borders-color);
18
-
19
- /* stylelint-disable-next-line selector-max-specificity */
20
- &:not([disabled]):active,
21
- &:not([disabled]):focus {
22
- border-color: transparent;
23
- box-shadow: 0 0 0 1px var(--ring-main-color);
24
- }
25
- }
26
-
27
- .placeholder {
28
- color: var(--ring-secondary-color);
29
- }
30
-
31
- .letter-text {
32
- color: var(--ring-warning-color);
33
- }
34
-
35
- .letterDefault,
36
- .letter-field-name {
37
- color: var(--ring-text-color);
38
- }
39
-
40
- .letter-field-value {
41
- color: var(--ring-link-color);
42
- }
15
+ position: relative;
43
16
 
44
- .letter-operator {
45
- color: var(--ring-secondary-color);
46
- }
17
+ display: flex;
47
18
 
48
- .letter-error {
49
- padding-bottom: 1px;
19
+ box-sizing: border-box;
50
20
 
51
- border-bottom: 1px solid var(--ring-icon-error-color);
52
- }
21
+ font-size: var(--ring-font-size);
22
+ line-height: var(--ring-line-height);
53
23
 
54
- .iconInner {
55
- color: var(--ring-icon-secondary-color);
56
- }
57
-
58
- .highlight {
59
- font-weight: 600;
60
- }
61
-
62
- .service {
63
- color: var(--ring-secondary-color);
24
+ & * {
25
+ box-sizing: border-box;
26
+ }
64
27
  }
65
28
 
66
- .dark {
67
- & .queryAssist {
68
- height: calc(unit * 4);
29
+ .huge {
30
+ --ring-input-padding-block: 5px;
69
31
 
70
- font-size: 16px;
71
- }
32
+ width: 100%;
72
33
 
73
34
  & .input {
74
- top: 0;
75
-
76
- height: calc(unit * 4 - 2px);
77
-
78
- color: var(--ring-search-color);
79
-
80
- border-top-width: 5px;
81
- background: var(--ring-selected-background-color);
82
-
83
- &:active,
84
- &:focus {
85
- border-color: var(--ring-navigation-background-color);
86
-
87
- background-color: var(--ring-navigation-background-color);
88
- }
35
+ border-right: 0;
36
+ border-top-right-radius: 0;
37
+ border-bottom-right-radius: 0;
89
38
  }
90
39
 
91
- & .placeholder {
92
- top: 6px;
40
+ & .actions {
41
+ right: calc(var(--ring-input-padding-inline) + 34px);
42
+ }
43
+ }
93
44
 
94
- color: var(--ring-icon-color);
45
+ .input {
46
+ width: 100%;
95
47
 
96
- @nest & :-ms-input-placeholder,
97
- :root & {
98
- top: 7px;
99
- }
48
+ margin: 0;
49
+ padding-top: var(--ring-input-padding-block);
50
+ padding-right: var(--ring-input-padding-end);
51
+ padding-bottom: var(--ring-input-padding-block);
52
+ padding-left: var(--ring-input-padding-start);
100
53
 
101
- @supports (-ms-ime-align:auto) {
102
- & {
103
- top: 7px;
104
- }
105
- }
106
- }
54
+ transition: border-color var(--ring-ease);
107
55
 
108
- & .letter-text {
109
- color: var(--ring-warning-color);
110
- }
56
+ color: var(--ring-text-color);
57
+ border: 1px solid var(--ring-borders-color);
58
+ border-radius: var(--ring-border-radius);
59
+ outline: none;
60
+ background: transparent;
111
61
 
112
- & .letterDefault,
113
- & .letter-field-name {
114
- color: var(--ring-search-color);
115
- }
62
+ font: inherit;
116
63
 
117
- & .letter-field-value {
118
- color: var(--ring-active-text-color);
119
- }
64
+ caret-color: var(--ring-main-color);
120
65
 
121
- & .letter-operator {
122
- color: var(--ring-secondary-color);
66
+ @nest [dir=rtl] & {
67
+ padding-right: var(--ring-input-padding-start);
68
+ padding-left: var(--ring-input-padding-end);
123
69
  }
124
70
 
125
- & .letter-error {
126
- padding-bottom: 1px;
127
-
128
- border-bottom: 1px solid var(--ring-icon-error-color);
129
- }
71
+ &:hover {
72
+ transition: none;
130
73
 
131
- & .icon {
132
- top: 7px;
74
+ border-color: var(--ring-border-hover-color);
133
75
  }
134
76
 
135
- & .iconInner {
136
- color: var(--ring-icon-color);
77
+ @nest .error & {
78
+ border-color: var(--ring-icon-error-color);
137
79
  }
138
80
 
139
- & .loader {
140
- top: 6px;
141
- }
81
+ &:focus {
82
+ transition: none;
142
83
 
143
- & .highlight {
144
- font-weight: 600;
84
+ border-color: var(--ring-main-color);
145
85
  }
146
86
 
147
- & .service {
148
- color: var(--ring-secondary-color);
149
- }
87
+ &[disabled] {
88
+ color: var(--ring-disabled-color);
89
+ border-color: var(--ring-border-disabled-color);
90
+ background-color: var(--ring-disabled-background-color);
150
91
 
151
- & .actions {
152
- background-color: var(--ring-selected-background-color);
92
+ -webkit-text-fill-color: var(--ring-disabled-color); /* Required for Safari, see RG-2063 for details */
153
93
  }
154
94
 
155
- /* stylelint-disable-next-line selector-max-specificity */
156
- & .input:focus ~ .actions {
157
- background-color: var(--ring-navigation-background-color);
95
+ /*
96
+ Kill yellow/blue webkit autocomplete
97
+ https://css-tricks.com/snippets/css/change-autocomplete-styles-webkit-browsers/
98
+ */
99
+ &:-webkit-autofill {
100
+ &,
101
+ &:hover,
102
+ &:focus {
103
+ transition: background-color 50000s ease-in-out 0s;
104
+ }
158
105
  }
159
106
  }
160
107
 
161
- .queryAssist {
162
- composes: font from "../global/global.css";
163
-
164
- position: relative;
165
-
166
- box-sizing: border-box;
167
-
168
- line-height: normal;
108
+ .withIcon {
109
+ --ring-input-padding-start: calc(var(--ring-input-padding-inline) + var(--ring-input-icon-offset));
169
110
  }
170
111
 
171
- .input {
172
- position: relative;
173
-
174
- top: 1px;
175
- left: 1px;
176
-
177
- overflow: auto;
178
-
179
- box-sizing: border-box;
180
-
181
- width: calc(100% - 2px);
182
- margin: 0;
183
-
184
- padding: 2px calc(unit / 2) 3px;
185
-
186
- white-space: nowrap;
187
-
188
- border-width: 0;
189
- border-style: solid;
190
- border-color: transparent;
191
- background: transparent;
192
-
193
- line-height: 16px;
194
-
195
- scrollbar-width: none;
196
-
197
- &:active,
198
- &:focus {
199
- outline: 0;
200
- }
201
-
202
- @nest & :-ms-input-placeholder,
203
- :root & {
204
- line-height: 17px;
205
- }
112
+ .letter-text {
113
+ color: var(--ring-warning-color);
114
+ }
206
115
 
207
- @supports (-ms-ime-align:auto) {
208
- & {
209
- line-height: 17px;
210
- }
211
- }
116
+ .letterDefault,
117
+ .letter-field-name {
118
+ color: var(--ring-text-color);
119
+ }
212
120
 
213
- & .iconInner {
214
- color: var(--ring-icon-color);
215
- }
121
+ .letter-field-value {
122
+ color: var(--ring-link-color);
123
+ }
216
124
 
217
- &.inputGap {
218
- border-right-width: inputGap;
219
- }
125
+ .letter-operator {
126
+ color: var(--ring-secondary-color);
127
+ }
220
128
 
221
- &.inputGap2 {
222
- border-right-width: calc(2 * inputGap);
223
- }
129
+ .letter-error {
130
+ padding-bottom: 1px;
224
131
 
225
- &.inputLeftGap {
226
- border-left-width: inputGap;
227
- }
132
+ border-bottom: 1px solid var(--ring-icon-error-color);
133
+ }
228
134
 
229
- &.inputDisabled {
230
- border-color: var(--ring-line-color);
231
- box-shadow: 0 0 0 1px var(--ring-line-color);
232
- }
135
+ .highlight {
136
+ font-weight: 600;
137
+ }
233
138
 
234
- &.inputDisabled span > span {
235
- color: var(--ring-disabled-color);
236
- }
139
+ .service {
140
+ color: var(--ring-secondary-color);
237
141
  }
238
142
 
239
143
  .placeholder {
240
144
  composes: resetButton from "../global/global.css";
241
145
 
242
146
  position: absolute;
243
- top: 3px;
244
-
245
- left: 5px;
147
+ top: calc(var(--ring-input-padding-block) + 1px);
148
+ left: 1px;
246
149
 
247
150
  display: block;
248
151
 
249
152
  overflow: hidden;
250
153
 
251
154
  width: calc(100% - unit * 4);
155
+ padding-left: var(--ring-input-padding-start);
252
156
 
253
157
  text-overflow: ellipsis;
254
158
 
255
159
  pointer-events: none;
256
160
 
257
- &.placeholderSpaced {
258
- left: calc(unit * 3 + 5px);
259
- }
260
-
261
- @nest & :-ms-input-placeholder,
262
- :root & {
263
- top: 4px;
264
- }
265
-
266
- @supports (-ms-ime-align:auto) {
267
- & {
268
- top: 4px;
269
- }
270
- }
161
+ color: var(--ring-disabled-color);
271
162
  }
272
163
 
273
164
  .letter {
@@ -276,41 +167,63 @@
276
167
 
277
168
  .actions {
278
169
  position: absolute;
279
- z-index: overInputZIndex;
280
- top: 4px;
281
- right: 1px;
170
+ top: calc(var(--ring-input-padding-block) - 2px);
171
+ right: var(--ring-input-padding-inline);
282
172
 
283
- background-color: var(--ring-content-background-color);
173
+ height: auto;
174
+
175
+ line-height: inherit;
176
+
177
+ @nest [dir=rtl] & {
178
+ right: auto;
179
+ left: unit;
180
+ }
284
181
  }
285
182
 
286
183
  .icon {
287
184
  position: absolute;
288
- z-index: overInputZIndex;
289
- top: 3px;
185
+ top: calc(var(--ring-input-padding-block) + 1px);
186
+ left: var(--ring-input-padding-inline);
290
187
 
291
- box-sizing: border-box;
188
+ color: var(--ring-icon-secondary-color);
292
189
 
293
- width: calc(unit * 3);
294
- height: calc(unit * 2);
190
+ @nest [dir=rtl] & {
191
+ right: unit;
192
+ left: auto;
193
+ }
194
+ }
295
195
 
296
- padding: 0 4px;
196
+ .rightSearchButton {
197
+ padding: 5px 9px;
297
198
 
298
199
  cursor: pointer;
299
- user-select: none;
300
200
 
301
- line-height: normal;
201
+ transition: border-color var(--ring-ease);
202
+
203
+ color: var(--ring-icon-secondary-color);
204
+
205
+ border: 1px solid var(--ring-borders-color);
206
+ border-radius: var(--ring-border-radius);
207
+ border-top-left-radius: 0;
208
+ border-bottom-left-radius: 0;
302
209
 
303
- & svg {
304
- vertical-align: baseline;
210
+ @nest .queryAssist.queryAssist:focus-within & {
211
+ transition: none;
212
+
213
+ border-color: var(--ring-main-color);
305
214
  }
306
215
 
307
- @nest .actions & {
308
- position: relative;
309
- top: 0;
310
- left: -1px;
216
+ @nest .queryAssist:hover & {
217
+ transition: none;
218
+
219
+ border-color: var(--ring-border-hover-color);
311
220
  }
312
221
  }
313
222
 
223
+ .clear {
224
+ padding-right: 0;
225
+ }
226
+
314
227
  .loaderOnTheRight {
315
228
  right: 1px;
316
229
 
@@ -3,6 +3,7 @@ import PropTypes from 'prop-types';
3
3
  import Caret, { Position } from '../caret/caret';
4
4
  import PopupMenu from '../popup-menu/popup-menu';
5
5
  import Button from '../button/button';
6
+ import Icon from '../icon/icon';
6
7
  import { ShortcutsMap } from '../shortcuts/core';
7
8
  import { QueryAssistSuggestion, SuggestionItem } from './query-assist__suggestions';
8
9
  declare function noop(): void;
@@ -57,6 +58,7 @@ export interface QueryAssistProps {
57
58
  useCustomItemRender?: boolean | null | undefined;
58
59
  actions?: ReactNode[] | null | undefined;
59
60
  'data-test'?: string | null | undefined;
61
+ huge?: boolean | null | undefined;
60
62
  }
61
63
  export interface StyleRange {
62
64
  style: string;
@@ -207,6 +209,7 @@ export default class QueryAssist extends Component<QueryAssistProps> {
207
209
  translations: PropTypes.Requireable<object>;
208
210
  actions: PropTypes.Requireable<any[]>;
209
211
  'data-test': PropTypes.Requireable<string>;
212
+ huge: PropTypes.Requireable<boolean>;
210
213
  };
211
214
  static defaultProps: {
212
215
  onApply: typeof noop;
@@ -280,8 +283,8 @@ export default class QueryAssist extends Component<QueryAssistProps> {
280
283
  popupRef: (node: PopupMenu<SuggestionItem> | null) => void;
281
284
  placeholder?: HTMLElement | null;
282
285
  placeholderRef: (node: HTMLElement | null) => void;
283
- glass?: ComponentRef<typeof Button> | null;
284
- glassRef: (node: ComponentRef<typeof Button> | null) => void;
286
+ glass?: ComponentRef<typeof Icon> | null;
287
+ glassRef: (node: ComponentRef<typeof Icon> | null) => void;
285
288
  loader?: HTMLElement | null;
286
289
  loaderRef: (node: HTMLElement | null) => void;
287
290
  clear?: ComponentRef<typeof Button> | null;