@jetbrains/ring-ui 4.1.0-beta.9 → 4.1.1
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/CHANGELOG.md +13 -0
- package/README.md +17 -15
- package/babel.config.js +3 -2
- package/components/alert/alert.js +9 -3
- package/components/alert/container.css +1 -1
- package/components/alert-service/alert-service.examples.css +18 -0
- package/components/alert-service/alert-service.examples.js +21 -0
- package/components/alert-service/alert-service.js +10 -3
- package/components/analytics/analytics__fus-plugin.js +1 -1
- package/components/auth/auth.test.js +14 -7
- package/components/auth/auth__core.js +64 -33
- package/components/auth-dialog/auth-dialog.js +1 -0
- package/components/avatar/avatar.css +4 -1
- package/components/avatar/avatar.examples.js +3 -2
- package/components/avatar/avatar.js +31 -6
- package/components/avatar/fallback-avatar.js +136 -0
- package/components/avatar-editor-ng/avatar-editor-ng.css +2 -2
- package/components/avatar-editor-ng/avatar-editor-ng.js +2 -1
- package/components/avatar-editor-ng/{avatar-editor-ng.html → avatar-editor-ng__template.js} +2 -2
- package/components/button/button.css +2 -2
- package/components/button/button.js +4 -1
- package/components/button-group/button-group.js +1 -1
- package/components/button-group/caption.js +1 -1
- package/components/button-ng/button-ng.js +1 -1
- package/components/button-set-ng/button-set-ng.js +3 -1
- package/components/checkbox/checkbox.css +1 -1
- package/components/code/code.js +1 -1
- package/components/confirm/confirm.js +1 -0
- package/components/confirm-service/confirm-service.js +5 -5
- package/components/content-layout/content-layout.css +1 -1
- package/components/data-list/data-list.css +1 -1
- package/components/date-picker/date-input.js +5 -4
- package/components/date-picker/date-picker.css +34 -22
- package/components/date-picker/date-picker.js +16 -14
- package/components/date-picker/date-popup.js +22 -7
- package/components/date-picker/month-names.js +8 -5
- package/components/date-picker/month.js +6 -2
- package/components/date-picker/weekdays.js +10 -2
- package/components/dialog/dialog.examples.js +3 -1
- package/components/dialog/dialog.js +5 -2
- package/components/dialog/dialog.test.js +1 -1
- package/components/dialog/dialog__body-scroll-preventer.js +2 -2
- package/components/dialog-ng/dialog-ng.js +7 -8
- package/components/dialog-ng/{dialog-ng.html → dialog-ng__template.js} +2 -2
- package/components/dropdown/dropdown.examples.js +36 -1
- package/components/dropdown-menu/dropdown-menu.examples.js +47 -0
- package/components/dropdown-menu/dropdown-menu.js +117 -0
- package/components/dropdown-menu/dropdown-menu.test.js +76 -0
- package/components/error-bubble/error-bubble-legacy.css +1 -1
- package/components/error-bubble/error-bubble.css +1 -1
- package/components/error-bubble/error-bubble.examples.js +1 -1
- package/components/error-page/error-page.css +2 -2
- package/components/footer-ng/footer-ng.js +13 -3
- package/components/form/form.css +2 -2
- package/components/form-ng/form-ng.js +3 -1
- package/components/global/global.css +1 -1
- package/components/global/theme.js +1 -1
- package/components/global/variables.css +8 -1
- package/components/grid/grid.css +10 -9
- package/components/header/header.css +1 -1
- package/components/header/header.examples.js +7 -8
- package/components/header/profile.js +10 -11
- package/components/http/http.js +1 -1
- package/components/icon/icon.css +5 -4
- package/components/island/island.css +4 -3
- package/components/island-legacy/island-legacy.css +3 -1
- package/components/list/list.js +6 -1
- package/components/list/list__custom.js +9 -3
- package/components/list/list__item.js +8 -2
- package/components/list/list__link.js +2 -1
- package/components/loader-inline/loader-inline.css +1 -1
- package/components/loader-screen/loader-screen.css +1 -1
- package/components/message/message.css +1 -1
- package/components/message/message.examples.js +8 -5
- package/components/pager/pager.js +5 -3
- package/components/permissions/permissions.js +1 -1
- package/components/progress-bar/progress-bar.css +1 -1
- package/components/progress-bar/progress-bar.examples.js +3 -3
- package/components/progress-bar/progress-bar.js +5 -2
- package/components/progress-bar/progress-bar.test.js +12 -13
- package/components/progress-bar-ng/progress-bar-ng.examples.js +3 -3
- package/components/query-assist/query-assist.css +13 -3
- package/components/query-assist/query-assist.examples.js +3 -1
- package/components/query-assist/query-assist.js +56 -12
- package/components/query-assist/query-assist.test.js +37 -5
- package/components/save-field-ng/save-field-ng.css +0 -3
- package/components/save-field-ng/save-field-ng.js +3 -1
- package/components/save-field-ng/{save-field-ng.html → save-field-ng__template.js} +2 -2
- package/components/select/select.css +12 -7
- package/components/select/select.examples.js +13 -0
- package/components/select/select.js +30 -43
- package/components/select/select.test.js +4 -5
- package/components/shortcuts-hint-ng/shortcuts-hint-ng.css +1 -1
- package/components/shortcuts-hint-ng/shortcuts-hint-ng.js +1 -1
- package/components/shortcuts-hint-ng/{shortcuts-hint-ng.html → shortcuts-hint-ng__template.js} +2 -2
- package/components/sidebar/sidebar.css +1 -0
- package/components/sidebar-ng/sidebar-ng.js +6 -2
- package/components/sidebar-ng/{sidebar-ng__button.html → sidebar-ng__button-template.js} +2 -2
- package/components/sidebar-ng/{sidebar-ng.html → sidebar-ng__template.js} +2 -2
- package/components/table/row.js +2 -1
- package/components/table/table.css +2 -1
- package/components/table-legacy/table-legacy.css +2 -2
- package/components/table-legacy/table-legacy__toolbar.css +2 -2
- package/components/table-legacy-ng/table-legacy-ng.js +38 -5
- package/components/table-legacy-ng/table-legacy-ng__pager.js +7 -1
- package/components/tabs/collapsible-tab.js +2 -2
- package/components/tabs/collapsible-tabs.js +4 -8
- package/components/tabs/tab-link.js +4 -2
- package/components/tabs/tabs.css +27 -0
- package/components/tabs-ng/tabs-ng.js +4 -2
- package/components/tabs-ng/{tabs-ng.html → tabs-ng__template.js} +6 -2
- package/components/tag/tag.css +5 -2
- package/components/tag/tag.examples.js +3 -0
- package/components/tag/tag.js +19 -16
- package/components/tags-input/tag-input.examples.js +1 -1
- package/components/tags-input/tags-input.js +5 -2
- package/components/template-ng/template-ng.js +1 -1
- package/components/tooltip/tooltip.js +7 -2
- package/components/user-agreement/user-agreement.css +1 -1
- package/components/user-agreement/user-agreement.examples.js +7 -4
- package/components/user-agreement/user-agreement.js +1 -0
- package/package.json +75 -78
- package/webpack.config.js +14 -10
- package/components/button-set-ng/button-set-ng.html +0 -1
- package/components/footer-ng/footer-ng.html +0 -13
- package/components/form-ng/form-ng__error-bubble.html +0 -3
- package/components/table-legacy-ng/table-legacy-ng.html +0 -4
- package/components/table-legacy-ng/table-legacy-ng__column.html +0 -12
- package/components/table-legacy-ng/table-legacy-ng__header.html +0 -4
- package/components/table-legacy-ng/table-legacy-ng__pager.html +0 -7
- package/components/table-legacy-ng/table-legacy-ng__row.html +0 -12
- package/components/table-legacy-ng/table-legacy-ng__title.html +0 -9
- package/dist/_helpers/_rollupPluginBabelHelpers.js +0 -127
- package/dist/_helpers/anchor.js +0 -33
- package/dist/_helpers/badge.js +0 -3
- package/dist/_helpers/button__classes.js +0 -39
- package/dist/_helpers/caption.js +0 -25
- package/dist/_helpers/card.js +0 -77
- package/dist/_helpers/date-picker.js +0 -3
- package/dist/_helpers/dialog__body-scroll-preventer.js +0 -56
- package/dist/_helpers/grid.js +0 -3
- package/dist/_helpers/header.js +0 -3
- package/dist/_helpers/icon__svg.js +0 -83
- package/dist/_helpers/inject-styles.js +0 -22
- package/dist/_helpers/island.js +0 -3
- package/dist/_helpers/list.js +0 -3
- package/dist/_helpers/query-assist__suggestions.js +0 -95
- package/dist/_helpers/select__filter.js +0 -78
- package/dist/_helpers/services-link.js +0 -42
- package/dist/_helpers/sidebar.js +0 -127
- package/dist/_helpers/table.js +0 -3
- package/dist/_helpers/tabs.js +0 -3
- package/dist/_helpers/title.js +0 -99
- package/dist/alert/alert.js +0 -254
- package/dist/alert/container.js +0 -50
- package/dist/alert-service/alert-service.js +0 -159
- package/dist/analytics/analytics.js +0 -116
- package/dist/analytics/analytics__custom-plugin.js +0 -127
- package/dist/analytics/analytics__fus-plugin.js +0 -101
- package/dist/analytics/analytics__ga-plugin.js +0 -66
- package/dist/analytics/analytics__plugin-utils.js +0 -79
- package/dist/auth/auth.js +0 -90
- package/dist/auth/auth__core.js +0 -987
- package/dist/auth/background-flow.js +0 -123
- package/dist/auth/down-notification.js +0 -111
- package/dist/auth/iframe-flow.js +0 -147
- package/dist/auth/landing-entry.js +0 -5
- package/dist/auth/landing.js +0 -84
- package/dist/auth/request-builder.js +0 -75
- package/dist/auth/response-parser.js +0 -117
- package/dist/auth/storage.js +0 -279
- package/dist/auth/token-validator.js +0 -176
- package/dist/auth/window-flow.js +0 -133
- package/dist/auth-dialog/auth-dialog.js +0 -132
- package/dist/auth-dialog-service/auth-dialog-service.js +0 -67
- package/dist/avatar/avatar-example-datauri.js +0 -26
- package/dist/avatar/avatar.js +0 -155
- package/dist/badge/badge.js +0 -52
- package/dist/button/button.js +0 -117
- package/dist/button/button__classes.js +0 -5
- package/dist/button-group/button-group.js +0 -30
- package/dist/button-group/caption.js +0 -5
- package/dist/button-set/button-set.js +0 -27
- package/dist/button-toolbar/button-toolbar.js +0 -30
- package/dist/caret/caret.js +0 -264
- package/dist/checkbox/checkbox.js +0 -110
- package/dist/confirm/confirm.js +0 -122
- package/dist/confirm-service/confirm-service.js +0 -112
- package/dist/content-layout/content-layout.js +0 -67
- package/dist/content-layout/sidebar.js +0 -6
- package/dist/contenteditable/contenteditable.js +0 -81
- package/dist/data-list/data-list.js +0 -203
- package/dist/data-list/data-list.mock.js +0 -190
- package/dist/data-list/item.js +0 -225
- package/dist/data-list/selection.js +0 -101
- package/dist/data-list/title.js +0 -16
- package/dist/date-picker/consts.js +0 -70
- package/dist/date-picker/date-input.js +0 -169
- package/dist/date-picker/date-picker.js +0 -356
- package/dist/date-picker/date-popup.js +0 -459
- package/dist/date-picker/day.js +0 -119
- package/dist/date-picker/formats.js +0 -3
- package/dist/date-picker/month-names.js +0 -92
- package/dist/date-picker/month-slider.js +0 -83
- package/dist/date-picker/month.js +0 -48
- package/dist/date-picker/months.js +0 -121
- package/dist/date-picker/weekdays.js +0 -24
- package/dist/date-picker/years.js +0 -109
- package/dist/dialog/dialog.js +0 -197
- package/dist/dialog/dialog__body-scroll-preventer.js +0 -2
- package/dist/dropdown/anchor.js +0 -16
- package/dist/dropdown/dropdown.js +0 -236
- package/dist/error-bubble/error-bubble.js +0 -59
- package/dist/error-message/error-message.js +0 -55
- package/dist/footer/footer.js +0 -127
- package/dist/global/angular-component-factory.js +0 -83
- package/dist/global/compose.js +0 -9
- package/dist/global/composeRefs.js +0 -15
- package/dist/global/conic-gradient.js +0 -37
- package/dist/global/create-stateful-context.js +0 -54
- package/dist/global/data-tests.js +0 -22
- package/dist/global/dom.js +0 -124
- package/dist/global/focus-sensor-hoc.js +0 -147
- package/dist/global/fuzzy-highlight.js +0 -67
- package/dist/global/get-event-key.js +0 -111
- package/dist/global/get-uid.js +0 -15
- package/dist/global/inject-styles.js +0 -17
- package/dist/global/linear-function.js +0 -18
- package/dist/global/listeners.js +0 -42
- package/dist/global/memoize.js +0 -18
- package/dist/global/normalize-indent.js +0 -28
- package/dist/global/promise-with-timeout.js +0 -13
- package/dist/global/radial-gradient-mask.js +0 -49
- package/dist/global/react-dom-renderer.js +0 -45
- package/dist/global/rerender-hoc.js +0 -53
- package/dist/global/ring-angular-component.js +0 -24
- package/dist/global/schedule-raf.js +0 -31
- package/dist/global/sniffer.js +0 -6
- package/dist/global/supports-css.js +0 -20
- package/dist/global/theme.js +0 -56
- package/dist/global/trivial-template-tag.js +0 -15
- package/dist/global/url.js +0 -163
- package/dist/global/variables_dark.js +0 -57
- package/dist/grid/col.js +0 -62
- package/dist/grid/grid.js +0 -35
- package/dist/grid/row.js +0 -66
- package/dist/group/group.js +0 -34
- package/dist/header/header.js +0 -144
- package/dist/header/logo.js +0 -39
- package/dist/header/profile.js +0 -212
- package/dist/header/services-link.js +0 -10
- package/dist/header/services.js +0 -135
- package/dist/header/smart-profile.js +0 -227
- package/dist/header/smart-services.js +0 -159
- package/dist/header/tray-icon.js +0 -45
- package/dist/header/tray.js +0 -33
- package/dist/heading/heading.js +0 -76
- package/dist/http/http.js +0 -216
- package/dist/http/http.mock.js +0 -65
- package/dist/hub-source/hub-source.js +0 -130
- package/dist/hub-source/hub-source__user.js +0 -28
- package/dist/hub-source/hub-source__users-groups.js +0 -62
- package/dist/icon/icon.js +0 -105
- package/dist/icon/icon__constants.js +0 -33
- package/dist/icon/icon__svg.js +0 -6
- package/dist/icon/index.js +0 -9
- package/dist/input/input.js +0 -231
- package/dist/island/adaptive-island-hoc.js +0 -48
- package/dist/island/content.js +0 -158
- package/dist/island/header.js +0 -85
- package/dist/island/island.js +0 -53
- package/dist/island-legacy/content-legacy.js +0 -28
- package/dist/island-legacy/header-legacy.js +0 -30
- package/dist/island-legacy/island-legacy.js +0 -30
- package/dist/link/clickableLink.js +0 -65
- package/dist/link/link.js +0 -118
- package/dist/list/consts.js +0 -26
- package/dist/list/list.js +0 -800
- package/dist/list/list__custom.js +0 -82
- package/dist/list/list__hint.js +0 -26
- package/dist/list/list__item.js +0 -197
- package/dist/list/list__link.js +0 -65
- package/dist/list/list__separator.js +0 -30
- package/dist/list/list__title.js +0 -39
- package/dist/list/list__users-groups-source.js +0 -124
- package/dist/loader/loader.js +0 -72
- package/dist/loader/loader__core.js +0 -272
- package/dist/loader-inline/inject-styles.js +0 -11
- package/dist/loader-inline/loader-inline.js +0 -58
- package/dist/loader-screen/loader-screen.js +0 -46
- package/dist/login-dialog/login-dialog.js +0 -184
- package/dist/login-dialog/service.js +0 -67
- package/dist/message/message.js +0 -232
- package/dist/old-browsers-message/old-browsers-message.js +0 -101
- package/dist/old-browsers-message/old-browsers-message__stop.js +0 -5
- package/dist/old-browsers-message/white-list.js +0 -34
- package/dist/pager/pager.js +0 -352
- package/dist/panel/panel.js +0 -34
- package/dist/permissions/permissions.js +0 -200
- package/dist/permissions/permissions__cache.js +0 -272
- package/dist/popup/popup.consts.js +0 -41
- package/dist/popup/popup.js +0 -389
- package/dist/popup/popup.target.js +0 -27
- package/dist/popup/position.js +0 -280
- package/dist/popup-menu/popup-menu.js +0 -108
- package/dist/progress-bar/progress-bar.js +0 -111
- package/dist/proxy-attrs/proxy-attrs.js +0 -19
- package/dist/query-assist/query-assist.js +0 -1023
- package/dist/query-assist/query-assist__suggestions.js +0 -43
- package/dist/radio/radio.js +0 -39
- package/dist/radio/radio__item.js +0 -82
- package/dist/select/select.js +0 -1335
- package/dist/select/select__filter.js +0 -49
- package/dist/select/select__popup.js +0 -541
- package/dist/shortcuts/core.js +0 -245
- package/dist/shortcuts/shortcut-title.js +0 -51
- package/dist/shortcuts/shortcuts-hoc.js +0 -43
- package/dist/shortcuts/shortcuts.js +0 -72
- package/dist/storage/storage.js +0 -55
- package/dist/storage/storage__fallback.js +0 -214
- package/dist/storage/storage__local.js +0 -150
- package/dist/style.css +0 -1
- package/dist/tab-trap/tab-trap.js +0 -178
- package/dist/table/cell.js +0 -25
- package/dist/table/disable-hover-hoc.js +0 -53
- package/dist/table/header-cell.js +0 -91
- package/dist/table/header.js +0 -189
- package/dist/table/multitable.js +0 -140
- package/dist/table/row-with-focus-sensor.js +0 -79
- package/dist/table/row.js +0 -270
- package/dist/table/selection-adapter.js +0 -14
- package/dist/table/selection-shortcuts-hoc.js +0 -212
- package/dist/table/selection.js +0 -221
- package/dist/table/smart-table.js +0 -113
- package/dist/table/table.js +0 -405
- package/dist/tabs/collapsible-more.js +0 -193
- package/dist/tabs/collapsible-tab.js +0 -90
- package/dist/tabs/collapsible-tabs.js +0 -361
- package/dist/tabs/custom-item.js +0 -13
- package/dist/tabs/dumb-tabs.js +0 -159
- package/dist/tabs/smart-tabs.js +0 -102
- package/dist/tabs/tab-link.js +0 -35
- package/dist/tabs/tab.js +0 -32
- package/dist/tabs/tabs.js +0 -65
- package/dist/tag/tag.js +0 -190
- package/dist/tags-input/tags-input.js +0 -474
- package/dist/tags-list/tags-list.js +0 -94
- package/dist/text/text.js +0 -38
- package/dist/toggle/toggle.js +0 -80
- package/dist/tooltip/tooltip.js +0 -205
- package/dist/user-card/card.js +0 -14
- package/dist/user-card/smart-user-card-tooltip.js +0 -112
- package/dist/user-card/tooltip.js +0 -91
- package/dist/user-card/user-card.js +0 -46
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,16 @@
|
|
|
1
|
+
## [4.1.0]
|
|
2
|
+
|
|
3
|
+
### Pre-built version
|
|
4
|
+
|
|
5
|
+
Ring UI now comes with pre-built version in `@jetbrains/ring-ui/dist` directory.
|
|
6
|
+
This addresses the following issues:
|
|
7
|
+
|
|
8
|
+
* does not require using specific bundler (WebPack) anymore
|
|
9
|
+
* does not require dealing with Ring UI building configuration
|
|
10
|
+
* decreases your project build time
|
|
11
|
+
|
|
12
|
+
See "README.md" for quick start with pre-built version
|
|
13
|
+
|
|
1
14
|
## [4.0.0]
|
|
2
15
|
|
|
3
16
|
### BREAKING CHANGES
|
package/README.md
CHANGED
|
@@ -7,27 +7,28 @@ This collection of UI components aims to provide all the necessary building bloc
|
|
|
7
7
|
|
|
8
8
|
## Installation
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
`npm install @jetbrains/ring-ui`
|
|
11
11
|
|
|
12
12
|
### Quick start (importing components as ES modules)
|
|
13
13
|
|
|
14
14
|
The easiest way is to import necessary components as ES modules:
|
|
15
|
-
```
|
|
16
|
-
import
|
|
17
|
-
import
|
|
18
|
-
import Input from "@jetbrains/ring-ui/dist/input"
|
|
19
|
-
import Select from "@jetbrains/ring-ui/dist/select"
|
|
20
|
-
import Toggle from "@jetbrains/ring-ui/dist/toggle"
|
|
21
|
-
import { Tabs, Tab } from "@jetbrains/ring-ui/dist/tabs"
|
|
15
|
+
```js
|
|
16
|
+
// You need to import RingUI styles once
|
|
17
|
+
import '@jetbrains/ring-ui/dist/style.css';
|
|
22
18
|
|
|
23
|
-
import
|
|
19
|
+
import alertService from '@jetbrains/ring-ui/dist/alert-service/alert-service';
|
|
20
|
+
import Button from '@jetbrains/ring-ui/dist/button/button';
|
|
24
21
|
|
|
25
22
|
...
|
|
26
23
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
24
|
+
export const Demo = () => {
|
|
25
|
+
return (
|
|
26
|
+
<Button onClick={() => alertService.successMessage('Hello world')}>
|
|
27
|
+
Click me
|
|
28
|
+
</Button>
|
|
29
|
+
);
|
|
30
|
+
};
|
|
31
|
+
|
|
31
32
|
```
|
|
32
33
|
|
|
33
34
|
The bundle size will depend on the amount of components you imported.
|
|
@@ -43,9 +44,10 @@ The bundle size will depend on the amount of components you imported.
|
|
|
43
44
|
- `npm run build` to build a production bundle
|
|
44
45
|
- `npm run create-component` to create a new component template with styles and tests
|
|
45
46
|
|
|
46
|
-
### Webpack
|
|
47
|
+
### Building Ring UI from source via Webpack
|
|
47
48
|
|
|
48
|
-
In case
|
|
49
|
+
In case you have complex build, and you want to compile RingUI sources together with your sources
|
|
50
|
+
in a same build process, you can use the following configuration:
|
|
49
51
|
|
|
50
52
|
1. Install Ring UI with `npm install @jetbrains/ring-ui --save-exact`
|
|
51
53
|
|
package/babel.config.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
const browserslist = require('browserslist');
|
|
2
|
+
const deprecate = require('util-deprecate');
|
|
2
3
|
|
|
3
4
|
const coreJsVersion = process.env.RING_UI_COREJS_VERSION ||
|
|
4
5
|
require('core-js/package.json').version;
|
|
@@ -9,8 +10,8 @@ module.exports = function config(api) {
|
|
|
9
10
|
api.cache(true);
|
|
10
11
|
|
|
11
12
|
if (isDeprecatedCoreJS) {
|
|
12
|
-
//
|
|
13
|
-
|
|
13
|
+
// TODO remove in 5.0
|
|
14
|
+
deprecate(() => null, `Compiling Ring UI with deprecated Core JS version "${coreJsVersion}". Consider updating to 3rd.`)();
|
|
14
15
|
}
|
|
15
16
|
|
|
16
17
|
return {
|
|
@@ -82,6 +82,7 @@ export default class Alert extends PureComponent {
|
|
|
82
82
|
children: PropTypes.node,
|
|
83
83
|
className: PropTypes.string,
|
|
84
84
|
captionClassName: PropTypes.string,
|
|
85
|
+
closeButtonClassName: PropTypes.string,
|
|
85
86
|
'data-test': PropTypes.string
|
|
86
87
|
};
|
|
87
88
|
|
|
@@ -121,12 +122,17 @@ export default class Alert extends PureComponent {
|
|
|
121
122
|
static Type = Type;
|
|
122
123
|
|
|
123
124
|
closeRequest = (...args) => {
|
|
125
|
+
this.startCloseAnimation();
|
|
126
|
+
return this.props.onCloseRequest(...args);
|
|
127
|
+
};
|
|
128
|
+
|
|
129
|
+
startCloseAnimation = () => {
|
|
124
130
|
const height = getRect(this.node).height;
|
|
125
131
|
this.setState({height});
|
|
126
|
-
return this.props.onCloseRequest(...args);
|
|
127
132
|
};
|
|
128
133
|
|
|
129
134
|
_close() {
|
|
135
|
+
this.startCloseAnimation();
|
|
130
136
|
setTimeout(() => {
|
|
131
137
|
this.props.onClose();
|
|
132
138
|
}, ANIMATION_TIME);
|
|
@@ -189,7 +195,7 @@ export default class Alert extends PureComponent {
|
|
|
189
195
|
};
|
|
190
196
|
|
|
191
197
|
render() {
|
|
192
|
-
const {type, inline, isClosing, isShaking,
|
|
198
|
+
const {type, inline, isClosing, isShaking, closeButtonClassName,
|
|
193
199
|
showWithAnimation, className, 'data-test': dataTest} = this.props;
|
|
194
200
|
|
|
195
201
|
const classes = classNames(className, {
|
|
@@ -218,7 +224,7 @@ export default class Alert extends PureComponent {
|
|
|
218
224
|
? (
|
|
219
225
|
<button
|
|
220
226
|
type="button"
|
|
221
|
-
className={styles.close}
|
|
227
|
+
className={classNames(styles.close, closeButtonClassName)}
|
|
222
228
|
data-test="alert-close"
|
|
223
229
|
aria-label="close alert"
|
|
224
230
|
onClick={this.closeRequest}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
@import "../global/variables.css";
|
|
2
|
+
|
|
3
|
+
@value unit from "../global/global.css";
|
|
4
|
+
@value animation-duration: 300ms;
|
|
5
|
+
@value animation-easing: ease-out;
|
|
6
|
+
|
|
7
|
+
.customAlert {
|
|
8
|
+
background: var(--ring-main-color);
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
.closeButton,
|
|
12
|
+
.closeButton:hover {
|
|
13
|
+
color: var(--ring-dark-text-color);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
.closeButton:hover {
|
|
17
|
+
opacity: 0.8;
|
|
18
|
+
}
|
|
@@ -2,6 +2,8 @@ import React from 'react';
|
|
|
2
2
|
|
|
3
3
|
import reactDecorator from '../../.storybook/react-decorator';
|
|
4
4
|
|
|
5
|
+
import styles from './alert-service.examples.css';
|
|
6
|
+
|
|
5
7
|
import Button from '@jetbrains/ring-ui/components/button/button';
|
|
6
8
|
import ButtonToolbar from '@jetbrains/ring-ui/components/button-toolbar/button-toolbar';
|
|
7
9
|
|
|
@@ -26,6 +28,7 @@ export const alertService = () => {
|
|
|
26
28
|
setTimeout(() => {
|
|
27
29
|
alert.message('A initial message', MSG_TIMEOUT);
|
|
28
30
|
alert.error('Error message');
|
|
31
|
+
this.showCustomMessage();
|
|
29
32
|
});
|
|
30
33
|
}
|
|
31
34
|
|
|
@@ -33,6 +36,21 @@ export const alertService = () => {
|
|
|
33
36
|
alert._getShowingAlerts().forEach(item => alert.removeWithoutAnimation(item.key));
|
|
34
37
|
}
|
|
35
38
|
|
|
39
|
+
showCustomMessage = () => {
|
|
40
|
+
this.lastKey = alert.addAlert(
|
|
41
|
+
<div className={styles.customAlert}>
|
|
42
|
+
<h1>Hello!</h1>
|
|
43
|
+
<p>{'This is a custom message'}</p>
|
|
44
|
+
</div>,
|
|
45
|
+
null,
|
|
46
|
+
0,
|
|
47
|
+
{
|
|
48
|
+
className: styles.customAlert,
|
|
49
|
+
closeButtonClassName: styles.closeButton
|
|
50
|
+
}
|
|
51
|
+
);
|
|
52
|
+
};
|
|
53
|
+
|
|
36
54
|
showError = () => {
|
|
37
55
|
this.lastKey = alert.error('Something wrong happened');
|
|
38
56
|
};
|
|
@@ -59,6 +77,9 @@ export const alertService = () => {
|
|
|
59
77
|
<Button onClick={this.showMessage} primary>
|
|
60
78
|
Show message
|
|
61
79
|
</Button>
|
|
80
|
+
<Button onClick={this.showCustomMessage}>
|
|
81
|
+
Show custom message
|
|
82
|
+
</Button>
|
|
62
83
|
<Button onClick={this.showRandomWarning}>Show warning</Button>
|
|
63
84
|
<Button onClick={this.removeLastAlert}>Remove last alert</Button>
|
|
64
85
|
</ButtonToolbar>
|
|
@@ -76,7 +76,8 @@ class AlertService {
|
|
|
76
76
|
}, ANIMATION_TIME);
|
|
77
77
|
}
|
|
78
78
|
|
|
79
|
-
addAlert(message, type, timeout = this.defaultTimeout,
|
|
79
|
+
addAlert(message, type, timeout = this.defaultTimeout, options = {}) {
|
|
80
|
+
const {onCloseRequest, onClose, ...restOptions} = options;
|
|
80
81
|
const sameAlert = this.findSameAlert(message, type);
|
|
81
82
|
if (sameAlert) {
|
|
82
83
|
sameAlert.isShaking = true;
|
|
@@ -91,8 +92,14 @@ class AlertService {
|
|
|
91
92
|
type,
|
|
92
93
|
timeout,
|
|
93
94
|
isClosing: false,
|
|
94
|
-
onCloseRequest: () =>
|
|
95
|
-
|
|
95
|
+
onCloseRequest: () => {
|
|
96
|
+
onCloseRequest && onCloseRequest();
|
|
97
|
+
this.startAlertClosing(alert);
|
|
98
|
+
},
|
|
99
|
+
onClose: () => {
|
|
100
|
+
onClose && onClose();
|
|
101
|
+
this.removeWithoutAnimation(alert.key);
|
|
102
|
+
},
|
|
96
103
|
...restOptions
|
|
97
104
|
};
|
|
98
105
|
|
|
@@ -203,7 +203,8 @@ describe('Auth', () => {
|
|
|
203
203
|
redirectUri: 'http://localhost:8080/hub',
|
|
204
204
|
clientId: '1-1-1-1-1',
|
|
205
205
|
scope: ['0-0-0-0-0', 'youtrack'],
|
|
206
|
-
optionalScopes: ['youtrack']
|
|
206
|
+
optionalScopes: ['youtrack'],
|
|
207
|
+
waitForRedirectTimeout: 0
|
|
207
208
|
});
|
|
208
209
|
try {
|
|
209
210
|
await auth.init();
|
|
@@ -226,7 +227,8 @@ describe('Auth', () => {
|
|
|
226
227
|
auth = new Auth({
|
|
227
228
|
serverUri: '',
|
|
228
229
|
redirect: true,
|
|
229
|
-
cleanHash: true
|
|
230
|
+
cleanHash: true,
|
|
231
|
+
waitForRedirectTimeout: 0
|
|
230
232
|
});
|
|
231
233
|
|
|
232
234
|
try {
|
|
@@ -245,7 +247,8 @@ describe('Auth', () => {
|
|
|
245
247
|
auth = new Auth({
|
|
246
248
|
serverUri: '',
|
|
247
249
|
redirect: true,
|
|
248
|
-
cleanHash: true
|
|
250
|
+
cleanHash: true,
|
|
251
|
+
waitForRedirectTimeout: 0
|
|
249
252
|
});
|
|
250
253
|
|
|
251
254
|
try {
|
|
@@ -265,7 +268,8 @@ describe('Auth', () => {
|
|
|
265
268
|
auth = new Auth({
|
|
266
269
|
serverUri: '',
|
|
267
270
|
redirect: true,
|
|
268
|
-
cleanHash: false
|
|
271
|
+
cleanHash: false,
|
|
272
|
+
waitForRedirectTimeout: 0
|
|
269
273
|
});
|
|
270
274
|
|
|
271
275
|
try {
|
|
@@ -284,7 +288,8 @@ describe('Auth', () => {
|
|
|
284
288
|
serverUri: '',
|
|
285
289
|
redirect: true,
|
|
286
290
|
redirectUri: 'http://localhost:8080/hub',
|
|
287
|
-
requestCredentials: 'skip'
|
|
291
|
+
requestCredentials: 'skip',
|
|
292
|
+
waitForRedirectTimeout: 0
|
|
288
293
|
});
|
|
289
294
|
try {
|
|
290
295
|
await auth.init();
|
|
@@ -313,7 +318,8 @@ describe('Auth', () => {
|
|
|
313
318
|
redirectUri: 'http://localhost:8080/hub',
|
|
314
319
|
clientId: '1-1-1-1-1',
|
|
315
320
|
scope: ['0-0-0-0-0', 'youtrack'],
|
|
316
|
-
optionalScopes: ['youtrack']
|
|
321
|
+
optionalScopes: ['youtrack'],
|
|
322
|
+
waitForRedirectTimeout: 0
|
|
317
323
|
});
|
|
318
324
|
|
|
319
325
|
auth._storage._tokenStorage = auth._storage._stateStorage =
|
|
@@ -330,7 +336,8 @@ describe('Auth', () => {
|
|
|
330
336
|
auth._storage.saveToken({
|
|
331
337
|
accessToken: 'token',
|
|
332
338
|
expires: TokenValidator._epoch() + HOUR,
|
|
333
|
-
scopes: ['0-0-0-0-0']
|
|
339
|
+
scopes: ['0-0-0-0-0'],
|
|
340
|
+
waitForRedirectTimeout: 0
|
|
334
341
|
});
|
|
335
342
|
});
|
|
336
343
|
|
|
@@ -14,6 +14,7 @@ export const DEFAULT_EXPIRES_TIMEOUT = 40 * 60;
|
|
|
14
14
|
export const DEFAULT_BACKGROUND_TIMEOUT = 10 * 1000;
|
|
15
15
|
const DEFAULT_BACKEND_CHECK_TIMEOUT = 10 * 1000;
|
|
16
16
|
const BACKGROUND_REDIRECT_TIMEOUT = 20 * 1000;
|
|
17
|
+
const DEFAULT_WAIT_FOR_REDIRECT_TIMEOUT = 5 * 1000;
|
|
17
18
|
/* eslint-enable no-magic-numbers */
|
|
18
19
|
|
|
19
20
|
export const USER_CHANGED_EVENT = 'userChange';
|
|
@@ -46,6 +47,7 @@ const DEFAULT_CONFIG = {
|
|
|
46
47
|
onBackendDown: () => {},
|
|
47
48
|
|
|
48
49
|
defaultExpiresIn: DEFAULT_EXPIRES_TIMEOUT,
|
|
50
|
+
waitForRedirectTimeout: DEFAULT_WAIT_FOR_REDIRECT_TIMEOUT,
|
|
49
51
|
translations: {
|
|
50
52
|
login: 'Log in',
|
|
51
53
|
loginTo: 'Log in to %serviceName%',
|
|
@@ -231,7 +233,7 @@ export default class Auth {
|
|
|
231
233
|
* that should be restored after returning back from auth server.
|
|
232
234
|
*/
|
|
233
235
|
async init() {
|
|
234
|
-
this._storage.onTokenChange(token => {
|
|
236
|
+
this._storage.onTokenChange(async token => {
|
|
235
237
|
const isGuest = this.user ? this.user.guest : false;
|
|
236
238
|
|
|
237
239
|
if (isGuest && !token) {
|
|
@@ -241,7 +243,13 @@ export default class Auth {
|
|
|
241
243
|
if (!token) {
|
|
242
244
|
this.logout();
|
|
243
245
|
} else {
|
|
244
|
-
|
|
246
|
+
try {
|
|
247
|
+
await this._detectUserChange(token.accessToken);
|
|
248
|
+
} catch (error) {
|
|
249
|
+
if (this._canShowDialogs()) {
|
|
250
|
+
this._showAuthDialog({nonInteractive: true, error});
|
|
251
|
+
}
|
|
252
|
+
}
|
|
245
253
|
}
|
|
246
254
|
});
|
|
247
255
|
|
|
@@ -305,6 +313,11 @@ export default class Auth {
|
|
|
305
313
|
const authRequest = await this._requestBuilder.prepareAuthRequest();
|
|
306
314
|
this._redirectCurrentPage(authRequest.url);
|
|
307
315
|
|
|
316
|
+
// HUB-10867 Since we already redirecting the page, there is no actual need to throw an error
|
|
317
|
+
// and scare user with flashing error
|
|
318
|
+
// But let's keep it just in case redirect was not successful
|
|
319
|
+
await new Promise(resolve => setTimeout(resolve, this.config.waitForRedirectTimeout));
|
|
320
|
+
|
|
308
321
|
throw error;
|
|
309
322
|
}
|
|
310
323
|
|
|
@@ -466,35 +479,31 @@ export default class Auth {
|
|
|
466
479
|
async _detectUserChange(accessToken) {
|
|
467
480
|
const windowWasOpen = this._isLoginWindowOpen;
|
|
468
481
|
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
};
|
|
482
|
+
const user = await this.getUser(accessToken);
|
|
483
|
+
const onApply = () => {
|
|
484
|
+
this.user = user;
|
|
485
|
+
this.listeners.trigger(USER_CHANGED_EVENT, user);
|
|
486
|
+
};
|
|
475
487
|
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
488
|
+
if (user && this.user && this.user.id !== user.id) {
|
|
489
|
+
if (!this._canShowDialogs() || this.user.guest || windowWasOpen) {
|
|
490
|
+
onApply();
|
|
491
|
+
return;
|
|
492
|
+
}
|
|
493
|
+
if (user.guest) {
|
|
494
|
+
this._showAuthDialog({nonInteractive: true});
|
|
495
|
+
return;
|
|
496
|
+
}
|
|
485
497
|
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
498
|
+
await this._showUserChangedDialog({
|
|
499
|
+
newUser: user,
|
|
500
|
+
onApply,
|
|
501
|
+
onPostpone: () => {
|
|
502
|
+
this.listeners.trigger(USER_CHANGE_POSTPONED_EVENT);
|
|
503
|
+
this.config.onPostponeChangedUser(this.user, user);
|
|
504
|
+
}
|
|
505
|
+
});
|
|
494
506
|
|
|
495
|
-
}
|
|
496
|
-
} catch (e) {
|
|
497
|
-
// noop
|
|
498
507
|
}
|
|
499
508
|
}
|
|
500
509
|
|
|
@@ -554,7 +563,7 @@ export default class Auth {
|
|
|
554
563
|
loginToCaption: translations.loginTo,
|
|
555
564
|
confirmLabel: translations.login,
|
|
556
565
|
cancelLabel: cancelable ? translations.cancel : translations.postpone,
|
|
557
|
-
errorMessage: error
|
|
566
|
+
errorMessage: this._extractErrorMessage(error, true),
|
|
558
567
|
onConfirm,
|
|
559
568
|
onCancel
|
|
560
569
|
});
|
|
@@ -601,6 +610,29 @@ export default class Auth {
|
|
|
601
610
|
});
|
|
602
611
|
}
|
|
603
612
|
|
|
613
|
+
_extractErrorMessage(error, logError = false) {
|
|
614
|
+
if (!error) {
|
|
615
|
+
return null;
|
|
616
|
+
}
|
|
617
|
+
if (logError) {
|
|
618
|
+
// eslint-disable-next-line no-console
|
|
619
|
+
console.error('RingUI Auth error', error);
|
|
620
|
+
}
|
|
621
|
+
|
|
622
|
+
try {
|
|
623
|
+
// We've got some error from this list
|
|
624
|
+
// https://www.jetbrains.com/help/youtrack/devportal/OAuth-2.0-Errors.html
|
|
625
|
+
if (error.code && typeof error.code.code === 'string') {
|
|
626
|
+
const readableCode = error.code.code.split('_').join(' ');
|
|
627
|
+
return `Authorization error: ${readableCode}`;
|
|
628
|
+
}
|
|
629
|
+
} catch {
|
|
630
|
+
// noop
|
|
631
|
+
}
|
|
632
|
+
|
|
633
|
+
return error.toString ? error.toString() : null;
|
|
634
|
+
}
|
|
635
|
+
|
|
604
636
|
_showBackendDownDialog(backendError) {
|
|
605
637
|
const {onBackendDown, translations} = this.config;
|
|
606
638
|
const REPEAT_TIMEOUT = 5000;
|
|
@@ -711,11 +743,10 @@ export default class Auth {
|
|
|
711
743
|
}
|
|
712
744
|
|
|
713
745
|
async switchUser() {
|
|
714
|
-
if (this.config.embeddedLogin) {
|
|
715
|
-
|
|
746
|
+
if (!this.config.embeddedLogin) {
|
|
747
|
+
throw new Error('Auth: switchUser only supported for "embeddedLogin" mode');
|
|
716
748
|
}
|
|
717
|
-
|
|
718
|
-
throw new Error('Auth: switchUser only supported for "embeddedLogin" mode');
|
|
749
|
+
await this._runEmbeddedLogin();
|
|
719
750
|
}
|
|
720
751
|
|
|
721
752
|
/**
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
@import "../global/variables.css";
|
|
2
2
|
|
|
3
3
|
.avatar {
|
|
4
|
+
display: inline-block;
|
|
4
5
|
object-fit: cover;
|
|
5
6
|
object-position: center;
|
|
6
7
|
|
|
7
|
-
|
|
8
|
+
/* This is a "graceful degradation" fallback, while the real value is controlled by JS */
|
|
9
|
+
|
|
10
|
+
border-radius: var(--ring-border-radius);
|
|
8
11
|
}
|
|
9
12
|
|
|
10
13
|
.subavatar {
|
|
@@ -21,7 +21,8 @@ export const avatar = () => {
|
|
|
21
21
|
{Object.keys(Size).map(size => (
|
|
22
22
|
<div className="avatar-demo" key={size}>
|
|
23
23
|
<Avatar size={Size[size]} url={avatarDataUri}/>
|
|
24
|
-
<Avatar size={Size[size]}
|
|
24
|
+
<Avatar size={Size[size]} username="Jet Brains"/>
|
|
25
|
+
<Avatar size={Size[size]} username="Jet Brains" round/>
|
|
25
26
|
<Avatar size={Size[size]}/>
|
|
26
27
|
</div>
|
|
27
28
|
))}
|
|
@@ -38,7 +39,7 @@ avatar.parameters = {
|
|
|
38
39
|
.avatar-demo {
|
|
39
40
|
display: flex;
|
|
40
41
|
justify-content: space-between;
|
|
41
|
-
width:
|
|
42
|
+
width: 240px;
|
|
42
43
|
margin-bottom: 16px;
|
|
43
44
|
}
|
|
44
45
|
</style>`
|
|
@@ -6,6 +6,7 @@ import {encodeURL, isDataURI, parseQueryString} from '../global/url';
|
|
|
6
6
|
import {getPixelRatio} from '../global/dom';
|
|
7
7
|
|
|
8
8
|
import styles from './avatar.css';
|
|
9
|
+
import FallbackAvatar from './fallback-avatar';
|
|
9
10
|
|
|
10
11
|
/**
|
|
11
12
|
* @name Avatar
|
|
@@ -15,6 +16,7 @@ export const Size = {
|
|
|
15
16
|
Size18: 18,
|
|
16
17
|
Size20: 20,
|
|
17
18
|
Size24: 24,
|
|
19
|
+
Size28: 28,
|
|
18
20
|
Size32: 32,
|
|
19
21
|
Size40: 40,
|
|
20
22
|
Size48: 48,
|
|
@@ -30,7 +32,9 @@ export default class Avatar extends PureComponent {
|
|
|
30
32
|
url: PropTypes.string,
|
|
31
33
|
round: PropTypes.bool,
|
|
32
34
|
subavatar: PropTypes.string,
|
|
33
|
-
subavatarSize: PropTypes.number
|
|
35
|
+
subavatarSize: PropTypes.number,
|
|
36
|
+
username: PropTypes.string,
|
|
37
|
+
skipParams: PropTypes.bool
|
|
34
38
|
};
|
|
35
39
|
|
|
36
40
|
static defaultProps = {
|
|
@@ -53,7 +57,18 @@ export default class Avatar extends PureComponent {
|
|
|
53
57
|
};
|
|
54
58
|
|
|
55
59
|
render() {
|
|
56
|
-
const {
|
|
60
|
+
const {
|
|
61
|
+
size,
|
|
62
|
+
url,
|
|
63
|
+
dpr,
|
|
64
|
+
style,
|
|
65
|
+
round,
|
|
66
|
+
subavatar,
|
|
67
|
+
subavatarSize,
|
|
68
|
+
username,
|
|
69
|
+
skipParams,
|
|
70
|
+
...restProps
|
|
71
|
+
} = this.props;
|
|
57
72
|
const sizeString = `${size}px`;
|
|
58
73
|
const subavatarSizeString = `${subavatarSize}px`;
|
|
59
74
|
const borderRadius = size <= Size.Size18 ? 'var(--ring-border-radius-small)' : 'var(--ring-border-radius)';
|
|
@@ -76,14 +91,24 @@ export default class Avatar extends PureComponent {
|
|
|
76
91
|
<span
|
|
77
92
|
{...restProps}
|
|
78
93
|
data-test="avatar"
|
|
79
|
-
className={
|
|
94
|
+
className={
|
|
95
|
+
classNames(styles.avatar, this.props.className, {[styles.empty]: username == null})
|
|
96
|
+
}
|
|
80
97
|
style={styleObj}
|
|
81
|
-
|
|
98
|
+
>{
|
|
99
|
+
username != null && (
|
|
100
|
+
<FallbackAvatar
|
|
101
|
+
size={size}
|
|
102
|
+
round={round}
|
|
103
|
+
username={username}
|
|
104
|
+
/>
|
|
105
|
+
)
|
|
106
|
+
}</span>
|
|
82
107
|
);
|
|
83
108
|
}
|
|
84
109
|
|
|
85
110
|
let src = url;
|
|
86
|
-
if (!isDataURI(url)) {
|
|
111
|
+
if (!skipParams && !isDataURI(url)) {
|
|
87
112
|
const [urlStart, query] = url.split('?');
|
|
88
113
|
const queryParams = {
|
|
89
114
|
...parseQueryString(query),
|
|
@@ -102,7 +127,7 @@ export default class Avatar extends PureComponent {
|
|
|
102
127
|
subavatarSizeString
|
|
103
128
|
};
|
|
104
129
|
|
|
105
|
-
subavatarSrc = encodeURL(urlStart, queryParams);
|
|
130
|
+
subavatarSrc = skipParams ? subavatar : encodeURL(urlStart, queryParams);
|
|
106
131
|
return (
|
|
107
132
|
<div>
|
|
108
133
|
<img
|