@plesk/ui-library 3.27.2 → 3.28.0

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.
Files changed (71) hide show
  1. package/cjs/components/Dialog/Dialog.js +11 -2
  2. package/cjs/components/Form/Form.js +4 -2
  3. package/cjs/components/FormFieldPassword/FormFieldPassword.js +25 -239
  4. package/cjs/components/FormFieldPassword/PasswordMeter.js +81 -0
  5. package/cjs/components/FormFieldPassword/estimatePassword.js +212 -0
  6. package/cjs/components/FormFieldPassword/generatePassword.js +21 -0
  7. package/cjs/components/FormFieldPassword/index.js +5 -5
  8. package/cjs/components/Icon/constants.js +2 -2
  9. package/cjs/components/Icon/images/symbols.svg +9 -1
  10. package/cjs/components/ProgressDialog/ProgressDialog.js +2 -1
  11. package/cjs/components/Skeleton/Skeleton.js +49 -0
  12. package/cjs/components/Skeleton/Skeleton.stories.js +26 -0
  13. package/cjs/components/Skeleton/SkeletonTabs.js +41 -0
  14. package/cjs/components/Skeleton/SkeletonTabs.stories.js +17 -0
  15. package/cjs/components/Skeleton/SkeletonText.js +45 -0
  16. package/cjs/components/Skeleton/SkeletonText.stories.js +35 -0
  17. package/cjs/components/Skeleton/index.js +31 -0
  18. package/cjs/components/index.js +22 -1
  19. package/cjs/components/utils.js +6 -2
  20. package/cjs/index.js +1 -1
  21. package/dist/images/symbols.svg +9 -1
  22. package/dist/plesk-ui-library-rtl.css +1 -1
  23. package/dist/plesk-ui-library-rtl.css.map +1 -1
  24. package/dist/plesk-ui-library.css +1 -1
  25. package/dist/plesk-ui-library.css.map +1 -1
  26. package/dist/plesk-ui-library.js +607 -339
  27. package/dist/plesk-ui-library.js.map +1 -1
  28. package/dist/plesk-ui-library.min.js +5 -5
  29. package/dist/plesk-ui-library.min.js.map +1 -1
  30. package/esm/components/Dialog/Dialog.js +11 -2
  31. package/esm/components/Form/Form.js +4 -2
  32. package/esm/components/FormFieldPassword/FormFieldPassword.js +23 -232
  33. package/esm/components/FormFieldPassword/PasswordMeter.js +61 -0
  34. package/esm/components/FormFieldPassword/estimatePassword.js +196 -0
  35. package/esm/components/FormFieldPassword/generatePassword.js +14 -0
  36. package/esm/components/FormFieldPassword/index.js +3 -2
  37. package/esm/components/Icon/constants.js +2 -2
  38. package/esm/components/Icon/images/symbols.svg +9 -1
  39. package/esm/components/ProgressDialog/ProgressDialog.js +2 -1
  40. package/esm/components/Skeleton/Skeleton.js +34 -0
  41. package/esm/components/Skeleton/Skeleton.stories.js +10 -0
  42. package/esm/components/Skeleton/SkeletonTabs.js +26 -0
  43. package/esm/components/Skeleton/SkeletonTabs.stories.js +4 -0
  44. package/esm/components/Skeleton/SkeletonText.js +30 -0
  45. package/esm/components/Skeleton/SkeletonText.stories.js +16 -0
  46. package/esm/components/Skeleton/index.js +4 -0
  47. package/esm/components/index.js +3 -1
  48. package/esm/components/utils.js +2 -1
  49. package/esm/index.js +1 -1
  50. package/package.json +3 -3
  51. package/styleguide/build/bundle.24d5b0eb.js +2 -0
  52. package/styleguide/build/{bundle.1c9c8500.js.LICENSE.txt → bundle.24d5b0eb.js.LICENSE.txt} +0 -0
  53. package/styleguide/images/symbols.svg +9 -1
  54. package/styleguide/index.html +2 -2
  55. package/types/src/components/FormFieldPassword/FormFieldPassword.d.ts +91 -0
  56. package/types/src/components/FormFieldPassword/PasswordMeter.d.ts +9 -0
  57. package/types/src/components/FormFieldPassword/estimatePassword.d.ts +13 -0
  58. package/types/src/components/FormFieldPassword/index.d.ts +2 -0
  59. package/types/src/components/Icon/constants.d.ts +1 -1
  60. package/types/src/components/Skeleton/Skeleton.d.ts +49 -0
  61. package/types/src/components/Skeleton/Skeleton.stories.d.ts +12 -0
  62. package/types/src/components/Skeleton/SkeletonTabs.d.ts +23 -0
  63. package/types/src/components/Skeleton/SkeletonTabs.stories.d.ts +6 -0
  64. package/types/src/components/Skeleton/SkeletonText.d.ts +34 -0
  65. package/types/src/components/Skeleton/SkeletonText.stories.d.ts +38 -0
  66. package/types/src/components/Skeleton/index.d.ts +3 -0
  67. package/types/src/components/index.d.ts +2 -0
  68. package/types/src/components/utils.d.ts +1 -0
  69. package/cjs/components/FormFieldPassword/passwordScore.js +0 -132
  70. package/esm/components/FormFieldPassword/passwordScore.js +0 -123
  71. package/styleguide/build/bundle.1c9c8500.js +0 -2
@@ -65,6 +65,7 @@ const Dialog = ({
65
65
  closable,
66
66
  onClose,
67
67
  closingConfirmation,
68
+ canClose,
68
69
  ...props
69
70
  }) => {
70
71
  const [isVisible, setIsVisible] = (0, _react.useState)(isOpen);
@@ -175,8 +176,8 @@ const Dialog = ({
175
176
  className: (0, _classnames.default)(baseClassName, className),
176
177
  isOpen: isVisible,
177
178
  onClose: onCloseWithConfirmation,
178
- canCloseOnBackdropClick: closable,
179
- canCloseOnEscapePress: closable,
179
+ canCloseOnBackdropClick: canClose && closable,
180
+ canCloseOnEscapePress: canClose && closable,
180
181
  size: size
181
182
  }, props), (title || subtitle || actions) && /*#__PURE__*/_react.default.createElement("header", {
182
183
  className: `${baseClassName}__header`
@@ -199,6 +200,7 @@ const Dialog = ({
199
200
  className: `${baseClassName}__header-actions`
200
201
  }, actions, closable && /*#__PURE__*/_react.default.createElement(_Button.default, {
201
202
  className: `${baseClassName}__header-close`,
203
+ disabled: !canClose,
202
204
  ghost: true,
203
205
  size: "lg",
204
206
  icon: "cross-mark",
@@ -304,6 +306,12 @@ Dialog.propTypes = {
304
306
  */
305
307
  closable: _propTypes.default.bool,
306
308
 
309
+ /**
310
+ * Disable close dialog button
311
+ * @since 4.0.0
312
+ */
313
+ canClose: _propTypes.default.bool,
314
+
307
315
  /**
308
316
  * On close event handler. Called immediately after dialog closed by "cancel" button or "Esc" key.
309
317
  * @since 0.0.68
@@ -347,6 +355,7 @@ Dialog.defaultProps = {
347
355
  form: undefined,
348
356
  size: 'md',
349
357
  closable: true,
358
+ canClose: true,
350
359
  onClose: undefined,
351
360
  closingConfirmation: undefined,
352
361
  children: undefined,
@@ -267,9 +267,11 @@ class Form extends _react.Component {
267
267
  let field;
268
268
  let fieldErrors;
269
269
  Object.keys(this.fields).every(name => {
270
- if (errors && errors[name] && typeof errors[name] === 'object' && Object.keys(errors[name]).length > 0) {
270
+ const foundError = (0, _utils.getIn)(errors, name);
271
+
272
+ if (foundError && typeof foundError === 'object' && Object.keys(foundError).length > 0) {
271
273
  field = this.fields[name];
272
- fieldErrors = errors[name];
274
+ fieldErrors = foundError;
273
275
  return false;
274
276
  }
275
277
 
@@ -5,7 +5,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
- exports.generatePassword = exports.default = void 0;
8
+ exports.default = void 0;
9
9
 
10
10
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
11
11
 
@@ -13,8 +13,6 @@ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/de
13
13
 
14
14
  var _react = _interopRequireWildcard(require("react"));
15
15
 
16
- var _propTypes = _interopRequireDefault(require("prop-types"));
17
-
18
16
  var _classnames = _interopRequireDefault(require("classnames"));
19
17
 
20
18
  var _constants = require("../../constants");
@@ -25,11 +23,11 @@ var _FormField = _interopRequireDefault(require("../FormField"));
25
23
 
26
24
  var _Input = _interopRequireDefault(require("../Input"));
27
25
 
28
- var _Popover = _interopRequireDefault(require("../Popover"));
29
-
30
26
  var _Translate = _interopRequireDefault(require("../Translate"));
31
27
 
32
- var _passwordScore = _interopRequireWildcard(require("./passwordScore"));
28
+ var _PasswordMeter = _interopRequireDefault(require("./PasswordMeter"));
29
+
30
+ var _generatePassword = _interopRequireDefault(require("./generatePassword"));
33
31
 
34
32
  var _enUS = _interopRequireDefault(require("./locale/en-US"));
35
33
 
@@ -37,40 +35,19 @@ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "functio
37
35
 
38
36
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
39
37
 
40
- // Copyright 1999-2021. Plesk International GmbH. All rights reserved.
41
- const symbolClasses = {
42
- upper: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
43
- lower: 'abcdefghijklmnopqrstuvwxyz',
44
- number: '0123456789',
45
- special: '!@#$%^&*?_~'
46
- };
38
+ // Copyright 1999-2022. Plesk International GmbH. All rights reserved.
47
39
 
48
- const generatePassword = () => {
49
- const password = ['upper', 'lower', 'lower', 'lower', 'number', 'number', 'special', 'number', 'upper', 'upper', 'lower', 'lower', 'lower', 'lower', 'lower', 'lower'];
50
- return password.sort((a, b) => Math.floor(b.length * Math.random()) - Math.floor(a.length * Math.random())).map(symbolClass => symbolClasses[symbolClass][Math.floor(symbolClasses[symbolClass].length * Math.random())]).join('');
51
- };
52
40
  /**
53
41
  * `FormFieldPassword` component provides secure way to enter a password.
54
42
  * @since 0.0.58
55
43
  */
56
-
57
-
58
- exports.generatePassword = generatePassword;
59
-
60
44
  class FormFieldPassword extends _react.Component {
61
45
  constructor(...args) {
62
46
  super(...args);
63
47
  (0, _defineProperty2.default)(this, "state", {
64
48
  visible: false,
65
- passwordMeterVisible: false,
66
- scoreResult: {
67
- password: null,
68
- intent: null,
69
- strength: null,
70
- unusedRules: []
71
- }
49
+ passwordMeterVisible: false
72
50
  });
73
- (0, _defineProperty2.default)(this, "passwordOnScoring", null);
74
51
  (0, _defineProperty2.default)(this, "targetRef", /*#__PURE__*/(0, _react.createRef)());
75
52
  (0, _defineProperty2.default)(this, "handleToggleClick", () => {
76
53
  this.setState(({
@@ -87,135 +64,6 @@ class FormFieldPassword extends _react.Component {
87
64
  (0, _defineProperty2.default)(this, "handleBlur", this.handleClosePasswordMeter);
88
65
  }
89
66
 
90
- async passwordScore(value) {
91
- if (!value) {
92
- return {
93
- password: null,
94
- intent: null,
95
- strength: null,
96
- unusedRules: []
97
- };
98
- }
99
-
100
- const {
101
- passwordScoreRules
102
- } = this.props;
103
- const {
104
- password,
105
- score,
106
- unusedRules
107
- } = await (0, _passwordScore.default)(value, passwordScoreRules);
108
- let intent = 'success';
109
-
110
- let strength = /*#__PURE__*/_react.default.createElement(_Translate.default, {
111
- content: "FormFieldPassword.strengthVeryStrong",
112
- fallback: _enUS.default.strengthVeryStrong
113
- });
114
-
115
- if (score < 16) {
116
- intent = 'danger';
117
- strength = /*#__PURE__*/_react.default.createElement(_Translate.default, {
118
- content: "FormFieldPassword.strengthVeryWeak",
119
- fallback: _enUS.default.strengthVeryWeak
120
- });
121
- } else if (score < 25) {
122
- intent = 'danger';
123
- strength = /*#__PURE__*/_react.default.createElement(_Translate.default, {
124
- content: "FormFieldPassword.strengthWeak",
125
- fallback: _enUS.default.strengthWeak
126
- });
127
- } else if (score < 35) {
128
- intent = 'warning';
129
- strength = /*#__PURE__*/_react.default.createElement(_Translate.default, {
130
- content: "FormFieldPassword.strengthMedium",
131
- fallback: _enUS.default.strengthMedium
132
- });
133
- } else if (score < 45) {
134
- intent = 'success';
135
- strength = /*#__PURE__*/_react.default.createElement(_Translate.default, {
136
- content: "FormFieldPassword.strengthStrong",
137
- fallback: _enUS.default.strengthStrong
138
- });
139
- }
140
-
141
- return {
142
- password,
143
- intent,
144
- strength,
145
- unusedRules
146
- };
147
- }
148
-
149
- renderPasswordMeter(value, target) {
150
- const {
151
- passwordMeterVisible
152
- } = this.state;
153
- const {
154
- passwordMeterProps
155
- } = this.props;
156
- const {
157
- password,
158
- intent,
159
- strength,
160
- unusedRules
161
- } = this.state.scoreResult;
162
-
163
- if (!!value && value !== password && value !== this.passwordOnScoring) {
164
- this.passwordOnScoring = value;
165
- this.passwordScore(value).then(scoreResult => {
166
- if (this.passwordOnScoring === scoreResult.password) {
167
- this.passwordOnScoring = null;
168
- this.setState({
169
- scoreResult
170
- });
171
- }
172
- });
173
- }
174
-
175
- return /*#__PURE__*/_react.default.createElement(_Popover.default, (0, _extends2.default)({
176
- visible: passwordMeterVisible && !!value,
177
- target: target,
178
- targetRef: this.targetRef,
179
- placement: "bottom-right",
180
- intent: intent,
181
- canCloseOnOutsideClick: false,
182
- canCloseOnEscapePress: false,
183
- onClose: this.handleClosePasswordMeter
184
- }, passwordMeterProps), /*#__PURE__*/_react.default.createElement(_Translate.default, {
185
- content: "FormFieldPassword.passwordStrength",
186
- fallback: _enUS.default.passwordStrength,
187
- params: {
188
- strength: /*#__PURE__*/_react.default.createElement("b", null, strength)
189
- }
190
- }), /*#__PURE__*/_react.default.createElement("br", null), unusedRules.length ? /*#__PURE__*/_react.default.createElement(_react.Fragment, null, /*#__PURE__*/_react.default.createElement(_Translate.default, {
191
- content: "FormFieldPassword.improvePassword",
192
- fallback: _enUS.default.improvePassword
193
- }), /*#__PURE__*/_react.default.createElement("br", null), /*#__PURE__*/_react.default.createElement("ul", null, unusedRules.slice(0, 3).map(({
194
- rule
195
- }, index) => {
196
- const {
197
- name
198
- } = rule;
199
- let {
200
- message
201
- } = rule;
202
-
203
- if (name && !message) {
204
- message = /*#__PURE__*/_react.default.createElement(_Translate.default, {
205
- content: `FormFieldPassword.${name}`,
206
- fallback: _enUS.default[name]
207
- });
208
- }
209
-
210
- return /*#__PURE__*/_react.default.createElement("li", {
211
- key: name || index.toString()
212
- }, message);
213
- }))) : /*#__PURE__*/_react.default.createElement(_Translate.default, {
214
- content: "FormFieldPassword.yourPasswordIsStrong",
215
- fallback: _enUS.default.yourPasswordIsStrong
216
- }));
217
- }
218
-
219
67
  renderGenerateButton({
220
68
  setValue,
221
69
  isDisabled
@@ -226,7 +74,7 @@ class FormFieldPassword extends _react.Component {
226
74
  } = this.props;
227
75
  const generateButtonProps = {
228
76
  className: `${baseClassName}__button--generate`,
229
- onClick: () => setValue(generatePassword()),
77
+ onClick: () => setValue((0, _generatePassword.default)()),
230
78
  tooltip: /*#__PURE__*/_react.default.createElement(_Translate.default, {
231
79
  content: "FormFieldPassword.generateButtonHint",
232
80
  fallback: _enUS.default.generateButtonHint
@@ -257,12 +105,15 @@ class FormFieldPassword extends _react.Component {
257
105
  hideGenerateButton,
258
106
  hidePasswordMeter,
259
107
  passwordMeterProps,
260
- passwordScoreRules,
261
108
  size,
262
109
  autoFocus,
263
110
  autoComplete,
264
111
  ...props
265
112
  } = this.props;
113
+ const {
114
+ visible,
115
+ passwordMeterVisible
116
+ } = this.state;
266
117
  return /*#__PURE__*/_react.default.createElement(_FormField.default, (0, _extends2.default)({
267
118
  className: (0, _classnames.default)(baseClassName, className)
268
119
  }, props), ({
@@ -272,18 +123,19 @@ class FormFieldPassword extends _react.Component {
272
123
  setValue,
273
124
  isDisabled
274
125
  }) => {
126
+ const value = getValue('');
127
+
275
128
  const input = /*#__PURE__*/_react.default.createElement(_Input.default, {
276
129
  id: getId(),
277
130
  name: getName(),
278
- type: this.state.visible ? 'text' : 'password',
279
- value: getValue(''),
131
+ type: visible ? 'text' : 'password',
132
+ value: value,
280
133
  onChange: e => {
281
134
  setValue(e.target.value);
282
135
  this.setState({
283
136
  passwordMeterVisible: true
284
137
  });
285
138
  },
286
- onFocus: this.handleFocus,
287
139
  onBlur: this.handleBlur,
288
140
  autoFocus: autoFocus,
289
141
  autoComplete: autoComplete,
@@ -292,8 +144,8 @@ class FormFieldPassword extends _react.Component {
292
144
  suffix: hideShowButton ? null : /*#__PURE__*/_react.default.createElement(_Button.default, {
293
145
  className: `${baseClassName}__button--show`,
294
146
  onClick: this.handleToggleClick,
295
- icon: this.state.visible ? 'visible' : 'invisible',
296
- tooltip: this.state.visible ? /*#__PURE__*/_react.default.createElement(_Translate.default, {
147
+ icon: visible ? 'visible' : 'invisible',
148
+ tooltip: visible ? /*#__PURE__*/_react.default.createElement(_Translate.default, {
297
149
  content: "FormFieldPassword.hidePassword",
298
150
  fallback: _enUS.default.hidePassword
299
151
  }) : /*#__PURE__*/_react.default.createElement(_Translate.default, {
@@ -313,7 +165,12 @@ class FormFieldPassword extends _react.Component {
313
165
  className: (0, _classnames.default)(`${baseClassName}__control`, `${baseClassName}__control--${size}`)
314
166
  }, /*#__PURE__*/_react.default.createElement("div", {
315
167
  className: (0, _classnames.default)(`${baseClassName}__field`, `${baseClassName}__field--${size}`)
316
- }, hidePasswordMeter ? input : this.renderPasswordMeter(getValue(), input)), hideGenerateButton ? null : this.renderGenerateButton({
168
+ }, hidePasswordMeter ? input : /*#__PURE__*/_react.default.createElement(_PasswordMeter.default, (0, _extends2.default)({
169
+ value: value,
170
+ targetRef: this.targetRef,
171
+ visible: passwordMeterVisible && value !== '',
172
+ onClose: this.handleClosePasswordMeter
173
+ }, passwordMeterProps), input)), hideGenerateButton ? null : this.renderGenerateButton({
317
174
  setValue,
318
175
  isDisabled
319
176
  }));
@@ -322,88 +179,17 @@ class FormFieldPassword extends _react.Component {
322
179
 
323
180
  }
324
181
 
325
- FormFieldPassword.propTypes = {
326
- /**
327
- * Is show button hidden?
328
- * @since 0.0.59
329
- */
330
- hideShowButton: _propTypes.default.bool,
331
-
332
- /**
333
- * Is generate button hidden?
334
- * @since 0.0.59
335
- */
336
- hideGenerateButton: _propTypes.default.bool,
337
-
338
- /**
339
- * Is password meter hidden?
340
- * @since 0.0.59
341
- */
342
- hidePasswordMeter: _propTypes.default.bool,
343
-
344
- /**
345
- * Additional props for password meter. . See [Popover](#!/Popover) for more information.
346
- * @since 1.5.6
347
- */
348
- passwordMeterProps: _propTypes.default.object,
349
-
350
- /**
351
- * A set of custom password score rules.
352
- * @since 3.21.0
353
- */
354
- passwordScoreRules: _propTypes.default.arrayOf(_propTypes.default.shape({
355
- name: _propTypes.default.string,
356
- message: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.element]),
357
- score: _propTypes.default.func.isRequired
358
- })),
359
-
360
- /**
361
- * Size of the control
362
- * @since 1.5.6
363
- */
364
- size: _propTypes.default.oneOf(['md', 'lg', 'xl', 'fill']),
365
-
366
- /**
367
- * The browser will automatically focus on the component upon rendering the screen
368
- * @since 1.9.0
369
- */
370
- autoFocus: _propTypes.default.bool,
371
-
372
- /**
373
- * Prevent password autocompletion.
374
- * @since 2.5.1
375
- */
376
- autoComplete: _propTypes.default.oneOf(['new-password']),
377
-
378
- /**
379
- * A render function for customizing the password generation button.
380
- * @since 3.13.0
381
- */
382
- generateButton: _propTypes.default.func,
383
-
384
- /**
385
- * @ignore
386
- */
387
- className: _propTypes.default.string,
388
-
389
- /**
390
- * @ignore
391
- */
392
- baseClassName: _propTypes.default.string
393
- };
394
- FormFieldPassword.defaultProps = {
182
+ (0, _defineProperty2.default)(FormFieldPassword, "defaultProps", {
395
183
  hideShowButton: false,
396
184
  generateButton: undefined,
397
185
  hideGenerateButton: false,
398
186
  hidePasswordMeter: false,
399
187
  passwordMeterProps: {},
400
- passwordScoreRules: undefined,
401
188
  size: 'md',
402
189
  autoFocus: undefined,
403
190
  autoComplete: undefined,
404
191
  className: undefined,
405
192
  baseClassName: `${_constants.CLS_PREFIX}form-field-password`
406
- };
407
- FormFieldPassword.PASSWORD_SCORE_RULES = _passwordScore.PASSWORD_SCORE_RULES;
193
+ });
408
194
  var _default = FormFieldPassword;
409
195
  exports.default = _default;
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.default = void 0;
9
+
10
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
11
+
12
+ var _react = _interopRequireWildcard(require("react"));
13
+
14
+ var _Popover = _interopRequireDefault(require("../Popover"));
15
+
16
+ var _Translate = _interopRequireDefault(require("../Translate"));
17
+
18
+ var _estimatePassword = _interopRequireWildcard(require("./estimatePassword"));
19
+
20
+ var _enUS = _interopRequireDefault(require("./locale/en-US"));
21
+
22
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
23
+
24
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
25
+
26
+ // Copyright 1999-2022. Plesk International GmbH. All rights reserved.
27
+ const strengthIntents = {
28
+ VeryWeak: 'danger',
29
+ Weak: 'danger',
30
+ Medium: 'warning',
31
+ Strong: 'success',
32
+ VeryStrong: 'success'
33
+ };
34
+
35
+ const PasswordMeter = ({
36
+ value,
37
+ visible,
38
+ onEstimate,
39
+ children,
40
+ ...props
41
+ }) => {
42
+ const [result, setResult] = (0, _react.useState)(null);
43
+ (0, _react.useEffect)(() => {
44
+ if (!visible) {
45
+ return;
46
+ }
47
+
48
+ Promise.resolve(onEstimate ? onEstimate(value, _estimatePassword.default, _estimatePassword.DEFAULT_RULES) : (0, _estimatePassword.default)(value)).then(result => {
49
+ setResult(result);
50
+ });
51
+ }, [visible, value, onEstimate]);
52
+ return /*#__PURE__*/_react.default.createElement(_Popover.default, (0, _extends2.default)({
53
+ visible: visible && result !== null,
54
+ target: children,
55
+ placement: "bottom-right",
56
+ intent: result ? strengthIntents[result.strength] : undefined,
57
+ canCloseOnOutsideClick: false,
58
+ canCloseOnEscapePress: false
59
+ }, props), result !== null && result !== void 0 && result.strength ? /*#__PURE__*/_react.default.createElement(_Translate.default, {
60
+ component: "div",
61
+ content: "FormFieldPassword.passwordStrength",
62
+ fallback: _enUS.default.passwordStrength,
63
+ params: {
64
+ strength: /*#__PURE__*/_react.default.createElement("b", null, /*#__PURE__*/_react.default.createElement(_Translate.default, {
65
+ content: `FormFieldPassword.strength${result === null || result === void 0 ? void 0 : result.strength}`,
66
+ fallback: _enUS.default[`strength${result === null || result === void 0 ? void 0 : result.strength}`]
67
+ }))
68
+ }
69
+ }) : null, result !== null && result !== void 0 && result.suggestions.length ? /*#__PURE__*/_react.default.createElement(_react.Fragment, null, /*#__PURE__*/_react.default.createElement(_Translate.default, {
70
+ content: "FormFieldPassword.improvePassword",
71
+ fallback: _enUS.default.improvePassword
72
+ }), /*#__PURE__*/_react.default.createElement("br", null), /*#__PURE__*/_react.default.createElement("ul", null, result.suggestions.slice(0, 3).map((suggestion, index) => /*#__PURE__*/_react.default.createElement("li", {
73
+ key: index.toString()
74
+ }, suggestion)))) : /*#__PURE__*/_react.default.createElement(_Translate.default, {
75
+ content: "FormFieldPassword.yourPasswordIsStrong",
76
+ fallback: _enUS.default.yourPasswordIsStrong
77
+ }));
78
+ };
79
+
80
+ var _default = PasswordMeter;
81
+ exports.default = _default;