@skbkontur/react-ui-validations 2.3.8 → 2.3.9-55eb8.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 (86) hide show
  1. package/CHANGELOG.md +1105 -0
  2. package/index.d.ts +17 -316
  3. package/index.js +11 -16258
  4. package/index.js.map +1 -1
  5. package/package.json +107 -8
  6. package/src/ErrorRenderer.d.ts +4 -0
  7. package/src/ErrorRenderer.js +20 -0
  8. package/src/ErrorRenderer.js.map +1 -0
  9. package/src/FocusMode.d.ts +5 -0
  10. package/src/FocusMode.js +7 -0
  11. package/src/FocusMode.js.map +1 -0
  12. package/src/ReactUiDetection.d.ts +23 -0
  13. package/src/ReactUiDetection.js +53 -0
  14. package/src/ReactUiDetection.js.map +1 -0
  15. package/src/ValidationContainer.d.ts +33 -0
  16. package/src/ValidationContainer.js +56 -0
  17. package/src/ValidationContainer.js.map +1 -0
  18. package/src/ValidationContextWrapper.d.ts +41 -0
  19. package/src/ValidationContextWrapper.js +156 -0
  20. package/src/ValidationContextWrapper.js.map +1 -0
  21. package/src/ValidationHelper.d.ts +7 -0
  22. package/src/ValidationHelper.js +41 -0
  23. package/src/ValidationHelper.js.map +1 -0
  24. package/src/ValidationText.d.ts +14 -0
  25. package/src/ValidationText.js +29 -0
  26. package/src/ValidationText.js.map +1 -0
  27. package/src/ValidationTooltip.d.ts +14 -0
  28. package/src/ValidationTooltip.js +22 -0
  29. package/src/ValidationTooltip.js.map +1 -0
  30. package/src/ValidationWrapper.d.ts +19 -0
  31. package/src/ValidationWrapper.js +27 -0
  32. package/src/ValidationWrapper.js.map +1 -0
  33. package/src/ValidationWrapperInternal.d.ts +54 -0
  34. package/src/ValidationWrapperInternal.js +230 -0
  35. package/src/ValidationWrapperInternal.js.map +1 -0
  36. package/src/Validations/PathHelper.d.ts +13 -0
  37. package/src/Validations/PathHelper.js +42 -0
  38. package/src/Validations/PathHelper.js.map +1 -0
  39. package/src/Validations/Types.d.ts +12 -0
  40. package/src/Validations/Types.js +2 -0
  41. package/src/Validations/Types.js.map +1 -0
  42. package/src/Validations/ValidationBuilder.d.ts +18 -0
  43. package/src/Validations/ValidationBuilder.js +65 -0
  44. package/src/Validations/ValidationBuilder.js.map +1 -0
  45. package/src/Validations/ValidationReader.d.ts +15 -0
  46. package/src/Validations/ValidationReader.js +37 -0
  47. package/src/Validations/ValidationReader.js.map +1 -0
  48. package/src/Validations/ValidationWriter.d.ts +13 -0
  49. package/src/Validations/ValidationWriter.js +39 -0
  50. package/src/Validations/ValidationWriter.js.map +1 -0
  51. package/src/Validations/index.d.ts +7 -0
  52. package/src/Validations/index.js +18 -0
  53. package/src/Validations/index.js.map +1 -0
  54. package/src/smoothScrollIntoView.d.ts +2 -0
  55. package/src/smoothScrollIntoView.js +166 -0
  56. package/src/smoothScrollIntoView.js.map +1 -0
  57. package/src/utils/createPropsGetter.d.ts +3 -0
  58. package/src/utils/createPropsGetter.js +9 -0
  59. package/src/utils/createPropsGetter.js.map +1 -0
  60. package/src/utils/featureFlagsContext/FeatureFlagsHelpers.d.ts +2 -0
  61. package/src/utils/featureFlagsContext/FeatureFlagsHelpers.js +6 -0
  62. package/src/utils/featureFlagsContext/FeatureFlagsHelpers.js.map +1 -0
  63. package/src/utils/featureFlagsContext/ValidationsFeatureFlagsContext.d.ts +5 -0
  64. package/src/utils/featureFlagsContext/ValidationsFeatureFlagsContext.js +6 -0
  65. package/src/utils/featureFlagsContext/ValidationsFeatureFlagsContext.js.map +1 -0
  66. package/src/utils/getValidationTextColor.d.ts +4 -0
  67. package/src/utils/getValidationTextColor.js +6 -0
  68. package/src/utils/getValidationTextColor.js.map +1 -0
  69. package/src/utils/isNonNullable/isNonNullable.d.ts +7 -0
  70. package/src/utils/isNonNullable/isNonNullable.js +10 -0
  71. package/src/utils/isNonNullable/isNonNullable.js.map +1 -0
  72. package/src/utils/isNullable/isNullable.d.ts +7 -0
  73. package/src/utils/isNullable/isNullable.js +11 -0
  74. package/src/utils/isNullable/isNullable.js.map +1 -0
  75. package/src/utils/utils.d.ts +5 -0
  76. package/src/utils/utils.js +13 -0
  77. package/src/utils/utils.js.map +1 -0
  78. package/typings/Types.d.ts +3 -0
  79. package/typings/Types.js +2 -0
  80. package/typings/Types.js.map +1 -0
  81. package/typings/Types.ts +3 -0
  82. package/typings/global-react.d.ts +12 -0
  83. package/typings/md.d.ts +3 -0
  84. package/typings/react-syntax-highlighter.d.ts +3 -0
  85. package/typings/stylis-plugin-extra-scope.d.ts +3 -0
  86. package/typings/theme-context.d.ts +6 -0
package/package.json CHANGED
@@ -1,20 +1,52 @@
1
1
  {
2
2
  "name": "@skbkontur/react-ui-validations",
3
- "version": "2.3.8",
3
+ "version": "2.3.9-55eb8.0",
4
4
  "description": "Validations for @skbkontur/react-ui",
5
+ "type": "module",
6
+ "scripts": {
7
+ "prerelease": "yarn build",
8
+ "release": "npm publish ./build --workspaces=false",
9
+ "release:unstable": "yarn release --tag=unstable",
10
+ "clean": "rimraf dist build",
11
+ "prebuild": "yarn clean",
12
+ "build": "run-s build:* build:lint:*",
13
+ "build:tsc": "tsc --outDir build -p prod.tsconfig.json",
14
+ "build:copy-files": "copyfiles package.json README.md CHANGELOG.md LICENSE typings/* build",
15
+ "build:lint:publint": "publint --pack npm ./build",
16
+ "build:lint:attw": "attw --ignore-rules cjs-resolves-to-esm --quiet --pack ./build",
17
+ "build:exports": "node ./scripts/exports.ts",
18
+ "storybook": "cross-env STORYBOOK_REACT_UI_TEST=true storybook dev -p 6060",
19
+ "storybook:build": "cross-env STORYBOOK_REACT_UI_TEST=true storybook build -o .storybook/build --quiet",
20
+ "storybook:docs-build": "cross-env STORYBOOK_REACT_UI_VALIDATIONS_DOCS=true storybook build --docs -c .storybook-docs -o .storybook/build --quiet",
21
+ "storybook:docs": "cross-env STORYBOOK_REACT_UI_VALIDATIONS_DOCS=true storybook dev --docs -p 6062 -c .storybook-docs",
22
+ "storybook:serve": "serve -l 6060 .storybook/build",
23
+ "lint": "npm-run-all --continue-on-error --parallel lint:*",
24
+ "lint:tsc": "tsc --noEmit --diagnostics",
25
+ "lint:eslint": "cross-env TIMING=1 eslint ./ --ignore-pattern \"**/docs/**/*.docs.stories.tsx\"",
26
+ "lint:prettier": "prettier --check .",
27
+ "fix": "run-s -c fix:*",
28
+ "fix:eslint": "yarn lint:eslint --fix",
29
+ "fix:prettier": "yarn prettier --write .",
30
+ "test": "vitest run",
31
+ "test:watch": "vitest",
32
+ "creevey": "creevey test -c .creevey/config.mts --storybook-port=6060",
33
+ "creevey:ci": "start-server-and-test storybook:serve http://localhost:6060 creevey",
34
+ "creevey:update": "creevey report --update -c .creevey/config.mts",
35
+ "creevey:ui": "yarn creevey --ui",
36
+ "selenium:test": "dotnet test ./selenium-tests/ValidationTests/ValidationTests.csproj --configuration Release --framework netcoreapp3.1",
37
+ "selenium:ci": "start-server-and-test storybook http://localhost:6060/iframe.html selenium:test"
38
+ },
5
39
  "main": "./index.js",
6
40
  "types": "./index.d.ts",
7
41
  "author": "exactlynosense <whois.ard@gmail.com>",
8
42
  "license": "ISC",
9
- "repository": "https://github.com/skbkontur/retail-ui/tree/master/packages/react-ui-validations",
43
+ "repository": {
44
+ "type": "git",
45
+ "url": "git+ssh://git@github.com/skbkontur/retail-ui.git"
46
+ },
10
47
  "bugs": {
11
48
  "url": "https://github.com/skbkontur/retail-ui/issues"
12
49
  },
13
- "files": [
14
- "index.d.ts",
15
- "index.js",
16
- "index.js.map"
17
- ],
18
50
  "peerDependencies": {
19
51
  "@skbkontur/react-ui": ">=5 <6",
20
52
  "react": ">=16.9 <19",
@@ -23,5 +55,72 @@
23
55
  "dependencies": {
24
56
  "smoothscroll-polyfill": "^0.4.4",
25
57
  "warning": "^4.0.3"
58
+ },
59
+ "devDependencies": {
60
+ "@babel/core": "^7.24.6",
61
+ "@babel/plugin-proposal-decorators": "7.24.6",
62
+ "@babel/plugin-transform-runtime": "^7.24.6",
63
+ "@babel/preset-env": "^7.24.6",
64
+ "@babel/preset-react": "^7.24.6",
65
+ "@babel/preset-typescript": "^7.24.6",
66
+ "@playwright/test": "^1.57.0",
67
+ "@skbkontur/storybook-addon-live-examples": "1.0.0-beta.1",
68
+ "@storybook/addon-docs": "8.6.14",
69
+ "@storybook/addon-essentials": "8.6.14",
70
+ "@storybook/addon-links": "8.6.14",
71
+ "@storybook/blocks": "8.6.14",
72
+ "@storybook/react": "8.6.14",
73
+ "@storybook/react-webpack5": "8.6.14",
74
+ "@testing-library/jest-dom": "6.4.5",
75
+ "@testing-library/react": "15.0.7",
76
+ "@testing-library/react-hooks": "8.0.1",
77
+ "@testing-library/user-event": "14.5.2",
78
+ "@types/react": "19.2.7",
79
+ "@types/react-dom": "19.2.3",
80
+ "@types/react-helmet": "^6.1.11",
81
+ "@types/react-syntax-highlighter": "^15.5.13",
82
+ "@types/styled-components": "^5.1.34",
83
+ "@types/warning": "^3.0.0",
84
+ "babel-loader": "^9.1.3",
85
+ "core-js": "^3.37.1",
86
+ "creevey": "0.10.34",
87
+ "cross-env": "^7.0.3",
88
+ "css-loader": "^7.1.2",
89
+ "file-loader": "^6.2.0",
90
+ "gh-pages": "^6.1.1",
91
+ "html-webpack-plugin": "5.6.0",
92
+ "identity-obj-proxy": "^3.0.0",
93
+ "jsdom": "^27.0.0",
94
+ "less": "4.2.0",
95
+ "less-loader": "12.2.0",
96
+ "markdown": "^0.5.0",
97
+ "npm-run-all": "^4.1.5",
98
+ "playwright-core": "1.57.0",
99
+ "raw-loader": "^4.0.0",
100
+ "react": "19.2.1",
101
+ "react-dom": "19.2.1",
102
+ "react-helmet": "^6.1.0",
103
+ "react-router-dom": "^6.23.1",
104
+ "react-syntax-highlighter": "15.5.0",
105
+ "rimraf": "^5.0.7",
106
+ "selenium-webdriver": "^4.27.0",
107
+ "serve": "^13.0.2",
108
+ "shelljs": "^0.8.3",
109
+ "start-server-and-test": "1.14.0",
110
+ "storybook": "8.6.14",
111
+ "string-replace-loader": "^3.1.0",
112
+ "style-loader": "^4.0.0",
113
+ "styled-components": "^6.1.11",
114
+ "ts-loader": "9.5.1",
115
+ "tslib": "2.6.2",
116
+ "typescript": "5.9.3",
117
+ "vitest": "^3.2.4",
118
+ "webpack": "^5.91.0",
119
+ "webpack-cli": "^5.1.4",
120
+ "webpack-dev-server": "5.0.4"
121
+ },
122
+ "exports": {
123
+ ".": "./index.js",
124
+ "./package.json": "./package.json"
26
125
  }
27
- }
126
+ }
@@ -0,0 +1,4 @@
1
+ import type { TooltipPosition } from './ValidationTooltip.js';
2
+ import type { RenderErrorMessage, TextPosition } from './ValidationWrapperInternal.js';
3
+ export declare function tooltip(pos: TooltipPosition): RenderErrorMessage;
4
+ export declare function text(pos?: TextPosition): RenderErrorMessage;
@@ -0,0 +1,20 @@
1
+ import React from 'react';
2
+ import { ValidationText } from './ValidationText.js';
3
+ import { ValidationTooltip } from './ValidationTooltip.js';
4
+ export function tooltip(pos) {
5
+ return function (control, hasError, validation) {
6
+ return (React.createElement(ValidationTooltip, { pos: pos, error: hasError, render: function () {
7
+ if (!validation || !validation.message) {
8
+ return null;
9
+ }
10
+ return (validation && validation.message) || '';
11
+ } }, control));
12
+ };
13
+ }
14
+ export function text(pos) {
15
+ if (pos === void 0) { pos = 'right'; }
16
+ return function (control, _hasError, validation) {
17
+ return (React.createElement(ValidationText, { pos: pos, validation: validation }, control));
18
+ };
19
+ }
20
+ //# sourceMappingURL=ErrorRenderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ErrorRenderer.js","sourceRoot":"","sources":["../../src/ErrorRenderer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAG3D,MAAM,UAAU,OAAO,CAAC,GAAoB;IAC1C,OAAO,UAAC,OAAO,EAAE,QAAQ,EAAE,UAAU;QACnC,OAAO,CACL,oBAAC,iBAAiB,IAChB,GAAG,EAAE,GAAG,EACR,KAAK,EAAE,QAAQ,EACf,MAAM,EAAE;gBACN,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;oBACvC,OAAO,IAAI,CAAC;gBACd,CAAC;gBACD,OAAO,CAAC,UAAU,IAAI,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAClD,CAAC,IAEA,OAAO,CACU,CACrB,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,GAA2B;IAA3B,oBAAA,EAAA,aAA2B;IAC9C,OAAO,UAAC,OAAO,EAAE,SAAS,EAAE,UAAU;QACpC,OAAO,CACL,oBAAC,cAAc,IAAC,GAAG,EAAE,GAAG,EAAE,UAAU,EAAE,UAAU,IAC7C,OAAO,CACO,CAClB,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC","sourcesContent":["import React from 'react';\n\nimport { ValidationText } from './ValidationText.js';\nimport type { TooltipPosition } from './ValidationTooltip.js';\nimport { ValidationTooltip } from './ValidationTooltip.js';\nimport type { RenderErrorMessage, TextPosition } from './ValidationWrapperInternal.js';\n\nexport function tooltip(pos: TooltipPosition): RenderErrorMessage {\n return (control, hasError, validation) => {\n return (\n <ValidationTooltip\n pos={pos}\n error={hasError}\n render={() => {\n if (!validation || !validation.message) {\n return null;\n }\n return (validation && validation.message) || '';\n }}\n >\n {control}\n </ValidationTooltip>\n );\n };\n}\n\nexport function text(pos: TextPosition = 'right'): RenderErrorMessage {\n return (control, _hasError, validation) => {\n return (\n <ValidationText pos={pos} validation={validation}>\n {control}\n </ValidationText>\n );\n };\n}\n"]}
@@ -0,0 +1,5 @@
1
+ export declare enum FocusMode {
2
+ 'Errors' = 0,
3
+ 'ErrorsAndWarnings' = 1,
4
+ 'None' = 2
5
+ }
@@ -0,0 +1,7 @@
1
+ export var FocusMode;
2
+ (function (FocusMode) {
3
+ FocusMode[FocusMode["Errors"] = 0] = "Errors";
4
+ FocusMode[FocusMode["ErrorsAndWarnings"] = 1] = "ErrorsAndWarnings";
5
+ FocusMode[FocusMode["None"] = 2] = "None";
6
+ })(FocusMode || (FocusMode = {}));
7
+ //# sourceMappingURL=FocusMode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FocusMode.js","sourceRoot":"","sources":["../../src/FocusMode.tsx"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,SAIX;AAJD,WAAY,SAAS;IACnB,6CAAQ,CAAA;IACR,mEAAmB,CAAA;IACnB,yCAAM,CAAA;AACR,CAAC,EAJW,SAAS,KAAT,SAAS,QAIpB","sourcesContent":["export enum FocusMode {\n 'Errors',\n 'ErrorsAndWarnings',\n 'None',\n}\n"]}
@@ -0,0 +1,23 @@
1
+ import type { ReactElement } from 'react';
2
+ import { Tooltip } from '@skbkontur/react-ui/components/Tooltip/Tooltip.js';
3
+ import { ThemeContext } from '@skbkontur/react-ui/lib/theming/ThemeContext.js';
4
+ import { getRootNode } from '@skbkontur/react-ui/lib/rootNode/getRootNode.js';
5
+ export { Tooltip, ThemeContext, getRootNode };
6
+ interface KonturUIElementForDetection {
7
+ type: {
8
+ __KONTUR_REACT_UI__: string;
9
+ };
10
+ }
11
+ export declare class ReactUiDetection {
12
+ static checkType(element: unknown, type: string): element is KonturUIElementForDetection;
13
+ static isDatePicker(element: unknown): boolean;
14
+ static isRadioGroup(element: unknown): boolean;
15
+ static isTokenInput(element: unknown): boolean;
16
+ static isSwitcher(element: unknown): boolean;
17
+ static isComboBox(element: unknown): boolean;
18
+ static isRadio(element: unknown): boolean;
19
+ static isCheckBox(element: unknown): boolean;
20
+ static isToggle(element: unknown): boolean;
21
+ static isSelect(element: unknown): boolean;
22
+ static isSelectionControl(element: ReactElement): boolean;
23
+ }
@@ -0,0 +1,53 @@
1
+ import { Tooltip } from '@skbkontur/react-ui/components/Tooltip/Tooltip.js';
2
+ import { ThemeContext } from '@skbkontur/react-ui/lib/theming/ThemeContext.js';
3
+ import { getRootNode } from '@skbkontur/react-ui/lib/rootNode/getRootNode.js';
4
+ import { isNonNullable } from '../src/utils/isNonNullable/isNonNullable.js';
5
+ export { Tooltip, ThemeContext, getRootNode };
6
+ var ReactUiDetection = /** @class */ (function () {
7
+ function ReactUiDetection() {
8
+ }
9
+ ReactUiDetection.checkType = function (element, type) {
10
+ var _a;
11
+ var el = element;
12
+ return isNonNullable(element) && ((_a = el.type) === null || _a === void 0 ? void 0 : _a.__KONTUR_REACT_UI__) === type;
13
+ };
14
+ ReactUiDetection.isDatePicker = function (element) {
15
+ return ReactUiDetection.checkType(element, 'DatePicker');
16
+ };
17
+ ReactUiDetection.isRadioGroup = function (element) {
18
+ return ReactUiDetection.checkType(element, 'RadioGroup');
19
+ };
20
+ ReactUiDetection.isTokenInput = function (element) {
21
+ return ReactUiDetection.checkType(element, 'TokenInput');
22
+ };
23
+ ReactUiDetection.isSwitcher = function (element) {
24
+ return ReactUiDetection.checkType(element, 'Switcher');
25
+ };
26
+ ReactUiDetection.isComboBox = function (element) {
27
+ return ReactUiDetection.checkType(element, 'ComboBox');
28
+ };
29
+ ReactUiDetection.isRadio = function (element) {
30
+ return ReactUiDetection.checkType(element, 'Radio');
31
+ };
32
+ ReactUiDetection.isCheckBox = function (element) {
33
+ return ReactUiDetection.checkType(element, 'Checkbox');
34
+ };
35
+ ReactUiDetection.isToggle = function (element) {
36
+ return ReactUiDetection.checkType(element, 'Toggle');
37
+ };
38
+ ReactUiDetection.isSelect = function (element) {
39
+ return ReactUiDetection.checkType(element, 'Select');
40
+ };
41
+ ReactUiDetection.isSelectionControl = function (element) {
42
+ return (ReactUiDetection.isRadioGroup(element) ||
43
+ ReactUiDetection.isRadio(element) ||
44
+ ReactUiDetection.isCheckBox(element) ||
45
+ ReactUiDetection.isToggle(element) ||
46
+ ReactUiDetection.isSwitcher(element) ||
47
+ ReactUiDetection.isSelect(element) ||
48
+ ReactUiDetection.isComboBox(element));
49
+ };
50
+ return ReactUiDetection;
51
+ }());
52
+ export { ReactUiDetection };
53
+ //# sourceMappingURL=ReactUiDetection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReactUiDetection.js","sourceRoot":"","sources":["../../src/ReactUiDetection.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,mDAAmD,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAE,MAAM,iDAAiD,CAAC;AAC/E,OAAO,EAAE,WAAW,EAAE,MAAM,iDAAiD,CAAC;AAE9E,OAAO,EAAE,aAAa,EAAE,MAAM,6CAA6C,CAAC;AAE5E,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC;AAI9C;IAAA;IAqDA,CAAC;IApDe,0BAAS,GAAvB,UAAwB,OAAgB,EAAE,IAAY;;QACpD,IAAM,EAAE,GAAG,OAAsC,CAAC;QAClD,OAAO,aAAa,CAAC,OAAO,CAAC,IAAI,CAAA,MAAA,EAAE,CAAC,IAAI,0CAAE,mBAAmB,MAAK,IAAI,CAAC;IACzE,CAAC;IAEa,6BAAY,GAA1B,UAA2B,OAAgB;QACzC,OAAO,gBAAgB,CAAC,SAAS,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IAC3D,CAAC;IAEa,6BAAY,GAA1B,UAA2B,OAAgB;QACzC,OAAO,gBAAgB,CAAC,SAAS,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IAC3D,CAAC;IAEa,6BAAY,GAA1B,UAA2B,OAAgB;QACzC,OAAO,gBAAgB,CAAC,SAAS,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IAC3D,CAAC;IAEa,2BAAU,GAAxB,UAAyB,OAAgB;QACvC,OAAO,gBAAgB,CAAC,SAAS,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IACzD,CAAC;IAEa,2BAAU,GAAxB,UAAyB,OAAgB;QACvC,OAAO,gBAAgB,CAAC,SAAS,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IACzD,CAAC;IAEa,wBAAO,GAArB,UAAsB,OAAgB;QACpC,OAAO,gBAAgB,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACtD,CAAC;IAEa,2BAAU,GAAxB,UAAyB,OAAgB;QACvC,OAAO,gBAAgB,CAAC,SAAS,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IACzD,CAAC;IAEa,yBAAQ,GAAtB,UAAuB,OAAgB;QACrC,OAAO,gBAAgB,CAAC,SAAS,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACvD,CAAC;IAEa,yBAAQ,GAAtB,UAAuB,OAAgB;QACrC,OAAO,gBAAgB,CAAC,SAAS,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACvD,CAAC;IAEa,mCAAkB,GAAhC,UAAiC,OAAqB;QACpD,OAAO,CACL,gBAAgB,CAAC,YAAY,CAAC,OAAO,CAAC;YACtC,gBAAgB,CAAC,OAAO,CAAC,OAAO,CAAC;YACjC,gBAAgB,CAAC,UAAU,CAAC,OAAO,CAAC;YACpC,gBAAgB,CAAC,QAAQ,CAAC,OAAO,CAAC;YAClC,gBAAgB,CAAC,UAAU,CAAC,OAAO,CAAC;YACpC,gBAAgB,CAAC,QAAQ,CAAC,OAAO,CAAC;YAClC,gBAAgB,CAAC,UAAU,CAAC,OAAO,CAAC,CACrC,CAAC;IACJ,CAAC;IACH,uBAAC;AAAD,CAAC,AArDD,IAqDC","sourcesContent":["import type { ReactElement } from 'react';\nimport { Tooltip } from '@skbkontur/react-ui/components/Tooltip/Tooltip.js';\nimport { ThemeContext } from '@skbkontur/react-ui/lib/theming/ThemeContext.js';\nimport { getRootNode } from '@skbkontur/react-ui/lib/rootNode/getRootNode.js';\n\nimport { isNonNullable } from '../src/utils/isNonNullable/isNonNullable.js';\n\nexport { Tooltip, ThemeContext, getRootNode };\ninterface KonturUIElementForDetection {\n type: { __KONTUR_REACT_UI__: string };\n}\nexport class ReactUiDetection {\n public static checkType(element: unknown, type: string): element is KonturUIElementForDetection {\n const el = element as KonturUIElementForDetection;\n return isNonNullable(element) && el.type?.__KONTUR_REACT_UI__ === type;\n }\n\n public static isDatePicker(element: unknown): boolean {\n return ReactUiDetection.checkType(element, 'DatePicker');\n }\n\n public static isRadioGroup(element: unknown): boolean {\n return ReactUiDetection.checkType(element, 'RadioGroup');\n }\n\n public static isTokenInput(element: unknown): boolean {\n return ReactUiDetection.checkType(element, 'TokenInput');\n }\n\n public static isSwitcher(element: unknown): boolean {\n return ReactUiDetection.checkType(element, 'Switcher');\n }\n\n public static isComboBox(element: unknown): boolean {\n return ReactUiDetection.checkType(element, 'ComboBox');\n }\n\n public static isRadio(element: unknown): boolean {\n return ReactUiDetection.checkType(element, 'Radio');\n }\n\n public static isCheckBox(element: unknown): boolean {\n return ReactUiDetection.checkType(element, 'Checkbox');\n }\n\n public static isToggle(element: unknown): boolean {\n return ReactUiDetection.checkType(element, 'Toggle');\n }\n\n public static isSelect(element: unknown): boolean {\n return ReactUiDetection.checkType(element, 'Select');\n }\n\n public static isSelectionControl(element: ReactElement): boolean {\n return (\n ReactUiDetection.isRadioGroup(element) ||\n ReactUiDetection.isRadio(element) ||\n ReactUiDetection.isCheckBox(element) ||\n ReactUiDetection.isToggle(element) ||\n ReactUiDetection.isSwitcher(element) ||\n ReactUiDetection.isSelect(element) ||\n ReactUiDetection.isComboBox(element)\n );\n }\n}\n"]}
@@ -0,0 +1,33 @@
1
+ import React from 'react';
2
+ import type { Nullable } from '../typings/Types.js';
3
+ import { FocusMode } from './FocusMode.js';
4
+ export interface ScrollOffset {
5
+ top?: number;
6
+ bottom?: number;
7
+ }
8
+ export interface ValidationSettings {
9
+ focusMode: FocusMode;
10
+ }
11
+ export type ValidateArgumentType = boolean | ValidationSettings;
12
+ export interface ValidationContainerProps {
13
+ 'data-tid'?: string;
14
+ children?: React.ReactNode;
15
+ onValidationUpdated?: (isValid?: Nullable<boolean>) => void;
16
+ scrollOffset?: ScrollOffset;
17
+ disableSmoothScroll?: boolean;
18
+ }
19
+ type DefaultProps = Required<Pick<ValidationContainerProps, 'disableSmoothScroll'>>;
20
+ export declare class ValidationContainer extends React.Component<ValidationContainerProps> {
21
+ static __KONTUR_REACT_UI__: string;
22
+ static displayName: string;
23
+ static defaultProps: DefaultProps;
24
+ private getProps;
25
+ private childContext;
26
+ submit(withoutFocus?: boolean): Promise<void>;
27
+ submit(validationSettings?: ValidationSettings): Promise<void>;
28
+ validate(withoutFocus?: boolean): Promise<boolean>;
29
+ validate(validationSettings?: ValidationSettings): Promise<boolean>;
30
+ render(): React.JSX.Element;
31
+ private refChildContext;
32
+ }
33
+ export {};
@@ -0,0 +1,56 @@
1
+ import { __awaiter, __extends, __generator } from "tslib";
2
+ import React from 'react';
3
+ import warning from 'warning';
4
+ import { createPropsGetter } from './utils/createPropsGetter.js';
5
+ import { isTestEnv } from './utils/utils.js';
6
+ import { ValidationContextWrapper } from './ValidationContextWrapper.js';
7
+ import { FocusMode } from './FocusMode.js';
8
+ var ValidationContainer = /** @class */ (function (_super) {
9
+ __extends(ValidationContainer, _super);
10
+ function ValidationContainer() {
11
+ var _this = _super !== null && _super.apply(this, arguments) || this;
12
+ _this.getProps = createPropsGetter(ValidationContainer.defaultProps);
13
+ _this.childContext = null;
14
+ _this.refChildContext = function (el) {
15
+ _this.childContext = el;
16
+ };
17
+ return _this;
18
+ }
19
+ ValidationContainer.prototype.submit = function () {
20
+ return __awaiter(this, arguments, void 0, function (withoutFocusOrValidationSettings) {
21
+ if (withoutFocusOrValidationSettings === void 0) { withoutFocusOrValidationSettings = { focusMode: FocusMode.Errors }; }
22
+ return __generator(this, function (_a) {
23
+ switch (_a.label) {
24
+ case 0:
25
+ if (!this.childContext) return [3 /*break*/, 2];
26
+ return [4 /*yield*/, this.childContext.validate(withoutFocusOrValidationSettings)];
27
+ case 1:
28
+ _a.sent();
29
+ _a.label = 2;
30
+ case 2:
31
+ warning(false, 'childContext is not defined');
32
+ return [2 /*return*/];
33
+ }
34
+ });
35
+ });
36
+ };
37
+ ValidationContainer.prototype.validate = function (withoutFocusOrValidationSettings) {
38
+ if (withoutFocusOrValidationSettings === void 0) { withoutFocusOrValidationSettings = { focusMode: FocusMode.Errors }; }
39
+ if (!this.childContext) {
40
+ warning(false, 'childContext is not defined');
41
+ return Promise.resolve(false);
42
+ }
43
+ return this.childContext.validate(withoutFocusOrValidationSettings);
44
+ };
45
+ ValidationContainer.prototype.render = function () {
46
+ return (React.createElement(ValidationContextWrapper, { "data-tid": this.props['data-tid'], ref: this.refChildContext, scrollOffset: this.props.scrollOffset, disableSmoothScroll: this.getProps().disableSmoothScroll, onValidationUpdated: this.props.onValidationUpdated }, this.props.children));
47
+ };
48
+ ValidationContainer.__KONTUR_REACT_UI__ = 'ValidationContainer';
49
+ ValidationContainer.displayName = 'ValidationContainer';
50
+ ValidationContainer.defaultProps = {
51
+ disableSmoothScroll: isTestEnv,
52
+ };
53
+ return ValidationContainer;
54
+ }(React.Component));
55
+ export { ValidationContainer };
56
+ //# sourceMappingURL=ValidationContainer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ValidationContainer.js","sourceRoot":"","sources":["../../src/ValidationContainer.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,OAAO,MAAM,SAAS,CAAC;AAI9B,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAuB3C;IAAyC,uCAAyC;IAAlF;;QAQU,cAAQ,GAAG,iBAAiB,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC;QAE/D,kBAAY,GAAoC,IAAI,CAAC;QAyCrD,qBAAe,GAAG,UAAC,EAAmC;YAC5D,KAAI,CAAC,YAAY,GAAG,EAAE,CAAC;QACzB,CAAC,CAAC;;IACJ,CAAC;IAvCc,oCAAM,GAAnB;4DACE,gCAAwF;YAAxF,iDAAA,EAAA,qCAA2D,SAAS,EAAE,SAAS,CAAC,MAAM,EAAE;;;;6BAEpF,IAAI,CAAC,YAAY,EAAjB,wBAAiB;wBACnB,qBAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,gCAAgC,CAAC,EAAA;;wBAAlE,SAAkE,CAAC;;;wBAErE,OAAO,CAAC,KAAK,EAAE,6BAA6B,CAAC,CAAC;;;;;KAC/C;IAKM,sCAAQ,GAAf,UACE,gCAAwF;QAAxF,iDAAA,EAAA,qCAA2D,SAAS,EAAE,SAAS,CAAC,MAAM,EAAE;QAExF,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,OAAO,CAAC,KAAK,EAAE,6BAA6B,CAAC,CAAC;YAC9C,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC;QACD,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,gCAAgC,CAAC,CAAC;IACtE,CAAC;IAEM,oCAAM,GAAb;QACE,OAAO,CACL,oBAAC,wBAAwB,gBACb,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,EAChC,GAAG,EAAE,IAAI,CAAC,eAAe,EACzB,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,EACrC,mBAAmB,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,mBAAmB,EACxD,mBAAmB,EAAE,IAAI,CAAC,KAAK,CAAC,mBAAmB,IAElD,IAAI,CAAC,KAAK,CAAC,QAAQ,CACK,CAC5B,CAAC;IACJ,CAAC;IAhDa,uCAAmB,GAAG,qBAAqB,AAAxB,CAAyB;IAC5C,+BAAW,GAAG,qBAAqB,AAAxB,CAAyB;IAEpC,gCAAY,GAAiB;QACzC,mBAAmB,EAAE,SAAS;KAC/B,AAFyB,CAExB;IAgDJ,0BAAC;CAAA,AAtDD,CAAyC,KAAK,CAAC,SAAS,GAsDvD;SAtDY,mBAAmB","sourcesContent":["import React from 'react';\nimport warning from 'warning';\n\nimport type { Nullable } from '../typings/Types.js';\n\nimport { createPropsGetter } from './utils/createPropsGetter.js';\nimport { isTestEnv } from './utils/utils.js';\nimport { ValidationContextWrapper } from './ValidationContextWrapper.js';\nimport { FocusMode } from './FocusMode.js';\n\nexport interface ScrollOffset {\n top?: number;\n bottom?: number;\n}\n\nexport interface ValidationSettings {\n focusMode: FocusMode;\n}\n\nexport type ValidateArgumentType = boolean | ValidationSettings;\n\nexport interface ValidationContainerProps {\n 'data-tid'?: string;\n children?: React.ReactNode;\n onValidationUpdated?: (isValid?: Nullable<boolean>) => void;\n scrollOffset?: ScrollOffset;\n disableSmoothScroll?: boolean;\n}\n\ntype DefaultProps = Required<Pick<ValidationContainerProps, 'disableSmoothScroll'>>;\n\nexport class ValidationContainer extends React.Component<ValidationContainerProps> {\n public static __KONTUR_REACT_UI__ = 'ValidationContainer';\n public static displayName = 'ValidationContainer';\n\n public static defaultProps: DefaultProps = {\n disableSmoothScroll: isTestEnv,\n };\n\n private getProps = createPropsGetter(ValidationContainer.defaultProps);\n\n private childContext: ValidationContextWrapper | null = null;\n\n public async submit(withoutFocus?: boolean): Promise<void>;\n public async submit(validationSettings?: ValidationSettings): Promise<void>;\n\n public async submit(\n withoutFocusOrValidationSettings: ValidateArgumentType = { focusMode: FocusMode.Errors },\n ): Promise<void> {\n if (this.childContext) {\n await this.childContext.validate(withoutFocusOrValidationSettings);\n }\n warning(false, 'childContext is not defined');\n }\n\n public async validate(withoutFocus?: boolean): Promise<boolean>;\n public async validate(validationSettings?: ValidationSettings): Promise<boolean>;\n\n public validate(\n withoutFocusOrValidationSettings: ValidateArgumentType = { focusMode: FocusMode.Errors },\n ): Promise<boolean> {\n if (!this.childContext) {\n warning(false, 'childContext is not defined');\n return Promise.resolve(false);\n }\n return this.childContext.validate(withoutFocusOrValidationSettings);\n }\n\n public render(): React.JSX.Element {\n return (\n <ValidationContextWrapper\n data-tid={this.props['data-tid']}\n ref={this.refChildContext}\n scrollOffset={this.props.scrollOffset}\n disableSmoothScroll={this.getProps().disableSmoothScroll}\n onValidationUpdated={this.props.onValidationUpdated}\n >\n {this.props.children}\n </ValidationContextWrapper>\n );\n }\n\n private refChildContext = (el: ValidationContextWrapper | null) => {\n this.childContext = el;\n };\n}\n"]}
@@ -0,0 +1,41 @@
1
+ import React from 'react';
2
+ import type { ValidationWrapperInternal } from './ValidationWrapperInternal.js';
3
+ import type { ScrollOffset, ValidateArgumentType } from './ValidationContainer.js';
4
+ export interface ValidationContextSettings {
5
+ scrollOffset: ScrollOffset;
6
+ disableSmoothScroll: boolean;
7
+ }
8
+ export interface ValidationContextWrapperProps {
9
+ 'data-tid'?: string;
10
+ children?: React.ReactNode;
11
+ onValidationUpdated?: (isValid?: boolean) => void;
12
+ scrollOffset?: number | ScrollOffset;
13
+ disableSmoothScroll: boolean;
14
+ }
15
+ export interface ValidationContextType {
16
+ register: (wrapper: ValidationWrapperInternal) => void;
17
+ unregister: (wrapper: ValidationWrapperInternal) => void;
18
+ instanceProcessBlur: (wrapper: ValidationWrapperInternal) => void;
19
+ onValidationUpdated: (wrapper: ValidationWrapperInternal, isValid: boolean) => void;
20
+ getSettings: () => ValidationContextSettings;
21
+ isAnyWrapperInChangingMode: () => boolean;
22
+ isValidationCalled: () => boolean;
23
+ }
24
+ export declare const ValidationContext: React.Context<ValidationContextType>;
25
+ export declare class ValidationContextWrapper extends React.Component<ValidationContextWrapperProps> {
26
+ childWrappers: ValidationWrapperInternal[];
27
+ validationHasBeenCalled: boolean;
28
+ getSettings(): ValidationContextSettings;
29
+ register(wrapper: ValidationWrapperInternal): void;
30
+ unregister(wrapper: ValidationWrapperInternal): void;
31
+ instanceProcessBlur(instance: ValidationWrapperInternal): void;
32
+ onValidationUpdated(wrapper: ValidationWrapperInternal, isValid?: boolean): void;
33
+ isAnyWrapperInChangingMode(): boolean;
34
+ isValidationCalled(): boolean;
35
+ onValidationRemoved(): void;
36
+ getChildWrappersSortedByPosition(): ValidationWrapperInternal[];
37
+ validate(withoutFocusOrValidationSettings: ValidateArgumentType): Promise<boolean>;
38
+ private static getFocusMode;
39
+ private renderChildren;
40
+ render(): React.JSX.Element;
41
+ }
@@ -0,0 +1,156 @@
1
+ import { __awaiter, __extends, __generator, __spreadArray } from "tslib";
2
+ import React from 'react';
3
+ import { isNullable } from './utils/isNullable/isNullable.js';
4
+ import { FocusMode } from './FocusMode.js';
5
+ export var ValidationContext = React.createContext({
6
+ register: function () { return undefined; },
7
+ unregister: function () { return undefined; },
8
+ instanceProcessBlur: function () { return undefined; },
9
+ onValidationUpdated: function () { return undefined; },
10
+ getSettings: function () { return ({
11
+ scrollOffset: {},
12
+ disableSmoothScroll: false,
13
+ }); },
14
+ isAnyWrapperInChangingMode: function () { return false; },
15
+ isValidationCalled: function () { return false; },
16
+ });
17
+ ValidationContext.displayName = 'ValidationContext';
18
+ var ValidationContextWrapper = /** @class */ (function (_super) {
19
+ __extends(ValidationContextWrapper, _super);
20
+ function ValidationContextWrapper() {
21
+ var _this = _super !== null && _super.apply(this, arguments) || this;
22
+ _this.childWrappers = [];
23
+ _this.validationHasBeenCalled = false;
24
+ _this.renderChildren = function (children) {
25
+ if (React.isValidElement(children)) {
26
+ return React.cloneElement(children, {
27
+ 'data-tid': _this.props['data-tid'],
28
+ });
29
+ }
30
+ return children;
31
+ };
32
+ return _this;
33
+ }
34
+ ValidationContextWrapper.prototype.getSettings = function () {
35
+ var scrollOffset = {};
36
+ if (typeof this.props.scrollOffset === 'number') {
37
+ scrollOffset = { top: this.props.scrollOffset };
38
+ }
39
+ else {
40
+ scrollOffset = isNullable(this.props.scrollOffset) ? {} : this.props.scrollOffset;
41
+ }
42
+ var _a = scrollOffset.top, top = _a === void 0 ? 50 : _a, _b = scrollOffset.bottom, bottom = _b === void 0 ? 0 : _b;
43
+ return {
44
+ scrollOffset: {
45
+ top: top,
46
+ bottom: bottom,
47
+ },
48
+ disableSmoothScroll: this.props.disableSmoothScroll,
49
+ };
50
+ };
51
+ ValidationContextWrapper.prototype.register = function (wrapper) {
52
+ this.childWrappers.push(wrapper);
53
+ };
54
+ ValidationContextWrapper.prototype.unregister = function (wrapper) {
55
+ this.childWrappers.splice(this.childWrappers.indexOf(wrapper), 1);
56
+ this.onValidationRemoved();
57
+ };
58
+ ValidationContextWrapper.prototype.instanceProcessBlur = function (instance) {
59
+ for (var _i = 0, _a = this.childWrappers.filter(function (x) { return x !== instance && !x.isIndependent(); }); _i < _a.length; _i++) {
60
+ var wrapper = _a[_i];
61
+ wrapper.processBlur();
62
+ }
63
+ };
64
+ ValidationContextWrapper.prototype.onValidationUpdated = function (wrapper, isValid) {
65
+ var onValidationUpdated = this.props.onValidationUpdated;
66
+ if (onValidationUpdated) {
67
+ var isValidResult = !this.childWrappers.find(function (x) {
68
+ if (x === wrapper) {
69
+ return !isValid;
70
+ }
71
+ return x.hasError();
72
+ });
73
+ onValidationUpdated(isValidResult);
74
+ }
75
+ };
76
+ ValidationContextWrapper.prototype.isAnyWrapperInChangingMode = function () {
77
+ return this.childWrappers.some(function (x) { return x.isChanging; });
78
+ };
79
+ ValidationContextWrapper.prototype.isValidationCalled = function () {
80
+ return this.validationHasBeenCalled;
81
+ };
82
+ ValidationContextWrapper.prototype.onValidationRemoved = function () {
83
+ var onValidationUpdated = this.props.onValidationUpdated;
84
+ if (onValidationUpdated) {
85
+ var isValidResult = !this.childWrappers.find(function (x) { return x.hasError(); });
86
+ onValidationUpdated(isValidResult);
87
+ }
88
+ };
89
+ ValidationContextWrapper.prototype.getChildWrappersSortedByPosition = function () {
90
+ var wrappersWithPosition = __spreadArray([], this.childWrappers, true).map(function (x) { return ({
91
+ target: x,
92
+ position: x.getControlPosition(),
93
+ }); });
94
+ wrappersWithPosition.sort(function (x, y) {
95
+ var xPosition = x.position;
96
+ var yPosition = y.position;
97
+ if (isNullable(xPosition) && isNullable(yPosition)) {
98
+ return 0;
99
+ }
100
+ if (isNullable(xPosition)) {
101
+ return 1;
102
+ }
103
+ if (isNullable(yPosition)) {
104
+ return -1;
105
+ }
106
+ if (Math.sign(xPosition.x - yPosition.x) !== 0) {
107
+ return Math.sign(xPosition.x - yPosition.x);
108
+ }
109
+ return Math.sign(xPosition.y - yPosition.y);
110
+ });
111
+ return wrappersWithPosition.map(function (x) { return x.target; });
112
+ };
113
+ ValidationContextWrapper.prototype.validate = function (withoutFocusOrValidationSettings) {
114
+ return __awaiter(this, void 0, void 0, function () {
115
+ var focusMode, childrenWrappersSortedByPosition, firstError;
116
+ var _a;
117
+ return __generator(this, function (_b) {
118
+ switch (_b.label) {
119
+ case 0:
120
+ focusMode = ValidationContextWrapper.getFocusMode(withoutFocusOrValidationSettings);
121
+ return [4 /*yield*/, Promise.all(this.childWrappers.map(function (x) { return x.processSubmit(); }))];
122
+ case 1:
123
+ _b.sent();
124
+ this.validationHasBeenCalled = true;
125
+ childrenWrappersSortedByPosition = this.getChildWrappersSortedByPosition();
126
+ firstError = childrenWrappersSortedByPosition.find(function (x) { return x.hasError(); });
127
+ if (focusMode === FocusMode.ErrorsAndWarnings) {
128
+ (_a = childrenWrappersSortedByPosition.find(function (x) { return x.hasError() || x.hasWarning(); })) === null || _a === void 0 ? void 0 : _a.focus();
129
+ }
130
+ if (focusMode === FocusMode.Errors) {
131
+ firstError === null || firstError === void 0 ? void 0 : firstError.focus();
132
+ }
133
+ if (this.props.onValidationUpdated) {
134
+ this.props.onValidationUpdated(!firstError);
135
+ }
136
+ return [2 /*return*/, !firstError];
137
+ }
138
+ });
139
+ });
140
+ };
141
+ ValidationContextWrapper.getFocusMode = function (withoutFocusOrValidationSettings) {
142
+ if (typeof withoutFocusOrValidationSettings === 'object' && 'focusMode' in withoutFocusOrValidationSettings) {
143
+ return withoutFocusOrValidationSettings.focusMode;
144
+ }
145
+ else if (!withoutFocusOrValidationSettings) {
146
+ return FocusMode.Errors;
147
+ }
148
+ return FocusMode.None;
149
+ };
150
+ ValidationContextWrapper.prototype.render = function () {
151
+ return (React.createElement(ValidationContext.Provider, { value: this }, this.renderChildren(React.createElement("div", { style: { display: 'inline' } }, this.props.children))));
152
+ };
153
+ return ValidationContextWrapper;
154
+ }(React.Component));
155
+ export { ValidationContextWrapper };
156
+ //# sourceMappingURL=ValidationContextWrapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ValidationContextWrapper.js","sourceRoot":"","sources":["../../src/ValidationContextWrapper.tsx"],"names":[],"mappings":"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","sourcesContent":["import React from 'react';\n\nimport type { ValidationWrapperInternal } from './ValidationWrapperInternal.js';\nimport type { ScrollOffset, ValidateArgumentType } from './ValidationContainer.js';\nimport { isNullable } from './utils/isNullable/isNullable.js';\nimport { FocusMode } from './FocusMode.js';\n\nexport interface ValidationContextSettings {\n scrollOffset: ScrollOffset;\n disableSmoothScroll: boolean;\n}\n\nexport interface ValidationContextWrapperProps {\n 'data-tid'?: string;\n children?: React.ReactNode;\n onValidationUpdated?: (isValid?: boolean) => void;\n scrollOffset?: number | ScrollOffset;\n disableSmoothScroll: boolean;\n}\n\nexport interface ValidationContextType {\n register: (wrapper: ValidationWrapperInternal) => void;\n unregister: (wrapper: ValidationWrapperInternal) => void;\n instanceProcessBlur: (wrapper: ValidationWrapperInternal) => void;\n onValidationUpdated: (wrapper: ValidationWrapperInternal, isValid: boolean) => void;\n getSettings: () => ValidationContextSettings;\n isAnyWrapperInChangingMode: () => boolean;\n isValidationCalled: () => boolean;\n}\n\nexport const ValidationContext = React.createContext<ValidationContextType>({\n register: () => undefined,\n unregister: () => undefined,\n instanceProcessBlur: () => undefined,\n onValidationUpdated: () => undefined,\n getSettings: () => ({\n scrollOffset: {},\n disableSmoothScroll: false,\n }),\n isAnyWrapperInChangingMode: () => false,\n isValidationCalled: () => false,\n});\n\nValidationContext.displayName = 'ValidationContext';\n\nexport class ValidationContextWrapper extends React.Component<ValidationContextWrapperProps> {\n public childWrappers: ValidationWrapperInternal[] = [];\n public validationHasBeenCalled: boolean = false;\n\n public getSettings(): ValidationContextSettings {\n let scrollOffset: ScrollOffset = {};\n\n if (typeof this.props.scrollOffset === 'number') {\n scrollOffset = { top: this.props.scrollOffset };\n } else {\n scrollOffset = isNullable(this.props.scrollOffset) ? {} : this.props.scrollOffset;\n }\n\n const { top = 50, bottom = 0 } = scrollOffset;\n return {\n scrollOffset: {\n top,\n bottom,\n },\n disableSmoothScroll: this.props.disableSmoothScroll,\n };\n }\n\n public register(wrapper: ValidationWrapperInternal): void {\n this.childWrappers.push(wrapper);\n }\n\n public unregister(wrapper: ValidationWrapperInternal): void {\n this.childWrappers.splice(this.childWrappers.indexOf(wrapper), 1);\n this.onValidationRemoved();\n }\n\n public instanceProcessBlur(instance: ValidationWrapperInternal): void {\n for (const wrapper of this.childWrappers.filter((x) => x !== instance && !x.isIndependent())) {\n wrapper.processBlur();\n }\n }\n\n public onValidationUpdated(wrapper: ValidationWrapperInternal, isValid?: boolean): void {\n const { onValidationUpdated } = this.props;\n if (onValidationUpdated) {\n const isValidResult = !this.childWrappers.find((x) => {\n if (x === wrapper) {\n return !isValid;\n }\n return x.hasError();\n });\n onValidationUpdated(isValidResult);\n }\n }\n\n public isAnyWrapperInChangingMode(): boolean {\n return this.childWrappers.some((x) => x.isChanging);\n }\n\n public isValidationCalled(): boolean {\n return this.validationHasBeenCalled;\n }\n\n public onValidationRemoved(): void {\n const { onValidationUpdated } = this.props;\n if (onValidationUpdated) {\n const isValidResult = !this.childWrappers.find((x) => x.hasError());\n onValidationUpdated(isValidResult);\n }\n }\n\n public getChildWrappersSortedByPosition(): ValidationWrapperInternal[] {\n const wrappersWithPosition = [...this.childWrappers].map((x) => ({\n target: x,\n position: x.getControlPosition(),\n }));\n wrappersWithPosition.sort((x, y) => {\n const xPosition = x.position;\n const yPosition = y.position;\n if (isNullable(xPosition) && isNullable(yPosition)) {\n return 0;\n }\n\n if (isNullable(xPosition)) {\n return 1;\n }\n if (isNullable(yPosition)) {\n return -1;\n }\n if (Math.sign(xPosition.x - yPosition.x) !== 0) {\n return Math.sign(xPosition.x - yPosition.x);\n }\n return Math.sign(xPosition.y - yPosition.y);\n });\n return wrappersWithPosition.map((x) => x.target);\n }\n\n public async validate(withoutFocusOrValidationSettings: ValidateArgumentType): Promise<boolean> {\n const focusMode = ValidationContextWrapper.getFocusMode(withoutFocusOrValidationSettings);\n\n await Promise.all(this.childWrappers.map((x) => x.processSubmit()));\n\n this.validationHasBeenCalled = true;\n\n const childrenWrappersSortedByPosition = this.getChildWrappersSortedByPosition();\n const firstError = childrenWrappersSortedByPosition.find((x) => x.hasError());\n if (focusMode === FocusMode.ErrorsAndWarnings) {\n childrenWrappersSortedByPosition.find((x) => x.hasError() || x.hasWarning())?.focus();\n }\n if (focusMode === FocusMode.Errors) {\n firstError?.focus();\n }\n if (this.props.onValidationUpdated) {\n this.props.onValidationUpdated(!firstError);\n }\n return !firstError;\n }\n\n private static getFocusMode(withoutFocusOrValidationSettings: ValidateArgumentType) {\n if (typeof withoutFocusOrValidationSettings === 'object' && 'focusMode' in withoutFocusOrValidationSettings) {\n return withoutFocusOrValidationSettings.focusMode;\n } else if (!withoutFocusOrValidationSettings) {\n return FocusMode.Errors;\n }\n return FocusMode.None;\n }\n\n private renderChildren = (children: ValidationContextWrapperProps['children']) => {\n if (React.isValidElement(children)) {\n return React.cloneElement(children as React.ReactElement<ValidationContextWrapperProps>, {\n 'data-tid': this.props['data-tid'],\n });\n }\n\n return children;\n };\n\n public render(): React.JSX.Element {\n return (\n <ValidationContext.Provider value={this}>\n {this.renderChildren(<div style={{ display: 'inline' }}>{this.props.children}</div>)}\n </ValidationContext.Provider>\n );\n }\n}\n"]}
@@ -0,0 +1,7 @@
1
+ import type { Nullable } from '../typings/Types.js';
2
+ import type { Validation, ValidationBehaviour, ValidationLevel } from './ValidationWrapperInternal.js';
3
+ export declare function getVisibleValidation(visible: Nullable<Validation>, actual: Nullable<Validation>, changing: boolean): Nullable<Validation>;
4
+ export declare function getType(validation: Nullable<Validation>): Nullable<ValidationBehaviour>;
5
+ export declare function getLevel(validation: Nullable<Validation>): Nullable<ValidationLevel>;
6
+ export declare function getIndependent(validation: Nullable<Validation>): Nullable<boolean>;
7
+ export declare function isEqual(a: Nullable<Validation>, b: Nullable<Validation>): boolean;