@skbkontur/react-ui-validations 2.3.8 → 2.3.9-66d7b.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.
- package/CHANGELOG.md +1105 -0
- package/index.d.ts +17 -316
- package/index.js +11 -16258
- package/index.js.map +1 -1
- package/package.json +107 -8
- package/src/ErrorRenderer.d.ts +4 -0
- package/src/ErrorRenderer.js +20 -0
- package/src/ErrorRenderer.js.map +1 -0
- package/src/FocusMode.d.ts +5 -0
- package/src/FocusMode.js +7 -0
- package/src/FocusMode.js.map +1 -0
- package/src/ReactUiDetection.d.ts +23 -0
- package/src/ReactUiDetection.js +53 -0
- package/src/ReactUiDetection.js.map +1 -0
- package/src/ValidationContainer.d.ts +33 -0
- package/src/ValidationContainer.js +56 -0
- package/src/ValidationContainer.js.map +1 -0
- package/src/ValidationContextWrapper.d.ts +41 -0
- package/src/ValidationContextWrapper.js +156 -0
- package/src/ValidationContextWrapper.js.map +1 -0
- package/src/ValidationHelper.d.ts +7 -0
- package/src/ValidationHelper.js +41 -0
- package/src/ValidationHelper.js.map +1 -0
- package/src/ValidationText.d.ts +14 -0
- package/src/ValidationText.js +29 -0
- package/src/ValidationText.js.map +1 -0
- package/src/ValidationTooltip.d.ts +14 -0
- package/src/ValidationTooltip.js +22 -0
- package/src/ValidationTooltip.js.map +1 -0
- package/src/ValidationWrapper.d.ts +19 -0
- package/src/ValidationWrapper.js +27 -0
- package/src/ValidationWrapper.js.map +1 -0
- package/src/ValidationWrapperInternal.d.ts +54 -0
- package/src/ValidationWrapperInternal.js +230 -0
- package/src/ValidationWrapperInternal.js.map +1 -0
- package/src/Validations/PathHelper.d.ts +13 -0
- package/src/Validations/PathHelper.js +42 -0
- package/src/Validations/PathHelper.js.map +1 -0
- package/src/Validations/Types.d.ts +12 -0
- package/src/Validations/Types.js +2 -0
- package/src/Validations/Types.js.map +1 -0
- package/src/Validations/ValidationBuilder.d.ts +18 -0
- package/src/Validations/ValidationBuilder.js +65 -0
- package/src/Validations/ValidationBuilder.js.map +1 -0
- package/src/Validations/ValidationReader.d.ts +15 -0
- package/src/Validations/ValidationReader.js +37 -0
- package/src/Validations/ValidationReader.js.map +1 -0
- package/src/Validations/ValidationWriter.d.ts +13 -0
- package/src/Validations/ValidationWriter.js +39 -0
- package/src/Validations/ValidationWriter.js.map +1 -0
- package/src/Validations/index.d.ts +7 -0
- package/src/Validations/index.js +18 -0
- package/src/Validations/index.js.map +1 -0
- package/src/smoothScrollIntoView.d.ts +2 -0
- package/src/smoothScrollIntoView.js +166 -0
- package/src/smoothScrollIntoView.js.map +1 -0
- package/src/utils/createPropsGetter.d.ts +3 -0
- package/src/utils/createPropsGetter.js +9 -0
- package/src/utils/createPropsGetter.js.map +1 -0
- package/src/utils/featureFlagsContext/FeatureFlagsHelpers.d.ts +2 -0
- package/src/utils/featureFlagsContext/FeatureFlagsHelpers.js +6 -0
- package/src/utils/featureFlagsContext/FeatureFlagsHelpers.js.map +1 -0
- package/src/utils/featureFlagsContext/ValidationsFeatureFlagsContext.d.ts +5 -0
- package/src/utils/featureFlagsContext/ValidationsFeatureFlagsContext.js +6 -0
- package/src/utils/featureFlagsContext/ValidationsFeatureFlagsContext.js.map +1 -0
- package/src/utils/getValidationTextColor.d.ts +4 -0
- package/src/utils/getValidationTextColor.js +6 -0
- package/src/utils/getValidationTextColor.js.map +1 -0
- package/src/utils/isNonNullable/isNonNullable.d.ts +7 -0
- package/src/utils/isNonNullable/isNonNullable.js +10 -0
- package/src/utils/isNonNullable/isNonNullable.js.map +1 -0
- package/src/utils/isNullable/isNullable.d.ts +7 -0
- package/src/utils/isNullable/isNullable.js +11 -0
- package/src/utils/isNullable/isNullable.js.map +1 -0
- package/src/utils/utils.d.ts +5 -0
- package/src/utils/utils.js +13 -0
- package/src/utils/utils.js.map +1 -0
- package/typings/Types.d.ts +3 -0
- package/typings/Types.js +2 -0
- package/typings/Types.js.map +1 -0
- package/typings/Types.ts +3 -0
- package/typings/global-react.d.ts +12 -0
- package/typings/md.d.ts +3 -0
- package/typings/react-syntax-highlighter.d.ts +3 -0
- package/typings/stylis-plugin-extra-scope.d.ts +3 -0
- package/typings/theme-context.d.ts +6 -0
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export function getVisibleValidation(visible, actual, changing) {
|
|
2
|
+
var from = function (type) { return getType(visible) === type; };
|
|
3
|
+
var to = function (type) { return getType(actual) === type; };
|
|
4
|
+
if (to('immediate')) {
|
|
5
|
+
return actual;
|
|
6
|
+
}
|
|
7
|
+
if (changing) {
|
|
8
|
+
return from('immediate') ? null : visible;
|
|
9
|
+
}
|
|
10
|
+
if (from(null) && to('lostfocus')) {
|
|
11
|
+
return null;
|
|
12
|
+
}
|
|
13
|
+
if (to('lostfocus')) {
|
|
14
|
+
return actual;
|
|
15
|
+
}
|
|
16
|
+
if (from('submit') && to('submit')) {
|
|
17
|
+
return visible;
|
|
18
|
+
}
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
export function getType(validation) {
|
|
22
|
+
return validation ? validation.behaviour : null;
|
|
23
|
+
}
|
|
24
|
+
export function getLevel(validation) {
|
|
25
|
+
return validation ? validation.level : null;
|
|
26
|
+
}
|
|
27
|
+
export function getIndependent(validation) {
|
|
28
|
+
return validation ? validation.independent : null;
|
|
29
|
+
}
|
|
30
|
+
export function isEqual(a, b) {
|
|
31
|
+
if (a === b) {
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
return (!!a &&
|
|
35
|
+
!!b &&
|
|
36
|
+
a.behaviour === b.behaviour &&
|
|
37
|
+
a.message === b.message &&
|
|
38
|
+
a.independent === b.independent &&
|
|
39
|
+
a.level === b.level);
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=ValidationHelper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ValidationHelper.js","sourceRoot":"","sources":["../../src/ValidationHelper.ts"],"names":[],"mappings":"AAIA,MAAM,UAAU,oBAAoB,CAClC,OAA6B,EAC7B,MAA4B,EAC5B,QAAiB;IAEjB,IAAM,IAAI,GAAG,UAAC,IAAoC,IAAc,OAAA,OAAO,CAAC,OAAO,CAAC,KAAK,IAAI,EAAzB,CAAyB,CAAC;IAC1F,IAAM,EAAE,GAAG,UAAC,IAAoC,IAAc,OAAA,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,EAAxB,CAAwB,CAAC;IAEvF,IAAI,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC;QACpB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;IAC5C,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC;QAClC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC;QACpB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnC,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,UAAgC;IACtD,OAAO,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,UAAgC;IACvD,OAAO,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,UAAgC;IAC7D,OAAO,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,CAAuB,EAAE,CAAuB;IACtE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACZ,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,CACL,CAAC,CAAC,CAAC;QACH,CAAC,CAAC,CAAC;QACH,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC,SAAS;QAC3B,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,OAAO;QACvB,CAAC,CAAC,WAAW,KAAK,CAAC,CAAC,WAAW;QAC/B,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK,CACpB,CAAC;AACJ,CAAC","sourcesContent":["import type { Nullable } from '../typings/Types.js';\n\nimport type { Validation, ValidationBehaviour, ValidationLevel } from './ValidationWrapperInternal.js';\n\nexport function getVisibleValidation(\n visible: Nullable<Validation>,\n actual: Nullable<Validation>,\n changing: boolean,\n): Nullable<Validation> {\n const from = (type?: Nullable<ValidationBehaviour>): boolean => getType(visible) === type;\n const to = (type?: Nullable<ValidationBehaviour>): boolean => getType(actual) === type;\n\n if (to('immediate')) {\n return actual;\n }\n\n if (changing) {\n return from('immediate') ? null : visible;\n }\n\n if (from(null) && to('lostfocus')) {\n return null;\n }\n\n if (to('lostfocus')) {\n return actual;\n }\n\n if (from('submit') && to('submit')) {\n return visible;\n }\n\n return null;\n}\n\nexport function getType(validation: Nullable<Validation>): Nullable<ValidationBehaviour> {\n return validation ? validation.behaviour : null;\n}\n\nexport function getLevel(validation: Nullable<Validation>): Nullable<ValidationLevel> {\n return validation ? validation.level : null;\n}\n\nexport function getIndependent(validation: Nullable<Validation>): Nullable<boolean> {\n return validation ? validation.independent : null;\n}\n\nexport function isEqual(a: Nullable<Validation>, b: Nullable<Validation>): boolean {\n if (a === b) {\n return true;\n }\n return (\n !!a &&\n !!b &&\n a.behaviour === b.behaviour &&\n a.message === b.message &&\n a.independent === b.independent &&\n a.level === b.level\n );\n}\n"]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { Nullable } from '../typings/Types.js';
|
|
3
|
+
import type { TextPosition, Validation } from './ValidationWrapperInternal.js';
|
|
4
|
+
export interface ValidationTextProps {
|
|
5
|
+
pos: TextPosition;
|
|
6
|
+
children: React.ReactNode;
|
|
7
|
+
validation: Nullable<Validation>;
|
|
8
|
+
'data-tid'?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare const ValidationText: {
|
|
11
|
+
({ pos, children, validation, "data-tid": dataTid, }: ValidationTextProps): React.JSX.Element;
|
|
12
|
+
__KONTUR_REACT_UI__: string;
|
|
13
|
+
displayName: string;
|
|
14
|
+
};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import React, { useContext } from 'react';
|
|
2
|
+
import { getValidationTextColor } from './utils/getValidationTextColor.js';
|
|
3
|
+
import { ThemeContext } from './ReactUiDetection.js';
|
|
4
|
+
export var ValidationText = function (_a) {
|
|
5
|
+
var pos = _a.pos, children = _a.children, validation = _a.validation, dataTid = _a["data-tid"];
|
|
6
|
+
var theme = useContext(ThemeContext);
|
|
7
|
+
var color = getValidationTextColor(theme, validation === null || validation === void 0 ? void 0 : validation.level);
|
|
8
|
+
if (pos === 'right') {
|
|
9
|
+
var childrenAndValidationText_1 = (React.createElement(React.Fragment, null,
|
|
10
|
+
children,
|
|
11
|
+
React.createElement("span", { "data-tid": dataTid, "data-validation-message": "text", style: { marginLeft: '10px', color: color } }, (validation && validation.message) || '')));
|
|
12
|
+
return React.createElement("div", { style: { display: 'inline-block' } }, childrenAndValidationText_1);
|
|
13
|
+
}
|
|
14
|
+
var validationText = (React.createElement("span", { "data-tid": dataTid, "data-validation-message": "text", style: {
|
|
15
|
+
color: color,
|
|
16
|
+
overflow: 'visible',
|
|
17
|
+
whiteSpace: 'nowrap',
|
|
18
|
+
position: 'absolute',
|
|
19
|
+
top: '2px',
|
|
20
|
+
left: 0,
|
|
21
|
+
} }, (validation && validation.message) || ''));
|
|
22
|
+
var childrenAndValidationText = (React.createElement(React.Fragment, null,
|
|
23
|
+
children,
|
|
24
|
+
React.createElement("span", { style: { position: 'absolute', bottom: 0, left: 0, height: 0 } }, validationText)));
|
|
25
|
+
return React.createElement("div", { style: { position: 'relative', display: 'inline-block' } }, childrenAndValidationText);
|
|
26
|
+
};
|
|
27
|
+
ValidationText.__KONTUR_REACT_UI__ = 'ValidationText';
|
|
28
|
+
ValidationText.displayName = 'ValidationText';
|
|
29
|
+
//# sourceMappingURL=ValidationText.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ValidationText.js","sourceRoot":"","sources":["../../src/ValidationText.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAK1C,OAAO,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AASrD,MAAM,CAAC,IAAM,cAAc,GAAG,UAAC,EAKT;QAJpB,GAAG,SAAA,EACH,QAAQ,cAAA,EACR,UAAU,gBAAA,EACE,OAAO,iBAAA;IAEnB,IAAM,KAAK,GAAG,UAAU,CAAC,YAAY,CAAC,CAAC;IACvC,IAAM,KAAK,GAAG,sBAAsB,CAAC,KAAK,EAAE,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,KAAK,CAAC,CAAC;IAE/D,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;QACpB,IAAM,2BAAyB,GAAG,CAChC;YACG,QAAQ;YACT,0CAAgB,OAAO,6BAA0B,MAAM,EAAC,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,OAAA,EAAE,IACzF,CAAC,UAAU,IAAI,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,CACpC,CACN,CACJ,CAAC;QACF,OAAO,6BAAK,KAAK,EAAE,EAAE,OAAO,EAAE,cAAc,EAAE,IAAG,2BAAyB,CAAO,CAAC;IACpF,CAAC;IAED,IAAM,cAAc,GAAG,CACrB,0CACY,OAAO,6BACO,MAAM,EAC9B,KAAK,EAAE;YACL,KAAK,OAAA;YACL,QAAQ,EAAE,SAAS;YACnB,UAAU,EAAE,QAAQ;YACpB,QAAQ,EAAE,UAAU;YACpB,GAAG,EAAE,KAAK;YACV,IAAI,EAAE,CAAC;SACR,IAEA,CAAC,UAAU,IAAI,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,CACpC,CACR,CAAC;IAEF,IAAM,yBAAyB,GAAG,CAChC;QACG,QAAQ;QACT,8BAAM,KAAK,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAG,cAAc,CAAQ,CAC5F,CACJ,CAAC;IAEF,OAAO,6BAAK,KAAK,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,cAAc,EAAE,IAAG,yBAAyB,CAAO,CAAC;AAC1G,CAAC,CAAC;AAEF,cAAc,CAAC,mBAAmB,GAAG,gBAAgB,CAAC;AACtD,cAAc,CAAC,WAAW,GAAG,gBAAgB,CAAC","sourcesContent":["import React, { useContext } from 'react';\n\nimport type { Nullable } from '../typings/Types.js';\n\nimport type { TextPosition, Validation } from './ValidationWrapperInternal.js';\nimport { getValidationTextColor } from './utils/getValidationTextColor.js';\nimport { ThemeContext } from './ReactUiDetection.js';\n\nexport interface ValidationTextProps {\n pos: TextPosition;\n children: React.ReactNode;\n validation: Nullable<Validation>;\n 'data-tid'?: string;\n}\n\nexport const ValidationText = ({\n pos,\n children,\n validation,\n 'data-tid': dataTid,\n}: ValidationTextProps): React.JSX.Element => {\n const theme = useContext(ThemeContext);\n const color = getValidationTextColor(theme, validation?.level);\n\n if (pos === 'right') {\n const childrenAndValidationText = (\n <>\n {children}\n <span data-tid={dataTid} data-validation-message=\"text\" style={{ marginLeft: '10px', color }}>\n {(validation && validation.message) || ''}\n </span>\n </>\n );\n return <div style={{ display: 'inline-block' }}>{childrenAndValidationText}</div>;\n }\n\n const validationText = (\n <span\n data-tid={dataTid}\n data-validation-message=\"text\"\n style={{\n color,\n overflow: 'visible',\n whiteSpace: 'nowrap',\n position: 'absolute',\n top: '2px',\n left: 0,\n }}\n >\n {(validation && validation.message) || ''}\n </span>\n );\n\n const childrenAndValidationText = (\n <>\n {children}\n <span style={{ position: 'absolute', bottom: 0, left: 0, height: 0 }}>{validationText}</span>\n </>\n );\n\n return <div style={{ position: 'relative', display: 'inline-block' }}>{childrenAndValidationText}</div>;\n};\n\nValidationText.__KONTUR_REACT_UI__ = 'ValidationText';\nValidationText.displayName = 'ValidationText';\n"]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export type TooltipPosition = 'top left' | 'top center' | 'top right' | 'bottom left' | 'bottom center' | 'bottom right' | 'left top' | 'left middle' | 'left bottom' | 'right top' | 'right middle' | 'right bottom';
|
|
3
|
+
export interface ValidationTooltipProps {
|
|
4
|
+
children: React.ReactElement<any>;
|
|
5
|
+
error: boolean;
|
|
6
|
+
pos?: TooltipPosition;
|
|
7
|
+
render?: () => React.ReactNode;
|
|
8
|
+
'data-tid'?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare class ValidationTooltip extends React.Component<ValidationTooltipProps> {
|
|
11
|
+
static __KONTUR_REACT_UI__: string;
|
|
12
|
+
static displayName: string;
|
|
13
|
+
render(): React.JSX.Element;
|
|
14
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { __assign, __extends, __rest } from "tslib";
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { ReactUiDetection, Tooltip } from './ReactUiDetection.js';
|
|
4
|
+
var ValidationTooltip = /** @class */ (function (_super) {
|
|
5
|
+
__extends(ValidationTooltip, _super);
|
|
6
|
+
function ValidationTooltip() {
|
|
7
|
+
return _super !== null && _super.apply(this, arguments) || this;
|
|
8
|
+
}
|
|
9
|
+
ValidationTooltip.prototype.render = function () {
|
|
10
|
+
var _a = this.props, children = _a.children, pos = _a.pos, error = _a.error, render = _a.render, rest = __rest(_a, ["children", "pos", "error", "render"]);
|
|
11
|
+
var onlyChild = React.Children.only(children);
|
|
12
|
+
var child = onlyChild && onlyChild.props ? onlyChild.props.children : null;
|
|
13
|
+
return ReactUiDetection.isRadioGroup(child) ||
|
|
14
|
+
ReactUiDetection.isTokenInput(child) ||
|
|
15
|
+
ReactUiDetection.isSwitcher(child) ? (React.createElement(Tooltip, __assign({ useWrapper: false, pos: pos, render: error ? render : undefined, trigger: 'hover&focus' }, rest), child)) : (React.createElement(Tooltip, __assign({ pos: pos, render: error ? render : undefined, trigger: 'hover&focus' }, rest), children));
|
|
16
|
+
};
|
|
17
|
+
ValidationTooltip.__KONTUR_REACT_UI__ = 'ValidationTooltip';
|
|
18
|
+
ValidationTooltip.displayName = 'ValidationTooltip';
|
|
19
|
+
return ValidationTooltip;
|
|
20
|
+
}(React.Component));
|
|
21
|
+
export { ValidationTooltip };
|
|
22
|
+
//# sourceMappingURL=ValidationTooltip.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ValidationTooltip.js","sourceRoot":"","sources":["../../src/ValidationTooltip.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAwBlE;IAAuC,qCAAuC;IAA9E;;IAsBA,CAAC;IAlBQ,kCAAM,GAAb;QACE,IAAM,KAA4C,IAAI,CAAC,KAAK,EAApD,QAAQ,cAAA,EAAE,GAAG,SAAA,EAAE,KAAK,WAAA,EAAE,MAAM,YAAA,EAAK,IAAI,cAAvC,sCAAyC,CAAa,CAAC;QAE7D,IAAM,SAAS,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAChD,IAAM,KAAK,GAAG,SAAS,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;QAE7E,OAAO,gBAAgB,CAAC,YAAY,CAAC,KAAK,CAAC;YACzC,gBAAgB,CAAC,YAAY,CAAC,KAAK,CAAC;YACpC,gBAAgB,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CACrC,oBAAC,OAAO,aAAC,UAAU,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,EAAE,OAAO,EAAE,aAAa,IAAM,IAAI,GACvG,KAAK,CACE,CACX,CAAC,CAAC,CAAC,CACF,oBAAC,OAAO,aAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,EAAE,OAAO,EAAE,aAAa,IAAM,IAAI,GACpF,QAAQ,CACD,CACX,CAAC;IACJ,CAAC;IApBa,qCAAmB,GAAG,mBAAmB,CAAC;IAC1C,6BAAW,GAAG,mBAAmB,CAAC;IAoBlD,wBAAC;CAAA,AAtBD,CAAuC,KAAK,CAAC,SAAS,GAsBrD;SAtBY,iBAAiB","sourcesContent":["import React from 'react';\n\nimport { ReactUiDetection, Tooltip } from './ReactUiDetection.js';\n\nexport type TooltipPosition =\n | 'top left'\n | 'top center'\n | 'top right'\n | 'bottom left'\n | 'bottom center'\n | 'bottom right'\n | 'left top'\n | 'left middle'\n | 'left bottom'\n | 'right top'\n | 'right middle'\n | 'right bottom';\n\nexport interface ValidationTooltipProps {\n children: React.ReactElement<any>;\n error: boolean;\n pos?: TooltipPosition;\n render?: () => React.ReactNode;\n 'data-tid'?: string;\n}\n\nexport class ValidationTooltip extends React.Component<ValidationTooltipProps> {\n public static __KONTUR_REACT_UI__ = 'ValidationTooltip';\n public static displayName = 'ValidationTooltip';\n\n public render(): React.JSX.Element {\n const { children, pos, error, render, ...rest } = this.props;\n\n const onlyChild = React.Children.only(children);\n const child = onlyChild && onlyChild.props ? onlyChild.props.children : null;\n\n return ReactUiDetection.isRadioGroup(child) ||\n ReactUiDetection.isTokenInput(child) ||\n ReactUiDetection.isSwitcher(child) ? (\n <Tooltip useWrapper={false} pos={pos} render={error ? render : undefined} trigger={'hover&focus'} {...rest}>\n {child}\n </Tooltip>\n ) : (\n <Tooltip pos={pos} render={error ? render : undefined} trigger={'hover&focus'} {...rest}>\n {children}\n </Tooltip>\n );\n }\n}\n"]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { Nullable } from '../typings/Types.js';
|
|
3
|
+
import type { RenderErrorMessage, ValidationBehaviour, ValidationLevel, ValidationWrapperInternalProps } from './ValidationWrapperInternal.js';
|
|
4
|
+
export interface ValidationInfo {
|
|
5
|
+
type?: Nullable<ValidationBehaviour>;
|
|
6
|
+
level?: Nullable<ValidationLevel>;
|
|
7
|
+
message: React.ReactNode;
|
|
8
|
+
independent?: boolean;
|
|
9
|
+
}
|
|
10
|
+
export interface ValidationWrapperProps extends Pick<ValidationWrapperInternalProps, 'data-tid'> {
|
|
11
|
+
children?: React.ReactElement<any>;
|
|
12
|
+
validationInfo: Nullable<ValidationInfo>;
|
|
13
|
+
renderMessage?: Nullable<RenderErrorMessage>;
|
|
14
|
+
}
|
|
15
|
+
export declare class ValidationWrapper extends React.Component<ValidationWrapperProps> {
|
|
16
|
+
static __KONTUR_REACT_UI__: string;
|
|
17
|
+
static displayName: string;
|
|
18
|
+
render(): React.JSX.Element;
|
|
19
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { __extends } from "tslib";
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { tooltip } from './ErrorRenderer.js';
|
|
4
|
+
import { ValidationWrapperInternal } from './ValidationWrapperInternal.js';
|
|
5
|
+
var ValidationWrapper = /** @class */ (function (_super) {
|
|
6
|
+
__extends(ValidationWrapper, _super);
|
|
7
|
+
function ValidationWrapper() {
|
|
8
|
+
return _super !== null && _super.apply(this, arguments) || this;
|
|
9
|
+
}
|
|
10
|
+
ValidationWrapper.prototype.render = function () {
|
|
11
|
+
var _a = this.props, children = _a.children, validationInfo = _a.validationInfo, renderMessage = _a.renderMessage, datTid = _a["data-tid"];
|
|
12
|
+
var validation = validationInfo
|
|
13
|
+
? {
|
|
14
|
+
level: validationInfo.level || 'error',
|
|
15
|
+
behaviour: validationInfo.type || 'lostfocus',
|
|
16
|
+
message: validationInfo.message,
|
|
17
|
+
independent: validationInfo.independent || false,
|
|
18
|
+
}
|
|
19
|
+
: null;
|
|
20
|
+
return (React.createElement(ValidationWrapperInternal, { "data-tid": datTid, errorMessage: renderMessage || tooltip('right top'), validation: validation }, children));
|
|
21
|
+
};
|
|
22
|
+
ValidationWrapper.__KONTUR_REACT_UI__ = 'ValidationWrapper';
|
|
23
|
+
ValidationWrapper.displayName = 'ValidationWrapper';
|
|
24
|
+
return ValidationWrapper;
|
|
25
|
+
}(React.Component));
|
|
26
|
+
export { ValidationWrapper };
|
|
27
|
+
//# sourceMappingURL=ValidationWrapper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ValidationWrapper.js","sourceRoot":"","sources":["../../src/ValidationWrapper.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAQ7C,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAe3E;IAAuC,qCAAuC;IAA9E;;IAyBA,CAAC;IArBQ,kCAAM,GAAb;QACQ,IAAA,KAAkE,IAAI,CAAC,KAAK,EAA1E,QAAQ,cAAA,EAAE,cAAc,oBAAA,EAAE,aAAa,mBAAA,EAAc,MAAM,iBAAe,CAAC;QACnF,IAAM,UAAU,GAAyB,cAAc;YACrD,CAAC,CAAC;gBACE,KAAK,EAAE,cAAc,CAAC,KAAK,IAAI,OAAO;gBACtC,SAAS,EAAE,cAAc,CAAC,IAAI,IAAI,WAAW;gBAC7C,OAAO,EAAE,cAAc,CAAC,OAAO;gBAC/B,WAAW,EAAE,cAAc,CAAC,WAAW,IAAI,KAAK;aACjD;YACH,CAAC,CAAC,IAAI,CAAC;QAET,OAAO,CACL,oBAAC,yBAAyB,gBACd,MAAM,EAChB,YAAY,EAAE,aAAa,IAAI,OAAO,CAAC,WAAW,CAAC,EACnD,UAAU,EAAE,UAAU,IAErB,QAAQ,CACiB,CAC7B,CAAC;IACJ,CAAC;IAvBa,qCAAmB,GAAG,mBAAmB,CAAC;IAC1C,6BAAW,GAAG,mBAAmB,CAAC;IAuBlD,wBAAC;CAAA,AAzBD,CAAuC,KAAK,CAAC,SAAS,GAyBrD;SAzBY,iBAAiB","sourcesContent":["import React from 'react';\n\nimport type { Nullable } from '../typings/Types.js';\n\nimport { tooltip } from './ErrorRenderer.js';\nimport type {\n RenderErrorMessage,\n Validation,\n ValidationBehaviour,\n ValidationLevel,\n ValidationWrapperInternalProps,\n} from './ValidationWrapperInternal.js';\nimport { ValidationWrapperInternal } from './ValidationWrapperInternal.js';\n\nexport interface ValidationInfo {\n type?: Nullable<ValidationBehaviour>;\n level?: Nullable<ValidationLevel>;\n message: React.ReactNode;\n independent?: boolean;\n}\n\nexport interface ValidationWrapperProps extends Pick<ValidationWrapperInternalProps, 'data-tid'> {\n children?: React.ReactElement<any>;\n validationInfo: Nullable<ValidationInfo>;\n renderMessage?: Nullable<RenderErrorMessage>;\n}\n\nexport class ValidationWrapper extends React.Component<ValidationWrapperProps> {\n public static __KONTUR_REACT_UI__ = 'ValidationWrapper';\n public static displayName = 'ValidationWrapper';\n\n public render(): React.JSX.Element {\n const { children, validationInfo, renderMessage, 'data-tid': datTid } = this.props;\n const validation: Nullable<Validation> = validationInfo\n ? {\n level: validationInfo.level || 'error',\n behaviour: validationInfo.type || 'lostfocus',\n message: validationInfo.message,\n independent: validationInfo.independent || false,\n }\n : null;\n\n return (\n <ValidationWrapperInternal\n data-tid={datTid}\n errorMessage={renderMessage || tooltip('right top')}\n validation={validation}\n >\n {children}\n </ValidationWrapperInternal>\n );\n }\n}\n"]}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { Nullable } from '../typings/Types.js';
|
|
3
|
+
import type { ValidationContextType } from './ValidationContextWrapper.js';
|
|
4
|
+
export type ValidationBehaviour = 'immediate' | 'lostfocus' | 'submit';
|
|
5
|
+
export type ValidationLevel = 'error' | 'warning';
|
|
6
|
+
export type TextPosition = 'bottom' | 'right';
|
|
7
|
+
export interface Validation {
|
|
8
|
+
level: ValidationLevel;
|
|
9
|
+
behaviour: ValidationBehaviour;
|
|
10
|
+
message: React.ReactNode;
|
|
11
|
+
independent: boolean;
|
|
12
|
+
}
|
|
13
|
+
export type RenderErrorMessage = (control: React.ReactElement<any>, hasError: boolean, validation: Nullable<Validation>) => React.ReactElement<any>;
|
|
14
|
+
export interface ValidationWrapperInternalProps {
|
|
15
|
+
children?: React.ReactElement<any>;
|
|
16
|
+
validation: Nullable<Validation>;
|
|
17
|
+
errorMessage: RenderErrorMessage;
|
|
18
|
+
'data-tid'?: string;
|
|
19
|
+
}
|
|
20
|
+
interface ValidationWrapperInternalState {
|
|
21
|
+
validation: Nullable<Validation>;
|
|
22
|
+
}
|
|
23
|
+
interface Point {
|
|
24
|
+
x: number;
|
|
25
|
+
y: number;
|
|
26
|
+
}
|
|
27
|
+
export declare class ValidationWrapperInternal extends React.Component<ValidationWrapperInternalProps, ValidationWrapperInternalState> {
|
|
28
|
+
state: ValidationWrapperInternalState;
|
|
29
|
+
isChanging: boolean;
|
|
30
|
+
private child;
|
|
31
|
+
private rootNode;
|
|
32
|
+
static contextType: React.Context<ValidationContextType>;
|
|
33
|
+
context: ValidationContextType;
|
|
34
|
+
componentDidMount(): void;
|
|
35
|
+
componentWillUnmount(): void;
|
|
36
|
+
componentDidUpdate(): void;
|
|
37
|
+
focus(): Promise<void>;
|
|
38
|
+
render(): React.JSX.Element;
|
|
39
|
+
private customRef;
|
|
40
|
+
private setRootNode;
|
|
41
|
+
getRootNode: () => Nullable<Element>;
|
|
42
|
+
getControlPosition(): Nullable<Point>;
|
|
43
|
+
processBlur(): Promise<void>;
|
|
44
|
+
processSubmit(): Promise<void>;
|
|
45
|
+
hasError(): boolean;
|
|
46
|
+
hasWarning(): boolean;
|
|
47
|
+
isIndependent(): boolean;
|
|
48
|
+
private handleBlur;
|
|
49
|
+
private applyValidation;
|
|
50
|
+
private setValidation;
|
|
51
|
+
private getOnBlurValidation;
|
|
52
|
+
private getVisibleValidation;
|
|
53
|
+
}
|
|
54
|
+
export {};
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
import { __awaiter, __extends, __generator } from "tslib";
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import warning from 'warning';
|
|
4
|
+
import { getRootNode, ReactUiDetection } from './ReactUiDetection.js';
|
|
5
|
+
import { isElement } from './utils/utils.js';
|
|
6
|
+
import { smoothScrollIntoView } from './smoothScrollIntoView.js';
|
|
7
|
+
import { getIndependent, getLevel, getType, getVisibleValidation, isEqual } from './ValidationHelper.js';
|
|
8
|
+
import { ValidationContext } from './ValidationContextWrapper.js';
|
|
9
|
+
var ValidationWrapperInternal = /** @class */ (function (_super) {
|
|
10
|
+
__extends(ValidationWrapperInternal, _super);
|
|
11
|
+
function ValidationWrapperInternal() {
|
|
12
|
+
var _this = _super !== null && _super.apply(this, arguments) || this;
|
|
13
|
+
_this.state = {
|
|
14
|
+
validation: null,
|
|
15
|
+
};
|
|
16
|
+
_this.isChanging = false;
|
|
17
|
+
_this.context = _this.context;
|
|
18
|
+
_this.customRef = function (instance) {
|
|
19
|
+
var children = _this.props.children;
|
|
20
|
+
_this.setRootNode(instance);
|
|
21
|
+
var child = children; // todo type or maybe React.Children.only
|
|
22
|
+
if (child && child.ref) {
|
|
23
|
+
if (typeof child.ref === 'function') {
|
|
24
|
+
child.ref(instance);
|
|
25
|
+
}
|
|
26
|
+
if (Object.prototype.hasOwnProperty.call(child.ref, 'current')) {
|
|
27
|
+
child.ref.current = instance;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
_this.child = instance;
|
|
31
|
+
};
|
|
32
|
+
_this.setRootNode = function (element) {
|
|
33
|
+
_this.rootNode = getRootNode(element);
|
|
34
|
+
};
|
|
35
|
+
_this.getRootNode = function () {
|
|
36
|
+
return _this.rootNode;
|
|
37
|
+
};
|
|
38
|
+
return _this;
|
|
39
|
+
}
|
|
40
|
+
ValidationWrapperInternal.prototype.componentDidMount = function () {
|
|
41
|
+
warning(this.context, 'ValidationWrapper should appears as child of ValidationContainer.\n' +
|
|
42
|
+
'https://tech.skbkontur.ru/kontur-ui/?path=/docs/react-ui-validations_displaying-getting-started--docs');
|
|
43
|
+
if (this.context) {
|
|
44
|
+
this.context.register(this);
|
|
45
|
+
}
|
|
46
|
+
if (this.context.isValidationCalled()) {
|
|
47
|
+
this.processSubmit();
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
this.applyValidation(this.props.validation);
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
ValidationWrapperInternal.prototype.componentWillUnmount = function () {
|
|
54
|
+
this.context.unregister(this);
|
|
55
|
+
};
|
|
56
|
+
ValidationWrapperInternal.prototype.componentDidUpdate = function () {
|
|
57
|
+
this.applyValidation(this.props.validation);
|
|
58
|
+
};
|
|
59
|
+
ValidationWrapperInternal.prototype.focus = function () {
|
|
60
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
61
|
+
var htmlElement, _a, disableSmoothScroll, scrollOffset;
|
|
62
|
+
return __generator(this, function (_b) {
|
|
63
|
+
switch (_b.label) {
|
|
64
|
+
case 0:
|
|
65
|
+
htmlElement = this.getRootNode();
|
|
66
|
+
if (!isElement(htmlElement)) return [3 /*break*/, 3];
|
|
67
|
+
_a = this.context.getSettings(), disableSmoothScroll = _a.disableSmoothScroll, scrollOffset = _a.scrollOffset;
|
|
68
|
+
if (!!disableSmoothScroll) return [3 /*break*/, 2];
|
|
69
|
+
return [4 /*yield*/, smoothScrollIntoView(htmlElement, scrollOffset)];
|
|
70
|
+
case 1:
|
|
71
|
+
_b.sent();
|
|
72
|
+
_b.label = 2;
|
|
73
|
+
case 2:
|
|
74
|
+
if (this.child && typeof this.child.focus === 'function') {
|
|
75
|
+
this.child.focus({ withoutOpenDropdown: true });
|
|
76
|
+
}
|
|
77
|
+
_b.label = 3;
|
|
78
|
+
case 3:
|
|
79
|
+
this.isChanging = false;
|
|
80
|
+
return [2 /*return*/];
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
};
|
|
85
|
+
ValidationWrapperInternal.prototype.render = function () {
|
|
86
|
+
var _this = this;
|
|
87
|
+
var _a = this.props, children = _a.children, dataTid = _a["data-tid"];
|
|
88
|
+
var validation = this.state.validation;
|
|
89
|
+
var clonedChild = children ? (React.cloneElement(children, {
|
|
90
|
+
ref: this.customRef,
|
|
91
|
+
error: !this.isChanging && getLevel(validation) === 'error',
|
|
92
|
+
warning: !this.isChanging && getLevel(validation) === 'warning',
|
|
93
|
+
onBlur: function () {
|
|
94
|
+
var _a;
|
|
95
|
+
var args = [];
|
|
96
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
97
|
+
args[_i] = arguments[_i];
|
|
98
|
+
}
|
|
99
|
+
_this.handleBlur();
|
|
100
|
+
if (children.props && children.props.onBlur) {
|
|
101
|
+
(_a = children.props).onBlur.apply(_a, args);
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
onChange: function () {
|
|
105
|
+
var _a;
|
|
106
|
+
var args = [];
|
|
107
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
108
|
+
args[_i] = arguments[_i];
|
|
109
|
+
}
|
|
110
|
+
_this.isChanging = true;
|
|
111
|
+
if (children.props && children.props.onChange) {
|
|
112
|
+
(_a = children.props).onChange.apply(_a, args);
|
|
113
|
+
}
|
|
114
|
+
},
|
|
115
|
+
onValueChange: function () {
|
|
116
|
+
var _a;
|
|
117
|
+
var args = [];
|
|
118
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
119
|
+
args[_i] = arguments[_i];
|
|
120
|
+
}
|
|
121
|
+
_this.isChanging = true;
|
|
122
|
+
if (ReactUiDetection.isSelectionControl(children)) {
|
|
123
|
+
_this.setValidation(null);
|
|
124
|
+
}
|
|
125
|
+
if (children.props && children.props.onValueChange) {
|
|
126
|
+
(_a = children.props).onValueChange.apply(_a, args);
|
|
127
|
+
}
|
|
128
|
+
},
|
|
129
|
+
})) : (React.createElement("span", { ref: this.setRootNode }));
|
|
130
|
+
if (ReactUiDetection.isComboBox(clonedChild)) {
|
|
131
|
+
clonedChild = React.cloneElement(clonedChild, {
|
|
132
|
+
onInputValueChange: function () {
|
|
133
|
+
var _a;
|
|
134
|
+
var args = [];
|
|
135
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
136
|
+
args[_i] = arguments[_i];
|
|
137
|
+
}
|
|
138
|
+
_this.isChanging = true;
|
|
139
|
+
_this.forceUpdate();
|
|
140
|
+
if (children && children.props && children.props.onInputValueChange) {
|
|
141
|
+
return (_a = children.props).onInputValueChange.apply(_a, args);
|
|
142
|
+
}
|
|
143
|
+
},
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
return React.cloneElement(this.props.errorMessage(React.createElement("div", { style: { display: 'inline' } }, clonedChild), !!validation, validation), {
|
|
147
|
+
'data-tid': dataTid,
|
|
148
|
+
});
|
|
149
|
+
};
|
|
150
|
+
ValidationWrapperInternal.prototype.getControlPosition = function () {
|
|
151
|
+
var htmlElement = this.getRootNode();
|
|
152
|
+
if (isElement(htmlElement)) {
|
|
153
|
+
var rect = htmlElement.getBoundingClientRect();
|
|
154
|
+
return { x: rect.top, y: rect.left };
|
|
155
|
+
}
|
|
156
|
+
return null;
|
|
157
|
+
};
|
|
158
|
+
ValidationWrapperInternal.prototype.processBlur = function () {
|
|
159
|
+
var touched = this.isChanging;
|
|
160
|
+
this.isChanging = false;
|
|
161
|
+
var validation = this.getOnBlurValidation(touched);
|
|
162
|
+
return this.setValidation(validation);
|
|
163
|
+
};
|
|
164
|
+
ValidationWrapperInternal.prototype.processSubmit = function () {
|
|
165
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
166
|
+
return __generator(this, function (_a) {
|
|
167
|
+
this.isChanging = false;
|
|
168
|
+
return [2 /*return*/, this.setValidation(this.props.validation)];
|
|
169
|
+
});
|
|
170
|
+
});
|
|
171
|
+
};
|
|
172
|
+
ValidationWrapperInternal.prototype.hasError = function () {
|
|
173
|
+
return getLevel(this.state.validation) === 'error';
|
|
174
|
+
};
|
|
175
|
+
ValidationWrapperInternal.prototype.hasWarning = function () {
|
|
176
|
+
return getLevel(this.state.validation) === 'warning';
|
|
177
|
+
};
|
|
178
|
+
ValidationWrapperInternal.prototype.isIndependent = function () {
|
|
179
|
+
return getIndependent(this.state.validation || this.props.validation) === true;
|
|
180
|
+
};
|
|
181
|
+
ValidationWrapperInternal.prototype.handleBlur = function () {
|
|
182
|
+
var _this = this;
|
|
183
|
+
setTimeout(function () {
|
|
184
|
+
_this.processBlur();
|
|
185
|
+
if (!_this.isIndependent()) {
|
|
186
|
+
_this.context.instanceProcessBlur(_this);
|
|
187
|
+
}
|
|
188
|
+
_this.setState({});
|
|
189
|
+
});
|
|
190
|
+
};
|
|
191
|
+
ValidationWrapperInternal.prototype.applyValidation = function (actual) {
|
|
192
|
+
var visible = this.getVisibleValidation(actual);
|
|
193
|
+
this.setValidation(visible);
|
|
194
|
+
};
|
|
195
|
+
ValidationWrapperInternal.prototype.setValidation = function (validation) {
|
|
196
|
+
var _this = this;
|
|
197
|
+
var current = this.state.validation;
|
|
198
|
+
if (current === validation) {
|
|
199
|
+
return Promise.resolve();
|
|
200
|
+
}
|
|
201
|
+
return new Promise(function (resolve) {
|
|
202
|
+
_this.setState({ validation: validation }, function () {
|
|
203
|
+
if (Boolean(current) !== Boolean(validation)) {
|
|
204
|
+
_this.context.onValidationUpdated(_this, !validation);
|
|
205
|
+
}
|
|
206
|
+
resolve();
|
|
207
|
+
});
|
|
208
|
+
});
|
|
209
|
+
};
|
|
210
|
+
ValidationWrapperInternal.prototype.getOnBlurValidation = function (touched) {
|
|
211
|
+
var actual = this.props.validation;
|
|
212
|
+
if (getType(actual) === 'submit') {
|
|
213
|
+
var visible = this.state.validation;
|
|
214
|
+
return !touched && getType(visible) === 'submit' ? visible : null;
|
|
215
|
+
}
|
|
216
|
+
return actual;
|
|
217
|
+
};
|
|
218
|
+
ValidationWrapperInternal.prototype.getVisibleValidation = function (actual) {
|
|
219
|
+
var visible = this.state.validation;
|
|
220
|
+
if (isEqual(visible, actual)) {
|
|
221
|
+
return visible;
|
|
222
|
+
}
|
|
223
|
+
var changing = this.context.isAnyWrapperInChangingMode();
|
|
224
|
+
return getVisibleValidation(visible, actual, changing);
|
|
225
|
+
};
|
|
226
|
+
ValidationWrapperInternal.contextType = ValidationContext;
|
|
227
|
+
return ValidationWrapperInternal;
|
|
228
|
+
}(React.Component));
|
|
229
|
+
export { ValidationWrapperInternal };
|
|
230
|
+
//# sourceMappingURL=ValidationWrapperInternal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ValidationWrapperInternal.js","sourceRoot":"","sources":["../../src/ValidationWrapperInternal.tsx"],"names":[],"mappings":"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","sourcesContent":["import type { ReactInstance } from 'react';\nimport React from 'react';\nimport warning from 'warning';\n\nimport type { Nullable } from '../typings/Types.js';\n\nimport { getRootNode, ReactUiDetection } from './ReactUiDetection.js';\nimport { isElement } from './utils/utils.js';\nimport { smoothScrollIntoView } from './smoothScrollIntoView.js';\nimport { getIndependent, getLevel, getType, getVisibleValidation, isEqual } from './ValidationHelper.js';\nimport type { ValidationContextType } from './ValidationContextWrapper.js';\nimport { ValidationContext } from './ValidationContextWrapper.js';\n\nexport type ValidationBehaviour = 'immediate' | 'lostfocus' | 'submit';\n\nexport type ValidationLevel = 'error' | 'warning';\n\nexport type TextPosition = 'bottom' | 'right';\n\nexport interface Validation {\n level: ValidationLevel;\n behaviour: ValidationBehaviour;\n message: React.ReactNode;\n independent: boolean;\n}\n\nexport type RenderErrorMessage = (\n control: React.ReactElement<any>,\n hasError: boolean,\n validation: Nullable<Validation>,\n) => React.ReactElement<any>;\n\nexport interface ValidationWrapperInternalProps {\n children?: React.ReactElement<any>;\n validation: Nullable<Validation>;\n errorMessage: RenderErrorMessage;\n 'data-tid'?: string;\n}\n\ninterface ValidationWrapperInternalState {\n validation: Nullable<Validation>;\n}\n\ninterface Point {\n x: number;\n y: number;\n}\n\nexport class ValidationWrapperInternal extends React.Component<\n ValidationWrapperInternalProps,\n ValidationWrapperInternalState\n> {\n public state: ValidationWrapperInternalState = {\n validation: null,\n };\n\n public isChanging = false;\n private child: any; // todo type\n private rootNode: Nullable<Element>;\n\n public static contextType = ValidationContext;\n public context: ValidationContextType = this.context;\n\n public componentDidMount() {\n warning(\n this.context,\n 'ValidationWrapper should appears as child of ValidationContainer.\\n' +\n 'https://tech.skbkontur.ru/kontur-ui/?path=/docs/react-ui-validations_displaying-getting-started--docs',\n );\n if (this.context) {\n this.context.register(this);\n }\n if (this.context.isValidationCalled()) {\n this.processSubmit();\n } else {\n this.applyValidation(this.props.validation);\n }\n }\n\n public componentWillUnmount() {\n this.context.unregister(this);\n }\n\n public componentDidUpdate() {\n this.applyValidation(this.props.validation);\n }\n\n public async focus(): Promise<void> {\n const htmlElement = this.getRootNode();\n if (isElement(htmlElement)) {\n const { disableSmoothScroll, scrollOffset } = this.context.getSettings();\n if (!disableSmoothScroll) {\n await smoothScrollIntoView(htmlElement, scrollOffset);\n }\n if (this.child && typeof this.child.focus === 'function') {\n this.child.focus({ withoutOpenDropdown: true });\n }\n }\n this.isChanging = false;\n }\n\n public render(): React.JSX.Element {\n const { children, 'data-tid': dataTid } = this.props;\n const { validation } = this.state;\n\n let clonedChild: React.ReactElement<any> = children ? (\n React.cloneElement(children, {\n ref: this.customRef,\n error: !this.isChanging && getLevel(validation) === 'error',\n warning: !this.isChanging && getLevel(validation) === 'warning',\n onBlur: (...args: any[]) => {\n this.handleBlur();\n if (children.props && children.props.onBlur) {\n children.props.onBlur(...args);\n }\n },\n onChange: (...args: any[]) => {\n this.isChanging = true;\n if (children.props && children.props.onChange) {\n children.props.onChange(...args);\n }\n },\n onValueChange: (...args: any[]) => {\n this.isChanging = true;\n\n if (ReactUiDetection.isSelectionControl(children)) {\n this.setValidation(null);\n }\n\n if (children.props && children.props.onValueChange) {\n children.props.onValueChange(...args);\n }\n },\n })\n ) : (\n <span ref={this.setRootNode} />\n );\n if (ReactUiDetection.isComboBox(clonedChild)) {\n clonedChild = React.cloneElement(clonedChild, {\n onInputValueChange: (...args: any[]) => {\n this.isChanging = true;\n this.forceUpdate();\n if (children && children.props && children.props.onInputValueChange) {\n return children.props.onInputValueChange(...args);\n }\n },\n });\n }\n\n return React.cloneElement(\n this.props.errorMessage(<div style={{ display: 'inline' }}>{clonedChild}</div>, !!validation, validation),\n {\n 'data-tid': dataTid,\n },\n );\n }\n\n private customRef = (instance: Nullable<ReactInstance>) => {\n const { children } = this.props;\n\n this.setRootNode(instance);\n const child = children as any; // todo type or maybe React.Children.only\n if (child && child.ref) {\n if (typeof child.ref === 'function') {\n child.ref(instance);\n }\n if (Object.prototype.hasOwnProperty.call(child.ref, 'current')) {\n child.ref.current = instance;\n }\n }\n this.child = instance;\n };\n\n private setRootNode = (element: Nullable<ReactInstance>) => {\n this.rootNode = getRootNode(element);\n };\n\n public getRootNode = (): Nullable<Element> => {\n return this.rootNode;\n };\n\n public getControlPosition(): Nullable<Point> {\n const htmlElement = this.getRootNode();\n if (isElement(htmlElement)) {\n const rect = htmlElement.getBoundingClientRect();\n return { x: rect.top, y: rect.left };\n }\n return null;\n }\n\n public processBlur(): Promise<void> {\n const touched = this.isChanging;\n this.isChanging = false;\n const validation = this.getOnBlurValidation(touched);\n return this.setValidation(validation);\n }\n\n public async processSubmit(): Promise<void> {\n this.isChanging = false;\n return this.setValidation(this.props.validation);\n }\n\n public hasError(): boolean {\n return getLevel(this.state.validation) === 'error';\n }\n\n public hasWarning(): boolean {\n return getLevel(this.state.validation) === 'warning';\n }\n\n public isIndependent(): boolean {\n return getIndependent(this.state.validation || this.props.validation) === true;\n }\n\n private handleBlur() {\n setTimeout(() => {\n this.processBlur();\n if (!this.isIndependent()) {\n this.context.instanceProcessBlur(this);\n }\n this.setState({});\n });\n }\n\n private applyValidation(actual: Nullable<Validation>) {\n const visible = this.getVisibleValidation(actual);\n this.setValidation(visible);\n }\n\n private setValidation(validation: Nullable<Validation>): Promise<void> {\n const current = this.state.validation;\n\n if (current === validation) {\n return Promise.resolve();\n }\n\n return new Promise((resolve) => {\n this.setState({ validation }, () => {\n if (Boolean(current) !== Boolean(validation)) {\n this.context.onValidationUpdated(this, !validation);\n }\n resolve();\n });\n });\n }\n\n private getOnBlurValidation(touched: boolean): Nullable<Validation> {\n const actual = this.props.validation;\n if (getType(actual) === 'submit') {\n const visible = this.state.validation;\n return !touched && getType(visible) === 'submit' ? visible : null;\n }\n return actual;\n }\n\n private getVisibleValidation(actual: Nullable<Validation>): Nullable<Validation> {\n const visible = this.state.validation;\n if (isEqual(visible, actual)) {\n return visible;\n }\n const changing = this.context.isAnyWrapperInChangingMode();\n return getVisibleValidation(visible, actual, changing);\n }\n}\n"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
type NonNullableRecursive<T> = {
|
|
2
|
+
[K in keyof T]-?: T[K] extends Record<string, unknown> ? NonNullable<NonNullableRecursive<T[K]>> : NonNullable<T[K]>;
|
|
3
|
+
};
|
|
4
|
+
export type LambdaPath<T, TChild> = (x: NonNullable<NonNullableRecursive<T>>) => TChild;
|
|
5
|
+
export declare function extractPath(lambda: string): string;
|
|
6
|
+
export declare function extractTokens(path: string): string[];
|
|
7
|
+
export declare class PathTokensCache {
|
|
8
|
+
private readonly cache;
|
|
9
|
+
getOrAdd<T, TChild>(lambdaPath: LambdaPath<T, TChild>): string[];
|
|
10
|
+
has<T, TChild>(lambdaPath: LambdaPath<T, TChild>): boolean;
|
|
11
|
+
get size(): number;
|
|
12
|
+
}
|
|
13
|
+
export {};
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import warning from 'warning';
|
|
2
|
+
var classicFunctionRegEx = /^\s*function\s*\(\s*([A-Za-z0-9_$]+)\s*\)\s*\{\s*(?:(?:"use strict"|'use strict');?)?\s*return\s+\1\s*([.[].*?)?\s*;?\s*\}\s*$/;
|
|
3
|
+
var arrowFunctionRegEx = /^\s*\(?\s*([A-Za-z0-9_$]+)\s*\)?\s*=>\s*\1\s*([.[].*?)?\s*$/;
|
|
4
|
+
export function extractPath(lambda) {
|
|
5
|
+
var match = classicFunctionRegEx.exec(lambda) || arrowFunctionRegEx.exec(lambda);
|
|
6
|
+
if (match && match.length === 3) {
|
|
7
|
+
return (match[2] || '').replace(/(^\.\s*)/g, '');
|
|
8
|
+
}
|
|
9
|
+
warning(false, "Not supported or invalid path: <".concat(lambda, ">"));
|
|
10
|
+
return '';
|
|
11
|
+
}
|
|
12
|
+
export function extractTokens(path) {
|
|
13
|
+
return path.split(/[\s.[\]]+/g).filter(function (x) { return x; });
|
|
14
|
+
}
|
|
15
|
+
var PathTokensCache = /** @class */ (function () {
|
|
16
|
+
function PathTokensCache() {
|
|
17
|
+
this.cache = new Map();
|
|
18
|
+
}
|
|
19
|
+
PathTokensCache.prototype.getOrAdd = function (lambdaPath) {
|
|
20
|
+
var lambdaString = lambdaPath.toString();
|
|
21
|
+
if (!this.cache.has(lambdaString)) {
|
|
22
|
+
var path = extractPath(lambdaString);
|
|
23
|
+
var tokens = extractTokens(path);
|
|
24
|
+
this.cache.set(lambdaString, tokens);
|
|
25
|
+
}
|
|
26
|
+
return this.cache.get(lambdaString);
|
|
27
|
+
};
|
|
28
|
+
PathTokensCache.prototype.has = function (lambdaPath) {
|
|
29
|
+
var lambdaString = lambdaPath.toString();
|
|
30
|
+
return this.cache.has(lambdaString);
|
|
31
|
+
};
|
|
32
|
+
Object.defineProperty(PathTokensCache.prototype, "size", {
|
|
33
|
+
get: function () {
|
|
34
|
+
return this.cache.size;
|
|
35
|
+
},
|
|
36
|
+
enumerable: false,
|
|
37
|
+
configurable: true
|
|
38
|
+
});
|
|
39
|
+
return PathTokensCache;
|
|
40
|
+
}());
|
|
41
|
+
export { PathTokensCache };
|
|
42
|
+
//# sourceMappingURL=PathHelper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PathHelper.js","sourceRoot":"","sources":["../../../src/Validations/PathHelper.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAE9B,IAAM,oBAAoB,GACxB,gIAAgI,CAAC;AACnI,IAAM,kBAAkB,GAAG,6DAA6D,CAAC;AAQzF,MAAM,UAAU,WAAW,CAAC,MAAc;IACxC,IAAM,KAAK,GAAG,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACnF,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IACnD,CAAC;IAED,OAAO,CAAC,KAAK,EAAE,0CAAmC,MAAM,MAAG,CAAC,CAAC;IAC7D,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,UAAC,CAAC,IAAK,OAAA,CAAC,EAAD,CAAC,CAAC,CAAC;AACnD,CAAC;AAED;IAAA;QACmB,UAAK,GAAG,IAAI,GAAG,EAAoB,CAAC;IAsBvD,CAAC;IApBQ,kCAAQ,GAAf,UAA2B,UAAiC;QAC1D,IAAM,YAAY,GAAG,UAAU,CAAC,QAAQ,EAAE,CAAC;QAE3C,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;YAClC,IAAM,IAAI,GAAG,WAAW,CAAC,YAAY,CAAC,CAAC;YACvC,IAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;YACnC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QACvC,CAAC;QAED,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAa,CAAC;IAClD,CAAC;IAEM,6BAAG,GAAV,UAAsB,UAAiC;QACrD,IAAM,YAAY,GAAG,UAAU,CAAC,QAAQ,EAAE,CAAC;QAC3C,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IACtC,CAAC;IAED,sBAAW,iCAAI;aAAf;YACE,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;QACzB,CAAC;;;OAAA;IACH,sBAAC;AAAD,CAAC,AAvBD,IAuBC","sourcesContent":["import warning from 'warning';\n\nconst classicFunctionRegEx =\n /^\\s*function\\s*\\(\\s*([A-Za-z0-9_$]+)\\s*\\)\\s*\\{\\s*(?:(?:\"use strict\"|'use strict');?)?\\s*return\\s+\\1\\s*([.[].*?)?\\s*;?\\s*\\}\\s*$/;\nconst arrowFunctionRegEx = /^\\s*\\(?\\s*([A-Za-z0-9_$]+)\\s*\\)?\\s*=>\\s*\\1\\s*([.[].*?)?\\s*$/;\n\ntype NonNullableRecursive<T> = {\n [K in keyof T]-?: T[K] extends Record<string, unknown> ? NonNullable<NonNullableRecursive<T[K]>> : NonNullable<T[K]>;\n};\n\nexport type LambdaPath<T, TChild> = (x: NonNullable<NonNullableRecursive<T>>) => TChild;\n\nexport function extractPath(lambda: string): string {\n const match = classicFunctionRegEx.exec(lambda) || arrowFunctionRegEx.exec(lambda);\n if (match && match.length === 3) {\n return (match[2] || '').replace(/(^\\.\\s*)/g, '');\n }\n\n warning(false, `Not supported or invalid path: <${lambda}>`);\n return '';\n}\n\nexport function extractTokens(path: string): string[] {\n return path.split(/[\\s.[\\]]+/g).filter((x) => x);\n}\n\nexport class PathTokensCache {\n private readonly cache = new Map<string, string[]>();\n\n public getOrAdd<T, TChild>(lambdaPath: LambdaPath<T, TChild>): string[] {\n const lambdaString = lambdaPath.toString();\n\n if (!this.cache.has(lambdaString)) {\n const path = extractPath(lambdaString);\n const tokens = extractTokens(path);\n this.cache.set(lambdaString, tokens);\n }\n\n return this.cache.get(lambdaString) as string[];\n }\n\n public has<T, TChild>(lambdaPath: LambdaPath<T, TChild>): boolean {\n const lambdaString = lambdaPath.toString();\n return this.cache.has(lambdaString);\n }\n\n public get size(): number {\n return this.cache.size;\n }\n}\n"]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Nullable } from '../../typings/Types.js';
|
|
2
|
+
import type { ValidationInfo } from '../ValidationWrapper.js';
|
|
3
|
+
import type { ValidationBuilder } from './ValidationBuilder.js';
|
|
4
|
+
export interface ValidationNode<T> {
|
|
5
|
+
validation: Nullable<ValidationInfo>;
|
|
6
|
+
children: Nullable<{
|
|
7
|
+
[K in keyof T]: ValidationNode<T[K]>;
|
|
8
|
+
}>;
|
|
9
|
+
}
|
|
10
|
+
export type ValidationRule<TRoot, T> = (builder: ValidationBuilder<TRoot, T>, value: T) => void;
|
|
11
|
+
export type ItemValidationRule<TRoot, T> = (builder: ValidationBuilder<TRoot, T>, value: T, index: number, array: T[]) => void;
|
|
12
|
+
export type RootValidationRule<T> = ValidationRule<T, T>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Types.js","sourceRoot":"","sources":["../../../src/Validations/Types.ts"],"names":[],"mappings":"","sourcesContent":["import type { Nullable } from '../../typings/Types.js';\nimport type { ValidationInfo } from '../ValidationWrapper.js';\n\nimport type { ValidationBuilder } from './ValidationBuilder.js';\n\nexport interface ValidationNode<T> {\n validation: Nullable<ValidationInfo>;\n children: Nullable<{ [K in keyof T]: ValidationNode<T[K]> }>;\n}\n\nexport type ValidationRule<TRoot, T> = (builder: ValidationBuilder<TRoot, T>, value: T) => void;\nexport type ItemValidationRule<TRoot, T> = (\n builder: ValidationBuilder<TRoot, T>,\n value: T,\n index: number,\n array: T[],\n) => void;\nexport type RootValidationRule<T> = ValidationRule<T, T>;\n"]}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type React from 'react';
|
|
2
|
+
import type { ValidationBehaviour, ValidationLevel } from '../ValidationWrapperInternal.js';
|
|
3
|
+
import type { ValidationInfo } from '../ValidationWrapper.js';
|
|
4
|
+
import type { LambdaPath, PathTokensCache } from './PathHelper.js';
|
|
5
|
+
import type { ValidationWriter } from './ValidationWriter.js';
|
|
6
|
+
import type { ItemValidationRule, ValidationRule } from './Types.js';
|
|
7
|
+
export declare class ValidationBuilder<TRoot, T> {
|
|
8
|
+
private readonly writer;
|
|
9
|
+
private readonly tokens;
|
|
10
|
+
private readonly path;
|
|
11
|
+
private readonly data;
|
|
12
|
+
constructor(writer: ValidationWriter<TRoot>, tokens: PathTokensCache, path: string[], data: T);
|
|
13
|
+
prop<TChild>(lambdaPath: LambdaPath<T, TChild>, rule: ValidationRule<TRoot, TChild>): void;
|
|
14
|
+
array<TChild>(lambdaPath: LambdaPath<T, TChild[]>, rule: ItemValidationRule<TRoot, TChild>): void;
|
|
15
|
+
invalid(isInvalid: (value: T) => boolean, validationInfo: ValidationInfo): void;
|
|
16
|
+
invalid(isInvalid: (value: T) => boolean, message: React.ReactNode, type?: ValidationBehaviour, level?: ValidationLevel, independent?: boolean): void;
|
|
17
|
+
private getPathInfo;
|
|
18
|
+
}
|