@toptal/picasso-query-builder 7.2.16-alpha-CPT-1332-fe-externalize-validation-again-in-picasso-query-builder-baea90bfe.4 → 7.2.16
Sign up to get free protection for your applications and to get access to all the features.
- package/dist-package/src/QueryBuilder/QueryBuilder.d.ts +2 -2
- package/dist-package/src/QueryBuilder/QueryBuilder.d.ts.map +1 -1
- package/dist-package/src/QueryBuilder/QueryBuilder.js +7 -3
- package/dist-package/src/QueryBuilder/QueryBuilder.js.map +1 -1
- package/dist-package/src/utils/index.d.ts +1 -1
- package/dist-package/src/utils/index.d.ts.map +1 -1
- package/dist-package/src/utils/index.js +1 -1
- package/dist-package/src/utils/index.js.map +1 -1
- package/dist-package/src/utils/use-query-builder-validator.d.ts +13 -0
- package/dist-package/src/utils/use-query-builder-validator.d.ts.map +1 -0
- package/dist-package/src/utils/{use-query-builder-validation.js → use-query-builder-validator.js} +8 -10
- package/dist-package/src/utils/use-query-builder-validator.js.map +1 -0
- package/package.json +19 -20
- package/src/QueryBuilder/QueryBuilder.tsx +13 -7
- package/src/QueryBuilder/story/CustomValueEditor.example.tsx +4 -4
- package/src/utils/index.ts +1 -1
- package/src/utils/{use-query-builder-validation.test.ts → use-query-builder-validator.test.ts} +31 -36
- package/src/utils/{use-query-builder-validation.ts → use-query-builder-validator.ts} +13 -11
- package/LICENSE +0 -20
- package/dist-package/src/utils/use-query-builder-validation.d.ts +0 -13
- package/dist-package/src/utils/use-query-builder-validation.d.ts.map +0 -1
- package/dist-package/src/utils/use-query-builder-validation.js.map +0 -1
@@ -22,7 +22,7 @@ declare type Props = {
|
|
22
22
|
/** Defines a function that is called when the user submits a query constructed in the QB. This function takes a single argument - constructed query. */
|
23
23
|
onSubmit?: (query: RuleGroupTypeAny) => void;
|
24
24
|
/** Defines a component that allows possibility to customize value editor that is used in QB. By default, QB provides default set of editors (text inputs, dropdowns, etc.). */
|
25
|
-
|
25
|
+
customValueEditor?: ValueEditorComponentProps;
|
26
26
|
/** Defines the loading state. */
|
27
27
|
loading?: boolean;
|
28
28
|
/** Defines padded layout. */
|
@@ -41,6 +41,6 @@ declare type Props = {
|
|
41
41
|
resetOnFieldChange?: boolean;
|
42
42
|
testIds?: TestId;
|
43
43
|
};
|
44
|
-
declare const QueryBuilder: ({ fields, query, onQueryChange, onValidationChange, getOperators: customOperators, maxGroupDepth, loading, onSubmit,
|
44
|
+
declare const QueryBuilder: ({ fields, query, onQueryChange, onValidationChange, getOperators: customOperators, maxGroupDepth, loading, onSubmit, customValueEditor, footer, hideControls, header, enableDragAndDrop, resetOnFieldChange, padded, runQueryButtonContent, onQueryReset, testIds, }: Props) => JSX.Element;
|
45
45
|
export default QueryBuilder;
|
46
46
|
//# sourceMappingURL=QueryBuilder.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"QueryBuilder.d.ts","sourceRoot":"","sources":["../../../src/QueryBuilder/QueryBuilder.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA2C,MAAM,OAAO,CAAA;AAC/D,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAGrD,OAAO,KAAK,EACV,gBAAgB,IAAI,uBAAuB,EAE3C,gBAAgB,EAChB,QAAQ,EACT,MAAM,oBAAoB,CAAA;AAW3B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAG3D,OAAO,KAAK,EAAuB,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAA;
|
1
|
+
{"version":3,"file":"QueryBuilder.d.ts","sourceRoot":"","sources":["../../../src/QueryBuilder/QueryBuilder.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA2C,MAAM,OAAO,CAAA;AAC/D,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAGrD,OAAO,KAAK,EACV,gBAAgB,IAAI,uBAAuB,EAE3C,gBAAgB,EAChB,QAAQ,EACT,MAAM,oBAAoB,CAAA;AAW3B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAG3D,OAAO,KAAK,EAAuB,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAA;AAahF,aAAK,yBAAyB,GAAG,aAAa,CAAC,uBAAuB,CAAC,CAAA;AAEvE,aAAK,KAAK,GAAG;IACX,mGAAmG;IACnG,MAAM,EAAE,KAAK,EAAE,CAAA;IACf,4FAA4F;IAC5F,KAAK,EAAE,gBAAgB,CAAA;IACvB,qJAAqJ;IACrJ,aAAa,EAAE,CAAC,QAAQ,EAAE,gBAAgB,KAAK,IAAI,CAAA;IACnD,8GAA8G;IAC9G,kBAAkB,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;IAC/C,4EAA4E;IAC5E,YAAY,CAAC,EAAE,MAAM,IAAI,CAAA;IACzB,qFAAqF;IACrF,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,4GAA4G;IAC5G,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,KAAK,QAAQ,EAAE,CAAA;IACjE,wJAAwJ;IACxJ,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAA;IAC5C,+KAA+K;IAC/K,iBAAiB,CAAC,EAAE,yBAAyB,CAAA;IAC7C,iCAAiC;IACjC,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,6BAA6B;IAC7B,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,yHAAyH;IACzH,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,sJAAsJ;IACtJ,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,yGAAyG;IACzG,qBAAqB,CAAC,EAAE,SAAS,CAAA;IACjC,mEAAmE;IACnE,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACxB,gEAAgE;IAChE,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACxB,gIAAgI;IAChI,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB,CAAA;AAMD,QAAA,MAAM,YAAY,yQAmBf,KAAK,gBAuJP,CAAA;AAED,eAAe,YAAY,CAAA"}
|
@@ -19,16 +19,20 @@ import { useOnQueryChange } from './hooks/useOnQueryChange';
|
|
19
19
|
import { ValidationErrors } from '../ValidationErrors';
|
20
20
|
const useStyles = makeStyles(styles);
|
21
21
|
const ValueEditor = (props) => React.createElement(DefaultValEditor, Object.assign({}, props));
|
22
|
-
const QueryBuilder = ({ fields, query, onQueryChange, onValidationChange, getOperators: customOperators, maxGroupDepth = 3, loading = false, onSubmit,
|
22
|
+
const QueryBuilder = ({ fields, query, onQueryChange, onValidationChange, getOperators: customOperators, maxGroupDepth = 3, loading = false, onSubmit, customValueEditor = ValueEditor, footer, hideControls, header, enableDragAndDrop = false, resetOnFieldChange = true, padded = SPACING_6, runQueryButtonContent, onQueryReset, testIds, }) => {
|
23
23
|
const classes = useStyles();
|
24
24
|
const [submitButtonClicked, setSubmitButtonClicked] = useState(false);
|
25
|
+
const [queryBuilderValid, setIsQueryBuilderValid] = useState();
|
26
|
+
const [validationErrors, setValidationErrors] = useState({});
|
25
27
|
const { showError } = useNotifications();
|
26
28
|
const { handleQueryChange } = useOnQueryChange({
|
27
29
|
maxGroupDepth,
|
28
30
|
callback: onQueryChange,
|
29
31
|
});
|
30
|
-
const { validator
|
32
|
+
const { validator } = useQueryBuilderValidator({
|
31
33
|
fields,
|
34
|
+
onValidChange: setIsQueryBuilderValid,
|
35
|
+
onValidationResultChange: setValidationErrors,
|
32
36
|
});
|
33
37
|
const resetQuery = useCallback(() => {
|
34
38
|
if (onQueryReset) {
|
@@ -88,7 +92,7 @@ const QueryBuilder = ({ fields, query, onQueryChange, onValidationChange, getOpe
|
|
88
92
|
getDisabledFields,
|
89
93
|
testIds,
|
90
94
|
}, controlElements: {
|
91
|
-
valueEditor,
|
95
|
+
valueEditor: customValueEditor,
|
92
96
|
}, enableDragAndDrop: enableDragAndDrop })),
|
93
97
|
!hideControls && (React.createElement(Container, { flex: true, justifyContent: 'flex-end', "data-testid": testIds === null || testIds === void 0 ? void 0 : testIds.controls },
|
94
98
|
React.createElement(ClearQueryButton, { onClick: resetQuery }),
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"QueryBuilder.js","sourceRoot":"","sources":["../../../src/QueryBuilder/QueryBuilder.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAE/D,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAA;AAO/D,OAAO,EACL,YAAY,IAAI,iBAAiB,EACjC,gBAAgB,EAChB,MAAM,GACP,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AACzD,OAAO,KAAK,QAAQ,MAAM,WAAW,CAAA;AACrC,OAAO,KAAK,oBAAoB,MAAM,yBAAyB,CAAA;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AACrD,OAAO,EAAE,MAAM,YAAY,CAAA;AAE3B,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AAGpD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAA;AAClE,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAA;AAE3D,OAAO,EAAE,WAAW,IAAI,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAChE,OAAO,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAA;AACtE,OAAO,MAAM,MAAM,UAAU,CAAA;AAC7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;
|
1
|
+
{"version":3,"file":"QueryBuilder.js","sourceRoot":"","sources":["../../../src/QueryBuilder/QueryBuilder.tsx"],"names":[],"mappings":"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"}
|
@@ -2,6 +2,6 @@ export { controlClassnames } from './config';
|
|
2
2
|
export { generateSelectOptions } from './generate-select-options';
|
3
3
|
export { getQueryDepth } from './get-query-depth';
|
4
4
|
export { default as useHandleTouched } from './use-handle-touched';
|
5
|
-
export { default as useQueryBuilderValidator } from './use-query-builder-
|
5
|
+
export { default as useQueryBuilderValidator } from './use-query-builder-validator';
|
6
6
|
export { default as validateValueEditor } from './validate-value-editor';
|
7
7
|
//# sourceMappingURL=index.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AAC5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAA;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAClE,OAAO,EAAE,OAAO,IAAI,wBAAwB,EAAE,MAAM,
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AAC5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAA;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAClE,OAAO,EAAE,OAAO,IAAI,wBAAwB,EAAE,MAAM,+BAA+B,CAAA;AACnF,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,yBAAyB,CAAA"}
|
@@ -2,6 +2,6 @@ export { controlClassnames } from './config';
|
|
2
2
|
export { generateSelectOptions } from './generate-select-options';
|
3
3
|
export { getQueryDepth } from './get-query-depth';
|
4
4
|
export { default as useHandleTouched } from './use-handle-touched';
|
5
|
-
export { default as useQueryBuilderValidator } from './use-query-builder-
|
5
|
+
export { default as useQueryBuilderValidator } from './use-query-builder-validator';
|
6
6
|
export { default as validateValueEditor } from './validate-value-editor';
|
7
7
|
//# sourceMappingURL=index.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AAC5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAA;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAClE,OAAO,EAAE,OAAO,IAAI,wBAAwB,EAAE,MAAM,
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AAC5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAA;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAClE,OAAO,EAAE,OAAO,IAAI,wBAAwB,EAAE,MAAM,+BAA+B,CAAA;AACnF,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,yBAAyB,CAAA"}
|
@@ -0,0 +1,13 @@
|
|
1
|
+
import type { RuleGroupTypeAny, ValidationResult } from 'react-querybuilder';
|
2
|
+
import type { Field } from '../types/query-builder';
|
3
|
+
export declare type ValidatorResult = Record<string, ValidationResult | boolean>;
|
4
|
+
declare type Props = {
|
5
|
+
fields: Field[];
|
6
|
+
onValidChange?: (isValid: boolean) => void;
|
7
|
+
onValidationResultChange?: (validationResult: ValidatorResult) => void;
|
8
|
+
};
|
9
|
+
declare const useQueryBuilderValidator: ({ fields, onValidChange, onValidationResultChange, }: Props) => {
|
10
|
+
validator: (queryToValidate: RuleGroupTypeAny) => boolean;
|
11
|
+
};
|
12
|
+
export default useQueryBuilderValidator;
|
13
|
+
//# sourceMappingURL=use-query-builder-validator.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"use-query-builder-validator.d.ts","sourceRoot":"","sources":["../../../src/utils/use-query-builder-validator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,gBAAgB,EAGhB,gBAAgB,EACjB,MAAM,oBAAoB,CAAA;AAG3B,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAA;AAGnD,oBAAY,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,CAAA;AAExE,aAAK,KAAK,GAAG;IACX,MAAM,EAAE,KAAK,EAAE,CAAA;IACf,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;IAC1C,wBAAwB,CAAC,EAAE,CAAC,gBAAgB,EAAE,eAAe,KAAK,IAAI,CAAA;CACvE,CAAA;AAwDD,QAAA,MAAM,wBAAwB,yDAI3B,KAAK;iCAYc,gBAAgB;CAkBrC,CAAA;AAED,eAAe,wBAAwB,CAAA"}
|
package/dist-package/src/utils/{use-query-builder-validation.js → use-query-builder-validator.js}
RENAMED
@@ -1,4 +1,4 @@
|
|
1
|
-
import { useCallback, useMemo
|
1
|
+
import { useCallback, useMemo } from 'react';
|
2
2
|
import { isRuleGroup } from 'react-querybuilder';
|
3
3
|
const validateRule = (rule, fieldValidatorMap) => {
|
4
4
|
const { field, id } = rule;
|
@@ -34,9 +34,7 @@ const validateQuery = (query, fieldValidatorMap) => {
|
|
34
34
|
*/
|
35
35
|
return validateRule(query, fieldValidatorMap);
|
36
36
|
};
|
37
|
-
const
|
38
|
-
const [validationErrors, setValidationErrors] = useState({});
|
39
|
-
const [queryBuilderValid, setIsQueryBuilderValid] = useState();
|
37
|
+
const useQueryBuilderValidator = ({ fields, onValidChange, onValidationResultChange, }) => {
|
40
38
|
const fieldValidatorMap = useMemo(() => {
|
41
39
|
return fields.reduce((acc, field) => (Object.assign(Object.assign({}, acc), { [field.name]: field.validator || null })), {});
|
42
40
|
}, [fields]);
|
@@ -46,11 +44,11 @@ const useQueryBuilderValidation = ({ fields }) => {
|
|
46
44
|
}
|
47
45
|
const valResult = validateQuery(queryToValidate, fieldValidatorMap);
|
48
46
|
const isValid = !Object.values(valResult).some(result => result !== true);
|
49
|
-
|
50
|
-
|
47
|
+
onValidChange === null || onValidChange === void 0 ? void 0 : onValidChange(isValid);
|
48
|
+
onValidationResultChange === null || onValidationResultChange === void 0 ? void 0 : onValidationResultChange(valResult);
|
51
49
|
return isValid;
|
52
|
-
}, [fieldValidatorMap]);
|
53
|
-
return { validator
|
50
|
+
}, [fieldValidatorMap, onValidChange, onValidationResultChange]);
|
51
|
+
return { validator };
|
54
52
|
};
|
55
|
-
export default
|
56
|
-
//# sourceMappingURL=use-query-builder-
|
53
|
+
export default useQueryBuilderValidator;
|
54
|
+
//# sourceMappingURL=use-query-builder-validator.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"use-query-builder-validator.js","sourceRoot":"","sources":["../../../src/utils/use-query-builder-validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AAO5C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAahD,MAAM,YAAY,GAAG,CAAC,IAAc,EAAE,iBAA+B,EAAE,EAAE;IACvE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,IAAI,CAAA;IAE1B,MAAM,cAAc,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAA;IAE/C,OAAO;QACL,CAAC,EAAY,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI;KAC7D,CAAA;AACH,CAAC,CAAA;AAED,MAAM,aAAa,GAAG,CACpB,KAAkC,EAClC,iBAA+B,EACd,EAAE;IACnB;;OAEG;IACH,IAAI,WAAW,CAAC,KAAK,CAAC,EAAE;QACtB,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,KAAK,CAAA;QAE3B;;WAEG;QACH,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;YACtB,OAAO;gBACL,CAAC,EAAY,CAAC,EAAE;oBACd,KAAK,EAAE,KAAK;oBACZ,OAAO,EAAE,CAAC,wBAAwB,CAAC;iBACpC;aACF,CAAA;SACF;QAED,MAAM,MAAM,GAAG,KAAK;aACjB,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,IAAwB,EAAE,iBAAiB,CAAC,CAAC;aACvE,MAAM,CACL,CAAC,GAAG,EAAE,UAAU,EAAE,EAAE,CAAC,iCAChB,GAAG,GACH,UAAU,EACb,EACF,EAAE,CACH,CAAA;QAEH,uBACE,CAAC,EAAY,CAAC,EAAE,IAAI,IACjB,MAAM,EACV;KACF;IAED;;OAEG;IACH,OAAO,YAAY,CAAC,KAAiB,EAAE,iBAAiB,CAAC,CAAA;AAC3D,CAAC,CAAA;AAED,MAAM,wBAAwB,GAAG,CAAC,EAChC,MAAM,EACN,aAAa,EACb,wBAAwB,GAClB,EAAE,EAAE;IACV,MAAM,iBAAiB,GAAiB,OAAO,CAAC,GAAG,EAAE;QACnD,OAAO,MAAM,CAAC,MAAM,CAClB,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,iCACX,GAAG,KACN,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,IAAI,IAAI,IACrC,EACF,EAAE,CACH,CAAA;IACH,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAA;IAEZ,MAAM,SAAS,GAAG,WAAW,CAC3B,CAAC,eAAiC,EAAE,EAAE;QACpC,IAAI,CAAC,eAAe,EAAE;YACpB,OAAO,KAAK,CAAA;SACb;QAED,MAAM,SAAS,GAAG,aAAa,CAAC,eAAe,EAAE,iBAAiB,CAAC,CAAA;QAEnE,MAAM,OAAO,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,KAAK,IAAI,CAAC,CAAA;QAEzE,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAG,OAAO,CAAC,CAAA;QACxB,wBAAwB,aAAxB,wBAAwB,uBAAxB,wBAAwB,CAAG,SAAS,CAAC,CAAA;QAErC,OAAO,OAAO,CAAA;IAChB,CAAC,EACD,CAAC,iBAAiB,EAAE,aAAa,EAAE,wBAAwB,CAAC,CAC7D,CAAA;IAED,OAAO,EAAE,SAAS,EAAE,CAAA;AACtB,CAAC,CAAA;AAED,eAAe,wBAAwB,CAAA"}
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@toptal/picasso-query-builder",
|
3
|
-
"version": "7.2.16
|
3
|
+
"version": "7.2.16",
|
4
4
|
"description": "Picasso query builder",
|
5
5
|
"author": "Toptal",
|
6
6
|
"homepage": "https://github.com/toptal/picasso/tree/master/packages/picasso-query-builder#readme",
|
@@ -23,29 +23,29 @@
|
|
23
23
|
},
|
24
24
|
"peerDependencies": {
|
25
25
|
"@toptal/picasso-provider": "*",
|
26
|
-
"@toptal/picasso-tailwind": ">=2.7",
|
27
26
|
"react": ">=16.12.0 < 19.0.0",
|
27
|
+
"@toptal/picasso-tailwind": ">=2.7",
|
28
28
|
"react-dom": ">=16.12.0 < 19.0.0",
|
29
29
|
"typescript": "~4.7.0"
|
30
30
|
},
|
31
31
|
"dependencies": {
|
32
32
|
"@material-ui/core": "4.12.4",
|
33
33
|
"@react-querybuilder/dnd": "6.5.4",
|
34
|
-
"@toptal/picasso-button": "4.0.9
|
35
|
-
"@toptal/picasso-
|
36
|
-
"@toptal/picasso-
|
37
|
-
"@toptal/picasso-
|
38
|
-
"@toptal/picasso-
|
39
|
-
"@toptal/picasso-
|
40
|
-
"@toptal/picasso-
|
41
|
-
"@toptal/picasso-
|
42
|
-
"@toptal/picasso-
|
43
|
-
"@toptal/picasso-
|
44
|
-
"@toptal/picasso-
|
45
|
-
"@toptal/picasso-
|
46
|
-
"@toptal/picasso-
|
47
|
-
"@toptal/picasso-
|
48
|
-
"@toptal/picasso-utils": "2.0.
|
34
|
+
"@toptal/picasso-button": "4.0.9",
|
35
|
+
"@toptal/picasso-select": "4.0.7",
|
36
|
+
"@toptal/picasso-typography": "4.0.1",
|
37
|
+
"@toptal/picasso-container": "3.1.0",
|
38
|
+
"@toptal/picasso-radio": "5.0.3",
|
39
|
+
"@toptal/picasso-icons": "1.7.0",
|
40
|
+
"@toptal/picasso-tooltip": "2.0.0",
|
41
|
+
"@toptal/picasso-tagselector": "3.1.8",
|
42
|
+
"@toptal/picasso-input": "4.0.7",
|
43
|
+
"@toptal/picasso-list": "5.0.3",
|
44
|
+
"@toptal/picasso-loader": "3.0.1",
|
45
|
+
"@toptal/picasso-number-input": "4.0.7",
|
46
|
+
"@toptal/picasso-prompt-modal": "2.0.20",
|
47
|
+
"@toptal/picasso-notification": "4.0.9",
|
48
|
+
"@toptal/picasso-utils": "2.0.0",
|
49
49
|
"classnames": "^2.5.1",
|
50
50
|
"react-dnd": "^16.0.1",
|
51
51
|
"react-dnd-html5-backend": "^16.0.1",
|
@@ -54,7 +54,7 @@
|
|
54
54
|
},
|
55
55
|
"devDependencies": {
|
56
56
|
"@testing-library/react-hooks": "^8.0.1",
|
57
|
-
"@toptal/picasso-test-utils": "1.1.
|
57
|
+
"@toptal/picasso-test-utils": "1.1.1",
|
58
58
|
"@types/classnames": "^2.3.1"
|
59
59
|
},
|
60
60
|
"sideEffects": false,
|
@@ -65,6 +65,5 @@
|
|
65
65
|
"dist-package/**",
|
66
66
|
"!dist-package/tsconfig.tsbuildinfo",
|
67
67
|
"src"
|
68
|
-
]
|
69
|
-
"gitHead": "baea90bfed02f48aaae4af1eb68e67f9c0aa8ed6"
|
68
|
+
]
|
70
69
|
}
|
@@ -32,6 +32,7 @@ import { controlClassnames, useQueryBuilderValidator } from '../utils'
|
|
32
32
|
import styles from './styles'
|
33
33
|
import { useOnQueryChange } from './hooks/useOnQueryChange'
|
34
34
|
import { ValidationErrors } from '../ValidationErrors'
|
35
|
+
import type { ValidatorResult } from '../utils/use-query-builder-validator'
|
35
36
|
|
36
37
|
type ValueEditorComponentProps = ComponentType<DefaultValueEditorProps>
|
37
38
|
|
@@ -53,7 +54,7 @@ type Props = {
|
|
53
54
|
/** Defines a function that is called when the user submits a query constructed in the QB. This function takes a single argument - constructed query. */
|
54
55
|
onSubmit?: (query: RuleGroupTypeAny) => void
|
55
56
|
/** Defines a component that allows possibility to customize value editor that is used in QB. By default, QB provides default set of editors (text inputs, dropdowns, etc.). */
|
56
|
-
|
57
|
+
customValueEditor?: ValueEditorComponentProps
|
57
58
|
/** Defines the loading state. */
|
58
59
|
loading?: boolean
|
59
60
|
/** Defines padded layout. */
|
@@ -86,7 +87,7 @@ const QueryBuilder = ({
|
|
86
87
|
maxGroupDepth = 3,
|
87
88
|
loading = false,
|
88
89
|
onSubmit,
|
89
|
-
|
90
|
+
customValueEditor = ValueEditor,
|
90
91
|
footer,
|
91
92
|
hideControls,
|
92
93
|
header,
|
@@ -100,6 +101,10 @@ const QueryBuilder = ({
|
|
100
101
|
const classes = useStyles()
|
101
102
|
|
102
103
|
const [submitButtonClicked, setSubmitButtonClicked] = useState(false)
|
104
|
+
const [queryBuilderValid, setIsQueryBuilderValid] = useState<
|
105
|
+
boolean | undefined
|
106
|
+
>()
|
107
|
+
const [validationErrors, setValidationErrors] = useState<ValidatorResult>({})
|
103
108
|
|
104
109
|
const { showError } = useNotifications()
|
105
110
|
|
@@ -108,10 +113,11 @@ const QueryBuilder = ({
|
|
108
113
|
callback: onQueryChange,
|
109
114
|
})
|
110
115
|
|
111
|
-
const { validator
|
112
|
-
|
113
|
-
|
114
|
-
|
116
|
+
const { validator } = useQueryBuilderValidator({
|
117
|
+
fields,
|
118
|
+
onValidChange: setIsQueryBuilderValid,
|
119
|
+
onValidationResultChange: setValidationErrors,
|
120
|
+
})
|
115
121
|
|
116
122
|
const resetQuery = useCallback(() => {
|
117
123
|
if (onQueryReset) {
|
@@ -216,7 +222,7 @@ const QueryBuilder = ({
|
|
216
222
|
} as QueryBuilderContext
|
217
223
|
}
|
218
224
|
controlElements={{
|
219
|
-
valueEditor,
|
225
|
+
valueEditor: customValueEditor,
|
220
226
|
}}
|
221
227
|
enableDragAndDrop={enableDragAndDrop}
|
222
228
|
/>
|
@@ -1,7 +1,7 @@
|
|
1
1
|
import React, { useState } from 'react'
|
2
|
-
import {
|
3
|
-
import
|
4
|
-
|
2
|
+
import type { ValueEditorProps } from '@toptal/picasso-query-builder'
|
3
|
+
import {
|
4
|
+
QueryBuilder,
|
5
5
|
type RuleGroupTypeAny,
|
6
6
|
} from '@toptal/picasso-query-builder'
|
7
7
|
import { Input, Select } from '@toptal/picasso'
|
@@ -67,7 +67,7 @@ const Example = () => {
|
|
67
67
|
query={query}
|
68
68
|
onQueryChange={handleQueryChange}
|
69
69
|
fields={fields}
|
70
|
-
|
70
|
+
customValueEditor={CustomValueEditor}
|
71
71
|
/>
|
72
72
|
)
|
73
73
|
}
|
package/src/utils/index.ts
CHANGED
@@ -2,5 +2,5 @@ export { controlClassnames } from './config'
|
|
2
2
|
export { generateSelectOptions } from './generate-select-options'
|
3
3
|
export { getQueryDepth } from './get-query-depth'
|
4
4
|
export { default as useHandleTouched } from './use-handle-touched'
|
5
|
-
export { default as useQueryBuilderValidator } from './use-query-builder-
|
5
|
+
export { default as useQueryBuilderValidator } from './use-query-builder-validator'
|
6
6
|
export { default as validateValueEditor } from './validate-value-editor'
|
package/src/utils/{use-query-builder-validation.test.ts → use-query-builder-validator.test.ts}
RENAMED
@@ -1,8 +1,8 @@
|
|
1
|
-
import {
|
1
|
+
import { renderHook } from '@testing-library/react-hooks'
|
2
2
|
import type { RuleGroupTypeAny, RuleType } from 'react-querybuilder'
|
3
3
|
|
4
4
|
import type { Field } from '../types/query-builder'
|
5
|
-
import
|
5
|
+
import useQueryBuilderValidator from './use-query-builder-validator'
|
6
6
|
|
7
7
|
const validateMock1 = (rule: RuleType) => {
|
8
8
|
if (!rule.value) {
|
@@ -97,26 +97,27 @@ const groupedQuery = (field3value = 'should be this'): RuleGroupTypeAny => ({
|
|
97
97
|
],
|
98
98
|
})
|
99
99
|
|
100
|
-
|
100
|
+
const onValidChangeMock = jest.fn()
|
101
|
+
const onValidationResultChangeMock = jest.fn()
|
102
|
+
|
103
|
+
describe('useQueryBuilderValidator', () => {
|
101
104
|
describe('when query has only a single group of rule', () => {
|
102
105
|
describe('when query does not contain an invalid rule', () => {
|
103
106
|
it('returns true', () => {
|
104
107
|
const { result } = renderHook(() =>
|
105
|
-
|
108
|
+
useQueryBuilderValidator({
|
106
109
|
fields,
|
110
|
+
onValidChange: onValidChangeMock,
|
111
|
+
onValidationResultChange: onValidationResultChangeMock,
|
107
112
|
})
|
108
113
|
)
|
109
114
|
|
110
115
|
const { validator } = result.current
|
111
116
|
|
112
|
-
|
113
|
-
expect(validator(query())).toBe(true)
|
114
|
-
})
|
115
|
-
|
116
|
-
const { validationErrors, queryBuilderValid } = result.current
|
117
|
+
expect(validator(query())).toBe(true)
|
117
118
|
|
118
|
-
expect(
|
119
|
-
expect(
|
119
|
+
expect(onValidChangeMock).toHaveBeenCalledWith(true)
|
120
|
+
expect(onValidationResultChangeMock).toHaveBeenCalledWith({
|
120
121
|
rule1: true,
|
121
122
|
rule2: true,
|
122
123
|
rule3: true,
|
@@ -127,21 +128,21 @@ describe('useQueryBuilderValidation', () => {
|
|
127
128
|
describe('when query contains an invalid rule', () => {
|
128
129
|
it('returns false', () => {
|
129
130
|
const { result } = renderHook(() =>
|
130
|
-
|
131
|
+
useQueryBuilderValidator({
|
131
132
|
fields,
|
133
|
+
onValidChange: onValidChangeMock,
|
134
|
+
onValidationResultChange: onValidationResultChangeMock,
|
132
135
|
})
|
133
136
|
)
|
134
137
|
|
135
138
|
const { validator } = result.current
|
136
139
|
|
137
|
-
|
138
|
-
expect(validator(query('invalid value for field2'))).toBe(false)
|
139
|
-
})
|
140
|
+
const isValid = validator(query('invalid value for field2'))
|
140
141
|
|
141
|
-
|
142
|
+
expect(isValid).toBe(false)
|
142
143
|
|
143
|
-
expect(
|
144
|
-
expect(
|
144
|
+
expect(onValidChangeMock).toHaveBeenCalledWith(false)
|
145
|
+
expect(onValidationResultChangeMock).toHaveBeenCalledWith({
|
145
146
|
rule1: true,
|
146
147
|
rule2: true,
|
147
148
|
rule3: {
|
@@ -157,21 +158,18 @@ describe('useQueryBuilderValidation', () => {
|
|
157
158
|
describe('when query does not contain invalid rule', () => {
|
158
159
|
it('returns true', () => {
|
159
160
|
const { result } = renderHook(() =>
|
160
|
-
|
161
|
+
useQueryBuilderValidator({
|
161
162
|
fields,
|
163
|
+
onValidChange: onValidChangeMock,
|
164
|
+
onValidationResultChange: onValidationResultChangeMock,
|
162
165
|
})
|
163
166
|
)
|
164
167
|
|
165
168
|
const { validator } = result.current
|
166
169
|
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
const { validationErrors, queryBuilderValid } = result.current
|
172
|
-
|
173
|
-
expect(queryBuilderValid).toBe(true)
|
174
|
-
expect(validationErrors).toEqual({
|
170
|
+
expect(validator(groupedQuery())).toBe(true)
|
171
|
+
expect(onValidChangeMock).toHaveBeenCalledWith(true)
|
172
|
+
expect(onValidationResultChangeMock).toHaveBeenCalledWith({
|
175
173
|
group1: true,
|
176
174
|
group2: true,
|
177
175
|
rule1: true,
|
@@ -184,21 +182,18 @@ describe('useQueryBuilderValidation', () => {
|
|
184
182
|
describe('when query contains invalid rule', () => {
|
185
183
|
it('returns false', () => {
|
186
184
|
const { result } = renderHook(() =>
|
187
|
-
|
185
|
+
useQueryBuilderValidator({
|
188
186
|
fields,
|
187
|
+
onValidChange: onValidChangeMock,
|
188
|
+
onValidationResultChange: onValidationResultChangeMock,
|
189
189
|
})
|
190
190
|
)
|
191
191
|
|
192
192
|
const { validator } = result.current
|
193
193
|
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
const { validationErrors, queryBuilderValid } = result.current
|
199
|
-
|
200
|
-
expect(queryBuilderValid).toBe(false)
|
201
|
-
expect(validationErrors).toEqual({
|
194
|
+
expect(validator(groupedQuery('invalid rule'))).toBe(false)
|
195
|
+
expect(onValidChangeMock).toHaveBeenCalledWith(false)
|
196
|
+
expect(onValidationResultChangeMock).toHaveBeenCalledWith({
|
202
197
|
group1: true,
|
203
198
|
group2: true,
|
204
199
|
rule1: true,
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import { useCallback, useMemo
|
1
|
+
import { useCallback, useMemo } from 'react'
|
2
2
|
import type {
|
3
3
|
RuleGroupTypeAny,
|
4
4
|
RuleType,
|
@@ -14,6 +14,8 @@ export type ValidatorResult = Record<string, ValidationResult | boolean>
|
|
14
14
|
|
15
15
|
type Props = {
|
16
16
|
fields: Field[]
|
17
|
+
onValidChange?: (isValid: boolean) => void
|
18
|
+
onValidationResultChange?: (validationResult: ValidatorResult) => void
|
17
19
|
}
|
18
20
|
|
19
21
|
const validateRule = (rule: RuleType, fieldValidatorMap: ValidatorMap) => {
|
@@ -70,11 +72,11 @@ const validateQuery = (
|
|
70
72
|
return validateRule(query as RuleType, fieldValidatorMap)
|
71
73
|
}
|
72
74
|
|
73
|
-
const
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
75
|
+
const useQueryBuilderValidator = ({
|
76
|
+
fields,
|
77
|
+
onValidChange,
|
78
|
+
onValidationResultChange,
|
79
|
+
}: Props) => {
|
78
80
|
const fieldValidatorMap: ValidatorMap = useMemo(() => {
|
79
81
|
return fields.reduce(
|
80
82
|
(acc, field) => ({
|
@@ -95,15 +97,15 @@ const useQueryBuilderValidation = ({ fields }: Props) => {
|
|
95
97
|
|
96
98
|
const isValid = !Object.values(valResult).some(result => result !== true)
|
97
99
|
|
98
|
-
|
99
|
-
|
100
|
+
onValidChange?.(isValid)
|
101
|
+
onValidationResultChange?.(valResult)
|
100
102
|
|
101
103
|
return isValid
|
102
104
|
},
|
103
|
-
[fieldValidatorMap]
|
105
|
+
[fieldValidatorMap, onValidChange, onValidationResultChange]
|
104
106
|
)
|
105
107
|
|
106
|
-
return { validator
|
108
|
+
return { validator }
|
107
109
|
}
|
108
110
|
|
109
|
-
export default
|
111
|
+
export default useQueryBuilderValidator
|
package/LICENSE
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
MIT License
|
2
|
-
|
3
|
-
Copyright (c) 2021-2022 Toptal, LLC
|
4
|
-
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
6
|
-
this software and associated documentation files (the “Software”), to deal in
|
7
|
-
the Software without restriction, including without limitation the rights to
|
8
|
-
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
9
|
-
the Software, and to permit persons to whom the Software is furnished to do so,
|
10
|
-
subject to the following conditions:
|
11
|
-
|
12
|
-
The above copyright notice and this permission notice shall be included in all
|
13
|
-
copies or substantial portions of the Software.
|
14
|
-
|
15
|
-
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
17
|
-
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
18
|
-
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
19
|
-
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
20
|
-
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
@@ -1,13 +0,0 @@
|
|
1
|
-
import type { RuleGroupTypeAny, ValidationResult } from 'react-querybuilder';
|
2
|
-
import type { Field } from '../types/query-builder';
|
3
|
-
export declare type ValidatorResult = Record<string, ValidationResult | boolean>;
|
4
|
-
declare type Props = {
|
5
|
-
fields: Field[];
|
6
|
-
};
|
7
|
-
declare const useQueryBuilderValidation: ({ fields }: Props) => {
|
8
|
-
validator: (queryToValidate: RuleGroupTypeAny) => boolean;
|
9
|
-
validationErrors: ValidatorResult;
|
10
|
-
queryBuilderValid: boolean | undefined;
|
11
|
-
};
|
12
|
-
export default useQueryBuilderValidation;
|
13
|
-
//# sourceMappingURL=use-query-builder-validation.d.ts.map
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"use-query-builder-validation.d.ts","sourceRoot":"","sources":["../../../src/utils/use-query-builder-validation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,gBAAgB,EAGhB,gBAAgB,EACjB,MAAM,oBAAoB,CAAA;AAG3B,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAA;AAGnD,oBAAY,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,CAAA;AAExE,aAAK,KAAK,GAAG;IACX,MAAM,EAAE,KAAK,EAAE,CAAA;CAChB,CAAA;AAwDD,QAAA,MAAM,yBAAyB,eAAgB,KAAK;iCAgB9B,gBAAgB;;;CAkBrC,CAAA;AAED,eAAe,yBAAyB,CAAA"}
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"use-query-builder-validation.js","sourceRoot":"","sources":["../../../src/utils/use-query-builder-validation.ts"],"names":[],"mappings":"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"}
|