@skbkontur/react-ui-validations 1.5.7 → 1.6.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/index.d.ts +256 -263
  2. package/index.js +78 -53
  3. package/package.json +1 -1
package/index.d.ts CHANGED
@@ -1,263 +1,256 @@
1
- // Generated by dts-bundle v0.7.3
2
- // Dependencies for this module:
3
- // ../../react
4
- // ../../prop-types
5
-
6
- declare module '@skbkontur/react-ui-validations' {
7
- import { text, tooltip } from '@skbkontur/react-ui-validations/src/ErrorRenderer';
8
- import { ValidationContainer, ValidationContainerProps } from '@skbkontur/react-ui-validations/src/ValidationContainer';
9
- import { ValidationContext, ValidationContextProps } from '@skbkontur/react-ui-validations/src/ValidationContext';
10
- import { TooltipPosition, ValidationTooltip, ValidationTooltipProps } from '@skbkontur/react-ui-validations/src/ValidationTooltip';
11
- import { RenderErrorMessage, Validation, ValidationBehaviour } from '@skbkontur/react-ui-validations/src/ValidationWrapperInternal';
12
- import { ValidationWrapper, ValidationInfo, ValidationWrapperProps } from '@skbkontur/react-ui-validations/src/ValidationWrapper';
13
- export { ValidationContainer, ValidationContainerProps, ValidationContext, ValidationContextProps, ValidationWrapper as ValidationWrapperV1, ValidationWrapperProps as ValidationWrapperV1Props, RenderErrorMessage, ValidationBehaviour, Validation, ValidationWrapper, ValidationWrapperProps, ValidationInfo, ValidationTooltip, ValidationTooltipProps, TooltipPosition, tooltip, text, };
14
- export * from '@skbkontur/react-ui-validations/src/Validations';
15
- }
16
-
17
- declare module '@skbkontur/react-ui-validations/src/ErrorRenderer' {
18
- import { TooltipPosition } from '@skbkontur/react-ui-validations/src/ValidationTooltip';
19
- import { RenderErrorMessage } from '@skbkontur/react-ui-validations/src/ValidationWrapperInternal';
20
- export function tooltip(pos: TooltipPosition): RenderErrorMessage;
21
- export function text(pos?: 'bottom' | 'right'): RenderErrorMessage;
22
- }
23
-
24
- declare module '@skbkontur/react-ui-validations/src/ValidationContainer' {
25
- import React from 'react';
26
- import { Nullable } from '@skbkontur/react-ui-validations/typings/Types';
27
- export interface ScrollOffset {
28
- top?: number;
29
- bottom?: number;
30
- }
31
- export interface ValidationContainerProps {
32
- children?: React.ReactNode;
33
- onValidationUpdated?: (isValid?: Nullable<boolean>) => void;
34
- scrollOffset?: number | ScrollOffset;
35
- disableSmoothScroll: boolean;
36
- }
37
- export class ValidationContainer extends React.Component<ValidationContainerProps> {
38
- static __KONTUR_REACT_UI__: string;
39
- static defaultProps: {
40
- disableSmoothScroll: boolean;
41
- };
42
- static propTypes: {
43
- scrollOffset(props: ValidationContainerProps, propName: keyof ValidationContainerProps, componentName: string): Error | undefined;
44
- };
45
- submit(withoutFocus?: boolean): Promise<void>;
46
- validate(withoutFocus?: boolean): Promise<boolean>;
47
- render(): JSX.Element;
48
- }
49
- }
50
-
51
- declare module '@skbkontur/react-ui-validations/src/ValidationContext' {
52
- import * as PropTypes from 'prop-types';
53
- import React from 'react';
54
- import { ValidationWrapperInternal } from '@skbkontur/react-ui-validations/src/ValidationWrapperInternal';
55
- import { ScrollOffset } from '@skbkontur/react-ui-validations/src/ValidationContainer';
56
- export interface ValidationContextSettings {
57
- scrollOffset: ScrollOffset;
58
- disableSmoothScroll: boolean;
59
- }
60
- export interface IValidationContext {
61
- register(wrapper: ValidationWrapperInternal): void;
62
- unregister(wrapper: ValidationWrapperInternal): void;
63
- instanceProcessBlur(wrapper: ValidationWrapperInternal): void;
64
- onValidationUpdated(wrapper: ValidationWrapperInternal, isValid: boolean): void;
65
- getSettings(): ValidationContextSettings;
66
- isAnyWrapperInChangingMode(): boolean;
67
- }
68
- export interface ValidationContextProps {
69
- children?: React.ReactNode;
70
- onValidationUpdated?: (isValid?: boolean) => void;
71
- scrollOffset?: number | ScrollOffset;
72
- disableSmoothScroll: boolean;
73
- }
74
- export class ValidationContext extends React.Component<ValidationContextProps> implements IValidationContext {
75
- static childContextTypes: {
76
- validationContext: PropTypes.Requireable<any>;
77
- };
78
- childWrappers: ValidationWrapperInternal[];
79
- getChildContext(): {
80
- validationContext: IValidationContext;
81
- };
82
- getSettings(): ValidationContextSettings;
83
- register(wrapper: ValidationWrapperInternal): void;
84
- unregister(wrapper: ValidationWrapperInternal): void;
85
- instanceProcessBlur(instance: ValidationWrapperInternal): void;
86
- onValidationUpdated(wrapper: ValidationWrapperInternal, isValid?: boolean): void;
87
- isAnyWrapperInChangingMode(): boolean;
88
- onValidationRemoved(): void;
89
- getChildWrappersSortedByPosition(): ValidationWrapperInternal[];
90
- validate(withoutFocus: boolean): Promise<boolean>;
91
- render(): JSX.Element;
92
- }
93
- }
94
-
95
- declare module '@skbkontur/react-ui-validations/src/ValidationTooltip' {
96
- import React from 'react';
97
- 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';
98
- export interface ValidationTooltipProps {
99
- children: React.ReactElement<any>;
100
- error: boolean;
101
- pos?: TooltipPosition;
102
- render?: () => React.ReactNode;
103
- }
104
- export class ValidationTooltip extends React.Component<ValidationTooltipProps> {
105
- render(): JSX.Element;
106
- }
107
- }
108
-
109
- declare module '@skbkontur/react-ui-validations/src/ValidationWrapperInternal' {
110
- import * as PropTypes from 'prop-types';
111
- import React from 'react';
112
- import { Nullable } from '@skbkontur/react-ui-validations/typings/Types';
113
- import { IValidationContext } from '@skbkontur/react-ui-validations/src/ValidationContext';
114
- export type ValidationBehaviour = 'immediate' | 'lostfocus' | 'submit';
115
- export type ValidationLevel = 'error' | 'warning';
116
- export interface Validation {
117
- level: ValidationLevel;
118
- behaviour: ValidationBehaviour;
119
- message: React.ReactNode;
120
- }
121
- export type RenderErrorMessage = (control: React.ReactElement<any>, hasError: boolean, validation: Nullable<Validation>) => React.ReactElement<any>;
122
- export interface ValidationWrapperInternalProps {
123
- children?: React.ReactElement<any>;
124
- validation: Nullable<Validation>;
125
- errorMessage: RenderErrorMessage;
126
- }
127
- interface ValidationWrapperInternalState {
128
- validation: Nullable<Validation>;
129
- }
130
- interface Point {
131
- x: number;
132
- y: number;
133
- }
134
- export class ValidationWrapperInternal extends React.Component<ValidationWrapperInternalProps, ValidationWrapperInternalState> {
135
- static contextTypes: {
136
- validationContext: PropTypes.Requireable<any>;
137
- };
138
- state: ValidationWrapperInternalState;
139
- context: {
140
- validationContext: IValidationContext;
141
- };
142
- isChanging: boolean;
143
- UNSAFE_componentWillMount(): void;
144
- componentDidMount(): void;
145
- componentWillUnmount(): void;
146
- UNSAFE_componentWillReceiveProps(nextProps: ValidationWrapperInternalProps): void;
147
- focus(): Promise<void>;
148
- render(): React.ReactElement<any, string | ((props: any) => React.ReactElement<any, any> | null) | (new (props: any) => React.Component<any, any, any>)>;
149
- getControlPosition(): Nullable<Point>;
150
- processBlur(): Promise<void>;
151
- processSubmit(): Promise<void>;
152
- hasError(): boolean;
153
- }
154
- export {};
155
- }
156
-
157
- declare module '@skbkontur/react-ui-validations/src/ValidationWrapper' {
158
- import React from 'react';
159
- import { Nullable } from '@skbkontur/react-ui-validations/typings/Types';
160
- import { RenderErrorMessage, ValidationBehaviour, ValidationLevel } from '@skbkontur/react-ui-validations/src/ValidationWrapperInternal';
161
- export interface ValidationInfo {
162
- type?: Nullable<ValidationBehaviour>;
163
- level?: Nullable<ValidationLevel>;
164
- message: React.ReactNode;
165
- }
166
- export interface ValidationWrapperProps {
167
- children?: React.ReactElement<any>;
168
- validationInfo: Nullable<ValidationInfo>;
169
- renderMessage?: Nullable<RenderErrorMessage>;
170
- }
171
- export class ValidationWrapper extends React.Component<ValidationWrapperProps> {
172
- static __KONTUR_REACT_UI__: string;
173
- render(): JSX.Element;
174
- }
175
- }
176
-
177
- declare module '@skbkontur/react-ui-validations/src/Validations' {
178
- import { ValidationBuilder } from '@skbkontur/react-ui-validations/src/Validations/ValidationBuilder';
179
- import { RootValidationRule, ValidationRule, ItemValidationRule } from '@skbkontur/react-ui-validations/src/Validations/Types';
180
- import { ValidationReader } from '@skbkontur/react-ui-validations/src/Validations/ValidationReader';
181
- export type Validator<T> = (value: T) => ValidationReader<T>;
182
- export function createValidator<T>(rule: RootValidationRule<T>): Validator<T>;
183
- export { ValidationReader, ValidationBuilder, RootValidationRule, ValidationRule, ItemValidationRule };
184
- }
185
-
186
- declare module '@skbkontur/react-ui-validations/typings/Types' {
187
- export type Nullable<T> = T | null | undefined;
188
- export type Omit<T extends object, K extends keyof T> = Pick<T, Exclude<keyof T, K>>;
189
- export type ExtractItem<T> = T extends Array<infer TItem> ? TItem : never;
190
- }
191
-
192
- declare module '@skbkontur/react-ui-validations/src/Validations/ValidationBuilder' {
193
- import React from 'react';
194
- import { ValidationBehaviour, ValidationLevel } from '@skbkontur/react-ui-validations/src/ValidationWrapperInternal';
195
- import { LambdaPath, PathTokensCache } from '@skbkontur/react-ui-validations/src/Validations/PathHelper';
196
- import { ValidationWriter } from '@skbkontur/react-ui-validations/src/Validations/ValidationWriter';
197
- import { ItemValidationRule, ValidationRule } from '@skbkontur/react-ui-validations/src/Validations/Types';
198
- export class ValidationBuilder<TRoot, T> {
199
- constructor(writer: ValidationWriter<TRoot>, tokens: PathTokensCache, path: string[], data: T);
200
- prop<TChild>(lambdaPath: LambdaPath<T, TChild>, rule: ValidationRule<TRoot, TChild>): void;
201
- array<TChild>(lambdaPath: LambdaPath<T, TChild[]>, rule: ItemValidationRule<TRoot, TChild>): void;
202
- invalid(isInvalid: (value: T) => boolean, message: React.ReactNode, type?: ValidationBehaviour, level?: ValidationLevel): void;
203
- }
204
- }
205
-
206
- declare module '@skbkontur/react-ui-validations/src/Validations/Types' {
207
- import { Nullable } from '@skbkontur/react-ui-validations/typings/Types';
208
- import { ValidationInfo } from '@skbkontur/react-ui-validations/src/ValidationWrapper';
209
- import { ValidationBuilder } from '@skbkontur/react-ui-validations/src/Validations/ValidationBuilder';
210
- export interface ValidationNode<T> {
211
- validation: Nullable<ValidationInfo>;
212
- children: Nullable<{
213
- [K in keyof T]: ValidationNode<T[K]>;
214
- }>;
215
- }
216
- export type ValidationRule<TRoot, T> = (builder: ValidationBuilder<TRoot, T>, value: T) => void;
217
- export type ItemValidationRule<TRoot, T> = (builder: ValidationBuilder<TRoot, T>, value: T, index: number, array: T[]) => void;
218
- export type RootValidationRule<T> = ValidationRule<T, T>;
219
- }
220
-
221
- declare module '@skbkontur/react-ui-validations/src/Validations/ValidationReader' {
222
- import { ValidationInfo } from '@skbkontur/react-ui-validations/src/ValidationWrapper';
223
- import { ExtractItem, Nullable } from '@skbkontur/react-ui-validations/typings/Types';
224
- import { ValidationNode } from '@skbkontur/react-ui-validations/src/Validations/Types';
225
- import { LambdaPath, PathTokensCache } from '@skbkontur/react-ui-validations/src/Validations/PathHelper';
226
- export class ValidationReader<T> {
227
- constructor(node: Nullable<ValidationNode<T>>, tokens: PathTokensCache);
228
- getNode<TChild>(lambdaPath: LambdaPath<T, TChild>): ValidationReader<TChild>;
229
- getNodeByIndex(index: number): ValidationReader<ExtractItem<T>>;
230
- getNodeByKey<TKey extends keyof T>(key: TKey): ValidationReader<T[TKey]>;
231
- get(): Nullable<ValidationInfo>;
232
- }
233
- }
234
-
235
- declare module '@skbkontur/react-ui-validations/src/Validations/PathHelper' {
236
- type NonNullableRecursive<T> = {
237
- [K in keyof T]: T[K] extends object ? NonNullable<NonNullableRecursive<T[K]>> : NonNullable<T[K]>;
238
- };
239
- export type LambdaPath<T, TChild> = (x: NonNullable<NonNullableRecursive<T>>) => TChild;
240
- export function extractPath(lambda: string): string;
241
- export function extractTokens(path: string): string[];
242
- export class PathTokensCache {
243
- getOrAdd<T, TChild>(lambdaPath: LambdaPath<T, TChild>): string[];
244
- has<T, TChild>(lambdaPath: LambdaPath<T, TChild>): boolean;
245
- get size(): number;
246
- }
247
- export {};
248
- }
249
-
250
- declare module '@skbkontur/react-ui-validations/src/Validations/ValidationWriter' {
251
- import { ValidationInfo } from '@skbkontur/react-ui-validations/src/ValidationWrapper';
252
- import { ValidationNode } from '@skbkontur/react-ui-validations/src/Validations/Types';
253
- import { ValidationReader } from '@skbkontur/react-ui-validations/src/Validations/ValidationReader';
254
- import { PathTokensCache } from '@skbkontur/react-ui-validations/src/Validations/PathHelper';
255
- export class ValidationWriter<T> {
256
- constructor(node?: ValidationNode<T>);
257
- getReader(tokens: PathTokensCache): ValidationReader<T>;
258
- set(validation: ValidationInfo): void;
259
- isValidated(): boolean;
260
- getNode<TChild>(path: string[]): ValidationWriter<TChild>;
261
- }
262
- }
263
-
1
+ // Generated by dts-bundle v0.7.3
2
+ // Dependencies for this module:
3
+ // ../../react
4
+
5
+ declare module '@skbkontur/react-ui-validations' {
6
+ import { text, tooltip } from '@skbkontur/react-ui-validations/src/ErrorRenderer';
7
+ import { ValidationContainer, ValidationContainerProps } from '@skbkontur/react-ui-validations/src/ValidationContainer';
8
+ import { TooltipPosition, ValidationTooltip, ValidationTooltipProps } from '@skbkontur/react-ui-validations/src/ValidationTooltip';
9
+ import { RenderErrorMessage, Validation, ValidationBehaviour } from '@skbkontur/react-ui-validations/src/ValidationWrapperInternal';
10
+ import { ValidationWrapper, ValidationInfo, ValidationWrapperProps } from '@skbkontur/react-ui-validations/src/ValidationWrapper';
11
+ import { ValidationContext, ValidationContextType, ValidationContextWrapper, ValidationContextWrapperProps } from '@skbkontur/react-ui-validations/src/ValidationContextWrapper';
12
+ export { ValidationContainer, ValidationContainerProps, ValidationContext, ValidationContextType, ValidationContextWrapper, ValidationContextWrapperProps, ValidationWrapper as ValidationWrapperV1, ValidationWrapperProps as ValidationWrapperV1Props, RenderErrorMessage, ValidationBehaviour, Validation, ValidationWrapper, ValidationWrapperProps, ValidationInfo, ValidationTooltip, ValidationTooltipProps, TooltipPosition, tooltip, text, };
13
+ export * from '@skbkontur/react-ui-validations/src/Validations';
14
+ }
15
+
16
+ declare module '@skbkontur/react-ui-validations/src/ErrorRenderer' {
17
+ import { TooltipPosition } from '@skbkontur/react-ui-validations/src/ValidationTooltip';
18
+ import { RenderErrorMessage } from '@skbkontur/react-ui-validations/src/ValidationWrapperInternal';
19
+ export function tooltip(pos: TooltipPosition): RenderErrorMessage;
20
+ export function text(pos?: 'bottom' | 'right'): RenderErrorMessage;
21
+ }
22
+
23
+ declare module '@skbkontur/react-ui-validations/src/ValidationContainer' {
24
+ import React from 'react';
25
+ import { Nullable } from '@skbkontur/react-ui-validations/typings/Types';
26
+ export interface ScrollOffset {
27
+ top?: number;
28
+ bottom?: number;
29
+ }
30
+ export interface ValidationContainerProps {
31
+ children?: React.ReactNode;
32
+ onValidationUpdated?: (isValid?: Nullable<boolean>) => void;
33
+ scrollOffset?: number | ScrollOffset;
34
+ disableSmoothScroll: boolean;
35
+ }
36
+ export class ValidationContainer extends React.Component<ValidationContainerProps> {
37
+ static __KONTUR_REACT_UI__: string;
38
+ static defaultProps: {
39
+ disableSmoothScroll: boolean;
40
+ };
41
+ static propTypes: {
42
+ scrollOffset(props: ValidationContainerProps, propName: keyof ValidationContainerProps, componentName: string): Error | undefined;
43
+ };
44
+ submit(withoutFocus?: boolean): Promise<void>;
45
+ validate(withoutFocus?: boolean): Promise<boolean>;
46
+ render(): JSX.Element;
47
+ }
48
+ }
49
+
50
+ declare module '@skbkontur/react-ui-validations/src/ValidationTooltip' {
51
+ import React from 'react';
52
+ 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';
53
+ export interface ValidationTooltipProps {
54
+ children: React.ReactElement<any>;
55
+ error: boolean;
56
+ pos?: TooltipPosition;
57
+ render?: () => React.ReactNode;
58
+ }
59
+ export class ValidationTooltip extends React.Component<ValidationTooltipProps> {
60
+ render(): JSX.Element;
61
+ }
62
+ }
63
+
64
+ declare module '@skbkontur/react-ui-validations/src/ValidationWrapperInternal' {
65
+ import React from 'react';
66
+ import { Nullable } from '@skbkontur/react-ui-validations/typings/Types';
67
+ import { ValidationContextType } from '@skbkontur/react-ui-validations/src/ValidationContextWrapper';
68
+ export type ValidationBehaviour = 'immediate' | 'lostfocus' | 'submit';
69
+ export type ValidationLevel = 'error' | 'warning';
70
+ export interface Validation {
71
+ level: ValidationLevel;
72
+ behaviour: ValidationBehaviour;
73
+ message: React.ReactNode;
74
+ independent: boolean;
75
+ }
76
+ export type RenderErrorMessage = (control: React.ReactElement<any>, hasError: boolean, validation: Nullable<Validation>) => React.ReactElement<any>;
77
+ export interface ValidationWrapperInternalProps {
78
+ children?: React.ReactElement<any>;
79
+ validation: Nullable<Validation>;
80
+ errorMessage: RenderErrorMessage;
81
+ }
82
+ interface ValidationWrapperInternalState {
83
+ validation: Nullable<Validation>;
84
+ }
85
+ interface Point {
86
+ x: number;
87
+ y: number;
88
+ }
89
+ export class ValidationWrapperInternal extends React.Component<ValidationWrapperInternalProps, ValidationWrapperInternalState> {
90
+ state: ValidationWrapperInternalState;
91
+ isChanging: boolean;
92
+ static contextType: React.Context<ValidationContextType>;
93
+ context: ValidationContextType;
94
+ componentDidMount(): void;
95
+ componentWillUnmount(): void;
96
+ componentDidUpdate(): void;
97
+ focus(): Promise<void>;
98
+ render(): React.ReactElement<any, string | ((props: any) => React.ReactElement<any, any> | null) | (new (props: any) => React.Component<any, any, any>)>;
99
+ getRootNode: () => Nullable<HTMLElement>;
100
+ getControlPosition(): Nullable<Point>;
101
+ processBlur(): Promise<void>;
102
+ processSubmit(): Promise<void>;
103
+ hasError(): boolean;
104
+ isIndependent(): boolean;
105
+ }
106
+ export {};
107
+ }
108
+
109
+ declare module '@skbkontur/react-ui-validations/src/ValidationWrapper' {
110
+ import React from 'react';
111
+ import { Nullable } from '@skbkontur/react-ui-validations/typings/Types';
112
+ import { RenderErrorMessage, ValidationBehaviour, ValidationLevel } from '@skbkontur/react-ui-validations/src/ValidationWrapperInternal';
113
+ export interface ValidationInfo {
114
+ type?: Nullable<ValidationBehaviour>;
115
+ level?: Nullable<ValidationLevel>;
116
+ message: React.ReactNode;
117
+ independent?: boolean;
118
+ }
119
+ export interface ValidationWrapperProps {
120
+ children?: React.ReactElement<any>;
121
+ validationInfo: Nullable<ValidationInfo>;
122
+ renderMessage?: Nullable<RenderErrorMessage>;
123
+ }
124
+ export class ValidationWrapper extends React.Component<ValidationWrapperProps> {
125
+ static __KONTUR_REACT_UI__: string;
126
+ render(): JSX.Element;
127
+ }
128
+ }
129
+
130
+ declare module '@skbkontur/react-ui-validations/src/ValidationContextWrapper' {
131
+ import React from 'react';
132
+ import { ValidationWrapperInternal } from '@skbkontur/react-ui-validations/src/ValidationWrapperInternal';
133
+ import { ScrollOffset } from '@skbkontur/react-ui-validations/src/ValidationContainer';
134
+ export interface ValidationContextSettings {
135
+ scrollOffset: ScrollOffset;
136
+ disableSmoothScroll: boolean;
137
+ }
138
+ export interface ValidationContextWrapperProps {
139
+ children?: React.ReactNode;
140
+ onValidationUpdated?: (isValid?: boolean) => void;
141
+ scrollOffset?: number | ScrollOffset;
142
+ disableSmoothScroll: boolean;
143
+ }
144
+ export interface ValidationContextType {
145
+ register: (wrapper: ValidationWrapperInternal) => void;
146
+ unregister: (wrapper: ValidationWrapperInternal) => void;
147
+ instanceProcessBlur: (wrapper: ValidationWrapperInternal) => void;
148
+ onValidationUpdated: (wrapper: ValidationWrapperInternal, isValid: boolean) => void;
149
+ getSettings: () => ValidationContextSettings;
150
+ isAnyWrapperInChangingMode: () => boolean;
151
+ }
152
+ export const ValidationContext: React.Context<ValidationContextType>;
153
+ export class ValidationContextWrapper extends React.Component<ValidationContextWrapperProps> {
154
+ childWrappers: ValidationWrapperInternal[];
155
+ getSettings(): ValidationContextSettings;
156
+ register(wrapper: ValidationWrapperInternal): void;
157
+ unregister(wrapper: ValidationWrapperInternal): void;
158
+ instanceProcessBlur(instance: ValidationWrapperInternal): void;
159
+ onValidationUpdated(wrapper: ValidationWrapperInternal, isValid?: boolean): void;
160
+ isAnyWrapperInChangingMode(): boolean;
161
+ onValidationRemoved(): void;
162
+ getChildWrappersSortedByPosition(): ValidationWrapperInternal[];
163
+ validate(withoutFocus: boolean): Promise<boolean>;
164
+ render(): JSX.Element;
165
+ }
166
+ }
167
+
168
+ declare module '@skbkontur/react-ui-validations/src/Validations' {
169
+ import { ValidationBuilder } from '@skbkontur/react-ui-validations/src/Validations/ValidationBuilder';
170
+ import { RootValidationRule, ValidationRule, ItemValidationRule } from '@skbkontur/react-ui-validations/src/Validations/Types';
171
+ import { ValidationReader } from '@skbkontur/react-ui-validations/src/Validations/ValidationReader';
172
+ export type Validator<T> = (value: T) => ValidationReader<T>;
173
+ export function createValidator<T>(rule: RootValidationRule<T>): Validator<T>;
174
+ export { ValidationReader, ValidationBuilder, RootValidationRule, ValidationRule, ItemValidationRule };
175
+ }
176
+
177
+ declare module '@skbkontur/react-ui-validations/typings/Types' {
178
+ export type Nullable<T> = T | null | undefined;
179
+ export type Omit<T extends object, K extends keyof T> = Pick<T, Exclude<keyof T, K>>;
180
+ export type ExtractItem<T> = T extends Array<infer TItem> ? TItem : never;
181
+ }
182
+
183
+ declare module '@skbkontur/react-ui-validations/src/Validations/ValidationBuilder' {
184
+ import React from 'react';
185
+ import { ValidationBehaviour, ValidationLevel } from '@skbkontur/react-ui-validations/src/ValidationWrapperInternal';
186
+ import { ValidationInfo } from '@skbkontur/react-ui-validations/src/ValidationWrapper';
187
+ import { LambdaPath, PathTokensCache } from '@skbkontur/react-ui-validations/src/Validations/PathHelper';
188
+ import { ValidationWriter } from '@skbkontur/react-ui-validations/src/Validations/ValidationWriter';
189
+ import { ItemValidationRule, ValidationRule } from '@skbkontur/react-ui-validations/src/Validations/Types';
190
+ export class ValidationBuilder<TRoot, T> {
191
+ constructor(writer: ValidationWriter<TRoot>, tokens: PathTokensCache, path: string[], data: T);
192
+ prop<TChild>(lambdaPath: LambdaPath<T, TChild>, rule: ValidationRule<TRoot, TChild>): void;
193
+ array<TChild>(lambdaPath: LambdaPath<T, TChild[]>, rule: ItemValidationRule<TRoot, TChild>): void;
194
+ invalid(isInvalid: (value: T) => boolean, validationInfo: ValidationInfo): void;
195
+ invalid(isInvalid: (value: T) => boolean, message: React.ReactNode, type?: ValidationBehaviour, level?: ValidationLevel, independent?: boolean): void;
196
+ }
197
+ }
198
+
199
+ declare module '@skbkontur/react-ui-validations/src/Validations/Types' {
200
+ import { Nullable } from '@skbkontur/react-ui-validations/typings/Types';
201
+ import { ValidationInfo } from '@skbkontur/react-ui-validations/src/ValidationWrapper';
202
+ import { ValidationBuilder } from '@skbkontur/react-ui-validations/src/Validations/ValidationBuilder';
203
+ export interface ValidationNode<T> {
204
+ validation: Nullable<ValidationInfo>;
205
+ children: Nullable<{
206
+ [K in keyof T]: ValidationNode<T[K]>;
207
+ }>;
208
+ }
209
+ export type ValidationRule<TRoot, T> = (builder: ValidationBuilder<TRoot, T>, value: T) => void;
210
+ export type ItemValidationRule<TRoot, T> = (builder: ValidationBuilder<TRoot, T>, value: T, index: number, array: T[]) => void;
211
+ export type RootValidationRule<T> = ValidationRule<T, T>;
212
+ }
213
+
214
+ declare module '@skbkontur/react-ui-validations/src/Validations/ValidationReader' {
215
+ import { ValidationInfo } from '@skbkontur/react-ui-validations/src/ValidationWrapper';
216
+ import { ExtractItem, Nullable } from '@skbkontur/react-ui-validations/typings/Types';
217
+ import { ValidationNode } from '@skbkontur/react-ui-validations/src/Validations/Types';
218
+ import { LambdaPath, PathTokensCache } from '@skbkontur/react-ui-validations/src/Validations/PathHelper';
219
+ export class ValidationReader<T> {
220
+ constructor(node: Nullable<ValidationNode<T>>, tokens: PathTokensCache);
221
+ getNode<TChild>(lambdaPath: LambdaPath<T, TChild>): ValidationReader<TChild>;
222
+ getNodeByIndex(index: number): ValidationReader<ExtractItem<T>>;
223
+ getNodeByKey<TKey extends keyof T>(key: TKey): ValidationReader<T[TKey]>;
224
+ get(): Nullable<ValidationInfo>;
225
+ }
226
+ }
227
+
228
+ declare module '@skbkontur/react-ui-validations/src/Validations/PathHelper' {
229
+ type NonNullableRecursive<T> = {
230
+ [K in keyof T]: T[K] extends object ? NonNullable<NonNullableRecursive<T[K]>> : NonNullable<T[K]>;
231
+ };
232
+ export type LambdaPath<T, TChild> = (x: NonNullable<NonNullableRecursive<T>>) => TChild;
233
+ export function extractPath(lambda: string): string;
234
+ export function extractTokens(path: string): string[];
235
+ export class PathTokensCache {
236
+ getOrAdd<T, TChild>(lambdaPath: LambdaPath<T, TChild>): string[];
237
+ has<T, TChild>(lambdaPath: LambdaPath<T, TChild>): boolean;
238
+ get size(): number;
239
+ }
240
+ export {};
241
+ }
242
+
243
+ declare module '@skbkontur/react-ui-validations/src/Validations/ValidationWriter' {
244
+ import { ValidationInfo } from '@skbkontur/react-ui-validations/src/ValidationWrapper';
245
+ import { ValidationNode } from '@skbkontur/react-ui-validations/src/Validations/Types';
246
+ import { ValidationReader } from '@skbkontur/react-ui-validations/src/Validations/ValidationReader';
247
+ import { PathTokensCache } from '@skbkontur/react-ui-validations/src/Validations/PathHelper';
248
+ export class ValidationWriter<T> {
249
+ constructor(node?: ValidationNode<T>);
250
+ getReader(tokens: PathTokensCache): ValidationReader<T>;
251
+ set(validation: ValidationInfo): void;
252
+ isValidated(): boolean;
253
+ getNode<TChild>(path: string[]): ValidationWriter<TChild>;
254
+ }
255
+ }
256
+
package/index.js CHANGED
@@ -3,8 +3,6 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var React = require('react');
6
- var PropTypes = require('prop-types');
7
- var ReactDom = require('react-dom');
8
6
  var warning = require('warning');
9
7
 
10
8
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
@@ -192,19 +190,26 @@ var isReactUITestEnv = Boolean(REACT_UI_TEST) || // for cases when NODE_ENV is n
192
190
  var isTestEnv = NODE_ENV === 'test' || isReactUITestEnv;
193
191
  var isBrowser = typeof window !== 'undefined';
194
192
 
195
- var ValidationContext = /** @class */ (function (_super) {
196
- __extends(ValidationContext, _super);
197
- function ValidationContext() {
193
+ var ValidationContext = React__default['default'].createContext({
194
+ register: function () { return undefined; },
195
+ unregister: function () { return undefined; },
196
+ instanceProcessBlur: function () { return undefined; },
197
+ onValidationUpdated: function () { return undefined; },
198
+ getSettings: function () { return ({
199
+ scrollOffset: {},
200
+ disableSmoothScroll: false,
201
+ }); },
202
+ isAnyWrapperInChangingMode: function () { return false; },
203
+ });
204
+ ValidationContext.displayName = 'ValidationContext';
205
+ var ValidationContextWrapper = /** @class */ (function (_super) {
206
+ __extends(ValidationContextWrapper, _super);
207
+ function ValidationContextWrapper() {
198
208
  var _this = _super !== null && _super.apply(this, arguments) || this;
199
209
  _this.childWrappers = [];
200
210
  return _this;
201
211
  }
202
- ValidationContext.prototype.getChildContext = function () {
203
- return {
204
- validationContext: this,
205
- };
206
- };
207
- ValidationContext.prototype.getSettings = function () {
212
+ ValidationContextWrapper.prototype.getSettings = function () {
208
213
  var scrollOffset = {};
209
214
  if (typeof this.props.scrollOffset === 'number') {
210
215
  scrollOffset = { top: this.props.scrollOffset };
@@ -221,20 +226,20 @@ var ValidationContext = /** @class */ (function (_super) {
221
226
  disableSmoothScroll: this.props.disableSmoothScroll,
222
227
  };
223
228
  };
224
- ValidationContext.prototype.register = function (wrapper) {
229
+ ValidationContextWrapper.prototype.register = function (wrapper) {
225
230
  this.childWrappers.push(wrapper);
226
231
  };
227
- ValidationContext.prototype.unregister = function (wrapper) {
232
+ ValidationContextWrapper.prototype.unregister = function (wrapper) {
228
233
  this.childWrappers.splice(this.childWrappers.indexOf(wrapper), 1);
229
234
  this.onValidationRemoved();
230
235
  };
231
- ValidationContext.prototype.instanceProcessBlur = function (instance) {
232
- for (var _i = 0, _a = this.childWrappers.filter(function (x) { return x !== instance; }); _i < _a.length; _i++) {
236
+ ValidationContextWrapper.prototype.instanceProcessBlur = function (instance) {
237
+ for (var _i = 0, _a = this.childWrappers.filter(function (x) { return x !== instance && !x.isIndependent(); }); _i < _a.length; _i++) {
233
238
  var wrapper = _a[_i];
234
239
  wrapper.processBlur();
235
240
  }
236
241
  };
237
- ValidationContext.prototype.onValidationUpdated = function (wrapper, isValid) {
242
+ ValidationContextWrapper.prototype.onValidationUpdated = function (wrapper, isValid) {
238
243
  var onValidationUpdated = this.props.onValidationUpdated;
239
244
  if (onValidationUpdated) {
240
245
  var isValidResult = !this.childWrappers.find(function (x) {
@@ -246,17 +251,17 @@ var ValidationContext = /** @class */ (function (_super) {
246
251
  onValidationUpdated(isValidResult);
247
252
  }
248
253
  };
249
- ValidationContext.prototype.isAnyWrapperInChangingMode = function () {
254
+ ValidationContextWrapper.prototype.isAnyWrapperInChangingMode = function () {
250
255
  return this.childWrappers.some(function (x) { return x.isChanging; });
251
256
  };
252
- ValidationContext.prototype.onValidationRemoved = function () {
257
+ ValidationContextWrapper.prototype.onValidationRemoved = function () {
253
258
  var onValidationUpdated = this.props.onValidationUpdated;
254
259
  if (onValidationUpdated) {
255
260
  var isValidResult = !this.childWrappers.find(function (x) { return x.hasError(); });
256
261
  onValidationUpdated(isValidResult);
257
262
  }
258
263
  };
259
- ValidationContext.prototype.getChildWrappersSortedByPosition = function () {
264
+ ValidationContextWrapper.prototype.getChildWrappersSortedByPosition = function () {
260
265
  var wrappersWithPosition = __spreadArrays(this.childWrappers).map(function (x) { return ({
261
266
  target: x,
262
267
  position: x.getControlPosition(),
@@ -280,7 +285,7 @@ var ValidationContext = /** @class */ (function (_super) {
280
285
  });
281
286
  return wrappersWithPosition.map(function (x) { return x.target; });
282
287
  };
283
- ValidationContext.prototype.validate = function (withoutFocus) {
288
+ ValidationContextWrapper.prototype.validate = function (withoutFocus) {
284
289
  return __awaiter(this, void 0, void 0, function () {
285
290
  var firstInvalid;
286
291
  return __generator(this, function (_a) {
@@ -302,13 +307,11 @@ var ValidationContext = /** @class */ (function (_super) {
302
307
  });
303
308
  });
304
309
  };
305
- ValidationContext.prototype.render = function () {
306
- return React__default['default'].createElement("span", null, this.props.children);
310
+ ValidationContextWrapper.prototype.render = function () {
311
+ return (React__default['default'].createElement(ValidationContext.Provider, { value: this },
312
+ React__default['default'].createElement("span", null, this.props.children)));
307
313
  };
308
- ValidationContext.childContextTypes = {
309
- validationContext: PropTypes.any,
310
- };
311
- return ValidationContext;
314
+ return ValidationContextWrapper;
312
315
  }(React__default['default'].Component));
313
316
 
314
317
  var ValidationContainer = /** @class */ (function (_super) {
@@ -344,7 +347,7 @@ var ValidationContainer = /** @class */ (function (_super) {
344
347
  return this.childContext.validate(withoutFocus);
345
348
  };
346
349
  ValidationContainer.prototype.render = function () {
347
- return (React__default['default'].createElement(ValidationContext, { ref: this.refChildContext, scrollOffset: this.props.scrollOffset, disableSmoothScroll: this.props.disableSmoothScroll, onValidationUpdated: this.props.onValidationUpdated }, this.props.children));
350
+ return (React__default['default'].createElement(ValidationContextWrapper, { ref: this.refChildContext, scrollOffset: this.props.scrollOffset, disableSmoothScroll: this.props.disableSmoothScroll, onValidationUpdated: this.props.onValidationUpdated }, this.props.children));
348
351
  };
349
352
  ValidationContainer.__KONTUR_REACT_UI__ = 'ValidationContainer';
350
353
  ValidationContainer.defaultProps = {
@@ -523,11 +526,19 @@ function getType(validation) {
523
526
  function getLevel(validation) {
524
527
  return validation ? validation.level : null;
525
528
  }
529
+ function getIndependent(validation) {
530
+ return validation ? validation.independent : null;
531
+ }
526
532
  function isEqual(a, b) {
527
533
  if (a === b) {
528
534
  return true;
529
535
  }
530
- return !!a && !!b && a.behaviour === b.behaviour && a.level === a.level && a.message === b.message;
536
+ return (!!a &&
537
+ !!b &&
538
+ a.behaviour === b.behaviour &&
539
+ a.level === a.level &&
540
+ a.message === b.message &&
541
+ a.independent === b.independent);
531
542
  }
532
543
 
533
544
  if (isBrowser && typeof HTMLElement === 'undefined') {
@@ -542,25 +553,26 @@ var ValidationWrapperInternal = /** @class */ (function (_super) {
542
553
  validation: null,
543
554
  };
544
555
  _this.isChanging = false;
556
+ _this.context = _this.context;
557
+ _this.setRootNode = function (element) {
558
+ _this.rootNode = element;
559
+ };
560
+ _this.getRootNode = function () {
561
+ return _this.rootNode;
562
+ };
545
563
  return _this;
546
564
  }
547
- ValidationWrapperInternal.prototype.UNSAFE_componentWillMount = function () {
548
- this.applyValidation(this.props.validation);
549
- };
550
565
  ValidationWrapperInternal.prototype.componentDidMount = function () {
551
- warning__default['default'](this.context.validationContext, 'ValidationWrapper should appears as child of ValidationContext.\n' +
566
+ warning__default['default'](this.context, 'ValidationWrapper should appears as child of ValidationContainer.\n' +
552
567
  'https://tech.skbkontur.ru/react-ui-validations/#/getting-started');
553
- if (this.context.validationContext) {
554
- this.context.validationContext.register(this);
555
- }
568
+ this.context.register(this);
569
+ this.applyValidation(this.props.validation);
556
570
  };
557
571
  ValidationWrapperInternal.prototype.componentWillUnmount = function () {
558
- if (this.context.validationContext) {
559
- this.context.validationContext.unregister(this);
560
- }
572
+ this.context.unregister(this);
561
573
  };
562
- ValidationWrapperInternal.prototype.UNSAFE_componentWillReceiveProps = function (nextProps) {
563
- this.applyValidation(nextProps.validation);
574
+ ValidationWrapperInternal.prototype.componentDidUpdate = function () {
575
+ this.applyValidation(this.props.validation);
564
576
  };
565
577
  ValidationWrapperInternal.prototype.focus = function () {
566
578
  return __awaiter(this, void 0, void 0, function () {
@@ -568,9 +580,9 @@ var ValidationWrapperInternal = /** @class */ (function (_super) {
568
580
  return __generator(this, function (_b) {
569
581
  switch (_b.label) {
570
582
  case 0:
571
- htmlElement = ReactDom.findDOMNode(this);
583
+ htmlElement = this.getRootNode();
572
584
  if (!(htmlElement instanceof HTMLElement)) return [3 /*break*/, 3];
573
- _a = this.context.validationContext.getSettings(), disableSmoothScroll = _a.disableSmoothScroll, scrollOffset = _a.scrollOffset;
585
+ _a = this.context.getSettings(), disableSmoothScroll = _a.disableSmoothScroll, scrollOffset = _a.scrollOffset;
574
586
  if (!!disableSmoothScroll) return [3 /*break*/, 2];
575
587
  return [4 /*yield*/, smoothScrollIntoView(htmlElement, scrollOffset)];
576
588
  case 1:
@@ -657,10 +669,10 @@ var ValidationWrapperInternal = /** @class */ (function (_super) {
657
669
  },
658
670
  });
659
671
  }
660
- return this.props.errorMessage(React__default['default'].createElement("span", null, clonedChild), !!validation, validation);
672
+ return this.props.errorMessage(React__default['default'].createElement("span", { ref: this.setRootNode }, clonedChild), !!validation, validation);
661
673
  };
662
674
  ValidationWrapperInternal.prototype.getControlPosition = function () {
663
- var htmlElement = ReactDom.findDOMNode(this);
675
+ var htmlElement = this.getRootNode();
664
676
  if (htmlElement instanceof HTMLElement) {
665
677
  var rect = htmlElement.getBoundingClientRect();
666
678
  return { x: rect.top, y: rect.left };
@@ -684,11 +696,16 @@ var ValidationWrapperInternal = /** @class */ (function (_super) {
684
696
  ValidationWrapperInternal.prototype.hasError = function () {
685
697
  return getLevel(this.state.validation) === 'error';
686
698
  };
699
+ ValidationWrapperInternal.prototype.isIndependent = function () {
700
+ return getIndependent(this.state.validation || this.props.validation) === true;
701
+ };
687
702
  ValidationWrapperInternal.prototype.handleBlur = function () {
688
703
  var _this = this;
689
704
  setTimeout(function () {
690
705
  _this.processBlur();
691
- _this.context.validationContext.instanceProcessBlur(_this);
706
+ if (!_this.isIndependent()) {
707
+ _this.context.instanceProcessBlur(_this);
708
+ }
692
709
  _this.setState({});
693
710
  });
694
711
  };
@@ -705,7 +722,7 @@ var ValidationWrapperInternal = /** @class */ (function (_super) {
705
722
  return new Promise(function (resolve) {
706
723
  _this.setState({ validation: validation }, resolve);
707
724
  if (Boolean(current) !== Boolean(validation)) {
708
- _this.context.validationContext.onValidationUpdated(_this, !validation);
725
+ _this.context.onValidationUpdated(_this, !validation);
709
726
  }
710
727
  });
711
728
  };
@@ -722,12 +739,10 @@ var ValidationWrapperInternal = /** @class */ (function (_super) {
722
739
  if (isEqual(visible, actual)) {
723
740
  return visible;
724
741
  }
725
- var changing = this.context.validationContext.isAnyWrapperInChangingMode();
742
+ var changing = this.context.isAnyWrapperInChangingMode();
726
743
  return getVisibleValidation(visible, actual, changing);
727
744
  };
728
- ValidationWrapperInternal.contextTypes = {
729
- validationContext: PropTypes.any,
730
- };
745
+ ValidationWrapperInternal.contextType = ValidationContext;
731
746
  return ValidationWrapperInternal;
732
747
  }(React__default['default'].Component));
733
748
 
@@ -743,6 +758,7 @@ var ValidationWrapper = /** @class */ (function (_super) {
743
758
  level: validationInfo.level || 'error',
744
759
  behaviour: validationInfo.type || 'lostfocus',
745
760
  message: validationInfo.message,
761
+ independent: validationInfo.independent || false,
746
762
  }
747
763
  : null;
748
764
  return (React__default['default'].createElement(ValidationWrapperInternal, { errorMessage: renderMessage || tooltip('right top'), validation: validation }, children));
@@ -778,7 +794,7 @@ var ValidationBuilder = /** @class */ (function () {
778
794
  rule(builder, builder.data, i, array);
779
795
  }
780
796
  };
781
- ValidationBuilder.prototype.invalid = function (isInvalid, message, type, level) {
797
+ ValidationBuilder.prototype.invalid = function (isInvalid, messageOrValidationInfo, type, level, independent) {
782
798
  var validationWriter = this.writer.getNode(this.path);
783
799
  if (validationWriter.isValidated()) {
784
800
  return;
@@ -787,7 +803,12 @@ var ValidationBuilder = /** @class */ (function () {
787
803
  if (!invalid) {
788
804
  return;
789
805
  }
790
- validationWriter.set({ message: message, type: type, level: level });
806
+ if (isValidationInfo(messageOrValidationInfo)) {
807
+ validationWriter.set(messageOrValidationInfo);
808
+ }
809
+ else {
810
+ validationWriter.set({ message: messageOrValidationInfo, type: type, level: level, independent: independent });
811
+ }
791
812
  };
792
813
  ValidationBuilder.prototype.getPathInfo = function (lambdaPath) {
793
814
  var path = this.tokens.getOrAdd(lambdaPath);
@@ -802,7 +823,10 @@ var ValidationBuilder = /** @class */ (function () {
802
823
  return { data: data, path: __spreadArrays(this.path, path) };
803
824
  };
804
825
  return ValidationBuilder;
805
- }());
826
+ }());
827
+ var isValidationInfo = function (argument) {
828
+ return typeof argument === 'object' && Object.prototype.hasOwnProperty.call(argument, 'message');
829
+ };
806
830
 
807
831
  var ValidationReader = /** @class */ (function () {
808
832
  function ValidationReader(node, tokens) {
@@ -932,6 +956,7 @@ function createValidator(rule) {
932
956
  exports.ValidationBuilder = ValidationBuilder;
933
957
  exports.ValidationContainer = ValidationContainer;
934
958
  exports.ValidationContext = ValidationContext;
959
+ exports.ValidationContextWrapper = ValidationContextWrapper;
935
960
  exports.ValidationReader = ValidationReader;
936
961
  exports.ValidationTooltip = ValidationTooltip;
937
962
  exports.ValidationWrapper = ValidationWrapper;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@skbkontur/react-ui-validations",
3
- "version": "1.5.7",
3
+ "version": "1.6.0-beta.1",
4
4
  "description": "Validations for @skbkontur/react-ui",
5
5
  "main": "./index.js",
6
6
  "types": "./index.d.ts",