@toptal/picasso-query-builder 7.2.17 → 8.0.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/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 +3 -7
- 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-validation.d.ts +13 -0
- package/dist-package/src/utils/use-query-builder-validation.d.ts.map +1 -0
- package/dist-package/src/utils/{use-query-builder-validator.js → use-query-builder-validation.js} +10 -8
- package/dist-package/src/utils/use-query-builder-validation.js.map +1 -0
- package/package.json +8 -8
- package/src/QueryBuilder/QueryBuilder.tsx +7 -13
- package/src/QueryBuilder/story/CustomValueEditor.example.tsx +5 -5
- package/src/utils/index.ts +1 -1
- package/src/utils/{use-query-builder-validator.test.ts → use-query-builder-validation.test.ts} +36 -31
- package/src/utils/{use-query-builder-validator.ts → use-query-builder-validation.ts} +11 -13
- package/dist-package/src/utils/use-query-builder-validator.d.ts +0 -13
- package/dist-package/src/utils/use-query-builder-validator.d.ts.map +0 -1
- package/dist-package/src/utils/use-query-builder-validator.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
|
+
valueEditor?: 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, valueEditor, 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;AAYhF,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,WAAW,CAAC,EAAE,yBAAyB,CAAA;IACvC,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,mQAmBf,KAAK,gBAkJP,CAAA;AAED,eAAe,YAAY,CAAA"}
|
|
@@ -19,20 +19,16 @@ 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, valueEditor = 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({});
|
|
27
25
|
const { showError } = useNotifications();
|
|
28
26
|
const { handleQueryChange } = useOnQueryChange({
|
|
29
27
|
maxGroupDepth,
|
|
30
28
|
callback: onQueryChange,
|
|
31
29
|
});
|
|
32
|
-
const { validator } = useQueryBuilderValidator({
|
|
30
|
+
const { validator, validationErrors, queryBuilderValid } = useQueryBuilderValidator({
|
|
33
31
|
fields,
|
|
34
|
-
onValidChange: setIsQueryBuilderValid,
|
|
35
|
-
onValidationResultChange: setValidationErrors,
|
|
36
32
|
});
|
|
37
33
|
const resetQuery = useCallback(() => {
|
|
38
34
|
if (onQueryReset) {
|
|
@@ -92,7 +88,7 @@ const QueryBuilder = ({ fields, query, onQueryChange, onValidationChange, getOpe
|
|
|
92
88
|
getDisabledFields,
|
|
93
89
|
testIds,
|
|
94
90
|
}, controlElements: {
|
|
95
|
-
valueEditor
|
|
91
|
+
valueEditor,
|
|
96
92
|
}, enableDragAndDrop: enableDragAndDrop })),
|
|
97
93
|
!hideControls && (React.createElement(Container, { flex: true, justifyContent: 'flex-end', "data-testid": testIds === null || testIds === void 0 ? void 0 : testIds.controls },
|
|
98
94
|
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-validation';
|
|
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,gCAAgC,CAAA;AACpF,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-validation';
|
|
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,gCAAgC,CAAA;AACpF,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
|
+
};
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
package/dist-package/src/utils/{use-query-builder-validator.js → use-query-builder-validation.js}
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { useCallback, useMemo } from 'react';
|
|
1
|
+
import { useCallback, useMemo, useState } from 'react';
|
|
2
2
|
import { isRuleGroup } from 'react-querybuilder';
|
|
3
3
|
const validateRule = (rule, fieldValidatorMap) => {
|
|
4
4
|
const { field, id } = rule;
|
|
@@ -34,7 +34,9 @@ const validateQuery = (query, fieldValidatorMap) => {
|
|
|
34
34
|
*/
|
|
35
35
|
return validateRule(query, fieldValidatorMap);
|
|
36
36
|
};
|
|
37
|
-
const
|
|
37
|
+
const useQueryBuilderValidation = ({ fields }) => {
|
|
38
|
+
const [validationErrors, setValidationErrors] = useState({});
|
|
39
|
+
const [queryBuilderValid, setIsQueryBuilderValid] = useState();
|
|
38
40
|
const fieldValidatorMap = useMemo(() => {
|
|
39
41
|
return fields.reduce((acc, field) => (Object.assign(Object.assign({}, acc), { [field.name]: field.validator || null })), {});
|
|
40
42
|
}, [fields]);
|
|
@@ -44,11 +46,11 @@ const useQueryBuilderValidator = ({ fields, onValidChange, onValidationResultCha
|
|
|
44
46
|
}
|
|
45
47
|
const valResult = validateQuery(queryToValidate, fieldValidatorMap);
|
|
46
48
|
const isValid = !Object.values(valResult).some(result => result !== true);
|
|
47
|
-
|
|
48
|
-
|
|
49
|
+
setIsQueryBuilderValid === null || setIsQueryBuilderValid === void 0 ? void 0 : setIsQueryBuilderValid(isValid);
|
|
50
|
+
setValidationErrors === null || setValidationErrors === void 0 ? void 0 : setValidationErrors(valResult);
|
|
49
51
|
return isValid;
|
|
50
|
-
}, [fieldValidatorMap
|
|
51
|
-
return { validator };
|
|
52
|
+
}, [fieldValidatorMap]);
|
|
53
|
+
return { validator, validationErrors, queryBuilderValid };
|
|
52
54
|
};
|
|
53
|
-
export default
|
|
54
|
-
//# sourceMappingURL=use-query-builder-
|
|
55
|
+
export default useQueryBuilderValidation;
|
|
56
|
+
//# sourceMappingURL=use-query-builder-validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-query-builder-validation.js","sourceRoot":"","sources":["../../../src/utils/use-query-builder-validation.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@toptal/picasso-query-builder",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "8.0.0",
|
|
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",
|
|
@@ -31,20 +31,20 @@
|
|
|
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.
|
|
35
|
-
"@toptal/picasso-select": "4.0.
|
|
34
|
+
"@toptal/picasso-button": "4.0.10",
|
|
35
|
+
"@toptal/picasso-select": "4.0.8",
|
|
36
36
|
"@toptal/picasso-typography": "4.0.1",
|
|
37
37
|
"@toptal/picasso-container": "3.1.0",
|
|
38
38
|
"@toptal/picasso-radio": "5.0.3",
|
|
39
39
|
"@toptal/picasso-icons": "1.7.0",
|
|
40
40
|
"@toptal/picasso-tooltip": "2.0.0",
|
|
41
|
-
"@toptal/picasso-tagselector": "3.1.
|
|
42
|
-
"@toptal/picasso-input": "4.0.
|
|
41
|
+
"@toptal/picasso-tagselector": "3.1.10",
|
|
42
|
+
"@toptal/picasso-input": "4.0.8",
|
|
43
43
|
"@toptal/picasso-list": "5.0.3",
|
|
44
44
|
"@toptal/picasso-loader": "3.0.1",
|
|
45
|
-
"@toptal/picasso-number-input": "4.0.
|
|
46
|
-
"@toptal/picasso-prompt-modal": "2.0.
|
|
47
|
-
"@toptal/picasso-notification": "4.0.
|
|
45
|
+
"@toptal/picasso-number-input": "4.0.8",
|
|
46
|
+
"@toptal/picasso-prompt-modal": "2.0.21",
|
|
47
|
+
"@toptal/picasso-notification": "4.0.10",
|
|
48
48
|
"@toptal/picasso-utils": "2.0.0",
|
|
49
49
|
"classnames": "^2.5.1",
|
|
50
50
|
"react-dnd": "^16.0.1",
|
|
@@ -32,7 +32,6 @@ 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'
|
|
36
35
|
|
|
37
36
|
type ValueEditorComponentProps = ComponentType<DefaultValueEditorProps>
|
|
38
37
|
|
|
@@ -54,7 +53,7 @@ type Props = {
|
|
|
54
53
|
/** Defines a function that is called when the user submits a query constructed in the QB. This function takes a single argument - constructed query. */
|
|
55
54
|
onSubmit?: (query: RuleGroupTypeAny) => void
|
|
56
55
|
/** 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.). */
|
|
57
|
-
|
|
56
|
+
valueEditor?: ValueEditorComponentProps
|
|
58
57
|
/** Defines the loading state. */
|
|
59
58
|
loading?: boolean
|
|
60
59
|
/** Defines padded layout. */
|
|
@@ -87,7 +86,7 @@ const QueryBuilder = ({
|
|
|
87
86
|
maxGroupDepth = 3,
|
|
88
87
|
loading = false,
|
|
89
88
|
onSubmit,
|
|
90
|
-
|
|
89
|
+
valueEditor = ValueEditor,
|
|
91
90
|
footer,
|
|
92
91
|
hideControls,
|
|
93
92
|
header,
|
|
@@ -101,10 +100,6 @@ const QueryBuilder = ({
|
|
|
101
100
|
const classes = useStyles()
|
|
102
101
|
|
|
103
102
|
const [submitButtonClicked, setSubmitButtonClicked] = useState(false)
|
|
104
|
-
const [queryBuilderValid, setIsQueryBuilderValid] = useState<
|
|
105
|
-
boolean | undefined
|
|
106
|
-
>()
|
|
107
|
-
const [validationErrors, setValidationErrors] = useState<ValidatorResult>({})
|
|
108
103
|
|
|
109
104
|
const { showError } = useNotifications()
|
|
110
105
|
|
|
@@ -113,11 +108,10 @@ const QueryBuilder = ({
|
|
|
113
108
|
callback: onQueryChange,
|
|
114
109
|
})
|
|
115
110
|
|
|
116
|
-
const { validator } =
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
})
|
|
111
|
+
const { validator, validationErrors, queryBuilderValid } =
|
|
112
|
+
useQueryBuilderValidator({
|
|
113
|
+
fields,
|
|
114
|
+
})
|
|
121
115
|
|
|
122
116
|
const resetQuery = useCallback(() => {
|
|
123
117
|
if (onQueryReset) {
|
|
@@ -222,7 +216,7 @@ const QueryBuilder = ({
|
|
|
222
216
|
} as QueryBuilderContext
|
|
223
217
|
}
|
|
224
218
|
controlElements={{
|
|
225
|
-
valueEditor
|
|
219
|
+
valueEditor,
|
|
226
220
|
}}
|
|
227
221
|
enableDragAndDrop={enableDragAndDrop}
|
|
228
222
|
/>
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import React, { useState } from 'react'
|
|
2
|
-
import type {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
type RuleGroupTypeAny,
|
|
2
|
+
import type {
|
|
3
|
+
RuleGroupTypeAny,
|
|
4
|
+
ValueEditorProps,
|
|
6
5
|
} from '@toptal/picasso-query-builder'
|
|
6
|
+
import { QueryBuilder } from '@toptal/picasso-query-builder'
|
|
7
7
|
import { Input, Select } from '@toptal/picasso'
|
|
8
8
|
|
|
9
9
|
const initialQuery = {
|
|
@@ -67,7 +67,7 @@ const Example = () => {
|
|
|
67
67
|
query={query}
|
|
68
68
|
onQueryChange={handleQueryChange}
|
|
69
69
|
fields={fields}
|
|
70
|
-
|
|
70
|
+
valueEditor={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-validation'
|
|
6
6
|
export { default as validateValueEditor } from './validate-value-editor'
|
package/src/utils/{use-query-builder-validator.test.ts → use-query-builder-validation.test.ts}
RENAMED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { renderHook } from '@testing-library/react-hooks'
|
|
1
|
+
import { act, 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 useQueryBuilderValidation from './use-query-builder-validation'
|
|
6
6
|
|
|
7
7
|
const validateMock1 = (rule: RuleType) => {
|
|
8
8
|
if (!rule.value) {
|
|
@@ -97,27 +97,26 @@ const groupedQuery = (field3value = 'should be this'): RuleGroupTypeAny => ({
|
|
|
97
97
|
],
|
|
98
98
|
})
|
|
99
99
|
|
|
100
|
-
|
|
101
|
-
const onValidationResultChangeMock = jest.fn()
|
|
102
|
-
|
|
103
|
-
describe('useQueryBuilderValidator', () => {
|
|
100
|
+
describe('useQueryBuilderValidation', () => {
|
|
104
101
|
describe('when query has only a single group of rule', () => {
|
|
105
102
|
describe('when query does not contain an invalid rule', () => {
|
|
106
103
|
it('returns true', () => {
|
|
107
104
|
const { result } = renderHook(() =>
|
|
108
|
-
|
|
105
|
+
useQueryBuilderValidation({
|
|
109
106
|
fields,
|
|
110
|
-
onValidChange: onValidChangeMock,
|
|
111
|
-
onValidationResultChange: onValidationResultChangeMock,
|
|
112
107
|
})
|
|
113
108
|
)
|
|
114
109
|
|
|
115
110
|
const { validator } = result.current
|
|
116
111
|
|
|
117
|
-
|
|
112
|
+
act(() => {
|
|
113
|
+
expect(validator(query())).toBe(true)
|
|
114
|
+
})
|
|
115
|
+
|
|
116
|
+
const { validationErrors, queryBuilderValid } = result.current
|
|
118
117
|
|
|
119
|
-
expect(
|
|
120
|
-
expect(
|
|
118
|
+
expect(queryBuilderValid).toBe(true)
|
|
119
|
+
expect(validationErrors).toEqual({
|
|
121
120
|
rule1: true,
|
|
122
121
|
rule2: true,
|
|
123
122
|
rule3: true,
|
|
@@ -128,21 +127,21 @@ describe('useQueryBuilderValidator', () => {
|
|
|
128
127
|
describe('when query contains an invalid rule', () => {
|
|
129
128
|
it('returns false', () => {
|
|
130
129
|
const { result } = renderHook(() =>
|
|
131
|
-
|
|
130
|
+
useQueryBuilderValidation({
|
|
132
131
|
fields,
|
|
133
|
-
onValidChange: onValidChangeMock,
|
|
134
|
-
onValidationResultChange: onValidationResultChangeMock,
|
|
135
132
|
})
|
|
136
133
|
)
|
|
137
134
|
|
|
138
135
|
const { validator } = result.current
|
|
139
136
|
|
|
140
|
-
|
|
137
|
+
act(() => {
|
|
138
|
+
expect(validator(query('invalid value for field2'))).toBe(false)
|
|
139
|
+
})
|
|
141
140
|
|
|
142
|
-
|
|
141
|
+
const { validationErrors, queryBuilderValid } = result.current
|
|
143
142
|
|
|
144
|
-
expect(
|
|
145
|
-
expect(
|
|
143
|
+
expect(queryBuilderValid).toBe(false)
|
|
144
|
+
expect(validationErrors).toEqual({
|
|
146
145
|
rule1: true,
|
|
147
146
|
rule2: true,
|
|
148
147
|
rule3: {
|
|
@@ -158,18 +157,21 @@ describe('useQueryBuilderValidator', () => {
|
|
|
158
157
|
describe('when query does not contain invalid rule', () => {
|
|
159
158
|
it('returns true', () => {
|
|
160
159
|
const { result } = renderHook(() =>
|
|
161
|
-
|
|
160
|
+
useQueryBuilderValidation({
|
|
162
161
|
fields,
|
|
163
|
-
onValidChange: onValidChangeMock,
|
|
164
|
-
onValidationResultChange: onValidationResultChangeMock,
|
|
165
162
|
})
|
|
166
163
|
)
|
|
167
164
|
|
|
168
165
|
const { validator } = result.current
|
|
169
166
|
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
167
|
+
act(() => {
|
|
168
|
+
expect(validator(groupedQuery())).toBe(true)
|
|
169
|
+
})
|
|
170
|
+
|
|
171
|
+
const { validationErrors, queryBuilderValid } = result.current
|
|
172
|
+
|
|
173
|
+
expect(queryBuilderValid).toBe(true)
|
|
174
|
+
expect(validationErrors).toEqual({
|
|
173
175
|
group1: true,
|
|
174
176
|
group2: true,
|
|
175
177
|
rule1: true,
|
|
@@ -182,18 +184,21 @@ describe('useQueryBuilderValidator', () => {
|
|
|
182
184
|
describe('when query contains invalid rule', () => {
|
|
183
185
|
it('returns false', () => {
|
|
184
186
|
const { result } = renderHook(() =>
|
|
185
|
-
|
|
187
|
+
useQueryBuilderValidation({
|
|
186
188
|
fields,
|
|
187
|
-
onValidChange: onValidChangeMock,
|
|
188
|
-
onValidationResultChange: onValidationResultChangeMock,
|
|
189
189
|
})
|
|
190
190
|
)
|
|
191
191
|
|
|
192
192
|
const { validator } = result.current
|
|
193
193
|
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
194
|
+
act(() => {
|
|
195
|
+
expect(validator(groupedQuery('invalid rule'))).toBe(false)
|
|
196
|
+
})
|
|
197
|
+
|
|
198
|
+
const { validationErrors, queryBuilderValid } = result.current
|
|
199
|
+
|
|
200
|
+
expect(queryBuilderValid).toBe(false)
|
|
201
|
+
expect(validationErrors).toEqual({
|
|
197
202
|
group1: true,
|
|
198
203
|
group2: true,
|
|
199
204
|
rule1: true,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { useCallback, useMemo } from 'react'
|
|
1
|
+
import { useCallback, useMemo, useState } from 'react'
|
|
2
2
|
import type {
|
|
3
3
|
RuleGroupTypeAny,
|
|
4
4
|
RuleType,
|
|
@@ -14,8 +14,6 @@ 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
|
|
19
17
|
}
|
|
20
18
|
|
|
21
19
|
const validateRule = (rule: RuleType, fieldValidatorMap: ValidatorMap) => {
|
|
@@ -72,11 +70,11 @@ const validateQuery = (
|
|
|
72
70
|
return validateRule(query as RuleType, fieldValidatorMap)
|
|
73
71
|
}
|
|
74
72
|
|
|
75
|
-
const
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
73
|
+
const useQueryBuilderValidation = ({ fields }: Props) => {
|
|
74
|
+
const [validationErrors, setValidationErrors] = useState<ValidatorResult>({})
|
|
75
|
+
const [queryBuilderValid, setIsQueryBuilderValid] = useState<
|
|
76
|
+
boolean | undefined
|
|
77
|
+
>()
|
|
80
78
|
const fieldValidatorMap: ValidatorMap = useMemo(() => {
|
|
81
79
|
return fields.reduce(
|
|
82
80
|
(acc, field) => ({
|
|
@@ -97,15 +95,15 @@ const useQueryBuilderValidator = ({
|
|
|
97
95
|
|
|
98
96
|
const isValid = !Object.values(valResult).some(result => result !== true)
|
|
99
97
|
|
|
100
|
-
|
|
101
|
-
|
|
98
|
+
setIsQueryBuilderValid?.(isValid)
|
|
99
|
+
setValidationErrors?.(valResult)
|
|
102
100
|
|
|
103
101
|
return isValid
|
|
104
102
|
},
|
|
105
|
-
[fieldValidatorMap
|
|
103
|
+
[fieldValidatorMap]
|
|
106
104
|
)
|
|
107
105
|
|
|
108
|
-
return { validator }
|
|
106
|
+
return { validator, validationErrors, queryBuilderValid }
|
|
109
107
|
}
|
|
110
108
|
|
|
111
|
-
export default
|
|
109
|
+
export default useQueryBuilderValidation
|
|
@@ -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
|
-
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
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|