jordy 0.16.0 → 0.17.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/esm5/index.js +2 -2
- package/esm5/util/etc.js +20 -0
- package/esm5/util/refine.js +14 -1
- package/esm5/validate/index.js +3 -3
- package/esm5/validate/mergeValidates.js +0 -1
- package/esm5/validate/useValidate.js +115 -0
- package/esm5/validate/validate.js +1 -2
- package/esm5/validate/validateSubUtils.js +9 -10
- package/libs/index.d.ts +2 -2
- package/libs/util/etc.d.ts +8 -0
- package/libs/validate/index.d.ts +5 -5
- package/libs/validate/mergeValidates.d.ts +1 -1
- package/libs/validate/useValidate.d.ts +132 -0
- package/libs/validate/validate.type.d.ts +18 -9
- package/libs/validate/validateSubUtils.d.ts +3 -3
- package/package.json +1 -1
package/esm5/index.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { DeviceDetectProvider, withAdaptiveRender } from './adaptive-render';
|
|
2
2
|
import { cache } from './proxies';
|
|
3
3
|
import { useRouteSystem } from './route-system';
|
|
4
|
-
import validate, { mergeValidates, } from './validate';
|
|
5
4
|
export * from './http-api';
|
|
6
5
|
export * from './hooks';
|
|
7
6
|
export * from './queries';
|
|
@@ -9,4 +8,5 @@ export * from './storage';
|
|
|
9
8
|
export * from './types';
|
|
10
9
|
export * from './util';
|
|
11
10
|
export * from './jwt';
|
|
12
|
-
export
|
|
11
|
+
export * from './validate';
|
|
12
|
+
export { DeviceDetectProvider, withAdaptiveRender, cache, useRouteSystem, };
|
package/esm5/util/etc.js
CHANGED
|
@@ -10,3 +10,23 @@ export function timeout(time, value, stopCallback) {
|
|
|
10
10
|
});
|
|
11
11
|
}
|
|
12
12
|
export function noop() { }
|
|
13
|
+
function findAndFocus(key) {
|
|
14
|
+
try {
|
|
15
|
+
var input = document.querySelector("*[name=\"".concat(key, "\"], *[data-name=\"").concat(key, "\"]"));
|
|
16
|
+
input && input.focus();
|
|
17
|
+
return Boolean(input);
|
|
18
|
+
}
|
|
19
|
+
catch (error) {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
export function focusByNames(inputNames) {
|
|
24
|
+
if (Array.isArray(inputNames)) {
|
|
25
|
+
return inputNames.some(function (key) {
|
|
26
|
+
var input = document.querySelector("*[name=\"".concat(key, "\"], *[data-name=\"").concat(key, "\"]"));
|
|
27
|
+
input && input.focus();
|
|
28
|
+
return Boolean(input);
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
return findAndFocus(inputNames);
|
|
32
|
+
}
|
package/esm5/util/refine.js
CHANGED
|
@@ -11,7 +11,20 @@ export function createEnumRefiner(enumType, def) {
|
|
|
11
11
|
}
|
|
12
12
|
export function createPageSizeRefiner(sizeList, defaultIndex) {
|
|
13
13
|
if (defaultIndex === void 0) { defaultIndex = 0; }
|
|
14
|
-
|
|
14
|
+
if (defaultIndex < 0 || defaultIndex > sizeList.length - 1) {
|
|
15
|
+
throw new Error("invalid defaultIndex: ".concat(defaultIndex));
|
|
16
|
+
}
|
|
17
|
+
return function refineForEnum(target) {
|
|
18
|
+
try {
|
|
19
|
+
var page = Number(target);
|
|
20
|
+
if (sizeList.includes(page)) {
|
|
21
|
+
return page;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
}
|
|
26
|
+
return sizeList[defaultIndex];
|
|
27
|
+
};
|
|
15
28
|
}
|
|
16
29
|
export function refinePageNumber(raw) {
|
|
17
30
|
var page = Math.floor(Math.abs(Number(raw || 1)));
|
package/esm5/validate/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { validate } from './validate';
|
|
1
|
+
import { validate as validateOrigin } from './validate';
|
|
2
2
|
import fn from './fn';
|
|
3
|
-
var validateFn =
|
|
3
|
+
export var validateFn = validateOrigin;
|
|
4
4
|
validateFn.fn = fn;
|
|
5
|
-
export default validateFn;
|
|
6
5
|
export * from './mergeValidates';
|
|
7
6
|
export * from './validate.type';
|
|
7
|
+
export * from './useValidate';
|
|
@@ -15,7 +15,6 @@ export function mergeValidates() {
|
|
|
15
15
|
}
|
|
16
16
|
Array.prototype.push.apply(acc.invalidKeys, arg.invalidKeys);
|
|
17
17
|
acc.isValid = acc.isValid && arg.isValid;
|
|
18
|
-
acc.results = __assign(__assign({}, acc.results), arg.results);
|
|
19
18
|
Array.prototype.push.apply(acc.validKeys, arg.validKeys);
|
|
20
19
|
return acc;
|
|
21
20
|
}, validateSubUtils.createValidateBulkResultModel());
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { __assign, __read } from "tslib";
|
|
2
|
+
import { focusByNames } from '../util/etc';
|
|
3
|
+
import { useCallback, useLayoutEffect, useRef, useState, } from 'react';
|
|
4
|
+
import { validateSubUtils } from './validateSubUtils';
|
|
5
|
+
function getValidStatus(msg) {
|
|
6
|
+
if (!msg) {
|
|
7
|
+
return {};
|
|
8
|
+
}
|
|
9
|
+
return {
|
|
10
|
+
validateStatus: 'error',
|
|
11
|
+
help: msg,
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
function dispatchField(setState, setMessage, prevValue, arg0, arg1) {
|
|
15
|
+
if (typeof arg0 === 'string') {
|
|
16
|
+
var name_1 = arg0;
|
|
17
|
+
var value_1 = arg1;
|
|
18
|
+
setState(function (prev) {
|
|
19
|
+
var _a;
|
|
20
|
+
return (__assign(__assign({}, prev), (_a = {}, _a[name_1] = value_1, _a)));
|
|
21
|
+
});
|
|
22
|
+
setMessage(function (prev) {
|
|
23
|
+
var _a;
|
|
24
|
+
return (__assign(__assign({}, prev), (_a = {}, _a[name_1] = '', _a)));
|
|
25
|
+
});
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
var nextValue;
|
|
29
|
+
if (typeof arg0 === 'function') {
|
|
30
|
+
nextValue = arg0(__assign({}, prevValue));
|
|
31
|
+
}
|
|
32
|
+
else if (typeof arg0 === 'object') {
|
|
33
|
+
nextValue = arg0;
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
setState(__assign(__assign({}, prevValue), nextValue));
|
|
39
|
+
setMessage(function (prev) {
|
|
40
|
+
return Object.keys(nextValue).reduce(function (acc, key) {
|
|
41
|
+
acc[key] = '';
|
|
42
|
+
return acc;
|
|
43
|
+
}, __assign({}, prev));
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
export function useValidate(initData, validateFn, autoFocusOnError) {
|
|
47
|
+
if (autoFocusOnError === void 0) { autoFocusOnError = false; }
|
|
48
|
+
var _a = __read(useState(initData), 2), state = _a[0], setState = _a[1];
|
|
49
|
+
var refInitState = useRef(state);
|
|
50
|
+
var refState = useRef(state);
|
|
51
|
+
var refResult = useRef(null);
|
|
52
|
+
var _b = __read(useState({}), 2), message = _b[0], setMessage = _b[1];
|
|
53
|
+
useLayoutEffect(function () {
|
|
54
|
+
refState.current = state;
|
|
55
|
+
}, [state]);
|
|
56
|
+
var setField = useCallback((function (arg0, arg1) {
|
|
57
|
+
dispatchField(setState, setMessage, refState.current, arg0, arg1);
|
|
58
|
+
}), []);
|
|
59
|
+
var setFieldMessage = useCallback((function (arg0, arg1) {
|
|
60
|
+
if (typeof arg0 === 'object') {
|
|
61
|
+
setMessage(function (prev) { return (__assign(__assign({}, prev), arg0)); });
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
setMessage(function (prev) {
|
|
65
|
+
var _a;
|
|
66
|
+
return (__assign(__assign({}, prev), (_a = {}, _a[arg0] = arg1, _a)));
|
|
67
|
+
});
|
|
68
|
+
}), []);
|
|
69
|
+
var clearMessage = useCallback(function () {
|
|
70
|
+
setMessage({});
|
|
71
|
+
refResult.current = null;
|
|
72
|
+
}, []);
|
|
73
|
+
var reset = useCallback(function () {
|
|
74
|
+
setMessage({});
|
|
75
|
+
setState(refInitState.current);
|
|
76
|
+
refResult.current = null;
|
|
77
|
+
}, []);
|
|
78
|
+
var getAntdStatus = useCallback(function (name) {
|
|
79
|
+
return getValidStatus(message[name]);
|
|
80
|
+
}, [message]);
|
|
81
|
+
var doValidate = useCallback(function () {
|
|
82
|
+
if (!validateFn) {
|
|
83
|
+
return validateSubUtils.createValidateBulkResultModel();
|
|
84
|
+
}
|
|
85
|
+
var result = validateFn(refState.current);
|
|
86
|
+
if (result.isValid === false) {
|
|
87
|
+
refResult.current = result;
|
|
88
|
+
setMessage(result.errorMessages);
|
|
89
|
+
if (autoFocusOnError) {
|
|
90
|
+
focusByNames(result.invalidKeys);
|
|
91
|
+
}
|
|
92
|
+
return result;
|
|
93
|
+
}
|
|
94
|
+
refResult.current = null;
|
|
95
|
+
setMessage({});
|
|
96
|
+
return result;
|
|
97
|
+
}, [validateFn, autoFocusOnError]);
|
|
98
|
+
var focusAtFirstError = useCallback(function () {
|
|
99
|
+
var result = refResult.current;
|
|
100
|
+
if (result) {
|
|
101
|
+
focusByNames(result.invalidKeys);
|
|
102
|
+
}
|
|
103
|
+
}, []);
|
|
104
|
+
return {
|
|
105
|
+
state: state,
|
|
106
|
+
errorMessage: message,
|
|
107
|
+
setField: setField,
|
|
108
|
+
setMessage: setFieldMessage,
|
|
109
|
+
clearMessage: clearMessage,
|
|
110
|
+
reset: reset,
|
|
111
|
+
validate: doValidate,
|
|
112
|
+
focusAtFirstError: focusAtFirstError,
|
|
113
|
+
getAntdStatus: getAntdStatus,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
@@ -4,8 +4,7 @@ export function validate(state, opt) {
|
|
|
4
4
|
return Object.keys(opt).reduce(function (acc, key) {
|
|
5
5
|
var val = state[key];
|
|
6
6
|
var items = opt[key];
|
|
7
|
-
var _mRet = validateBulk(val, items);
|
|
8
|
-
acc.results[key] = _mRet;
|
|
7
|
+
var _mRet = validateBulk(val, state, items);
|
|
9
8
|
acc.isValid = acc.isValid && _mRet.result;
|
|
10
9
|
if (_mRet.result) {
|
|
11
10
|
acc.validKeys.push(key);
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
function createValidateBulkResultModel() {
|
|
2
2
|
var result = {
|
|
3
3
|
isValid: true,
|
|
4
|
-
results: {},
|
|
5
4
|
validKeys: [],
|
|
6
5
|
invalidKeys: [],
|
|
7
6
|
firstMessage: '',
|
|
@@ -9,20 +8,20 @@ function createValidateBulkResultModel() {
|
|
|
9
8
|
};
|
|
10
9
|
return result;
|
|
11
10
|
}
|
|
12
|
-
function validateSingle(val, _a) {
|
|
11
|
+
function validateSingle(val, state, _a) {
|
|
13
12
|
var check = _a.check, message = _a.message;
|
|
14
|
-
var result = check(val);
|
|
13
|
+
var result = check(val, state);
|
|
15
14
|
var msg = !result ? message : '';
|
|
16
15
|
return {
|
|
17
16
|
result: result,
|
|
18
17
|
message: msg,
|
|
19
18
|
};
|
|
20
19
|
}
|
|
21
|
-
function checkIgnore(ignore, val) {
|
|
20
|
+
function checkIgnore(ignore, val, state) {
|
|
22
21
|
if (!ignore) {
|
|
23
22
|
return false;
|
|
24
23
|
}
|
|
25
|
-
return ignore === true || ignore(val);
|
|
24
|
+
return ignore === true || ignore(val, state);
|
|
26
25
|
}
|
|
27
26
|
function createValidateResultModel() {
|
|
28
27
|
return {
|
|
@@ -30,14 +29,14 @@ function createValidateResultModel() {
|
|
|
30
29
|
message: '',
|
|
31
30
|
};
|
|
32
31
|
}
|
|
33
|
-
function validateBulk(val, opt) {
|
|
32
|
+
function validateBulk(val, state, opt) {
|
|
34
33
|
var mRes;
|
|
35
34
|
if (Array.isArray(opt)) {
|
|
36
|
-
if (opt.length > 0 && checkIgnore(opt[0].ignore, val)) {
|
|
35
|
+
if (opt.length > 0 && checkIgnore(opt[0].ignore, val, state)) {
|
|
37
36
|
return createValidateResultModel();
|
|
38
37
|
}
|
|
39
38
|
opt.every(function (_opt) {
|
|
40
|
-
var _mRes = validateSingle(val, _opt);
|
|
39
|
+
var _mRes = validateSingle(val, state, _opt);
|
|
41
40
|
if (!_mRes.result) {
|
|
42
41
|
mRes = _mRes;
|
|
43
42
|
}
|
|
@@ -52,10 +51,10 @@ function validateBulk(val, opt) {
|
|
|
52
51
|
};
|
|
53
52
|
}
|
|
54
53
|
else {
|
|
55
|
-
if (checkIgnore(opt.ignore, val)) {
|
|
54
|
+
if (checkIgnore(opt.ignore, val, state)) {
|
|
56
55
|
return createValidateResultModel();
|
|
57
56
|
}
|
|
58
|
-
mRes = validateSingle(val, opt);
|
|
57
|
+
mRes = validateSingle(val, state, opt);
|
|
59
58
|
}
|
|
60
59
|
return mRes || createValidateResultModel();
|
|
61
60
|
}
|
package/libs/index.d.ts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { DeviceDetectProvider, withAdaptiveRender } from './adaptive-render';
|
|
2
2
|
import { cache } from './proxies';
|
|
3
3
|
import { ModuleRouteModel, useRouteSystem } from './route-system';
|
|
4
|
-
import validate, { mergeValidates, ValidateBulkOptionType, ValidateBulkResultModel, ValidateCheckModel, ValidateResultModel } from './validate';
|
|
5
4
|
export * from './http-api';
|
|
6
5
|
export * from './hooks';
|
|
7
6
|
export * from './queries';
|
|
@@ -9,4 +8,5 @@ export * from './storage';
|
|
|
9
8
|
export * from './types';
|
|
10
9
|
export * from './util';
|
|
11
10
|
export * from './jwt';
|
|
12
|
-
export
|
|
11
|
+
export * from './validate';
|
|
12
|
+
export { ModuleRouteModel, DeviceDetectProvider, withAdaptiveRender, cache, useRouteSystem, };
|
package/libs/util/etc.d.ts
CHANGED
|
@@ -9,3 +9,11 @@ export declare function timeout<T = void>(time: number, value?: T, stopCallback?
|
|
|
9
9
|
* 아무것도 수행하지 않는 빈 함수이다.
|
|
10
10
|
*/
|
|
11
11
|
export declare function noop(): void;
|
|
12
|
+
/**
|
|
13
|
+
* 주어진 값을 바탕으로 `name` 혹은 `data-name` 속성값이 지정된 요소를 찾는다.
|
|
14
|
+
*
|
|
15
|
+
* 그리고 그 중 가장 첫번째 것에 포커스를 준다.
|
|
16
|
+
* @param inputNames
|
|
17
|
+
* @returns
|
|
18
|
+
*/
|
|
19
|
+
export declare function focusByNames(inputNames: string | string[]): boolean;
|
package/libs/validate/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { validate } from './validate';
|
|
1
|
+
import { validate as validateOrigin } from './validate';
|
|
2
2
|
import fn from './fn';
|
|
3
|
-
declare type ValidationCheckerType = typeof
|
|
3
|
+
declare type ValidationCheckerType = typeof validateOrigin & {
|
|
4
4
|
fn: typeof fn;
|
|
5
5
|
};
|
|
6
6
|
/**
|
|
@@ -17,7 +17,7 @@ declare type ValidationCheckerType = typeof validate & {
|
|
|
17
17
|
password: string;
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
-
function
|
|
20
|
+
function validateUserModel(user: UserModel) {
|
|
21
21
|
const result = validate(user, {
|
|
22
22
|
// 한가지 검증일 땐 객체로 넘겨준다.
|
|
23
23
|
name: {
|
|
@@ -52,7 +52,7 @@ declare type ValidationCheckerType = typeof validate & {
|
|
|
52
52
|
*
|
|
53
53
|
* @see ValidateBulkResultModel
|
|
54
54
|
*/
|
|
55
|
-
declare const validateFn: ValidationCheckerType;
|
|
56
|
-
export default validateFn;
|
|
55
|
+
export declare const validateFn: ValidationCheckerType;
|
|
57
56
|
export * from './mergeValidates';
|
|
58
57
|
export * from './validate.type';
|
|
58
|
+
export * from './useValidate';
|
|
@@ -15,7 +15,7 @@ import { ValidateBulkResultModel } from './validate.type';
|
|
|
15
15
|
* console.log(result.isValid); // 유효할 경우 true
|
|
16
16
|
* ```
|
|
17
17
|
*
|
|
18
|
-
* @param args 하나로
|
|
18
|
+
* @param args 하나로 만들 여러 유효성 검증 결과들.
|
|
19
19
|
* @returns {ValidateBulkResultModel}
|
|
20
20
|
*/
|
|
21
21
|
export declare function mergeValidates(...args: ValidateBulkResultModel[]): ValidateBulkResultModel;
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { AntdFormItemValidationMessageDto, ValidateBulkResultModel } from './validate.type';
|
|
2
|
+
interface FieldDispatch<T> {
|
|
3
|
+
(name: keyof T, value: any): void;
|
|
4
|
+
(name: string, value: any): void;
|
|
5
|
+
(next: Partial<T>): void;
|
|
6
|
+
(setter: (prev: T) => Partial<T>): void;
|
|
7
|
+
}
|
|
8
|
+
interface MessageDispatch<T> {
|
|
9
|
+
(name: keyof T, message: string): void;
|
|
10
|
+
(messageDic: Partial<{
|
|
11
|
+
[key in keyof T]: string;
|
|
12
|
+
}>): void;
|
|
13
|
+
}
|
|
14
|
+
interface ValidateHookResult<T> {
|
|
15
|
+
/**
|
|
16
|
+
* 사용될 상태값.
|
|
17
|
+
*/
|
|
18
|
+
state: T;
|
|
19
|
+
/**
|
|
20
|
+
* 각 상태 항목별 오류 메시지가 담긴 객체.
|
|
21
|
+
*/
|
|
22
|
+
errorMessage: Partial<Record<keyof T, string>>;
|
|
23
|
+
/**
|
|
24
|
+
* 특정 필드의 상태값을 바꾼다.
|
|
25
|
+
*
|
|
26
|
+
* 변경된 필드명에 대응되는 오류 메시지는 자동으로 빈값으로 초기화된다.
|
|
27
|
+
*/
|
|
28
|
+
setField: FieldDispatch<T>;
|
|
29
|
+
/**
|
|
30
|
+
* 특정 필드의 메시지값을 바꾼다.
|
|
31
|
+
*/
|
|
32
|
+
setMessage: MessageDispatch<T>;
|
|
33
|
+
/**
|
|
34
|
+
* 현재 지정된 오류 메시지를 모두 빈값으로 초기화한다.
|
|
35
|
+
*/
|
|
36
|
+
clearMessage(): void;
|
|
37
|
+
/**
|
|
38
|
+
* 메시지와 상태값을 모두 초기 상태로 되돌린다.
|
|
39
|
+
*/
|
|
40
|
+
reset(): void;
|
|
41
|
+
/**
|
|
42
|
+
* 설정된 내부 상태값을 기반으로 유효성 검증을 수행한다.
|
|
43
|
+
*
|
|
44
|
+
* 검증에 실패했을 경우, 발생된 에러 메시지를 모두 `message` 필드에 자동으로 반영한다.
|
|
45
|
+
*/
|
|
46
|
+
validate(): ValidateBulkResultModel;
|
|
47
|
+
/**
|
|
48
|
+
* 처음 오류가 발생된 입력 요소에 포커스를 준다.
|
|
49
|
+
*/
|
|
50
|
+
focusAtFirstError(): void;
|
|
51
|
+
/**
|
|
52
|
+
* antd 에서 Form.Item 과 응용할 때 쓰인다.
|
|
53
|
+
* @example
|
|
54
|
+
* ```tsx
|
|
55
|
+
* const { state, setField, getAntdStatus } = useValidate({ name: '' });
|
|
56
|
+
*
|
|
57
|
+
* <Form.Item {...getAntdStatus('name')}>
|
|
58
|
+
* <Input
|
|
59
|
+
* value={status.name}
|
|
60
|
+
* onChange={(e) => setField('name', e.target.value)}
|
|
61
|
+
* />
|
|
62
|
+
* </Form.Item>
|
|
63
|
+
* ```
|
|
64
|
+
* @param name 메시지와 상태를 가져올 필드명.
|
|
65
|
+
*/
|
|
66
|
+
getAntdStatus(name: keyof T): AntdFormItemValidationMessageDto;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* 유효성 검증과 상태 제어 기능을 제공하는 훅스.
|
|
70
|
+
* @param initData 설정할 초기 데이터
|
|
71
|
+
* @param validateFn 유효성 검증에 필요한 함수. 설정하지 않으면 유효성 검증을 무시한다.
|
|
72
|
+
* @param autoFocusOnError 유효성 검증 실패 시 가장 첫번째 입력 요소에 자동으로 포커스를 준다. 기본 false.
|
|
73
|
+
* @returns
|
|
74
|
+
*
|
|
75
|
+
* @example
|
|
76
|
+
* ```tsx
|
|
77
|
+
* import { validate, useValidate } from 'jordy';
|
|
78
|
+
*
|
|
79
|
+
* function validateData(data: MyModel) {
|
|
80
|
+
* return validate(data, {
|
|
81
|
+
* // 유효성 검증 코드
|
|
82
|
+
* });
|
|
83
|
+
* }
|
|
84
|
+
*
|
|
85
|
+
* function ViewComponent() {
|
|
86
|
+
* const {
|
|
87
|
+
* state,
|
|
88
|
+
* setField,
|
|
89
|
+
* errorMessage,
|
|
90
|
+
* validate,
|
|
91
|
+
* getAntdStatus
|
|
92
|
+
* } = useValidate(
|
|
93
|
+
* createMyModel,
|
|
94
|
+
* validateData,
|
|
95
|
+
* );
|
|
96
|
+
*
|
|
97
|
+
* const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {
|
|
98
|
+
* e.preventDefault();
|
|
99
|
+
*
|
|
100
|
+
* const result = validate();
|
|
101
|
+
*
|
|
102
|
+
* if (result.isValid) {
|
|
103
|
+
* alert('작성 완료!');
|
|
104
|
+
* } else {
|
|
105
|
+
* alert(result.firstMessage);
|
|
106
|
+
* }
|
|
107
|
+
* };
|
|
108
|
+
*
|
|
109
|
+
* return (
|
|
110
|
+
* <form onSubmit={handleSubmit}>
|
|
111
|
+
* <input
|
|
112
|
+
* value={state.textInput}
|
|
113
|
+
* onChange={({ target }) => setField('textInput', target.value)}
|
|
114
|
+
* />
|
|
115
|
+
* <p>{errorMessage.textInput}</p>
|
|
116
|
+
*
|
|
117
|
+
* -- antd 활용 --
|
|
118
|
+
* <Form.Item {...getAntdStatus('textInput')}>
|
|
119
|
+
* <Input
|
|
120
|
+
* value={state.textInput}
|
|
121
|
+
* onChange={({ target }) => setField('textInput', target.value)}
|
|
122
|
+
* />
|
|
123
|
+
* </Form.Item>
|
|
124
|
+
*
|
|
125
|
+
* <button>보내기</button>
|
|
126
|
+
* </form>
|
|
127
|
+
* );
|
|
128
|
+
* }
|
|
129
|
+
* ```
|
|
130
|
+
*/
|
|
131
|
+
export declare function useValidate<T extends Record<string, any>>(initData: T | (() => T), validateFn?: (data: T) => ValidateBulkResultModel, autoFocusOnError?: boolean): ValidateHookResult<T>;
|
|
132
|
+
export {};
|
|
@@ -36,10 +36,6 @@ export interface ValidateBulkResultModel extends ErrorMessagesModel {
|
|
|
36
36
|
* 전체 유효성 검증 통과 여부. true 면 통과, false 면 아님
|
|
37
37
|
*/
|
|
38
38
|
isValid: boolean;
|
|
39
|
-
/**
|
|
40
|
-
* 각 필드별 결과. key 로 접근할 수 있다.
|
|
41
|
-
*/
|
|
42
|
-
results: Record<string, ValidateResultModel>;
|
|
43
39
|
/**
|
|
44
40
|
* 유효했던 키 목록
|
|
45
41
|
*/
|
|
@@ -56,15 +52,15 @@ export interface ValidateBulkResultModel extends ErrorMessagesModel {
|
|
|
56
52
|
/**
|
|
57
53
|
* 유효성 체크 요청에 쓰이는 모델.
|
|
58
54
|
*/
|
|
59
|
-
export interface ValidateCheckModel<T> {
|
|
55
|
+
export interface ValidateCheckModel<T, S> {
|
|
60
56
|
/**
|
|
61
57
|
* 해당 유효성 체크를 무시하는 조건.
|
|
62
58
|
*
|
|
63
59
|
* 설정하여 그 결과값이 true 라면 해당 필드의 모든 유효성 체크를 무시한다.
|
|
64
60
|
*
|
|
65
|
-
*
|
|
61
|
+
* 가장 첫번째 유효성 체크 설정에만 유효하다.
|
|
66
62
|
*/
|
|
67
|
-
ignore?: ((val: T) => boolean) | boolean;
|
|
63
|
+
ignore?: ((val: T, state: S) => boolean) | boolean;
|
|
68
64
|
/**
|
|
69
65
|
* 유효성 체크에 실패 했을 때 출력될 메시지
|
|
70
66
|
*/
|
|
@@ -74,11 +70,24 @@ export interface ValidateCheckModel<T> {
|
|
|
74
70
|
*
|
|
75
71
|
* 결과가 false 면 유효성 체크에 실패 한 것으로 간주한다.
|
|
76
72
|
*/
|
|
77
|
-
check: (val: T) => boolean;
|
|
73
|
+
check: (val: T, state: S) => boolean;
|
|
78
74
|
}
|
|
79
75
|
/**
|
|
80
76
|
* 유효성 체크를 한번에 실시 할 때 쓰이는 모델. key : value 로 이뤄져 있다.
|
|
81
77
|
*/
|
|
82
78
|
export declare type ValidateBulkOptionType<T extends Record<string, any>> = {
|
|
83
|
-
[key in keyof T]?: ValidateCheckModel<T[key]> | ValidateCheckModel<T[key]>[] | ((value: T[key]) => ValidateBulkResultModel);
|
|
79
|
+
[key in keyof T]?: ValidateCheckModel<T[key], T> | ValidateCheckModel<T[key], T>[] | ((value: T[key], state: T) => ValidateBulkResultModel);
|
|
84
80
|
};
|
|
81
|
+
/**
|
|
82
|
+
* antd 의 Form.Item 컴포넌트에 응용되는 유효성 체크 자료.
|
|
83
|
+
*/
|
|
84
|
+
export interface AntdFormItemValidationMessageDto {
|
|
85
|
+
/**
|
|
86
|
+
* 오류여부
|
|
87
|
+
*/
|
|
88
|
+
validateStatus?: 'error';
|
|
89
|
+
/**
|
|
90
|
+
* 알려줄 유효성 메시지
|
|
91
|
+
*/
|
|
92
|
+
help?: string;
|
|
93
|
+
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { ValidateBulkResultModel, ValidateCheckModel, ValidateResultModel } from './validate.type';
|
|
2
2
|
declare function createValidateBulkResultModel(): ValidateBulkResultModel;
|
|
3
|
-
declare function validateSingle<T>(val: T, { check, message }: ValidateCheckModel<T>): ValidateResultModel;
|
|
4
|
-
declare function checkIgnore<T>(ignore: undefined | boolean | ((val: T) => boolean), val: T): boolean;
|
|
5
|
-
declare function validateBulk<T>(val: T, opt: ValidateCheckModel<T> | ValidateCheckModel<T>[] | ((value: T) => ValidateBulkResultModel)): ValidateResultModel;
|
|
3
|
+
declare function validateSingle<T, S>(val: T, state: S, { check, message }: ValidateCheckModel<T, S>): ValidateResultModel;
|
|
4
|
+
declare function checkIgnore<T, S>(ignore: undefined | boolean | ((val: T, state: S) => boolean), val: T, state: S): boolean;
|
|
5
|
+
declare function validateBulk<T, S>(val: T, state: S, opt: ValidateCheckModel<T, S> | ValidateCheckModel<T, S>[] | ((value: T) => ValidateBulkResultModel)): ValidateResultModel;
|
|
6
6
|
export declare const validateSubUtils: {
|
|
7
7
|
createValidateBulkResultModel: typeof createValidateBulkResultModel;
|
|
8
8
|
validateSingle: typeof validateSingle;
|